Vendor import of Intel ACPI-CA 20041119

This commit is contained in:
Mark Santcroos 2004-12-01 23:14:10 +00:00
parent aaff1d4cfa
commit c846686064
98 changed files with 3960 additions and 1918 deletions

View File

@ -1,3 +1,548 @@
----------------------------------------
19 November 2004. Summary of changes for version 20041119:
1) ACPI CA Core Subsystem:
Fixed a problem in the internal ConvertToInteger routine where new
integers were not truncated to 32 bits for 32-bit ACPI tables. This
routine converts buffers and strings to integers.
Implemented support to store a value to an Index() on a String object.
This is an ACPI 2.0 feature that had not yet been implemented.
Implemented new behavior for storing objects to individual package
elements (via the Index() operator). The previous behavior was to invoke
the implicit conversion rules if an object was already present at the
index. The new behavior is to simply delete any existing object and
directly store the new object. Although the ACPI specification seems
unclear on this subject, other ACPI implementations behave in this
manner. (This is the root of the AE_BAD_HEX_CONSTANT issue.)
Modified the RSDP memory scan mechanism to support the extended checksum
for ACPI 2.0 (and above) RSDPs. Note that the search continues until a
valid RSDP signature is found with a valid checksum.
Code and Data Size: Current and previous core subsystem library sizes
are shown below. These are the code and data sizes for the acpica.lib
produced by the Microsoft Visual C++ 6.0 compiler, and these values do
not include any ACPI driver or OSPM code. The debug version of the code
includes the debug output trace mechanism and has a much larger code and
data size. Note that these values will vary depending on the efficiency
of the compiler and the compiler options used during generation.
Previous Release:
Non-Debug Version: 78.5K Code, 11.5K Data, 90.0K Total
Debug Version: 165.2K Code, 68.6K Data, 233.8K Total
Current Release:
Non-Debug Version: 78.5K Code, 11.5K Data, 90.0K Total
Debug Version: 165.2K Code, 68.6K Data, 233.8K Total
2) iASL Compiler/Disassembler:
Fixed a missing semicolon in the aslcompiler.y file.
----------------------------------------
05 November 2004. Summary of changes for version 20041105:
1) ACPI CA Core Subsystem:
Implemented support for FADT revision 2. This was an interim
table (between ACPI 1.0 and ACPI 2.0) that adds support for the
FADT reset register.
Implemented optional support to allow uninitialized LocalX and
ArgX variables in a control method. The variables are
initialized to an Integer object with a value of zero. This
support is enabled by setting the AcpiGbl_EnableInterpreterSlack
flag to TRUE.
Implemented support for Integer objects for the SizeOf operator.
Either 4 or 8 is returned, depending on the current integer size
(32-bit or 64-bit, depending on the parent table revision).
Fixed a problem in the implementation of the SizeOf and
ObjectType operators where the operand was resolved to a value
too early, causing incorrect return values for some objects.
Fixed some possible memory leaks during exceptional conditions.
Code and Data Size: Current and previous core subsystem library
sizes are shown below. These are the code and data sizes for the
acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
these values do not include any ACPI driver or OSPM code. The
debug version of the code includes the debug output trace
mechanism and has a much larger code and data size. Note that
these values will vary depending on the efficiency of the
compiler and the compiler options used during generation.
Previous Release:
Non-Debug Version: 78.0K Code, 11.5K Data, 89.5K Total
Debug Version: 164.8K Code, 68.6K Data, 233.4K Total
Current Release:
Non-Debug Version: 78.5K Code, 11.5K Data, 90.0K Total
Debug Version: 165.2K Code, 68.6K Data, 233.8K Total
2) iASL Compiler/Disassembler:
Implemented support for all ACPI 3.0 reserved names and methods.
Implemented all ACPI 3.0 grammar elements in the front-end,
including support for semicolons.
Implemented the ACPI 3.0 Function() and ToUUID() macros
Fixed a problem in the disassembler where a Scope() operator
would not be emitted properly if the target of the scope was in
another table.
----------------------------------------
15 October 2004. Summary of changes for version 20041015:
Note: ACPI CA is currently undergoing an in-depth and complete
formal evaluation to test/verify the following areas. Other
suggestions are welcome. This will result in an increase in the
frequency of releases and the number of bug fixes in the next few
months.
- Functional tests for all ASL/AML operators
- All implicit/explicit type conversions
- Bit fields and operation regions
- 64-bit math support and 32-bit-only "truncated" math support
- Exceptional conditions, both compiler and interpreter
- Dynamic object deletion and memory leaks
- ACPI 3.0 support when implemented
- External interfaces to the ACPI subsystem
1) ACPI CA Core Subsystem:
Fixed two alignment issues on 64-bit platforms - within debug
statements in AcpiEvGpeDetect and AcpiEvCreateGpeBlock. Removed
references to the Address field within the non-aligned ACPI
generic address structure.
Fixed a problem in the Increment and Decrement operators where
incorrect operand resolution could result in the inadvertent
modification of the original integer when the integer is passed
into another method as an argument and the arg is then
incremented/decremented.
Fixed a problem in the FromBCD operator where the upper 32-bits
of a 64-bit BCD number were truncated during conversion.
Fixed a problem in the ToDecimal operator where the length of the
resulting string could be set incorrectly too long if the input
operand was a Buffer object.
Fixed a problem in the Logical operators (LLess, etc.) where a
NULL byte (0) within a buffer would prematurely terminate a
compare between buffer objects.
Added a check for string overflow (>200 characters as per the
ACPI specification) during the Concatenate operator with two
string operands.
Code and Data Size: Current and previous core subsystem library
sizes are shown below. These are the code and data sizes for the
acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
these values do not include any ACPI driver or OSPM code. The
debug version of the code includes the debug output trace
mechanism and has a much larger code and data size. Note that
these values will vary depending on the efficiency of the
compiler and the compiler options used during generation.
Previous Release:
Non-Debug Version: 77.8K Code, 11.5K Data, 89.3K Total
Debug Version: 164.6K Code, 68.5K Data, 233.1K Total
Current Release:
Non-Debug Version: 78.0K Code, 11.5K Data, 89.5K Total
Debug Version: 164.8K Code, 68.6K Data, 233.4K Total
2) iASL Compiler/Disassembler:
Allow the use of the ObjectType operator on uninitialized Locals
and Args (returns 0 as per the ACPI specification).
Fixed a problem where the compiler would fault if there was a
syntax error in the FieldName of all of the various
CreateXXXField operators.
Disallow the use of lower case letters within the EISAID macro,
as per the ACPI specification. All EISAID strings must be of the
form "UUUNNNN" Where U is an uppercase letter and N is a hex
digit.
----------------------------------------
06 October 2004. Summary of changes for version 20041006:
1) ACPI CA Core Subsystem:
Implemented support for the ACPI 3.0 Timer operator. This ASL
function implements a 64-bit timer with 100 nanosecond
granularity.
Defined a new OSL interface, AcpiOsGetTimer. This interface is
used to implement the ACPI 3.0 Timer operator. This allows the
host OS to implement the timer with the best clock available.
Also, it keeps the core subsystem out of the clock handling
business, since the host OS (usually) performs this function.
Fixed an alignment issue on 64-bit platforms. The
HwLowLevelRead(Write) functions use a 64-bit address which is
part of the packed ACPI Generic Address Structure. Since the
structure is non-aligned, the alignment macros are now used to
extract the address to a local variable before use.
Fixed a problem where the ToInteger operator assumed all input
strings were hexadecimal. The operator now handles both decimal
strings and hex strings (prefixed with "0x").
Fixed a problem where the string length in the string object
created as a result of the internal ConvertToString procedure
could be incorrect. This potentially affected all implicit
conversions and also the ToDecimalString and ToHexString
operators.
Fixed two problems in the ToString operator. If the length
parameter was zero, an incorrect string object was created and
the value of the input length parameter was inadvertently changed
from zero to Ones.
Fixed a problem where the optional ResourceSource string in the
ExtendedIRQ resource macro was ignored.
Simplified the interfaces to the internal division functions,
reducing code size and complexity.
Code and Data Size: Current and previous core subsystem library
sizes are shown below. These are the code and data sizes for the
acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
these values do not include any ACPI driver or OSPM code. The
debug version of the code includes the debug output trace
mechanism and has a much larger code and data size. Note that
these values will vary depending on the efficiency of the
compiler and the compiler options used during generation.
Previous Release:
Non-Debug Version: 77.9K Code, 11.4K Data, 89.3K Total
Debug Version: 164.5K Code, 68.3K Data, 232.8K Total
Current Release:
Non-Debug Version: 77.8K Code, 11.5K Data, 89.3K Total
Debug Version: 164.6K Code, 68.5K Data, 233.1K Total
2) iASL Compiler/Disassembler:
Implemented support for the ACPI 3.0 Timer operator.
Fixed a problem where the Default() operator was inadvertently
ignored in a Switch/Case block. This was a problem in the
translation of the Switch statement to If...Else pairs.
Added support to allow a standalone Return operator, with no
parentheses (or operands).
Fixed a problem with code generation for the ElseIf operator
where the translated Else...If parse tree was improperly
constructed leading to the loss of some code.
----------------------------------------
22 September 2004. Summary of changes for version 20040922:
1) ACPI CA Core Subsystem:
Fixed a problem with the implementation of the LNot() operator
where "Ones" was not returned for the TRUE case. Changed the code
to return Ones instead of (!Arg) which was usually 1. This change
affects iASL constant folding for this operator also.
Fixed a problem in AcpiUtInitializeBuffer where an existing
buffer was not initialized properly -- Now zero the entire buffer
in this case where the buffer already exists.
Changed the interface to AcpiOsSleep from (UINT32 Seconds, UINT32
Milliseconds) to simply (ACPI_INTEGER Milliseconds). This
simplifies all related code considerably. This will require
changes/updates to all OS interface layers (OSLs.)
Implemented a new external interface,
AcpiInstallExceptionHandler, to allow a system exception handler
to be installed. This handler is invoked upon any run-time
exception that occurs during control method execution.
Added support for the DSDT in AcpiTbFindTable. This allows the
DataTableRegion() operator to access the local copy of the DSDT.
Code and Data Size: Current and previous core subsystem library
sizes are shown below. These are the code and data sizes for the
acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
these values do not include any ACPI driver or OSPM code. The
debug version of the code includes the debug output trace
mechanism and has a much larger code and data size. Note that
these values will vary depending on the efficiency of the
compiler and the compiler options used during generation.
Previous Release:
Non-Debug Version: 77.8K Code, 11.4K Data, 89.2K Total
Debug Version: 164.2K Code, 68.2K Data, 232.4K Total
Current Release:
Non-Debug Version: 77.9K Code, 11.4K Data, 89.3K Total
Debug Version: 164.5K Code, 68.3K Data, 232.8K Total
2) iASL Compiler/Disassembler:
Fixed a problem with constant folding and the LNot operator. LNot
was returning 1 in the TRUE case, not Ones as per the ACPI
specification. This could result in the generation of an
incorrect folded/reduced constant.
End-Of-File is now allowed within a "//"-style comment. A parse
error no longer occurs if such a comment is at the very end of
the input ASL source file.
Implemented the "-r" option to override the Revision in the table
header. The initial use of this option will be to simplify the
evaluation of the AML interpreter by allowing a single ASL source
module to be compiled for either 32-bit or 64-bit integers.
----------------------------------------
27 August 2004. Summary of changes for version 20040827:
1) ACPI CA Core Subsystem:
- Implemented support for implicit object conversion in the non-
numeric logical operators (LEqual, LGreater, LGreaterEqual,
LLess, LLessEqual, and LNotEqual.) Any combination of
Integers/Strings/Buffers may now be used; the second operand is
implicitly converted on the fly to match the type of the first
operand. For example:
LEqual (Source1, Source2)
Source1 and Source2 must each evaluate to an integer, a string,
or a buffer. The data type of Source1 dictates the required type
of Source2. Source2 is implicitly converted if necessary to match
the type of Source1.
- Updated and corrected the behavior of the string conversion
support. The rules concerning conversion of buffers to strings
(according to the ACPI specification) are as follows:
ToDecimalString - explicit byte-wise conversion of buffer to
string of decimal values (0-255) separated by commas. ToHexString
- explicit byte-wise conversion of buffer to string of hex values
(0-FF) separated by commas. ToString - explicit byte-wise
conversion of buffer to string. Byte-by-byte copy with no
transform except NULL terminated. Any other implicit buffer-to-
string conversion - byte-wise conversion of buffer to string of
hex values (0-FF) separated by spaces.
- Fixed typo in definition of AcpiGbl_EnableInterpreterSlack.
- Fixed a problem in AcpiNsGetPathnameLength where the returned
length was one byte too short in the case of a node in the root
scope. This could cause a fault during debug output.
- Code and Data Size: Current and previous core subsystem library
sizes are shown below. These are the code and data sizes for the
acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
these values do not include any ACPI driver or OSPM code. The
debug version of the code includes the debug output trace
mechanism and has a much larger code and data size. Note that
these values will vary depending on the efficiency of the
compiler and the compiler options used during generation.
Previous Release:
Non-Debug Version: 77.9K Code, 11.5K Data, 89.4K Total
Debug Version: 164.1K Code, 68.3K Data, 232.4K Total
Current Release:
Non-Debug Version: 77.8K Code, 11.4K Data, 89.2K Total
Debug Version: 164.2K Code, 68.2K Data, 232.4K Total
2) iASL Compiler/Disassembler:
- Fixed a Linux generation error.
----------------------------------------
16 August 2004. Summary of changes for version 20040816:
1) ACPI CA Core Subsystem:
Designed and implemented support within the AML interpreter for
the so-called "implicit return". This support returns the result
of the last ASL operation within a control method, in the absence
of an explicit Return() operator. A few machines depend on this
behavior, even though it is not explicitly supported by the ASL
language. It is optional support that can be enabled at runtime
via the AcpiGbl_EnableInterpeterSlack flag.
Removed support for the PCI_Config address space from the
internal low level hardware interfaces (AcpiHwLowLevelRead and
AcpiHwLowLevelWrite). This support was not used internally, and
would not work correctly anyway because the PCI bus number and
segment number were not supported. There are separate interfaces
for PCI configuration space access because of the unique
interface.
Code and Data Size: Current and previous core subsystem library
sizes are shown below. These are the code and data sizes for the
acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
these values do not include any ACPI driver or OSPM code. The
debug version of the code includes the debug output trace
mechanism and has a much larger code and data size. Note that
these values will vary depending on the efficiency of the
compiler and the compiler options used during generation.
Previous Release:
Non-Debug Version: 78.0K Code, 11.5K Data, 89.5K Total
Debug Version: 164.1K Code, 68.2K Data, 232.3K Total
Current Release:
Non-Debug Version: 77.9K Code, 11.5K Data, 89.4K Total
Debug Version: 164.1K Code, 68.3K Data, 232.4K Total
2) iASL Compiler/Disassembler:
Fixed a problem where constants in ASL expressions at the root
level (not within a control method) could be inadvertently
truncated during code generation. This problem was introduced in
the 20040715 release.
----------------------------------------
15 July 2004. Summary of changes for version 20040715:
1) ACPI CA Core Subsystem:
Restructured the internal HW GPE interfaces to pass/track the
current state of interrupts (enabled/disabled) in order to avoid
possible deadlock and increase flexibility of the interfaces.
Implemented a "lexicographical compare" for String and Buffer
objects within the logical operators -- LGreater, LLess,
LGreaterEqual, and LLessEqual -- as per further clarification to
the ACPI specification. Behavior is similar to C library
"strcmp".
Completed a major reduction in CPU stack use for the
AcpiGetFirmwareTable external function. In the 32-bit non-debug
case, the stack use has been reduced from 168 bytes to 32 bytes.
Deployed a new run-time configuration flag,
AcpiGbl_EnableInterpreterSlack, whose purpose is to allow the AML
interpreter to forgive certain bad AML constructs. Default
setting is FALSE.
Implemented the first use of AcpiGbl_EnableInterpreterSlack in
the Field IO support code. If enabled, it allows field access to
go beyond the end of a region definition if the field is within
the region length rounded up to the next access width boundary (a
common coding error.)
Renamed OSD_HANDLER to ACPI_OSD_HANDLER, and
OSD_EXECUTION_CALLBACK to ACPI_OSD_EXEC_CALLBACK for consistency
with other ACPI symbols. Also, these symbols are lowercased by
the latest version of the AcpiSrc tool.
The prototypes for the PCI interfaces in acpiosxf.h have been
updated to rename "Register" to simply "Reg" to prevent certain
compilers from complaining.
Code and Data Size: Current and previous core subsystem library
sizes are shown below. These are the code and data sizes for the
acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
these values do not include any ACPI driver or OSPM code. The
debug version of the code includes the debug output trace
mechanism and has a much larger code and data size. Note that
these values will vary depending on the efficiency of the
compiler and the compiler options used during generation.
Previous Release:
Non-Debug Version: 77.8K Code, 11.5K Data, 89.3K Total
Debug Version: 163.8K Code, 68.2K Data, 232.0K Total
Current Release:
Non-Debug Version: 78.0K Code, 11.5K Data, 89.5K Total
Debug Version: 164.1K Code, 68.2K Data, 232.3K Total
2) iASL Compiler/Disassembler:
Implemented full support for Package objects within the Case()
operator. Note: The Break() operator is currently not supported
within Case blocks (TermLists) as there is some question about
backward compatibility with ACPI 1.0 interpreters.
Fixed a problem where complex terms were not supported properly
within the Switch() operator.
Eliminated extraneous warning for compiler-emitted reserved names
of the form "_T_x". (Used in Switch/Case operators.)
Eliminated optimization messages for "_T_x" objects and small
constants within the DefinitionBlock operator.
----------------------------------------
15 June 2004. Summary of changes for version 20040615:
1) ACPI CA Core Subsystem:
Implemented support for Buffer and String objects (as per ACPI
2.0) for the following ASL operators: LEqual, LGreater, LLess,
LGreaterEqual, and LLessEqual.
All directory names in the entire source package are lower case,
as they were in earlier releases.
Implemented "Disassemble" command in the AML debugger that will
disassemble a single control method.
Code and Data Size: Current and previous core subsystem library
sizes are shown below. These are the code and data sizes for the
acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
these values do not include any ACPI driver or OSPM code. The
debug version of the code includes the debug output trace
mechanism and has a much larger code and data size. Note that
these values will vary depending on the efficiency of the
compiler and the compiler options used during generation.
Previous Release:
Non-Debug Version: 77.7K Code, 11.5K Data, 89.2K Total
Debug Version: 163.3K Code, 67.2K Data, 230.5K Total
Current Release:
Non-Debug Version: 77.8K Code, 11.5K Data, 89.3K Total
Debug Version: 163.8K Code, 68.2K Data, 232.0K Total
2) iASL Compiler/Disassembler:
Implemented support for Buffer and String objects (as per ACPI
2.0) for the following ASL operators: LEqual, LGreater, LLess,
LGreaterEqual, and LLessEqual.
All directory names in the entire source package are lower case,
as they were in earlier releases.
Fixed a fault when using the -g or -d<nofilename> options if the
FADT was not found.
Fixed an issue with the Windows version of the compiler where
later versions of Windows place the FADT in the registry under
the name "FADT" and not "FACP" as earlier versions did. This
applies when using the -g or -d<nofilename> options. The
compiler now looks for both strings as necessary.
Fixed a problem with compiler namepath optimization where a
namepath within the Scope() operator could not be optimized if
the namepath was a subpath of the current scope path.
----------------------------------------
27 May 2004. Summary of changes for version 20040527:

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Name: acconfig.h - Global configuration constants
* $Revision: 158 $
* $Revision: 169 $
*
*****************************************************************************/
@ -137,12 +137,12 @@
/* Version string */
#define ACPI_CA_VERSION 0x20040527
#define ACPI_CA_VERSION 0x20041119
/*
* OS name, used for the _OS object. The _OS object is essentially obsolete,
* but there is a large base of ASL/AML code in existing machines that check
* for the string below. The use of this string usually guarantees that
* for the string below. The use of this string usually guarantees that
* the ASL will execute down the most tested code path. Also, there is some
* code that will not execute the _OSI method unless _OS matches the string
* below. Therefore, change this string at your own risk.

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Name: acdebug.h - ACPI/AML debugger
* $Revision: 74 $
* $Revision: 75 $
*
*****************************************************************************/
@ -181,6 +181,10 @@ AcpiDbMethodEnd (
* dbcmds - debug commands and output routines
*/
ACPI_STATUS
AcpiDbDisassembleMethod (
char *Name);
void
AcpiDbDisplayTableInfo (
char *TableArg);

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Name: acenv.h - Generation environment specific items
* $Revision: 107 $
* $Revision: 109 $
*
*****************************************************************************/
@ -225,7 +225,7 @@
#define COMPILER_DEPENDENT_INT64 long long
#define COMPILER_DEPENDENT_UINT64 unsigned long long
/*
/*
* This macro is used to tag functions as "printf-like" because
* some compilers can catch printf format string problems. MSVC
* doesn't, so this is proprocessed away.
@ -305,6 +305,7 @@
#define ACPI_STRCAT(d,s) (void) strcat((d), (s))
#define ACPI_STRNCAT(d,s,n) strncat((d), (s), (ACPI_SIZE)(n))
#define ACPI_STRTOUL(d,s,n) strtoul((d), (s), (ACPI_SIZE)(n))
#define ACPI_MEMCMP(s1,s2,n) memcmp((s1), (s2), (ACPI_SIZE)(n))
#define ACPI_MEMCPY(d,s,n) (void) memcpy((d), (s), (ACPI_SIZE)(n))
#define ACPI_MEMSET(d,s,n) (void) memset((d), (s), (ACPI_SIZE)(n))
@ -368,6 +369,7 @@ typedef char *va_list;
#define ACPI_STRCAT(d,s) (void) AcpiUtStrcat ((d), (s))
#define ACPI_STRNCAT(d,s,n) AcpiUtStrncat ((d), (s), (ACPI_SIZE)(n))
#define ACPI_STRTOUL(d,s,n) AcpiUtStrtoul ((d), (s), (ACPI_SIZE)(n))
#define ACPI_MEMCMP(s1,s2,n) AcpiUtMemcmp((s1), (s2), (ACPI_SIZE)(n))
#define ACPI_MEMCPY(d,s,n) (void) AcpiUtMemcpy ((d), (s), (ACPI_SIZE)(n))
#define ACPI_MEMSET(d,v,n) (void) AcpiUtMemset ((d), (v), (ACPI_SIZE)(n))
#define ACPI_TOUPPER AcpiUtToUpper

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Name: acevents.h - Event subcomponent prototypes and defines
* $Revision: 95 $
* $Revision: 96 $
*
*****************************************************************************/
@ -184,7 +184,8 @@ AcpiEvNotifyDispatch (
ACPI_STATUS
AcpiEvWalkGpeList (
ACPI_GPE_CALLBACK GpeWalkCallback);
ACPI_GPE_CALLBACK GpeWalkCallback,
UINT32 Flags);
BOOLEAN
AcpiEvValidGpeEvent (

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Name: acexcep.h - Exception codes returned by the ACPI subsystem
* $Revision: 71 $
* $Revision: 72 $
*
*****************************************************************************/
@ -239,7 +239,7 @@
#define AE_AML_CIRCULAR_REFERENCE (ACPI_STATUS) (0x0020 | AE_CODE_AML)
#define AE_AML_BAD_RESOURCE_LENGTH (ACPI_STATUS) (0x0021 | AE_CODE_AML)
#define AE_CODE_AML_MAX 0x0020
#define AE_CODE_AML_MAX 0x0021
/*
* Internal exceptions used for control

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Name: acglobal.h - Declarations for global variables
* $Revision: 154 $
* $Revision: 159 $
*
*****************************************************************************/
@ -163,11 +163,14 @@ extern UINT32 AcpiGbl_NestingLevel;
****************************************************************************/
/*
* Create the predefined _OSI method in the namespace? Default is TRUE
* because ACPI CA is fully compatible with other ACPI implementations.
* Changing this will revert ACPI CA (and machine ASL) to pre-OSI behavior.
* Enable "slack" in the AML interpreter? Default is FALSE, and the
* interpreter strictly follows the ACPI specification. Setting to TRUE
* allows the interpreter to forgive certain bad AML constructs. Currently:
* 1) Allow "implicit return" of last value in a control method
* 2) Allow access beyond end of operation region
* 3) Allow access to uninitialized locals/args (auto-init to integer 0)
*/
ACPI_EXTERN UINT8 ACPI_INIT_GLOBAL (AcpiGbl_CreateOsiMethod, TRUE);
ACPI_EXTERN UINT8 ACPI_INIT_GLOBAL (AcpiGbl_EnableInterpreterSlack, FALSE);
/*
* Automatically serialize ALL control methods? Default is FALSE, meaning
@ -177,6 +180,13 @@ ACPI_EXTERN UINT8 ACPI_INIT_GLOBAL (AcpiGbl_CreateOsiMethod, TRUE);
*/
ACPI_EXTERN UINT8 ACPI_INIT_GLOBAL (AcpiGbl_AllMethodsSerialized, FALSE);
/*
* Create the predefined _OSI method in the namespace? Default is TRUE
* because ACPI CA is fully compatible with other ACPI implementations.
* Changing this will revert ACPI CA (and machine ASL) to pre-OSI behavior.
*/
ACPI_EXTERN UINT8 ACPI_INIT_GLOBAL (AcpiGbl_CreateOsiMethod, TRUE);
/*
* Disable wakeup GPEs during runtime? Default is TRUE because WAKE and
* RUNTIME GPEs should never be shared, and WAKE GPEs should typically only
@ -246,6 +256,7 @@ ACPI_EXTERN ACPI_MUTEX_INFO AcpiGbl_MutexInfo[NUM_MUTEX];
ACPI_EXTERN ACPI_MEMORY_LIST AcpiGbl_MemoryLists[ACPI_NUM_MEM_LISTS];
ACPI_EXTERN ACPI_OBJECT_NOTIFY_HANDLER AcpiGbl_DeviceNotify;
ACPI_EXTERN ACPI_OBJECT_NOTIFY_HANDLER AcpiGbl_SystemNotify;
ACPI_EXTERN ACPI_EXCEPTION_HANDLER AcpiGbl_ExceptionHandler;
ACPI_EXTERN ACPI_INIT_HANDLER AcpiGbl_InitHandler;
ACPI_EXTERN ACPI_WALK_STATE *AcpiGbl_BreakpointWalk;
ACPI_EXTERN ACPI_HANDLE AcpiGbl_GlobalLockSemaphore;

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Name: achware.h -- hardware specific interfaces
* $Revision: 72 $
* $Revision: 73 $
*
*****************************************************************************/
@ -211,15 +211,15 @@ AcpiHwGetGpeStatus (
ACPI_STATUS
AcpiHwDisableAllGpes (
void);
UINT32 Flags);
ACPI_STATUS
AcpiHwEnableAllRuntimeGpes (
void);
UINT32 Flags);
ACPI_STATUS
AcpiHwEnableAllWakeupGpes (
void);
UINT32 Flags);
ACPI_STATUS
AcpiHwEnableRuntimeGpeBlock (

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Name: acinterp.h - Interpreter subcomponent prototypes and defines
* $Revision: 149 $
* $Revision: 155 $
*
*****************************************************************************/
@ -156,21 +156,25 @@ ACPI_STATUS
AcpiExConvertToInteger (
ACPI_OPERAND_OBJECT *ObjDesc,
ACPI_OPERAND_OBJECT **ResultDesc,
ACPI_WALK_STATE *WalkState);
UINT32 Flags);
ACPI_STATUS
AcpiExConvertToBuffer (
ACPI_OPERAND_OBJECT *ObjDesc,
ACPI_OPERAND_OBJECT **ResultDesc,
ACPI_WALK_STATE *WalkState);
ACPI_OPERAND_OBJECT **ResultDesc);
ACPI_STATUS
AcpiExConvertToString (
ACPI_OPERAND_OBJECT *ObjDesc,
ACPI_OPERAND_OBJECT **ResultDesc,
UINT32 Base,
UINT32 MaxLength,
ACPI_WALK_STATE *WalkState);
UINT32 Type);
/* Types for ->String conversion */
#define ACPI_EXPLICIT_BYTE_COPY 0x00000000
#define ACPI_EXPLICIT_CONVERT_HEX 0x00000001
#define ACPI_IMPLICIT_CONVERT_HEX 0x00000002
#define ACPI_EXPLICIT_CONVERT_DECIMAL 0x00000003
ACPI_STATUS
AcpiExConvertToTargetType (
@ -182,7 +186,7 @@ AcpiExConvertToTargetType (
UINT32
AcpiExConvertToAscii (
ACPI_INTEGER Integer,
UINT32 Base,
UINT16 Base,
UINT8 *String,
UINT8 MaxLength);
@ -316,11 +320,19 @@ AcpiExDoConcatenate (
ACPI_OPERAND_OBJECT **ActualReturnDesc,
ACPI_WALK_STATE *WalkState);
BOOLEAN
ACPI_STATUS
AcpiExDoLogicalNumericOp (
UINT16 Opcode,
ACPI_INTEGER Integer0,
ACPI_INTEGER Integer1,
BOOLEAN *LogicalResult);
ACPI_STATUS
AcpiExDoLogicalOp (
UINT16 Opcode,
ACPI_INTEGER Operand0,
ACPI_INTEGER Operand1);
ACPI_OPERAND_OBJECT *Operand0,
ACPI_OPERAND_OBJECT *Operand1,
BOOLEAN *LogicalResult);
ACPI_INTEGER
AcpiExDoMathOp (
@ -447,7 +459,7 @@ AcpiExSystemDoNotifyOp (
ACPI_STATUS
AcpiExSystemDoSuspend(
UINT32 Time);
ACPI_INTEGER Time);
ACPI_STATUS
AcpiExSystemDoStall (
@ -485,6 +497,10 @@ AcpiExSystemWaitSemaphore (
* exmonadic - ACPI AML (p-code) execution, monadic operators
*/
ACPI_STATUS
AcpiExOpcode_0A_0T_1R (
ACPI_WALK_STATE *WalkState);
ACPI_STATUS
AcpiExOpcode_1A_0T_0R (
ACPI_WALK_STATE *WalkState);
@ -543,12 +559,13 @@ AcpiExResolveObjectToValue (
/*
* exdump - Scanner debug output routines
* exdump - Interpreter debug output routines
*/
void
AcpiExDumpOperand (
ACPI_OPERAND_OBJECT *EntryDesc);
ACPI_OPERAND_OBJECT *ObjDesc,
UINT32 Depth);
void
AcpiExDumpOperands (

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Name: aclocal.h - Internal data types used across the ACPI subsystem
* $Revision: 201 $
* $Revision: 202 $
*
*****************************************************************************/
@ -126,7 +126,7 @@ typedef UINT32 ACPI_MUTEX_HANDLE;
/* Total number of aml opcodes defined */
#define AML_NUM_OPCODES 0x7E
#define AML_NUM_OPCODES 0x7F
/*****************************************************************************
@ -1050,8 +1050,7 @@ typedef struct acpi_debug_print_info
UINT32 Component; \
UINT32 Line; \
char Module[ACPI_MAX_MODULE_NAME]; \
UINT8 AllocType; \
UINT8 Padding[3];
UINT8 AllocType;
typedef struct acpi_debug_mem_header
{

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Name: acmacros.h - C macros for the entire subsystem.
* $Revision: 151 $
* $Revision: 154 $
*
*****************************************************************************/
@ -437,24 +437,6 @@
#define ACPI_IS_OCTAL_DIGIT(d) (((char)(d) >= '0') && ((char)(d) <= '7'))
/* Macros for GAS addressing */
#if ACPI_MACHINE_WIDTH != 16
#define ACPI_PCI_DEVICE(a) (UINT16) ((ACPI_HIDWORD ((a))) & 0x0000FFFF)
#define ACPI_PCI_FUNCTION(a) (UINT16) ((ACPI_LODWORD ((a))) >> 16)
#define ACPI_PCI_REGISTER(a) (UINT16) ((ACPI_LODWORD ((a))) & 0x0000FFFF)
#else
/* No support for GAS and PCI IDs in 16-bit mode */
#define ACPI_PCI_FUNCTION(a) (UINT16) ((a) & 0xFFFF0000)
#define ACPI_PCI_DEVICE(a) (UINT16) ((a) & 0x0000FFFF)
#define ACPI_PCI_REGISTER(a) (UINT16) ((a) & 0x0000FFFF)
#endif
/* Bitfields within ACPI registers */
@ -578,19 +560,19 @@
* The first parameter should be the procedure name as a quoted string. This is declared
* as a local string ("_ProcName) so that it can be also used by the function exit macros below.
*/
#define ACPI_FUNCTION_NAME(a) ACPI_DEBUG_PRINT_INFO _Dbg; \
_Dbg.ComponentId = _COMPONENT; \
_Dbg.ProcName = a; \
_Dbg.ModuleName = _THIS_MODULE;
#define ACPI_FUNCTION_NAME(a) ACPI_DEBUG_PRINT_INFO _DebugInfo; \
_DebugInfo.ComponentId = _COMPONENT; \
_DebugInfo.ProcName = a; \
_DebugInfo.ModuleName = _THIS_MODULE;
#define ACPI_FUNCTION_TRACE(a) ACPI_FUNCTION_NAME(a) \
AcpiUtTrace(__LINE__,&_Dbg)
AcpiUtTrace(__LINE__,&_DebugInfo)
#define ACPI_FUNCTION_TRACE_PTR(a,b) ACPI_FUNCTION_NAME(a) \
AcpiUtTracePtr(__LINE__,&_Dbg,(void *)b)
AcpiUtTracePtr(__LINE__,&_DebugInfo,(void *)b)
#define ACPI_FUNCTION_TRACE_U32(a,b) ACPI_FUNCTION_NAME(a) \
AcpiUtTraceU32(__LINE__,&_Dbg,(UINT32)b)
AcpiUtTraceU32(__LINE__,&_DebugInfo,(UINT32)b)
#define ACPI_FUNCTION_TRACE_STR(a,b) ACPI_FUNCTION_NAME(a) \
AcpiUtTraceStr(__LINE__,&_Dbg,(char *)b)
AcpiUtTraceStr(__LINE__,&_DebugInfo,(char *)b)
#define ACPI_FUNCTION_ENTRY() AcpiUtTrackStackPtr()
@ -607,10 +589,10 @@
#define ACPI_DO_WHILE0(a) a
#endif
#define return_VOID ACPI_DO_WHILE0 ({AcpiUtExit(__LINE__,&_Dbg);return;})
#define return_ACPI_STATUS(s) ACPI_DO_WHILE0 ({AcpiUtStatusExit(__LINE__,&_Dbg,(s));return((s));})
#define return_VALUE(s) ACPI_DO_WHILE0 ({AcpiUtValueExit(__LINE__,&_Dbg,(ACPI_INTEGER)(s));return((s));})
#define return_PTR(s) ACPI_DO_WHILE0 ({AcpiUtPtrExit(__LINE__,&_Dbg,(UINT8 *)(s));return((s));})
#define return_VOID ACPI_DO_WHILE0 ({AcpiUtExit(__LINE__,&_DebugInfo);return;})
#define return_ACPI_STATUS(s) ACPI_DO_WHILE0 ({AcpiUtStatusExit(__LINE__,&_DebugInfo,(s));return((s));})
#define return_VALUE(s) ACPI_DO_WHILE0 ({AcpiUtValueExit(__LINE__,&_DebugInfo,(ACPI_INTEGER)(s));return((s));})
#define return_PTR(s) ACPI_DO_WHILE0 ({AcpiUtPtrExit(__LINE__,&_DebugInfo,(UINT8 *)(s));return((s));})
/* Conditional execution */
@ -624,7 +606,7 @@
/* Stack and buffer dumping */
#define ACPI_DUMP_STACK_ENTRY(a) AcpiExDumpOperand(a)
#define ACPI_DUMP_STACK_ENTRY(a) AcpiExDumpOperand((a),0)
#define ACPI_DUMP_OPERANDS(a,b,c,d,e) AcpiExDumpOperands(a,b,c,d,e,_THIS_MODULE,__LINE__)

View File

@ -2,7 +2,7 @@
/******************************************************************************
*
* Name: acobject.h - Definition of ACPI_OPERAND_OBJECT (Internal object only)
* $Revision: 125 $
* $Revision: 126 $
*
*****************************************************************************/
@ -210,7 +210,10 @@ typedef struct acpi_object_integer
} ACPI_OBJECT_INTEGER;
/*
* Note: The String and Buffer object must be identical through the Pointer
* element. There is code that depends on this.
*/
typedef struct acpi_object_string /* Null terminated, ASCII characters only */
{
ACPI_OBJECT_COMMON_HEADER

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Name: acoutput.h -- debug output
* $Revision: 94 $
* $Revision: 95 $
*
*****************************************************************************/
@ -209,7 +209,7 @@
/*
* Debug level macros that are used in the DEBUG_PRINT macros
*/
#define ACPI_DEBUG_LEVEL(dl) (UINT32) dl,__LINE__,&_Dbg
#define ACPI_DEBUG_LEVEL(dl) (UINT32) dl,__LINE__,&_DebugInfo
/* Exception level -- used in the global "DebugLevel" */

View File

@ -263,13 +263,13 @@ AcpiOsGetPhysicalAddress (
ACPI_STATUS
AcpiOsInstallInterruptHandler (
UINT32 InterruptNumber,
OSD_HANDLER ServiceRoutine,
ACPI_OSD_HANDLER ServiceRoutine,
void *Context);
ACPI_STATUS
AcpiOsRemoveInterruptHandler (
UINT32 InterruptNumber,
OSD_HANDLER ServiceRoutine);
ACPI_OSD_HANDLER ServiceRoutine);
/*
@ -283,13 +283,16 @@ AcpiOsGetThreadId (
ACPI_STATUS
AcpiOsQueueForExecution (
UINT32 Priority,
OSD_EXECUTION_CALLBACK Function,
ACPI_OSD_EXEC_CALLBACK Function,
void *Context);
void
AcpiOsWaitEventsComplete (
void *Context);
void
AcpiOsSleep (
UINT32 Seconds,
UINT32 Milliseconds);
ACPI_INTEGER Milliseconds);
void
AcpiOsStall (
@ -332,29 +335,32 @@ AcpiOsWriteMemory (
/*
* Platform and hardware-independent PCI configuration space access
* Note: Can't use "Register" as a parameter, changed to "Reg" --
* certain compilers complain.
*/
ACPI_STATUS
AcpiOsReadPciConfiguration (
ACPI_PCI_ID *PciId,
UINT32 Register,
UINT32 Reg,
void *Value,
UINT32 Width);
ACPI_STATUS
AcpiOsWritePciConfiguration (
ACPI_PCI_ID *PciId,
UINT32 Register,
UINT32 Reg,
ACPI_INTEGER Value,
UINT32 Width);
/*
* Interim function needed for PCI IRQ routing
*/
void
AcpiOsDerivePciId(
ACPI_HANDLE rhandle,
ACPI_HANDLE chandle,
ACPI_HANDLE Rhandle,
ACPI_HANDLE Chandle,
ACPI_PCI_ID **PciId);
/*
@ -371,7 +377,7 @@ AcpiOsWritable (
void *Pointer,
ACPI_SIZE Length);
UINT32
UINT64
AcpiOsGetTimer (
void);

View File

@ -371,6 +371,15 @@ AcpiInstallGpeHandler (
ACPI_EVENT_HANDLER Address,
void *Context);
ACPI_STATUS
AcpiInstallExceptionHandler (
ACPI_EXCEPTION_HANDLER Handler);
/*
* Event interfaces
*/
ACPI_STATUS
AcpiAcquireGlobalLock (
UINT16 Timeout,

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Name: actbl2.h - ACPI Specification Revision 2.0 Tables
* $Revision: 36 $
* $Revision: 37 $
*
*****************************************************************************/
@ -135,6 +135,7 @@
#define BAF_8042_KEYBOARD_CONTROLLER 0x0002
#define FADT2_REVISION_ID 3
#define FADT2_MINUS_REVISION_ID 2
#pragma pack(1)
@ -194,48 +195,51 @@ typedef struct acpi_generic_address
} ACPI_GENERIC_ADDRESS;
#define FADT_REV2_COMMON \
UINT32 V1_FirmwareCtrl; /* 32-bit physical address of FACS */ \
UINT32 V1_Dsdt; /* 32-bit physical address of DSDT */ \
UINT8 Reserved1; /* System Interrupt Model isn't used in ACPI 2.0*/ \
UINT8 Prefer_PM_Profile; /* Conveys preferred power management profile to OSPM. */ \
UINT16 SciInt; /* System vector of SCI interrupt */ \
UINT32 SmiCmd; /* Port address of SMI command port */ \
UINT8 AcpiEnable; /* Value to write to smi_cmd to enable ACPI */ \
UINT8 AcpiDisable; /* Value to write to smi_cmd to disable ACPI */ \
UINT8 S4BiosReq; /* Value to write to SMI CMD to enter S4BIOS state */ \
UINT8 PstateCnt; /* Processor performance state control*/ \
UINT32 V1_Pm1aEvtBlk; /* Port address of Power Mgt 1a AcpiEvent Reg Blk */ \
UINT32 V1_Pm1bEvtBlk; /* Port address of Power Mgt 1b AcpiEvent Reg Blk */ \
UINT32 V1_Pm1aCntBlk; /* Port address of Power Mgt 1a Control Reg Blk */ \
UINT32 V1_Pm1bCntBlk; /* Port address of Power Mgt 1b Control Reg Blk */ \
UINT32 V1_Pm2CntBlk; /* Port address of Power Mgt 2 Control Reg Blk */ \
UINT32 V1_PmTmrBlk; /* Port address of Power Mgt Timer Ctrl Reg Blk */ \
UINT32 V1_Gpe0Blk; /* Port addr of General Purpose AcpiEvent 0 Reg Blk */ \
UINT32 V1_Gpe1Blk; /* Port addr of General Purpose AcpiEvent 1 Reg Blk */ \
UINT8 Pm1EvtLen; /* Byte Length of ports at pm1X_evt_blk */ \
UINT8 Pm1CntLen; /* Byte Length of ports at pm1X_cnt_blk */ \
UINT8 Pm2CntLen; /* Byte Length of ports at pm2_cnt_blk */ \
UINT8 PmTmLen; /* Byte Length of ports at pm_tm_blk */ \
UINT8 Gpe0BlkLen; /* Byte Length of ports at gpe0_blk */ \
UINT8 Gpe1BlkLen; /* Byte Length of ports at gpe1_blk */ \
UINT8 Gpe1Base; /* Offset in gpe model where gpe1 events start */ \
UINT8 CstCnt; /* Support for the _CST object and C States change notification.*/ \
UINT16 Plvl2Lat; /* Worst case HW latency to enter/exit C2 state */ \
UINT16 Plvl3Lat; /* Worst case HW latency to enter/exit C3 state */ \
UINT16 FlushSize; /* Number of flush strides that need to be read */ \
UINT16 FlushStride; /* Processor's memory cache line width, in bytes */ \
UINT8 DutyOffset; /* Processor's duty cycle index in processor's P_CNT reg*/ \
UINT8 DutyWidth; /* Processor's duty cycle value bit width in P_CNT register.*/ \
UINT8 DayAlrm; /* Index to day-of-month alarm in RTC CMOS RAM */ \
UINT8 MonAlrm; /* Index to month-of-year alarm in RTC CMOS RAM */ \
UINT8 Century; /* Index to century in RTC CMOS RAM */ \
UINT16 IapcBootArch; /* IA-PC Boot Architecture Flags. See Table 5-10 for description*/
/*
* ACPI 2.0 Fixed ACPI Description Table (FADT)
*/
typedef struct fadt_descriptor_rev2
{
ACPI_TABLE_HEADER_DEF /* ACPI common table header */
UINT32 V1_FirmwareCtrl; /* 32-bit physical address of FACS */
UINT32 V1_Dsdt; /* 32-bit physical address of DSDT */
UINT8 Reserved1; /* System Interrupt Model isn't used in ACPI 2.0*/
UINT8 Prefer_PM_Profile; /* Conveys preferred power management profile to OSPM. */
UINT16 SciInt; /* System vector of SCI interrupt */
UINT32 SmiCmd; /* Port address of SMI command port */
UINT8 AcpiEnable; /* Value to write to smi_cmd to enable ACPI */
UINT8 AcpiDisable; /* Value to write to smi_cmd to disable ACPI */
UINT8 S4BiosReq; /* Value to write to SMI CMD to enter S4BIOS state */
UINT8 PstateCnt; /* Processor performance state control*/
UINT32 V1_Pm1aEvtBlk; /* Port address of Power Mgt 1a AcpiEvent Reg Blk */
UINT32 V1_Pm1bEvtBlk; /* Port address of Power Mgt 1b AcpiEvent Reg Blk */
UINT32 V1_Pm1aCntBlk; /* Port address of Power Mgt 1a Control Reg Blk */
UINT32 V1_Pm1bCntBlk; /* Port address of Power Mgt 1b Control Reg Blk */
UINT32 V1_Pm2CntBlk; /* Port address of Power Mgt 2 Control Reg Blk */
UINT32 V1_PmTmrBlk; /* Port address of Power Mgt Timer Ctrl Reg Blk */
UINT32 V1_Gpe0Blk; /* Port addr of General Purpose AcpiEvent 0 Reg Blk */
UINT32 V1_Gpe1Blk; /* Port addr of General Purpose AcpiEvent 1 Reg Blk */
UINT8 Pm1EvtLen; /* Byte Length of ports at pm1X_evt_blk */
UINT8 Pm1CntLen; /* Byte Length of ports at pm1X_cnt_blk */
UINT8 Pm2CntLen; /* Byte Length of ports at pm2_cnt_blk */
UINT8 PmTmLen; /* Byte Length of ports at pm_tm_blk */
UINT8 Gpe0BlkLen; /* Byte Length of ports at gpe0_blk */
UINT8 Gpe1BlkLen; /* Byte Length of ports at gpe1_blk */
UINT8 Gpe1Base; /* Offset in gpe model where gpe1 events start */
UINT8 CstCnt; /* Support for the _CST object and C States change notification.*/
UINT16 Plvl2Lat; /* Worst case HW latency to enter/exit C2 state */
UINT16 Plvl3Lat; /* Worst case HW latency to enter/exit C3 state */
UINT16 FlushSize; /* Number of flush strides that need to be read */
UINT16 FlushStride; /* Processor's memory cache line width, in bytes */
UINT8 DutyOffset; /* Processor's duty cycle index in processor's P_CNT reg*/
UINT8 DutyWidth; /* Processor's duty cycle value bit width in P_CNT register.*/
UINT8 DayAlrm; /* Index to day-of-month alarm in RTC CMOS RAM */
UINT8 MonAlrm; /* Index to month-of-year alarm in RTC CMOS RAM */
UINT8 Century; /* Index to century in RTC CMOS RAM */
UINT16 IapcBootArch; /* IA-PC Boot Architecture Flags. See Table 5-10 for description*/
FADT_REV2_COMMON
UINT8 Reserved2; /* Reserved */
UINT32_BIT WbInvd : 1; /* The wbinvd instruction works properly */
UINT32_BIT WbInvdFlush : 1; /* The wbinvd flushes but does not invalidate */
@ -271,6 +275,22 @@ typedef struct fadt_descriptor_rev2
} FADT_DESCRIPTOR_REV2;
/* "Downrevved" ACPI 2.0 FADT descriptor */
typedef struct fadt_descriptor_rev2_minus
{
ACPI_TABLE_HEADER_DEF /* ACPI common table header */
FADT_REV2_COMMON
UINT8 Reserved2; /* Reserved */
UINT32 Flags;
ACPI_GENERIC_ADDRESS ResetRegister; /* Reset register address in GAS format */
UINT8 ResetValue; /* Value to write to the ResetRegister port to reset the system. */
UINT8 Reserved7[3]; /* These three bytes must be zero */
} FADT_DESCRIPTOR_REV2_MINUS;
/* Embedded Controller */
typedef struct ec_boot_resources

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Name: actypes.h - Common data types for the entire ACPI subsystem
* $Revision: 270 $
* $Revision: 274 $
*
*****************************************************************************/
@ -382,7 +382,7 @@ typedef struct uint32_struct
typedef UINT32 ACPI_INTEGER;
#define ACPI_INTEGER_MAX ACPI_UINT32_MAX
#define ACPI_INTEGER_BIT_SIZE 32
#define ACPI_MAX_DECIMAL_DIGITS 10
#define ACPI_MAX_DECIMAL_DIGITS 10 /* 2^32 = 4,294,967,296 */
#define ACPI_USE_NATIVE_DIVIDE /* Use compiler native 32-bit divide */
@ -394,13 +394,18 @@ typedef UINT32 ACPI_INTEGER;
typedef UINT64 ACPI_INTEGER;
#define ACPI_INTEGER_MAX ACPI_UINT64_MAX
#define ACPI_INTEGER_BIT_SIZE 64
#define ACPI_MAX_DECIMAL_DIGITS 19
#define ACPI_MAX_DECIMAL_DIGITS 20 /* 2^64 = 18,446,744,073,709,551,616 */
#if ACPI_MACHINE_WIDTH == 64
#define ACPI_USE_NATIVE_DIVIDE /* Use compiler native 64-bit divide */
#endif
#endif
#define ACPI_MAX64_DECIMAL_DIGITS 20
#define ACPI_MAX32_DECIMAL_DIGITS 10
#define ACPI_MAX16_DECIMAL_DIGITS 5
#define ACPI_MAX8_DECIMAL_DIGITS 3
/*
* Constants with special meanings
@ -882,11 +887,11 @@ typedef struct acpi_system_info
*/
typedef UINT32
(ACPI_SYSTEM_XFACE *OSD_HANDLER) (
(ACPI_SYSTEM_XFACE *ACPI_OSD_HANDLER) (
void *Context);
typedef void
(ACPI_SYSTEM_XFACE *OSD_EXECUTION_CALLBACK) (
(ACPI_SYSTEM_XFACE *ACPI_OSD_EXEC_CALLBACK) (
void *Context);
/*
@ -915,6 +920,14 @@ ACPI_STATUS (*ACPI_INIT_HANDLER) (
#define ACPI_INIT_DEVICE_INI 1
typedef
ACPI_STATUS (*ACPI_EXCEPTION_HANDLER) (
ACPI_STATUS AmlStatus,
ACPI_NAME Name,
UINT16 Opcode,
UINT32 AmlOffset,
void *Context);
/* Address Spaces (For Operation Regions) */

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Name: acutils.h -- prototypes for the common (subsystem-wide) procedures
* $Revision: 161 $
* $Revision: 164 $
*
*****************************************************************************/
@ -251,6 +251,12 @@ AcpiUtStrncpy (
const char *SrcString,
ACPI_SIZE Count);
int
AcpiUtMemcmp (
const char *Buffer1,
const char *Buffer2,
ACPI_SIZE Count);
int
AcpiUtStrncmp (
const char *String1,
@ -651,6 +657,10 @@ ACPI_OPERAND_OBJECT *
AcpiUtCreateBufferObject (
ACPI_SIZE BufferSize);
ACPI_OPERAND_OBJECT *
AcpiUtCreateStringObject (
ACPI_SIZE StringSize);
/*
* UtRefCnt - Object reference count management
@ -764,14 +774,14 @@ AcpiUtPrintString (
ACPI_STATUS
AcpiUtDivide (
ACPI_INTEGER *InDividend,
ACPI_INTEGER *InDivisor,
ACPI_INTEGER InDividend,
ACPI_INTEGER InDivisor,
ACPI_INTEGER *OutQuotient,
ACPI_INTEGER *OutRemainder);
ACPI_STATUS
AcpiUtShortDivide (
ACPI_INTEGER *InDividend,
ACPI_INTEGER InDividend,
UINT32 Divisor,
ACPI_INTEGER *OutQuotient,
UINT32 *OutRemainder);
@ -790,6 +800,10 @@ AcpiUtStrtoul64 (
UINT32 Base,
ACPI_INTEGER *RetInteger);
/* Values for Base above (16=Hex, 10=Decimal) */
#define ACPI_ANY_BASE 0
char *
AcpiUtStrupr (
char *SrcString);

View File

@ -3,7 +3,7 @@
* Name: amlcode.h - Definitions for AML, as included in "definition blocks"
* Declarations and definitions contained herein are derived
* directly from the ACPI specification.
* $Revision: 75 $
* $Revision: 77 $
*
*****************************************************************************/
@ -243,6 +243,7 @@
#define AML_REVISION_OP (UINT16) 0x5b30
#define AML_DEBUG_OP (UINT16) 0x5b31
#define AML_FATAL_OP (UINT16) 0x5b32
#define AML_TIMER_OP (UINT16) 0x5b33 /* ACPI 3.0 */
#define AML_REGION_OP (UINT16) 0x5b80
#define AML_FIELD_OP (UINT16) 0x5b81
#define AML_DEVICE_OP (UINT16) 0x5b82
@ -378,22 +379,24 @@
/* Opcode flags */
#define AML_HAS_ARGS 0x0800
#define AML_HAS_TARGET 0x0400
#define AML_HAS_RETVAL 0x0200
#define AML_NSOBJECT 0x0100
#define AML_NSOPCODE 0x0080
#define AML_NSNODE 0x0040
#define AML_NAMED 0x0020
#define AML_DEFER 0x0010
#define AML_FIELD 0x0008
#define AML_CREATE 0x0004
#define AML_MATH 0x0002
#define AML_LOGICAL 0x0001
#define AML_CONSTANT 0x1000
#define AML_LOGICAL_NUMERIC 0x0002
#define AML_MATH 0x0004
#define AML_CREATE 0x0008
#define AML_FIELD 0x0010
#define AML_DEFER 0x0020
#define AML_NAMED 0x0040
#define AML_NSNODE 0x0080
#define AML_NSOPCODE 0x0100
#define AML_NSOBJECT 0x0200
#define AML_HAS_RETVAL 0x0400
#define AML_HAS_TARGET 0x0800
#define AML_HAS_ARGS 0x1000
#define AML_CONSTANT 0x2000
/* Convenient flag groupings */
#define AML_FLAGS_EXEC_0A_0T_1R AML_HAS_RETVAL
#define AML_FLAGS_EXEC_1A_0T_0R AML_HAS_ARGS /* Monadic1 */
#define AML_FLAGS_EXEC_1A_0T_1R AML_HAS_ARGS | AML_HAS_RETVAL /* Monadic2 */
#define AML_FLAGS_EXEC_1A_1T_0R AML_HAS_ARGS | AML_HAS_TARGET
@ -411,17 +414,18 @@
* The opcode Type is used in a dispatch table, do not change
* without updating the table.
*/
#define AML_TYPE_EXEC_1A_0T_0R 0x00 /* Monadic1 */
#define AML_TYPE_EXEC_1A_0T_1R 0x01 /* Monadic2 */
#define AML_TYPE_EXEC_1A_1T_0R 0x02
#define AML_TYPE_EXEC_1A_1T_1R 0x03 /* Monadic2R */
#define AML_TYPE_EXEC_2A_0T_0R 0x04 /* Dyadic1 */
#define AML_TYPE_EXEC_2A_0T_1R 0x05 /* Dyadic2 */
#define AML_TYPE_EXEC_2A_1T_1R 0x06 /* Dyadic2R */
#define AML_TYPE_EXEC_2A_2T_1R 0x07
#define AML_TYPE_EXEC_3A_0T_0R 0x08
#define AML_TYPE_EXEC_3A_1T_1R 0x09
#define AML_TYPE_EXEC_6A_0T_1R 0x0A
#define AML_TYPE_EXEC_0A_0T_1R 0x00
#define AML_TYPE_EXEC_1A_0T_0R 0x01 /* Monadic1 */
#define AML_TYPE_EXEC_1A_0T_1R 0x02 /* Monadic2 */
#define AML_TYPE_EXEC_1A_1T_0R 0x03
#define AML_TYPE_EXEC_1A_1T_1R 0x04 /* Monadic2R */
#define AML_TYPE_EXEC_2A_0T_0R 0x05 /* Dyadic1 */
#define AML_TYPE_EXEC_2A_0T_1R 0x06 /* Dyadic2 */
#define AML_TYPE_EXEC_2A_1T_1R 0x07 /* Dyadic2R */
#define AML_TYPE_EXEC_2A_2T_1R 0x08
#define AML_TYPE_EXEC_3A_0T_0R 0x09
#define AML_TYPE_EXEC_3A_1T_1R 0x0A
#define AML_TYPE_EXEC_6A_0T_1R 0x0B
/* End of types used in dispatch table */
#define AML_TYPE_LITERAL 0x0B

View File

@ -2,7 +2,7 @@
/******************************************************************************
*
* Module Name: amlresrc.h - AML resource descriptors
* $Revision: 24 $
* $Revision: 25 $
*
*****************************************************************************/
@ -173,7 +173,7 @@ typedef struct asl_resource_node
/*
* Resource descriptors defined in the ACPI specification.
*
* Alignment must be BYTE because these descriptors
* Packing/alignment must be BYTE because these descriptors
* are used to overlay the AML byte stream.
*/
#pragma pack(1)
@ -390,7 +390,7 @@ typedef struct asl_general_register_desc
#pragma pack()
/* Union of all resource descriptors, sow we can allocate the worst case */
/* Union of all resource descriptors, so we can allocate the worst case */
typedef union asl_resource_desc
{

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: adisasm - Application-level disassembler routines
* $Revision: 67 $
* $Revision: 69 $
*
*****************************************************************************/
@ -880,6 +880,7 @@ AdGetLocalTables (
ACPI_TABLE_HEADER *NewTable;
UINT32 NumTables;
UINT32 PointerSize;
char *FacsSuffix = "";
if (GetAllTables)
@ -923,6 +924,10 @@ AdGetLocalTables (
AcpiGbl_FADT = (void *) NewTable;
AdWriteTable (NewTable, NewTable->Length,
FADT_SIG, NewTable->OemTableId);
/* Use the FADT tableID for the FACS, since FACS has no ID */
FacsSuffix = AcpiGbl_FADT->OemTableId;
}
AcpiOsPrintf ("\n");
@ -934,7 +939,7 @@ AdGetLocalTables (
{
AcpiGbl_FACS = (void *) NewTable;
AdWriteTable (NewTable, AcpiGbl_FACS->Length,
FACS_SIG, AcpiGbl_FADT->OemTableId);
FACS_SIG, FacsSuffix);
}
AcpiOsPrintf ("\n");
}

View File

@ -2,7 +2,7 @@
/******************************************************************************
*
* Module Name: aslanalyze.c - check for semantic errors
* $Revision: 80 $
* $Revision: 84 $
*
*****************************************************************************/
@ -454,8 +454,9 @@ AnGetBtype (
if (!Node)
{
DbgPrint (ASL_DEBUG_OUTPUT,
"Null attached Nsnode: [%s] at line %d\n",
Op->Asl.ParseOpName, Op->Asl.LineNumber);
"No attached Nsnode: [%s] at line %d name [%s], ignoring typecheck\n",
Op->Asl.ParseOpName, Op->Asl.LineNumber,
Op->Asl.ExternalName);
return ACPI_UINT32_MAX;
}
@ -582,6 +583,13 @@ AnCheckForReservedName (
else if ((Op->Asl.ExternalName[1] == 'T') &&
(Op->Asl.ExternalName[2] == '_'))
{
/* Ignore if actually emitted by the compiler */
if (Op->Asl.CompileFlags & NODE_COMPILER_EMITTED)
{
return (ACPI_NOT_RESERVED_NAME);
}
AslError (ASL_ERROR, ASL_MSG_RESERVED_WORD, Op, Op->Asl.ExternalName);
return (ACPI_COMPILER_RESERVED_NAME);
}
@ -683,6 +691,64 @@ AnCheckForReservedMethod (
}
UINT32
AnMapObjTypeToBtype (
ACPI_PARSE_OBJECT *Op)
{
switch (Op->Asl.ParseOpcode)
{
case PARSEOP_OBJECTTYPE_BFF: /* "BuffFieldObj" */
return (ACPI_BTYPE_BUFFER_FIELD);
case PARSEOP_OBJECTTYPE_BUF: /* "BuffObj" */
return (ACPI_BTYPE_BUFFER);
case PARSEOP_OBJECTTYPE_DDB: /* "DDBHandleObj" */
return (ACPI_BTYPE_DDB_HANDLE);
case PARSEOP_OBJECTTYPE_DEV: /* "DeviceObj" */
return (ACPI_BTYPE_DEVICE);
case PARSEOP_OBJECTTYPE_EVT: /* "EventObj" */
return (ACPI_BTYPE_EVENT);
case PARSEOP_OBJECTTYPE_FLD: /* "FieldUnitObj" */
return (ACPI_BTYPE_FIELD_UNIT);
case PARSEOP_OBJECTTYPE_INT: /* "IntObj" */
return (ACPI_BTYPE_INTEGER);
case PARSEOP_OBJECTTYPE_MTH: /* "MethodObj" */
return (ACPI_BTYPE_METHOD);
case PARSEOP_OBJECTTYPE_MTX: /* "MutexObj" */
return (ACPI_BTYPE_MUTEX);
case PARSEOP_OBJECTTYPE_OPR: /* "OpRegionObj" */
return (ACPI_BTYPE_REGION);
case PARSEOP_OBJECTTYPE_PKG: /* "PkgObj" */
return (ACPI_BTYPE_PACKAGE);
case PARSEOP_OBJECTTYPE_POW: /* "PowerResObj" */
return (ACPI_BTYPE_POWER);
case PARSEOP_OBJECTTYPE_STR: /* "StrObj" */
return (ACPI_BTYPE_STRING);
case PARSEOP_OBJECTTYPE_THZ: /* "ThermalZoneObj" */
return (ACPI_BTYPE_THERMAL);
case PARSEOP_OBJECTTYPE_UNK: /* "UnknownObj" */
return (ACPI_BTYPE_OBJECTS_AND_REFS);
default:
return (0);
}
}
/*******************************************************************************
*
* FUNCTION: AnMethodAnalysisWalkBegin
@ -711,6 +777,10 @@ AnMethodAnalysisWalkBegin (
UINT32 i;
char LocalName[] = "Local0";
char ArgName[] = "Arg0";
ACPI_PARSE_OBJECT *ArgNode;
ACPI_PARSE_OBJECT *NextType;
ACPI_PARSE_OBJECT *NextParamType;
char ActualArgs = 0;
ACPI_FUNCTION_NAME ("AnMethodAnalysisWalkBegin");
@ -731,12 +801,76 @@ AnMethodAnalysisWalkBegin (
WalkInfo->MethodStack = MethodInfo;
/* Get the NumArguments node */
/* Get the name node, ignored here */
Next = Op->Asl.Child;
/* Get the NumArguments node */
Next = Next->Asl.Next;
MethodInfo->NumArguments = (UINT8) (((UINT8) Next->Asl.Value.Integer) & 0x07);
/* Get the SerializeRule and SyncLevel nodes, ignored here */
Next = Next->Asl.Next;
Next = Next->Asl.Next;
ArgNode = Next;
/* Get the ReturnType node */
Next = Next->Asl.Next;
NextType = Next->Asl.Child;
while (NextType)
{
/* Get and map each of the ReturnTypes */
MethodInfo->ValidReturnTypes |= AnMapObjTypeToBtype (NextType);
NextType->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
NextType = NextType->Asl.Next;
}
/* Get the ParameterType node */
Next = Next->Asl.Next;
NextType = Next->Asl.Child;
while (NextType)
{
if (NextType->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
{
NextParamType = NextType->Asl.Child;
while (NextParamType)
{
MethodInfo->ValidArgTypes[ActualArgs] |= AnMapObjTypeToBtype (NextParamType);
NextParamType->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
NextParamType = NextParamType->Asl.Next;
}
}
else
{
MethodInfo->ValidArgTypes[ActualArgs] = AnMapObjTypeToBtype (NextType);
NextType->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
}
ActualArgs++;
NextType = NextType->Asl.Next;
}
if ((MethodInfo->NumArguments) &&
(MethodInfo->NumArguments != ActualArgs))
{
/* error: Param list did not match number of args */
}
/* Allow numarguments == 0 for Function() */
if ((!MethodInfo->NumArguments) && (ActualArgs))
{
MethodInfo->NumArguments = ActualArgs;
ArgNode->Asl.Value.Integer |= ActualArgs;
}
/*
* Actual arguments are initialized at method entry.
* All other ArgX "registers" can be used as locals, so we
@ -746,7 +880,6 @@ AnMethodAnalysisWalkBegin (
{
MethodInfo->ArgInitialized[i] = TRUE;
}
break;
@ -791,8 +924,11 @@ AnMethodAnalysisWalkBegin (
/*
* Otherwise, this is a reference, check if the local
* has been previously initialized.
*
* The only operator that accepts an uninitialized value is ObjectType()
*/
else if (!MethodInfo->LocalInitialized[RegisterNumber])
else if ((!MethodInfo->LocalInitialized[RegisterNumber]) &&
(Op->Asl.Parent->Asl.ParseOpcode != PARSEOP_OBJECTTYPE))
{
LocalName[strlen (LocalName) -1] = (char) (RegisterNumber + 0x30);
AslError (ASL_ERROR, ASL_MSG_LOCAL_INIT, Op, LocalName);
@ -831,8 +967,11 @@ AnMethodAnalysisWalkBegin (
/*
* Otherwise, this is a reference, check if the Arg
* has been previously initialized.
*
* The only operator that accepts an uninitialized value is ObjectType()
*/
else if (!MethodInfo->ArgInitialized[RegisterNumber])
else if ((!MethodInfo->ArgInitialized[RegisterNumber]) &&
(Op->Asl.Parent->Asl.ParseOpcode != PARSEOP_OBJECTTYPE))
{
AslError (ASL_ERROR, ASL_MSG_ARG_INIT, Op, ArgName);
}

View File

@ -2,7 +2,7 @@
/******************************************************************************
*
* Module Name: aslcodegen - AML code generation
* $Revision: 50 $
* $Revision: 51 $
*
*****************************************************************************/
@ -445,6 +445,13 @@ CgWriteTableHeader (
Child = Child->Asl.Next;
TableHeader.Revision = (UINT8) Child->Asl.Value.Integer;
/* Command-line Revision override */
if (Gbl_RevisionOverride)
{
TableHeader.Revision = Gbl_RevisionOverride;
}
/* OEMID */
Child = Child->Asl.Next;

View File

@ -2,7 +2,7 @@
/******************************************************************************
*
* Module Name: aslcompiler.h - common include file
* $Revision: 129 $
* $Revision: 130 $
*
*****************************************************************************/
@ -581,11 +581,6 @@ void
TrDoDefinitionBlock (
ACPI_PARSE_OBJECT *Op);
void
TrDoElseif (
ACPI_PARSE_OBJECT *Op);
/*
* asltree - parse tree support
*/

View File

@ -207,6 +207,7 @@ NamePathTail [.]{NameSeg}
"Device" { count (2); return (PARSEOP_DEVICE); }
"Event" { count (2); return (PARSEOP_EVENT); }
"Field" { count (2); return (PARSEOP_FIELD); }
"Function" { count (2); return (PARSEOP_FUNCTION); }
"IndexField" { count (2); return (PARSEOP_INDEXFIELD); }
"Method" { count (2); return (PARSEOP_METHOD); }
"Mutex" { count (2); return (PARSEOP_MUTEX); }
@ -279,6 +280,7 @@ NamePathTail [.]{NameSeg}
"SizeOf" { count (3); return (PARSEOP_SIZEOF); }
"Store" { count (3); return (PARSEOP_STORE); }
"Subtract" { count (3); return (PARSEOP_SUBTRACT); }
"Timer" { count (3); return (PARSEOP_TIMER); }
"ToBCD" { count (3); return (PARSEOP_TOBCD); }
"ToBuffer" { count (3); return (PARSEOP_TOBUFFER); }
"ToDecimalString" { count (3); return (PARSEOP_TODECIMALSTRING); }
@ -313,11 +315,16 @@ NamePathTail [.]{NameSeg}
"EISAID" { count (1); return (PARSEOP_EISAID); }
"ResourceTemplate" { count (1); return (PARSEOP_RESOURCETEMPLATE); }
"ToUUID" { count (1); return (PARSEOP_TOUUID); }
"Unicode" { count (1); return (PARSEOP_UNICODE); }
"DMA" { count (1); return (PARSEOP_DMA); }
"DWordIO" { count (1); return (PARSEOP_DWORDIO); }
"DWordMemory" { count (1); return (PARSEOP_DWORDMEMORY); }
"DWordSpace" { count (1); return (PARSEOP_DWORDSPACE); }
"EndDependentFn" { count (1); return (PARSEOP_ENDDEPENDENTFN); }
"ExtendedIO" { count (1); return (PARSEOP_EXTENDEDIO); }
"ExtendedMemory" { count (1); return (PARSEOP_EXTENDEDMEMORY); }
"ExtendedSpace" { count (1); return (PARSEOP_EXTENDEDSPACE); }
"FixedIO" { count (1); return (PARSEOP_FIXEDIO); }
"Interrupt" { count (1); return (PARSEOP_INTERRUPT); }
"IO" { count (1); return (PARSEOP_IO); }
@ -328,6 +335,7 @@ NamePathTail [.]{NameSeg}
"Memory32" { count (1); return (PARSEOP_MEMORY32); }
"QWordIO" { count (1); return (PARSEOP_QWORDIO); }
"QWordMemory" { count (1); return (PARSEOP_QWORDMEMORY); }
"QWordSpace" { count (1); return (PARSEOP_QWORDSPACE); }
"Register" { count (1); return (PARSEOP_REGISTER); }
"StartDependentFn" { count (1); return (PARSEOP_STARTDEPENDENTFN); }
"StartDependentFnNoPri" { count (1); return (PARSEOP_STARTDEPENDENTFN_NOPRI); }
@ -335,6 +343,7 @@ NamePathTail [.]{NameSeg}
"VendorShort" { count (1); return (PARSEOP_VENDORSHORT); }
"WordBusNumber" { count (1); return (PARSEOP_WORDBUSNUMBER); }
"WordIO" { count (1); return (PARSEOP_WORDIO); }
"WordSpace" { count (1); return (PARSEOP_WORDSPACE); }
"UnknownObj" { count (0); return (PARSEOP_OBJECTTYPE_UNK); }
"IntObj" { count (0); return (PARSEOP_OBJECTTYPE_INT); }
@ -886,14 +895,9 @@ comment2 (void)
if (c == EOF)
{
/*
* Premature End-Of-File
*/
AslCommonError (ASL_ERROR, ASL_MSG_EARLY_EOF,
Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
Gbl_CurrentLineOffset, Gbl_CurrentColumn,
Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
return (FALSE);
/* End of file is OK, change to newline. Let parser detect EOF later */
c = '\n';
}
InsertLineBuffer (c);

View File

@ -250,12 +250,16 @@ AslLocalAllocate (unsigned int Size);
%token <i> PARSEOP_DWORDCONST
%token <i> PARSEOP_DWORDIO
%token <i> PARSEOP_DWORDMEMORY
%token <i> PARSEOP_DWORDSPACE
%token <i> PARSEOP_EISAID
%token <i> PARSEOP_ELSE
%token <i> PARSEOP_ELSEIF
%token <i> PARSEOP_ENDDEPENDENTFN
%token <i> PARSEOP_ERRORNODE
%token <i> PARSEOP_EVENT
%token <i> PARSEOP_EXTENDEDIO
%token <i> PARSEOP_EXTENDEDMEMORY
%token <i> PARSEOP_EXTENDEDSPACE
%token <i> PARSEOP_EXTERNAL
%token <i> PARSEOP_FATAL
%token <i> PARSEOP_FIELD
@ -263,6 +267,7 @@ AslLocalAllocate (unsigned int Size);
%token <i> PARSEOP_FINDSETRIGHTBIT
%token <i> PARSEOP_FIXEDIO
%token <i> PARSEOP_FROMBCD
%token <i> PARSEOP_FUNCTION
%token <i> PARSEOP_IF
%token <i> PARSEOP_INCLUDE
%token <i> PARSEOP_INCLUDE_CSTYLE
@ -363,6 +368,7 @@ AslLocalAllocate (unsigned int Size);
%token <i> PARSEOP_QWORDCONST
%token <i> PARSEOP_QWORDIO
%token <i> PARSEOP_QWORDMEMORY
%token <i> PARSEOP_QWORDSPACE
%token <i> PARSEOP_RANGETYPE_ENTIRE
%token <i> PARSEOP_RANGETYPE_ISAONLY
%token <i> PARSEOP_RANGETYPE_NONISAONLY
@ -404,12 +410,14 @@ AslLocalAllocate (unsigned int Size);
%token <i> PARSEOP_SUBTRACT
%token <i> PARSEOP_SWITCH
%token <i> PARSEOP_THERMALZONE
%token <i> PARSEOP_TIMER
%token <i> PARSEOP_TOBCD
%token <i> PARSEOP_TOBUFFER
%token <i> PARSEOP_TODECIMALSTRING
%token <i> PARSEOP_TOHEXSTRING
%token <i> PARSEOP_TOINTEGER
%token <i> PARSEOP_TOSTRING
%token <i> PARSEOP_TOUUID
%token <i> PARSEOP_TRANSLATIONTYPE_DENSE
%token <i> PARSEOP_TRANSLATIONTYPE_SPARSE
%token <i> PARSEOP_TYPE_STATIC
@ -427,6 +435,7 @@ AslLocalAllocate (unsigned int Size);
%token <i> PARSEOP_WORDBUSNUMBER
%token <i> PARSEOP_WORDCONST
%token <i> PARSEOP_WORDIO
%token <i> PARSEOP_WORDSPACE
%token <i> PARSEOP_XFERTYPE_8
%token <i> PARSEOP_XFERTYPE_8_16
%token <i> PARSEOP_XFERTYPE_16
@ -460,6 +469,10 @@ AslLocalAllocate (unsigned int Size);
%type <n> RequiredTarget
%type <n> SimpleTarget
%type <n> BufferTermData
%type <n> ParameterTypePackage
%type <n> ParameterTypePackageList
%type <n> ParameterTypesPackage
%type <n> ParameterTypesPackageList
%type <n> Type1Opcode
%type <n> Type2Opcode
@ -502,6 +515,7 @@ AslLocalAllocate (unsigned int Size);
%type <n> DeviceTerm
%type <n> EventTerm
%type <n> FieldTerm
%type <n> FunctionTerm
%type <n> IndexFieldTerm
%type <n> MethodTerm
%type <n> MutexTerm
@ -586,6 +600,7 @@ AslLocalAllocate (unsigned int Size);
%type <n> SizeOfTerm
%type <n> StoreTerm
%type <n> SubtractTerm
%type <n> TimerTerm
%type <n> ToBCDTerm
%type <n> ToBufferTerm
%type <n> ToDecimalStringTerm
@ -671,9 +686,11 @@ AslLocalAllocate (unsigned int Size);
%type <n> VarPackageLengthTerm
/* Macros */
%type <n> EISAIDTerm
%type <n> ResourceTemplateTerm
%type <n> ToUUIDTerm
%type <n> UnicodeTerm
%type <n> ResourceMacroList
%type <n> ResourceMacroTerm
@ -681,7 +698,11 @@ AslLocalAllocate (unsigned int Size);
%type <n> DMATerm
%type <n> DWordIOTerm
%type <n> DWordMemoryTerm
%type <n> DWordSpaceTerm
%type <n> EndDependentFnTerm
%type <n> ExtendedIOTerm
%type <n> ExtendedMemoryTerm
%type <n> ExtendedSpaceTerm
%type <n> FixedIOTerm
%type <n> InterruptTerm
%type <n> IOTerm
@ -692,6 +713,7 @@ AslLocalAllocate (unsigned int Size);
%type <n> Memory32Term
%type <n> QWordIOTerm
%type <n> QWordMemoryTerm
%type <n> QWordSpaceTerm
%type <n> RegisterTerm
%type <n> StartDependentFnTerm
%type <n> StartDependentFnNoPriTerm
@ -699,6 +721,7 @@ AslLocalAllocate (unsigned int Size);
%type <n> VendorShortTerm
%type <n> WordBusNumberTerm
%type <n> WordIOTerm
%type <n> WordSpaceTerm
%type <n> NameString
%type <n> NameSeg
@ -710,8 +733,10 @@ AslLocalAllocate (unsigned int Size);
%type <n> AmlPackageLengthTerm
%type <n> OptionalByteConstExpr
%type <n> OptionalDWordConstExpr
%type <n> OptionalQWordConstExpr
%type <n> OptionalSerializeRuleKeyword
%type <n> OptionalResourceType_First
%type <n> OptionalResourceType
%type <n> OptionalMinType
%type <n> OptionalMaxType
%type <n> OptionalMemType
@ -728,6 +753,8 @@ AslLocalAllocate (unsigned int Size);
%type <n> OptionalNameString_Last
%type <n> OptionalAddressRange
%type <n> OptionalObjectTypeKeyword
%type <n> OptionalParameterTypePackage
%type <n> OptionalParameterTypesPackage
%type <n> OptionalReference
@ -769,9 +796,12 @@ DefinitionBlockTerm
'{' ObjectList '}' {$$ = TrLinkChildren ($<n>3,7,$4,$6,$8,$10,$12,$14,$18);}
;
/* ACPI 3.0 -- allow semicolons between terms */
TermList
: {$$ = NULL;}
| Term TermList {$$ = TrLinkPeerNode (TrSetNodeFlags ($1, NODE_RESULT_NOT_USED),$2);}
| Term ';' TermList {$$ = TrLinkPeerNode (TrSetNodeFlags ($1, NODE_RESULT_NOT_USED),$3);}
;
Term
@ -846,6 +876,7 @@ NamedObject
| DeviceTerm {}
| EventTerm {}
| FieldTerm {}
| FunctionTerm {}
| IndexFieldTerm {}
| MethodTerm {}
| MutexTerm {}
@ -905,6 +936,52 @@ SimpleTarget
| ArgTerm {}
;
/* Rules for specifying the Return type for control methods */
ParameterTypePackageList
: {$$ = NULL;}
| ObjectTypeKeyword {$$ = $1;}
| ObjectTypeKeyword ','
ParameterTypePackageList {$$ = TrLinkPeerNodes (2,$1,$3);}
;
ParameterTypePackage
: {$$ = NULL;}
| ObjectTypeKeyword {$$ = $1;}
| '{'
ParameterTypePackageList
'}' {$$ = $2;}
;
OptionalParameterTypePackage
: {$$ = TrCreateLeafNode (PARSEOP_DEFAULT_ARG);}
| ',' {$$ = TrCreateLeafNode (PARSEOP_DEFAULT_ARG);}
| ',' ParameterTypePackage {$$ = TrLinkChildren (TrCreateLeafNode (PARSEOP_DEFAULT_ARG),1,$2);}
;
/* Rules for specifying the Argument types for control methods */
ParameterTypesPackageList
: {$$ = NULL;}
| ObjectTypeKeyword {$$ = $1;}
| ObjectTypeKeyword ','
ParameterTypesPackage {$$ = TrLinkPeerNodes (2,$1,$3);}
;
ParameterTypesPackage
: {$$ = NULL;}
| ObjectTypeKeyword {$$ = $1;}
| '{'
ParameterTypesPackageList
'}' {$$ = TrLinkChildren (TrCreateLeafNode (PARSEOP_DEFAULT_ARG),1,$2);}
;
OptionalParameterTypesPackage
: {$$ = TrCreateLeafNode (PARSEOP_DEFAULT_ARG);}
| ',' {$$ = TrCreateLeafNode (PARSEOP_DEFAULT_ARG);}
| ',' ParameterTypesPackage {$$ = $2;}
;
/* Opcode types */
@ -937,12 +1014,13 @@ Type2Opcode
| RefOfTerm {}
| SizeOfTerm {}
| StoreTerm {}
| TimerTerm {}
| WaitTerm {}
| UserTerm {}
;
/*
* A type 2 opcode evaluates to an Integer and cannot have a destination operand
* Type 3/4/5 opcodes
*/
Type2IntegerOpcode /* "Type3" opcodes */
@ -980,7 +1058,6 @@ Type2IntegerOpcode /* "Type3" opcodes */
| XOrTerm {}
;
Type2StringOpcode /* "Type4" Opcodes */
: ToDecimalStringTerm {}
| ToHexStringTerm {}
@ -1019,6 +1096,7 @@ Type4Opcode
Type5Opcode
: ResourceTemplateTerm {}
| UnicodeTerm {}
| ToUUIDTerm {}
;
Type6Opcode
@ -1053,7 +1131,9 @@ ExternalTerm
: PARSEOP_EXTERNAL '('
NameString
OptionalObjectTypeKeyword
')' {$$ = TrCreateNode (PARSEOP_EXTERNAL,2,$3,$4);}
OptionalParameterTypePackage
OptionalParameterTypesPackage
')' {$$ = TrCreateNode (PARSEOP_EXTERNAL,4,$3,$4,$5,$6);}
| PARSEOP_EXTERNAL '('
error ')' {$$ = AslDoError(); yyclearin;}
;
@ -1219,6 +1299,20 @@ FieldTerm
error ')' {$$ = AslDoError(); yyclearin;}
;
FunctionTerm
: PARSEOP_FUNCTION '(' {$$ = TrCreateLeafNode (PARSEOP_METHOD);}
NameString
OptionalParameterTypePackage
OptionalParameterTypesPackage
')' '{'
TermList '}' {$$ = TrLinkChildren ($<n>3,7,TrSetNodeFlags ($4, NODE_IS_NAME_DECLARATION),
TrCreateValuedLeafNode (PARSEOP_BYTECONST, 0),
TrCreateLeafNode (PARSEOP_SERIALIZERULE_NOTSERIAL),
TrCreateValuedLeafNode (PARSEOP_BYTECONST, 0),$5,$6,$9);}
| PARSEOP_FUNCTION '('
error ')' {$$ = AslDoError(); yyclearin;}
;
IndexFieldTerm
: PARSEOP_INDEXFIELD '(' {$$ = TrCreateLeafNode (PARSEOP_INDEXFIELD);}
NameString
@ -1238,8 +1332,10 @@ MethodTerm
OptionalByteConstExpr {$$ = UtCheckIntegerRange ($5, 0, 7);}
OptionalSerializeRuleKeyword
OptionalByteConstExpr
OptionalParameterTypePackage
OptionalParameterTypesPackage
')' '{'
TermList '}' {$$ = TrLinkChildren ($<n>3,5,TrSetNodeFlags ($4, NODE_IS_NAME_DECLARATION),$5,$7,$8,$11);}
TermList '}' {$$ = TrLinkChildren ($<n>3,7,TrSetNodeFlags ($4, NODE_IS_NAME_DECLARATION),$5,$7,$8,$9,$10,$13);}
| PARSEOP_METHOD '('
error ')' {$$ = AslDoError(); yyclearin;}
;
@ -1377,13 +1473,15 @@ ElseTerm
| PARSEOP_ELSE '{' {$$ = TrCreateLeafNode (PARSEOP_ELSE);}
TermList '}'
{$$ = TrLinkChildren ($<n>3,1,$4);}
| PARSEOP_ELSE '{'
error '}' {$$ = AslDoError(); yyclearin;}
| PARSEOP_ELSEIF '(' {$$ = TrCreateLeafNode (PARSEOP_ELSEIF);}
TermArg
| PARSEOP_ELSEIF '(' {$$ = TrCreateLeafNode (PARSEOP_ELSE);}
TermArg {$$ = TrCreateLeafNode (PARSEOP_IF);}
')' '{'
TermList '}'
ElseTerm {$$ = TrLinkChildren ($<n>3,3,$4,$7,$9);}
TermList '}' {$$ = TrLinkChildren ($<n>5,2,$4,$8);}
ElseTerm {$$ = TrLinkPeerNode ($<n>5,$11);}
{$$ = TrLinkChildren ($<n>3,1,$<n>5);}
| PARSEOP_ELSEIF '('
error ')' {$$ = AslDoError(); yyclearin;}
;
@ -1430,6 +1528,7 @@ ReturnTerm
: PARSEOP_RETURN '(' {$$ = TrCreateLeafNode (PARSEOP_RETURN);}
OptionalTermArg
')' {$$ = TrLinkChildren ($<n>3,1,$4);}
| PARSEOP_RETURN {$$ = TrLinkChildren (TrCreateLeafNode (PARSEOP_RETURN),0);}
| PARSEOP_RETURN '('
error ')' {$$ = AslDoError(); yyclearin;}
;
@ -1496,8 +1595,8 @@ CaseTerm
DefaultTerm
: PARSEOP_DEFAULT '{' {$$ = TrCreateLeafNode (PARSEOP_DEFAULT);}
TermList '}' {$$ = TrLinkChildren ($<n>3,1,$4);}
| PARSEOP_DEFAULT '('
error ')' {$$ = AslDoError(); yyclearin;}
| PARSEOP_DEFAULT '{'
error '}' {$$ = AslDoError(); yyclearin;}
;
UnloadTerm
@ -1902,6 +2001,14 @@ SubtractTerm
error ')' {$$ = AslDoError(); yyclearin;}
;
TimerTerm
: PARSEOP_TIMER '(' {$$ = TrCreateLeafNode (PARSEOP_TIMER);}
')' {$$ = TrLinkChildren ($<n>3,0);}
| PARSEOP_TIMER {$$ = TrLinkChildren (TrCreateLeafNode (PARSEOP_TIMER),0);}
| PARSEOP_TIMER '('
error ')' {$$ = AslDoError(); yyclearin;}
;
ToBCDTerm
: PARSEOP_TOBCD '(' {$$ = TrCreateLeafNode (PARSEOP_TOBCD);}
TermArg
@ -1957,6 +2064,13 @@ ToStringTerm
error ')' {$$ = AslDoError(); yyclearin;}
;
ToUUIDTerm
: PARSEOP_TOUUID '('
StringData ')' {$$ = TrUpdateNode (PARSEOP_TOUUID, $3);}
| PARSEOP_TOUUID '('
error ')' {$$ = AslDoError(); yyclearin;}
;
WaitTerm
: PARSEOP_WAIT '(' {$$ = TrCreateLeafNode (PARSEOP_WAIT);}
SuperName
@ -2381,7 +2495,11 @@ ResourceMacroTerm
: DMATerm {}
| DWordIOTerm {}
| DWordMemoryTerm {}
| DWordSpaceTerm {}
| EndDependentFnTerm {}
| ExtendedIOTerm {}
| ExtendedMemoryTerm {}
| ExtendedSpaceTerm {}
| FixedIOTerm {}
| InterruptTerm {}
| IOTerm {}
@ -2392,6 +2510,7 @@ ResourceMacroTerm
| Memory32Term {}
| QWordIOTerm {}
| QWordMemoryTerm {}
| QWordSpaceTerm {}
| RegisterTerm {}
| StartDependentFnTerm {}
| StartDependentFnNoPriTerm {}
@ -2399,6 +2518,7 @@ ResourceMacroTerm
| VendorShortTerm {}
| WordBusNumberTerm {}
| WordIOTerm {}
| WordSpaceTerm {}
;
DMATerm
@ -2458,6 +2578,28 @@ DWordMemoryTerm
error ')' {$$ = AslDoError(); yyclearin;}
;
DWordSpaceTerm
: PARSEOP_DWORDSPACE '(' {$$ = TrCreateLeafNode (PARSEOP_DWORDSPACE);}
ByteConstExpr {$$ = UtCheckIntegerRange ($4, 0xC0, 0xFF);}
OptionalResourceType
OptionalDecodeType
OptionalMinType
OptionalMaxType
',' ByteConstExpr
',' DWordConstExpr
',' DWordConstExpr
',' DWordConstExpr
',' DWordConstExpr
',' DWordConstExpr
OptionalByteConstExpr
OptionalStringData
OptionalNameString_Last
')' {$$ = TrLinkChildren ($<n>3,14,$4,$6,$7,$8,$9,$11,$13,$15,$17,$19,$21,$22,$23,$24);}
| PARSEOP_DWORDSPACE '('
error ')' {$$ = AslDoError(); yyclearin;}
;
EndDependentFnTerm
: PARSEOP_ENDDEPENDENTFN '('
')' {$$ = TrCreateLeafNode (PARSEOP_ENDDEPENDENTFN);}
@ -2465,6 +2607,69 @@ EndDependentFnTerm
error ')' {$$ = AslDoError(); yyclearin;}
;
ExtendedIOTerm
: PARSEOP_EXTENDEDIO '(' {$$ = TrCreateLeafNode (PARSEOP_EXTENDEDIO);}
OptionalResourceType_First
OptionalMinType
OptionalMaxType
OptionalDecodeType
OptionalRangeType
',' QWordConstExpr
',' QWordConstExpr
',' QWordConstExpr
',' QWordConstExpr
',' QWordConstExpr
OptionalQWordConstExpr
OptionalNameString
OptionalType
OptionalTranslationType_Last
')' {$$ = TrLinkChildren ($<n>3,14,$4,$5,$6,$7,$8,$10,$12,$14,$16,$18,$19,$20,$21,$22);}
| PARSEOP_EXTENDEDIO '('
error ')' {$$ = AslDoError(); yyclearin;}
;
ExtendedMemoryTerm
: PARSEOP_EXTENDEDMEMORY '(' {$$ = TrCreateLeafNode (PARSEOP_EXTENDEDMEMORY);}
OptionalResourceType_First
OptionalDecodeType
OptionalMinType
OptionalMaxType
OptionalMemType
',' ReadWriteKeyword
',' QWordConstExpr
',' QWordConstExpr
',' QWordConstExpr
',' QWordConstExpr
',' QWordConstExpr
OptionalQWordConstExpr
OptionalNameString
OptionalAddressRange
OptionalType_Last
')' {$$ = TrLinkChildren ($<n>3,15,$4,$5,$6,$7,$8,$10,$12,$14,$16,$18,$20,$21,$22,$23,$24);}
| PARSEOP_EXTENDEDMEMORY '('
error ')' {$$ = AslDoError(); yyclearin;}
;
ExtendedSpaceTerm
: PARSEOP_EXTENDEDSPACE '(' {$$ = TrCreateLeafNode (PARSEOP_EXTENDEDSPACE);}
ByteConstExpr {$$ = UtCheckIntegerRange ($4, 0xC0, 0xFF);}
OptionalResourceType
OptionalDecodeType
OptionalMinType
OptionalMaxType
',' ByteConstExpr
',' QWordConstExpr
',' QWordConstExpr
',' QWordConstExpr
',' QWordConstExpr
',' QWordConstExpr
OptionalQWordConstExpr
OptionalNameString_Last
')' {$$ = TrLinkChildren ($<n>3,13,$4,$6,$7,$8,$9,$11,$13,$15,$17,$19,$21,$22,$23);}
| PARSEOP_EXTENDEDSPACE '('
error ')' {$$ = AslDoError(); yyclearin;}
;
FixedIOTerm
: PARSEOP_FIXEDIO '(' {$$ = TrCreateLeafNode (PARSEOP_FIXEDIO);}
WordConstExpr
@ -2606,6 +2811,27 @@ QWordMemoryTerm
error ')' {$$ = AslDoError(); yyclearin;}
;
QWordSpaceTerm
: PARSEOP_QWORDSPACE '(' {$$ = TrCreateLeafNode (PARSEOP_QWORDSPACE);}
ByteConstExpr {$$ = UtCheckIntegerRange ($4, 0xC0, 0xFF);}
OptionalResourceType
OptionalDecodeType
OptionalMinType
OptionalMaxType
',' ByteConstExpr
',' QWordConstExpr
',' QWordConstExpr
',' QWordConstExpr
',' QWordConstExpr
',' QWordConstExpr
OptionalByteConstExpr
OptionalStringData
OptionalNameString_Last
')' {$$ = TrLinkChildren ($<n>3,14,$4,$6,$7,$8,$9,$11,$13,$15,$17,$19,$21,$22,$23,$24);}
| PARSEOP_QWORDSPACE '('
error ')' {$$ = AslDoError(); yyclearin;}
;
RegisterTerm
: PARSEOP_REGISTER '(' {$$ = TrCreateLeafNode (PARSEOP_REGISTER);}
AddressSpaceKeyword
@ -2694,6 +2920,27 @@ WordIOTerm
error ')' {$$ = AslDoError(); yyclearin;}
;
WordSpaceTerm
: PARSEOP_WORDSPACE '(' {$$ = TrCreateLeafNode (PARSEOP_WORDSPACE);}
ByteConstExpr {$$ = UtCheckIntegerRange ($4, 0xC0, 0xFF);}
OptionalResourceType
OptionalDecodeType
OptionalMinType
OptionalMaxType
',' ByteConstExpr
',' WordConstExpr
',' WordConstExpr
',' WordConstExpr
',' WordConstExpr
',' WordConstExpr
OptionalByteConstExpr
OptionalStringData
OptionalNameString_Last
')' {$$ = TrLinkChildren ($<n>3,14,$4,$6,$7,$8,$9,$11,$13,$15,$17,$19,$21,$22,$23,$24);}
| PARSEOP_WORDSPACE '('
error ')' {$$ = AslDoError(); yyclearin;}
;
/******* Object References ***********************************************/
@ -2788,6 +3035,12 @@ OptionalObjectTypeKeyword
| ',' ObjectTypeKeyword {$$ = $2;}
;
OptionalQWordConstExpr
: {$$ = NULL;}
| ',' {$$ = NULL;}
| ',' QWordConstExpr {$$ = $2;}
;
OptionalRangeType
: ',' {$$ = NULL;}
| ',' RangeTypeKeyword {$$ = $2;}
@ -2805,6 +3058,12 @@ OptionalResourceType_First
| ResourceTypeKeyword {$$ = $1;}
;
OptionalResourceType
: {$$ = NULL;}
| ',' {$$ = NULL;}
| ',' ResourceTypeKeyword {$$ = $2;}
;
OptionalSerializeRuleKeyword
: {$$ = NULL;}
| ',' {$$ = NULL;}

View File

@ -3,7 +3,7 @@
/******************************************************************************
*
* Module Name: aslglobal.h - Global variable definitions
* $Revision: 43 $
* $Revision: 44 $
*
*****************************************************************************/
@ -225,6 +225,7 @@ ASL_EXTERN UINT32 ASL_INIT_GLOBAL (TotalFolds, 0);
/* Misc */
ASL_EXTERN UINT8 ASL_INIT_GLOBAL (Gbl_RevisionOverride, 0);
ASL_EXTERN ACPI_PARSE_OBJECT ASL_INIT_GLOBAL (*RootNode, NULL);
ASL_EXTERN UINT32 ASL_INIT_GLOBAL (Gbl_TableLength, 0);
ASL_EXTERN UINT32 ASL_INIT_GLOBAL (Gbl_SourceLine, 0);

View File

@ -2,7 +2,7 @@
/******************************************************************************
*
* Module Name: aslmain - compiler main and utilities
* $Revision: 76 $
* $Revision: 77 $
*
*****************************************************************************/
@ -161,16 +161,17 @@ Options (
printf (" -vr Disable remarks\n");
printf (" -vs Disable signon\n");
printf ("\nAML Output:\n");
printf ("\nAML Output Files:\n");
printf (" -s<a|c> Create AML in assembler or C source file (*.asm or *.c)\n");
printf (" -i<a|c> Create assembler or C include file (*.inc or *.h)\n");
printf (" -t<a|c> Create AML in assembler or C hex table (*.hex)\n");
printf ("\nAML Optimization:\n");
printf ("\nAML Code Generation:\n");
printf (" -oa Disable all optimizations (compatibility mode)\n");
printf (" -of Disable constant folding\n");
printf (" -oi Disable integer optimization to Zero/One/Ones\n");
printf (" -on Disable named reference string optimization\n");
printf (" -r<Revision> Override table header Revision (1-255)\n");
printf ("\nListings:\n");
printf (" -l Create mixed listing file (ASL source and AML) (*.lst)\n");
@ -321,8 +322,13 @@ AslCommandLine (
/* Get the command line options */
while ((j = AcpiGetopt (argc, argv, "b:cd^efgh^i^l^o:p:rs:t:v:x:")) != EOF) switch (j)
while ((j = AcpiGetopt (argc, argv, "ab:cd^efgh^i^l^o:p:r:s:t:v:x:")) != EOF) switch (j)
{
case 'a':
AslToFile = FALSE;
break;
case 'b':
switch (AcpiGbl_Optarg[0])
@ -544,7 +550,7 @@ AslCommandLine (
case 'r':
AslToFile = FALSE;
Gbl_RevisionOverride = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0);
break;

View File

@ -2,7 +2,7 @@
/******************************************************************************
*
* Module Name: aslmap - parser to AML opcode mapping table
* $Revision: 71 $
* $Revision: 76 $
*
*****************************************************************************/
@ -209,7 +209,12 @@ const ASL_RESERVED_INFO ReservedMethods[] = {
{"_AL7", 0, ASL_RSVD_RETURN_VALUE},
{"_AL8", 0, ASL_RSVD_RETURN_VALUE},
{"_AL9", 0, ASL_RSVD_RETURN_VALUE},
{"_ALC", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_ALI", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_ALN", 0, ASL_RSVD_RESOURCE_NAME},
{"_ALP", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_ALR", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_ALT", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_ASI", 0, ASL_RSVD_RESOURCE_NAME},
{"_BAS", 0, ASL_RSVD_RESOURCE_NAME},
{"_BBN", 0, ASL_RSVD_RETURN_VALUE},
@ -218,12 +223,19 @@ const ASL_RESERVED_INFO ReservedMethods[] = {
{"_BDN", 0, ASL_RSVD_RETURN_VALUE},
{"_BFS", 1, 0},
{"_BIF", 0, ASL_RSVD_RETURN_VALUE},
{"_BLT", 3, 0}, /* Acpi 3.0 */
{"_BM_", 0, ASL_RSVD_RESOURCE_NAME},
{"_BMC", 1, 0}, /* Acpi 3.0 */
{"_BMD", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_BQC", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_BST", 0, ASL_RSVD_RETURN_VALUE},
{"_BTM", 1, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_BTP", 1, 0},
{"_CBA", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_CID", 0, ASL_RSVD_RETURN_VALUE},
{"_CRS", 0, ASL_RSVD_RETURN_VALUE},
{"_CRT", 0, ASL_RSVD_RETURN_VALUE},
{"_CSD", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_CST", 0, ASL_RSVD_RETURN_VALUE},
{"_DCK", 1, ASL_RSVD_RETURN_VALUE},
{"_DCS", 0, ASL_RSVD_RETURN_VALUE},
@ -235,7 +247,9 @@ const ASL_RESERVED_INFO ReservedMethods[] = {
{"_DMA", 0, ASL_RSVD_RETURN_VALUE},
{"_DOD", 0, ASL_RSVD_RETURN_VALUE},
{"_DOS", 1, 0},
{"_DSM", 4, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_DSS", 1, 0},
{"_DSW", 3, 0}, /* Acpi 3.0 */
{"_EC_", 0, ASL_RSVD_RETURN_VALUE},
{"_EDL", 0, ASL_RSVD_RETURN_VALUE},
{"_EJ0", 1, 0},
@ -244,6 +258,7 @@ const ASL_RESERVED_INFO ReservedMethods[] = {
{"_EJ3", 1, 0},
{"_EJ4", 1, 0},
{"_EJD", 0, ASL_RSVD_RETURN_VALUE},
{"_ERR", 2, ASL_RSVD_RETURN_VALUE},
{"_FDE", 0, ASL_RSVD_RETURN_VALUE},
{"_FDI", 0, ASL_RSVD_RETURN_VALUE},
{"_FDM", 1, 0},
@ -253,6 +268,7 @@ const ASL_RESERVED_INFO ReservedMethods[] = {
{"_GPD", 0, ASL_RSVD_RETURN_VALUE},
{"_GPE", 0, ASL_RSVD_RETURN_VALUE},
{"_GRA", 0, ASL_RSVD_RESOURCE_NAME},
{"_GSB", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_GTF", 0, ASL_RSVD_RETURN_VALUE},
{"_GTM", 0, ASL_RSVD_RETURN_VALUE},
{"_GTS", 1, 0},
@ -260,6 +276,8 @@ const ASL_RESERVED_INFO ReservedMethods[] = {
{"_HID", 0, ASL_RSVD_RETURN_VALUE},
{"_HOT", 0, ASL_RSVD_RETURN_VALUE},
{"_HPP", 0, ASL_RSVD_RETURN_VALUE},
{"_HPX", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_IFT", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_INI", 0, 0},
{"_INT", 0, ASL_RSVD_RESOURCE_NAME},
{"_IRC", 0, 0},
@ -273,16 +291,21 @@ const ASL_RESERVED_INFO ReservedMethods[] = {
{"_MEM", 0, ASL_RSVD_RESOURCE_NAME},
{"_MIF", 0, ASL_RSVD_RESOURCE_NAME},
{"_MIN", 0, ASL_RSVD_RESOURCE_NAME},
{"_MLS", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_MSG", 1, 0},
{"_OFF", 0, 0},
{"_ON_", 0, 0},
{"_OS_", 0, ASL_RSVD_RETURN_VALUE},
{"_OSC", 4, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_OSI", 1, ASL_RSVD_RETURN_VALUE},
{"_OST", 3, 0}, /* Acpi 3.0 */
{"_PCL", 0, ASL_RSVD_RETURN_VALUE},
{"_PCT", 0, ASL_RSVD_RETURN_VALUE},
{"_PDC", 1, 0},
{"_PIC", 1, 0},
{"_PLD", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_PPC", 0, ASL_RSVD_RETURN_VALUE},
{"_PPE", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_PR0", 0, ASL_RSVD_RETURN_VALUE},
{"_PR1", 0, ASL_RSVD_RETURN_VALUE},
{"_PR2", 0, ASL_RSVD_RETURN_VALUE},
@ -294,6 +317,7 @@ const ASL_RESERVED_INFO ReservedMethods[] = {
{"_PS2", 0, 0},
{"_PS3", 0, 0},
{"_PSC", 0, ASL_RSVD_RETURN_VALUE},
{"_PSD", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_PSL", 0, ASL_RSVD_RETURN_VALUE},
{"_PSR", 0, ASL_RSVD_RETURN_VALUE},
{"_PSS", 0, ASL_RSVD_RETURN_VALUE},
@ -309,6 +333,8 @@ const ASL_RESERVED_INFO ReservedMethods[] = {
{"_RMV", 0, ASL_RSVD_RETURN_VALUE},
{"_RNG", 0, ASL_RSVD_RESOURCE_NAME},
{"_ROM", 2, ASL_RSVD_RETURN_VALUE},
{"_RT_", 0, ASL_RSVD_RESOURCE_NAME}, /* Acpi 3.0 */
{"_RTV", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_RW_", 0, ASL_RSVD_RESOURCE_NAME},
{"_S0_", 0, ASL_RSVD_RETURN_VALUE},
{"_S1_", 0, ASL_RSVD_RETURN_VALUE},
@ -320,32 +346,53 @@ const ASL_RESERVED_INFO ReservedMethods[] = {
{"_S2D", 0, ASL_RSVD_RETURN_VALUE},
{"_S3D", 0, ASL_RSVD_RETURN_VALUE},
{"_S4D", 0, ASL_RSVD_RETURN_VALUE},
{"_S0W", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_S1W", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_S2W", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_S3W", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_S4W", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_SB_", 0, ASL_RSVD_SCOPE},
{"_SBS", 0, ASL_RSVD_RETURN_VALUE},
{"_SCP", 1, 0},
{"_SDD", 1, 0}, /* Acpi 3.0 */
{"_SEG", 0, ASL_RSVD_RETURN_VALUE},
{"_SHR", 0, ASL_RSVD_RESOURCE_NAME},
{"_SI_", 0, ASL_RSVD_SCOPE},
{"_SIZ", 0, ASL_RSVD_RESOURCE_NAME},
{"_SLI", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_SPD", 1, ASL_RSVD_RETURN_VALUE},
{"_SRS", 1, 0},
{"_SRV", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_SST", 1, 0},
{"_STA", 0, ASL_RSVD_RETURN_VALUE},
{"_STM", 3, 0},
{"_STR", 0, ASL_RSVD_RETURN_VALUE},
{"_SUN", 0, ASL_RSVD_RETURN_VALUE},
{"_SWS", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_TC1", 0, ASL_RSVD_RETURN_VALUE},
{"_TC2", 0, ASL_RSVD_RETURN_VALUE},
{"_TMP", 0, ASL_RSVD_RETURN_VALUE},
{"_TPC", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_TPT", 1, 0}, /* Acpi 3.0 */
{"_TRA", 0, ASL_RSVD_RESOURCE_NAME},
{"_TRS", 0, ASL_RSVD_RESOURCE_NAME},
{"_TRT", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_TSD", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_TSF", 0, ASL_RSVD_RESOURCE_NAME}, /* Acpi 3.0 */
{"_TSP", 0, ASL_RSVD_RETURN_VALUE},
{"_TSS", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_TST", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_TTP", 0, ASL_RSVD_RESOURCE_NAME},
{"_TTS", 1, 0}, /* Acpi 3.0 */
{"_TYP", 0, ASL_RSVD_RESOURCE_NAME},
{"_TZ_", 0, ASL_RSVD_SCOPE},
{"_TZD", 0, ASL_RSVD_RETURN_VALUE},
{"_TZM", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_TZP", 0, ASL_RSVD_RETURN_VALUE},
{"_UID", 0, ASL_RSVD_RETURN_VALUE},
{"_UPC", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_UPD", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_UPP", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
{"_VPO", 0, ASL_RSVD_RETURN_VALUE},
{"_WAK", 1, ASL_RSVD_RETURN_VALUE},
{NULL, 0, 0},
@ -497,12 +544,16 @@ const ASL_MAPPING_ENTRY AslKeywordMapping [] =
/* DWORDCONST */ OP_TABLE_ENTRY (AML_RAW_DATA_DWORD, 0, 0, ACPI_BTYPE_INTEGER),
/* DWORDIO */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
/* DWORDMEMORY */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
/* DWORDSPACE */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
/* EISAID */ OP_TABLE_ENTRY (AML_DWORD_OP, 0, 0, ACPI_BTYPE_INTEGER),
/* ELSE */ OP_TABLE_ENTRY (AML_ELSE_OP, 0, NODE_AML_PACKAGE, 0),
/* ELSEIF */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, NODE_AML_PACKAGE, 0),
/* ENDDEPENDENTFN */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
/* ERRORNODE */ OP_TABLE_ENTRY (AML_NOOP_OP, 0, 0, 0),
/* EVENT */ OP_TABLE_ENTRY (AML_EVENT_OP, 0, 0, 0),
/* EXTENDEDIO */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
/* EXTENDEDMEMORY */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
/* EXTENDEDSPACE */ OP_TABLE_ENTRY (AML_RAW_DATA_QWORD, 0, 0, ACPI_BTYPE_INTEGER),
/* EXTERNAL */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
/* FATAL */ OP_TABLE_ENTRY (AML_FATAL_OP, 0, 0, 0),
/* FIELD */ OP_TABLE_ENTRY (AML_FIELD_OP, 0, NODE_AML_PACKAGE, 0),
@ -510,6 +561,7 @@ const ASL_MAPPING_ENTRY AslKeywordMapping [] =
/* FINDSETRIGHTBIT */ OP_TABLE_ENTRY (AML_FIND_SET_RIGHT_BIT_OP, 0, 0, ACPI_BTYPE_INTEGER),
/* FIXEDIO */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
/* FROMBCD */ OP_TABLE_ENTRY (AML_FROM_BCD_OP, 0, 0, ACPI_BTYPE_INTEGER),
/* FUNCTION */ OP_TABLE_ENTRY (AML_METHOD_OP, 0, NODE_AML_PACKAGE, 0),
/* IF */ OP_TABLE_ENTRY (AML_IF_OP, 0, NODE_AML_PACKAGE, 0),
/* INCLUDE */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
/* INCLUDE_CSTYLE */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
@ -610,6 +662,7 @@ const ASL_MAPPING_ENTRY AslKeywordMapping [] =
/* QWORDCONST */ OP_TABLE_ENTRY (AML_RAW_DATA_QWORD, 0, 0, ACPI_BTYPE_INTEGER),
/* QWORDIO */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
/* QWORDMEMORY */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
/* QWORDSPACE */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
/* RANGE_TYPE_ENTIRE */ OP_TABLE_ENTRY (AML_BYTE_OP, 3, 0, 0),
/* RANGE_TYPE_ISAONLY */ OP_TABLE_ENTRY (AML_BYTE_OP, 2, 0, 0),
/* RANGE_TYPE_NONISAONLY */ OP_TABLE_ENTRY (AML_BYTE_OP, 1, 0, 0),
@ -651,12 +704,14 @@ const ASL_MAPPING_ENTRY AslKeywordMapping [] =
/* SUBTRACT */ OP_TABLE_ENTRY (AML_SUBTRACT_OP, 0, 0, ACPI_BTYPE_INTEGER),
/* SWITCH */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
/* THERMALZONE */ OP_TABLE_ENTRY (AML_THERMAL_ZONE_OP, 0, NODE_AML_PACKAGE, 0),
/* TIMER */ OP_TABLE_ENTRY (AML_TIMER_OP, 0, 0, ACPI_BTYPE_INTEGER),
/* TOBCD */ OP_TABLE_ENTRY (AML_TO_BCD_OP, 0, 0, ACPI_BTYPE_INTEGER),
/* TOBUFFER */ OP_TABLE_ENTRY (AML_TO_BUFFER_OP, 0, 0, ACPI_BTYPE_COMPUTE_DATA),
/* TODECIMALSTRING */ OP_TABLE_ENTRY (AML_TO_DECSTRING_OP, 0, 0, ACPI_BTYPE_STRING),
/* TOHEXSTRING */ OP_TABLE_ENTRY (AML_TO_HEXSTRING_OP, 0, 0, ACPI_BTYPE_STRING),
/* TOINTEGER */ OP_TABLE_ENTRY (AML_TO_INTEGER_OP, 0, 0, ACPI_BTYPE_INTEGER),
/* TOSTRING */ OP_TABLE_ENTRY (AML_TO_STRING_OP, 0, 0, ACPI_BTYPE_STRING),
/* TOUUID */ OP_TABLE_ENTRY (AML_DWORD_OP, 0, NODE_AML_PACKAGE, ACPI_BTYPE_INTEGER),
/* TRANSLATIONTYPE_DENSE */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
/* TRANSLATIONTYPE_SPARSE */ OP_TABLE_ENTRY (AML_BYTE_OP, 1, 0, 0),
/* TYPE_STATIC */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
@ -674,6 +729,7 @@ const ASL_MAPPING_ENTRY AslKeywordMapping [] =
/* WORDBUSNUMBER */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
/* WORDCONST */ OP_TABLE_ENTRY (AML_RAW_DATA_WORD, 0, 0, ACPI_BTYPE_INTEGER),
/* WORDIO */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
/* WORDSPACE */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
/* XFERTYPE_8 */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
/* XFERTYPE_8_16 */ OP_TABLE_ENTRY (AML_BYTE_OP, 1, 0, 0),
/* XFERTYPE_16 */ OP_TABLE_ENTRY (AML_BYTE_OP, 2, 0, 0),

View File

@ -2,7 +2,7 @@
/******************************************************************************
*
* Module Name: aslopcode - AML opcode generation
* $Revision: 55 $
* $Revision: 60 $
*
*****************************************************************************/
@ -206,6 +206,18 @@ OpcSetOptimalIntegerSize (
ACPI_PARSE_OBJECT *Op)
{
/*
TBD: - we don't want to optimize integers in the block header, but the
code below does not work correctly.
if (Op->Asl.Parent &&
Op->Asl.Parent->Asl.Parent &&
(Op->Asl.Parent->Asl.Parent->Asl.ParseOpcode == PARSEOP_DEFINITIONBLOCK))
{
return 0;
}
*/
/*
* Check for the special AML integers first - Zero, One, Ones.
* These are single-byte opcodes that are the smallest possible
@ -407,7 +419,6 @@ OpcDoUnicode (
*
* RETURN: None
*
*
* DESCRIPTION: Convert a string EISA ID to numeric representation. See the
* Pnp BIOS Specification for details. Here is an excerpt:
*
@ -464,11 +475,11 @@ OpcDoEisaId (
for (i = 0; i < 7; i++)
{
/* First 3 characters must be letters */
/* First 3 characters must be uppercase letters */
if (i < 3)
{
if (!isalpha (InString[i]))
if (!isupper (InString[i]))
{
Status = AE_BAD_PARAMETER;
}
@ -521,6 +532,102 @@ OpcDoEisaId (
}
/*******************************************************************************
*
* FUNCTION: OpcDoUiId
*
* PARAMETERS: Op - Parse node
*
* RETURN: None
*
* DESCRIPTION:
*
******************************************************************************/
static UINT8 OpcMapToUUID[16] = {6,4,2,0,11,9,16,14,19,21,24,26,28,30,32,34};
void
OpcDoUuId (
ACPI_PARSE_OBJECT *Op)
{
char *InString;
char *Buffer;
ACPI_STATUS Status = AE_OK;
ACPI_NATIVE_UINT i;
ACPI_PARSE_OBJECT *NewOp;
InString = (char *) Op->Asl.Value.String;
if (ACPI_STRLEN (InString) != 36)
{
Status = AE_BAD_PARAMETER;
}
else
{
/* Check all 36 characters for correct format */
for (i = 0; i < 36; i++)
{
if ((i == 8) || (i == 13) || (i == 18) || (i == 23))
{
if (InString[i] != '-')
{
Status = AE_BAD_PARAMETER;
}
}
else
{
if (!isxdigit (InString[i]))
{
Status = AE_BAD_PARAMETER;
}
}
}
}
Buffer = UtLocalCalloc (16);
if (ACPI_FAILURE (Status))
{
AslError (ASL_ERROR, ASL_MSG_INVALID_UUID, Op, Op->Asl.Value.String);
}
else for (i = 0; i < 16; i++)
{
Buffer[i] = (char) (UtHexCharToValue (InString[OpcMapToUUID[i]]) << 4);
Buffer[i] = (char) UtHexCharToValue (InString[OpcMapToUUID[i] + 1]);
}
/* Change Op to a Buffer */
Op->Asl.ParseOpcode = PARSEOP_BUFFER;
Op->Common.AmlOpcode = AML_BUFFER_OP;
Op->Asl.CompileFlags &= ~NODE_COMPILE_TIME_CONST; /* Disable further optimization */
UtSetParseOpName (Op);
/* Child node is the buffer length */
NewOp = TrAllocateNode (PARSEOP_INTEGER);
NewOp->Asl.AmlOpcode = AML_BYTE_OP;
NewOp->Asl.Value.Integer = 16;
NewOp->Asl.Parent = Op;
Op->Asl.Child = NewOp;
Op = NewOp;
/* Peer to the child is the raw buffer data */
NewOp = TrAllocateNode (PARSEOP_RAW_DATA);
NewOp->Asl.AmlOpcode = AML_RAW_DATA_BUFFER;
NewOp->Asl.AmlLength = 16;
NewOp->Asl.Value.String = (char *) Buffer;
NewOp->Asl.Parent = Op->Asl.Parent;
Op->Asl.Next = NewOp;
}
/*******************************************************************************
*
* FUNCTION: OpcGenerateAmlOpcode
@ -580,6 +687,11 @@ OpcGenerateAmlOpcode (
OpcDoEisaId (Op);
break;
case PARSEOP_TOUUID:
OpcDoUuId (Op);
break;
case PARSEOP_UNICODE:
OpcDoUnicode (Op);

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: aslopt- Compiler optimizations
* $Revision: 13 $
* $Revision: 16 $
*
*****************************************************************************/
@ -211,8 +211,11 @@ OptSearchToRoot (
*NewPath = ACPI_MEM_CALLOCATE (ACPI_NAME_SIZE + 1);
ACPI_STRCPY (*NewPath, Path);
AslError (ASL_OPTIMIZATION, ASL_MSG_SINGLE_NAME_OPTIMIZATION, Op,
*NewPath);
if (ACPI_STRNCMP (*NewPath, "_T_", 3))
{
AslError (ASL_OPTIMIZATION, ASL_MSG_SINGLE_NAME_OPTIMIZATION, Op,
*NewPath);
}
return (AE_OK);
}
@ -354,6 +357,15 @@ OptBuildShortestPath (
* of the current path. We must include one more NameSeg of the target path
*/
Index -= ACPI_PATH_SEGMENT_LENGTH;
/* Special handling for Scope() operator */
if (Op->Asl.AmlOpcode == AML_SCOPE_OP)
{
NewPathExternal[i] = '^';
i++;
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS, "(EXTRA ^)"));
}
}
ACPI_STRCPY (&NewPathExternal[i], &((char *) TargetPath->Pointer)[Index]);
@ -581,7 +593,7 @@ OptOptimizeNamePath (
/* Various required items */
if (!TargetNode || !WalkState || !Op->Common.Parent)
if (!TargetNode || !WalkState || !AmlNameString || !Op->Common.Parent)
{
return_VOID;
}

View File

@ -2,7 +2,7 @@
/******************************************************************************
*
* Module Name: asltransform - Parse tree transforms
* $Revision: 20 $
* $Revision: 25 $
*
*****************************************************************************/
@ -131,7 +131,7 @@
*
* RETURN: A pointer to the second character of the name
*
* DESCRIPTION: Generate an ACPI name of the form _Txx. These names are
* DESCRIPTION: Generate an ACPI name of the form _T_x. These names are
* reserved for use by the ASL compiler.
*
******************************************************************************/
@ -143,7 +143,7 @@ TrAmlGetNextTempName (
char *TempName;
if (Gbl_TempCount > 255)
if (Gbl_TempCount > (9+26+26))
{
/* Too many temps */
/* TBD: issue eror message */
@ -152,14 +152,27 @@ TrAmlGetNextTempName (
}
TempName = UtLocalCalloc (6);
UtConvertByteToHex ((UINT8) Gbl_TempCount, (UINT8 *) &TempName [1]);
if (Gbl_TempCount < 9)
{
TempName[4] = (char) (Gbl_TempCount + 0x30);
}
else if (Gbl_TempCount < (9 + 26))
{
TempName[4] = (char) (Gbl_TempCount + 0x41);
}
else
{
TempName[4] = (char) (Gbl_TempCount + 0x61);
}
Gbl_TempCount++;
/* First three characters are always "\_T" */
/* First four characters are always "\_T_" */
TempName[0] = '\\';
TempName[1] = '_';
TempName[2] = 'T';
TempName[3] = '_';
*NamePath = TempName;
return (&TempName[1]);
@ -326,10 +339,6 @@ TrTransformSubtree (
TrDoDefinitionBlock (Op);
break;
case PARSEOP_ELSEIF:
TrDoElseif (Op);
break;
case PARSEOP_SWITCH:
TrDoSwitch (Op);
break;
@ -373,59 +382,6 @@ TrDoDefinitionBlock (
}
/*******************************************************************************
*
* FUNCTION: TrDoElseif
*
* PARAMETERS: Op - Parse node for ELSEIF
*
* RETURN: None
*
* DESCRIPTION: Transform an Elseif into an Else and If AML opcode pair.
* There is no AML opcode for ELSEIF -- it must be simulated
* with an if/else pair.
*
******************************************************************************/
void
TrDoElseif (
ACPI_PARSE_OBJECT *ElseNode)
{
ACPI_PARSE_OBJECT *IfNode = NULL;
ACPI_PARSE_OBJECT *NextNode;
/* Change the ELSEIF into an ELSE */
TrAmlInitNode (ElseNode, PARSEOP_ELSE);
/* Create a new IF node */
IfNode = TrCreateLeafNode (PARSEOP_IF);
IfNode->Asl.Parent = ElseNode;
TrAmlInitLineNumbers (IfNode, ElseNode);
/* Insert the the IF node first in the ELSE child list */
IfNode->Asl.Child = ElseNode->Asl.Child;
ElseNode->Asl.Child = IfNode;
/* Go to the end of the IF <Predicate><TermList> block */
NextNode = IfNode->Asl.Child; /* Next = Predicate */
NextNode = NextNode->Asl.Next; /* Nest = TermList */
/* Make the next node after the IF the rest of the original tree */
IfNode->Asl.Next = NextNode->Asl.Next;
/* Terminate the IF subtree and set IF node as the parent for all nodes */
NextNode->Asl.Next = NULL;
TrAmlSetSubtreeParent (IfNode->Asl.Child, IfNode);
}
/*******************************************************************************
*
* FUNCTION: TrDoSwitch
@ -493,34 +449,96 @@ TrDoSwitch (
Conditional = CaseOp;
CaseBlock = CaseOp->Asl.Child->Asl.Next;
Conditional->Asl.Child->Asl.Next = NULL;
/*
* change CaseOp() to: If (PredicateValue == CaseValue) {...}
* CaseOp->Child is the case value
* CaseOp->Child->Peer is the beginning of the case block
*/
NewOp = TrCreateValuedLeafNode (PARSEOP_NAMESTRING,
(ACPI_INTEGER) ACPI_TO_INTEGER (PredicateValuePath));
Predicate = CaseOp->Asl.Child;
Predicate->Asl.Next = NewOp;
TrAmlInitLineNumbers (NewOp, Predicate);
NewOp2 = TrCreateLeafNode (PARSEOP_LEQUAL);
NewOp2->Asl.Parent = Conditional;
NewOp2->Asl.Child = Predicate;
TrAmlInitLineNumbers (NewOp2, Conditional);
if (Predicate->Asl.ParseOpcode == PARSEOP_PACKAGE)
{
AcpiOsPrintf ("Package\n");
TrAmlSetSubtreeParent (Predicate, NewOp2);
/*
* Convert the package declaration to this form:
*
* If (LNotEqual (Match (Package(){4}, MEQ, _Txx, MTR, 0, 0), Ones))
*/
NewOp2 = TrCreateLeafNode (PARSEOP_MATCHTYPE_MEQ);
Predicate->Asl.Next = NewOp2;
TrAmlInitLineNumbers (NewOp2, Conditional);
Predicate = NewOp2;
Predicate->Asl.Next = CaseBlock;
NewOp = NewOp2;
NewOp2 = TrCreateValuedLeafNode (PARSEOP_NAMESTRING,
(ACPI_INTEGER) ACPI_TO_INTEGER (PredicateValuePath));
NewOp->Asl.Next = NewOp2;
TrAmlInitLineNumbers (NewOp2, Predicate);
TrAmlSetSubtreeParent (Predicate, Conditional);
NewOp = NewOp2;
NewOp2 = TrCreateLeafNode (PARSEOP_MATCHTYPE_MTR);
NewOp->Asl.Next = NewOp2;
TrAmlInitLineNumbers (NewOp2, Predicate);
NewOp = NewOp2;
NewOp2 = TrCreateLeafNode (PARSEOP_ZERO);
NewOp->Asl.Next = NewOp2;
TrAmlInitLineNumbers (NewOp2, Predicate);
NewOp = NewOp2;
NewOp2 = TrCreateLeafNode (PARSEOP_ZERO);
NewOp->Asl.Next = NewOp2;
TrAmlInitLineNumbers (NewOp2, Predicate);
NewOp2 = TrCreateLeafNode (PARSEOP_MATCH);
NewOp2->Asl.Child = Predicate; /* PARSEOP_PACKAGE */
TrAmlInitLineNumbers (NewOp2, Conditional);
TrAmlSetSubtreeParent (Predicate, NewOp2);
NewOp = NewOp2;
NewOp2 = TrCreateLeafNode (PARSEOP_ONES);
NewOp->Asl.Next = NewOp2;
TrAmlInitLineNumbers (NewOp2, Conditional);
NewOp2 = TrCreateLeafNode (PARSEOP_LEQUAL);
NewOp2->Asl.Child = NewOp;
NewOp->Asl.Parent = NewOp2;
TrAmlInitLineNumbers (NewOp2, Conditional);
TrAmlSetSubtreeParent (NewOp, NewOp2);
NewOp = NewOp2;
NewOp2 = TrCreateLeafNode (PARSEOP_LNOT);
NewOp2->Asl.Child = NewOp;
NewOp2->Asl.Parent = Conditional;
NewOp->Asl.Parent = NewOp2;
TrAmlInitLineNumbers (NewOp2, Conditional);
Conditional->Asl.Child = NewOp2;
NewOp2->Asl.Next = CaseBlock;
}
else
{
/*
* Change CaseOp() to: If (PredicateValue == CaseValue) {...}
* CaseOp->Child is the case value
* CaseOp->Child->Peer is the beginning of the case block
*/
NewOp = TrCreateValuedLeafNode (PARSEOP_NAMESTRING,
(ACPI_INTEGER) ACPI_TO_INTEGER (PredicateValuePath));
Predicate->Asl.Next = NewOp;
TrAmlInitLineNumbers (NewOp, Predicate);
NewOp2 = TrCreateLeafNode (PARSEOP_LEQUAL);
NewOp2->Asl.Parent = Conditional;
NewOp2->Asl.Child = Predicate;
TrAmlInitLineNumbers (NewOp2, Conditional);
TrAmlSetSubtreeParent (Predicate, NewOp2);
Predicate = NewOp2;
Predicate->Asl.Next = CaseBlock;
TrAmlSetSubtreeParent (Predicate, Conditional);
Conditional->Asl.Child = Predicate;
}
/* Reinitialize the CASE node to an IF node */
Conditional->Asl.Child = Predicate;
TrAmlInitNode (Conditional, PARSEOP_IF);
/*
@ -550,7 +568,12 @@ TrDoSwitch (
{
if (DefaultOp)
{
/* More than one Default */
/*
* More than one Default
* (Parser should catch this, should not get here)
*/
AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL, Next,
"Found more than one Default()");
}
/* Save the DEFAULT node for later, after CASEs */
@ -559,7 +582,7 @@ TrDoSwitch (
}
else
{
/* Unkown peer opcode */
/* Unknown peer opcode */
printf ("Unknown parse opcode for switch statement: %s (%d)\n",
Next->Asl.ParseOpName, Next->Asl.ParseOpcode);
@ -567,30 +590,36 @@ TrDoSwitch (
}
/*
* Add the default at the end of the if/else construct
* Add the default case at the end of the if/else construct
*/
if (DefaultOp)
{
/* If no CASE statements, this is an error - see below */
if (CaseOp)
{
/* Add an ELSE first */
/* Convert the DEFAULT node to an ELSE */
TrAmlInitNode (DefaultOp, PARSEOP_ELSE);
DefaultOp->Asl.Parent = Conditional->Asl.Parent;
}
else
{
/* There were no CASE statements, no ELSE needed */
TrAmlInsertPeer (CurrentParentNode, DefaultOp->Asl.Child);
/* Link ELSE node as a peer to the previous IF */
TrAmlInsertPeer (Conditional, DefaultOp);
}
}
if (!CaseOp)
{
AslError (ASL_ERROR, ASL_MSG_NO_CASES, StartNode, NULL);
}
/*
* Add a NAME node for the temp integer
*/
NewOp = TrCreateLeafNode (PARSEOP_NAME);
NewOp->Asl.Parent = Gbl_FirstLevelInsertionNode->Asl.Parent;
NewOp->Asl.CompileFlags |= NODE_COMPILER_EMITTED;
NewOp2 = TrCreateValuedLeafNode (PARSEOP_NAMESTRING,
(ACPI_INTEGER) ACPI_TO_INTEGER (PredicateValueName));
@ -612,8 +641,6 @@ TrDoSwitch (
TrAmlInitNode (StartNode, PARSEOP_STORE);
Predicate = StartNode->Asl.Child;
Predicate->Asl.Child = NULL;
NewOp = TrCreateValuedLeafNode (PARSEOP_NAMESTRING,
(ACPI_INTEGER) ACPI_TO_INTEGER (PredicateValuePath));
NewOp->Asl.Parent = StartNode;

View File

@ -2,7 +2,7 @@
/******************************************************************************
*
* Module Name: asltypes.h - compiler data types and struct definitions
* $Revision: 62 $
* $Revision: 65 $
*
*****************************************************************************/
@ -149,6 +149,7 @@
#define NODE_IS_TERM_ARG 0x00004000
#define NODE_WAS_ONES_OP 0x00008000
#define NODE_IS_NAME_DECLARATION 0x00010000
#define NODE_COMPILER_EMITTED 0x00020000
/* Keeps information about individual control methods */
@ -157,6 +158,8 @@ typedef struct asl_method_info
UINT8 NumArguments;
UINT8 LocalInitialized[ACPI_METHOD_NUM_LOCALS];
UINT8 ArgInitialized[ACPI_METHOD_NUM_ARGS];
UINT32 ValidArgTypes[ACPI_METHOD_NUM_ARGS];
UINT32 ValidReturnTypes;
UINT32 NumReturnNoValue;
UINT32 NumReturnWithValue;
ACPI_PARSE_OBJECT *Op;
@ -387,7 +390,10 @@ typedef enum
ASL_MSG_EARLY_EOF,
ASL_MSG_SCOPE_FWD_REF,
ASL_MSG_NON_ASCII,
ASL_MSG_INVALID_TIME
ASL_MSG_INVALID_TIME,
ASL_MSG_DUPLICATE_CASE,
ASL_MSG_NO_CASES,
ASL_MSG_INVALID_UUID
} ASL_MESSAGE_IDS;
@ -477,7 +483,12 @@ char *AslMessages [] = {
/* ASL_MSG_EARLY_EOF */ "Premature end-of-file reached",
/* ASL_MSG_SCOPE_FWD_REF */ "Forward references from Scope() not allowed",
/* ASL_MSG_NON_ASCII */ "Invalid characters found in file",
/* ASL_MSG_INVALID_TIME */ "Time parameter too long (255 max)"
/* ASL_MSG_INVALID_TIME */ "Time parameter too long (255 max)",
/* ASL_MSG_DUPLICATE_CASE */ "Case value already specified",
/* ASL_MSG_NO_CASES */ "No Case() statements under Switch()",
/* ASL_MSG_INVALID_UUID */ "UUID string must be of the form \"aabbccdd-eeff-gghh-iijj-kkllmmnnoopp\""
};

View File

@ -1,7 +1,7 @@
/*******************************************************************************
*
* Module Name: dbcmds - debug commands and output routines
* $Revision: 113 $
* $Revision: 115 $
*
******************************************************************************/
@ -124,6 +124,9 @@
#include "acresrc.h"
#include "acdisasm.h"
#include "acparser.h"
#ifdef ACPI_DEBUGGER
#define _COMPONENT ACPI_CA_DEBUGGER
@ -157,6 +160,18 @@ static ARGUMENT_INFO AcpiDbObjectTypes [] =
};
/*******************************************************************************
*
* FUNCTION: AcpiDbSleep
*
* PARAMETERS: ObjectArg - Desired sleep state (0-5)
*
* RETURN: Status
*
* DESCRIPTION: Simulate a sleep/wake sequence
*
******************************************************************************/
ACPI_STATUS
AcpiDbSleep (
char *ObjectArg)
@ -503,6 +518,71 @@ AcpiDbDisassembleAml (
}
/*******************************************************************************
*
* FUNCTION: AcpiDbDisassembleMethod
*
* PARAMETERS: Method - Name of control method
*
* RETURN: None
*
* DESCRIPTION: Display disassembled AML (ASL) starting from Op for the number
* of statements specified.
*
******************************************************************************/
ACPI_STATUS
AcpiDbDisassembleMethod (
char *Name)
{
ACPI_STATUS Status;
ACPI_PARSE_OBJECT *Op;
ACPI_WALK_STATE *WalkState;
ACPI_OPERAND_OBJECT *ObjDesc;
ACPI_NAMESPACE_NODE *Method;
Method = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ACPI_STRTOUL (Name, NULL, 16));
if (!Method)
{
return (AE_BAD_PARAMETER);
}
ObjDesc = Method->Object;
Op = AcpiPsCreateScopeOp ();
if (!Op)
{
return (AE_NO_MEMORY);
}
/* Create and initialize a new walk state */
WalkState = AcpiDsCreateWalkState (0, Op, NULL, NULL);
if (!WalkState)
{
return (AE_NO_MEMORY);
}
Status = AcpiDsInitAmlWalk (WalkState, Op, NULL,
ObjDesc->Method.AmlStart,
ObjDesc->Method.AmlLength, NULL, 1);
if (ACPI_FAILURE (Status))
{
return (Status);
}
/* Parse the AML */
WalkState->ParseFlags &= ~ACPI_PARSE_DELETE_TREE;
Status = AcpiPsParseAml (WalkState);
AcpiDmDisassemble (NULL, Op, 0);
AcpiPsDeleteParseTree (Op);
return (AE_OK);
}
/*******************************************************************************
*
* FUNCTION: AcpiDbDumpNamespace
@ -836,6 +916,8 @@ AcpiDbWalkForSpecificObjects (
if (ObjDesc)
{
AcpiOsPrintf (" %p/%p", ObjHandle, ObjDesc);
switch (ACPI_GET_OBJECT_TYPE (ObjDesc))
{
case ACPI_TYPE_METHOD:

View File

@ -1,7 +1,7 @@
/*******************************************************************************
*
* Module Name: dbexec - debugger control method execution
* $Revision: 60 $
* $Revision: 62 $
*
******************************************************************************/
@ -395,7 +395,7 @@ AcpiDbExecute (
* Allow any handlers in separate threads to complete.
* (Such as Notify handlers invoked from AML executed above).
*/
AcpiOsSleep (0, 10);
AcpiOsSleep (10);
#ifdef ACPI_DEBUG_OUTPUT
@ -408,7 +408,7 @@ AcpiDbExecute (
if (Allocations > 0)
{
AcpiOsPrintf ("Outstanding: %u allocations after execution\n",
AcpiOsPrintf ("Outstanding: 0x%X allocations after execution\n",
Allocations);
}
#endif

View File

@ -1,7 +1,7 @@
/*******************************************************************************
*
* Module Name: dbinput - user front-end to the AML debugger
* $Revision: 100 $
* $Revision: 101 $
*
******************************************************************************/
@ -141,6 +141,7 @@ enum AcpiExDebuggerCommands
CMD_CALL,
CMD_CLOSE,
CMD_DEBUG,
CMD_DISASSEMBLE,
CMD_DUMP,
CMD_ENABLEACPI,
CMD_EVENT,
@ -200,6 +201,7 @@ static const COMMAND_INFO AcpiGbl_DbCommands[] =
{"CALL", 0},
{"CLOSE", 0},
{"DEBUG", 1},
{"DISASSEMBLE", 1},
{"DUMP", 1},
{"ENABLEACPI", 0},
{"EVENT", 1},
@ -275,6 +277,7 @@ AcpiDbDisplayHelp (
AcpiOsPrintf (" [GENERAL] General-Purpose Commands\n");
AcpiOsPrintf (" [NAMESPACE] Namespace Access Commands\n");
AcpiOsPrintf (" [METHOD] Control Method Execution Commands\n");
AcpiOsPrintf (" [STATISTICS] Statistical Information\n");
AcpiOsPrintf (" [FILE] File I/O Commands\n");
return;
}
@ -298,17 +301,32 @@ AcpiDbDisplayHelp (
AcpiOsPrintf ("Locks Current status of internal mutexes\n");
AcpiOsPrintf ("Quit or Exit Exit this command\n");
AcpiOsPrintf ("Stats [Allocations|Memory|Misc\n");
AcpiOsPrintf (" |Objects|Tables] Display namespace and memory statistics\n");
AcpiOsPrintf (" |Objects|Sizes|Stack|Tables] Display namespace and memory statistics\n");
AcpiOsPrintf ("Tables Display info about loaded ACPI tables\n");
AcpiOsPrintf ("Unload <TableSig> [Instance] Unload an ACPI table\n");
AcpiOsPrintf ("! <CommandNumber> Execute command from history buffer\n");
AcpiOsPrintf ("!! Execute last command again\n");
return;
case 'S':
AcpiOsPrintf ("\nStats Subcommands\n\n");
AcpiOsPrintf ("Allocations Display list of current memory allocations\n");
AcpiOsPrintf ("Memory Dump internal memory lists\n");
AcpiOsPrintf ("Misc Namespace search and mutex stats\n");
AcpiOsPrintf ("Objects Summary of namespace objects\n");
AcpiOsPrintf ("Sizes Sizes for each of the internal objects\n");
AcpiOsPrintf ("Stack Display CPU stack usage\n");
AcpiOsPrintf ("Tables Info about current ACPI table(s)\n");
return;
case 'N':
AcpiOsPrintf ("\nNamespace Access Commands\n\n");
AcpiOsPrintf ("Disassemble <Method> Disassemble a control method\n");
AcpiOsPrintf ("Event <F|G> <Value> Generate AcpiEvent (Fixed/GPE)\n");
AcpiOsPrintf ("Find <Name> (? is wildcard) Find ACPI name(s) with wildcards\n");
AcpiOsPrintf ("Gpe <GpeNum> <GpeBlock> Simulate a GPE\n");
AcpiOsPrintf ("Gpes Display info on all GPEs\n");
AcpiOsPrintf ("Integrity Validate namespace integrity\n");
AcpiOsPrintf ("Method Display list of loaded control methods\n");
AcpiOsPrintf ("Namespace [<Addr>|<Path>] [Depth] Display loaded namespace tree/subtree\n");
AcpiOsPrintf ("Notify <NamePath> <Value> Send a notification\n");
@ -317,8 +335,10 @@ AcpiDbDisplayHelp (
AcpiOsPrintf ("Prefix [<NamePath>] Set or Get current execution prefix\n");
AcpiOsPrintf ("References <Addr> Find all references to object at addr\n");
AcpiOsPrintf ("Resources xxx Get and display resources\n");
AcpiOsPrintf ("Sleep <SleepState> Simulate sleep/wake sequence\n");
AcpiOsPrintf ("Terminate Delete namespace and all internal objects\n");
AcpiOsPrintf ("Thread <Threads><Loops><NamePath> Spawn threads to execute method(s)\n");
AcpiOsPrintf ("Type <Object> Display object type\n");
return;
case 'M':
@ -601,6 +621,10 @@ AcpiDbCommandDispatch (
AcpiDbExecute (AcpiGbl_DbArgs[1], &AcpiGbl_DbArgs[2], EX_SINGLE_STEP);
break;
case CMD_DISASSEMBLE:
AcpiDbDisassembleMethod (AcpiGbl_DbArgs[1]);
break;
case CMD_DUMP:
AcpiDbDecodeAndDisplayObject (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
break;

View File

@ -1,7 +1,7 @@
/*******************************************************************************
*
* Module Name: dbutils - AML debugger utilities
* $Revision: 66 $
* $Revision: 68 $
*
******************************************************************************/
@ -121,6 +121,7 @@
#include "acnamesp.h"
#include "acdebug.h"
#include "acdispat.h"
#include "acdisasm.h"
#ifdef ACPI_DEBUGGER
@ -261,7 +262,8 @@ AcpiDbDumpObject (
{
case ACPI_TYPE_ANY:
AcpiOsPrintf ("[Object Reference] = %p\n", ObjDesc->Reference.Handle);
AcpiOsPrintf ("[Object Reference] = ", ObjDesc->Reference.Handle);
AcpiDmDisplayInternalObject (ObjDesc->Reference.Handle, NULL);
break;
@ -312,7 +314,8 @@ AcpiDbDumpObject (
case ACPI_TYPE_LOCAL_REFERENCE:
AcpiOsPrintf ("[Object Reference] = %p\n", ObjDesc->Reference.Handle);
AcpiOsPrintf ("[Object Reference] = ", ObjDesc->Reference.Handle);
AcpiDmDisplayInternalObject (ObjDesc->Reference.Handle, NULL);
break;

View File

@ -1,7 +1,7 @@
/*******************************************************************************
*
* Module Name: dmwalk - AML disassembly tree walk
* $Revision: 13 $
* $Revision: 14 $
*
******************************************************************************/
@ -469,7 +469,7 @@ AcpiDmDescendingOp (
while (AcpiGbl_ExternalList)
{
AcpiOsPrintf (" External (%s)\n", AcpiGbl_ExternalList->Path);
AcpiOsPrintf (" External (%s, DeviceObj)\n", AcpiGbl_ExternalList->Path);
NextExternal = AcpiGbl_ExternalList->Next;
ACPI_MEM_FREE (AcpiGbl_ExternalList->Path);

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: dsmethod - Parser/Interpreter interface - control method parsing
* $Revision: 97 $
* $Revision: 101 $
*
*****************************************************************************/
@ -132,15 +132,12 @@
*
* FUNCTION: AcpiDsParseMethod
*
* PARAMETERS: ObjHandle - Node of the method
* Level - Current nesting level
* Context - Points to a method counter
* ReturnValue - Not used
* PARAMETERS: ObjHandle - Method node
*
* RETURN: Status
*
* DESCRIPTION: Call the parser and parse the AML that is
* associated with the method.
* DESCRIPTION: Call the parser and parse the AML that is associated with the
* method.
*
* MUTEX: Assumes parser is locked
*
@ -273,8 +270,6 @@ AcpiDsParseMethod (
* increments the thread count, and waits at the method semaphore
* for clearance to execute.
*
* MUTEX: Locks/unlocks parser.
*
******************************************************************************/
ACPI_STATUS
@ -337,7 +332,8 @@ AcpiDsBeginMethodExecution (
*
* FUNCTION: AcpiDsCallControlMethod
*
* PARAMETERS: WalkState - Current state of the walk
* PARAMETERS: Thread - Info for this thread
* ThisWalkState - Current walk state
* Op - Current Op to be walked
*
* RETURN: Status
@ -499,12 +495,13 @@ Cleanup:
*
* FUNCTION: AcpiDsRestartControlMethod
*
* PARAMETERS: WalkState - State of the method when it was preempted
* Op - Pointer to new current op
* PARAMETERS: WalkState - State for preempted method (caller)
* ReturnDesc - Return value from the called method
*
* RETURN: Status
*
* DESCRIPTION: Restart a method that was preempted
* DESCRIPTION: Restart a method that was preempted by another (nested) method
* invocation. Handle the return value (if any) from the callee.
*
******************************************************************************/
@ -519,20 +516,38 @@ AcpiDsRestartControlMethod (
ACPI_FUNCTION_TRACE_PTR ("DsRestartControlMethod", WalkState);
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
"****Restart [%4.4s] Op %p ReturnValueFromCallee %p\n",
(char *) &WalkState->MethodNode->Name, WalkState->MethodCallOp,
ReturnDesc));
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
" ReturnFromThisMethodUsed?=%X ResStack %p Walk %p\n",
WalkState->ReturnUsed,
WalkState->Results, WalkState));
/* Did the called method return a value? */
if (ReturnDesc)
{
/* Are we actually going to use the return value? */
if (WalkState->ReturnUsed)
{
/*
* Get the return value (if any) from the previous method.
* NULL if no return value
*/
/* Save the return value from the previous method */
Status = AcpiDsResultPush (ReturnDesc, WalkState);
if (ACPI_FAILURE (Status))
{
AcpiUtRemoveReference (ReturnDesc);
return_ACPI_STATUS (Status);
}
/*
* Save as THIS method's return value in case it is returned
* immediately to yet another method
*/
WalkState->ReturnDesc = ReturnDesc;
}
else
{
@ -544,11 +559,6 @@ AcpiDsRestartControlMethod (
}
}
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
"Method=%p Return=%p ReturnUsed?=%X ResStack=%p State=%p\n",
WalkState->MethodCallOp, ReturnDesc, WalkState->ReturnUsed,
WalkState->Results, WalkState));
return_ACPI_STATUS (AE_OK);
}

View File

@ -1,7 +1,7 @@
/*******************************************************************************
*
* Module Name: dsmthdat - control method arguments and local variables
* $Revision: 78 $
* $Revision: 80 $
*
******************************************************************************/
@ -398,7 +398,7 @@ AcpiDsMethodDataSetValue (
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
"obj %p op %X, ref count = %d [%s]\n", Object,
"NewObj %p Opcode %X, Refs=%d [%s]\n", Object,
Opcode, Object->Common.ReferenceCount,
AcpiUtGetTypeName (Object->Common.Type)));
@ -540,7 +540,24 @@ AcpiDsMethodDataGetValue (
* was referenced by the method (via the ASL)
* before it was initialized. Either case is an error.
*/
switch (Opcode)
/* If slack enabled, init the LocalX/ArgX to an Integer of value zero */
if (AcpiGbl_EnableInterpreterSlack)
{
Object = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
if (!Object)
{
return_ACPI_STATUS (AE_NO_MEMORY);
}
Object->Integer.Value = 0;
Node->Object = Object;
}
/* Otherwise, return the error */
else switch (Opcode)
{
case AML_ARG_OP:
@ -667,7 +684,7 @@ AcpiDsStoreObjectToLocal (
ACPI_FUNCTION_TRACE ("DsStoreObjectToLocal");
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Opcode=%d Idx=%d Obj=%p\n",
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Opcode=%X Index=%d Obj=%p\n",
Opcode, Index, ObjDesc));
/* Parameter validation */

View File

@ -1,7 +1,7 @@
/*******************************************************************************
*
* Module Name: dsutils - Dispatcher utilities
* $Revision: 102 $
* $Revision: 107 $
*
******************************************************************************/
@ -134,11 +134,10 @@
*
* FUNCTION: AcpiDsIsResultUsed
*
* PARAMETERS: Op
* ResultObj
* WalkState
* PARAMETERS: Op - Current Op
* WalkState - Current State
*
* RETURN: Status
* RETURN: TRUE if result is used, FALSE otherwise
*
* DESCRIPTION: Check if a result object will be used by the parent
*
@ -164,19 +163,41 @@ AcpiDsIsResultUsed (
}
/*
* If there is no parent, the result can't possibly be used!
* (An executing method typically has no parent, since each
* method is parsed separately) However, a method that is
* invoked from another method has a parent.
* If there is no parent, we are executing at the method level.
* An executing method typically has no parent, since each method
* is parsed separately.
*/
if (!Op->Common.Parent)
{
/*
* If this is the last statement in the method, we know it is not a
* Return() operator (would not come here.) The following code is the
* optional support for a so-called "implicit return". Some AML code
* assumes that the last value of the method is "implicitly" returned
* to the caller. Just save the last result as the return value.
* NOTE: this is optional because the ASL language does not actually
* support this behavior.
*/
if ((AcpiGbl_EnableInterpreterSlack) &&
(WalkState->ParserState.Aml >= WalkState->ParserState.AmlEnd))
{
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
"Result of [%s] will be implicitly returned\n",
AcpiPsGetOpcodeName (Op->Common.AmlOpcode)));
/* Use the top of the result stack as the implicit return value */
WalkState->ReturnDesc = WalkState->Results->Results.ObjDesc[0];
return_VALUE (TRUE);
}
/* No parent, the return value cannot possibly be used */
return_VALUE (FALSE);
}
/*
* Get info on the parent. The root Op is AML_SCOPE
*/
/* Get info on the parent. The RootOp is AML_SCOPE */
ParentInfo = AcpiPsGetOpcodeInfo (Op->Common.Parent->Common.AmlOpcode);
if (ParentInfo->Class == AML_CLASS_UNKNOWN)
{
@ -285,9 +306,9 @@ ResultNotUsed:
*
* FUNCTION: AcpiDsDeleteResultIfNotUsed
*
* PARAMETERS: Op
* ResultObj
* WalkState
* PARAMETERS: Op - Current parse Op
* ResultObj - Result of the operation
* WalkState - Current state
*
* RETURN: Status
*
@ -400,7 +421,7 @@ AcpiDsClearOperands (
UINT32 i;
ACPI_FUNCTION_TRACE_PTR ("AcpiDsClearOperands", WalkState);
ACPI_FUNCTION_TRACE_PTR ("DsClearOperands", WalkState);
/*
@ -426,8 +447,9 @@ AcpiDsClearOperands (
*
* FUNCTION: AcpiDsCreateOperand
*
* PARAMETERS: WalkState
* Arg
* PARAMETERS: WalkState - Current walk state
* Arg - Parse object for the argument
* ArgIndex - Which argument (zero based)
*
* RETURN: Status
*

View File

@ -2,7 +2,7 @@
*
* Module Name: dswexec - Dispatcher method execution callbacks;
* dispatch to interpreter.
* $Revision: 106 $
* $Revision: 113 $
*
*****************************************************************************/
@ -134,17 +134,18 @@
* Dispatch table for opcode classes
*/
static ACPI_EXECUTE_OP AcpiGbl_OpTypeDispatch [] = {
AcpiExOpcode_1A_0T_0R,
AcpiExOpcode_1A_0T_1R,
AcpiExOpcode_1A_1T_0R,
AcpiExOpcode_1A_1T_1R,
AcpiExOpcode_2A_0T_0R,
AcpiExOpcode_2A_0T_1R,
AcpiExOpcode_2A_1T_1R,
AcpiExOpcode_2A_2T_1R,
AcpiExOpcode_3A_0T_0R,
AcpiExOpcode_3A_1T_1R,
AcpiExOpcode_6A_0T_1R};
AcpiExOpcode_0A_0T_1R,
AcpiExOpcode_1A_0T_0R,
AcpiExOpcode_1A_0T_1R,
AcpiExOpcode_1A_1T_0R,
AcpiExOpcode_1A_1T_1R,
AcpiExOpcode_2A_0T_0R,
AcpiExOpcode_2A_0T_1R,
AcpiExOpcode_2A_1T_1R,
AcpiExOpcode_2A_2T_1R,
AcpiExOpcode_3A_0T_0R,
AcpiExOpcode_3A_1T_1R,
AcpiExOpcode_6A_0T_1R};
/*****************************************************************************
*
@ -514,7 +515,7 @@ AcpiDsExecEndOp (
* routine. There is one routine per opcode "type" based upon the
* number of opcode arguments and return type.
*/
Status = AcpiGbl_OpTypeDispatch [OpType] (WalkState);
Status = AcpiGbl_OpTypeDispatch[OpType] (WalkState);
}
else
{
@ -527,7 +528,9 @@ AcpiDsExecEndOp (
(WalkState->Operands[0]->Common.Type == ACPI_TYPE_LOCAL_REFERENCE) &&
(WalkState->Operands[1]->Common.Type == ACPI_TYPE_LOCAL_REFERENCE) &&
(WalkState->Operands[0]->Reference.Opcode ==
WalkState->Operands[1]->Reference.Opcode))
WalkState->Operands[1]->Reference.Opcode) &&
(WalkState->Operands[0]->Reference.Offset ==
WalkState->Operands[1]->Reference.Offset))
{
Status = AE_OK;
}
@ -755,7 +758,8 @@ AcpiDsExecEndOp (
* conditional predicate
*/
if ((WalkState->ControlState) &&
if ((ACPI_SUCCESS (Status)) &&
(WalkState->ControlState) &&
(WalkState->ControlState->Common.State ==
ACPI_CONTROL_PREDICATE_EXECUTING) &&
(WalkState->ControlState->Control.PredicateOp == Op))
@ -766,6 +770,20 @@ AcpiDsExecEndOp (
Cleanup:
/* Invoke exception handler on error */
if (ACPI_FAILURE (Status) &&
AcpiGbl_ExceptionHandler &&
!(Status & AE_CODE_CONTROL))
{
AcpiExExitInterpreter ();
Status = AcpiGbl_ExceptionHandler (Status,
WalkState->MethodNode->Name.Integer, WalkState->Opcode,
WalkState->AmlOffset, NULL);
AcpiExEnterInterpreter ();
}
if (WalkState->ResultObj)
{
/* Break to debugger to display result */

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: dswload - Dispatcher namespace load callbacks
* $Revision: 87 $
* $Revision: 88 $
*
*****************************************************************************/
@ -262,21 +262,22 @@ AcpiDsLoad1BeginOp (
*/
Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType,
ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, WalkState, &(Node));
#ifdef _ACPI_ASL_COMPILER
if (Status == AE_NOT_FOUND)
{
/*
* Table disassembly:
* Target of Scope() not found. Generate an External for it, and
* insert the name into the namespace.
*/
AcpiDmAddToExternalList (Path);
Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType,
ACPI_IMODE_LOAD_PASS1, ACPI_NS_SEARCH_PARENT, WalkState, &(Node));
}
#endif
if (ACPI_FAILURE (Status))
{
#ifdef _ACPI_ASL_COMPILER
if (Status == AE_NOT_FOUND)
{
AcpiDmAddToExternalList (Path);
Status = AE_OK;
}
else
{
ACPI_REPORT_NSERROR (Path, Status);
}
#else
ACPI_REPORT_NSERROR (Path, Status);
#endif
return (Status);
}

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: dswstate - Dispatcher parse tree walk management routines
* $Revision: 80 $
* $Revision: 81 $
*
*****************************************************************************/
@ -977,6 +977,7 @@ AcpiDsCreateWalkState (
Status = AcpiDsResultStackPush (WalkState);
if (ACPI_FAILURE (Status))
{
AcpiUtReleaseToCache (ACPI_MEM_LIST_WALK, WalkState);
return_PTR (NULL);
}

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: evgpe - General Purpose Event handling and dispatch
* $Revision: 42 $
* $Revision: 44 $
*
*****************************************************************************/
@ -176,6 +176,8 @@ AcpiEvSetGpeType (
* FUNCTION: AcpiEvUpdateGpeEnableMasks
*
* PARAMETERS: GpeEventInfo - GPE to update
* Type - What to do: ACPI_GPE_DISABLE or
* ACPI_GPE_ENABLE
*
* RETURN: Status
*
@ -243,6 +245,8 @@ AcpiEvUpdateGpeEnableMasks (
* FUNCTION: AcpiEvEnableGpe
*
* PARAMETERS: GpeEventInfo - GPE to enable
* WriteToHardware - Enable now, or just mark data structs
* (WAKE GPEs should be deferred)
*
* RETURN: Status
*
@ -525,13 +529,8 @@ AcpiEvGpeDetect (
}
ACPI_DEBUG_PRINT ((ACPI_DB_INTERRUPTS,
"GPE pair: Status %8.8X%8.8X = %02X, Enable %8.8X%8.8X = %02X\n",
ACPI_FORMAT_UINT64 (ACPI_GET_ADDRESS (
GpeRegisterInfo->StatusAddress.Address)),
StatusReg,
ACPI_FORMAT_UINT64 (ACPI_GET_ADDRESS (
GpeRegisterInfo->EnableAddress.Address)),
EnableReg));
"Read GPE Register at GPE%X: Status=%02X, Enable=%02X\n",
GpeRegisterInfo->BaseGpeNumber, StatusReg, EnableReg));
/* First check if there is anything active at all in this register */
@ -822,7 +821,7 @@ AcpiEvGpeDispatch (
#ifdef ACPI_GPE_NOTIFY_CHECK
/*******************************************************************************
* NOT USED, PROTOTYPE ONLY AND WILL PROBABLY BE REMOVED
* TBD: NOT USED, PROTOTYPE ONLY AND WILL PROBABLY BE REMOVED
*
* FUNCTION: AcpiEvCheckForWakeOnlyGpe
*

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: evgpeblk - GPE block creation and initialization.
* $Revision: 36 $
* $Revision: 39 $
*
*****************************************************************************/
@ -181,17 +181,18 @@ AcpiEvValidGpeEvent (
* FUNCTION: AcpiEvWalkGpeList
*
* PARAMETERS: GpeWalkCallback - Routine called for each GPE block
* Flags - ACPI_NOT_ISR or ACPI_ISR
*
* RETURN: Status
*
* DESCRIPTION: Walk the GPE lists.
* FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED
*
******************************************************************************/
ACPI_STATUS
AcpiEvWalkGpeList (
ACPI_GPE_CALLBACK GpeWalkCallback)
ACPI_GPE_CALLBACK GpeWalkCallback,
UINT32 Flags)
{
ACPI_GPE_BLOCK_INFO *GpeBlock;
ACPI_GPE_XRUPT_INFO *GpeXruptInfo;
@ -201,7 +202,7 @@ AcpiEvWalkGpeList (
ACPI_FUNCTION_TRACE ("EvWalkGpeList");
AcpiOsAcquireLock (AcpiGbl_GpeLock, ACPI_ISR);
AcpiOsAcquireLock (AcpiGbl_GpeLock, Flags);
/* Walk the interrupt level descriptor list */
@ -228,7 +229,7 @@ AcpiEvWalkGpeList (
}
UnlockAndExit:
AcpiOsReleaseLock (AcpiGbl_GpeLock, ACPI_ISR);
AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
return_ACPI_STATUS (Status);
}
@ -413,7 +414,8 @@ AcpiEvSaveMethodInfo (
*
* PARAMETERS: Callback from WalkNamespace
*
* RETURN: Status
* RETURN: Status. NOTE: We ignore errors so that the _PRW walk is
* not aborted on a single _PRW failure.
*
* DESCRIPTION: Called from AcpiWalkNamespace. Expects each object to be a
* Device. Run the _PRW method. If present, extract the GPE
@ -1102,16 +1104,14 @@ AcpiEvCreateGpeBlock (
/* Dump info about this GPE block */
ACPI_DEBUG_PRINT ((ACPI_DB_INIT,
"GPE %02X to %02X [%4.4s] %u regs at %8.8X%8.8X on int 0x%X\n",
"GPE %02X to %02X [%4.4s] %u regs on int 0x%X\n",
(UINT32) GpeBlock->BlockBaseNumber,
(UINT32) (GpeBlock->BlockBaseNumber +
((GpeBlock->RegisterCount * ACPI_GPE_REGISTER_WIDTH) -1)),
GpeDevice->Name.Ascii,
GpeBlock->RegisterCount,
ACPI_FORMAT_UINT64 (ACPI_GET_ADDRESS (GpeBlock->BlockAddress.Address)),
InterruptLevel));
/* Enable all valid GPEs found above */
Status = AcpiHwEnableRuntimeGpeBlock (NULL, GpeBlock);

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: evmisc - Miscellaneous event manager support functions
* $Revision: 75 $
* $Revision: 79 $
*
*****************************************************************************/
@ -162,9 +162,10 @@ AcpiEvIsNotifyObject (
*
* FUNCTION: AcpiEvQueueNotifyRequest
*
* PARAMETERS:
* PARAMETERS: Node - NS node for the notified object
* NotifyValue - Value from the Notify() request
*
* RETURN: None.
* RETURN: Status
*
* DESCRIPTION: Dispatch a device notification event to a previously
* installed handler.
@ -219,9 +220,8 @@ AcpiEvQueueNotifyRequest (
NotifyValue));
}
/*
* Get the notify object attached to the NS Node
*/
/* Get the notify object attached to the NS Node */
ObjDesc = AcpiNsGetAttachedObject (Node);
if (ObjDesc)
{
@ -277,8 +277,10 @@ AcpiEvQueueNotifyRequest (
if (!HandlerObj)
{
/* There is no per-device notify handler for this device */
/*
* There is no per-device notify handler for this device.
* This may or may not be a problem.
*/
ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
"No notify handler for Notify(%4.4s, %X) node %p\n",
AcpiUtGetNodeName (Node), NotifyValue, Node));
@ -292,7 +294,7 @@ AcpiEvQueueNotifyRequest (
*
* FUNCTION: AcpiEvNotifyDispatch
*
* PARAMETERS:
* PARAMETERS: Context - To be passsed to the notify handler
*
* RETURN: None.
*
@ -365,6 +367,8 @@ AcpiEvNotifyDispatch (
*
* FUNCTION: AcpiEvGlobalLockThread
*
* PARAMETERS: Context - From thread interface, not used
*
* RETURN: None
*
* DESCRIPTION: Invoked by SCI interrupt handler upon acquisition of the
@ -400,7 +404,9 @@ AcpiEvGlobalLockThread (
*
* FUNCTION: AcpiEvGlobalLockHandler
*
* RETURN: Status
* PARAMETERS: Context - From thread interface, not used
*
* RETURN: ACPI_INTERRUPT_HANDLED or ACPI_INTERRUPT_NOT_HANDLED
*
* DESCRIPTION: Invoked directly from the SCI handler when a global lock
* release interrupt occurs. Grab the global lock and queue
@ -449,6 +455,8 @@ AcpiEvGlobalLockHandler (
*
* FUNCTION: AcpiEvInitGlobalLockHandler
*
* PARAMETERS: None
*
* RETURN: Status
*
* DESCRIPTION: Install a handler for the global lock release event
@ -489,6 +497,8 @@ AcpiEvInitGlobalLockHandler (void)
*
* FUNCTION: AcpiEvAcquireGlobalLock
*
* PARAMETERS: Timeout - Max time to wait for the lock, in millisec.
*
* RETURN: Status
*
* DESCRIPTION: Attempt to gain ownership of the Global Lock.
@ -559,6 +569,10 @@ AcpiEvAcquireGlobalLock (
*
* FUNCTION: AcpiEvReleaseGlobalLock
*
* PARAMETERS: None
*
* RETURN: Status
*
* DESCRIPTION: Releases ownership of the Global Lock.
*
******************************************************************************/
@ -651,7 +665,7 @@ AcpiEvTerminate (void)
/* Disable all GPEs in all GPE blocks */
Status = AcpiEvWalkGpeList (AcpiHwDisableGpeBlock);
Status = AcpiEvWalkGpeList (AcpiHwDisableGpeBlock, ACPI_NOT_ISR);
/* Remove SCI handler */
@ -664,7 +678,7 @@ AcpiEvTerminate (void)
/* Deallocate all handler objects installed within GPE info structs */
Status = AcpiEvWalkGpeList (AcpiEvDeleteGpeHandlers);
Status = AcpiEvWalkGpeList (AcpiEvDeleteGpeHandlers, ACPI_NOT_ISR);
/* Return to original mode if necessary */

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: evregion - ACPI AddressSpace (OpRegion) handler dispatch
* $Revision: 151 $
* $Revision: 152 $
*
*****************************************************************************/
@ -261,7 +261,7 @@ AcpiEvInitializeOpRegions (
* FUNCTION: AcpiEvExecuteRegMethod
*
* PARAMETERS: RegionObj - Object structure
* Function - On (1) or Off (0)
* Function - Passed to _REG: On (1) or Off (0)
*
* RETURN: Status
*
@ -317,7 +317,7 @@ AcpiEvExecuteRegMethod (
goto Cleanup;
}
/* Set up the parameter objects */
/* Setup the parameter objects */
Params[0]->Integer.Value = RegionObj->Region.SpaceId;
Params[1]->Integer.Value = Function;
@ -347,7 +347,6 @@ Cleanup:
* FUNCTION: AcpiEvAddressSpaceDispatch
*
* PARAMETERS: RegionObj - Internal region object
* SpaceId - ID of the address space (0-255)
* Function - Read or Write operation
* Address - Where in the space to read or write
* BitWidth - Field width in bits (8, 16, 32, or 64)
@ -523,8 +522,8 @@ AcpiEvAddressSpaceDispatch (
*
* FUNCTION: AcpiEvDetachRegion
*
* PARAMETERS: RegionObj - Region Object
* AcpiNsIsLocked - Namespace Region Already Locked?
* PARAMETERS: RegionObj - Region Object
* AcpiNsIsLocked - Namespace Region Already Locked?
*
* RETURN: None
*
@ -668,9 +667,9 @@ AcpiEvDetachRegion(
*
* FUNCTION: AcpiEvAttachRegion
*
* PARAMETERS: HandlerObj - Handler Object
* RegionObj - Region Object
* AcpiNsIsLocked - Namespace Region Already Locked?
* PARAMETERS: HandlerObj - Handler Object
* RegionObj - Region Object
* AcpiNsIsLocked - Namespace Region Already Locked?
*
* RETURN: None
*
@ -1103,7 +1102,7 @@ UnlockAndExit:
*
* RETURN: Status
*
* DESCRIPTION: Run _REG methods for the Space ID;
* DESCRIPTION: Run all _REG methods for the input Space ID;
* Note: assumes namespace is locked, or system init time.
*
******************************************************************************/

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: evrgnini- ACPI AddressSpace (OpRegion) init
* $Revision: 73 $
* $Revision: 74 $
*
*****************************************************************************/
@ -129,7 +129,7 @@
*
* FUNCTION: AcpiEvSystemMemoryRegionSetup
*
* PARAMETERS: RegionObj - Region we are interested in
* PARAMETERS: Handle - Region we are interested in
* Function - Start or stop
* HandlerContext - Address space handler context
* RegionContext - Region specific context
@ -186,7 +186,7 @@ AcpiEvSystemMemoryRegionSetup (
*
* FUNCTION: AcpiEvIoSpaceRegionSetup
*
* PARAMETERS: RegionObj - Region we are interested in
* PARAMETERS: Handle - Region we are interested in
* Function - Start or stop
* HandlerContext - Address space handler context
* RegionContext - Region specific context
@ -224,7 +224,7 @@ AcpiEvIoSpaceRegionSetup (
*
* FUNCTION: AcpiEvPciConfigRegionSetup
*
* PARAMETERS: RegionObj - Region we are interested in
* PARAMETERS: Handle - Region we are interested in
* Function - Start or stop
* HandlerContext - Address space handler context
* RegionContext - Region specific context
@ -413,7 +413,7 @@ AcpiEvPciConfigRegionSetup (
*
* FUNCTION: AcpiEvPciBarRegionSetup
*
* PARAMETERS: RegionObj - Region we are interested in
* PARAMETERS: Handle - Region we are interested in
* Function - Start or stop
* HandlerContext - Address space handler context
* RegionContext - Region specific context
@ -444,7 +444,7 @@ AcpiEvPciBarRegionSetup (
*
* FUNCTION: AcpiEvCmosRegionSetup
*
* PARAMETERS: RegionObj - Region we are interested in
* PARAMETERS: Handle - Region we are interested in
* Function - Start or stop
* HandlerContext - Address space handler context
* RegionContext - Region specific context
@ -475,7 +475,7 @@ AcpiEvCmosRegionSetup (
*
* FUNCTION: AcpiEvDefaultRegionSetup
*
* PARAMETERS: RegionObj - Region we are interested in
* PARAMETERS: Handle - Region we are interested in
* Function - Start or stop
* HandlerContext - Address space handler context
* RegionContext - Region specific context

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: evxface - External interfaces for ACPI events
* $Revision: 145 $
* $Revision: 147 $
*
*****************************************************************************/
@ -126,6 +126,53 @@
ACPI_MODULE_NAME ("evxface")
/*******************************************************************************
*
* FUNCTION: AcpiInstallExceptionHandler
*
* PARAMETERS: Handler - Pointer to the handler function for the
* event
*
* RETURN: Status
*
* DESCRIPTION: Saves the pointer to the handler function
*
******************************************************************************/
ACPI_STATUS
AcpiInstallExceptionHandler (
ACPI_EXCEPTION_HANDLER Handler)
{
ACPI_STATUS Status;
ACPI_FUNCTION_TRACE ("AcpiInstallExceptionHandler");
Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
if (ACPI_FAILURE (Status))
{
return_ACPI_STATUS (Status);
}
/* Don't allow two handlers. */
if (AcpiGbl_ExceptionHandler)
{
Status = AE_ALREADY_EXISTS;
goto Cleanup;
}
/* Install the handler */
AcpiGbl_ExceptionHandler = Handler;
Cleanup:
(void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS);
return_ACPI_STATUS (Status);
}
/*******************************************************************************
*
* FUNCTION: AcpiInstallFixedEventHandler
@ -461,6 +508,7 @@ UnlockAndExit:
* ACPI_DEVICE_NOTIFY: DriverHandler (80-ff)
* ACPI_ALL_NOTIFY: both system and device
* Handler - Address of the handler
*
* RETURN: Status
*
* DESCRIPTION: Remove a handler for notifies on an ACPI device
@ -506,9 +554,8 @@ AcpiRemoveNotifyHandler (
goto UnlockAndExit;
}
/*
* Root Object
*/
/* Root Object */
if (Device == ACPI_ROOT_OBJECT)
{
ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Removing notify handler for ROOT object.\n"));
@ -537,9 +584,8 @@ AcpiRemoveNotifyHandler (
}
}
/*
* All Other Objects
*/
/* All Other Objects */
else
{
/* Notifies allowed on this object? */

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: exconfig - Namespace reconfiguration (Load/Unload opcodes)
* $Revision: 78 $
* $Revision: 79 $
*
*****************************************************************************/
@ -171,7 +171,7 @@ AcpiExAddTable (
ACPI_MEMSET (&TableInfo, 0, sizeof (ACPI_TABLE_DESC));
TableInfo.Type = 5;
TableInfo.Type = ACPI_TABLE_SSDT;
TableInfo.Pointer = Table;
TableInfo.Length = (ACPI_SIZE) Table->Length;
TableInfo.Allocation = ACPI_MEM_ALLOCATED;

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: exconvrt - Object conversion routines
* $Revision: 53 $
* $Revision: 59 $
*
*****************************************************************************/
@ -133,7 +133,7 @@
* PARAMETERS: ObjDesc - Object to be converted. Must be an
* Integer, Buffer, or String
* ResultDesc - Where the new Integer object is returned
* WalkState - Current method state
* Flags - Used for string conversion
*
* RETURN: Status
*
@ -145,13 +145,13 @@ ACPI_STATUS
AcpiExConvertToInteger (
ACPI_OPERAND_OBJECT *ObjDesc,
ACPI_OPERAND_OBJECT **ResultDesc,
ACPI_WALK_STATE *WalkState)
UINT32 Flags)
{
UINT32 i;
ACPI_OPERAND_OBJECT *RetDesc;
UINT32 Count;
ACPI_OPERAND_OBJECT *ReturnDesc;
UINT8 *Pointer;
ACPI_INTEGER Result;
UINT32 i;
UINT32 Count;
ACPI_STATUS Status;
@ -161,15 +161,17 @@ AcpiExConvertToInteger (
switch (ACPI_GET_OBJECT_TYPE (ObjDesc))
{
case ACPI_TYPE_INTEGER:
/* No conversion necessary */
*ResultDesc = ObjDesc;
return_ACPI_STATUS (AE_OK);
case ACPI_TYPE_STRING:
Pointer = (UINT8 *) ObjDesc->String.Pointer;
Count = ObjDesc->String.Length;
break;
case ACPI_TYPE_BUFFER:
case ACPI_TYPE_STRING:
/* Note: Takes advantage of common buffer/string fields */
Pointer = ObjDesc->Buffer.Pointer;
Count = ObjDesc->Buffer.Length;
break;
@ -189,13 +191,6 @@ AcpiExConvertToInteger (
*/
Result = 0;
/* Transfer no more than an integer's worth of data */
if (Count > AcpiGbl_IntegerByteWidth)
{
Count = AcpiGbl_IntegerByteWidth;
}
/*
* String conversion is different than Buffer conversion
*/
@ -204,10 +199,12 @@ AcpiExConvertToInteger (
case ACPI_TYPE_STRING:
/*
* Convert string to an integer
* String must be hexadecimal as per the ACPI specification
* Convert string to an integer - for most cases, the string must be
* hexadecimal as per the ACPI specification. The only exception (as
* of ACPI 3.0) is that the ToInteger() operator allows both decimal
* and hexadecimal strings (hex prefixed with "0x").
*/
Status = AcpiUtStrtoul64 ((char *) Pointer, 16, &Result);
Status = AcpiUtStrtoul64 ((char *) Pointer, Flags, &Result);
if (ACPI_FAILURE (Status))
{
return_ACPI_STATUS (Status);
@ -217,9 +214,16 @@ AcpiExConvertToInteger (
case ACPI_TYPE_BUFFER:
/* Transfer no more than an integer's worth of data */
if (Count > AcpiGbl_IntegerByteWidth)
{
Count = AcpiGbl_IntegerByteWidth;
}
/*
* Buffer conversion - we simply grab enough raw data from the
* buffer to fill an integer
* Convert buffer to an integer - we simply grab enough raw data
* from the buffer to fill an integer
*/
for (i = 0; i < Count; i++)
{
@ -241,30 +245,17 @@ AcpiExConvertToInteger (
/*
* Create a new integer
*/
RetDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
if (!RetDesc)
ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
if (!ReturnDesc)
{
return_ACPI_STATUS (AE_NO_MEMORY);
}
/* Save the Result */
RetDesc->Integer.Value = Result;
/*
* If we are about to overwrite the original object on the operand stack,
* we must remove a reference on the original object because we are
* essentially removing it from the stack.
*/
if (*ResultDesc == ObjDesc)
{
if (WalkState->Opcode != AML_STORE_OP)
{
AcpiUtRemoveReference (ObjDesc);
}
}
*ResultDesc = RetDesc;
ReturnDesc->Integer.Value = Result;
AcpiExTruncateFor32bitTable (ReturnDesc);
*ResultDesc = ReturnDesc;
return_ACPI_STATUS (AE_OK);
}
@ -276,7 +267,6 @@ AcpiExConvertToInteger (
* PARAMETERS: ObjDesc - Object to be converted. Must be an
* Integer, Buffer, or String
* ResultDesc - Where the new buffer object is returned
* WalkState - Current method state
*
* RETURN: Status
*
@ -287,11 +277,9 @@ AcpiExConvertToInteger (
ACPI_STATUS
AcpiExConvertToBuffer (
ACPI_OPERAND_OBJECT *ObjDesc,
ACPI_OPERAND_OBJECT **ResultDesc,
ACPI_WALK_STATE *WalkState)
ACPI_OPERAND_OBJECT **ResultDesc)
{
ACPI_OPERAND_OBJECT *RetDesc;
UINT32 i;
ACPI_OPERAND_OBJECT *ReturnDesc;
UINT8 *NewBuf;
@ -314,19 +302,18 @@ AcpiExConvertToBuffer (
* Create a new Buffer object.
* Need enough space for one integer
*/
RetDesc = AcpiUtCreateBufferObject (AcpiGbl_IntegerByteWidth);
if (!RetDesc)
ReturnDesc = AcpiUtCreateBufferObject (AcpiGbl_IntegerByteWidth);
if (!ReturnDesc)
{
return_ACPI_STATUS (AE_NO_MEMORY);
}
/* Copy the integer to the buffer */
/* Copy the integer to the buffer, LSB first */
NewBuf = RetDesc->Buffer.Pointer;
for (i = 0; i < AcpiGbl_IntegerByteWidth; i++)
{
NewBuf[i] = (UINT8) (ObjDesc->Integer.Value >> (i * 8));
}
NewBuf = ReturnDesc->Buffer.Pointer;
ACPI_MEMCPY (NewBuf,
&ObjDesc->Integer.Value,
AcpiGbl_IntegerByteWidth);
break;
@ -336,15 +323,15 @@ AcpiExConvertToBuffer (
* Create a new Buffer object
* Size will be the string length
*/
RetDesc = AcpiUtCreateBufferObject ((ACPI_SIZE) ObjDesc->String.Length);
if (!RetDesc)
ReturnDesc = AcpiUtCreateBufferObject ((ACPI_SIZE) ObjDesc->String.Length);
if (!ReturnDesc)
{
return_ACPI_STATUS (AE_NO_MEMORY);
}
/* Copy the string to the buffer */
NewBuf = RetDesc->Buffer.Pointer;
NewBuf = ReturnDesc->Buffer.Pointer;
ACPI_STRNCPY ((char *) NewBuf, (char *) ObjDesc->String.Pointer,
ObjDesc->String.Length);
break;
@ -356,34 +343,20 @@ AcpiExConvertToBuffer (
/* Mark buffer initialized */
RetDesc->Common.Flags |= AOPOBJ_DATA_VALID;
/*
* If we are about to overwrite the original object on the operand stack,
* we must remove a reference on the original object because we are
* essentially removing it from the stack.
*/
if (*ResultDesc == ObjDesc)
{
if (WalkState->Opcode != AML_STORE_OP)
{
AcpiUtRemoveReference (ObjDesc);
}
}
*ResultDesc = RetDesc;
ReturnDesc->Common.Flags |= AOPOBJ_DATA_VALID;
*ResultDesc = ReturnDesc;
return_ACPI_STATUS (AE_OK);
}
/*******************************************************************************
*
* FUNCTION: AcpiExConvertAscii
* FUNCTION: AcpiExConvertToAscii
*
* PARAMETERS: Integer - Value to be converted
* Base - 10 or 16
* Base - ACPI_STRING_DECIMAL or ACPI_STRING_HEX
* String - Where the string is returned
* DataWidth - Size of data item to be converted
* DataWidth - Size of data item to be converted, in bytes
*
* RETURN: Actual string length
*
@ -394,57 +367,66 @@ AcpiExConvertToBuffer (
UINT32
AcpiExConvertToAscii (
ACPI_INTEGER Integer,
UINT32 Base,
UINT16 Base,
UINT8 *String,
UINT8 DataWidth)
{
UINT32 i;
UINT32 j;
UINT32 k = 0;
char HexDigit;
ACPI_INTEGER Digit;
ACPI_NATIVE_UINT i;
ACPI_NATIVE_UINT j;
ACPI_NATIVE_UINT k = 0;
ACPI_NATIVE_UINT HexLength;
ACPI_NATIVE_UINT DecimalLength;
UINT32 Remainder;
UINT32 Length;
BOOLEAN LeadingZero;
BOOLEAN SupressZeros;
ACPI_FUNCTION_ENTRY ();
if (DataWidth < sizeof (ACPI_INTEGER))
{
LeadingZero = FALSE;
Length = DataWidth;
}
else
{
LeadingZero = TRUE;
Length = sizeof (ACPI_INTEGER);
}
switch (Base)
{
case 10:
/* Setup max length for the decimal number */
switch (DataWidth)
{
case 1:
DecimalLength = ACPI_MAX8_DECIMAL_DIGITS;
break;
case 4:
DecimalLength = ACPI_MAX32_DECIMAL_DIGITS;
break;
case 8:
default:
DecimalLength = ACPI_MAX64_DECIMAL_DIGITS;
break;
}
SupressZeros = TRUE; /* No leading zeros */
Remainder = 0;
for (i = ACPI_MAX_DECIMAL_DIGITS; i > 0; i--)
for (i = DecimalLength; i > 0; i--)
{
/* Divide by nth factor of 10 */
Digit = Integer;
for (j = 0; j < i; j++)
{
(void) AcpiUtShortDivide (&Digit, 10, &Digit, &Remainder);
(void) AcpiUtShortDivide (Digit, 10, &Digit, &Remainder);
}
/* Create the decimal digit */
/* Handle leading zeros */
if (Remainder != 0)
{
LeadingZero = FALSE;
SupressZeros = FALSE;
}
if (!LeadingZero)
if (!SupressZeros)
{
String[k] = (UINT8) (ACPI_ASCII_ZERO + Remainder);
k++;
@ -452,31 +434,21 @@ AcpiExConvertToAscii (
}
break;
case 16:
/* Copy the integer to the buffer */
HexLength = ACPI_MUL_2 (DataWidth); /* 2 ascii hex chars per data byte */
for (i = 0, j = ((Length * 2) -1); i < (Length * 2); i++, j--)
for (i = 0, j = (HexLength-1); i < HexLength; i++, j--)
{
/* Get one hex digit, most significant digits first */
HexDigit = AcpiUtHexToAsciiChar (Integer, (j * 4));
if (HexDigit != ACPI_ASCII_ZERO)
{
LeadingZero = FALSE;
}
if (!LeadingZero)
{
String[k] = (UINT8) HexDigit;
k++;
}
String[k] = (UINT8) AcpiUtHexToAsciiChar (Integer, ACPI_MUL_4 (j));
k++;
}
break;
default:
break;
return (0);
}
/*
@ -492,7 +464,7 @@ AcpiExConvertToAscii (
}
String [k] = 0;
return (k);
return ((UINT32) k);
}
@ -501,11 +473,9 @@ AcpiExConvertToAscii (
* FUNCTION: AcpiExConvertToString
*
* PARAMETERS: ObjDesc - Object to be converted. Must be an
* Integer, Buffer, or String
* Integer, Buffer, or String
* ResultDesc - Where the string object is returned
* Base - 10 or 16
* MaxLength - Max length of the returned string
* WalkState - Current method state
* Type - String flags (base and conversion type)
*
* RETURN: Status
*
@ -517,15 +487,14 @@ ACPI_STATUS
AcpiExConvertToString (
ACPI_OPERAND_OBJECT *ObjDesc,
ACPI_OPERAND_OBJECT **ResultDesc,
UINT32 Base,
UINT32 MaxLength,
ACPI_WALK_STATE *WalkState)
UINT32 Type)
{
ACPI_OPERAND_OBJECT *RetDesc;
ACPI_OPERAND_OBJECT *ReturnDesc;
UINT8 *NewBuf;
UINT8 *Pointer;
UINT32 StringLength;
UINT32 StringLength = 0;
UINT16 Base = 16;
UINT32 i;
UINT8 Separator = ',';
ACPI_FUNCTION_TRACE_PTR ("ExConvertToString", ObjDesc);
@ -535,146 +504,137 @@ AcpiExConvertToString (
{
case ACPI_TYPE_STRING:
if (MaxLength >= ObjDesc->String.Length)
{
*ResultDesc = ObjDesc;
return_ACPI_STATUS (AE_OK);
}
else
{
/* Must copy the string first and then truncate it */
/* No conversion necessary */
return_ACPI_STATUS (AE_NOT_IMPLEMENTED);
}
*ResultDesc = ObjDesc;
return_ACPI_STATUS (AE_OK);
case ACPI_TYPE_INTEGER:
StringLength = AcpiGbl_IntegerByteWidth * 2;
if (Base == 10)
switch (Type)
{
case ACPI_EXPLICIT_CONVERT_DECIMAL:
/* Make room for maximum decimal number */
StringLength = ACPI_MAX_DECIMAL_DIGITS;
Base = 10;
break;
default:
/* Two hex string characters for each integer byte */
StringLength = ACPI_MUL_2 (AcpiGbl_IntegerByteWidth);
break;
}
/*
* Create a new String
* Need enough space for one ASCII integer (plus null terminator)
*/
RetDesc = AcpiUtCreateInternalObject (ACPI_TYPE_STRING);
if (!RetDesc)
ReturnDesc = AcpiUtCreateStringObject ((ACPI_SIZE) StringLength);
if (!ReturnDesc)
{
return_ACPI_STATUS (AE_NO_MEMORY);
}
/* Need enough space for one ASCII integer plus null terminator */
NewBuf = ReturnDesc->Buffer.Pointer;
NewBuf = ACPI_MEM_CALLOCATE ((ACPI_SIZE) StringLength + 1);
if (!NewBuf)
{
ACPI_REPORT_ERROR
(("ExConvertToString: Buffer allocation failure\n"));
AcpiUtRemoveReference (RetDesc);
return_ACPI_STATUS (AE_NO_MEMORY);
}
/* Convert integer to string */
/* Convert */
i = AcpiExConvertToAscii (ObjDesc->Integer.Value, Base, NewBuf, sizeof (ACPI_INTEGER));
StringLength = AcpiExConvertToAscii (ObjDesc->Integer.Value, Base,
NewBuf, AcpiGbl_IntegerByteWidth);
/* Null terminate at the correct place */
if (MaxLength < i)
{
NewBuf[MaxLength] = 0;
RetDesc->String.Length = MaxLength;
}
else
{
NewBuf [i] = 0;
RetDesc->String.Length = i;
}
RetDesc->Buffer.Pointer = NewBuf;
ReturnDesc->String.Length = StringLength;
NewBuf [StringLength] = 0;
break;
case ACPI_TYPE_BUFFER:
/* Find the string length */
Pointer = ObjDesc->Buffer.Pointer;
for (StringLength = 0; StringLength < ObjDesc->Buffer.Length; StringLength++)
switch (Type)
{
/* Exit on null terminator */
case ACPI_EXPLICIT_CONVERT_DECIMAL: /* Used by ToDecimalString operator */
/*
* From ACPI: "If Data is a buffer, it is converted to a string of
* decimal values separated by commas."
*/
Base = 10;
StringLength = ObjDesc->Buffer.Length; /* 4 chars for each decimal */
if (!Pointer[StringLength])
/*lint -fallthrough */
case ACPI_IMPLICIT_CONVERT_HEX:
/*
* From the ACPI spec:
*"The entire contents of the buffer are converted to a string of
* two-character hexadecimal numbers, each separated by a space."
*/
if (Type == ACPI_IMPLICIT_CONVERT_HEX)
{
break;
Separator = ' ';
}
}
if (MaxLength > ACPI_MAX_STRING_CONVERSION)
{
if (StringLength > ACPI_MAX_STRING_CONVERSION)
/*lint -fallthrough */
case ACPI_EXPLICIT_CONVERT_HEX: /* Used by ToHexString operator */
/*
* From ACPI: "If Data is a buffer, it is converted to a string of
* hexadecimal values separated by commas."
*/
StringLength += (ObjDesc->Buffer.Length * 3);
if (StringLength > ACPI_MAX_STRING_CONVERSION) /* ACPI limit */
{
return_ACPI_STATUS (AE_AML_STRING_LIMIT);
}
/* Create a new string object and string buffer */
ReturnDesc = AcpiUtCreateStringObject ((ACPI_SIZE) StringLength -1);
if (!ReturnDesc)
{
return_ACPI_STATUS (AE_NO_MEMORY);
}
NewBuf = ReturnDesc->Buffer.Pointer;
/*
* Convert buffer bytes to hex or decimal values
* (separated by commas)
*/
for (i = 0; i < ObjDesc->Buffer.Length; i++)
{
NewBuf += AcpiExConvertToAscii (
(ACPI_INTEGER) ObjDesc->Buffer.Pointer[i], Base,
NewBuf, 1);
*NewBuf++ = Separator; /* each separated by a comma or space */
}
/* Null terminate the string (overwrites final comma from above) */
NewBuf--;
*NewBuf = 0;
/* Recalculate length */
ReturnDesc->String.Length = (UINT32)
ACPI_STRLEN (ReturnDesc->String.Pointer);
break;
default:
return_ACPI_STATUS (AE_BAD_PARAMETER);
}
/*
* Create a new string object
*/
RetDesc = AcpiUtCreateInternalObject (ACPI_TYPE_STRING);
if (!RetDesc)
{
return_ACPI_STATUS (AE_NO_MEMORY);
}
/* String length is the lesser of the Max or the actual length */
if (MaxLength < StringLength)
{
StringLength = MaxLength;
}
NewBuf = ACPI_MEM_CALLOCATE ((ACPI_SIZE) StringLength + 1);
if (!NewBuf)
{
ACPI_REPORT_ERROR
(("ExConvertToString: Buffer allocation failure\n"));
AcpiUtRemoveReference (RetDesc);
return_ACPI_STATUS (AE_NO_MEMORY);
}
/* Copy the appropriate number of buffer characters */
ACPI_MEMCPY (NewBuf, Pointer, StringLength);
/* Null terminate */
NewBuf [StringLength] = 0;
RetDesc->Buffer.Pointer = NewBuf;
RetDesc->String.Length = StringLength;
break;
default:
return_ACPI_STATUS (AE_TYPE);
}
/*
* If we are about to overwrite the original object on the operand stack,
* we must remove a reference on the original object because we are
* essentially removing it from the stack.
*/
if (*ResultDesc == ObjDesc)
{
if (WalkState->Opcode != AML_STORE_OP)
{
AcpiUtRemoveReference (ObjDesc);
}
}
*ResultDesc = RetDesc;
*ResultDesc = ReturnDesc;
return_ACPI_STATUS (AE_OK);
}
@ -756,7 +716,8 @@ AcpiExConvertToTargetType (
* These types require an Integer operand. We can convert
* a Buffer or a String to an Integer if necessary.
*/
Status = AcpiExConvertToInteger (SourceDesc, ResultDesc, WalkState);
Status = AcpiExConvertToInteger (SourceDesc, ResultDesc,
16);
break;
@ -766,7 +727,8 @@ AcpiExConvertToTargetType (
* The operand must be a String. We can convert an
* Integer or Buffer if necessary
*/
Status = AcpiExConvertToString (SourceDesc, ResultDesc, 16, ACPI_UINT32_MAX, WalkState);
Status = AcpiExConvertToString (SourceDesc, ResultDesc,
ACPI_IMPLICIT_CONVERT_HEX);
break;
@ -776,7 +738,7 @@ AcpiExConvertToTargetType (
* The operand must be a Buffer. We can convert an
* Integer or String if necessary
*/
Status = AcpiExConvertToBuffer (SourceDesc, ResultDesc, WalkState);
Status = AcpiExConvertToBuffer (SourceDesc, ResultDesc);
break;

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: exdump - Interpreter debug output routines
* $Revision: 173 $
* $Revision: 176 $
*
*****************************************************************************/
@ -129,7 +129,6 @@
/*
* The following routines are used for debug output only
*/
#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
/*****************************************************************************
@ -138,7 +137,7 @@
*
* PARAMETERS: *ObjDesc - Pointer to entry to be dumped
*
* RETURN: Status
* RETURN: None
*
* DESCRIPTION: Dump an operand object
*
@ -146,12 +145,11 @@
void
AcpiExDumpOperand (
ACPI_OPERAND_OBJECT *ObjDesc)
ACPI_OPERAND_OBJECT *ObjDesc,
UINT32 Depth)
{
UINT8 *Buf = NULL;
UINT32 Length;
ACPI_OPERAND_OBJECT **Element;
UINT16 ElementIndex;
UINT32 Index;
ACPI_FUNCTION_NAME ("ExDumpOperand")
@ -165,9 +163,9 @@ AcpiExDumpOperand (
if (!ObjDesc)
{
/*
* This usually indicates that something serious is wrong
* This could be a null element of a package
*/
AcpiOsPrintf ("Null Object Descriptor\n");
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Null Object Descriptor\n"));
return;
}
@ -181,15 +179,24 @@ AcpiExDumpOperand (
if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND)
{
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
"%p is not a node or operand object: [%s]\n",
ObjDesc, AcpiUtGetDescriptorName (ObjDesc)));
"%p is not a node or operand object: [%s]\n",
ObjDesc, AcpiUtGetDescriptorName (ObjDesc)));
ACPI_DUMP_BUFFER (ObjDesc, sizeof (ACPI_OPERAND_OBJECT));
return;
}
/* ObjDesc is a valid object */
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p ", ObjDesc));
if (Depth > 0)
{
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%*s[%u] %p ",
Depth, " ", Depth, ObjDesc));
}
else
{
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p ", ObjDesc));
}
switch (ACPI_GET_OBJECT_TYPE (ObjDesc))
{
@ -205,8 +212,8 @@ AcpiExDumpOperand (
case AML_NAME_OP:
ACPI_DUMP_PATHNAME (ObjDesc->Reference.Object, "Reference: Name: ",
ACPI_LV_INFO, _COMPONENT);
ACPI_DUMP_PATHNAME (ObjDesc->Reference.Object,
"Reference: Name: ", ACPI_LV_INFO, _COMPONENT);
ACPI_DUMP_ENTRY (ObjDesc->Reference.Object, ACPI_LV_INFO);
break;
@ -214,28 +221,28 @@ AcpiExDumpOperand (
case AML_INDEX_OP:
AcpiOsPrintf ("Reference: Index %p\n",
ObjDesc->Reference.Object);
ObjDesc->Reference.Object);
break;
case AML_REF_OF_OP:
AcpiOsPrintf ("Reference: (RefOf) %p\n",
ObjDesc->Reference.Object);
ObjDesc->Reference.Object);
break;
case AML_ARG_OP:
AcpiOsPrintf ("Reference: Arg%d",
ObjDesc->Reference.Offset);
ObjDesc->Reference.Offset);
if (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_INTEGER)
{
/* Value is an Integer */
AcpiOsPrintf (" value is [%8.8X%8.8x]",
ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
}
AcpiOsPrintf ("\n");
@ -245,7 +252,7 @@ AcpiExDumpOperand (
case AML_LOCAL_OP:
AcpiOsPrintf ("Reference: Local%d",
ObjDesc->Reference.Offset);
ObjDesc->Reference.Offset);
if (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_INTEGER)
{
@ -253,7 +260,7 @@ AcpiExDumpOperand (
/* Value is an Integer */
AcpiOsPrintf (" value is [%8.8X%8.8x]",
ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
}
AcpiOsPrintf ("\n");
@ -263,7 +270,7 @@ AcpiExDumpOperand (
case AML_INT_NAMEPATH_OP:
AcpiOsPrintf ("Reference.Node->Name %X\n",
ObjDesc->Reference.Node->Name.Integer);
ObjDesc->Reference.Node->Name.Integer);
break;
@ -276,18 +283,15 @@ AcpiExDumpOperand (
break;
}
break;
case ACPI_TYPE_BUFFER:
AcpiOsPrintf ("Buffer len %X @ %p \n",
ObjDesc->Buffer.Length,
ObjDesc->Buffer.Pointer);
ObjDesc->Buffer.Length, ObjDesc->Buffer.Pointer);
Length = ObjDesc->Buffer.Length;
if (Length > 64)
{
Length = 64;
@ -299,44 +303,40 @@ AcpiExDumpOperand (
{
AcpiOsPrintf ("Buffer Contents: ");
for (Buf = ObjDesc->Buffer.Pointer; Length--; ++Buf)
for (Index = 0; Index < Length; Index++)
{
AcpiOsPrintf (" %02x", *Buf);
AcpiOsPrintf (" %02x", ObjDesc->Buffer.Pointer[Index]);
}
AcpiOsPrintf ("\n");
}
break;
case ACPI_TYPE_INTEGER:
AcpiOsPrintf ("Integer %8.8X%8.8X\n",
ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
break;
case ACPI_TYPE_PACKAGE:
AcpiOsPrintf ("Package count %X @ %p\n",
ObjDesc->Package.Count, ObjDesc->Package.Elements);
AcpiOsPrintf ("Package [Len %X] ElementArray %p\n",
ObjDesc->Package.Count, ObjDesc->Package.Elements);
/*
* If elements exist, package vector pointer is valid,
* If elements exist, package element pointer is valid,
* and debug_level exceeds 1, dump package's elements.
*/
if (ObjDesc->Package.Count &&
ObjDesc->Package.Elements &&
AcpiDbgLevel > 1)
{
for (ElementIndex = 0, Element = ObjDesc->Package.Elements;
ElementIndex < ObjDesc->Package.Count;
++ElementIndex, ++Element)
for (Index = 0; Index < ObjDesc->Package.Count; Index++)
{
AcpiExDumpOperand (*Element);
AcpiExDumpOperand (ObjDesc->Package.Elements[Index], Depth+1);
}
}
AcpiOsPrintf ("\n");
break;
@ -366,7 +366,7 @@ AcpiExDumpOperand (
case ACPI_TYPE_STRING:
AcpiOsPrintf ("String length %X @ %p ",
ObjDesc->String.Length, ObjDesc->String.Pointer);
ObjDesc->String.Length, ObjDesc->String.Pointer);
AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX);
AcpiOsPrintf ("\n");
break;
@ -386,7 +386,7 @@ AcpiExDumpOperand (
ObjDesc->Field.FieldFlags & AML_FIELD_LOCK_RULE_MASK,
ObjDesc->Field.FieldFlags & AML_FIELD_UPDATE_RULE_MASK,
ObjDesc->Field.BaseByteOffset, ObjDesc->Field.StartFieldBitOffset);
ACPI_DUMP_STACK_ENTRY (ObjDesc->Field.RegionObj);
AcpiExDumpOperand (ObjDesc->Field.RegionObj, Depth+1);
break;
@ -413,9 +413,8 @@ AcpiExDumpOperand (
}
else
{
ACPI_DUMP_STACK_ENTRY (ObjDesc->BufferField.BufferObj);
AcpiExDumpOperand (ObjDesc->BufferField.BufferObj, Depth+1);
}
break;
@ -479,10 +478,13 @@ AcpiExDumpOperand (
*
* FUNCTION: AcpiExDumpOperands
*
* PARAMETERS: InterpreterMode - Load or Exec
* *Ident - Identification
* PARAMETERS: Operands - Operand list
* InterpreterMode - Load or Exec
* Ident - Identification
* NumLevels - # of stack entries to dump above line
* *Note - Output notation
* Note - Output notation
* ModuleName - Caller's module name
* LineNumber - Caller's invocation line number
*
* DESCRIPTION: Dump the object stack
*
@ -499,7 +501,6 @@ AcpiExDumpOperands (
UINT32 LineNumber)
{
ACPI_NATIVE_UINT i;
ACPI_OPERAND_OBJECT **ObjDesc;
ACPI_FUNCTION_NAME ("ExDumpOperands");
@ -528,8 +529,7 @@ AcpiExDumpOperands (
for (i = 0; NumLevels > 0; i--, NumLevels--)
{
ObjDesc = &Operands[i];
AcpiExDumpOperand (*ObjDesc);
AcpiExDumpOperand (Operands[i], 0);
}
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
@ -585,8 +585,7 @@ AcpiExOutAddress (
#if ACPI_MACHINE_WIDTH == 16
AcpiOsPrintf ("%20s : %p\n", Title, Value);
#else
AcpiOsPrintf ("%20s : %8.8X%8.8X\n", Title,
ACPI_FORMAT_UINT64 (Value));
AcpiOsPrintf ("%20s : %8.8X%8.8X\n", Title, ACPI_FORMAT_UINT64 (Value));
#endif
}
@ -595,7 +594,7 @@ AcpiExOutAddress (
*
* FUNCTION: AcpiExDumpNode
*
* PARAMETERS: *Node - Descriptor to dump
* PARAMETERS: *Node - Descriptor to dump
* Flags - Force display
*
* DESCRIPTION: Dumps the members of the given.Node
@ -664,23 +663,26 @@ AcpiExDumpObjectDescriptor (
if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED)
{
AcpiExDumpNode ((ACPI_NAMESPACE_NODE *) ObjDesc, Flags);
AcpiOsPrintf ("\nAttached Object (%p):\n", ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object);
AcpiExDumpObjectDescriptor (((ACPI_NAMESPACE_NODE *) ObjDesc)->Object, Flags);
return;
AcpiOsPrintf ("\nAttached Object (%p):\n",
((ACPI_NAMESPACE_NODE *) ObjDesc)->Object);
AcpiExDumpObjectDescriptor (
((ACPI_NAMESPACE_NODE *) ObjDesc)->Object, Flags);
return_VOID;
}
if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND)
{
AcpiOsPrintf ("ExDumpObjectDescriptor: %p is not an ACPI operand object: [%s]\n",
ObjDesc, AcpiUtGetDescriptorName (ObjDesc));
AcpiOsPrintf (
"ExDumpObjectDescriptor: %p is not an ACPI operand object: [%s]\n",
ObjDesc, AcpiUtGetDescriptorName (ObjDesc));
return_VOID;
}
/* Common Fields */
AcpiExOutString ("Type", AcpiUtGetObjectTypeName (ObjDesc));
AcpiExOutInteger ("Reference Count", ObjDesc->Common.ReferenceCount);
AcpiExOutInteger ("Flags", ObjDesc->Common.Flags);
AcpiExOutString ("Type", AcpiUtGetObjectTypeName (ObjDesc));
AcpiExOutInteger ("Reference Count", ObjDesc->Common.ReferenceCount);
AcpiExOutInteger ("Flags", ObjDesc->Common.Flags);
/* Object-specific Fields */
@ -695,7 +697,7 @@ AcpiExDumpObjectDescriptor (
case ACPI_TYPE_STRING:
AcpiExOutInteger ("Length", ObjDesc->String.Length);
AcpiExOutInteger ("Length", ObjDesc->String.Length);
AcpiOsPrintf ("%20s : %p ", "Pointer", ObjDesc->String.Pointer);
AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX);
@ -705,17 +707,17 @@ AcpiExDumpObjectDescriptor (
case ACPI_TYPE_BUFFER:
AcpiExOutInteger ("Length", ObjDesc->Buffer.Length);
AcpiExOutPointer ("Pointer", ObjDesc->Buffer.Pointer);
AcpiExOutInteger ("Length", ObjDesc->Buffer.Length);
AcpiExOutPointer ("Pointer", ObjDesc->Buffer.Pointer);
ACPI_DUMP_BUFFER (ObjDesc->Buffer.Pointer, ObjDesc->Buffer.Length);
break;
case ACPI_TYPE_PACKAGE:
AcpiExOutInteger ("Flags", ObjDesc->Package.Flags);
AcpiExOutInteger ("Count", ObjDesc->Package.Count);
AcpiExOutPointer ("Elements", ObjDesc->Package.Elements);
AcpiExOutInteger ("Flags", ObjDesc->Package.Flags);
AcpiExOutInteger ("Count", ObjDesc->Package.Count);
AcpiExOutPointer ("Elements", ObjDesc->Package.Elements);
/* Dump the package contents */
@ -727,7 +729,8 @@ AcpiExDumpObjectDescriptor (
AcpiOsPrintf ("[%.3d] %p", i, ObjDesc->Package.Elements[i]);
if (ObjDesc->Package.Elements[i])
{
AcpiOsPrintf (" %s", AcpiUtGetObjectTypeName (ObjDesc->Package.Elements[i]));
AcpiOsPrintf (" %s",
AcpiUtGetObjectTypeName (ObjDesc->Package.Elements[i]));
}
AcpiOsPrintf ("\n");
}
@ -745,66 +748,66 @@ AcpiExDumpObjectDescriptor (
case ACPI_TYPE_EVENT:
AcpiExOutPointer ("Semaphore", ObjDesc->Event.Semaphore);
AcpiExOutPointer ("Semaphore", ObjDesc->Event.Semaphore);
break;
case ACPI_TYPE_METHOD:
AcpiExOutInteger ("ParamCount", ObjDesc->Method.ParamCount);
AcpiExOutInteger ("Concurrency", ObjDesc->Method.Concurrency);
AcpiExOutPointer ("Semaphore", ObjDesc->Method.Semaphore);
AcpiExOutInteger ("OwningId", ObjDesc->Method.OwningId);
AcpiExOutInteger ("AmlLength", ObjDesc->Method.AmlLength);
AcpiExOutPointer ("AmlStart", ObjDesc->Method.AmlStart);
AcpiExOutInteger ("ParamCount", ObjDesc->Method.ParamCount);
AcpiExOutInteger ("Concurrency", ObjDesc->Method.Concurrency);
AcpiExOutPointer ("Semaphore", ObjDesc->Method.Semaphore);
AcpiExOutInteger ("OwningId", ObjDesc->Method.OwningId);
AcpiExOutInteger ("AmlLength", ObjDesc->Method.AmlLength);
AcpiExOutPointer ("AmlStart", ObjDesc->Method.AmlStart);
break;
case ACPI_TYPE_MUTEX:
AcpiExOutInteger ("SyncLevel", ObjDesc->Mutex.SyncLevel);
AcpiExOutPointer ("OwnerThread", ObjDesc->Mutex.OwnerThread);
AcpiExOutInteger ("AcquisitionDepth",ObjDesc->Mutex.AcquisitionDepth);
AcpiExOutPointer ("Semaphore", ObjDesc->Mutex.Semaphore);
AcpiExOutInteger ("SyncLevel", ObjDesc->Mutex.SyncLevel);
AcpiExOutPointer ("OwnerThread", ObjDesc->Mutex.OwnerThread);
AcpiExOutInteger ("AcquireDepth", ObjDesc->Mutex.AcquisitionDepth);
AcpiExOutPointer ("Semaphore", ObjDesc->Mutex.Semaphore);
break;
case ACPI_TYPE_REGION:
AcpiExOutInteger ("SpaceId", ObjDesc->Region.SpaceId);
AcpiExOutInteger ("Flags", ObjDesc->Region.Flags);
AcpiExOutAddress ("Address", ObjDesc->Region.Address);
AcpiExOutInteger ("Length", ObjDesc->Region.Length);
AcpiExOutPointer ("Handler", ObjDesc->Region.Handler);
AcpiExOutPointer ("Next", ObjDesc->Region.Next);
AcpiExOutInteger ("SpaceId", ObjDesc->Region.SpaceId);
AcpiExOutInteger ("Flags", ObjDesc->Region.Flags);
AcpiExOutAddress ("Address", ObjDesc->Region.Address);
AcpiExOutInteger ("Length", ObjDesc->Region.Length);
AcpiExOutPointer ("Handler", ObjDesc->Region.Handler);
AcpiExOutPointer ("Next", ObjDesc->Region.Next);
break;
case ACPI_TYPE_POWER:
AcpiExOutInteger ("SystemLevel", ObjDesc->PowerResource.SystemLevel);
AcpiExOutInteger ("ResourceOrder", ObjDesc->PowerResource.ResourceOrder);
AcpiExOutPointer ("SystemNotify", ObjDesc->PowerResource.SystemNotify);
AcpiExOutPointer ("DeviceNotify", ObjDesc->PowerResource.DeviceNotify);
AcpiExOutInteger ("SystemLevel", ObjDesc->PowerResource.SystemLevel);
AcpiExOutInteger ("ResourceOrder", ObjDesc->PowerResource.ResourceOrder);
AcpiExOutPointer ("SystemNotify", ObjDesc->PowerResource.SystemNotify);
AcpiExOutPointer ("DeviceNotify", ObjDesc->PowerResource.DeviceNotify);
break;
case ACPI_TYPE_PROCESSOR:
AcpiExOutInteger ("Processor ID", ObjDesc->Processor.ProcId);
AcpiExOutInteger ("Length", ObjDesc->Processor.Length);
AcpiExOutAddress ("Address", (ACPI_PHYSICAL_ADDRESS) ObjDesc->Processor.Address);
AcpiExOutPointer ("SystemNotify", ObjDesc->Processor.SystemNotify);
AcpiExOutPointer ("DeviceNotify", ObjDesc->Processor.DeviceNotify);
AcpiExOutPointer ("Handler", ObjDesc->Processor.Handler);
AcpiExOutInteger ("Processor ID", ObjDesc->Processor.ProcId);
AcpiExOutInteger ("Length", ObjDesc->Processor.Length);
AcpiExOutAddress ("Address", (ACPI_PHYSICAL_ADDRESS) ObjDesc->Processor.Address);
AcpiExOutPointer ("SystemNotify", ObjDesc->Processor.SystemNotify);
AcpiExOutPointer ("DeviceNotify", ObjDesc->Processor.DeviceNotify);
AcpiExOutPointer ("Handler", ObjDesc->Processor.Handler);
break;
case ACPI_TYPE_THERMAL:
AcpiExOutPointer ("SystemNotify", ObjDesc->ThermalZone.SystemNotify);
AcpiExOutPointer ("DeviceNotify", ObjDesc->ThermalZone.DeviceNotify);
AcpiExOutPointer ("Handler", ObjDesc->ThermalZone.Handler);
AcpiExOutPointer ("SystemNotify", ObjDesc->ThermalZone.SystemNotify);
AcpiExOutPointer ("DeviceNotify", ObjDesc->ThermalZone.DeviceNotify);
AcpiExOutPointer ("Handler", ObjDesc->ThermalZone.Handler);
break;
@ -813,36 +816,36 @@ AcpiExDumpObjectDescriptor (
case ACPI_TYPE_LOCAL_BANK_FIELD:
case ACPI_TYPE_LOCAL_INDEX_FIELD:
AcpiExOutInteger ("FieldFlags", ObjDesc->CommonField.FieldFlags);
AcpiExOutInteger ("AccessByteWidth", ObjDesc->CommonField.AccessByteWidth);
AcpiExOutInteger ("BitLength", ObjDesc->CommonField.BitLength);
AcpiExOutInteger ("FldBitOffset", ObjDesc->CommonField.StartFieldBitOffset);
AcpiExOutInteger ("BaseByteOffset", ObjDesc->CommonField.BaseByteOffset);
AcpiExOutInteger ("DatumValidBits", ObjDesc->CommonField.DatumValidBits);
AcpiExOutInteger ("EndFldValidBits", ObjDesc->CommonField.EndFieldValidBits);
AcpiExOutInteger ("EndBufValidBits", ObjDesc->CommonField.EndBufferValidBits);
AcpiExOutPointer ("ParentNode", ObjDesc->CommonField.Node);
AcpiExOutInteger ("FieldFlags", ObjDesc->CommonField.FieldFlags);
AcpiExOutInteger ("AccessByteWidth",ObjDesc->CommonField.AccessByteWidth);
AcpiExOutInteger ("BitLength", ObjDesc->CommonField.BitLength);
AcpiExOutInteger ("FldBitOffset", ObjDesc->CommonField.StartFieldBitOffset);
AcpiExOutInteger ("BaseByteOffset", ObjDesc->CommonField.BaseByteOffset);
AcpiExOutInteger ("DatumValidBits", ObjDesc->CommonField.DatumValidBits);
AcpiExOutInteger ("EndFldValidBits",ObjDesc->CommonField.EndFieldValidBits);
AcpiExOutInteger ("EndBufValidBits",ObjDesc->CommonField.EndBufferValidBits);
AcpiExOutPointer ("ParentNode", ObjDesc->CommonField.Node);
switch (ACPI_GET_OBJECT_TYPE (ObjDesc))
{
case ACPI_TYPE_BUFFER_FIELD:
AcpiExOutPointer ("BufferObj", ObjDesc->BufferField.BufferObj);
AcpiExOutPointer ("BufferObj", ObjDesc->BufferField.BufferObj);
break;
case ACPI_TYPE_LOCAL_REGION_FIELD:
AcpiExOutPointer ("RegionObj", ObjDesc->Field.RegionObj);
AcpiExOutPointer ("RegionObj", ObjDesc->Field.RegionObj);
break;
case ACPI_TYPE_LOCAL_BANK_FIELD:
AcpiExOutInteger ("Value", ObjDesc->BankField.Value);
AcpiExOutPointer ("RegionObj", ObjDesc->BankField.RegionObj);
AcpiExOutPointer ("BankObj", ObjDesc->BankField.BankObj);
AcpiExOutInteger ("Value", ObjDesc->BankField.Value);
AcpiExOutPointer ("RegionObj", ObjDesc->BankField.RegionObj);
AcpiExOutPointer ("BankObj", ObjDesc->BankField.BankObj);
break;
case ACPI_TYPE_LOCAL_INDEX_FIELD:
AcpiExOutInteger ("Value", ObjDesc->IndexField.Value);
AcpiExOutPointer ("Index", ObjDesc->IndexField.IndexObj);
AcpiExOutPointer ("Data", ObjDesc->IndexField.DataObj);
AcpiExOutInteger ("Value", ObjDesc->IndexField.Value);
AcpiExOutPointer ("Index", ObjDesc->IndexField.IndexObj);
AcpiExOutPointer ("Data", ObjDesc->IndexField.DataObj);
break;
default:
@ -854,29 +857,29 @@ AcpiExDumpObjectDescriptor (
case ACPI_TYPE_LOCAL_REFERENCE:
AcpiExOutInteger ("TargetType", ObjDesc->Reference.TargetType);
AcpiExOutString ("Opcode", (AcpiPsGetOpcodeInfo (ObjDesc->Reference.Opcode))->Name);
AcpiExOutInteger ("Offset", ObjDesc->Reference.Offset);
AcpiExOutPointer ("ObjDesc", ObjDesc->Reference.Object);
AcpiExOutPointer ("Node", ObjDesc->Reference.Node);
AcpiExOutPointer ("Where", ObjDesc->Reference.Where);
AcpiExOutInteger ("TargetType", ObjDesc->Reference.TargetType);
AcpiExOutString ("Opcode", (AcpiPsGetOpcodeInfo (ObjDesc->Reference.Opcode))->Name);
AcpiExOutInteger ("Offset", ObjDesc->Reference.Offset);
AcpiExOutPointer ("ObjDesc", ObjDesc->Reference.Object);
AcpiExOutPointer ("Node", ObjDesc->Reference.Node);
AcpiExOutPointer ("Where", ObjDesc->Reference.Where);
break;
case ACPI_TYPE_LOCAL_ADDRESS_HANDLER:
AcpiExOutInteger ("SpaceId", ObjDesc->AddressSpace.SpaceId);
AcpiExOutPointer ("Next", ObjDesc->AddressSpace.Next);
AcpiExOutPointer ("RegionList", ObjDesc->AddressSpace.RegionList);
AcpiExOutPointer ("Node", ObjDesc->AddressSpace.Node);
AcpiExOutPointer ("Context", ObjDesc->AddressSpace.Context);
AcpiExOutInteger ("SpaceId", ObjDesc->AddressSpace.SpaceId);
AcpiExOutPointer ("Next", ObjDesc->AddressSpace.Next);
AcpiExOutPointer ("RegionList", ObjDesc->AddressSpace.RegionList);
AcpiExOutPointer ("Node", ObjDesc->AddressSpace.Node);
AcpiExOutPointer ("Context", ObjDesc->AddressSpace.Context);
break;
case ACPI_TYPE_LOCAL_NOTIFY:
AcpiExOutPointer ("Node", ObjDesc->Notify.Node);
AcpiExOutPointer ("Context", ObjDesc->Notify.Context);
AcpiExOutPointer ("Node", ObjDesc->Notify.Node);
AcpiExOutPointer ("Context", ObjDesc->Notify.Context);
break;
@ -886,7 +889,8 @@ AcpiExDumpObjectDescriptor (
case ACPI_TYPE_LOCAL_DATA:
default:
AcpiOsPrintf ("ExDumpObjectDescriptor: Display not implemented for object type %s\n",
AcpiOsPrintf (
"ExDumpObjectDescriptor: Display not implemented for object type %s\n",
AcpiUtGetObjectTypeName (ObjDesc));
break;
}

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: exfldio - Aml Field I/O
* $Revision: 106 $
* $Revision: 111 $
*
*****************************************************************************/
@ -212,6 +212,23 @@ AcpiExSetupRegion (
+ FieldDatumByteOffset
+ ObjDesc->CommonField.AccessByteWidth))
{
if (AcpiGbl_EnableInterpreterSlack)
{
/*
* Slack mode only: We will go ahead and allow access to this
* field if it is within the region length rounded up to the next
* access width boundary.
*/
if (ACPI_ROUND_UP (RgnDesc->Region.Length,
ObjDesc->CommonField.AccessByteWidth) >=
(ObjDesc->CommonField.BaseByteOffset +
(ACPI_NATIVE_UINT) ObjDesc->CommonField.AccessByteWidth +
FieldDatumByteOffset))
{
return_ACPI_STATUS (AE_OK);
}
}
if (RgnDesc->Region.Length < ObjDesc->CommonField.AccessByteWidth)
{
/*
@ -891,7 +908,7 @@ AcpiExCommonBufferSetup (
return_ACPI_STATUS (AE_BUFFER_OVERFLOW);
}
/*
/*
* Create "actual" field byte count (minimum number of bytes that
* must be read), then convert to datum count (minimum number
* of datum-sized units that must be read)

View File

@ -2,7 +2,7 @@
/******************************************************************************
*
* Module Name: exmisc - ACPI AML (p-code) execution - specific opcodes
* $Revision: 118 $
* $Revision: 126 $
*
*****************************************************************************/
@ -228,8 +228,9 @@ AcpiExGetObjectReference (
*
* FUNCTION: AcpiExConcatTemplate
*
* PARAMETERS: *ObjDesc - Object to be converted. Must be an
* Integer, Buffer, or String
* PARAMETERS: Operand0 - First source object
* Operand1 - Second source object
* ActualReturnDesc - Where to place the return object
* WalkState - Current walk state
*
* RETURN: Status
@ -240,8 +241,8 @@ AcpiExGetObjectReference (
ACPI_STATUS
AcpiExConcatTemplate (
ACPI_OPERAND_OBJECT *ObjDesc1,
ACPI_OPERAND_OBJECT *ObjDesc2,
ACPI_OPERAND_OBJECT *Operand0,
ACPI_OPERAND_OBJECT *Operand1,
ACPI_OPERAND_OBJECT **ActualReturnDesc,
ACPI_WALK_STATE *WalkState)
{
@ -258,8 +259,8 @@ AcpiExConcatTemplate (
/* Find the EndTags in each resource template */
EndTag1 = AcpiUtGetResourceEndTag (ObjDesc1);
EndTag2 = AcpiUtGetResourceEndTag (ObjDesc2);
EndTag1 = AcpiUtGetResourceEndTag (Operand0);
EndTag2 = AcpiUtGetResourceEndTag (Operand1);
if (!EndTag1 || !EndTag2)
{
return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
@ -267,8 +268,8 @@ AcpiExConcatTemplate (
/* Compute the length of each part */
Length1 = ACPI_PTR_DIFF (EndTag1, ObjDesc1->Buffer.Pointer);
Length2 = ACPI_PTR_DIFF (EndTag2, ObjDesc2->Buffer.Pointer) +
Length1 = ACPI_PTR_DIFF (EndTag1, Operand0->Buffer.Pointer);
Length2 = ACPI_PTR_DIFF (EndTag2, Operand1->Buffer.Pointer) +
2; /* Size of END_TAG */
/* Create a new buffer object for the result */
@ -282,8 +283,8 @@ AcpiExConcatTemplate (
/* Copy the templates to the new descriptor */
NewBuf = ReturnDesc->Buffer.Pointer;
ACPI_MEMCPY (NewBuf, ObjDesc1->Buffer.Pointer, Length1);
ACPI_MEMCPY (NewBuf + Length1, ObjDesc2->Buffer.Pointer, Length2);
ACPI_MEMCPY (NewBuf, Operand0->Buffer.Pointer, Length1);
ACPI_MEMCPY (NewBuf + Length1, Operand1->Buffer.Pointer, Length2);
/* Compute the new checksum */
@ -302,8 +303,8 @@ AcpiExConcatTemplate (
*
* FUNCTION: AcpiExDoConcatenate
*
* PARAMETERS: ObjDesc1 - First source object
* ObjDesc2 - Second source object
* PARAMETERS: Operand0 - First source object
* Operand1 - Second source object
* ActualReturnDesc - Where to place the return object
* WalkState - Current walk state
*
@ -315,21 +316,60 @@ AcpiExConcatTemplate (
ACPI_STATUS
AcpiExDoConcatenate (
ACPI_OPERAND_OBJECT *ObjDesc1,
ACPI_OPERAND_OBJECT *ObjDesc2,
ACPI_OPERAND_OBJECT *Operand0,
ACPI_OPERAND_OBJECT *Operand1,
ACPI_OPERAND_OBJECT **ActualReturnDesc,
ACPI_WALK_STATE *WalkState)
{
ACPI_STATUS Status;
UINT32 i;
ACPI_INTEGER ThisInteger;
ACPI_OPERAND_OBJECT *LocalOperand1 = Operand1;
ACPI_OPERAND_OBJECT *ReturnDesc;
char *NewBuf;
ACPI_STATUS Status;
ACPI_SIZE NewLength;
ACPI_FUNCTION_ENTRY ();
ACPI_FUNCTION_TRACE ("ExDoConcatenate");
/*
* Convert the second operand if necessary. The first operand
* determines the type of the second operand, (See the Data Types
* section of the ACPI specification.) Both object types are
* guaranteed to be either Integer/String/Buffer by the operand
* resolution mechanism.
*/
switch (ACPI_GET_OBJECT_TYPE (Operand0))
{
case ACPI_TYPE_INTEGER:
Status = AcpiExConvertToInteger (Operand1, &LocalOperand1, 16);
break;
case ACPI_TYPE_STRING:
Status = AcpiExConvertToString (Operand1, &LocalOperand1,
ACPI_IMPLICIT_CONVERT_HEX);
break;
case ACPI_TYPE_BUFFER:
Status = AcpiExConvertToBuffer (Operand1, &LocalOperand1);
break;
default:
ACPI_REPORT_ERROR (("Concat - invalid obj type: %X\n",
ACPI_GET_OBJECT_TYPE (Operand0)));
Status = AE_AML_INTERNAL;
}
if (ACPI_FAILURE (Status))
{
goto Cleanup;
}
/*
* Both operands are now known to be the same object type
* (Both are Integer, String, or Buffer), and we can now perform the
* concatenation.
*/
/*
* There are three cases to handle:
*
@ -337,120 +377,108 @@ AcpiExDoConcatenate (
* 2) Two Strings concatenated to produce a new String
* 3) Two Buffers concatenated to produce a new Buffer
*/
switch (ACPI_GET_OBJECT_TYPE (ObjDesc1))
switch (ACPI_GET_OBJECT_TYPE (Operand0))
{
case ACPI_TYPE_INTEGER:
/* Result of two Integers is a Buffer */
/* Need enough buffer space for two integers */
ReturnDesc = AcpiUtCreateBufferObject (AcpiGbl_IntegerByteWidth * 2);
ReturnDesc = AcpiUtCreateBufferObject (
ACPI_MUL_2 (AcpiGbl_IntegerByteWidth));
if (!ReturnDesc)
{
return (AE_NO_MEMORY);
Status = AE_NO_MEMORY;
goto Cleanup;
}
NewBuf = (char *) ReturnDesc->Buffer.Pointer;
/* Convert the first integer */
/* Copy the first integer, LSB first */
ThisInteger = ObjDesc1->Integer.Value;
for (i = 0; i < AcpiGbl_IntegerByteWidth; i++)
{
NewBuf[i] = (char) ThisInteger;
ThisInteger >>= 8;
}
ACPI_MEMCPY (NewBuf,
&Operand0->Integer.Value,
AcpiGbl_IntegerByteWidth);
/* Convert the second integer */
ThisInteger = ObjDesc2->Integer.Value;
for (; i < (ACPI_MUL_2 (AcpiGbl_IntegerByteWidth)); i++)
{
NewBuf[i] = (char) ThisInteger;
ThisInteger >>= 8;
}
/* Copy the second integer (LSB first) after the first */
ACPI_MEMCPY (NewBuf + AcpiGbl_IntegerByteWidth,
&LocalOperand1->Integer.Value,
AcpiGbl_IntegerByteWidth);
break;
case ACPI_TYPE_STRING:
/* Result of two Strings is a String */
ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_STRING);
if (!ReturnDesc)
NewLength = (ACPI_SIZE) Operand0->String.Length +
(ACPI_SIZE) LocalOperand1->String.Length;
if (NewLength > ACPI_MAX_STRING_CONVERSION)
{
return (AE_NO_MEMORY);
Status = AE_AML_STRING_LIMIT;
goto Cleanup;
}
/* Operand0 is string */
NewBuf = ACPI_MEM_CALLOCATE ((ACPI_SIZE) ObjDesc1->String.Length +
(ACPI_SIZE) ObjDesc2->String.Length + 1);
if (!NewBuf)
ReturnDesc = AcpiUtCreateStringObject (NewLength);
if (!ReturnDesc)
{
ACPI_REPORT_ERROR
(("ExDoConcatenate: String allocation failure\n"));
Status = AE_NO_MEMORY;
goto Cleanup;
}
NewBuf = ReturnDesc->String.Pointer;
/* Concatenate the strings */
ACPI_STRCPY (NewBuf, ObjDesc1->String.Pointer);
ACPI_STRCPY (NewBuf + ObjDesc1->String.Length,
ObjDesc2->String.Pointer);
/* Complete the String object initialization */
ReturnDesc->String.Pointer = NewBuf;
ReturnDesc->String.Length = ObjDesc1->String.Length +
ObjDesc2->String.Length;
ACPI_STRCPY (NewBuf,
Operand0->String.Pointer);
ACPI_STRCPY (NewBuf + Operand0->String.Length,
LocalOperand1->String.Pointer);
break;
case ACPI_TYPE_BUFFER:
/* Result of two Buffers is a Buffer */
ReturnDesc = AcpiUtCreateBufferObject (
(ACPI_SIZE) ObjDesc1->Buffer.Length +
(ACPI_SIZE) ObjDesc2->Buffer.Length);
(ACPI_SIZE) Operand0->Buffer.Length +
(ACPI_SIZE) LocalOperand1->Buffer.Length);
if (!ReturnDesc)
{
return (AE_NO_MEMORY);
Status = AE_NO_MEMORY;
goto Cleanup;
}
NewBuf = (char *) ReturnDesc->Buffer.Pointer;
/* Concatenate the buffers */
ACPI_MEMCPY (NewBuf, ObjDesc1->Buffer.Pointer,
ObjDesc1->Buffer.Length);
ACPI_MEMCPY (NewBuf + ObjDesc1->Buffer.Length, ObjDesc2->Buffer.Pointer,
ObjDesc2->Buffer.Length);
ACPI_MEMCPY (NewBuf,
Operand0->Buffer.Pointer,
Operand0->Buffer.Length);
ACPI_MEMCPY (NewBuf + Operand0->Buffer.Length,
LocalOperand1->Buffer.Pointer,
LocalOperand1->Buffer.Length);
break;
default:
/* Invalid object type, should not happen here */
ACPI_REPORT_ERROR (("Concat - invalid obj type: %X\n",
ACPI_GET_OBJECT_TYPE (ObjDesc1)));
Status = AE_AML_INTERNAL;
ReturnDesc = NULL;
ACPI_REPORT_ERROR (("Concatenate - Invalid object type: %X\n",
ACPI_GET_OBJECT_TYPE (Operand0)));
Status =AE_AML_INTERNAL;
goto Cleanup;
}
*ActualReturnDesc = ReturnDesc;
return (AE_OK);
Cleanup:
AcpiUtRemoveReference (ReturnDesc);
return (Status);
if (LocalOperand1 != Operand1)
{
AcpiUtRemoveReference (LocalOperand1);
}
return_ACPI_STATUS (AE_OK);
}
@ -459,8 +487,8 @@ Cleanup:
* FUNCTION: AcpiExDoMathOp
*
* PARAMETERS: Opcode - AML opcode
* Operand0 - Integer operand #0
* Operand1 - Integer operand #1
* Integer0 - Integer operand #0
* Integer1 - Integer operand #1
*
* RETURN: Integer result of the operation
*
@ -473,61 +501,63 @@ Cleanup:
ACPI_INTEGER
AcpiExDoMathOp (
UINT16 Opcode,
ACPI_INTEGER Operand0,
ACPI_INTEGER Operand1)
ACPI_INTEGER Integer0,
ACPI_INTEGER Integer1)
{
ACPI_FUNCTION_ENTRY ();
switch (Opcode)
{
case AML_ADD_OP: /* Add (Operand0, Operand1, Result) */
case AML_ADD_OP: /* Add (Integer0, Integer1, Result) */
return (Operand0 + Operand1);
return (Integer0 + Integer1);
case AML_BIT_AND_OP: /* And (Operand0, Operand1, Result) */
case AML_BIT_AND_OP: /* And (Integer0, Integer1, Result) */
return (Operand0 & Operand1);
return (Integer0 & Integer1);
case AML_BIT_NAND_OP: /* NAnd (Operand0, Operand1, Result) */
case AML_BIT_NAND_OP: /* NAnd (Integer0, Integer1, Result) */
return (~(Operand0 & Operand1));
return (~(Integer0 & Integer1));
case AML_BIT_OR_OP: /* Or (Operand0, Operand1, Result) */
case AML_BIT_OR_OP: /* Or (Integer0, Integer1, Result) */
return (Operand0 | Operand1);
return (Integer0 | Integer1);
case AML_BIT_NOR_OP: /* NOr (Operand0, Operand1, Result) */
case AML_BIT_NOR_OP: /* NOr (Integer0, Integer1, Result) */
return (~(Operand0 | Operand1));
return (~(Integer0 | Integer1));
case AML_BIT_XOR_OP: /* XOr (Operand0, Operand1, Result) */
case AML_BIT_XOR_OP: /* XOr (Integer0, Integer1, Result) */
return (Operand0 ^ Operand1);
return (Integer0 ^ Integer1);
case AML_MULTIPLY_OP: /* Multiply (Operand0, Operand1, Result) */
case AML_MULTIPLY_OP: /* Multiply (Integer0, Integer1, Result) */
return (Operand0 * Operand1);
return (Integer0 * Integer1);
case AML_SHIFT_LEFT_OP: /* ShiftLeft (Operand, ShiftCount, Result) */
return (Operand0 << Operand1);
return (Integer0 << Integer1);
case AML_SHIFT_RIGHT_OP: /* ShiftRight (Operand, ShiftCount, Result) */
return (Operand0 >> Operand1);
return (Integer0 >> Integer1);
case AML_SUBTRACT_OP: /* Subtract (Operand0, Operand1, Result) */
case AML_SUBTRACT_OP: /* Subtract (Integer0, Integer1, Result) */
return (Operand0 - Operand1);
return (Integer0 - Integer1);
default:
@ -536,20 +566,89 @@ AcpiExDoMathOp (
}
/*******************************************************************************
*
* FUNCTION: AcpiExDoLogicalNumericOp
*
* PARAMETERS: Opcode - AML opcode
* Integer0 - Integer operand #0
* Integer1 - Integer operand #1
* LogicalResult - TRUE/FALSE result of the operation
*
* RETURN: Status
*
* DESCRIPTION: Execute a logical "Numeric" AML opcode. For these Numeric
* operators (LAnd and LOr), both operands must be integers.
*
* Note: cleanest machine code seems to be produced by the code
* below, rather than using statements of the form:
* Result = (Integer0 && Integer1);
*
******************************************************************************/
ACPI_STATUS
AcpiExDoLogicalNumericOp (
UINT16 Opcode,
ACPI_INTEGER Integer0,
ACPI_INTEGER Integer1,
BOOLEAN *LogicalResult)
{
ACPI_STATUS Status = AE_OK;
BOOLEAN LocalResult = FALSE;
ACPI_FUNCTION_TRACE ("ExDoLogicalNumericOp");
switch (Opcode)
{
case AML_LAND_OP: /* LAnd (Integer0, Integer1) */
if (Integer0 && Integer1)
{
LocalResult = TRUE;
}
break;
case AML_LOR_OP: /* LOr (Integer0, Integer1) */
if (Integer0 || Integer1)
{
LocalResult = TRUE;
}
break;
default:
Status = AE_AML_INTERNAL;
break;
}
/* Return the logical result and status */
*LogicalResult = LocalResult;
return_ACPI_STATUS (Status);
}
/*******************************************************************************
*
* FUNCTION: AcpiExDoLogicalOp
*
* PARAMETERS: Opcode - AML opcode
* Operand0 - Integer operand #0
* Operand1 - Integer operand #1
* Operand0 - operand #0
* Operand1 - operand #1
* LogicalResult - TRUE/FALSE result of the operation
*
* RETURN: TRUE/FALSE result of the operation
* RETURN: Status
*
* DESCRIPTION: Execute a logical AML opcode. The purpose of having all of the
* functions here is to prevent a lot of pointer dereferencing
* to obtain the operands and to simplify the generation of the
* logical value.
* logical value. For the Numeric operators (LAnd and LOr), both
* operands must be integers. For the other logical operators,
* operands can be any combination of Integer/String/Buffer. The
* first operand determines the type to which the second operand
* will be converted.
*
* Note: cleanest machine code seems to be produced by the code
* below, rather than using statements of the form:
@ -557,66 +656,192 @@ AcpiExDoMathOp (
*
******************************************************************************/
BOOLEAN
ACPI_STATUS
AcpiExDoLogicalOp (
UINT16 Opcode,
ACPI_INTEGER Operand0,
ACPI_INTEGER Operand1)
ACPI_OPERAND_OBJECT *Operand0,
ACPI_OPERAND_OBJECT *Operand1,
BOOLEAN *LogicalResult)
{
ACPI_OPERAND_OBJECT *LocalOperand1 = Operand1;
ACPI_INTEGER Integer0;
ACPI_INTEGER Integer1;
UINT32 Length0;
UINT32 Length1;
ACPI_STATUS Status = AE_OK;
BOOLEAN LocalResult = FALSE;
int Compare;
switch (Opcode)
ACPI_FUNCTION_TRACE ("ExDoLogicalOp");
/*
* Convert the second operand if necessary. The first operand
* determines the type of the second operand, (See the Data Types
* section of the ACPI 3.0+ specification.) Both object types are
* guaranteed to be either Integer/String/Buffer by the operand
* resolution mechanism.
*/
switch (ACPI_GET_OBJECT_TYPE (Operand0))
{
case AML_LAND_OP: /* LAnd (Operand0, Operand1) */
if (Operand0 && Operand1)
{
return (TRUE);
}
case ACPI_TYPE_INTEGER:
Status = AcpiExConvertToInteger (Operand1, &LocalOperand1, 16);
break;
case AML_LEQUAL_OP: /* LEqual (Operand0, Operand1) */
if (Operand0 == Operand1)
{
return (TRUE);
}
case ACPI_TYPE_STRING:
Status = AcpiExConvertToString (Operand1, &LocalOperand1,
ACPI_IMPLICIT_CONVERT_HEX);
break;
case AML_LGREATER_OP: /* LGreater (Operand0, Operand1) */
if (Operand0 > Operand1)
{
return (TRUE);
}
break;
case AML_LLESS_OP: /* LLess (Operand0, Operand1) */
if (Operand0 < Operand1)
{
return (TRUE);
}
break;
case AML_LOR_OP: /* LOr (Operand0, Operand1) */
if (Operand0 || Operand1)
{
return (TRUE);
}
case ACPI_TYPE_BUFFER:
Status = AcpiExConvertToBuffer (Operand1, &LocalOperand1);
break;
default:
Status = AE_AML_INTERNAL;
break;
}
return (FALSE);
if (ACPI_FAILURE (Status))
{
goto Cleanup;
}
/*
* Two cases: 1) Both Integers, 2) Both Strings or Buffers
*/
if (ACPI_GET_OBJECT_TYPE (Operand0) == ACPI_TYPE_INTEGER)
{
/*
* 1) Both operands are of type integer
* Note: LocalOperand1 may have changed above
*/
Integer0 = Operand0->Integer.Value;
Integer1 = LocalOperand1->Integer.Value;
switch (Opcode)
{
case AML_LEQUAL_OP: /* LEqual (Operand0, Operand1) */
if (Integer0 == Integer1)
{
LocalResult = TRUE;
}
break;
case AML_LGREATER_OP: /* LGreater (Operand0, Operand1) */
if (Integer0 > Integer1)
{
LocalResult = TRUE;
}
break;
case AML_LLESS_OP: /* LLess (Operand0, Operand1) */
if (Integer0 < Integer1)
{
LocalResult = TRUE;
}
break;
default:
Status = AE_AML_INTERNAL;
break;
}
}
else
{
/*
* 2) Both operands are Strings or both are Buffers
* Note: Code below takes advantage of common Buffer/String
* object fields. LocalOperand1 may have changed above. Use
* memcmp to handle nulls in buffers.
*/
Length0 = Operand0->Buffer.Length;
Length1 = LocalOperand1->Buffer.Length;
/* Lexicographic compare: compare the data bytes */
Compare = ACPI_MEMCMP ((const char * ) Operand0->Buffer.Pointer,
(const char * ) LocalOperand1->Buffer.Pointer,
(Length0 > Length1) ? Length1 : Length0);
switch (Opcode)
{
case AML_LEQUAL_OP: /* LEqual (Operand0, Operand1) */
/* Length and all bytes must be equal */
if ((Length0 == Length1) &&
(Compare == 0))
{
/* Length and all bytes match ==> TRUE */
LocalResult = TRUE;
}
break;
case AML_LGREATER_OP: /* LGreater (Operand0, Operand1) */
if (Compare > 0)
{
LocalResult = TRUE;
goto Cleanup; /* TRUE */
}
if (Compare < 0)
{
goto Cleanup; /* FALSE */
}
/* Bytes match (to shortest length), compare lengths */
if (Length0 > Length1)
{
LocalResult = TRUE;
}
break;
case AML_LLESS_OP: /* LLess (Operand0, Operand1) */
if (Compare > 0)
{
goto Cleanup; /* FALSE */
}
if (Compare < 0)
{
LocalResult = TRUE;
goto Cleanup; /* TRUE */
}
/* Bytes match (to shortest length), compare lengths */
if (Length0 < Length1)
{
LocalResult = TRUE;
}
break;
default:
Status = AE_AML_INTERNAL;
break;
}
}
Cleanup:
/* New object was created if implicit conversion performed - delete */
if (LocalOperand1 != Operand1)
{
AcpiUtRemoveReference (LocalOperand1);
}
/* Return the logical result and status */
*LogicalResult = LocalResult;
return_ACPI_STATUS (Status);
}

View File

@ -2,7 +2,7 @@
/******************************************************************************
*
* Module Name: exoparg1 - AML execution - opcodes with 1 argument
* $Revision: 152 $
* $Revision: 163 $
*
*****************************************************************************/
@ -141,7 +141,7 @@
* Where:
*
* xA - ARGUMENTS: The number of arguments (input operands) that are
* required for this opcode type (1 through 6 args).
* required for this opcode type (0 through 6 args).
* yT - TARGETS: The number of targets (output operands) that are required
* for this opcode type (0, 1, or 2 targets).
* zR - RETURN VALUE: Indicates whether this opcode type returns a value
@ -151,6 +151,73 @@
* fully resolved operands.
!*/
/*******************************************************************************
*
* FUNCTION: AcpiExOpcode_0A_0T_1R
*
* PARAMETERS: WalkState - Current state (contains AML opcode)
*
* RETURN: Status
*
* DESCRIPTION: Execute operator with no operands, one return value
*
******************************************************************************/
ACPI_STATUS
AcpiExOpcode_0A_0T_1R (
ACPI_WALK_STATE *WalkState)
{
ACPI_STATUS Status = AE_OK;
ACPI_OPERAND_OBJECT *ReturnDesc = NULL;
ACPI_FUNCTION_TRACE_STR ("ExOpcode_0A_0T_1R", AcpiPsGetOpcodeName (WalkState->Opcode));
/* Examine the AML opcode */
switch (WalkState->Opcode)
{
case AML_TIMER_OP: /* Timer () */
/* Create a return object of type Integer */
ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
if (!ReturnDesc)
{
Status = AE_NO_MEMORY;
goto Cleanup;
}
ReturnDesc->Integer.Value = AcpiOsGetTimer ();
break;
default: /* Unknown opcode */
ACPI_REPORT_ERROR (("AcpiExOpcode_0A_0T_1R: Unknown opcode %X\n",
WalkState->Opcode));
Status = AE_AML_BAD_OPCODE;
break;
}
Cleanup:
if (!WalkState->ResultObj)
{
WalkState->ResultObj = ReturnDesc;
}
/* Delete return object on error */
if (ACPI_FAILURE (Status))
{
AcpiUtRemoveReference (ReturnDesc);
}
return_ACPI_STATUS (Status);
}
/*******************************************************************************
*
* FUNCTION: AcpiExOpcode_1A_0T_0R
@ -199,7 +266,7 @@ AcpiExOpcode_1A_0T_0R (
case AML_SLEEP_OP: /* Sleep (MsecTime) */
Status = AcpiExSystemDoSuspend ((UINT32) Operand[0]->Integer.Value);
Status = AcpiExSystemDoSuspend (Operand[0]->Integer.Value);
break;
@ -298,7 +365,7 @@ AcpiExOpcode_1A_1T_1R (
ACPI_OPERAND_OBJECT *ReturnDesc2 = NULL;
UINT32 Temp32;
UINT32 i;
UINT32 PowerOfTen;
ACPI_INTEGER PowerOfTen;
ACPI_INTEGER Digit;
@ -341,7 +408,8 @@ AcpiExOpcode_1A_1T_1R (
* Acpi specification describes Integer type as a little
* endian unsigned value, so this boundary condition is valid.
*/
for (Temp32 = 0; ReturnDesc->Integer.Value && Temp32 < ACPI_INTEGER_BIT_SIZE; ++Temp32)
for (Temp32 = 0; ReturnDesc->Integer.Value &&
Temp32 < ACPI_INTEGER_BIT_SIZE; ++Temp32)
{
ReturnDesc->Integer.Value >>= 1;
}
@ -358,14 +426,16 @@ AcpiExOpcode_1A_1T_1R (
* The Acpi specification describes Integer type as a little
* endian unsigned value, so this boundary condition is valid.
*/
for (Temp32 = 0; ReturnDesc->Integer.Value && Temp32 < ACPI_INTEGER_BIT_SIZE; ++Temp32)
for (Temp32 = 0; ReturnDesc->Integer.Value &&
Temp32 < ACPI_INTEGER_BIT_SIZE; ++Temp32)
{
ReturnDesc->Integer.Value <<= 1;
}
/* Since the bit position is one-based, subtract from 33 (65) */
ReturnDesc->Integer.Value = Temp32 == 0 ? 0 : (ACPI_INTEGER_BIT_SIZE + 1) - Temp32;
ReturnDesc->Integer.Value = Temp32 == 0 ? 0 :
(ACPI_INTEGER_BIT_SIZE + 1) - Temp32;
break;
@ -402,7 +472,8 @@ AcpiExOpcode_1A_1T_1R (
/* Sum the digit into the result with the current power of 10 */
ReturnDesc->Integer.Value += (((ACPI_INTEGER) Temp32) * PowerOfTen);
ReturnDesc->Integer.Value += (((ACPI_INTEGER) Temp32) *
PowerOfTen);
/* Shift to next BCD digit */
@ -424,19 +495,21 @@ AcpiExOpcode_1A_1T_1R (
for (i = 0; (i < AcpiGbl_IntegerNybbleWidth) && (Digit > 0); i++)
{
(void) AcpiUtShortDivide (&Digit, 10, &Digit, &Temp32);
(void) AcpiUtShortDivide (Digit, 10, &Digit, &Temp32);
/* Insert the BCD digit that resides in the remainder from above */
ReturnDesc->Integer.Value |= (((ACPI_INTEGER) Temp32) << (i * 4));
ReturnDesc->Integer.Value |= (((ACPI_INTEGER) Temp32) <<
ACPI_MUL_4 (i));
}
/* Overflow if there is any data left in Digit */
if (Digit > 0)
{
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Integer too large to convert to BCD: %8.8X%8.8X\n",
ACPI_FORMAT_UINT64 (Operand[0]->Integer.Value)));
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
"Integer too large to convert to BCD: %8.8X%8.8X\n",
ACPI_FORMAT_UINT64 (Operand[0]->Integer.Value)));
Status = AE_AML_NUMERIC_OVERFLOW;
goto Cleanup;
}
@ -518,42 +591,47 @@ AcpiExOpcode_1A_1T_1R (
*/
case AML_COPY_OP: /* Copy (Source, Target) */
Status = AcpiUtCopyIobjectToIobject (Operand[0], &ReturnDesc, WalkState);
Status = AcpiUtCopyIobjectToIobject (Operand[0], &ReturnDesc,
WalkState);
break;
case AML_TO_DECSTRING_OP: /* ToDecimalString (Data, Result) */
Status = AcpiExConvertToString (Operand[0], &ReturnDesc, 10, ACPI_UINT32_MAX, WalkState);
Status = AcpiExConvertToString (Operand[0], &ReturnDesc,
ACPI_EXPLICIT_CONVERT_DECIMAL);
break;
case AML_TO_HEXSTRING_OP: /* ToHexString (Data, Result) */
Status = AcpiExConvertToString (Operand[0], &ReturnDesc, 16, ACPI_UINT32_MAX, WalkState);
Status = AcpiExConvertToString (Operand[0], &ReturnDesc,
ACPI_EXPLICIT_CONVERT_HEX);
break;
case AML_TO_BUFFER_OP: /* ToBuffer (Data, Result) */
Status = AcpiExConvertToBuffer (Operand[0], &ReturnDesc, WalkState);
Status = AcpiExConvertToBuffer (Operand[0], &ReturnDesc);
break;
case AML_TO_INTEGER_OP: /* ToInteger (Data, Result) */
Status = AcpiExConvertToInteger (Operand[0], &ReturnDesc, WalkState);
Status = AcpiExConvertToInteger (Operand[0], &ReturnDesc,
ACPI_ANY_BASE);
break;
case AML_SHIFT_LEFT_BIT_OP: /* ShiftLeftBit (Source, BitNum) */
case AML_SHIFT_RIGHT_BIT_OP: /* ShiftRightBit (Source, BitNum) */
case AML_SHIFT_LEFT_BIT_OP: /* ShiftLeftBit (Source, BitNum) */
case AML_SHIFT_RIGHT_BIT_OP: /* ShiftRightBit (Source, BitNum) */
/*
* These are two obsolete opcodes
*/
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "%s is obsolete and not implemented\n",
AcpiPsGetOpcodeName (WalkState->Opcode)));
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
"%s is obsolete and not implemented\n",
AcpiPsGetOpcodeName (WalkState->Opcode)));
Status = AE_SUPPORT;
goto Cleanup;
@ -630,7 +708,14 @@ AcpiExOpcode_1A_0T_1R (
goto Cleanup;
}
ReturnDesc->Integer.Value = !Operand[0]->Integer.Value;
/*
* Set result to ONES (TRUE) if Value == 0. Note:
* ReturnDesc->Integer.Value is initially == 0 (FALSE) from above.
*/
if (!Operand[0]->Integer.Value)
{
ReturnDesc->Integer.Value = ACPI_INTEGER_MAX;
}
break;
@ -638,51 +723,79 @@ AcpiExOpcode_1A_0T_1R (
case AML_INCREMENT_OP: /* Increment (Operand) */
/*
* Since we are expecting a Reference operand, it
* can be either a NS Node or an internal object.
* Create a new integer. Can't just get the base integer and
* increment it because it may be an Arg or Field.
*/
ReturnDesc = Operand[0];
if (ACPI_GET_DESCRIPTOR_TYPE (Operand[0]) == ACPI_DESC_TYPE_OPERAND)
ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
if (!ReturnDesc)
{
/* Internal reference object - prevent deletion */
AcpiUtAddReference (ReturnDesc);
Status = AE_NO_MEMORY;
goto Cleanup;
}
/*
* Convert the ReturnDesc Reference to a Number
* (This removes a reference on the ReturnDesc object)
* Since we are expecting a Reference operand, it can be either a
* NS Node or an internal object.
*/
Status = AcpiExResolveOperands (AML_LNOT_OP, &ReturnDesc, WalkState);
TempDesc = Operand[0];
if (ACPI_GET_DESCRIPTOR_TYPE (TempDesc) == ACPI_DESC_TYPE_OPERAND)
{
/* Internal reference object - prevent deletion */
AcpiUtAddReference (TempDesc);
}
/*
* Convert the Reference operand to an Integer (This removes a
* reference on the Operand[0] object)
*
* NOTE: We use LNOT_OP here in order to force resolution of the
* reference operand to an actual integer.
*/
Status = AcpiExResolveOperands (AML_LNOT_OP, &TempDesc, WalkState);
if (ACPI_FAILURE (Status))
{
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "%s: bad operand(s) %s\n",
AcpiPsGetOpcodeName (WalkState->Opcode), AcpiFormatException(Status)));
AcpiPsGetOpcodeName (WalkState->Opcode),
AcpiFormatException(Status)));
goto Cleanup;
}
/*
* ReturnDesc is now guaranteed to be an Integer object
* Do the actual increment or decrement
* TempDesc is now guaranteed to be an Integer object --
* Perform the actual increment or decrement
*/
if (AML_INCREMENT_OP == WalkState->Opcode)
if (WalkState->Opcode == AML_INCREMENT_OP)
{
ReturnDesc->Integer.Value++;
ReturnDesc->Integer.Value = TempDesc->Integer.Value +1;
}
else
{
ReturnDesc->Integer.Value--;
ReturnDesc->Integer.Value = TempDesc->Integer.Value -1;
}
/* Store the result back in the original descriptor */
/* Finished with this Integer object */
AcpiUtRemoveReference (TempDesc);
/*
* Store the result back (indirectly) through the original
* Reference object
*/
Status = AcpiExStore (ReturnDesc, Operand[0], WalkState);
break;
case AML_TYPE_OP: /* ObjectType (SourceObject) */
/*
* Note: The operand is not resolved at this point because we want to
* get the associated object, not its value. For example, we don't want
* to resolve a FieldUnit to its value, we want the actual FieldUnit
* object.
*/
/* Get the type of the base object */
Status = AcpiExResolveMultiple (WalkState, Operand[0], &Type, NULL);
@ -690,7 +803,6 @@ AcpiExOpcode_1A_0T_1R (
{
goto Cleanup;
}
/* Allocate a descriptor to hold the type. */
ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
@ -706,6 +818,11 @@ AcpiExOpcode_1A_0T_1R (
case AML_SIZE_OF_OP: /* SizeOf (SourceObject) */
/*
* Note: The operand is not resolved at this point because we want to
* get the associated object, not its value.
*/
/* Get the base object */
Status = AcpiExResolveMultiple (WalkState, Operand[0], &Type, &TempDesc);
@ -715,12 +832,20 @@ AcpiExOpcode_1A_0T_1R (
}
/*
* Type is guaranteed to be a buffer, string, or package at this
* point (even if the original operand was an object reference, it
* will be resolved and typechecked during operand resolution.)
* The type of the base object must be integer, buffer, string, or
* package. All others are not supported.
*
* NOTE: Integer is not specifically supported by the ACPI spec,
* but is supported implicitly via implicit operand conversion.
* rather than bother with conversion, we just use the byte width
* global (4 or 8 bytes).
*/
switch (Type)
{
case ACPI_TYPE_INTEGER:
Value = AcpiGbl_IntegerByteWidth;
break;
case ACPI_TYPE_BUFFER:
Value = TempDesc->Buffer.Length;
break;
@ -734,7 +859,8 @@ AcpiExOpcode_1A_0T_1R (
break;
default:
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "SizeOf, Not Buf/Str/Pkg - found type %s\n",
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
"SizeOf - Operand is not Buf/Int/Str/Pkg - found type %s\n",
AcpiUtGetTypeName (Type)));
Status = AE_AML_OPERAND_TYPE;
goto Cleanup;
@ -917,7 +1043,8 @@ AcpiExOpcode_1A_0T_1R (
* an uninitialized package element and is thus a
* severe error.
*/
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "NULL package element obj %p\n",
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
"NULL package element obj %p\n",
Operand[0]));
Status = AE_AML_UNINITIALIZED_ELEMENT;
goto Cleanup;
@ -929,7 +1056,8 @@ AcpiExOpcode_1A_0T_1R (
default:
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown Index TargetType %X in obj %p\n",
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
"Unknown Index TargetType %X in obj %p\n",
Operand[0]->Reference.TargetType, Operand[0]));
Status = AE_AML_OPERAND_TYPE;
goto Cleanup;
@ -954,7 +1082,8 @@ AcpiExOpcode_1A_0T_1R (
default:
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown opcode in ref(%p) - %X\n",
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
"Unknown opcode in ref(%p) - %X\n",
Operand[0], Operand[0]->Reference.Opcode));
Status = AE_TYPE;

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: exoparg2 - AML execution - opcodes with 2 arguments
* $Revision: 121 $
* $Revision: 129 $
*
*****************************************************************************/
@ -278,7 +278,8 @@ AcpiExOpcode_2A_2T_1R (
ACPI_STATUS Status;
ACPI_FUNCTION_TRACE_STR ("ExOpcode_2A_2T_1R", AcpiPsGetOpcodeName (WalkState->Opcode));
ACPI_FUNCTION_TRACE_STR ("ExOpcode_2A_2T_1R",
AcpiPsGetOpcodeName (WalkState->Opcode));
/*
@ -304,8 +305,10 @@ AcpiExOpcode_2A_2T_1R (
/* Quotient to ReturnDesc1, remainder to ReturnDesc2 */
Status = AcpiUtDivide (&Operand[0]->Integer.Value, &Operand[1]->Integer.Value,
&ReturnDesc1->Integer.Value, &ReturnDesc2->Integer.Value);
Status = AcpiUtDivide (Operand[0]->Integer.Value,
Operand[1]->Integer.Value,
&ReturnDesc1->Integer.Value,
&ReturnDesc2->Integer.Value);
if (ACPI_FAILURE (Status))
{
goto Cleanup;
@ -378,13 +381,13 @@ AcpiExOpcode_2A_1T_1R (
{
ACPI_OPERAND_OBJECT **Operand = &WalkState->Operands[0];
ACPI_OPERAND_OBJECT *ReturnDesc = NULL;
ACPI_OPERAND_OBJECT *TempDesc = NULL;
UINT32 Index;
ACPI_STATUS Status = AE_OK;
ACPI_SIZE Length;
ACPI_FUNCTION_TRACE_STR ("ExOpcode_2A_1T_1R", AcpiPsGetOpcodeName (WalkState->Opcode));
ACPI_FUNCTION_TRACE_STR ("ExOpcode_2A_1T_1R",
AcpiPsGetOpcodeName (WalkState->Opcode));
/*
@ -421,55 +424,17 @@ AcpiExOpcode_2A_1T_1R (
/* ReturnDesc will contain the remainder */
Status = AcpiUtDivide (&Operand[0]->Integer.Value, &Operand[1]->Integer.Value,
NULL, &ReturnDesc->Integer.Value);
Status = AcpiUtDivide (Operand[0]->Integer.Value,
Operand[1]->Integer.Value,
NULL,
&ReturnDesc->Integer.Value);
break;
case AML_CONCAT_OP: /* Concatenate (Data1, Data2, Result) */
/*
* Convert the second operand if necessary. The first operand
* determines the type of the second operand, (See the Data Types
* section of the ACPI specification.) Both object types are
* guaranteed to be either Integer/String/Buffer by the operand
* resolution mechanism above.
*/
switch (ACPI_GET_OBJECT_TYPE (Operand[0]))
{
case ACPI_TYPE_INTEGER:
Status = AcpiExConvertToInteger (Operand[1], &TempDesc, WalkState);
break;
case ACPI_TYPE_STRING:
Status = AcpiExConvertToString (Operand[1], &TempDesc, 16, ACPI_UINT32_MAX, WalkState);
break;
case ACPI_TYPE_BUFFER:
Status = AcpiExConvertToBuffer (Operand[1], &TempDesc, WalkState);
break;
default:
ACPI_REPORT_ERROR (("Concat - invalid obj type: %X\n",
ACPI_GET_OBJECT_TYPE (Operand[0])));
Status = AE_AML_INTERNAL;
}
if (ACPI_FAILURE (Status))
{
goto Cleanup;
}
/*
* Both operands are now known to be the same object type
* (Both are Integer, String, or Buffer), and we can now perform the
* concatenation.
*/
Status = AcpiExDoConcatenate (Operand[0], TempDesc, &ReturnDesc, WalkState);
if (TempDesc != Operand[1])
{
AcpiUtRemoveReference (TempDesc);
}
Status = AcpiExDoConcatenate (Operand[0], Operand[1],
&ReturnDesc, WalkState);
break;
@ -480,60 +445,48 @@ AcpiExOpcode_2A_1T_1R (
* been converted.) Copy the raw buffer data to a new object of type String.
*/
/* Get the length of the new string */
/*
* Get the length of the new string. It is the smallest of:
* 1) Length of the input buffer
* 2) Max length as specified in the ToString operator
* 3) Length of input buffer up to a zero byte (null terminator)
*
* NOTE: A length of zero is ok, and will create a zero-length, null
* terminated string.
*/
Length = 0;
if (Operand[1]->Integer.Value == 0)
{
/* Handle optional length value */
Operand[1]->Integer.Value = ACPI_INTEGER_MAX;
}
while ((Length < Operand[0]->Buffer.Length) &&
(Length < Operand[1]->Integer.Value) &&
(Operand[0]->Buffer.Pointer[Length]))
{
Length++;
if (Length > ACPI_MAX_STRING_CONVERSION)
{
Status = AE_AML_STRING_LIMIT;
goto Cleanup;
}
}
if (Length > ACPI_MAX_STRING_CONVERSION)
{
Status = AE_AML_STRING_LIMIT;
goto Cleanup;
}
/* Allocate a new string object */
/* Create the internal return object */
ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_STRING);
ReturnDesc = AcpiUtCreateStringObject (Length);
if (!ReturnDesc)
{
Status = AE_NO_MEMORY;
goto Cleanup;
}
/* Allocate a new string buffer (Length + 1 for null terminator) */
/* Copy the raw buffer data with no transform. NULL terminated already. */
ReturnDesc->String.Pointer = ACPI_MEM_CALLOCATE (Length + 1);
if (!ReturnDesc->String.Pointer)
{
Status = AE_NO_MEMORY;
goto Cleanup;
}
/* Copy the raw buffer data with no transform */
ACPI_MEMCPY (ReturnDesc->String.Pointer, Operand[0]->Buffer.Pointer, Length);
/* Set the string length */
ReturnDesc->String.Length = (UINT32) Length;
ACPI_MEMCPY (ReturnDesc->String.Pointer,
Operand[0]->Buffer.Pointer, Length);
break;
case AML_CONCAT_RES_OP: /* ConcatenateResTemplate (Buffer, Buffer, Result) (ACPI 2.0) */
Status = AcpiExConcatTemplate (Operand[0], Operand[1], &ReturnDesc, WalkState);
Status = AcpiExConcatTemplate (Operand[0], Operand[1],
&ReturnDesc, WalkState);
break;
@ -551,7 +504,7 @@ AcpiExOpcode_2A_1T_1R (
Index = (UINT32) Operand[1]->Integer.Value;
/*
* At this point, the Source operand is either a Package or a Buffer
* At this point, the Source operand is a Package, Buffer, or String
*/
if (ACPI_GET_OBJECT_TYPE (Operand[0]) == ACPI_TYPE_PACKAGE)
{
@ -559,7 +512,8 @@ AcpiExOpcode_2A_1T_1R (
if (Index >= Operand[0]->Package.Count)
{
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Index value (%X) beyond package end (%X)\n",
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
"Index value (%X) beyond package end (%X)\n",
Index, Operand[0]->Package.Count));
Status = AE_AML_PACKAGE_LIMIT;
goto Cleanup;
@ -571,11 +525,12 @@ AcpiExOpcode_2A_1T_1R (
}
else
{
/* Object to be indexed is a Buffer */
/* Object to be indexed is a Buffer/String */
if (Index >= Operand[0]->Buffer.Length)
{
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Index value (%X) beyond end of buffer (%X)\n",
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
"Index value (%X) beyond end of buffer (%X)\n",
Index, Operand[0]->Buffer.Length));
Status = AE_AML_BUFFER_LIMIT;
goto Cleanup;
@ -665,7 +620,8 @@ AcpiExOpcode_2A_0T_1R (
BOOLEAN LogicalResult = FALSE;
ACPI_FUNCTION_TRACE_STR ("ExOpcode_2A_0T_1R", AcpiPsGetOpcodeName (WalkState->Opcode));
ACPI_FUNCTION_TRACE_STR ("ExOpcode_2A_0T_1R",
AcpiPsGetOpcodeName (WalkState->Opcode));
/* Create the internal return object */
@ -680,11 +636,17 @@ AcpiExOpcode_2A_0T_1R (
/*
* Execute the Opcode
*/
if (WalkState->OpInfo->Flags & AML_LOGICAL) /* LogicalOp (Operand0, Operand1) */
if (WalkState->OpInfo->Flags & AML_LOGICAL_NUMERIC) /* LogicalOp (Operand0, Operand1) */
{
LogicalResult = AcpiExDoLogicalOp (WalkState->Opcode,
Operand[0]->Integer.Value,
Operand[1]->Integer.Value);
Status = AcpiExDoLogicalNumericOp (WalkState->Opcode,
Operand[0]->Integer.Value, Operand[1]->Integer.Value,
&LogicalResult);
goto StoreLogicalResult;
}
else if (WalkState->OpInfo->Flags & AML_LOGICAL) /* LogicalOp (Operand0, Operand1) */
{
Status = AcpiExDoLogicalOp (WalkState->Opcode, Operand[0],
Operand[1], &LogicalResult);
goto StoreLogicalResult;
}

View File

@ -2,7 +2,7 @@
/******************************************************************************
*
* Module Name: exprep - ACPI AML (p-code) execution - field prep utilities
* $Revision: 127 $
* $Revision: 128 $
*
*****************************************************************************/
@ -599,6 +599,7 @@ AcpiExPrepFieldValue (
if (!ObjDesc->IndexField.DataObj || !ObjDesc->IndexField.IndexObj)
{
ACPI_REPORT_ERROR (("Null Index Object during field prep\n"));
AcpiUtDeleteObjectDesc (ObjDesc);
return_ACPI_STATUS (AE_AML_INTERNAL);
}

View File

@ -2,7 +2,7 @@
/******************************************************************************
*
* Module Name: exregion - ACPI default OpRegion (address space) handlers
* $Revision: 86 $
* $Revision: 87 $
*
*****************************************************************************/
@ -197,7 +197,7 @@ AcpiExSystemMemorySpaceHandler (
* Hardware does not support non-aligned data transfers, we must verify
* the request.
*/
(void) AcpiUtShortDivide ((ACPI_INTEGER *) &Address, Length, NULL, &Remainder);
(void) AcpiUtShortDivide ((ACPI_INTEGER) Address, Length, NULL, &Remainder);
if (Remainder != 0)
{
return_ACPI_STATUS (AE_AML_ALIGNMENT);

View File

@ -2,7 +2,7 @@
/******************************************************************************
*
* Module Name: exresolv - AML Interpreter object resolution
* $Revision: 124 $
* $Revision: 125 $
*
*****************************************************************************/
@ -412,11 +412,48 @@ AcpiExResolveMultiple (
ACPI_OPERAND_OBJECT *ObjDesc = (void *) Operand;
ACPI_NAMESPACE_NODE *Node;
ACPI_OBJECT_TYPE Type;
ACPI_STATUS Status;
ACPI_FUNCTION_TRACE ("AcpiExResolveMultiple");
/*
* Operand can be either a namespace node or an operand descriptor
*/
switch (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc))
{
case ACPI_DESC_TYPE_OPERAND:
Type = ObjDesc->Common.Type;
break;
case ACPI_DESC_TYPE_NAMED:
Type = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Type;
ObjDesc = AcpiNsGetAttachedObject ((ACPI_NAMESPACE_NODE *) ObjDesc);
/* If we had an Alias node, use the attached object for type info */
if (Type == ACPI_TYPE_LOCAL_ALIAS)
{
Type = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Type;
ObjDesc = AcpiNsGetAttachedObject ((ACPI_NAMESPACE_NODE *) ObjDesc);
}
break;
default:
return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
}
/*
* If type is anything other than a reference, we are done
*/
if (Type != ACPI_TYPE_LOCAL_REFERENCE)
{
goto Exit;
}
/*
* For reference objects created via the RefOf or Index operators,
* we need to get to the base object (as per the ACPI specification
@ -518,6 +555,38 @@ AcpiExResolveMultiple (
break;
case AML_LOCAL_OP:
case AML_ARG_OP:
if (ReturnDesc)
{
Status = AcpiDsMethodDataGetValue (ObjDesc->Reference.Opcode,
ObjDesc->Reference.Offset, WalkState, &ObjDesc);
if (ACPI_FAILURE (Status))
{
return_ACPI_STATUS (Status);
}
AcpiUtRemoveReference (ObjDesc);
}
else
{
Status = AcpiDsMethodDataGetNode (ObjDesc->Reference.Opcode,
ObjDesc->Reference.Offset, WalkState, &Node);
if (ACPI_FAILURE (Status))
{
return_ACPI_STATUS (Status);
}
ObjDesc = AcpiNsGetAttachedObject (Node);
if (!ObjDesc)
{
Type = ACPI_TYPE_ANY;
goto Exit;
}
}
break;
case AML_DEBUG_OP:
/* The Debug Object is of type "DebugObject" */

View File

@ -2,7 +2,7 @@
/******************************************************************************
*
* Module Name: exresop - AML Interpreter operand/object resolution
* $Revision: 67 $
* $Revision: 70 $
*
*****************************************************************************/
@ -240,7 +240,7 @@ AcpiExResolveOperands (
return_ACPI_STATUS (AE_AML_INTERNAL);
}
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Opcode %X [%s] OperandTypes=%X \n",
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Opcode %X [%s] RequiredOperandTypes=%8.8X \n",
Opcode, OpInfo->Name, ArgTypes));
/*
@ -314,12 +314,13 @@ AcpiExResolveOperands (
case AML_LOAD_OP: /* DdbHandle from LOAD_OP or LOAD_TABLE_OP */
ACPI_DEBUG_ONLY_MEMBERS (ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
"Reference Opcode: %s\n", OpInfo->Name)));
"Operand is a Reference, RefOpcode [%s]\n",
(AcpiPsGetOpcodeInfo (ObjDesc->Reference.Opcode))->Name)));
break;
default:
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
"Unknown Reference Opcode %X [%s]\n",
"Operand is a Reference, Unknown Reference Opcode %X [%s]\n",
ObjDesc->Reference.Opcode,
(AcpiPsGetOpcodeInfo (ObjDesc->Reference.Opcode))->Name));
@ -493,7 +494,7 @@ AcpiExResolveOperands (
* But we can implicitly convert from a STRING or BUFFER
* Aka - "Implicit Source Operand Conversion"
*/
Status = AcpiExConvertToInteger (ObjDesc, StackPtr, WalkState);
Status = AcpiExConvertToInteger (ObjDesc, StackPtr, 16);
if (ACPI_FAILURE (Status))
{
if (Status == AE_TYPE)
@ -517,7 +518,7 @@ AcpiExResolveOperands (
* But we can implicitly convert from a STRING or INTEGER
* Aka - "Implicit Source Operand Conversion"
*/
Status = AcpiExConvertToBuffer (ObjDesc, StackPtr, WalkState);
Status = AcpiExConvertToBuffer (ObjDesc, StackPtr);
if (ACPI_FAILURE (Status))
{
if (Status == AE_TYPE)
@ -541,7 +542,8 @@ AcpiExResolveOperands (
* But we can implicitly convert from a BUFFER or INTEGER
* Aka - "Implicit Source Operand Conversion"
*/
Status = AcpiExConvertToString (ObjDesc, StackPtr, 16, ACPI_UINT32_MAX, WalkState);
Status = AcpiExConvertToString (ObjDesc, StackPtr,
ACPI_IMPLICIT_CONVERT_HEX);
if (ACPI_FAILURE (Status))
{
if (Status == AE_TYPE)
@ -597,7 +599,7 @@ AcpiExResolveOperands (
/* Highest priority conversion is to type Buffer */
Status = AcpiExConvertToBuffer (ObjDesc, StackPtr, WalkState);
Status = AcpiExConvertToBuffer (ObjDesc, StackPtr);
if (ACPI_FAILURE (Status))
{
return_ACPI_STATUS (Status);

View File

@ -2,7 +2,7 @@
/******************************************************************************
*
* Module Name: exstore - AML Interpreter object store support
* $Revision: 182 $
* $Revision: 186 $
*
*****************************************************************************/
@ -207,7 +207,8 @@ AcpiExStore (
/* Destination is not a Reference object */
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
"Destination is not a Reference or Constant object [%p]\n", DestDesc));
"Target is not a Reference or Constant object - %s [%p]\n",
AcpiUtGetObjectTypeName (DestDesc), DestDesc));
ACPI_DUMP_STACK_ENTRY (SourceDesc);
ACPI_DUMP_STACK_ENTRY (DestDesc);
@ -261,24 +262,41 @@ AcpiExStore (
* Storing to the Debug object causes the value stored to be
* displayed and otherwise has no effect -- see ACPI Specification
*/
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "**** Write to Debug Object: ****:\n\n"));
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
"**** Write to Debug Object: Object %p %s ****:\n\n",
SourceDesc, AcpiUtGetObjectTypeName (SourceDesc)));
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "[ACPI Debug] %s: ",
AcpiUtGetObjectTypeName (SourceDesc)));
AcpiUtGetObjectTypeName (SourceDesc)));
if (!AcpiUtValidInternalObject (SourceDesc))
{
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT,
"%p, Invalid Internal Object!\n", SourceDesc));
break;
}
switch (ACPI_GET_OBJECT_TYPE (SourceDesc))
{
case ACPI_TYPE_INTEGER:
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "0x%8.8X%8.8X\n",
if (AcpiGbl_IntegerByteWidth == 4)
{
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "0x%8.8X\n",
(UINT32) SourceDesc->Integer.Value));
}
else
{
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "0x%8.8X%8.8X\n",
ACPI_FORMAT_UINT64 (SourceDesc->Integer.Value)));
}
break;
case ACPI_TYPE_BUFFER:
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "Length 0x%.2X",
(UINT32) SourceDesc->Buffer.Length));
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "[0x%.2X]",
(UINT32) SourceDesc->Buffer.Length));
ACPI_DUMP_BUFFER (SourceDesc->Buffer.Pointer,
(SourceDesc->Buffer.Length < 32) ? SourceDesc->Buffer.Length : 32);
break;
@ -286,22 +304,22 @@ AcpiExStore (
case ACPI_TYPE_STRING:
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "Length 0x%.2X, \"%s\"\n",
SourceDesc->String.Length, SourceDesc->String.Pointer));
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "[0x%.2X] \"%s\"\n",
SourceDesc->String.Length, SourceDesc->String.Pointer));
break;
case ACPI_TYPE_PACKAGE:
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "Size 0x%.2X Elements Ptr - %p\n",
SourceDesc->Package.Count, SourceDesc->Package.Elements));
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "[0x%.2X] Elements Ptr - %p\n",
SourceDesc->Package.Count, SourceDesc->Package.Elements));
break;
default:
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "%p\n",
SourceDesc));
SourceDesc));
break;
}
@ -361,60 +379,49 @@ AcpiExStoreObjectToIndex (
{
case ACPI_TYPE_PACKAGE:
/*
* Storing to a package element is not simple. The source must be
* evaluated and converted to the type of the destination and then the
* source is copied into the destination - we can't just point to the
* source object.
*/
/*
* Storing to a package element. Copy the object and replace
* any existing object with the new object. No implicit
* conversion is performed.
*
* The object at *(IndexDesc->Reference.Where) is the
* element within the package that is to be modified.
* The parent package object is at IndexDesc->Reference.Object
*/
ObjDesc = *(IndexDesc->Reference.Where);
/* Do the conversion/store */
Status = AcpiExStoreObjectToObject (SourceDesc, ObjDesc, &NewDesc,
WalkState);
Status = AcpiUtCopyIobjectToIobject (SourceDesc, &NewDesc, WalkState);
if (ACPI_FAILURE (Status))
{
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
"Could not store object to indexed package element\n"));
return_ACPI_STATUS (Status);
}
/*
* If a new object was created, we must install it as the new
* package element
*/
if (NewDesc != ObjDesc)
if (ObjDesc)
{
AcpiUtRemoveReference (ObjDesc);
*(IndexDesc->Reference.Where) = NewDesc;
/* Decrement reference count by the ref count of the parent package */
/* If same as the original source, add a reference */
if (NewDesc == SourceDesc)
for (i = 0; i < ((ACPI_OPERAND_OBJECT *) IndexDesc->Reference.Object)->Common.ReferenceCount; i++)
{
AcpiUtAddReference (NewDesc);
}
/* Increment reference count by the ref count of the parent package -1 */
for (i = 1; i < ((ACPI_OPERAND_OBJECT *) IndexDesc->Reference.Object)->Common.ReferenceCount; i++)
{
AcpiUtAddReference (NewDesc);
AcpiUtRemoveReference (ObjDesc);
}
}
*(IndexDesc->Reference.Where) = NewDesc;
/* Increment reference count by the ref count of the parent package -1 */
for (i = 1; i < ((ACPI_OPERAND_OBJECT *) IndexDesc->Reference.Object)->Common.ReferenceCount; i++)
{
AcpiUtAddReference (NewDesc);
}
break;
case ACPI_TYPE_BUFFER_FIELD:
/*
* Store into a Buffer (not actually a real BufferField) at a
* location defined by an Index.
* Store into a Buffer or String (not actually a real BufferField)
* at a location defined by an Index.
*
* The first 8-bit element of the source object is written to the
* 8-bit Buffer location defined by the Index destination object,
@ -422,10 +429,13 @@ AcpiExStoreObjectToIndex (
*/
/*
* Make sure the target is a Buffer
* Make sure the target is a Buffer or String. An error should
* not happen here, since the ReferenceObject was constructed
* by the INDEX_OP code.
*/
ObjDesc = IndexDesc->Reference.Object;
if (ACPI_GET_OBJECT_TYPE (ObjDesc) != ACPI_TYPE_BUFFER)
if ((ACPI_GET_OBJECT_TYPE (ObjDesc) != ACPI_TYPE_BUFFER) &&
(ACPI_GET_OBJECT_TYPE (ObjDesc) != ACPI_TYPE_STRING))
{
return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
}
@ -444,13 +454,11 @@ AcpiExStoreObjectToIndex (
break;
case ACPI_TYPE_BUFFER:
Value = SourceDesc->Buffer.Pointer[0];
break;
case ACPI_TYPE_STRING:
Value = (UINT8) SourceDesc->String.Pointer[0];
/* Note: Takes advantage of common string/buffer fields */
Value = SourceDesc->Buffer.Pointer[0];
break;
default:

View File

@ -2,7 +2,7 @@
/******************************************************************************
*
* Module Name: exsystem - Interface to OS services
* $Revision: 80 $
* $Revision: 81 $
*
*****************************************************************************/
@ -246,7 +246,7 @@ AcpiExSystemDoStall (
ACPI_STATUS
AcpiExSystemDoSuspend (
UINT32 HowLong)
ACPI_INTEGER HowLong)
{
ACPI_STATUS Status;
@ -258,8 +258,7 @@ AcpiExSystemDoSuspend (
AcpiExExitInterpreter ();
AcpiOsSleep ((UINT16) (HowLong / (UINT32) 1000),
(UINT16) (HowLong % (UINT32) 1000));
AcpiOsSleep (HowLong);
/* And now we must get the interpreter again */

View File

@ -2,7 +2,7 @@
/******************************************************************************
*
* Module Name: exutils - interpreter/scanner utilities
* $Revision: 111 $
* $Revision: 112 $
*
*****************************************************************************/
@ -363,27 +363,27 @@ AcpiExDigitsNeeded (
{
UINT32 NumDigits;
ACPI_INTEGER CurrentValue;
ACPI_INTEGER Quotient;
ACPI_FUNCTION_TRACE ("ExDigitsNeeded");
/*
* ACPI_INTEGER is unsigned, so we don't worry about a '-'
*/
if ((CurrentValue = Value) == 0)
/* ACPI_INTEGER is unsigned, so we don't worry about a '-' prefix */
if (Value == 0)
{
return_VALUE (1);
}
CurrentValue = Value;
NumDigits = 0;
/* Count the digits in the requested base */
while (CurrentValue)
{
(void) AcpiUtShortDivide (&CurrentValue, Base, &Quotient, NULL);
(void) AcpiUtShortDivide (CurrentValue, Base, &CurrentValue, NULL);
NumDigits++;
CurrentValue = Quotient;
}
return_VALUE (NumDigits);
@ -446,7 +446,6 @@ AcpiExUnsignedIntegerToString (
UINT32 Count;
UINT32 DigitsNeeded;
UINT32 Remainder;
ACPI_INTEGER Quotient;
ACPI_FUNCTION_ENTRY ();
@ -457,9 +456,8 @@ AcpiExUnsignedIntegerToString (
for (Count = DigitsNeeded; Count > 0; Count--)
{
(void) AcpiUtShortDivide (&Value, 10, &Quotient, &Remainder);
(void) AcpiUtShortDivide (Value, 10, &Value, &Remainder);
OutString[Count-1] = (char) ('0' + Remainder);\
Value = Quotient;
}
}

View File

@ -2,7 +2,7 @@
/******************************************************************************
*
* Module Name: hwgpe - Low level GPE enable/disable/clear functions
* $Revision: 62 $
* $Revision: 65 $
*
*****************************************************************************/
@ -130,8 +130,8 @@
*
* RETURN: Status
*
* DESCRIPTION: Write a GPE enable register. Note: The bit for this GPE must
* already be cleared or set in the parent register
* DESCRIPTION: Write a GPE enable register. Note: The bit for this GPE must
* already be cleared or set in the parent register
* EnableForRun mask.
*
******************************************************************************/
@ -170,7 +170,7 @@ AcpiHwWriteGpeEnableReg (
*
* PARAMETERS: GpeEventInfo - Info block for the GPE to be cleared
*
* RETURN: StatusStatus
* RETURN: Status
*
* DESCRIPTION: Clear the status bit for a single GPE.
*
@ -453,7 +453,7 @@ AcpiHwEnableWakeupGpeBlock (
*
* FUNCTION: AcpiHwDisableAllGpes
*
* PARAMETERS: None
* PARAMETERS: Flags - ACPI_NOT_ISR or ACPI_ISR
*
* RETURN: Status
*
@ -463,7 +463,7 @@ AcpiHwEnableWakeupGpeBlock (
ACPI_STATUS
AcpiHwDisableAllGpes (
void)
UINT32 Flags)
{
ACPI_STATUS Status;
@ -471,8 +471,8 @@ AcpiHwDisableAllGpes (
ACPI_FUNCTION_TRACE ("HwDisableAllGpes");
Status = AcpiEvWalkGpeList (AcpiHwDisableGpeBlock);
Status = AcpiEvWalkGpeList (AcpiHwClearGpeBlock);
Status = AcpiEvWalkGpeList (AcpiHwDisableGpeBlock, Flags);
Status = AcpiEvWalkGpeList (AcpiHwClearGpeBlock, Flags);
return_ACPI_STATUS (Status);
}
@ -481,7 +481,7 @@ AcpiHwDisableAllGpes (
*
* FUNCTION: AcpiHwEnableAllRuntimeGpes
*
* PARAMETERS: None
* PARAMETERS: Flags - ACPI_NOT_ISR or ACPI_ISR
*
* RETURN: Status
*
@ -491,7 +491,7 @@ AcpiHwDisableAllGpes (
ACPI_STATUS
AcpiHwEnableAllRuntimeGpes (
void)
UINT32 Flags)
{
ACPI_STATUS Status;
@ -499,7 +499,7 @@ AcpiHwEnableAllRuntimeGpes (
ACPI_FUNCTION_TRACE ("HwEnableAllRuntimeGpes");
Status = AcpiEvWalkGpeList (AcpiHwEnableRuntimeGpeBlock);
Status = AcpiEvWalkGpeList (AcpiHwEnableRuntimeGpeBlock, Flags);
return_ACPI_STATUS (Status);
}
@ -508,7 +508,7 @@ AcpiHwEnableAllRuntimeGpes (
*
* FUNCTION: AcpiHwEnableAllWakeupGpes
*
* PARAMETERS: None
* PARAMETERS: Flags - ACPI_NOT_ISR or ACPI_ISR
*
* RETURN: Status
*
@ -518,7 +518,7 @@ AcpiHwEnableAllRuntimeGpes (
ACPI_STATUS
AcpiHwEnableAllWakeupGpes (
void)
UINT32 Flags)
{
ACPI_STATUS Status;
@ -526,7 +526,7 @@ AcpiHwEnableAllWakeupGpes (
ACPI_FUNCTION_TRACE ("HwEnableAllWakeupGpes");
Status = AcpiEvWalkGpeList (AcpiHwEnableWakeupGpeBlock);
Status = AcpiEvWalkGpeList (AcpiHwEnableWakeupGpeBlock, Flags);
return_ACPI_STATUS (Status);
}

View File

@ -3,7 +3,7 @@
*
* Module Name: hwregs - Read/write access functions for the various ACPI
* control and status registers.
* $Revision: 156 $
* $Revision: 162 $
*
******************************************************************************/
@ -135,6 +135,7 @@
* RETURN: none
*
* DESCRIPTION: Clears all fixed and general purpose status bits
* THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED
*
******************************************************************************/
@ -182,7 +183,7 @@ AcpiHwClearAcpiStatus (
/* Clear the GPE Bits in all GPE registers in all GPE blocks */
Status = AcpiEvWalkGpeList (AcpiHwClearGpeBlock);
Status = AcpiEvWalkGpeList (AcpiHwClearGpeBlock, ACPI_ISR);
UnlockAndExit:
if (Flags & ACPI_MTX_LOCK)
@ -337,8 +338,8 @@ AcpiHwGetBitRegisterInfo (
* ReturnValue - Value that was read from the register
* Flags - Lock the hardware or not
*
* RETURN: Value is read from specified Register. Value returned is
* normalized to bit0 (is shifted all the way right)
* RETURN: Status and the value read from specified Register. Value
* returned is normalized to bit0 (is shifted all the way right)
*
* DESCRIPTION: ACPI BitRegister read function.
*
@ -375,6 +376,8 @@ AcpiGetRegister (
}
}
/* Read from the register */
Status = AcpiHwRegisterRead (ACPI_MTX_DO_NOT_LOCK,
BitRegInfo->ParentRegister, &RegisterValue);
@ -406,10 +409,10 @@ AcpiGetRegister (
*
* PARAMETERS: RegisterId - ID of ACPI BitRegister to access
* Value - (only used on write) value to write to the
* Register, NOT pre-normalized to the bit pos.
* Register, NOT pre-normalized to the bit pos
* Flags - Lock the hardware or not
*
* RETURN: None
* RETURN: Status
*
* DESCRIPTION: ACPI Bit Register write function.
*
@ -562,10 +565,11 @@ UnlockAndExit:
*
* FUNCTION: AcpiHwRegisterRead
*
* PARAMETERS: UseLock - Mutex hw access.
* RegisterId - RegisterID + Offset.
* PARAMETERS: UseLock - Mutex hw access
* RegisterId - RegisterID + Offset
* ReturnValue - Value that was read from the register
*
* RETURN: Value read or written.
* RETURN: Status and the value read.
*
* DESCRIPTION: Acpi register read function. Registers are read at the
* given offset.
@ -681,10 +685,11 @@ UnlockAndExit:
*
* FUNCTION: AcpiHwRegisterWrite
*
* PARAMETERS: UseLock - Mutex hw access.
* RegisterId - RegisterID + Offset.
* PARAMETERS: UseLock - Mutex hw access
* RegisterId - RegisterID + Offset
* Value - The value to write
*
* RETURN: Value read or written.
* RETURN: Status
*
* DESCRIPTION: Acpi register Write function. Registers are written at the
* given offset.
@ -807,11 +812,11 @@ UnlockAndExit:
*
* PARAMETERS: Width - 8, 16, or 32
* Value - Where the value is returned
* Register - GAS register structure
* Reg - GAS register structure
*
* RETURN: Status
*
* DESCRIPTION: Read from either memory, IO, or PCI config space.
* DESCRIPTION: Read from either memory or IO space.
*
******************************************************************************/
@ -821,8 +826,7 @@ AcpiHwLowLevelRead (
UINT32 *Value,
ACPI_GENERIC_ADDRESS *Reg)
{
ACPI_PCI_ID PciId;
UINT16 PciRegister;
UINT64 Address;
ACPI_STATUS Status;
@ -834,43 +838,37 @@ AcpiHwLowLevelRead (
* a non-zero address within. However, don't return an error
* because the PM1A/B code must not fail if B isn't present.
*/
if ((!Reg) ||
(!ACPI_VALID_ADDRESS (Reg->Address)))
if (!Reg)
{
return (AE_OK);
}
/* Get a local copy of the address. Handles possible alignment issues */
ACPI_MOVE_64_TO_64 (&Address, &Reg->Address);
if (!ACPI_VALID_ADDRESS (Address))
{
return (AE_OK);
}
*Value = 0;
/*
* Three address spaces supported:
* Memory, IO, or PCI_Config.
* Two address spaces supported: Memory or IO.
* PCI_Config is not supported here because the GAS struct is insufficient
*/
switch (Reg->AddressSpaceId)
{
case ACPI_ADR_SPACE_SYSTEM_MEMORY:
Status = AcpiOsReadMemory (
(ACPI_PHYSICAL_ADDRESS) ACPI_GET_ADDRESS (Reg->Address),
(ACPI_PHYSICAL_ADDRESS) ACPI_GET_ADDRESS (Address),
Value, Width);
break;
case ACPI_ADR_SPACE_SYSTEM_IO:
Status = AcpiOsReadPort ((ACPI_IO_ADDRESS) ACPI_GET_ADDRESS (Reg->Address),
Value, Width);
break;
case ACPI_ADR_SPACE_PCI_CONFIG:
PciId.Segment = 0;
PciId.Bus = 0;
PciId.Device = ACPI_PCI_DEVICE (ACPI_GET_ADDRESS (Reg->Address));
PciId.Function = ACPI_PCI_FUNCTION (ACPI_GET_ADDRESS (Reg->Address));
PciRegister = (UINT16) ACPI_PCI_REGISTER (ACPI_GET_ADDRESS (Reg->Address));
Status = AcpiOsReadPciConfiguration (&PciId, PciRegister,
Status = AcpiOsReadPort ((ACPI_IO_ADDRESS) ACPI_GET_ADDRESS (Address),
Value, Width);
break;
@ -883,7 +881,7 @@ AcpiHwLowLevelRead (
ACPI_DEBUG_PRINT ((ACPI_DB_IO, "Read: %8.8X width %2d from %8.8X%8.8X (%s)\n",
*Value, Width,
ACPI_FORMAT_UINT64 (ACPI_GET_ADDRESS (Reg->Address)),
ACPI_FORMAT_UINT64 (ACPI_GET_ADDRESS (Address)),
AcpiUtGetRegionName (Reg->AddressSpaceId)));
return (Status);
@ -896,11 +894,11 @@ AcpiHwLowLevelRead (
*
* PARAMETERS: Width - 8, 16, or 32
* Value - To be written
* Register - GAS register structure
* Reg - GAS register structure
*
* RETURN: Status
*
* DESCRIPTION: Write to either memory, IO, or PCI config space.
* DESCRIPTION: Write to either memory or IO space.
*
******************************************************************************/
@ -910,8 +908,7 @@ AcpiHwLowLevelWrite (
UINT32 Value,
ACPI_GENERIC_ADDRESS *Reg)
{
ACPI_PCI_ID PciId;
UINT16 PciRegister;
UINT64 Address;
ACPI_STATUS Status;
@ -923,46 +920,40 @@ AcpiHwLowLevelWrite (
* a non-zero address within. However, don't return an error
* because the PM1A/B code must not fail if B isn't present.
*/
if ((!Reg) ||
(!ACPI_VALID_ADDRESS (Reg->Address)))
if (!Reg)
{
return (AE_OK);
}
/* Get a local copy of the address. Handles possible alignment issues */
ACPI_MOVE_64_TO_64 (&Address, &Reg->Address);
if (!ACPI_VALID_ADDRESS (Address))
{
return (AE_OK);
}
/*
* Three address spaces supported:
* Memory, IO, or PCI_Config.
* Two address spaces supported: Memory or IO.
* PCI_Config is not supported here because the GAS struct is insufficient
*/
switch (Reg->AddressSpaceId)
{
case ACPI_ADR_SPACE_SYSTEM_MEMORY:
Status = AcpiOsWriteMemory (
(ACPI_PHYSICAL_ADDRESS) ACPI_GET_ADDRESS (Reg->Address),
(ACPI_PHYSICAL_ADDRESS) ACPI_GET_ADDRESS (Address),
Value, Width);
break;
case ACPI_ADR_SPACE_SYSTEM_IO:
Status = AcpiOsWritePort ((ACPI_IO_ADDRESS) ACPI_GET_ADDRESS (Reg->Address),
Status = AcpiOsWritePort ((ACPI_IO_ADDRESS) ACPI_GET_ADDRESS (Address),
Value, Width);
break;
case ACPI_ADR_SPACE_PCI_CONFIG:
PciId.Segment = 0;
PciId.Bus = 0;
PciId.Device = ACPI_PCI_DEVICE (ACPI_GET_ADDRESS (Reg->Address));
PciId.Function = ACPI_PCI_FUNCTION (ACPI_GET_ADDRESS (Reg->Address));
PciRegister = (UINT16) ACPI_PCI_REGISTER (ACPI_GET_ADDRESS (Reg->Address));
Status = AcpiOsWritePciConfiguration (&PciId, PciRegister,
(ACPI_INTEGER) Value, Width);
break;
default:
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
"Unsupported address space: %X\n", Reg->AddressSpaceId));
@ -971,7 +962,7 @@ AcpiHwLowLevelWrite (
ACPI_DEBUG_PRINT ((ACPI_DB_IO, "Wrote: %8.8X width %2d to %8.8X%8.8X (%s)\n",
Value, Width,
ACPI_FORMAT_UINT64 (ACPI_GET_ADDRESS (Reg->Address)),
ACPI_FORMAT_UINT64 (ACPI_GET_ADDRESS (Address)),
AcpiUtGetRegionName (Reg->AddressSpaceId)));
return (Status);

View File

@ -2,7 +2,7 @@
/******************************************************************************
*
* Name: hwsleep.c - ACPI Hardware Sleep/Wake Interface
* $Revision: 69 $
* $Revision: 70 $
*
*****************************************************************************/
@ -380,14 +380,14 @@ AcpiEnterSleepState (
* 1) Disable/Clear all GPEs
* 2) Enable all wakeup GPEs
*/
Status = AcpiHwDisableAllGpes ();
Status = AcpiHwDisableAllGpes (ACPI_ISR);
if (ACPI_FAILURE (Status))
{
return_ACPI_STATUS (Status);
}
AcpiGbl_SystemAwakeAndRunning = FALSE;
Status = AcpiHwEnableAllWakeupGpes ();
Status = AcpiHwEnableAllWakeupGpes (ACPI_ISR);
if (ACPI_FAILURE (Status))
{
return_ACPI_STATUS (Status);
@ -532,14 +532,14 @@ AcpiEnterSleepStateS4bios (
* 1) Disable/Clear all GPEs
* 2) Enable all wakeup GPEs
*/
Status = AcpiHwDisableAllGpes ();
Status = AcpiHwDisableAllGpes (ACPI_ISR);
if (ACPI_FAILURE (Status))
{
return_ACPI_STATUS (Status);
}
AcpiGbl_SystemAwakeAndRunning = FALSE;
Status = AcpiHwEnableAllWakeupGpes ();
Status = AcpiHwEnableAllWakeupGpes (ACPI_ISR);
if (ACPI_FAILURE (Status))
{
return_ACPI_STATUS (Status);
@ -571,6 +571,7 @@ AcpiEnterSleepStateS4bios (
* RETURN: Status
*
* DESCRIPTION: Perform OS-independent ACPI cleanup after a sleep
* Called with interrupts ENABLED.
*
******************************************************************************/
@ -666,14 +667,14 @@ AcpiLeaveSleepState (
* 1) Disable/Clear all GPEs
* 2) Enable all runtime GPEs
*/
Status = AcpiHwDisableAllGpes ();
Status = AcpiHwDisableAllGpes (ACPI_NOT_ISR);
if (ACPI_FAILURE (Status))
{
return_ACPI_STATUS (Status);
}
AcpiGbl_SystemAwakeAndRunning = TRUE;
Status = AcpiHwEnableAllRuntimeGpes ();
Status = AcpiHwEnableAllRuntimeGpes (ACPI_NOT_ISR);
if (ACPI_FAILURE (Status))
{
return_ACPI_STATUS (Status);

View File

@ -2,7 +2,7 @@
/******************************************************************************
*
* Name: hwtimer.c - ACPI Power Management Timer Interface
* $Revision: 26 $
* $Revision: 28 $
*
*****************************************************************************/
@ -125,11 +125,11 @@
*
* FUNCTION: AcpiGetTimerResolution
*
* PARAMETERS: none
* PARAMETERS: Resolution - Where the resolution is returned
*
* RETURN: Number of bits of resolution in the PM Timer (24 or 32).
* RETURN: Status and timer resolution
*
* DESCRIPTION: Obtains resolution of the ACPI PM Timer.
* DESCRIPTION: Obtains resolution of the ACPI PM Timer (24 or 32 bits).
*
******************************************************************************/
@ -162,11 +162,11 @@ AcpiGetTimerResolution (
*
* FUNCTION: AcpiGetTimer
*
* PARAMETERS: none
* PARAMETERS: Ticks - Where the timer value is returned
*
* RETURN: Current value of the ACPI PM Timer (in ticks).
* RETURN: Status and current ticks
*
* DESCRIPTION: Obtains current value of ACPI PM Timer.
* DESCRIPTION: Obtains current value of ACPI PM Timer (in ticks).
*
******************************************************************************/
@ -195,11 +195,11 @@ AcpiGetTimer (
*
* FUNCTION: AcpiGetTimerDuration
*
* PARAMETERS: StartTicks
* EndTicks
* TimeElapsed
* PARAMETERS: StartTicks - Starting timestamp
* EndTicks - End timestamp
* TimeElapsed - Where the elapsed time is returned
*
* RETURN: TimeElapsed
* RETURN: Status and TimeElapsed
*
* DESCRIPTION: Computes the time elapsed (in microseconds) between two
* PM Timer time stamps, taking into account the possibility of
@ -213,7 +213,7 @@ AcpiGetTimer (
* Note that this function accommodates only a single timer
* rollover. Thus for 24-bit timers, this function should only
* be used for calculating durations less than ~4.6 seconds
* (~20 minutes for 32-bit timers) -- calculations below
* (~20 minutes for 32-bit timers) -- calculations below:
*
* 2**24 Ticks / 3,600,000 Ticks/Sec = 4.66 sec
* 2**32 Ticks / 3,600,000 Ticks/Sec = 1193 sec or 19.88 minutes
@ -226,10 +226,9 @@ AcpiGetTimerDuration (
UINT32 EndTicks,
UINT32 *TimeElapsed)
{
UINT32 DeltaTicks = 0;
UINT64_OVERLAY NormalizedTicks;
ACPI_STATUS Status;
ACPI_INTEGER OutQuotient;
UINT32 DeltaTicks;
ACPI_INTEGER Quotient;
ACPI_FUNCTION_TRACE ("AcpiGetTimerDuration");
@ -242,8 +241,7 @@ AcpiGetTimerDuration (
/*
* Compute Tick Delta:
* -------------------
* Handle (max one) timer rollovers on 24- versus 32-bit timers.
* Handle (max one) timer rollovers on 24-bit versus 32-bit timers.
*/
if (StartTicks < EndTicks)
{
@ -264,26 +262,21 @@ AcpiGetTimerDuration (
DeltaTicks = (0xFFFFFFFF - StartTicks) + EndTicks;
}
}
else
else /* StartTicks == EndTicks */
{
*TimeElapsed = 0;
return_ACPI_STATUS (AE_OK);
}
/*
* Compute Duration:
* -----------------
*
* Requires a 64-bit divide:
* Compute Duration (Requires a 64-bit multiply and divide):
*
* TimeElapsed = (DeltaTicks * 1000000) / PM_TIMER_FREQUENCY;
*/
NormalizedTicks.Full = ((UINT64) DeltaTicks) * 1000000;
Status = AcpiUtShortDivide (((UINT64) DeltaTicks) * 1000000,
PM_TIMER_FREQUENCY, &Quotient, NULL);
Status = AcpiUtShortDivide (&NormalizedTicks.Full, PM_TIMER_FREQUENCY,
&OutQuotient, NULL);
*TimeElapsed = (UINT32) OutQuotient;
*TimeElapsed = (UINT32) Quotient;
return_ACPI_STATUS (Status);
}

View File

@ -1,7 +1,7 @@
/*******************************************************************************
*
* Module Name: nsaccess - Top-level functions for accessing ACPI namespace
* $Revision: 182 $
* $Revision: 184 $
*
******************************************************************************/
@ -245,8 +245,10 @@ AcpiNsRootInitialize (void)
#if defined (_ACPI_ASL_COMPILER) || defined (_ACPI_DUMP_APP)
/* iASL Compiler cheats by putting parameter count in the OwnerID */
/*
* iASL Compiler cheats by putting parameter count
* in the OwnerID
*/
NewNode->OwnerId = ObjDesc->Method.ParamCount;
#else
/* Mark this as a very SPECIAL method */
@ -290,6 +292,7 @@ AcpiNsRootInitialize (void)
1, &ObjDesc->Mutex.Semaphore);
if (ACPI_FAILURE (Status))
{
AcpiUtRemoveReference (ObjDesc);
goto UnlockAndExit;
}
@ -307,6 +310,7 @@ AcpiNsRootInitialize (void)
&ObjDesc->Mutex.Semaphore);
if (ACPI_FAILURE (Status))
{
AcpiUtRemoveReference (ObjDesc);
goto UnlockAndExit;
}
}
@ -324,7 +328,8 @@ AcpiNsRootInitialize (void)
/* Store pointer to value descriptor in the Node */
Status = AcpiNsAttachObject (NewNode, ObjDesc, ACPI_GET_OBJECT_TYPE (ObjDesc));
Status = AcpiNsAttachObject (NewNode, ObjDesc,
ACPI_GET_OBJECT_TYPE (ObjDesc));
/* Remove local reference to the object */
@ -565,7 +570,8 @@ AcpiNsLookup (
Type = ThisNode->Type;
ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
"Prefix-only Pathname (Zero name segments), Flags=%X\n", Flags));
"Prefix-only Pathname (Zero name segments), Flags=%X\n",
Flags));
break;
case AML_DUAL_NAME_PREFIX:
@ -661,7 +667,7 @@ AcpiNsLookup (
/* Try to find the single (4 character) ACPI name */
Status = AcpiNsSearchAndEnter (SimpleName, WalkState, CurrentNode,
InterpreterMode, ThisSearchType, LocalFlags, &ThisNode);
InterpreterMode, ThisSearchType, LocalFlags, &ThisNode);
if (ACPI_FAILURE (Status))
{
if (Status == AE_NOT_FOUND)

View File

@ -1,7 +1,7 @@
/*******************************************************************************
*
* Module Name: nsalloc - Namespace allocation and deletion utilities
* $Revision: 87 $
* $Revision: 88 $
*
******************************************************************************/
@ -600,15 +600,15 @@ AcpiNsDeleteNamespaceSubtree (
/* Check if this node has any children */
if (AcpiNsGetNextNode (ACPI_TYPE_ANY, ChildNode, 0))
if (AcpiNsGetNextNode (ACPI_TYPE_ANY, ChildNode, NULL))
{
/*
* There is at least one child of this node,
* visit the node
*/
Level++;
ParentNode = ChildNode;
ChildNode = 0;
ParentNode = ChildNode;
ChildNode = NULL;
}
}
else
@ -763,8 +763,8 @@ AcpiNsDeleteNamespaceByOwner (
* visit the node
*/
Level++;
ParentNode = ChildNode;
ChildNode = NULL;
ParentNode = ChildNode;
ChildNode = NULL;
}
else if (ChildNode->OwnerId == OwnerId)
{

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: nsdump - table dumping routines for debug
* $Revision: 158 $
* $Revision: 160 $
*
*****************************************************************************/
@ -282,7 +282,8 @@ AcpiNsDumpOneObject (
if (!AcpiUtValidAcpiName (ThisNode->Name.Integer))
{
ACPI_REPORT_WARNING (("Invalid ACPI Name %08X\n", ThisNode->Name.Integer));
ACPI_REPORT_WARNING (("Invalid ACPI Name %08X\n",
ThisNode->Name.Integer));
}
/*
@ -313,9 +314,8 @@ AcpiNsDumpOneObject (
case ACPI_TYPE_PROCESSOR:
AcpiOsPrintf ("ID %X Len %.4X Addr %p\n",
ObjDesc->Processor.ProcId,
ObjDesc->Processor.Length,
(char *) ObjDesc->Processor.Address);
ObjDesc->Processor.ProcId, ObjDesc->Processor.Length,
(char *) ObjDesc->Processor.Address);
break;
@ -328,16 +328,15 @@ AcpiNsDumpOneObject (
case ACPI_TYPE_METHOD:
AcpiOsPrintf ("Args %X Len %.4X Aml %p\n",
(UINT32) ObjDesc->Method.ParamCount,
ObjDesc->Method.AmlLength,
ObjDesc->Method.AmlStart);
(UINT32) ObjDesc->Method.ParamCount,
ObjDesc->Method.AmlLength, ObjDesc->Method.AmlStart);
break;
case ACPI_TYPE_INTEGER:
AcpiOsPrintf ("= %8.8X%8.8X\n",
ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
break;
@ -346,7 +345,7 @@ AcpiNsDumpOneObject (
if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID)
{
AcpiOsPrintf ("Elements %.2X\n",
ObjDesc->Package.Count);
ObjDesc->Package.Count);
}
else
{
@ -391,12 +390,13 @@ AcpiNsDumpOneObject (
case ACPI_TYPE_REGION:
AcpiOsPrintf ("[%s]", AcpiUtGetRegionName (ObjDesc->Region.SpaceId));
AcpiOsPrintf ("[%s]",
AcpiUtGetRegionName (ObjDesc->Region.SpaceId));
if (ObjDesc->Region.Flags & AOPOBJ_DATA_VALID)
{
AcpiOsPrintf (" Addr %8.8X%8.8X Len %.4X\n",
ACPI_FORMAT_UINT64 (ObjDesc->Region.Address),
ObjDesc->Region.Length);
ACPI_FORMAT_UINT64 (ObjDesc->Region.Address),
ObjDesc->Region.Length);
}
else
{
@ -408,7 +408,7 @@ AcpiNsDumpOneObject (
case ACPI_TYPE_LOCAL_REFERENCE:
AcpiOsPrintf ("[%s]\n",
AcpiPsGetOpcodeName (ObjDesc->Reference.Opcode));
AcpiPsGetOpcodeName (ObjDesc->Reference.Opcode));
break;
@ -418,7 +418,7 @@ AcpiNsDumpOneObject (
ObjDesc->BufferField.BufferObj->Buffer.Node)
{
AcpiOsPrintf ("Buf [%4.4s]",
AcpiUtGetNodeName (ObjDesc->BufferField.BufferObj->Buffer.Node));
AcpiUtGetNodeName (ObjDesc->BufferField.BufferObj->Buffer.Node));
}
break;
@ -426,30 +426,31 @@ AcpiNsDumpOneObject (
case ACPI_TYPE_LOCAL_REGION_FIELD:
AcpiOsPrintf ("Rgn [%4.4s]",
AcpiUtGetNodeName (ObjDesc->CommonField.RegionObj->Region.Node));
AcpiUtGetNodeName (ObjDesc->CommonField.RegionObj->Region.Node));
break;
case ACPI_TYPE_LOCAL_BANK_FIELD:
AcpiOsPrintf ("Rgn [%4.4s] Bnk [%4.4s]",
AcpiUtGetNodeName (ObjDesc->CommonField.RegionObj->Region.Node),
AcpiUtGetNodeName (ObjDesc->BankField.BankObj->CommonField.Node));
AcpiUtGetNodeName (ObjDesc->CommonField.RegionObj->Region.Node),
AcpiUtGetNodeName (ObjDesc->BankField.BankObj->CommonField.Node));
break;
case ACPI_TYPE_LOCAL_INDEX_FIELD:
AcpiOsPrintf ("Idx [%4.4s] Dat [%4.4s]",
AcpiUtGetNodeName (ObjDesc->IndexField.IndexObj->CommonField.Node),
AcpiUtGetNodeName (ObjDesc->IndexField.DataObj->CommonField.Node));
AcpiUtGetNodeName (ObjDesc->IndexField.IndexObj->CommonField.Node),
AcpiUtGetNodeName (ObjDesc->IndexField.DataObj->CommonField.Node));
break;
case ACPI_TYPE_LOCAL_ALIAS:
case ACPI_TYPE_LOCAL_METHOD_ALIAS:
AcpiOsPrintf ("Target %4.4s (%p)\n", AcpiUtGetNodeName (ObjDesc), ObjDesc);
AcpiOsPrintf ("Target %4.4s (%p)\n",
AcpiUtGetNodeName (ObjDesc), ObjDesc);
break;
default:
@ -468,10 +469,10 @@ AcpiNsDumpOneObject (
case ACPI_TYPE_LOCAL_INDEX_FIELD:
AcpiOsPrintf (" Off %.3X Len %.2X Acc %.2hd\n",
(ObjDesc->CommonField.BaseByteOffset * 8)
+ ObjDesc->CommonField.StartFieldBitOffset,
ObjDesc->CommonField.BitLength,
ObjDesc->CommonField.AccessByteWidth);
(ObjDesc->CommonField.BaseByteOffset * 8)
+ ObjDesc->CommonField.StartFieldBitOffset,
ObjDesc->CommonField.BitLength,
ObjDesc->CommonField.AccessByteWidth);
break;
default:
@ -574,13 +575,14 @@ AcpiNsDumpOneObject (
if (ObjType > ACPI_TYPE_LOCAL_MAX)
{
AcpiOsPrintf ("(Ptr to ACPI Object type %X [UNKNOWN])\n", ObjType);
AcpiOsPrintf ("(Ptr to ACPI Object type %X [UNKNOWN])\n",
ObjType);
BytesToDump = 32;
}
else
{
AcpiOsPrintf ("(Ptr to ACPI Object type %s, %X)\n",
AcpiUtGetTypeName (ObjType), ObjType);
AcpiUtGetTypeName (ObjType), ObjType);
BytesToDump = sizeof (ACPI_OPERAND_OBJECT);
}
break;
@ -588,8 +590,9 @@ AcpiNsDumpOneObject (
default:
AcpiOsPrintf ("(String or Buffer ptr - not an object descriptor) [%s]\n",
AcpiUtGetDescriptorName (ObjDesc));
AcpiOsPrintf (
"(String or Buffer ptr - not an object descriptor) [%s]\n",
AcpiUtGetDescriptorName (ObjDesc));
BytesToDump = 16;
break;
}
@ -658,7 +661,7 @@ Cleanup:
* FUNCTION: AcpiNsDumpObjects
*
* PARAMETERS: Type - Object type to be dumped
* MaxDepth - Maximum depth of dump. Use ACPI_UINT32_MAX
* MaxDepth - Maximum depth of dump. Use ACPI_UINT32_MAX
* for an effectively unlimited depth.
* OwnerId - Dump only objects owned by this ID. Use
* ACPI_UINT32_MAX to match all owners.

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: nsdump - table dumping routines for debug
* $Revision: 10 $
* $Revision: 12 $
*
*****************************************************************************/
@ -168,10 +168,10 @@ AcpiNsDumpOneDevice (
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " "));
}
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " HID: %s, ADR: %8.8X%8.8X, Status: %X\n",
Info->HardwareId.Value,
ACPI_FORMAT_UINT64 (Info->Address),
Info->CurrentStatus));
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES,
" HID: %s, ADR: %8.8X%8.8X, Status: %X\n",
Info->HardwareId.Value, ACPI_FORMAT_UINT64 (Info->Address),
Info->CurrentStatus));
ACPI_MEM_FREE (Info);
}
@ -206,13 +206,14 @@ AcpiNsDumpRootDevices (void)
return;
}
Status = AcpiGetHandle (0, ACPI_NS_SYSTEM_BUS, &SysBusHandle);
Status = AcpiGetHandle (NULL, ACPI_NS_SYSTEM_BUS, &SysBusHandle);
if (ACPI_FAILURE (Status))
{
return;
}
ACPI_DEBUG_PRINT ((ACPI_DB_TABLES, "Display of all devices in the namespace:\n"));
ACPI_DEBUG_PRINT ((ACPI_DB_TABLES,
"Display of all devices in the namespace:\n"));
Status = AcpiNsWalkNamespace (ACPI_TYPE_DEVICE, SysBusHandle,
ACPI_UINT32_MAX, ACPI_NS_WALK_NO_UNLOCK,

View File

@ -2,7 +2,7 @@
*
* Module Name: nseval - Object evaluation interfaces -- includes control
* method lookup and execution.
* $Revision: 127 $
* $Revision: 129 $
*
******************************************************************************/
@ -132,14 +132,9 @@
*
* FUNCTION: AcpiNsEvaluateRelative
*
* PARAMETERS: Handle - The relative containing object
* Pathname - Name of method to execute, If NULL, the
* PARAMETERS: Pathname - Name of method to execute, If NULL, the
* handle is the object to execute
* Params - List of parameters to pass to the method,
* terminated by NULL. Params itself may be
* NULL if no parameters are being passed.
* ReturnObject - Where to put method's return value (if
* any). If NULL, no value is returned.
* Info - Method info block
*
* RETURN: Status
*
@ -219,8 +214,7 @@ AcpiNsEvaluateRelative (
}
/*
* Now that we have a handle to the object, we can attempt
* to evaluate it.
* Now that we have a handle to the object, we can attempt to evaluate it.
*/
ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "%s [%p] Value %p\n",
Pathname, Node, AcpiNsGetAttachedObject (Node)));
@ -246,9 +240,9 @@ Cleanup1:
*
* PARAMETERS: Pathname - Fully qualified pathname to the object
* Info - Contains:
* ReturnObject - Where to put method's return value (if
* ReturnObject - Where to put method's return value (if
* any). If NULL, no value is returned.
* Params - List of parameters to pass to the method,
* Params - List of parameters to pass to the method,
* terminated by NULL. Params itself may be
* NULL if no parameters are being passed.
*
@ -297,14 +291,14 @@ AcpiNsEvaluateByName (
if (ACPI_FAILURE (Status))
{
ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Object at [%s] was not found, status=%.4X\n",
ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
"Object at [%s] was not found, status=%.4X\n",
Pathname, Status));
goto Cleanup;
}
/*
* Now that we have a handle to the object, we can attempt
* to evaluate it.
* Now that we have a handle to the object, we can attempt to evaluate it.
*/
ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "%s [%p] Value %p\n",
Pathname, Info->Node, AcpiNsGetAttachedObject (Info->Node)));
@ -392,9 +386,8 @@ AcpiNsEvaluateByHandle (
}
/*
* For a method alias, we must grab the actual method node
* so that proper scoping context will be established
* before execution.
* For a method alias, we must grab the actual method node so that proper
* scoping context will be established before execution.
*/
if (AcpiNsGetType (Info->Node) == ACPI_TYPE_LOCAL_METHOD_ALIAS)
{
@ -404,11 +397,9 @@ AcpiNsEvaluateByHandle (
/*
* Two major cases here:
* 1) The object is an actual control method -- execute it.
* 2) The object is not a method -- just return it's current
* value
* 2) The object is not a method -- just return it's current value
*
* In both cases, the namespace is unlocked by the
* AcpiNs* procedure
* In both cases, the namespace is unlocked by the AcpiNs* procedure
*/
if (AcpiNsGetType (Info->Node) == ACPI_TYPE_METHOD)
{
@ -420,15 +411,13 @@ AcpiNsEvaluateByHandle (
else
{
/*
* Case 2) Object is NOT a method, just return its
* current value
* Case 2) Object is NOT a method, just return its current value
*/
Status = AcpiNsGetObjectValue (Info);
}
/*
* Check if there is a return value on the stack that must
* be dealt with
* Check if there is a return value on the stack that must be dealt with
*/
if (Status == AE_CTRL_RETURN_VALUE)
{
@ -438,8 +427,8 @@ AcpiNsEvaluateByHandle (
}
/*
* Namespace was unlocked by the handling AcpiNs* function,
* so we just return
* Namespace was unlocked by the handling AcpiNs* function, so we
* just return
*/
return_ACPI_STATUS (Status);
}
@ -449,12 +438,7 @@ AcpiNsEvaluateByHandle (
*
* FUNCTION: AcpiNsExecuteControlMethod
*
* PARAMETERS: MethodNode - The method to execute
* Params - List of parameters to pass to the method,
* terminated by NULL. Params itself may be
* NULL if no parameters are being passed.
* ReturnObjDesc - List of result objects to be returned
* from the method.
* PARAMETERS: Info - Method info block (w/params)
*
* RETURN: Status
*
@ -526,8 +510,7 @@ AcpiNsExecuteControlMethod (
*
* FUNCTION: AcpiNsGetObjectValue
*
* PARAMETERS: Node - The object
* ReturnObjDesc - Where the objects value is returned
* PARAMETERS: Info - Method info block (w/params)
*
* RETURN: Status
*
@ -549,28 +532,25 @@ AcpiNsGetObjectValue (
/*
* Objects require additional resolution steps (e.g., the
* Node may be a field that must be read, etc.) -- we can't just grab
* the object out of the node.
* Objects require additional resolution steps (e.g., the Node may be a
* field that must be read, etc.) -- we can't just grab the object out of
* the node.
*/
/*
* Use ResolveNodeToValue() to get the associated value. This call
* always deletes ObjDesc (allocated above).
* Use ResolveNodeToValue() to get the associated value. This call always
* deletes ObjDesc (allocated above).
*
* NOTE: we can get away with passing in NULL for a walk state
* because ObjDesc is guaranteed to not be a reference to either
* a method local or a method argument (because this interface can only be
* called from the AcpiEvaluate external interface, never called from
* a running control method.)
* NOTE: we can get away with passing in NULL for a walk state because
* ObjDesc is guaranteed to not be a reference to either a method local or
* a method argument (because this interface can only be called from the
* AcpiEvaluate external interface, never called from a running method.)
*
* Even though we do not directly invoke the interpreter
* for this, we must enter it because we could access an opregion.
* The opregion access code assumes that the interpreter
* is locked.
* Even though we do not directly invoke the interpreter for this, we must
* enter it because we could access an opregion. The opregion access code
* assumes that the interpreter is locked.
*
* We must release the namespace lock before entering the
* intepreter.
* We must release the namespace lock before entering the intepreter.
*/
Status = AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
if (ACPI_FAILURE (Status))
@ -583,17 +563,19 @@ AcpiNsGetObjectValue (
{
Status = AcpiExResolveNodeToValue (&ResolvedNode, NULL);
/*
* If AcpiExResolveNodeToValue() succeeded, the return value was
* placed in ResolvedNode.
* If AcpiExResolveNodeToValue() succeeded, the return value was placed
* in ResolvedNode.
*/
AcpiExExitInterpreter ();
if (ACPI_SUCCESS (Status))
{
Status = AE_CTRL_RETURN_VALUE;
Info->ReturnObject = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, ResolvedNode);
Info->ReturnObject = ACPI_CAST_PTR
(ACPI_OPERAND_OBJECT, ResolvedNode);
ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Returning object %p [%s]\n",
Info->ReturnObject, AcpiUtGetObjectTypeName (Info->ReturnObject)));
Info->ReturnObject,
AcpiUtGetObjectTypeName (Info->ReturnObject)));
}
}

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: nsinit - namespace initialization
* $Revision: 60 $
* $Revision: 62 $
*
*****************************************************************************/
@ -152,7 +152,8 @@ AcpiNsInitializeObjects (
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
"**** Starting initialization of namespace objects ****\n"));
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, "Completing Region/Field/Buffer/Package initialization:"));
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT,
"Completing Region/Field/Buffer/Package initialization:"));
/* Set all init info to zero */
@ -218,7 +219,8 @@ AcpiNsInitializeDevices (
Info.Num_STA = 0;
Info.Num_INI = 0;
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, "Executing all Device _STA and_INI methods:"));
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT,
"Executing all Device _STA and_INI methods:"));
Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
if (ACPI_FAILURE (Status))
@ -339,8 +341,8 @@ AcpiNsInitOneObject (
}
/*
* Each of these types can contain executable AML code within
* the declaration.
* Each of these types can contain executable AML code within the
* declaration.
*/
switch (Type)
{
@ -350,21 +352,18 @@ AcpiNsInitOneObject (
Status = AcpiDsGetRegionArguments (ObjDesc);
break;
case ACPI_TYPE_BUFFER_FIELD:
Info->FieldInit++;
Status = AcpiDsGetBufferFieldArguments (ObjDesc);
break;
case ACPI_TYPE_BUFFER:
Info->BufferInit++;
Status = AcpiDsGetBufferArguments (ObjDesc);
break;
case ACPI_TYPE_PACKAGE:
Info->PackageInit++;
@ -385,16 +384,18 @@ AcpiNsInitOneObject (
AcpiFormatException (Status)));
}
/* Print a dot for each object unless we are going to print the entire pathname */
/*
* Print a dot for each object unless we are going to print the entire
* pathname
*/
if (!(AcpiDbgLevel & ACPI_LV_INIT_NAMES))
{
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, "."));
}
/*
* We ignore errors from above, and always return OK, since
* we don't want to abort the walk on any single error.
* We ignore errors from above, and always return OK, since we don't want
* to abort the walk on any single error.
*/
AcpiExExitInterpreter ();
return (AE_OK);
@ -450,7 +451,8 @@ AcpiNsInitOneDevice (
return_ACPI_STATUS (AE_OK);
}
if ((AcpiDbgLevel <= ACPI_LV_ALL_EXCEPTIONS) && (!(AcpiDbgLevel & ACPI_LV_INFO)))
if ((AcpiDbgLevel <= ACPI_LV_ALL_EXCEPTIONS) &&
(!(AcpiDbgLevel & ACPI_LV_INFO)))
{
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, "."));
}
@ -525,6 +527,5 @@ AcpiNsInitOneDevice (
Status = AcpiGbl_InitHandler (Pinfo.Node, ACPI_INIT_DEVICE_INI);
}
return_ACPI_STATUS (Status);
}

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: nsload - namespace loading/expanding/contracting procedures
* $Revision: 67 $
* $Revision: 69 $
*
*****************************************************************************/
@ -168,13 +168,15 @@ AcpiNsLoadTable (
return_ACPI_STATUS (AE_BAD_PARAMETER);
}
ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "AML block at %p\n", TableDesc->AmlStart));
ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "AML block at %p\n",
TableDesc->AmlStart));
/* Ignore table if there is no AML contained within */
if (!TableDesc->AmlLength)
{
ACPI_REPORT_WARNING (("Zero-length AML block in table [%4.4s]\n", TableDesc->Pointer->Signature));
ACPI_REPORT_WARNING (("Zero-length AML block in table [%4.4s]\n",
TableDesc->Pointer->Signature));
return_ACPI_STATUS (AE_OK);
}
@ -187,7 +189,8 @@ AcpiNsLoadTable (
* to another control method, we can't continue parsing
* because we don't know how many arguments to parse next!
*/
ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "**** Loading table into namespace ****\n"));
ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
"**** Loading table into namespace ****\n"));
Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
if (ACPI_FAILURE (Status))
@ -279,7 +282,6 @@ AcpiNsLoadTableByType (
{
TableDesc->LoadedIntoNamespace = TRUE;
}
break;
@ -341,7 +343,6 @@ AcpiNsLoadTableByType (
TableDesc = TableDesc->Next;
}
break;
@ -443,7 +444,7 @@ AcpiNsDeleteSubtree (
ParentHandle = StartHandle;
ChildHandle = 0;
ChildHandle = NULL;
Level = 1;
/*
@ -466,7 +467,7 @@ AcpiNsDeleteSubtree (
/* Check if this object has any children */
if (ACPI_SUCCESS (AcpiGetNextObject (ACPI_TYPE_ANY, ChildHandle,
0, &Dummy)))
NULL, &Dummy)))
{
/*
* There is at least one child of this object,
@ -474,7 +475,7 @@ AcpiNsDeleteSubtree (
*/
Level++;
ParentHandle = ChildHandle;
ChildHandle = 0;
ChildHandle = NULL;
}
}
else

View File

@ -1,7 +1,7 @@
/*******************************************************************************
*
* Module Name: nsnames - Name manipulation and search
* $Revision: 84 $
* $Revision: 86 $
*
******************************************************************************/
@ -281,7 +281,12 @@ AcpiNsGetPathnameLength (
NextNode = AcpiNsGetParentNode (NextNode);
}
return (Size + 1);
if (!Size)
{
Size = 1; /* Root node case */
}
return (Size + 1); /* +1 for null string terminator */
}
@ -334,7 +339,8 @@ AcpiNsHandleToPathname (
AcpiNsBuildExternalPath (Node, RequiredSize, Buffer->Pointer);
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%s [%X] \n", (char *) Buffer->Pointer, (UINT32) RequiredSize));
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%s [%X] \n",
(char *) Buffer->Pointer, (UINT32) RequiredSize));
return_ACPI_STATUS (AE_OK);
}

View File

@ -1,7 +1,7 @@
/*******************************************************************************
*
* Module Name: nssearch - Namespace search
* $Revision: 101 $
* $Revision: 103 $
*
******************************************************************************/
@ -172,8 +172,10 @@ AcpiNsSearchNode (
ScopeName = AcpiNsGetExternalPathname (Node);
if (ScopeName)
{
ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Searching %s (%p) For [%4.4s] (%s)\n",
ScopeName, Node, (char *) &TargetName, AcpiUtGetTypeName (Type)));
ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
"Searching %s (%p) For [%4.4s] (%s)\n",
ScopeName, Node, (char *) &TargetName,
AcpiUtGetTypeName (Type)));
ACPI_MEM_FREE (ScopeName);
}
@ -244,7 +246,7 @@ AcpiNsSearchNode (
* PARAMETERS: *TargetName - Ascii ACPI name to search for
* *Node - Starting node where search will begin
* Type - Object type to match
* **ReturnNode - Where the matched Named Obj is returned
* **ReturnNode - Where the matched Node is returned
*
* RETURN: Status
*
@ -279,14 +281,14 @@ AcpiNsSearchParentTree (
ParentNode = AcpiNsGetParentNode (Node);
/*
* If there is no parent (i.e., we are at the root) or
* type is "local", we won't be searching the parent tree.
* If there is no parent (i.e., we are at the root) or type is "local",
* we won't be searching the parent tree.
*/
if (!ParentNode)
{
ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "[%4.4s] has no parent\n",
(char *) &TargetName));
return_ACPI_STATUS (AE_NOT_FOUND);
return_ACPI_STATUS (AE_NOT_FOUND);
}
if (AcpiNsLocal (Type))
@ -299,11 +301,12 @@ AcpiNsSearchParentTree (
/* Search the parent tree */
ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Searching parent for %4.4s\n", (char *) &TargetName));
ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
"Searching parent [%4.4s] for [%4.4s]\n",
AcpiUtGetNodeName (ParentNode), (char *) &TargetName));
/*
* Search parents until found the target or we have backed up to
* the root
* Search parents until target is found or we have backed up to the root
*/
while (ParentNode)
{
@ -313,7 +316,7 @@ AcpiNsSearchParentTree (
* the actual name we are searching for. Typechecking comes later.
*/
Status = AcpiNsSearchNode (TargetName, ParentNode,
ACPI_TYPE_ANY, ReturnNode);
ACPI_TYPE_ANY, ReturnNode);
if (ACPI_SUCCESS (Status))
{
return_ACPI_STATUS (Status);
@ -378,7 +381,8 @@ AcpiNsSearchAndEnter (
if (!Node || !TargetName || !ReturnNode)
{
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Null param: Node %p Name %X ReturnNode %p\n",
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
"Null param: Node %p Name %X ReturnNode %p\n",
Node, TargetName, ReturnNode));
ACPI_REPORT_ERROR (("NsSearchAndEnter: Null parameter\n"));
@ -418,23 +422,21 @@ AcpiNsSearchAndEnter (
}
/*
* The name was not found. If we are NOT performing the
* first pass (name entry) of loading the namespace, search
* the parent tree (all the way to the root if necessary.)
* We don't want to perform the parent search when the
* namespace is actually being loaded. We want to perform
* the search when namespace references are being resolved
* (load pass 2) and during the execution phase.
* The name was not found. If we are NOT performing the first pass
* (name entry) of loading the namespace, search the parent tree (all the
* way to the root if necessary.) We don't want to perform the parent
* search when the namespace is actually being loaded. We want to perform
* the search when namespace references are being resolved (load pass 2)
* and during the execution phase.
*/
if ((InterpreterMode != ACPI_IMODE_LOAD_PASS1) &&
(Flags & ACPI_NS_SEARCH_PARENT))
{
/*
* Not found at this level - search parent tree according
* to ACPI specification
* Not found at this level - search parent tree according to the
* ACPI specification
*/
Status = AcpiNsSearchParentTree (TargetName, Node,
Type, ReturnNode);
Status = AcpiNsSearchParentTree (TargetName, Node, Type, ReturnNode);
if (ACPI_SUCCESS (Status))
{
return_ACPI_STATUS (Status);
@ -446,7 +448,8 @@ AcpiNsSearchAndEnter (
*/
if (InterpreterMode == ACPI_IMODE_EXECUTE)
{
ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "%4.4s Not found in %p [Not adding]\n",
ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
"%4.4s Not found in %p [Not adding]\n",
(char *) &TargetName, Node));
return_ACPI_STATUS (AE_NOT_FOUND);

View File

@ -2,7 +2,7 @@
*
* Module Name: nsutils - Utilities for accessing ACPI namespace, accessing
* parents and siblings and Scope manipulation
* $Revision: 134 $
* $Revision: 136 $
*
*****************************************************************************/
@ -160,13 +160,15 @@ AcpiNsReportError (
{
/* There is a non-ascii character in the name */
AcpiOsPrintf ("[0x%4.4X] (NON-ASCII)\n", *(ACPI_CAST_PTR (UINT32, InternalName)));
AcpiOsPrintf ("[0x%4.4X] (NON-ASCII)\n",
*(ACPI_CAST_PTR (UINT32, InternalName)));
}
else
{
/* Convert path to external format */
Status = AcpiNsExternalizeName (ACPI_UINT32_MAX, InternalName, NULL, &Name);
Status = AcpiNsExternalizeName (ACPI_UINT32_MAX,
InternalName, NULL, &Name);
/* Print target name */
@ -221,7 +223,8 @@ AcpiNsReportMethodError (
if (Path)
{
Status = AcpiNsGetNodeByPath (Path, PrefixNode, ACPI_NS_NO_UPSEARCH, &Node);
Status = AcpiNsGetNodeByPath (Path, PrefixNode,
ACPI_NS_NO_UPSEARCH, &Node);
if (ACPI_FAILURE (Status))
{
AcpiOsPrintf ("ReportMethodError: Could not get node\n");
@ -262,7 +265,7 @@ AcpiNsPrintNodePathname (
return;
}
/* Convert handle to a full pathname and print it (with supplied message) */
/* Convert handle to full pathname and print it (with supplied message) */
Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
@ -410,13 +413,11 @@ AcpiNsGetInternalNameLength (
Info->FullyQualified = FALSE;
/*
* For the internal name, the required length is 4 bytes
* per segment, plus 1 each for RootPrefix, MultiNamePrefixOp,
* segment count, trailing null (which is not really needed,
* but no there's harm in putting it there)
* For the internal name, the required length is 4 bytes per segment, plus
* 1 each for RootPrefix, MultiNamePrefixOp, segment count, trailing null
* (which is not really needed, but no there's harm in putting it there)
*
* strlen() + 1 covers the first NameSeg, which has no
* path separator
* strlen() + 1 covers the first NameSeg, which has no path separator
*/
if (AcpiNsValidRootPrefix (NextExternalChar[0]))
{
@ -436,10 +437,9 @@ AcpiNsGetInternalNameLength (
}
/*
* Determine the number of ACPI name "segments" by counting
* the number of path separators within the string. Start
* with one segment since the segment count is (# separators)
* + 1, and zero separators is ok.
* Determine the number of ACPI name "segments" by counting the number of
* path separators within the string. Start with one segment since the
* segment count is [(# separators) + 1], and zero separators is ok.
*/
if (*NextExternalChar)
{
@ -745,7 +745,8 @@ AcpiNsExternalizeName (
/* <count> 4-byte names */
NamesIndex = PrefixLength + 2;
NumSegments = (ACPI_NATIVE_UINT) (UINT8) InternalName[(ACPI_NATIVE_UINT) (PrefixLength + 1)];
NumSegments = (ACPI_NATIVE_UINT) (UINT8)
InternalName[(ACPI_NATIVE_UINT) (PrefixLength + 1)];
break;
case AML_DUAL_NAME_PREFIX:
@ -793,7 +794,7 @@ AcpiNsExternalizeName (
}
/*
* Build ConvertedName...
* Build ConvertedName
*/
*ConvertedName = ACPI_MEM_CALLOCATE (RequiredLength);
if (!(*ConvertedName))
@ -886,7 +887,7 @@ AcpiNsMapHandleToNode (
*
* PARAMETERS: Node - Node to be converted to a Handle
*
* RETURN: An USER ACPI_HANDLE
* RETURN: A user handle
*
* DESCRIPTION: Convert a real Node to a namespace handle
*
@ -1115,7 +1116,8 @@ AcpiNsFindParentName (
ParentNode = AcpiNsGetParentNode (ChildNode);
if (ParentNode)
{
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Parent of %p [%4.4s] is %p [%4.4s]\n",
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
"Parent of %p [%4.4s] is %p [%4.4s]\n",
ChildNode, AcpiUtGetNodeName (ChildNode),
ParentNode, AcpiUtGetNodeName (ParentNode)));
@ -1125,7 +1127,8 @@ AcpiNsFindParentName (
}
}
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "unable to find parent of %p (%4.4s)\n",
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
"Unable to find parent of %p (%4.4s)\n",
ChildNode, AcpiUtGetNodeName (ChildNode)));
}
@ -1159,11 +1162,9 @@ AcpiNsGetParentNode (
}
/*
* Walk to the end of this peer list.
* The last entry is marked with a flag and the peer
* pointer is really a pointer back to the parent.
* This saves putting a parent back pointer in each and
* every named object!
* Walk to the end of this peer list. The last entry is marked with a flag
* and the peer pointer is really a pointer back to the parent. This saves
* putting a parent back pointer in each and every named object!
*/
while (!(Node->Flags & ANOBJ_END_OF_PEER_LIST))
{
@ -1181,8 +1182,8 @@ AcpiNsGetParentNode (
*
* PARAMETERS: Node - Current table entry
*
* RETURN: Next valid Node in the linked node list. NULL if no more valid
* nodess
* RETURN: Next valid Node in the linked node list. NULL if no more valid
* nodes.
*
* DESCRIPTION: Find the next valid node within a name table.
* Useful for implementing NULL-end-of-list loops.

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: nswalk - Functions for walking the ACPI namespace
* $Revision: 36 $
* $Revision: 37 $
*
*****************************************************************************/
@ -265,7 +265,7 @@ AcpiNsWalkNamespace (
/* Null child means "get first node" */
ParentNode = StartNode;
ChildNode = 0;
ChildNode = NULL;
ChildType = ACPI_TYPE_ANY;
Level = 1;
@ -350,15 +350,15 @@ AcpiNsWalkNamespace (
*/
if ((Level < MaxDepth) && (Status != AE_CTRL_DEPTH))
{
if (AcpiNsGetNextNode (ACPI_TYPE_ANY, ChildNode, 0))
if (AcpiNsGetNextNode (ACPI_TYPE_ANY, ChildNode, NULL))
{
/*
* There is at least one child of this
* node, visit the onde
*/
Level++;
ParentNode = ChildNode;
ChildNode = 0;
ParentNode = ChildNode;
ChildNode = NULL;
}
}
}

View File

@ -185,7 +185,7 @@ AcpiOsGetRootPointer (
ACPI_POINTER *Address)
{
return (AE_OK);
return (AeLocalGetRootPointer(Flags, Address));
}
@ -238,14 +238,28 @@ AcpiOsTableOverride (
ACPI_TABLE_HEADER *ExistingTable,
ACPI_TABLE_HEADER **NewTable)
{
if (!ExistingTable || !NewTable)
{
return (AE_BAD_PARAMETER);
}
/* TODO: Add table-getting code here */
*NewTable = NULL;
return (AE_NO_ACPI_TABLES);
#ifdef _ACPI_EXEC_APP
/* This code exercises the table override mechanism in the core */
if (!ACPI_STRNCMP (ExistingTable->Signature, DSDT_SIG, ACPI_NAME_SIZE))
{
/* override DSDT with itself */
*NewTable = AcpiGbl_DbTablePtr;
}
return (AE_OK);
#else
return AE_NO_ACPI_TABLES;
#endif
}
@ -686,7 +700,7 @@ AcpiOsReleaseLock (
UINT32
AcpiOsInstallInterruptHandler (
UINT32 InterruptNumber,
OSD_HANDLER ServiceRoutine,
ACPI_OSD_HANDLER ServiceRoutine,
void *Context)
{
@ -710,7 +724,7 @@ AcpiOsInstallInterruptHandler (
ACPI_STATUS
AcpiOsRemoveInterruptHandler (
UINT32 InterruptNumber,
OSD_HANDLER ServiceRoutine)
ACPI_OSD_HANDLER ServiceRoutine)
{
return AE_OK;
@ -734,7 +748,7 @@ AcpiOsRemoveInterruptHandler (
ACPI_STATUS
AcpiOsQueueForExecution (
UINT32 Priority,
OSD_EXECUTION_CALLBACK Function,
ACPI_OSD_EXEC_CALLBACK Function,
void *Context)
{
@ -778,7 +792,7 @@ AcpiOsBreakpoint (
/******************************************************************************
*
* FUNCTION: AcpiOsSleepUsec
* FUNCTION: AcpiOsStall
*
* PARAMETERS: microseconds To sleep
*
@ -805,22 +819,20 @@ AcpiOsStall (
*
* FUNCTION: AcpiOsSleep
*
* PARAMETERS: seconds To sleep
* milliseconds To sleep
* PARAMETERS: milliseconds To sleep
*
* RETURN: Blocks until sleep is completed.
*
* DESCRIPTION: Sleep at second/millisecond granularity
* DESCRIPTION: Sleep at millisecond granularity
*
*****************************************************************************/
void
AcpiOsSleep (
UINT32 seconds,
UINT32 milliseconds)
ACPI_INTEGER milliseconds)
{
sleep (seconds + (milliseconds / 1000)); /* Sleep for whole seconds */
sleep (milliseconds / 1000); /* Sleep for whole seconds */
/*
* Arg to usleep() must be less than 1,000,000 (1 second)
@ -836,20 +848,22 @@ AcpiOsSleep (
*
* PARAMETERS: None
*
* RETURN: Current time in milliseconds
* RETURN: Current time in 100 nanosecond units
*
* DESCRIPTION: Get the current system time (in milliseconds).
* DESCRIPTION: Get the current system time
*
*****************************************************************************/
UINT32
UINT64
AcpiOsGetTimer (void)
{
struct timeval time;
gettimeofday(&time, NULL);
return ((time.tv_sec/1000) + (time.tv_usec*1000));
/* Seconds * 10^7 = 100ns(10^-7), Microseconds(10^-6) * 10^1 = 100ns */
return (((UINT64) time.tv_sec * 10000000) + ((UINT64) time.tv_usec * 10));
}

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: psopcode - Parser/Interpreter opcode information table
* $Revision: 78 $
* $Revision: 83 $
*
*****************************************************************************/
@ -267,6 +267,7 @@
#define ARGP_STRING_OP ARGP_LIST1 (ARGP_CHARLIST)
#define ARGP_SUBTRACT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET)
#define ARGP_THERMAL_ZONE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_OBJLIST)
#define ARGP_TIMER_OP ARG_NONE
#define ARGP_TO_BCD_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET)
#define ARGP_TO_BUFFER_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET)
#define ARGP_TO_DEC_STR_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET)
@ -324,7 +325,7 @@
#define ARGI_CREATE_FIELD_OP ARGI_LIST4 (ARGI_BUFFER, ARGI_INTEGER, ARGI_INTEGER, ARGI_REFERENCE)
#define ARGI_CREATE_QWORD_FIELD_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_REFERENCE)
#define ARGI_CREATE_WORD_FIELD_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_REFERENCE)
#define ARGI_DATA_REGION_OP ARGI_LIST3 (ARGI_STRING, ARGI_STRING, ARGI_STRING)
#define ARGI_DATA_REGION_OP ARGI_LIST3 (ARGI_STRING, ARGI_STRING, ARGI_STRING)
#define ARGI_DEBUG_OP ARG_NONE
#define ARGI_DECREMENT_OP ARGI_LIST1 (ARGI_INTEGER_REF)
#define ARGI_DEREF_OF_OP ARGI_LIST1 (ARGI_REF_OR_STRING)
@ -343,10 +344,10 @@
#define ARGI_INDEX_FIELD_OP ARGI_INVALID_OPCODE
#define ARGI_INDEX_OP ARGI_LIST3 (ARGI_COMPLEXOBJ, ARGI_INTEGER, ARGI_TARGETREF)
#define ARGI_LAND_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_INTEGER)
#define ARGI_LEQUAL_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_INTEGER)
#define ARGI_LGREATER_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_INTEGER)
#define ARGI_LEQUAL_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_COMPUTEDATA)
#define ARGI_LGREATER_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_COMPUTEDATA)
#define ARGI_LGREATEREQUAL_OP ARGI_INVALID_OPCODE
#define ARGI_LLESS_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_INTEGER)
#define ARGI_LLESS_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_COMPUTEDATA)
#define ARGI_LLESSEQUAL_OP ARGI_INVALID_OPCODE
#define ARGI_LNOT_OP ARGI_LIST1 (ARGI_INTEGER)
#define ARGI_LNOTEQUAL_OP ARGI_INVALID_OPCODE
@ -390,7 +391,7 @@
#define ARGI_SHIFT_LEFT_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF)
#define ARGI_SHIFT_RIGHT_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF)
#define ARGI_SIGNAL_OP ARGI_LIST1 (ARGI_EVENT)
#define ARGI_SIZE_OF_OP ARGI_LIST1 (ARGI_DATAOBJECT)
#define ARGI_SIZE_OF_OP ARGI_LIST1 (ARGI_REFERENCE) /* Force delay of operand resolution */
#define ARGI_SLEEP_OP ARGI_LIST1 (ARGI_INTEGER)
#define ARGI_STALL_OP ARGI_LIST1 (ARGI_INTEGER)
#define ARGI_STATICSTRING_OP ARGI_INVALID_OPCODE
@ -398,13 +399,14 @@
#define ARGI_STRING_OP ARGI_INVALID_OPCODE
#define ARGI_SUBTRACT_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF)
#define ARGI_THERMAL_ZONE_OP ARGI_INVALID_OPCODE
#define ARGI_TIMER_OP ARG_NONE
#define ARGI_TO_BCD_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_FIXED_TARGET)
#define ARGI_TO_BUFFER_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET)
#define ARGI_TO_DEC_STR_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET)
#define ARGI_TO_HEX_STR_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET)
#define ARGI_TO_INTEGER_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET)
#define ARGI_TO_STRING_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_FIXED_TARGET)
#define ARGI_TYPE_OP ARGI_LIST1 (ARGI_ANYTYPE)
#define ARGI_TYPE_OP ARGI_LIST1 (ARGI_REFERENCE) /* Force delay of operand resolution */
#define ARGI_UNLOAD_OP ARGI_LIST1 (ARGI_DDBHANDLE)
#define ARGI_VAR_PACKAGE_OP ARGI_LIST1 (ARGI_INTEGER)
#define ARGI_WAIT_OP ARGI_LIST2 (ARGI_EVENT, ARGI_INTEGER)
@ -600,8 +602,8 @@ const ACPI_OPCODE_INFO AcpiGbl_AmlOpInfo[AML_NUM_OPCODES] =
/* 35 */ ACPI_OP ("CreateByteField", ARGP_CREATE_BYTE_FIELD_OP, ARGI_CREATE_BYTE_FIELD_OP, ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE),
/* 36 */ ACPI_OP ("CreateBitField", ARGP_CREATE_BIT_FIELD_OP, ARGI_CREATE_BIT_FIELD_OP, ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE),
/* 37 */ ACPI_OP ("ObjectType", ARGP_TYPE_OP, ARGI_TYPE_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R),
/* 38 */ ACPI_OP ("LAnd", ARGP_LAND_OP, ARGI_LAND_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL | AML_CONSTANT),
/* 39 */ ACPI_OP ("LOr", ARGP_LOR_OP, ARGI_LOR_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL | AML_CONSTANT),
/* 38 */ ACPI_OP ("LAnd", ARGP_LAND_OP, ARGI_LAND_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL_NUMERIC | AML_CONSTANT),
/* 39 */ ACPI_OP ("LOr", ARGP_LOR_OP, ARGI_LOR_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL_NUMERIC | AML_CONSTANT),
/* 3A */ ACPI_OP ("LNot", ARGP_LNOT_OP, ARGI_LNOT_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R | AML_CONSTANT),
/* 3B */ ACPI_OP ("LEqual", ARGP_LEQUAL_OP, ARGI_LEQUAL_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL | AML_CONSTANT),
/* 3C */ ACPI_OP ("LGreater", ARGP_LGREATER_OP, ARGI_LGREATER_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL | AML_CONSTANT),
@ -661,7 +663,6 @@ const ACPI_OPCODE_INFO AcpiGbl_AmlOpInfo[AML_NUM_OPCODES] =
/* 6C */ ACPI_OP ("-ASCII_ONLY-", ARG_NONE, ARG_NONE, ACPI_TYPE_ANY, AML_CLASS_ASCII, AML_TYPE_BOGUS, AML_HAS_ARGS),
/* 6D */ ACPI_OP ("-PREFIX_ONLY-", ARG_NONE, ARG_NONE, ACPI_TYPE_ANY, AML_CLASS_PREFIX, AML_TYPE_BOGUS, AML_HAS_ARGS),
/* ACPI 2.0 opcodes */
/* 6E */ ACPI_OP ("QwordConst", ARGP_QWORD_OP, ARGI_QWORD_OP, ACPI_TYPE_INTEGER, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, AML_CONSTANT),
@ -679,7 +680,11 @@ const ACPI_OPCODE_INFO AcpiGbl_AmlOpInfo[AML_NUM_OPCODES] =
/* 7A */ ACPI_OP ("Continue", ARGP_CONTINUE_OP, ARGI_CONTINUE_OP, ACPI_TYPE_ANY, AML_CLASS_CONTROL, AML_TYPE_CONTROL, 0),
/* 7B */ ACPI_OP ("LoadTable", ARGP_LOAD_TABLE_OP, ARGI_LOAD_TABLE_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_6A_0T_1R, AML_FLAGS_EXEC_6A_0T_1R),
/* 7C */ ACPI_OP ("DataTableRegion", ARGP_DATA_REGION_OP, ARGI_DATA_REGION_OP, ACPI_TYPE_REGION, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED),
/* 7D */ ACPI_OP ("[EvalSubTree]", ARGP_SCOPE_OP, ARGI_SCOPE_OP, ACPI_TYPE_ANY, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_NO_OBJ, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE)
/* 7D */ ACPI_OP ("[EvalSubTree]", ARGP_SCOPE_OP, ARGI_SCOPE_OP, ACPI_TYPE_ANY, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_NO_OBJ, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE),
/* ACPI 3.0 opcodes */
/* 7E */ ACPI_OP ("Timer", ARGP_TIMER_OP, ARGI_TIMER_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_0A_0T_1R, AML_FLAGS_EXEC_0A_0T_1R)
/*! [End] no source code translation !*/
};
@ -688,7 +693,6 @@ const ACPI_OPCODE_INFO AcpiGbl_AmlOpInfo[AML_NUM_OPCODES] =
* This table is directly indexed by the opcodes, and returns an
* index into the table above
*/
static const UINT8 AcpiGbl_ShortOpIndex[256] =
{
/* 0 1 2 3 4 5 6 7 */
@ -727,7 +731,10 @@ static const UINT8 AcpiGbl_ShortOpIndex[256] =
/* 0xF8 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, 0x45,
};
/*
* This table is indexed by the second opcode of the extended opcode
* pair. It returns an index into the opcode table (AcpiGbl_AmlOpInfo)
*/
static const UINT8 AcpiGbl_LongOpIndex[NUM_EXTENDED_OPCODE] =
{
/* 0 1 2 3 4 5 6 7 */
@ -738,7 +745,7 @@ static const UINT8 AcpiGbl_LongOpIndex[NUM_EXTENDED_OPCODE] =
/* 0x18 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, 0x7B,
/* 0x20 */ 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51,
/* 0x28 */ 0x52, 0x53, 0x54, _UNK, _UNK, _UNK, _UNK, _UNK,
/* 0x30 */ 0x55, 0x56, 0x57, _UNK, _UNK, _UNK, _UNK, _UNK,
/* 0x30 */ 0x55, 0x56, 0x57, 0x7e, _UNK, _UNK, _UNK, _UNK,
/* 0x38 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
/* 0x40 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
/* 0x48 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
@ -799,7 +806,7 @@ AcpiPsGetOpcodeInfo (
default:
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown extended opcode [%X]\n", Opcode));
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown AML opcode [%4.4X]\n", Opcode));
break;
}

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: psparse - Parser top level AML parse routines
* $Revision: 144 $
* $Revision: 146 $
*
*****************************************************************************/
@ -240,141 +240,143 @@ AcpiPsCompleteThisOp (
/* Delete this op and the subtree below it if asked to */
if (((WalkState->ParseFlags & ACPI_PARSE_TREE_MASK) == ACPI_PARSE_DELETE_TREE) &&
(WalkState->OpInfo->Class != AML_CLASS_ARGUMENT))
if (((WalkState->ParseFlags & ACPI_PARSE_TREE_MASK) != ACPI_PARSE_DELETE_TREE) ||
(WalkState->OpInfo->Class == AML_CLASS_ARGUMENT))
{
/* Make sure that we only delete this subtree */
if (Op->Common.Parent)
{
/*
* Check if we need to replace the operator and its subtree
* with a return value op (placeholder op)
*/
ParentInfo = AcpiPsGetOpcodeInfo (Op->Common.Parent->Common.AmlOpcode);
switch (ParentInfo->Class)
{
case AML_CLASS_CONTROL:
break;
case AML_CLASS_CREATE:
/*
* These opcodes contain TermArg operands. The current
* op must be replaced by a placeholder return op
*/
ReplacementOp = AcpiPsAllocOp (AML_INT_RETURN_VALUE_OP);
if (!ReplacementOp)
{
return_VOID;
}
break;
case AML_CLASS_NAMED_OBJECT:
/*
* These opcodes contain TermArg operands. The current
* op must be replaced by a placeholder return op
*/
if ((Op->Common.Parent->Common.AmlOpcode == AML_REGION_OP) ||
(Op->Common.Parent->Common.AmlOpcode == AML_DATA_REGION_OP) ||
(Op->Common.Parent->Common.AmlOpcode == AML_BUFFER_OP) ||
(Op->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
(Op->Common.Parent->Common.AmlOpcode == AML_VAR_PACKAGE_OP))
{
ReplacementOp = AcpiPsAllocOp (AML_INT_RETURN_VALUE_OP);
if (!ReplacementOp)
{
return_VOID;
}
}
if ((Op->Common.Parent->Common.AmlOpcode == AML_NAME_OP) &&
(WalkState->DescendingCallback != AcpiDsExecBeginOp))
{
if ((Op->Common.AmlOpcode == AML_BUFFER_OP) ||
(Op->Common.AmlOpcode == AML_PACKAGE_OP) ||
(Op->Common.AmlOpcode == AML_VAR_PACKAGE_OP))
{
ReplacementOp = AcpiPsAllocOp (Op->Common.AmlOpcode);
if (!ReplacementOp)
{
return_VOID;
}
ReplacementOp->Named.Data = Op->Named.Data;
ReplacementOp->Named.Length = Op->Named.Length;
}
}
break;
default:
ReplacementOp = AcpiPsAllocOp (AML_INT_RETURN_VALUE_OP);
if (!ReplacementOp)
{
return_VOID;
}
}
/* We must unlink this op from the parent tree */
Prev = Op->Common.Parent->Common.Value.Arg;
if (Prev == Op)
{
/* This op is the first in the list */
if (ReplacementOp)
{
ReplacementOp->Common.Parent = Op->Common.Parent;
ReplacementOp->Common.Value.Arg = NULL;
ReplacementOp->Common.Node = Op->Common.Node;
Op->Common.Parent->Common.Value.Arg = ReplacementOp;
ReplacementOp->Common.Next = Op->Common.Next;
}
else
{
Op->Common.Parent->Common.Value.Arg = Op->Common.Next;
}
}
/* Search the parent list */
else while (Prev)
{
/* Traverse all siblings in the parent's argument list */
Next = Prev->Common.Next;
if (Next == Op)
{
if (ReplacementOp)
{
ReplacementOp->Common.Parent = Op->Common.Parent;
ReplacementOp->Common.Value.Arg = NULL;
ReplacementOp->Common.Node = Op->Common.Node;
Prev->Common.Next = ReplacementOp;
ReplacementOp->Common.Next = Op->Common.Next;
Next = NULL;
}
else
{
Prev->Common.Next = Op->Common.Next;
Next = NULL;
}
}
Prev = Next;
}
}
/* Now we can actually delete the subtree rooted at op */
AcpiPsDeleteParseTree (Op);
return_VOID;
}
/* Make sure that we only delete this subtree */
if (Op->Common.Parent)
{
/*
* Check if we need to replace the operator and its subtree
* with a return value op (placeholder op)
*/
ParentInfo = AcpiPsGetOpcodeInfo (Op->Common.Parent->Common.AmlOpcode);
switch (ParentInfo->Class)
{
case AML_CLASS_CONTROL:
break;
case AML_CLASS_CREATE:
/*
* These opcodes contain TermArg operands. The current
* op must be replaced by a placeholder return op
*/
ReplacementOp = AcpiPsAllocOp (AML_INT_RETURN_VALUE_OP);
if (!ReplacementOp)
{
goto Cleanup;
}
break;
case AML_CLASS_NAMED_OBJECT:
/*
* These opcodes contain TermArg operands. The current
* op must be replaced by a placeholder return op
*/
if ((Op->Common.Parent->Common.AmlOpcode == AML_REGION_OP) ||
(Op->Common.Parent->Common.AmlOpcode == AML_DATA_REGION_OP) ||
(Op->Common.Parent->Common.AmlOpcode == AML_BUFFER_OP) ||
(Op->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
(Op->Common.Parent->Common.AmlOpcode == AML_VAR_PACKAGE_OP))
{
ReplacementOp = AcpiPsAllocOp (AML_INT_RETURN_VALUE_OP);
if (!ReplacementOp)
{
goto Cleanup;
}
}
if ((Op->Common.Parent->Common.AmlOpcode == AML_NAME_OP) &&
(WalkState->DescendingCallback != AcpiDsExecBeginOp))
{
if ((Op->Common.AmlOpcode == AML_BUFFER_OP) ||
(Op->Common.AmlOpcode == AML_PACKAGE_OP) ||
(Op->Common.AmlOpcode == AML_VAR_PACKAGE_OP))
{
ReplacementOp = AcpiPsAllocOp (Op->Common.AmlOpcode);
if (!ReplacementOp)
{
goto Cleanup;
}
ReplacementOp->Named.Data = Op->Named.Data;
ReplacementOp->Named.Length = Op->Named.Length;
}
}
break;
default:
ReplacementOp = AcpiPsAllocOp (AML_INT_RETURN_VALUE_OP);
if (!ReplacementOp)
{
goto Cleanup;
}
}
/* We must unlink this op from the parent tree */
Prev = Op->Common.Parent->Common.Value.Arg;
if (Prev == Op)
{
/* This op is the first in the list */
if (ReplacementOp)
{
ReplacementOp->Common.Parent = Op->Common.Parent;
ReplacementOp->Common.Value.Arg = NULL;
ReplacementOp->Common.Node = Op->Common.Node;
Op->Common.Parent->Common.Value.Arg = ReplacementOp;
ReplacementOp->Common.Next = Op->Common.Next;
}
else
{
Op->Common.Parent->Common.Value.Arg = Op->Common.Next;
}
}
/* Search the parent list */
else while (Prev)
{
/* Traverse all siblings in the parent's argument list */
Next = Prev->Common.Next;
if (Next == Op)
{
if (ReplacementOp)
{
ReplacementOp->Common.Parent = Op->Common.Parent;
ReplacementOp->Common.Value.Arg = NULL;
ReplacementOp->Common.Node = Op->Common.Node;
Prev->Common.Next = ReplacementOp;
ReplacementOp->Common.Next = Op->Common.Next;
Next = NULL;
}
else
{
Prev->Common.Next = Op->Common.Next;
Next = NULL;
}
}
Prev = Next;
}
}
Cleanup:
/* Now we can actually delete the subtree rooted at op */
AcpiPsDeleteParseTree (Op);
return_VOID;
}
@ -661,7 +663,8 @@ AcpiPsParseLoop (
PreOp = AcpiPsAllocOp (WalkState->Opcode);
if (!PreOp)
{
return_ACPI_STATUS (AE_NO_MEMORY);
Status = AE_NO_MEMORY;
goto CloseThisOp;
}
}
@ -690,7 +693,8 @@ AcpiPsParseLoop (
if (!GET_CURRENT_ARG_TYPE (WalkState->ArgTypes))
{
return_ACPI_STATUS (AE_AML_NO_OPERAND);
Status = AE_AML_NO_OPERAND;
goto CloseThisOp;
}
/* We know that this arg is a name, move to next arg */
@ -757,7 +761,8 @@ AcpiPsParseLoop (
Op = AcpiPsAllocOp (WalkState->Opcode);
if (!Op)
{
return_ACPI_STATUS (AE_NO_MEMORY);
Status = AE_NO_MEMORY;
goto CloseThisOp;
}
if (WalkState->OpInfo->Flags & AML_CREATE)
@ -936,7 +941,7 @@ AcpiPsParseLoop (
WalkState->ArgTypes, WalkState->ArgCount);
if (ACPI_FAILURE (Status))
{
return_ACPI_STATUS (Status);
goto CloseThisOp;
}
Op = NULL;
continue;
@ -1293,7 +1298,7 @@ AcpiPsParseAml (
{
Status = AE_OK;
}
else if (Status != AE_OK)
else if ((Status != AE_OK) && (WalkState->MethodDesc))
{
ACPI_REPORT_METHOD_ERROR ("Method execution failed",
WalkState->MethodNode, NULL, Status);

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: psutils - Parser miscellaneous utilities (Parser only)
* $Revision: 56 $
* $Revision: 58 $
*
*****************************************************************************/
@ -203,10 +203,9 @@ ACPI_PARSE_OBJECT*
AcpiPsAllocOp (
UINT16 Opcode)
{
ACPI_PARSE_OBJECT *Op = NULL;
UINT32 Size;
UINT8 Flags;
ACPI_PARSE_OBJECT *Op;
const ACPI_OPCODE_INFO *OpInfo;
UINT8 Flags = ACPI_PARSEOP_GENERIC;
ACPI_FUNCTION_ENTRY ();
@ -214,38 +213,33 @@ AcpiPsAllocOp (
OpInfo = AcpiPsGetOpcodeInfo (Opcode);
/* Allocate the minimum required size object */
/* Determine type of ParseOp required */
if (OpInfo->Flags & AML_DEFER)
{
Size = sizeof (ACPI_PARSE_OBJ_NAMED);
Flags = ACPI_PARSEOP_DEFERRED;
}
else if (OpInfo->Flags & AML_NAMED)
{
Size = sizeof (ACPI_PARSE_OBJ_NAMED);
Flags = ACPI_PARSEOP_NAMED;
}
else if (Opcode == AML_INT_BYTELIST_OP)
{
Size = sizeof (ACPI_PARSE_OBJ_NAMED);
Flags = ACPI_PARSEOP_BYTELIST;
}
else
{
Size = sizeof (ACPI_PARSE_OBJ_COMMON);
Flags = ACPI_PARSEOP_GENERIC;
}
if (Size == sizeof (ACPI_PARSE_OBJ_COMMON))
/* Allocate the minimum required size object */
if (Flags == ACPI_PARSEOP_GENERIC)
{
/*
* The generic op is by far the most common (16 to 1)
*/
/* The generic op (default) is by far the most common (16 to 1) */
Op = AcpiUtAcquireFromCache (ACPI_MEM_LIST_PSNODE);
}
else
{
/* Extended parseop */
Op = AcpiUtAcquireFromCache (ACPI_MEM_LIST_PSNODE_EXT);
}

View File

@ -1,7 +1,7 @@
/*******************************************************************************
*
* Module Name: rscalc - Calculate stream and list lengths
* $Revision: 50 $
* $Revision: 52 $
*
******************************************************************************/
@ -148,7 +148,6 @@ AcpiRsGetByteStreamLength (
{
ACPI_SIZE ByteStreamSizeNeeded = 0;
ACPI_SIZE SegmentSize;
ACPI_RESOURCE_EXT_IRQ *ExIrq = NULL;
BOOLEAN Done = FALSE;
@ -167,8 +166,8 @@ AcpiRsGetByteStreamLength (
case ACPI_RSTYPE_IRQ:
/*
* IRQ Resource
* For an IRQ Resource, Byte 3, although optional, will
* always be created - it holds IRQ information.
* For an IRQ Resource, Byte 3, although optional, will always be
* created - it holds IRQ information.
*/
SegmentSize = 4;
break;
@ -184,8 +183,8 @@ AcpiRsGetByteStreamLength (
case ACPI_RSTYPE_START_DPF:
/*
* Start Dependent Functions Resource
* For a StartDependentFunctions Resource, Byte 1,
* although optional, will always be created.
* For a StartDependentFunctions Resource, Byte 1, although
* optional, will always be created.
*/
SegmentSize = 2;
break;
@ -217,10 +216,9 @@ AcpiRsGetByteStreamLength (
case ACPI_RSTYPE_VENDOR:
/*
* Vendor Defined Resource
* For a Vendor Specific resource, if the Length is
* between 1 and 7 it will be created as a Small
* Resource data type, otherwise it is a Large
* Resource data type.
* For a Vendor Specific resource, if the Length is between 1 and 7
* it will be created as a Small Resource data type, otherwise it
* is a Large Resource data type.
*/
if (LinkedList->Data.VendorSpecific.Length > 7)
{
@ -269,10 +267,9 @@ AcpiRsGetByteStreamLength (
case ACPI_RSTYPE_ADDRESS16:
/*
* 16-Bit Address Resource
* The base size of this byte stream is 16. If a
* Resource Source string is not NULL, add 1 for
* the Index + the length of the null terminated
* string Resource Source + 1 for the null.
* The base size of this byte stream is 16. If a Resource Source
* string is not NULL, add 1 for the Index + the length of the null
* terminated string Resource Source + 1 for the null.
*/
SegmentSize = 16;
@ -303,10 +300,9 @@ AcpiRsGetByteStreamLength (
case ACPI_RSTYPE_ADDRESS64:
/*
* 64-Bit Address Resource
* The base size of this byte stream is 46. If a Resource
* Source string is not NULL, add 1 for the Index + the
* length of the null terminated string Resource Source +
* 1 for the null.
* The base size of this byte stream is 46. If a ResourceSource
* string is not NULL, add 1 for the Index + the length of the null
* terminated string Resource Source + 1 for the null.
*/
SegmentSize = 46;
@ -320,9 +316,8 @@ AcpiRsGetByteStreamLength (
case ACPI_RSTYPE_EXT_IRQ:
/*
* Extended IRQ Resource
* The base size of this byte stream is 9. This is for an
* Interrupt table length of 1. For each additional
* interrupt, add 4.
* The base size of this byte stream is 9. This is for an Interrupt
* table length of 1. For each additional interrupt, add 4.
* If a Resource Source string is not NULL, add 1 for the
* Index + the length of the null terminated string
* Resource Source + 1 for the null.
@ -330,7 +325,7 @@ AcpiRsGetByteStreamLength (
SegmentSize = 9 +
(((ACPI_SIZE) LinkedList->Data.ExtendedIrq.NumberOfInterrupts - 1) * 4);
if (ExIrq && ExIrq->ResourceSource.StringPtr)
if (LinkedList->Data.ExtendedIrq.ResourceSource.StringPtr)
{
SegmentSize += LinkedList->Data.ExtendedIrq.ResourceSource.StringLength;
SegmentSize++;
@ -339,8 +334,7 @@ AcpiRsGetByteStreamLength (
default:
/*
* If we get here, everything is out of sync,
* so exit with an error
* If we get here, everything is out of sync, exit with error
*/
return_ACPI_STATUS (AE_AML_INVALID_RESOURCE_TYPE);
@ -450,7 +444,6 @@ AcpiRsGetListLength (
/*
* 32-Bit Memory Range Resource
*/
BytesConsumed = 20;
StructureSize = ACPI_SIZEOF_RESOURCE (ACPI_RESOURCE_MEM32);
@ -479,14 +472,12 @@ AcpiRsGetListLength (
BytesConsumed = Temp16 + 3;
/*
* Resource Source Index and Resource Source are
* optional elements. Check the length of the
* Bytestream. If it is greater than 43, that
* means that an Index exists and is followed by
* a null termininated string. Therefore, set
* the temp variable to the length minus the minimum
* byte stream length plus the byte for the Index to
* determine the size of the NULL terminiated string.
* Resource Source Index and Resource Source are optional elements.
* Check the length of the Bytestream. If it is greater than 43,
* that means that an Index exists and is followed by a null
* terminated string. Therefore, set the temp variable to the
* length minus the minimum byte stream length plus the byte for
* the Index to determine the size of the NULL terminated string.
*/
if (43 < Temp16)
{
@ -519,14 +510,12 @@ AcpiRsGetListLength (
BytesConsumed = Temp16 + 3;
/*
* Resource Source Index and Resource Source are
* optional elements. Check the length of the
* Bytestream. If it is greater than 23, that
* means that an Index exists and is followed by
* a null termininated string. Therefore, set
* the temp variable to the length minus the minimum
* byte stream length plus the byte for the Index to
* determine the size of the NULL terminiated string.
* Resource Source Index and Resource Source are optional elements.
* Check the length of the Bytestream. If it is greater than 23,
* that means that an Index exists and is followed by a null
* terminated string. Therefore, set the temp variable to the
* length minus the minimum byte stream length plus the byte for
* the Index to determine the size of the NULL terminated string.
*/
if (23 < Temp16)
{
@ -559,14 +548,12 @@ AcpiRsGetListLength (
BytesConsumed = Temp16 + 3;
/*
* Resource Source Index and Resource Source are
* optional elements. Check the length of the
* Bytestream. If it is greater than 13, that
* means that an Index exists and is followed by
* a null termininated string. Therefore, set
* the temp variable to the length minus the minimum
* byte stream length plus the byte for the Index to
* determine the size of the NULL terminiated string.
* Resource Source Index and Resource Source are optional elements.
* Check the length of the Bytestream. If it is greater than 13,
* that means that an Index exists and is followed by a null
* terminated string. Therefore, set the temp variable to the
* length minus the minimum byte stream length plus the byte for
* the Index to determine the size of the NULL terminated string.
*/
if (13 < Temp16)
{
@ -599,9 +586,8 @@ AcpiRsGetListLength (
BytesConsumed = Temp16 + 3;
/*
* Point past the length field and the
* Interrupt vector flags to save off the
* Interrupt table length to the Temp8 variable.
* Point past the length field and the Interrupt vector flags to
* save off the Interrupt table length to the Temp8 variable.
*/
Buffer += 3;
Temp8 = *Buffer;
@ -613,14 +599,12 @@ AcpiRsGetListLength (
AdditionalBytes = (UINT8) ((Temp8 - 1) * 4);
/*
* Resource Source Index and Resource Source are
* optional elements. Check the length of the
* Bytestream. If it is greater than 9, that
* means that an Index exists and is followed by
* a null termininated string. Therefore, set
* the temp variable to the length minus the minimum
* byte stream length plus the byte for the Index to
* determine the size of the NULL terminiated string.
* Resource Source Index and Resource Source are optional elements.
* Check the length of the Bytestream. If it is greater than 9,
* that means that an Index exists and is followed by a null
* terminated string. Therefore, set the temp variable to the
* length minus the minimum byte stream length plus the byte for
* the Index to determine the size of the NULL terminated string.
*/
if (9 + AdditionalBytes < Temp16)
{
@ -659,9 +643,8 @@ AcpiRsGetListLength (
BytesConsumed = 3;
}
/*
* Point past the descriptor
*/
/* Point past the descriptor */
++Buffer;
/*
@ -691,9 +674,8 @@ AcpiRsGetListLength (
Buffer = ByteStreamBuffer;
BytesConsumed = 3;
/*
* Point past the descriptor
*/
/* Point past the descriptor */
++Buffer;
/*

View File

@ -1,7 +1,7 @@
/*******************************************************************************
*
* Module Name: rsxface - Public interfaces to the resource manager
* $Revision: 30 $
* $Revision: 31 $
*
******************************************************************************/
@ -342,7 +342,7 @@ AcpiWalkResources (
/* Setup pointers */
Resource = (ACPI_RESOURCE *) Buffer.Pointer;
BufferEnd = ACPI_CAST_PTR (ACPI_RESOURCE,
BufferEnd = ACPI_CAST_PTR (ACPI_RESOURCE,
((UINT8 *) Buffer.Pointer + Buffer.Length));
/* Walk the resource list */

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: tbconvrt - ACPI Table conversion utilities
* $Revision: 56 $
* $Revision: 57 $
*
*****************************************************************************/
@ -331,10 +331,28 @@ AcpiTbConvertFadt1 (
LocalFadt->CstCnt = 0;
/*
* Since there isn't any equivalence in 1.0 and since it highly likely
* that a 1.0 system has legacy support.
* FADT Rev 2 was an interim FADT released between ACPI 1.0 and ACPI 2.0.
* It primarily adds the FADT reset mechanism.
*/
LocalFadt->IapcBootArch = BAF_LEGACY_DEVICES;
if ((OriginalFadt->Revision == 2) &&
(OriginalFadt->Length == sizeof (FADT_DESCRIPTOR_REV2_MINUS)))
{
/*
* Grab the entire generic address struct, plus the 1-byte reset value
* that immediately follows.
*/
ACPI_MEMCPY (&LocalFadt->ResetRegister,
&((FADT_DESCRIPTOR_REV2_MINUS *) OriginalFadt)->ResetRegister,
sizeof (ACPI_GENERIC_ADDRESS) + 1);
}
else
{
/*
* Since there isn't any equivalence in 1.0 and since it is highly
* likely that a 1.0 system has legacy support.
*/
LocalFadt->IapcBootArch = BAF_LEGACY_DEVICES;
}
/*
* Convert the V1.0 block addresses to V2.0 GAS structures
@ -510,25 +528,23 @@ AcpiTbConvertTableFadt (void)
/*
* AcpiGbl_FADT is valid
* Allocate and zero the 2.0 FADT buffer
*/
LocalFadt = ACPI_MEM_CALLOCATE (sizeof (FADT_DESCRIPTOR_REV2));
if (LocalFadt == NULL)
{
return_ACPI_STATUS (AE_NO_MEMORY);
}
/*
* FADT length and version validation. The table must be at least as
* long as the version 1.0 FADT
* AcpiGbl_FADT is valid. Validate the FADT length. The table must be
* at least as long as the version 1.0 FADT
*/
if (AcpiGbl_FADT->Length < sizeof (FADT_DESCRIPTOR_REV1))
{
ACPI_REPORT_ERROR (("Invalid FADT table length: 0x%X\n", AcpiGbl_FADT->Length));
ACPI_REPORT_ERROR (("FADT is invalid, too short: 0x%X\n", AcpiGbl_FADT->Length));
return_ACPI_STATUS (AE_INVALID_TABLE_LENGTH);
}
/* Allocate buffer for the ACPI 2.0(+) FADT */
LocalFadt = ACPI_MEM_CALLOCATE (sizeof (FADT_DESCRIPTOR_REV2));
if (!LocalFadt)
{
return_ACPI_STATUS (AE_NO_MEMORY);
}
if (AcpiGbl_FADT->Revision >= FADT2_REVISION_ID)
{
if (AcpiGbl_FADT->Length < sizeof (FADT_DESCRIPTOR_REV2))

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: tbget - ACPI Table get* routines
* $Revision: 88 $
* $Revision: 90 $
*
*****************************************************************************/
@ -245,6 +245,9 @@ AcpiTbGetTableHeader (
return_ACPI_STATUS (AE_BAD_PARAMETER);
}
ACPI_DEBUG_PRINT ((ACPI_DB_TABLES, "Table Signature: [%4.4s]\n",
ReturnHeader->Signature));
return_ACPI_STATUS (AE_OK);
}

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: tbinstal - ACPI table installation and removal
* $Revision: 73 $
* $Revision: 74 $
*
*****************************************************************************/
@ -352,10 +352,11 @@ AcpiTbInitTableDescriptor (
{
/*
* Only one table allowed, and a table has alread been installed
* at this location, so return an error.
* at this location, so return an error.
*/
if (ListHead->Next)
{
ACPI_MEM_FREE (TableDesc);
return_ACPI_STATUS (AE_ALREADY_EXISTS);
}

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: tbrsdt - ACPI RSDT table utilities
* $Revision: 12 $
* $Revision: 13 $
*
*****************************************************************************/
@ -366,6 +366,7 @@ AcpiTbGetTableRsdt (
AcpiTbGetRsdtAddress (&Address);
TableInfo.Type = ACPI_TABLE_XSDT;
Status = AcpiTbGetTable (&Address, &TableInfo);
if (ACPI_FAILURE (Status))
{

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: tbxfroot - Find the root ACPI table (RSDT)
* $Revision: 73 $
* $Revision: 79 $
*
*****************************************************************************/
@ -162,13 +162,32 @@ AcpiTbFindTable (
return_ACPI_STATUS (AE_AML_STRING_LIMIT);
}
/* Find the table */
Status = AcpiGetFirmwareTable (Signature, 1,
ACPI_LOGICAL_ADDRESSING, &Table);
if (ACPI_FAILURE (Status))
if (!ACPI_STRNCMP (Signature, DSDT_SIG, ACPI_NAME_SIZE))
{
return_ACPI_STATUS (Status);
/*
* The DSDT pointer is contained in the FADT, not the RSDT.
* This code should suffice, because the only code that would perform
* a "find" on the DSDT is the DataTableRegion() AML opcode -- in
* which case, the DSDT is guaranteed to be already loaded.
* If this becomes insufficient, the FADT will have to be found first.
*/
if (!AcpiGbl_DSDT)
{
return_ACPI_STATUS (AE_NO_ACPI_TABLES);
}
Table = AcpiGbl_DSDT;
}
else
{
/* Find the table */
Status = AcpiGetFirmwareTable (Signature, 1,
ACPI_LOGICAL_ADDRESSING, &Table);
if (ACPI_FAILURE (Status))
{
return_ACPI_STATUS (Status);
}
}
/* Check OemId and OemTableId */
@ -179,6 +198,7 @@ AcpiTbFindTable (
return_ACPI_STATUS (AE_AML_NAME_NOT_FOUND);
}
ACPI_DEBUG_PRINT ((ACPI_DB_TABLES, "Found table [%4.4s]\n", Table->Signature));
*TablePtr = Table;
return_ACPI_STATUS (AE_OK);
}
@ -192,17 +212,14 @@ AcpiTbFindTable (
* Instance - the non zero instance of the table, allows
* support for multiple tables of the same type
* Flags - Physical/Virtual support
* RetBuffer - pointer to a structure containing a buffer to
* receive the table
* TablePointer - Where a buffer containing the table is
* returned
*
* RETURN: Status
*
* DESCRIPTION: This function is called to get an ACPI table. The caller
* supplies an OutBuffer large enough to contain the entire ACPI
* table. Upon completion
* the OutBuffer->Length field will indicate the number of bytes
* copied into the OutBuffer->BufPtr buffer. This table will be
* a complete table including the header.
* DESCRIPTION: This function is called to get an ACPI table. A buffer is
* allocated for the table and returned in TablePointer.
* This table will be a complete table including the header.
*
******************************************************************************/
@ -213,12 +230,11 @@ AcpiGetFirmwareTable (
UINT32 Flags,
ACPI_TABLE_HEADER **TablePointer)
{
ACPI_POINTER RsdpAddress;
ACPI_POINTER Address;
ACPI_STATUS Status;
ACPI_TABLE_HEADER Header;
ACPI_TABLE_DESC TableInfo;
ACPI_TABLE_DESC RsdtInfo;
ACPI_POINTER Address;
ACPI_TABLE_HEADER *Header = NULL;
ACPI_TABLE_DESC *TableInfo = NULL;
ACPI_TABLE_DESC *RsdtInfo;
UINT32 TableCount;
UINT32 i;
UINT32 j;
@ -229,29 +245,26 @@ AcpiGetFirmwareTable (
/*
* Ensure that at least the table manager is initialized. We don't
* require that the entire ACPI subsystem is up for this interface
* require that the entire ACPI subsystem is up for this interface.
* If we have a buffer, we must have a length too
*/
/*
* If we have a buffer, we must have a length too
*/
if ((Instance == 0) ||
(!Signature) ||
if ((Instance == 0) ||
(!Signature) ||
(!TablePointer))
{
return_ACPI_STATUS (AE_BAD_PARAMETER);
}
RsdtInfo.Pointer = NULL;
/* Ensure that we have a RSDP */
if (!AcpiGbl_RSDP)
{
/* Get the RSDP */
Status = AcpiOsGetRootPointer (Flags, &RsdpAddress);
Status = AcpiOsGetRootPointer (Flags, &Address);
if (ACPI_FAILURE (Status))
{
ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "RSDP not found\n"));
ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "RSDP not found\n"));
return_ACPI_STATUS (AE_NO_ACPI_TABLES);
}
@ -259,7 +272,7 @@ AcpiGetFirmwareTable (
if ((Flags & ACPI_MEMORY_MODE) == ACPI_LOGICAL_ADDRESSING)
{
Status = AcpiOsMapMemory (RsdpAddress.Pointer.Physical, sizeof (RSDP_DESCRIPTOR),
Status = AcpiOsMapMemory (Address.Pointer.Physical, sizeof (RSDP_DESCRIPTOR),
(void *) &AcpiGbl_RSDP);
if (ACPI_FAILURE (Status))
{
@ -268,12 +281,11 @@ AcpiGetFirmwareTable (
}
else
{
AcpiGbl_RSDP = RsdpAddress.Pointer.Logical;
AcpiGbl_RSDP = Address.Pointer.Logical;
}
/*
* The signature and checksum must both be correct
*/
/* The signature and checksum must both be correct */
if (ACPI_STRNCMP ((char *) AcpiGbl_RSDP, RSDP_SIG, sizeof (RSDP_SIG)-1) != 0)
{
/* Nope, BAD Signature */
@ -289,10 +301,9 @@ AcpiGetFirmwareTable (
}
}
/* Get the RSDT and validate it */
/* Get the RSDT address via the RSDP */
AcpiTbGetRsdtAddress (&Address);
ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
"RSDP located at %p, RSDT physical=%8.8X%8.8X \n",
AcpiGbl_RSDP,
@ -302,22 +313,45 @@ AcpiGetFirmwareTable (
Address.PointerType |= Flags;
Status = AcpiTbGetTable (&Address, &RsdtInfo);
if (ACPI_FAILURE (Status))
/* Get and validate the RSDT */
RsdtInfo = ACPI_MEM_CALLOCATE (sizeof (ACPI_TABLE_DESC));
if (!RsdtInfo)
{
return_ACPI_STATUS (Status);
return_ACPI_STATUS (AE_NO_MEMORY);
}
Status = AcpiTbValidateRsdt (RsdtInfo.Pointer);
Status = AcpiTbGetTable (&Address, RsdtInfo);
if (ACPI_FAILURE (Status))
{
goto Cleanup;
}
Status = AcpiTbValidateRsdt (RsdtInfo->Pointer);
if (ACPI_FAILURE (Status))
{
goto Cleanup;
}
/* Allocate a scratch table header and table descriptor */
Header = ACPI_MEM_ALLOCATE (sizeof (ACPI_TABLE_HEADER));
if (!Header)
{
Status = AE_NO_MEMORY;
goto Cleanup;
}
TableInfo = ACPI_MEM_ALLOCATE (sizeof (ACPI_TABLE_DESC));
if (!TableInfo)
{
Status = AE_NO_MEMORY;
goto Cleanup;
}
/* Get the number of table pointers within the RSDT */
TableCount = AcpiTbGetTableCount (AcpiGbl_RSDP, RsdtInfo.Pointer);
TableCount = AcpiTbGetTableCount (AcpiGbl_RSDP, RsdtInfo->Pointer);
Address.PointerType = AcpiGbl_TableFlags | Flags;
/*
@ -330,17 +364,18 @@ AcpiGetFirmwareTable (
if (AcpiGbl_RSDP->Revision < 2)
{
Address.Pointer.Value = (ACPI_CAST_PTR (RSDT_DESCRIPTOR, RsdtInfo.Pointer))->TableOffsetEntry[i];
Address.Pointer.Value = (ACPI_CAST_PTR (
RSDT_DESCRIPTOR, RsdtInfo->Pointer))->TableOffsetEntry[i];
}
else
{
Address.Pointer.Value = ACPI_GET_ADDRESS (
(ACPI_CAST_PTR (XSDT_DESCRIPTOR, RsdtInfo.Pointer))->TableOffsetEntry[i]);
Address.Pointer.Value = ACPI_GET_ADDRESS ((ACPI_CAST_PTR (
XSDT_DESCRIPTOR, RsdtInfo->Pointer))->TableOffsetEntry[i]);
}
/* Get the table header */
Status = AcpiTbGetTableHeader (&Address, &Header);
Status = AcpiTbGetTableHeader (&Address, Header);
if (ACPI_FAILURE (Status))
{
goto Cleanup;
@ -348,7 +383,7 @@ AcpiGetFirmwareTable (
/* Compare table signatures and table instance */
if (!ACPI_STRNCMP (Header.Signature, Signature, ACPI_NAME_SIZE))
if (!ACPI_STRNCMP (Header->Signature, Signature, ACPI_NAME_SIZE))
{
/* An instance of the table was found */
@ -357,13 +392,13 @@ AcpiGetFirmwareTable (
{
/* Found the correct instance, get the entire table */
Status = AcpiTbGetTableBody (&Address, &Header, &TableInfo);
Status = AcpiTbGetTableBody (&Address, Header, TableInfo);
if (ACPI_FAILURE (Status))
{
goto Cleanup;
}
*TablePointer = TableInfo.Pointer;
*TablePointer = TableInfo->Pointer;
goto Cleanup;
}
}
@ -375,7 +410,17 @@ AcpiGetFirmwareTable (
Cleanup:
AcpiOsUnmapMemory (RsdtInfo.Pointer, (ACPI_SIZE) RsdtInfo.Pointer->Length);
AcpiOsUnmapMemory (RsdtInfo->Pointer, (ACPI_SIZE) RsdtInfo->Pointer->Length);
ACPI_MEM_FREE (RsdtInfo);
if (Header)
{
ACPI_MEM_FREE (Header);
}
if (TableInfo)
{
ACPI_MEM_FREE (TableInfo);
}
return_ACPI_STATUS (Status);
}
@ -443,37 +488,63 @@ AcpiTbScanMemoryForRsdp (
UINT8 *StartAddress,
UINT32 Length)
{
UINT32 Offset;
UINT8 *MemRover;
UINT8 *EndAddress;
UINT8 Checksum;
ACPI_FUNCTION_TRACE ("TbScanMemoryForRsdp");
/* Search from given start addr for the requested length */
EndAddress = StartAddress + Length;
for (Offset = 0, MemRover = StartAddress;
Offset < Length;
Offset += ACPI_RSDP_SCAN_STEP, MemRover += ACPI_RSDP_SCAN_STEP)
/* Search from given start address for the requested length */
for (MemRover = StartAddress; MemRover < EndAddress;
MemRover += ACPI_RSDP_SCAN_STEP)
{
/* The signature and checksum must both be correct */
if (ACPI_STRNCMP ((char *) MemRover,
RSDP_SIG, sizeof (RSDP_SIG)-1) == 0 &&
AcpiTbChecksum (MemRover, ACPI_RSDP_CHECKSUM_LENGTH) == 0)
if (ACPI_STRNCMP ((char *) MemRover, RSDP_SIG, sizeof (RSDP_SIG)-1) != 0)
{
/* If so, we have found the RSDP */
/* No signature match, keep looking */
continue;
}
/* Signature matches, check the appropriate checksum */
if (((RSDP_DESCRIPTOR *) MemRover)->Revision < 2)
{
/* ACPI version 1.0 */
Checksum = AcpiTbChecksum (MemRover, ACPI_RSDP_CHECKSUM_LENGTH);
}
else
{
/* Post ACPI 1.0, use ExtendedChecksum */
Checksum = AcpiTbChecksum (MemRover, ACPI_RSDP_XCHECKSUM_LENGTH);
}
if (Checksum == 0)
{
/* Checksum valid, we have found a valid RSDP */
ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
"RSDP located at physical address %p\n",MemRover));
"RSDP located at physical address %p\n", MemRover));
return_PTR (MemRover);
}
ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
"Found an RSDP at physical address %p, but it has a bad checksum\n",
MemRover));
}
/* Searched entire block, no RSDP was found */
ACPI_DEBUG_PRINT ((ACPI_DB_INFO,"Searched entire block, no RSDP was found.\n"));
ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
"Searched entire block, no valid RSDP was found.\n"));
return_PTR (NULL);
}

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: utalloc - local cache and memory allocation routines
* $Revision: 135 $
* $Revision: 138 $
*
*****************************************************************************/
@ -345,13 +345,13 @@ AcpiUtValidateBuffer (
*
* FUNCTION: AcpiUtInitializeBuffer
*
* PARAMETERS: RequiredLength - Length needed
* Buffer - Buffer to be validated
* PARAMETERS: Buffer - Buffer to be validated
* RequiredLength - Length needed
*
* RETURN: Status
*
* DESCRIPTION: Validate that the buffer is of the required length or
* allocate a new buffer.
* allocate a new buffer. Returned buffer is always zeroed.
*
******************************************************************************/
@ -393,26 +393,27 @@ AcpiUtInitializeBuffer (
/* Allocate a new buffer with local interface to allow tracking */
Buffer->Pointer = ACPI_MEM_ALLOCATE (RequiredLength);
Buffer->Pointer = ACPI_MEM_CALLOCATE (RequiredLength);
if (!Buffer->Pointer)
{
return (AE_NO_MEMORY);
}
/* Clear the buffer */
ACPI_MEMSET (Buffer->Pointer, 0, RequiredLength);
break;
default:
/* Validate the size of the buffer */
/* Existing buffer: Validate the size of the buffer */
if (Buffer->Length < RequiredLength)
{
Status = AE_BUFFER_OVERFLOW;
break;
}
/* Clear the buffer */
ACPI_MEMSET (Buffer->Pointer, 0, RequiredLength);
break;
}
@ -566,7 +567,7 @@ AcpiUtAllocateAndTrack (
ACPI_STATUS Status;
Allocation = AcpiUtAllocate (Size + sizeof (ACPI_DEBUG_MEM_BLOCK), Component,
Allocation = AcpiUtAllocate (Size + sizeof (ACPI_DEBUG_MEM_HEADER), Component,
Module, Line);
if (!Allocation)
{
@ -614,7 +615,7 @@ AcpiUtCallocateAndTrack (
ACPI_STATUS Status;
Allocation = AcpiUtCallocate (Size + sizeof (ACPI_DEBUG_MEM_BLOCK), Component,
Allocation = AcpiUtCallocate (Size + sizeof (ACPI_DEBUG_MEM_HEADER), Component,
Module, Line);
if (!Allocation)
{
@ -703,7 +704,8 @@ AcpiUtFreeAndTrack (
*
* FUNCTION: AcpiUtFindAllocation
*
* PARAMETERS: Allocation - Address of allocated memory
* PARAMETERS: ListId - Memory list to search
* Allocation - Address of allocated memory
*
* RETURN: A list element if found; NULL otherwise.
*
@ -749,7 +751,8 @@ AcpiUtFindAllocation (
*
* FUNCTION: AcpiUtTrackAllocation
*
* PARAMETERS: Allocation - Address of allocated memory
* PARAMETERS: ListId - Memory list to search
* Allocation - Address of allocated memory
* Size - Size of the allocation
* AllocType - MEM_MALLOC or MEM_CALLOC
* Component - Component type of caller
@ -816,6 +819,7 @@ AcpiUtTrackAllocation (
Allocation->Line = Line;
ACPI_STRNCPY (Allocation->Module, Module, ACPI_MAX_MODULE_NAME);
Allocation->Module[ACPI_MAX_MODULE_NAME-1] = 0;
/* Insert at list head */
@ -840,7 +844,8 @@ UnlockAndExit:
*
* FUNCTION: AcpiUtRemoveAllocation
*
* PARAMETERS: Allocation - Address of allocated memory
* PARAMETERS: ListId - Memory list to search
* Allocation - Address of allocated memory
* Component - Component type of caller
* Module - Source file name of caller
* Line - Line number of caller

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: cmclib - Local implementation of C library functions
* $Revision: 52 $
* $Revision: 53 $
*
*****************************************************************************/
@ -276,6 +276,36 @@ AcpiUtStrcmp (
}
/*******************************************************************************
*
* FUNCTION: memcmp
*
* PARAMETERS: Buffer1 - First Buffer
* Buffer2 - Second Buffer
* Count - Maximum # of bytes to compare
*
* RETURN: Index where Buffers mismatched, or 0 if Buffers matched
*
* DESCRIPTION: Compare two Buffers, with a maximum length
*
******************************************************************************/
int
AcpiUtMemcmp (
const char *Buffer1,
const char *Buffer2,
ACPI_SIZE Count)
{
for ( ; Count-- && (*Buffer1 == *Buffer2); Buffer1++, Buffer2++)
{
}
return ((Count == ACPI_SIZE_MAX) ? 0 : ((unsigned char) *Buffer1 -
(unsigned char) *Buffer2));
}
/*******************************************************************************
*
* FUNCTION: strncmp

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: utcopy - Internal to external object translation utilities
* $Revision: 114 $
* $Revision: 115 $
*
*****************************************************************************/
@ -507,25 +507,23 @@ AcpiUtCopyEsimpleToIsimple (
break;
default:
/*
* Whatever other type -- it is not supported
*/
/* All other types are not supported */
return_ACPI_STATUS (AE_SUPPORT);
}
switch (ExternalObject->Type)
{
/* Must COPY string and buffer contents */
switch (ExternalObject->Type)
{
case ACPI_TYPE_STRING:
InternalObject->String.Pointer =
ACPI_MEM_CALLOCATE ((ACPI_SIZE) ExternalObject->String.Length + 1);
if (!InternalObject->String.Pointer)
{
return_ACPI_STATUS (AE_NO_MEMORY);
goto ErrorExit;
}
ACPI_MEMCPY (InternalObject->String.Pointer,
@ -542,7 +540,7 @@ AcpiUtCopyEsimpleToIsimple (
ACPI_MEM_CALLOCATE (ExternalObject->Buffer.Length);
if (!InternalObject->Buffer.Pointer)
{
return_ACPI_STATUS (AE_NO_MEMORY);
goto ErrorExit;
}
ACPI_MEMCPY (InternalObject->Buffer.Pointer,
@ -565,6 +563,11 @@ AcpiUtCopyEsimpleToIsimple (
*RetInternalObject = InternalObject;
return_ACPI_STATUS (AE_OK);
ErrorExit:
AcpiUtRemoveReference (InternalObject);
return_ACPI_STATUS (AE_NO_MEMORY);
}
@ -845,7 +848,7 @@ AcpiUtCopyIelementToIelement (
Status = AcpiUtCopySimpleObject (SourceObject, TargetObject);
if (ACPI_FAILURE (Status))
{
return (Status);
goto ErrorExit;
}
*ThisTargetPtr = TargetObject;
@ -882,8 +885,8 @@ AcpiUtCopyIelementToIelement (
sizeof (void *));
if (!TargetObject->Package.Elements)
{
ACPI_MEM_FREE (TargetObject);
return (AE_NO_MEMORY);
Status = AE_NO_MEMORY;
goto ErrorExit;
}
/*
@ -903,6 +906,10 @@ AcpiUtCopyIelementToIelement (
}
return (Status);
ErrorExit:
AcpiUtRemoveReference (TargetObject);
return (Status);
}

View File

@ -1,7 +1,7 @@
/*******************************************************************************
*
* Module Name: utdelete - object deletion and reference count utilities
* $Revision: 99 $
* $Revision: 100 $
*
******************************************************************************/
@ -692,6 +692,10 @@ AcpiUtAddReference (
return_VOID;
}
ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
"Obj %p Current Refs=%X [To Be Incremented]\n",
Object, Object->Common.ReferenceCount));
/* Increment the reference count */
(void) AcpiUtUpdateObjectReference (Object, REF_INCREMENT);
@ -738,8 +742,9 @@ AcpiUtRemoveReference (
return_VOID;
}
ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "Obj %p Refs=%X\n",
Object, Object->Common.ReferenceCount));
ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
"Obj %p Current Refs=%X [To Be Decremented]\n",
Object, Object->Common.ReferenceCount));
/*
* Decrement the reference count, and only actually delete the object

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: utglobal - Global variables for the ACPI subsystem
* $Revision: 201 $
* $Revision: 202 $
*
*****************************************************************************/
@ -947,6 +947,7 @@ AcpiUtInitGlobals (
AcpiGbl_SystemNotify.Handler = NULL;
AcpiGbl_DeviceNotify.Handler = NULL;
AcpiGbl_ExceptionHandler = NULL;
AcpiGbl_InitHandler = NULL;
/* Global "typed" ACPI table pointers */

View File

@ -1,7 +1,7 @@
/*******************************************************************************
*
* Module Name: utmath - Integer math support routines
* $Revision: 13 $
* $Revision: 14 $
*
******************************************************************************/
@ -134,7 +134,7 @@
*
* FUNCTION: AcpiUtShortDivide
*
* PARAMETERS: InDividend - Pointer to the dividend
* PARAMETERS: Dividend - 64-bit dividend
* Divisor - 32-bit divisor
* OutQuotient - Pointer to where the quotient is returned
* OutRemainder - Pointer to where the remainder is returned
@ -149,19 +149,18 @@
ACPI_STATUS
AcpiUtShortDivide (
ACPI_INTEGER *InDividend,
ACPI_INTEGER Dividend,
UINT32 Divisor,
ACPI_INTEGER *OutQuotient,
UINT32 *OutRemainder)
{
UINT64_OVERLAY Dividend;
UINT64_OVERLAY DividendOvl;
UINT64_OVERLAY Quotient;
UINT32 Remainder32;
ACPI_FUNCTION_TRACE ("UtShortDivide");
Dividend.Full = *InDividend;
/* Always check for a zero divisor */
@ -171,13 +170,15 @@ AcpiUtShortDivide (
return_ACPI_STATUS (AE_AML_DIVIDE_BY_ZERO);
}
DividendOvl.Full = Dividend;
/*
* The quotient is 64 bits, the remainder is always 32 bits,
* and is generated by the second divide.
*/
ACPI_DIV_64_BY_32 (0, Dividend.Part.Hi, Divisor,
ACPI_DIV_64_BY_32 (0, DividendOvl.Part.Hi, Divisor,
Quotient.Part.Hi, Remainder32);
ACPI_DIV_64_BY_32 (Remainder32, Dividend.Part.Lo, Divisor,
ACPI_DIV_64_BY_32 (Remainder32, DividendOvl.Part.Lo, Divisor,
Quotient.Part.Lo, Remainder32);
/* Return only what was requested */
@ -199,8 +200,8 @@ AcpiUtShortDivide (
*
* FUNCTION: AcpiUtDivide
*
* PARAMETERS: InDividend - Pointer to the dividend
* InDivisor - Pointer to the divisor
* PARAMETERS: InDividend - Dividend
* InDivisor - Divisor
* OutQuotient - Pointer to where the quotient is returned
* OutRemainder - Pointer to where the remainder is returned
*
@ -212,8 +213,8 @@ AcpiUtShortDivide (
ACPI_STATUS
AcpiUtDivide (
ACPI_INTEGER *InDividend,
ACPI_INTEGER *InDivisor,
ACPI_INTEGER InDividend,
ACPI_INTEGER InDivisor,
ACPI_INTEGER *OutQuotient,
ACPI_INTEGER *OutRemainder)
{
@ -233,14 +234,14 @@ AcpiUtDivide (
/* Always check for a zero divisor */
if (*InDivisor == 0)
if (InDivisor == 0)
{
ACPI_REPORT_ERROR (("AcpiUtDivide: Divide by zero\n"));
return_ACPI_STATUS (AE_AML_DIVIDE_BY_ZERO);
}
Divisor.Full = *InDivisor;
Dividend.Full = *InDividend;
Divisor.Full = InDivisor;
Dividend.Full = InDividend;
if (Divisor.Part.Hi == 0)
{
/*
@ -359,7 +360,7 @@ AcpiUtDivide (
ACPI_STATUS
AcpiUtShortDivide (
ACPI_INTEGER *InDividend,
ACPI_INTEGER InDividend,
UINT32 Divisor,
ACPI_INTEGER *OutQuotient,
UINT32 *OutRemainder)
@ -380,11 +381,11 @@ AcpiUtShortDivide (
if (OutQuotient)
{
*OutQuotient = *InDividend / Divisor;
*OutQuotient = InDividend / Divisor;
}
if (OutRemainder)
{
*OutRemainder = (UINT32) *InDividend % Divisor;
*OutRemainder = (UINT32) InDividend % Divisor;
}
return_ACPI_STATUS (AE_OK);
@ -392,8 +393,8 @@ AcpiUtShortDivide (
ACPI_STATUS
AcpiUtDivide (
ACPI_INTEGER *InDividend,
ACPI_INTEGER *InDivisor,
ACPI_INTEGER InDividend,
ACPI_INTEGER InDivisor,
ACPI_INTEGER *OutQuotient,
ACPI_INTEGER *OutRemainder)
{
@ -402,7 +403,7 @@ AcpiUtDivide (
/* Always check for a zero divisor */
if (*InDivisor == 0)
if (InDivisor == 0)
{
ACPI_REPORT_ERROR (("AcpiUtDivide: Divide by zero\n"));
return_ACPI_STATUS (AE_AML_DIVIDE_BY_ZERO);
@ -413,11 +414,11 @@ AcpiUtDivide (
if (OutQuotient)
{
*OutQuotient = *InDividend / *InDivisor;
*OutQuotient = InDividend / InDivisor;
}
if (OutRemainder)
{
*OutRemainder = *InDividend % *InDivisor;
*OutRemainder = InDividend % InDivisor;
}
return_ACPI_STATUS (AE_OK);

View File

@ -1,7 +1,7 @@
/*******************************************************************************
*
* Module Name: utmisc - common utility procedures
* $Revision: 100 $
* $Revision: 101 $
*
******************************************************************************/
@ -445,16 +445,15 @@ AcpiUtValidAcpiCharacter (
* FUNCTION: AcpiUtStrtoul64
*
* PARAMETERS: String - Null terminated string
* Terminater - Where a pointer to the terminating byte is returned
* Base - Radix of the string
* Base - Radix of the string: 10, 16, or ACPI_ANY_BASE
* RetInteger - Where the converted integer is returned
*
* RETURN: Converted value
* RETURN: Status and Converted value
*
* DESCRIPTION: Convert a string into an unsigned value.
* NOTE: Does not support Octal strings, not needed.
*
******************************************************************************/
#define NEGATIVE 1
#define POSITIVE 0
ACPI_STATUS
AcpiUtStrtoul64 (
@ -462,34 +461,28 @@ AcpiUtStrtoul64 (
UINT32 Base,
ACPI_INTEGER *RetInteger)
{
UINT32 Index;
UINT32 ThisDigit;
ACPI_INTEGER ReturnValue = 0;
ACPI_STATUS Status = AE_OK;
ACPI_INTEGER Dividend;
ACPI_INTEGER Quotient;
*RetInteger = 0;
ACPI_FUNCTION_TRACE ("UtStroul64");
switch (Base)
{
case 0:
case 8:
case ACPI_ANY_BASE:
case 10:
case 16:
break;
default:
/*
* The specified Base parameter is not in the domain of
* this function:
*/
return (AE_BAD_PARAMETER);
/* Invalid Base */
return_ACPI_STATUS (AE_BAD_PARAMETER);
}
/*
* skip over any white space in the buffer:
*/
/* Skip over any white space in the buffer */
while (ACPI_IS_SPACE (*String) || *String == '\t')
{
++String;
@ -497,21 +490,15 @@ AcpiUtStrtoul64 (
/*
* If the input parameter Base is zero, then we need to
* determine if it is octal, decimal, or hexadecimal:
* determine if it is decimal or hexadecimal:
*/
if (Base == 0)
{
if (*String == '0')
if ((*String == '0') &&
(ACPI_TOLOWER (*(++String)) == 'x'))
{
if (ACPI_TOLOWER (*(++String)) == 'x')
{
Base = 16;
++String;
}
else
{
Base = 8;
}
Base = 16;
++String;
}
else
{
@ -520,14 +507,9 @@ AcpiUtStrtoul64 (
}
/*
* For octal and hexadecimal bases, skip over the leading
* For hexadecimal base, skip over the leading
* 0 or 0x, if they are present.
*/
if (Base == 8 && *String == '0')
{
String++;
}
if (Base == 16 &&
*String == '0' &&
ACPI_TOLOWER (*(++String)) == 'x')
@ -535,20 +517,24 @@ AcpiUtStrtoul64 (
String++;
}
/* Main loop: convert the string to an unsigned long */
/* Main loop: convert the string to a 64-bit integer */
while (*String)
{
if (ACPI_IS_DIGIT (*String))
{
Index = ((UINT8) *String) - '0';
/* Convert ASCII 0-9 to Decimal value */
ThisDigit = ((UINT8) *String) - '0';
}
else
{
Index = (UINT8) ACPI_TOUPPER (*String);
if (ACPI_IS_UPPER ((char) Index))
ThisDigit = (UINT8) ACPI_TOUPPER (*String);
if (ACPI_IS_UPPER ((char) ThisDigit))
{
Index = Index - 'A' + 10;
/* Convert ASCII Hex char to value */
ThisDigit = ThisDigit - 'A' + 10;
}
else
{
@ -556,50 +542,42 @@ AcpiUtStrtoul64 (
}
}
if (Index >= Base)
/* Check to see if digit is out of range */
if (ThisDigit >= Base)
{
goto ErrorExit;
}
/* Check to see if value is out of range: */
/* Divide the digit into the correct position */
Dividend = ACPI_INTEGER_MAX - (ACPI_INTEGER) Index;
(void) AcpiUtShortDivide (&Dividend, Base, &Quotient, NULL);
(void) AcpiUtShortDivide ((ACPI_INTEGER_MAX - (ACPI_INTEGER) ThisDigit),
Base, &Quotient, NULL);
if (ReturnValue > Quotient)
{
goto ErrorExit;
}
ReturnValue *= Base;
ReturnValue += Index;
ReturnValue += ThisDigit;
++String;
}
*RetInteger = ReturnValue;
return (Status);
return_ACPI_STATUS (AE_OK);
ErrorExit:
switch (Base)
/* Base was set/validated above */
if (Base == 10)
{
case 8:
Status = AE_BAD_OCTAL_CONSTANT;
break;
case 10:
Status = AE_BAD_DECIMAL_CONSTANT;
break;
case 16:
Status = AE_BAD_HEX_CONSTANT;
break;
default:
/* Base validated above */
break;
return_ACPI_STATUS (AE_BAD_DECIMAL_CONSTANT);
}
else
{
return_ACPI_STATUS (AE_BAD_HEX_CONSTANT);
}
return (Status);
}

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: utobject - ACPI object create/delete/size/cache routines
* $Revision: 86 $
* $Revision: 90 $
*
*****************************************************************************/
@ -232,9 +232,8 @@ AcpiUtCreateBufferObject (
ACPI_FUNCTION_TRACE_U32 ("UtCreateBufferObject", BufferSize);
/*
* Create a new Buffer object
*/
/* Create a new Buffer object */
BufferDesc = AcpiUtCreateInternalObject (ACPI_TYPE_BUFFER);
if (!BufferDesc)
{
@ -269,6 +268,63 @@ AcpiUtCreateBufferObject (
}
/*******************************************************************************
*
* FUNCTION: AcpiUtCreateStringObject
*
* PARAMETERS: StringSize - Size of string to be created. Does not
* include NULL terminator, this is added
* automatically.
*
* RETURN: Pointer to a new String object
*
* DESCRIPTION: Create a fully initialized string object
*
******************************************************************************/
ACPI_OPERAND_OBJECT *
AcpiUtCreateStringObject (
ACPI_SIZE StringSize)
{
ACPI_OPERAND_OBJECT *StringDesc;
char *String;
ACPI_FUNCTION_TRACE_U32 ("UtCreateStringObject", StringSize);
/* Create a new String object */
StringDesc = AcpiUtCreateInternalObject (ACPI_TYPE_STRING);
if (!StringDesc)
{
return_PTR (NULL);
}
/*
* Allocate the actual string buffer -- (Size + 1) for NULL terminator.
* NOTE: Zero-length strings are NULL terminated
*/
String = ACPI_MEM_CALLOCATE (StringSize + 1);
if (!String)
{
ACPI_REPORT_ERROR (("CreateString: could not allocate size %X\n",
(UINT32) StringSize));
AcpiUtRemoveReference (StringDesc);
return_PTR (NULL);
}
/* Complete string object initialization */
StringDesc->String.Pointer = String;
StringDesc->String.Length = (UINT32) StringSize;
/* Return the new string descriptor */
return_PTR (StringDesc);
}
/*******************************************************************************
*
* FUNCTION: AcpiUtValidInternalObject