diff options
97 files changed, 3853 insertions, 4422 deletions
diff --git a/sys/contrib/dev/acpica/acconfig.h b/sys/contrib/dev/acpica/acconfig.h index 83fef4e2ccfb..98dda4e4d439 100644 --- a/sys/contrib/dev/acpica/acconfig.h +++ b/sys/contrib/dev/acpica/acconfig.h @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acconfig.h - Global configuration constants - * $Revision: 74 $ + * $Revision: 78 $ * *****************************************************************************/ @@ -125,12 +125,13 @@ *****************************************************************************/ /* - * ACPI_DEBUG - This switch enables all the debug facilities of the ACPI - * subsystem. This includes the DEBUG_PRINT output statements - * When disabled, all DEBUG_PRINT statements are compiled out. + * ACPI_DEBUG - This switch enables all the debug facilities of the + * ACPI subsystem. This includes the DEBUG_PRINT output + * statements. When disabled, all DEBUG_PRINT + * statements are compiled out. * * ACPI_APPLICATION - Use this switch if the subsystem is going to be run - * at the application level. + * at the application level. * */ @@ -144,7 +145,7 @@ /* Version string */ -#define ACPI_CA_VERSION 0x20011018 +#define ACPI_CA_VERSION 0x20011120 /* Version of ACPI supported */ @@ -153,17 +154,17 @@ /* Maximum objects in the various object caches */ -#define MAX_STATE_CACHE_DEPTH 64 /* State objects for stacks */ +#define MAX_STATE_CACHE_DEPTH 64 /* State objects for stacks */ #define MAX_PARSE_CACHE_DEPTH 96 /* Parse tree objects */ #define MAX_EXTPARSE_CACHE_DEPTH 64 /* Parse tree objects */ #define MAX_OBJECT_CACHE_DEPTH 64 /* Interpreter operand objects */ -#define MAX_WALK_CACHE_DEPTH 4 /* Objects for parse tree walks (method execution) */ +#define MAX_WALK_CACHE_DEPTH 4 /* Objects for parse tree walks */ /* String size constants */ #define MAX_STRING_LENGTH 512 -#define PATHNAME_MAX 256 /* A full namespace pathname */ +#define PATHNAME_MAX 256 /* A full namespace pathname */ /* Maximum count for a semaphore object */ @@ -231,7 +232,7 @@ /* Names within the namespace are 4 bytes long */ #define ACPI_NAME_SIZE 4 -#define PATH_SEGMENT_LENGTH 5 /* 4 chars for name + 1 INT8 for separator */ +#define PATH_SEGMENT_LENGTH 5 /* 4 chars for name + 1 char for separator */ #define PATH_SEPARATOR '.' @@ -243,10 +244,15 @@ #define HI_RSDP_WINDOW_SIZE 0x20000 #define RSDP_SCAN_STEP 16 + +/* Operation regions */ + +#define ACPI_NUM_PREDEFINED_REGIONS 7 +#define ACPI_USER_REGION_BEGIN 0x80 + /* Maximum SpaceIds for Operation Regions */ #define ACPI_MAX_ADDRESS_SPACE 255 -#define ACPI_NUM_ADDRESS_SPACES 256 #endif /* _ACCONFIG_H */ diff --git a/sys/contrib/dev/acpica/acdispat.h b/sys/contrib/dev/acpica/acdispat.h index cb357d6e9fe0..d62f2377e88b 100644 --- a/sys/contrib/dev/acpica/acdispat.h +++ b/sys/contrib/dev/acpica/acdispat.h @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acdispat.h - dispatcher (parser to interpreter interface) - * $Revision: 45 $ + * $Revision: 48 $ * *****************************************************************************/ @@ -214,6 +214,11 @@ AcpiDsCreateBufferField ( ACPI_PARSE_OBJECT *Op, ACPI_WALK_STATE *WalkState); +ACPI_STATUS +AcpiDsInitFieldObjects ( + ACPI_PARSE_OBJECT *Op, + ACPI_WALK_STATE *WalkState); + /* dsload - Parser/Interpreter interface, namespace load callbacks */ @@ -291,18 +296,19 @@ AcpiDsMethodDataInitArgs ( UINT32 MaxParamCount, ACPI_WALK_STATE *WalkState); -ACPI_NAMESPACE_NODE * +ACPI_STATUS AcpiDsMethodDataGetNode ( UINT16 Opcode, UINT32 Index, - ACPI_WALK_STATE *WalkState); + ACPI_WALK_STATE *WalkState, + ACPI_NAMESPACE_NODE **Node); ACPI_STATUS AcpiDsMethodDataInit ( ACPI_WALK_STATE *WalkState); ACPI_STATUS -AcpiDsMethodDataSetEntry ( +AcpiDsMethodDataSetValue ( UINT16 Opcode, UINT32 Index, ACPI_OPERAND_OBJECT *Object, @@ -317,7 +323,7 @@ AcpiDsParseMethod ( ACPI_STATUS AcpiDsCallControlMethod ( - ACPI_WALK_LIST *WalkList, + ACPI_THREAD_STATE *Thread, ACPI_WALK_STATE *WalkState, ACPI_PARSE_OBJECT *Op); @@ -422,15 +428,6 @@ ACPI_STATUS AcpiDsResolveOperands ( ACPI_WALK_STATE *WalkState); -ACPI_OBJECT_TYPE8 -AcpiDsMapOpcodeToDataType ( - UINT16 Opcode, - UINT32 *OutFlags); - -ACPI_OBJECT_TYPE8 -AcpiDsMapNamedOpcodeToDataType ( - UINT16 Opcode); - /* * dswscope - Scope Stack manipulation @@ -459,7 +456,7 @@ AcpiDsCreateWalkState ( ACPI_OWNER_ID OwnerId, ACPI_PARSE_OBJECT *Origin, ACPI_OPERAND_OBJECT *MthDesc, - ACPI_WALK_LIST *WalkList); + ACPI_THREAD_STATE *Thread); ACPI_STATUS AcpiDsInitAmlWalk ( @@ -487,12 +484,12 @@ AcpiDsDeleteWalkState ( ACPI_WALK_STATE * AcpiDsPopWalkState ( - ACPI_WALK_LIST *WalkList); + ACPI_THREAD_STATE *Thread); void AcpiDsPushWalkState ( ACPI_WALK_STATE *WalkState, - ACPI_WALK_LIST *WalkList); + ACPI_THREAD_STATE *Thread); ACPI_STATUS AcpiDsResultStackPop ( @@ -508,7 +505,7 @@ AcpiDsResultStackClear ( ACPI_WALK_STATE * AcpiDsGetCurrentWalkState ( - ACPI_WALK_LIST *WalkList); + ACPI_THREAD_STATE *Thread); void AcpiDsDeleteWalkStateCache ( diff --git a/sys/contrib/dev/acpica/acevents.h b/sys/contrib/dev/acpica/acevents.h index 9ef26b79a139..c9045afb76d8 100644 --- a/sys/contrib/dev/acpica/acevents.h +++ b/sys/contrib/dev/acpica/acevents.h @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acevents.h - Event subcomponent prototypes and defines - * $Revision: 66 $ + * $Revision: 67 $ * *****************************************************************************/ @@ -205,8 +205,7 @@ AcpiEvAddressSpaceDispatch ( UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 BitWidth, - UINT32 *Value); - + ACPI_INTEGER *Value); ACPI_STATUS AcpiEvAddrHandlerHelper ( @@ -220,7 +219,6 @@ AcpiEvDisassociateRegionFromHandler( ACPI_OPERAND_OBJECT *RegionObj, BOOLEAN AcpiNsIsLocked); - ACPI_STATUS AcpiEvAssociateRegionAndHandler ( ACPI_OPERAND_OBJECT *HandlerObj, diff --git a/sys/contrib/dev/acpica/acexcep.h b/sys/contrib/dev/acpica/acexcep.h index 44bc2cbc9499..278dc51975dc 100644 --- a/sys/contrib/dev/acpica/acexcep.h +++ b/sys/contrib/dev/acpica/acexcep.h @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acexcep.h - Exception codes returned by the ACPI subsystem - * $Revision: 50 $ + * $Revision: 53 $ * *****************************************************************************/ @@ -145,7 +145,7 @@ #define AE_NO_MEMORY (ACPI_STATUS) (0x0004 | AE_CODE_ENVIRONMENTAL) #define AE_NOT_FOUND (ACPI_STATUS) (0x0005 | AE_CODE_ENVIRONMENTAL) #define AE_NOT_EXIST (ACPI_STATUS) (0x0006 | AE_CODE_ENVIRONMENTAL) -#define AE_EXIST (ACPI_STATUS) (0x0007 | AE_CODE_ENVIRONMENTAL) +#define AE_ALREADY_EXISTS (ACPI_STATUS) (0x0007 | AE_CODE_ENVIRONMENTAL) #define AE_TYPE (ACPI_STATUS) (0x0008 | AE_CODE_ENVIRONMENTAL) #define AE_NULL_OBJECT (ACPI_STATUS) (0x0009 | AE_CODE_ENVIRONMENTAL) #define AE_NULL_ENTRY (ACPI_STATUS) (0x000A | AE_CODE_ENVIRONMENTAL) @@ -220,8 +220,10 @@ #define AE_AML_MUTEX_ORDER (ACPI_STATUS) (0x0017 | AE_CODE_AML) #define AE_AML_MUTEX_NOT_ACQUIRED (ACPI_STATUS) (0x0018 | AE_CODE_AML) #define AE_AML_INVALID_RESOURCE_TYPE (ACPI_STATUS) (0x0019 | AE_CODE_AML) +#define AE_AML_INVALID_INDEX (ACPI_STATUS) (0x001A | AE_CODE_AML) +#define AE_AML_REGISTER_LIMIT (ACPI_STATUS) (0x001B | AE_CODE_AML) -#define AE_CODE_AML_MAX 0x0019 +#define AE_CODE_AML_MAX 0x001B /* * Internal exceptions used for control @@ -253,7 +255,7 @@ NATIVE_CHAR const *AcpiGbl_ExceptionNames_Env[] = "AE_NO_MEMORY", "AE_NOT_FOUND", "AE_NOT_EXIST", - "AE_EXIST", + "AE_ALREADY_EXISTS", "AE_TYPE", "AE_NULL_OBJECT", "AE_NULL_ENTRY", @@ -319,6 +321,8 @@ NATIVE_CHAR const *AcpiGbl_ExceptionNames_Aml[] = "AE_AML_MUTEX_ORDER", "AE_AML_MUTEX_NOT_ACQUIRED", "AE_AML_INVALID_RESOURCE_TYPE", + "AE_AML_INVALID_INDEX", + "AE_AML_REGISTER_LIMIT", }; NATIVE_CHAR const *AcpiGbl_ExceptionNames_Ctrl[] = diff --git a/sys/contrib/dev/acpica/acgcc.h b/sys/contrib/dev/acpica/acgcc.h index 9ca66f1cfec1..5581e481c8b0 100644 --- a/sys/contrib/dev/acpica/acgcc.h +++ b/sys/contrib/dev/acpica/acgcc.h @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acgcc.h - GCC specific defines, etc. - * $Revision: 14 $ + * $Revision: 15 $ * *****************************************************************************/ @@ -235,17 +235,17 @@ * Math helper asm macros */ #define ACPI_DIV_64_BY_32(n_hi, n_lo, d32, q32, r32) \ - asm("divl %2;" \ - :"=a"(q32), "=d"(r32) \ - :"r"(d32), \ - "0"(n_lo), "1"(n_hi)) + asm("divl %2;" \ + :"=a"(q32), "=d"(r32) \ + :"r"(d32), \ + "0"(n_lo), "1"(n_hi)) #define ACPI_SHIFT_RIGHT_64(n_hi, n_lo) \ - asm("shrl $1,%2;" \ - "rcrl $1,%3;" \ - :"=r"(n_hi), "=r"(n_lo) \ - :"0"(n_hi), "1"(n_lo)) + asm("shrl $1,%2;" \ + "rcrl $1,%3;" \ + :"=r"(n_hi), "=r"(n_lo) \ + :"0"(n_hi), "1"(n_lo)) /*! [End] no source code translation !*/ diff --git a/sys/contrib/dev/acpica/acglobal.h b/sys/contrib/dev/acpica/acglobal.h index bf05740b2170..62d938bf496c 100644 --- a/sys/contrib/dev/acpica/acglobal.h +++ b/sys/contrib/dev/acpica/acglobal.h @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acglobal.h - Declarations for global variables - * $Revision: 106 $ + * $Revision: 109 $ * *****************************************************************************/ @@ -221,7 +221,6 @@ ACPI_EXTERN BOOLEAN AcpiGbl_AcpiHardwarePresent; ACPI_EXTERN BOOLEAN AcpiGbl_GlobalLockPresent; extern BOOLEAN AcpiGbl_Shutdown; -extern UINT32 AcpiGbl_SystemFlags; extern UINT32 AcpiGbl_StartupFlags; extern const UINT8 AcpiGbl_DecodeTo8bit[8]; extern const NATIVE_CHAR *AcpiGbl_DbSleepStates[ACPI_NUM_SLEEP_STATES]; @@ -259,11 +258,7 @@ ACPI_EXTERN UINT32 AcpiGbl_DeepestNesting; ****************************************************************************/ -ACPI_EXTERN ACPI_WALK_LIST *AcpiGbl_CurrentWalkList; - -/* Address Space handlers */ - -ACPI_EXTERN ACPI_ADR_SPACE_INFO AcpiGbl_AddressSpaces[ACPI_NUM_ADDRESS_SPACES]; +ACPI_EXTERN ACPI_THREAD_STATE *AcpiGbl_CurrentWalkList; /* Control method single step flag */ diff --git a/sys/contrib/dev/acpica/acinterp.h b/sys/contrib/dev/acpica/acinterp.h index 373136d71ec0..a917e153ca65 100644 --- a/sys/contrib/dev/acpica/acinterp.h +++ b/sys/contrib/dev/acpica/acinterp.h @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acinterp.h - Interpreter subcomponent prototypes and defines - * $Revision: 116 $ + * $Revision: 122 $ * *****************************************************************************/ @@ -118,24 +118,7 @@ #define __ACINTERP_H__ -#define WALK_OPERANDS &(WalkState->Operands [WalkState->NumOperands -1]) - - -/* Interpreter constants */ - -#define AML_END_OF_BLOCK -1 -#define PUSH_PKG_LENGTH 1 -#define DO_NOT_PUSH_PKG_LENGTH 0 - - -#define STACK_TOP 0 -#define STACK_BOTTOM (UINT32) -1 - -/* Constants for global "WhenToParseMethods" */ - -#define METHOD_PARSE_AT_INIT 0x0 -#define METHOD_PARSE_JUST_IN_TIME 0x1 -#define METHOD_DELETE_AT_COMPLETION 0x2 +#define WALK_OPERANDS (&(WalkState->Operands [WalkState->NumOperands -1])) ACPI_STATUS @@ -208,52 +191,49 @@ AcpiExInsertIntoField ( UINT32 BufferLength); ACPI_STATUS -AcpiExSetupField ( +AcpiExSetupRegion ( ACPI_OPERAND_OBJECT *ObjDesc, - UINT32 FieldByteOffset); + UINT32 FieldDatumByteOffset); ACPI_STATUS -AcpiExReadFieldDatum ( +AcpiExAccessRegion ( ACPI_OPERAND_OBJECT *ObjDesc, - UINT32 FieldByteOffset, - UINT32 *Value); + UINT32 FieldDatumByteOffset, + ACPI_INTEGER *Value, + UINT32 ReadWrite); -ACPI_STATUS -AcpiExCommonAccessField ( - UINT32 Mode, +BOOLEAN +AcpiExRegisterOverflow ( ACPI_OPERAND_OBJECT *ObjDesc, - void *Buffer, - UINT32 BufferLength); - + ACPI_INTEGER Value); ACPI_STATUS -AcpiExAccessIndexField ( - UINT32 Mode, +AcpiExFieldDatumIo ( ACPI_OPERAND_OBJECT *ObjDesc, - void *Buffer, - UINT32 BufferLength); + UINT32 FieldDatumByteOffset, + ACPI_INTEGER *Value, + UINT32 ReadWrite); ACPI_STATUS -AcpiExAccessBankField ( - UINT32 Mode, +AcpiExWriteWithUpdateRule ( ACPI_OPERAND_OBJECT *ObjDesc, - void *Buffer, - UINT32 BufferLength); + ACPI_INTEGER Mask, + ACPI_INTEGER FieldValue, + UINT32 FieldDatumByteOffset); -ACPI_STATUS -AcpiExAccessRegionField ( - UINT32 Mode, - ACPI_OPERAND_OBJECT *ObjDesc, +void +AcpiExGetBufferDatum( + ACPI_INTEGER *Datum, void *Buffer, - UINT32 BufferLength); - + UINT32 ByteGranularity, + UINT32 Offset); -ACPI_STATUS -AcpiExAccessBufferField ( - UINT32 Mode, - ACPI_OPERAND_OBJECT *ObjDesc, +void +AcpiExSetBufferDatum ( + ACPI_INTEGER MergedDatum, void *Buffer, - UINT32 BufferLength); + UINT32 ByteGranularity, + UINT32 Offset); ACPI_STATUS AcpiExReadDataFromField ( @@ -370,12 +350,16 @@ AcpiExReleaseMutex ( ACPI_STATUS AcpiExReleaseAllMutexes ( - ACPI_OPERAND_OBJECT *MutexList); + ACPI_THREAD_STATE *Thread); void AcpiExUnlinkMutex ( ACPI_OPERAND_OBJECT *ObjDesc); +void +AcpiExLinkMutex ( + ACPI_OPERAND_OBJECT *ObjDesc, + ACPI_THREAD_STATE *Thread); /* * amprep - ACPI AML (p-code) execution - prep utilities @@ -385,35 +369,9 @@ ACPI_STATUS AcpiExPrepCommonFieldObject ( ACPI_OPERAND_OBJECT *ObjDesc, UINT8 FieldFlags, - UINT32 FieldPosition, - UINT32 FieldLength); - -ACPI_STATUS -AcpiExPrepRegionFieldValue ( - ACPI_NAMESPACE_NODE *Node, - ACPI_HANDLE Region, - UINT8 FieldFlags, - UINT32 FieldPosition, - UINT32 FieldLength); - -ACPI_STATUS -AcpiExPrepBankFieldValue ( - ACPI_NAMESPACE_NODE *Node, - ACPI_NAMESPACE_NODE *RegionNode, - ACPI_NAMESPACE_NODE *BankRegisterNode, - UINT32 BankVal, - UINT8 FieldFlags, - UINT32 FieldPosition, - UINT32 FieldLength); - -ACPI_STATUS -AcpiExPrepIndexFieldValue ( - ACPI_NAMESPACE_NODE *Node, - ACPI_NAMESPACE_NODE *IndexReg, - ACPI_NAMESPACE_NODE *DataReg, - UINT8 FieldFlags, - UINT32 FieldPosition, - UINT32 FieldLength); + UINT8 FieldAttribute, + UINT32 FieldBitPosition, + UINT32 FieldBitLength); ACPI_STATUS AcpiExPrepFieldValue ( @@ -524,11 +482,6 @@ AcpiExResolveObjectToValue ( ACPI_OPERAND_OBJECT **StackPtr, ACPI_WALK_STATE *WalkState); -ACPI_STATUS -AcpiExGetBufferFieldValue ( - ACPI_OPERAND_OBJECT *FieldDesc, - ACPI_OPERAND_OBJECT *ResultDesc); - /* * amdump - Scanner debug output routines @@ -733,7 +686,7 @@ AcpiExSystemMemorySpaceHandler ( UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 BitWidth, - UINT32 *Value, + ACPI_INTEGER *Value, void *HandlerContext, void *RegionContext); @@ -742,7 +695,7 @@ AcpiExSystemIoSpaceHandler ( UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 BitWidth, - UINT32 *Value, + ACPI_INTEGER *Value, void *HandlerContext, void *RegionContext); @@ -751,7 +704,7 @@ AcpiExPciConfigSpaceHandler ( UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 BitWidth, - UINT32 *Value, + ACPI_INTEGER *Value, void *HandlerContext, void *RegionContext); @@ -760,7 +713,7 @@ AcpiExCmosSpaceHandler ( UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 BitWidth, - UINT32 *Value, + ACPI_INTEGER *Value, void *HandlerContext, void *RegionContext); @@ -769,7 +722,7 @@ AcpiExPciBarSpaceHandler ( UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 BitWidth, - UINT32 *Value, + ACPI_INTEGER *Value, void *HandlerContext, void *RegionContext); @@ -778,7 +731,7 @@ AcpiExEmbeddedControllerSpaceHandler ( UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 BitWidth, - UINT32 *Value, + ACPI_INTEGER *Value, void *HandlerContext, void *RegionContext); @@ -787,7 +740,7 @@ AcpiExSmBusSpaceHandler ( UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 BitWidth, - UINT32 *Value, + ACPI_INTEGER *Value, void *HandlerContext, void *RegionContext); diff --git a/sys/contrib/dev/acpica/aclocal.h b/sys/contrib/dev/acpica/aclocal.h index bf99fd10e466..3a3e77cc5497 100644 --- a/sys/contrib/dev/acpica/aclocal.h +++ b/sys/contrib/dev/acpica/aclocal.h @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: aclocal.h - Internal data types used across the ACPI subsystem - * $Revision: 138 $ + * $Revision: 145 $ * *****************************************************************************/ @@ -140,6 +140,7 @@ typedef UINT32 ACPI_MUTEX_HANDLE; #define ACPI_DESC_TYPE_STATE_WSCOPE 0x26 #define ACPI_DESC_TYPE_STATE_RESULT 0x27 #define ACPI_DESC_TYPE_STATE_NOTIFY 0x28 +#define ACPI_DESC_TYPE_STATE_THREAD 0x29 #define ACPI_DESC_TYPE_WALK 0x44 #define ACPI_DESC_TYPE_PARSER 0x66 #define ACPI_DESC_TYPE_INTERNAL 0x88 @@ -294,7 +295,7 @@ typedef struct acpi_node /* Node flags */ -#define ANOBJ_AML_ATTACHMENT 0x01 +#define ANOBJ_RESERVED 0x01 #define ANOBJ_END_OF_PEER_LIST 0x02 #define ANOBJ_DATA_WIDTH_32 0x04 /* Parent table is 64-bits */ #define ANOBJ_METHOD_ARG 0x08 @@ -388,19 +389,11 @@ typedef struct UINT32 FieldBitPosition; UINT32 FieldBitLength; UINT8 FieldFlags; + UINT8 Attribute; UINT8 FieldType; } ACPI_CREATE_FIELD_INFO; -/* - * Field flags: Bits 00 - 03 : AccessType (AnyAcc, ByteAcc, etc.) - * 04 : LockRule (1 == Lock) - * 05 - 06 : UpdateRule - */ - -#define FIELD_ACCESS_TYPE_MASK 0x0F -#define FIELD_LOCK_RULE_MASK 0x10 -#define FIELD_UPDATE_RULE_MASK 0x60 /***************************************************************************** @@ -428,18 +421,6 @@ typedef struct #define ACPI_ENABLE_RTC_ALARM 0x0400 -/* - * Entry in the AddressSpace (AKA Operation Region) table - */ - -typedef struct -{ - ACPI_ADR_SPACE_HANDLER Handler; - void *Context; - -} ACPI_ADR_SPACE_INFO; - - /* Values and addresses of the GPE registers (both banks) */ typedef struct @@ -508,7 +489,6 @@ typedef struct /* Forward declarations */ struct acpi_walk_state; -struct acpi_walk_list; struct acpi_parse_obj; struct acpi_obj_mutex; @@ -562,7 +542,7 @@ typedef struct acpi_control_state { ACPI_STATE_COMMON struct acpi_parse_obj *PredicateOp; - UINT8 *AmlPredicateStart; /* Start of if/while predicate */ + UINT8 *AmlPredicateStart; /* Start of if/while predicate */ } ACPI_CONTROL_STATE; @@ -581,16 +561,31 @@ typedef struct acpi_scope_state typedef struct acpi_pscope_state { ACPI_STATE_COMMON - struct acpi_parse_obj *Op; /* current op being parsed */ - UINT8 *ArgEnd; /* current argument end */ - UINT8 *PkgEnd; /* current package end */ - UINT32 ArgList; /* next argument to parse */ - UINT32 ArgCount; /* Number of fixed arguments */ + struct acpi_parse_obj *Op; /* current op being parsed */ + UINT8 *ArgEnd; /* current argument end */ + UINT8 *PkgEnd; /* current package end */ + UINT32 ArgList; /* next argument to parse */ + UINT32 ArgCount; /* Number of fixed arguments */ } ACPI_PSCOPE_STATE; /* + * Thread state - one per thread across multiple walk states. Multiple walk + * states are created when there are nested control methods executing. + */ +typedef struct acpi_thread_state +{ + ACPI_STATE_COMMON + struct acpi_walk_state *WalkStateList; /* Head of list of WalkStates for this thread */ + union acpi_operand_obj *AcquiredMutexList; /* List of all currently acquired mutexes */ + UINT32 ThreadId; /* Running thread ID */ + UINT16 CurrentSyncLevel; /* Mutex Sync (nested acquire) level */ + +} ACPI_THREAD_STATE; + + +/* * Result values - used to accumulate the results of nested * AML arguments */ @@ -637,13 +632,13 @@ typedef union acpi_gen_state ACPI_SCOPE_STATE Scope; ACPI_PSCOPE_STATE ParseScope; ACPI_PKG_STATE Pkg; + ACPI_THREAD_STATE Thread; ACPI_RESULT_VALUES Results; ACPI_NOTIFY_INFO Notify; } ACPI_GENERIC_STATE; - /***************************************************************************** * * Interpreter typedefs and structs @@ -666,15 +661,16 @@ ACPI_STATUS (*ACPI_EXECUTE_OP) ( */ typedef struct acpi_opcode_info { +#ifdef _OPCODE_NAMES + NATIVE_CHAR *Name; /* Opcode name (debug only) */ +#endif UINT32 ParseArgs; /* Grammar/Parse time arguments */ UINT32 RuntimeArgs; /* Interpret time arguments */ - UINT16 Flags; /* Misc flags */ + UINT32 Flags; /* Misc flags */ + UINT8 ObjectType; /* Corresponding internal object type */ UINT8 Class; /* Opcode class */ UINT8 Type; /* Opcode type */ -#ifdef _OPCODE_NAMES - NATIVE_CHAR *Name; /* op name (debug only) */ -#endif } ACPI_OPCODE_INFO; @@ -753,8 +749,6 @@ typedef struct acpi_parse_state struct acpi_parse_obj *StartScope; - - } ACPI_PARSE_STATE; @@ -891,10 +885,6 @@ typedef struct acpi_parse_state #define GPE1_EN_MASK -#define ACPI_READ 1 -#define ACPI_WRITE 2 - - /***************************************************************************** * * Resource descriptors diff --git a/sys/contrib/dev/acpica/acmacros.h b/sys/contrib/dev/acpica/acmacros.h index d024dbfef3c1..e73f8c729c9e 100644 --- a/sys/contrib/dev/acpica/acmacros.h +++ b/sys/contrib/dev/acpica/acmacros.h @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acmacros.h - C macros for the entire subsystem. - * $Revision: 97 $ + * $Revision: 100 $ * *****************************************************************************/ @@ -321,8 +321,8 @@ * MASK_BITS_ABOVE creates a mask starting AT the position and above * MASK_BITS_BELOW creates a mask starting one bit BELOW the position */ -#define MASK_BITS_ABOVE(position) (~(((UINT32)(-1)) << ((UINT32) (position)))) -#define MASK_BITS_BELOW(position) (((UINT32)(-1)) << ((UINT32) (position))) +#define MASK_BITS_ABOVE(position) (~(((ACPI_INTEGER)(-1)) << ((UINT32) (position)))) +#define MASK_BITS_BELOW(position) (((ACPI_INTEGER)(-1)) << ((UINT32) (position))) /* Macros for GAS addressing */ @@ -348,8 +348,8 @@ #endif /* - * An ACPI_HANDLE (which is actually an ACPI_NAMESPACE_NODE *) can appear in some contexts, - * such as on apObjStack, where a pointer to an ACPI_OPERAND_OBJECT can also + * An ACPI_NAMESPACE_NODE * can appear in some contexts, + * where a pointer to an ACPI_OPERAND_OBJECT can also * appear. This macro is used to distinguish them. * * The DataType field is the first field in both structures. @@ -385,9 +385,9 @@ * Macros for the master AML opcode table */ #ifdef ACPI_DEBUG -#define ACPI_OP(Name,PArgs,IArgs,Class,Type,Flags) {PArgs,IArgs,Flags,Class,Type,Name} +#define ACPI_OP(Name,PArgs,IArgs,ObjType,Class,Type,Flags) {Name,PArgs,IArgs,Flags,ObjType,Class,Type} #else -#define ACPI_OP(Name,PArgs,IArgs,Class,Type,Flags) {PArgs,IArgs,Flags,Class,Type} +#define ACPI_OP(Name,PArgs,IArgs,ObjType,Class,Type,Flags) {PArgs,IArgs,Flags,ObjType,Class,Type} #endif #define ARG_TYPE_WIDTH 5 diff --git a/sys/contrib/dev/acpica/acnamesp.h b/sys/contrib/dev/acpica/acnamesp.h index 3c8f6ccfb80b..2c94fa43fdf4 100644 --- a/sys/contrib/dev/acpica/acnamesp.h +++ b/sys/contrib/dev/acpica/acnamesp.h @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acnamesp.h - Namespace subcomponent prototypes and defines - * $Revision: 110 $ + * $Revision: 115 $ * *****************************************************************************/ @@ -137,7 +137,7 @@ #define ACPI_ROOT_NAME (UINT32) 0x2F202020 /* Root name is "/ " */ #define ACPI_SYS_BUS_NAME (UINT32) 0x5F53425F /* Sys bus name is "_SB_" */ -#define NS_ROOT_PATH "/" +#define NS_ROOT_PATH "\\" #define NS_SYSTEM_BUS "_SB_" @@ -307,6 +307,11 @@ AcpiNsDumpPathname ( UINT32 Component); void +AcpiNsPrintPathname ( + UINT32 NumSegments, + char *Pathname); + +void AcpiNsDumpRootDevices ( void); @@ -415,6 +420,31 @@ AcpiNsAttachObject ( ACPI_OPERAND_OBJECT *Object, ACPI_OBJECT_TYPE8 Type); +ACPI_OPERAND_OBJECT * +AcpiNsGetAttachedObject ( + ACPI_NAMESPACE_NODE *Node); + +ACPI_OPERAND_OBJECT * +AcpiNsGetSecondaryObject ( + ACPI_OPERAND_OBJECT *ObjDesc); + +ACPI_STATUS +AcpiNsAttachData ( + ACPI_NAMESPACE_NODE *Node, + ACPI_OBJECT_HANDLER Handler, + void *Data); + +ACPI_STATUS +AcpiNsDetachData ( + ACPI_NAMESPACE_NODE *Node, + ACPI_OBJECT_HANDLER Handler); + +ACPI_STATUS +AcpiNsGetAttachedData ( + ACPI_NAMESPACE_NODE *Node, + ACPI_OBJECT_HANDLER Handler, + void **Data); + /* * Namespace searching and entry - nssearch @@ -461,10 +491,6 @@ ACPI_OBJECT_TYPE8 AcpiNsGetType ( ACPI_NAMESPACE_NODE *Node); -void * -AcpiNsGetAttachedObject ( - ACPI_NAMESPACE_NODE *Node); - UINT32 AcpiNsLocal ( ACPI_OBJECT_TYPE8 Type); diff --git a/sys/contrib/dev/acpica/acobject.h b/sys/contrib/dev/acpica/acobject.h index f8a2e38111d4..edc337595a7a 100644 --- a/sys/contrib/dev/acpica/acobject.h +++ b/sys/contrib/dev/acpica/acobject.h @@ -2,7 +2,7 @@ /****************************************************************************** * * Name: acobject.h - Definition of ACPI_OPERAND_OBJECT (Internal object only) - * $Revision: 93 $ + * $Revision: 101 $ * *****************************************************************************/ @@ -149,19 +149,21 @@ */ -#define ACPI_OBJECT_COMMON_HEADER /* SIZE/ALIGNMENT: 32-bits plus trailing 8-bit flag */\ +#define ACPI_OBJECT_COMMON_HEADER /* SIZE/ALIGNMENT: 32 bits, one ptr plus trailing 8-bit flag */\ UINT8 DataType; /* To differentiate various internal objs */\ UINT8 Type; /* ACPI_OBJECT_TYPE */\ UINT16 ReferenceCount; /* For object deletion management */\ + union acpi_operand_obj *NextObject; /* Objects linked to parent NS node */\ UINT8 Flags; \ /* Defines for flag byte above */ -#define AOPOBJ_STATIC_ALLOCATION 0x1 -#define AOPOBJ_STATIC_POINTER 0x2 -#define AOPOBJ_DATA_VALID 0x4 -#define AOPOBJ_ZERO_CONST 0x4 -#define AOPOBJ_INITIALIZED 0x8 +#define AOPOBJ_STATIC_ALLOCATION 0x01 +#define AOPOBJ_STATIC_POINTER 0x02 +#define AOPOBJ_DATA_VALID 0x04 +#define AOPOBJ_OBJECT_INITIALIZED 0x08 +#define AOPOBJ_SETUP_COMPLETE 0x10 +#define AOPOBJ_SINGLE_DATUM 0x20 /* @@ -170,23 +172,19 @@ * "Buffer Datum" -- a datum from a user buffer, read from or to be written to the field */ #define ACPI_COMMON_FIELD_INFO /* SIZE/ALIGNMENT: 24 bits + three 32-bit values */\ - UINT8 AccessFlags;\ + UINT8 FieldFlags; /* Access, update, and lock bits */\ UINT16 BitLength; /* Length of field in bits */\ UINT32 BaseByteOffset; /* Byte offset within containing object */\ UINT8 AccessBitWidth; /* Read/Write size in bits (from ASL AccessType)*/\ UINT8 AccessByteWidth; /* Read/Write size in bytes */\ - UINT8 UpdateRule; /* How neighboring field bits are handled */\ - UINT8 LockRule; /* Global Lock: 1 = "Must Lock" */\ + UINT8 Attribute ; /* From AccessAs keyword */\ UINT8 StartFieldBitOffset;/* Bit offset within first field datum (0-63) */\ UINT8 DatumValidBits; /* Valid bit in first "Field datum" */\ UINT8 EndFieldValidBits; /* Valid bits in the last "field datum" */\ UINT8 EndBufferValidBits; /* Valid bits in the last "buffer datum" */\ - UINT32 Value; /* Value to store into the Bank or Index register */ - - -/* Access flag bits */ - -#define AFIELD_SINGLE_DATUM 0x1 + UINT8 Reserved; /* Reserved for future use */\ + UINT32 Value; /* Value to store into the Bank or Index register */\ + ACPI_NAMESPACE_NODE *Node; /* Link back to parent node */ /* @@ -196,7 +194,6 @@ UINT32 Length; - /****************************************************************************** * * Individual Object Descriptors @@ -242,6 +239,7 @@ typedef struct /* BUFFER - has length and pointer - not null terminated */ ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_BUFFER_INFO UINT8 *Pointer; /* Buffer value in AML stream or in allocated space */ + ACPI_NAMESPACE_NODE *Node; /* Link back to parent node */ } ACPI_OBJECT_BUFFER; @@ -302,8 +300,8 @@ typedef struct acpi_obj_mutex /* MUTEX */ UINT16 SyncLevel; UINT16 AcquisitionDepth; + struct acpi_thread_state *OwnerThread; void *Semaphore; - void *Owner; union acpi_operand_obj *Prev; /* Link for list of acquired mutexes */ union acpi_operand_obj *Next; /* Link for list of acquired mutexes */ @@ -317,7 +315,6 @@ typedef struct /* REGION */ UINT8 SpaceId; UINT32 Length; ACPI_PHYSICAL_ADDRESS Address; - union acpi_operand_obj *Extra; /* Pointer to executable AML (in region definition) */ union acpi_operand_obj *AddrHandler; /* Handler for system notifies */ ACPI_NAMESPACE_NODE *Node; /* containing object */ @@ -393,7 +390,7 @@ typedef struct /* BANK FIELD */ ACPI_COMMON_FIELD_INFO union acpi_operand_obj *RegionObj; /* Containing OpRegion object */ - union acpi_operand_obj *BankRegisterObj; /* BankSelect Register object */ + union acpi_operand_obj *BankObj; /* BankSelect Register object */ } ACPI_OBJECT_BANK_FIELD; @@ -421,8 +418,6 @@ typedef struct /* BUFFER FIELD */ ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO - union acpi_operand_obj *Extra; /* Pointer to executable AML (in field definition) */ - ACPI_NAMESPACE_NODE *Node; /* Parent (containing) object node */ union acpi_operand_obj *BufferObj; /* Containing Buffer object */ } ACPI_OBJECT_BUFFER_FIELD; @@ -506,6 +501,15 @@ typedef struct /* EXTRA */ } ACPI_OBJECT_EXTRA; +typedef struct /* DATA */ +{ + ACPI_OBJECT_COMMON_HEADER + ACPI_OBJECT_HANDLER Handler; + void *Pointer; + +} ACPI_OBJECT_DATA; + + /****************************************************************************** * * ACPI_OPERAND_OBJECT Descriptor - a giant union of all of the above @@ -537,6 +541,7 @@ typedef union acpi_operand_obj ACPI_OBJECT_NOTIFY_HANDLER NotifyHandler; ACPI_OBJECT_ADDR_HANDLER AddrHandler; ACPI_OBJECT_EXTRA Extra; + ACPI_OBJECT_DATA Data; } ACPI_OPERAND_OBJECT; diff --git a/sys/contrib/dev/acpica/acparser.h b/sys/contrib/dev/acpica/acparser.h index 396cdb24df5e..3a321d7e53f6 100644 --- a/sys/contrib/dev/acpica/acparser.h +++ b/sys/contrib/dev/acpica/acparser.h @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: acparser.h - AML Parser subcomponent prototypes and defines - * $Revision: 54 $ + * $Revision: 55 $ * *****************************************************************************/ @@ -119,15 +119,15 @@ #define __ACPARSER_H__ -#define OP_HAS_RETURN_VALUE 1 +#define OP_HAS_RETURN_VALUE 1 /* variable # arguments */ -#define ACPI_VAR_ARGS ACPI_UINT32_MAX +#define ACPI_VAR_ARGS ACPI_UINT32_MAX /* maximum virtual address */ -#define ACPI_MAX_AML ((UINT8 *)(~0UL)) +#define ACPI_MAX_AML ((UINT8 *)(~0UL)) #define ACPI_PARSE_DELETE_TREE 0x0001 @@ -139,7 +139,8 @@ #define ACPI_PARSE_EXECUTE 0x0030 #define ACPI_PARSE_MODE_MASK 0x0030 -/* psapi - Parser external interfaces */ + +/* Parser external interfaces */ ACPI_STATUS AcpiPsxLoadTable ( @@ -152,6 +153,7 @@ AcpiPsxExecute ( ACPI_OPERAND_OBJECT **Params, ACPI_OPERAND_OBJECT **ReturnObjDesc); + /****************************************************************************** * * Parser interfaces @@ -176,8 +178,8 @@ AcpiPsGetNextNamestring ( void AcpiPsGetNextSimpleArg ( ACPI_PARSE_STATE *ParserState, - UINT32 ArgType, /* type of argument */ - ACPI_PARSE_OBJECT *Arg); /* (OUT) argument data */ + UINT32 ArgType, + ACPI_PARSE_OBJECT *Arg); void AcpiPsGetNextNamepath ( @@ -197,6 +199,19 @@ AcpiPsGetNextArg ( UINT32 *ArgCount); +/* psfind */ + +ACPI_PARSE_OBJECT * +AcpiPsFindName ( + ACPI_PARSE_OBJECT *Scope, + UINT32 Name, + UINT32 Opcode); + +ACPI_PARSE_OBJECT* +AcpiPsGetParent ( + ACPI_PARSE_OBJECT *Op); + + /* psopcode - AML Opcode information */ const ACPI_OPCODE_INFO * @@ -210,6 +225,21 @@ AcpiPsGetOpcodeName ( /* psparse - top level parsing routines */ +UINT32 +AcpiPsGetOpcodeSize ( + UINT32 Opcode); + +BOOLEAN +AcpiPsCompleteThisOp ( + ACPI_WALK_STATE *WalkState, + ACPI_PARSE_OBJECT *Op); + +ACPI_STATUS +AcpiPsNextParseState ( + ACPI_WALK_STATE *WalkState, + ACPI_PARSE_OBJECT *Op, + ACPI_STATUS CallbackStatus); + ACPI_STATUS AcpiPsFindObject ( ACPI_WALK_STATE *WalkState, @@ -324,6 +354,10 @@ AcpiPsGetNextWalkOp ( ACPI_PARSE_OBJECT *Op, ACPI_PARSE_UPWARDS AscendingCallback); +ACPI_STATUS +AcpiPsDeleteCompletedOp ( + ACPI_WALK_STATE *WalkState); + /* psutils - parser utilities */ diff --git a/sys/contrib/dev/acpica/acpiosxf.h b/sys/contrib/dev/acpica/acpiosxf.h index 2e03a3d7b18b..52bc6536d94f 100644 --- a/sys/contrib/dev/acpica/acpiosxf.h +++ b/sys/contrib/dev/acpica/acpiosxf.h @@ -294,7 +294,7 @@ AcpiOsReadPort ( ACPI_STATUS AcpiOsWritePort ( ACPI_IO_ADDRESS Address, - NATIVE_UINT Value, + ACPI_INTEGER Value, UINT32 Width); @@ -312,7 +312,7 @@ AcpiOsReadMemory ( ACPI_STATUS AcpiOsWriteMemory ( ACPI_PHYSICAL_ADDRESS Address, - NATIVE_UINT Value, + ACPI_INTEGER Value, UINT32 Width); @@ -332,7 +332,7 @@ ACPI_STATUS AcpiOsWritePciConfiguration ( ACPI_PCI_ID *PciId, UINT32 Register, - NATIVE_UINT Value, + ACPI_INTEGER Value, UINT32 Width); diff --git a/sys/contrib/dev/acpica/acpixf.h b/sys/contrib/dev/acpica/acpixf.h index 2c25e15b6d26..ec03fb4b9592 100644 --- a/sys/contrib/dev/acpica/acpixf.h +++ b/sys/contrib/dev/acpica/acpixf.h @@ -158,6 +158,10 @@ const char * AcpiFormatException ( ACPI_STATUS Exception); +ACPI_STATUS +AcpiPurgeCachedObjects ( + void); + /* * ACPI Memory manager @@ -249,6 +253,23 @@ AcpiGetHandle ( ACPI_STRING Pathname, ACPI_HANDLE *RetHandle); +ACPI_STATUS +AcpiAttachData ( + ACPI_HANDLE ObjHandle, + ACPI_OBJECT_HANDLER Handler, + void *Data); + +ACPI_STATUS +AcpiDetachData ( + ACPI_HANDLE ObjHandle, + ACPI_OBJECT_HANDLER Handler); + +ACPI_STATUS +AcpiGetData ( + ACPI_HANDLE ObjHandle, + ACPI_OBJECT_HANDLER Handler, + void **Data); + /* * Object manipulation and enumeration @@ -406,6 +427,11 @@ ACPI_STATUS AcpiGetFirmwareWakingVector ( ACPI_PHYSICAL_ADDRESS *PhysicalAddress); + +ACPI_STATUS +AcpiEnterSleepStatePrep ( + UINT8 SleepState); + ACPI_STATUS AcpiEnterSleepState ( UINT8 SleepState); diff --git a/sys/contrib/dev/acpica/acstruct.h b/sys/contrib/dev/acpica/acstruct.h index bfd62ef7b317..f214ceddee3b 100644 --- a/sys/contrib/dev/acpica/acstruct.h +++ b/sys/contrib/dev/acpica/acstruct.h @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acstruct.h - Internal structs - * $Revision: 10 $ + * $Revision: 12 $ * *****************************************************************************/ @@ -125,6 +125,7 @@ ****************************************************************************/ + /* * Walk state - current state of a parse tree walk. Used for both a leisurely stroll through * the tree (for whatever reason), and for control method execution. @@ -147,7 +148,6 @@ typedef struct acpi_walk_state UINT8 NumOperands; /* Stack pointer for Operands[] array */ UINT8 ReturnUsed; UINT8 WalkType; - UINT16 CurrentSyncLevel; /* Mutex Sync (nested acquire) level */ UINT16 Opcode; /* Current AML opcode */ UINT32 ArgCount; /* push for fixed or var args */ UINT32 AmlOffset; @@ -184,26 +184,13 @@ typedef struct acpi_walk_state ACPI_PARSE_DOWNWARDS DescendingCallback; ACPI_PARSE_UPWARDS AscendingCallback; - struct acpi_walk_list *WalkList; + ACPI_THREAD_STATE *Thread; struct acpi_walk_state *Next; /* Next WalkState in list */ - } ACPI_WALK_STATE; -/* - * Walk list - head of a tree of walk states. Multiple walk states are created when there - * are nested control methods executing. - */ -typedef struct acpi_walk_list -{ - - ACPI_WALK_STATE *WalkState; - ACPI_OBJECT_MUTEX AcquiredMutexList; /* List of all currently acquired mutexes */ - -} ACPI_WALK_LIST; - /* Info used by AcpiPsInitObjects */ @@ -256,8 +243,6 @@ typedef struct acpi_get_devices_info } ACPI_GET_DEVICES_INFO; - - typedef union acpi_aml_operands { ACPI_OPERAND_OBJECT *Operands[7]; @@ -290,5 +275,4 @@ typedef union acpi_aml_operands } ACPI_AML_OPERANDS; - #endif diff --git a/sys/contrib/dev/acpica/actypes.h b/sys/contrib/dev/acpica/actypes.h index 4c825ec4b855..31e1b6cb7a3a 100644 --- a/sys/contrib/dev/acpica/actypes.h +++ b/sys/contrib/dev/acpica/actypes.h @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: actypes.h - Common data types for the entire ACPI subsystem - * $Revision: 193 $ + * $Revision: 199 $ * *****************************************************************************/ @@ -384,6 +384,12 @@ typedef UINT64 ACPI_INTEGER; #define ACPI_D_STATE_COUNT 4 /* + * Sleep type invalid value + */ +#define ACPI_SLEEP_TYPE_MAX 0x7 +#define ACPI_SLEEP_TYPE_INVALID 0xFF + +/* * Standard notify values */ #define ACPI_NOTIFY_BUS_CHECK (UINT8) 0 @@ -427,25 +433,25 @@ typedef UINT32 ACPI_OBJECT_TYPE; typedef UINT8 ACPI_OBJECT_TYPE8; -#define ACPI_TYPE_ANY 0 /* 0x00 */ -#define ACPI_TYPE_INTEGER 1 /* 0x01 Byte/Word/Dword/Zero/One/Ones */ -#define ACPI_TYPE_STRING 2 /* 0x02 */ -#define ACPI_TYPE_BUFFER 3 /* 0x03 */ -#define ACPI_TYPE_PACKAGE 4 /* 0x04 ByteConst, multiple DataTerm/Constant/SuperName */ -#define ACPI_TYPE_FIELD_UNIT 5 /* 0x05 */ -#define ACPI_TYPE_DEVICE 6 /* 0x06 Name, multiple Node */ -#define ACPI_TYPE_EVENT 7 /* 0x07 */ -#define ACPI_TYPE_METHOD 8 /* 0x08 Name, ByteConst, multiple Code */ -#define ACPI_TYPE_MUTEX 9 /* 0x09 */ -#define ACPI_TYPE_REGION 10 /* 0x0A */ -#define ACPI_TYPE_POWER 11 /* 0x0B Name,ByteConst,WordConst,multi Node */ -#define ACPI_TYPE_PROCESSOR 12 /* 0x0C Name,ByteConst,DWordConst,ByteConst,multi NmO */ -#define ACPI_TYPE_THERMAL 13 /* 0x0D Name, multiple Node */ -#define ACPI_TYPE_BUFFER_FIELD 14 /* 0x0E */ -#define ACPI_TYPE_DDB_HANDLE 15 /* 0x0F */ -#define ACPI_TYPE_DEBUG_OBJECT 16 /* 0x10 */ - -#define ACPI_TYPE_MAX 16 +#define ACPI_TYPE_ANY 0x00 +#define ACPI_TYPE_INTEGER 0x01 /* Byte/Word/Dword/Zero/One/Ones */ +#define ACPI_TYPE_STRING 0x02 +#define ACPI_TYPE_BUFFER 0x03 +#define ACPI_TYPE_PACKAGE 0x04 /* ByteConst, multiple DataTerm/Constant/SuperName */ +#define ACPI_TYPE_FIELD_UNIT 0x05 +#define ACPI_TYPE_DEVICE 0x06 /* Name, multiple Node */ +#define ACPI_TYPE_EVENT 0x07 +#define ACPI_TYPE_METHOD 0x08 /* Name, ByteConst, multiple Code */ +#define ACPI_TYPE_MUTEX 0x09 +#define ACPI_TYPE_REGION 0x0A +#define ACPI_TYPE_POWER 0x0B /* Name,ByteConst,WordConst,multi Node */ +#define ACPI_TYPE_PROCESSOR 0x0C /* Name,ByteConst,DWordConst,ByteConst,multi NmO */ +#define ACPI_TYPE_THERMAL 0x0D /* Name, multiple Node */ +#define ACPI_TYPE_BUFFER_FIELD 0x0E +#define ACPI_TYPE_DDB_HANDLE 0x0F +#define ACPI_TYPE_DEBUG_OBJECT 0x10 + +#define ACPI_TYPE_MAX 0x10 /* * This section contains object types that do not relate to the ACPI ObjectType operator. @@ -454,36 +460,37 @@ typedef UINT8 ACPI_OBJECT_TYPE8; * Also, values exceeding the largest official ACPI ObjectType must not overlap with * defined AML opcodes. */ -#define INTERNAL_TYPE_BEGIN 17 +#define INTERNAL_TYPE_BEGIN 0x11 -#define INTERNAL_TYPE_REGION_FIELD 17 /* 0x11 */ -#define INTERNAL_TYPE_BANK_FIELD 18 /* 0x12 */ -#define INTERNAL_TYPE_INDEX_FIELD 19 /* 0x13 */ -#define INTERNAL_TYPE_REFERENCE 20 /* 0x14 Arg#, Local#, Name, Debug; used only in descriptors */ -#define INTERNAL_TYPE_ALIAS 21 /* 0x15 */ -#define INTERNAL_TYPE_NOTIFY 22 /* 0x16 */ -#define INTERNAL_TYPE_ADDRESS_HANDLER 23 /* 0x17 */ -#define INTERNAL_TYPE_RESOURCE 24 /* 0x18 */ -#define INTERNAL_TYPE_RESOURCE_FIELD 25 /* 0x19 */ +#define INTERNAL_TYPE_REGION_FIELD 0x11 +#define INTERNAL_TYPE_BANK_FIELD 0x12 +#define INTERNAL_TYPE_INDEX_FIELD 0x13 +#define INTERNAL_TYPE_REFERENCE 0x14 /* Arg#, Local#, Name, Debug; used only in descriptors */ +#define INTERNAL_TYPE_ALIAS 0x15 +#define INTERNAL_TYPE_NOTIFY 0x16 +#define INTERNAL_TYPE_ADDRESS_HANDLER 0x17 +#define INTERNAL_TYPE_RESOURCE 0x18 +#define INTERNAL_TYPE_RESOURCE_FIELD 0x19 -#define INTERNAL_TYPE_NODE_MAX 25 +#define INTERNAL_TYPE_NODE_MAX 0x19 /* These are pseudo-types because there are never any namespace nodes with these types */ -#define INTERNAL_TYPE_FIELD_DEFN 26 /* 0x1A Name, ByteConst, multiple FieldElement */ -#define INTERNAL_TYPE_BANK_FIELD_DEFN 27 /* 0x1B 2 Name,DWordConst,ByteConst,multi FieldElement */ -#define INTERNAL_TYPE_INDEX_FIELD_DEFN 28 /* 0x1C 2 Name, ByteConst, multiple FieldElement */ -#define INTERNAL_TYPE_IF 29 /* 0x1D */ -#define INTERNAL_TYPE_ELSE 30 /* 0x1E */ -#define INTERNAL_TYPE_WHILE 31 /* 0x1F */ -#define INTERNAL_TYPE_SCOPE 32 /* 0x20 Name, multiple Node */ -#define INTERNAL_TYPE_DEF_ANY 33 /* 0x21 type is Any, suppress search of enclosing scopes */ -#define INTERNAL_TYPE_EXTRA 34 /* 0x22 */ +#define INTERNAL_TYPE_FIELD_DEFN 0x1A /* Name, ByteConst, multiple FieldElement */ +#define INTERNAL_TYPE_BANK_FIELD_DEFN 0x1B /* 2 Name,DWordConst,ByteConst,multi FieldElement */ +#define INTERNAL_TYPE_INDEX_FIELD_DEFN 0x1C /* 2 Name, ByteConst, multiple FieldElement */ +#define INTERNAL_TYPE_IF 0x1D +#define INTERNAL_TYPE_ELSE 0x1E +#define INTERNAL_TYPE_WHILE 0x1F +#define INTERNAL_TYPE_SCOPE 0x20 /* Name, multiple Node */ +#define INTERNAL_TYPE_DEF_ANY 0x21 /* type is Any, suppress search of enclosing scopes */ +#define INTERNAL_TYPE_EXTRA 0x22 +#define INTERNAL_TYPE_DATA 0x23 -#define INTERNAL_TYPE_MAX 34 +#define INTERNAL_TYPE_MAX 0x23 -#define INTERNAL_TYPE_INVALID 35 +#define INTERNAL_TYPE_INVALID 0x24 #define ACPI_TYPE_NOT_FOUND 0xFF @@ -519,6 +526,12 @@ typedef UINT8 ACPI_OBJECT_TYPE8; #define ACPI_BTYPE_OBJECTS_AND_REFS 0x0001FFFF /* ARG or LOCAL */ #define ACPI_BTYPE_ALL_OBJECTS 0x0000FFFF +/* + * All I/O + */ +#define ACPI_READ 0 +#define ACPI_WRITE 1 + /* * AcpiEvent Types: @@ -560,7 +573,7 @@ typedef UINT32 ACPI_EVENT_TYPE; * GPEs */ #define ACPI_EVENT_ENABLE 0x1 -#define ACPI_EVENT_WAKE_ENABLE 0x2 +#define ACPI_EVENT_WAKE_ENABLE 0x2 #define ACPI_EVENT_DISABLE 0x1 #define ACPI_EVENT_WAKE_DISABLE 0x2 @@ -760,18 +773,21 @@ void (*ACPI_NOTIFY_HANDLER) ( UINT32 Value, void *Context); +typedef +void (*ACPI_OBJECT_HANDLER) ( + ACPI_HANDLE Object, + UINT32 Function, + void *Data); -/* Address Spaces (Operation Regions */ -#define ACPI_READ_ADR_SPACE 1 -#define ACPI_WRITE_ADR_SPACE 2 +/* Address Spaces (Operation Regions */ typedef ACPI_STATUS (*ACPI_ADR_SPACE_HANDLER) ( UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 BitWidth, - UINT32 *Value, + ACPI_INTEGER *Value, void *HandlerContext, void *RegionContext); diff --git a/sys/contrib/dev/acpica/acutils.h b/sys/contrib/dev/acpica/acutils.h index e583185517c5..f52637618d10 100644 --- a/sys/contrib/dev/acpica/acutils.h +++ b/sys/contrib/dev/acpica/acutils.h @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acutils.h -- prototypes for the common (subsystem-wide) procedures - * $Revision: 117 $ + * $Revision: 119 $ * *****************************************************************************/ @@ -474,6 +474,7 @@ AcpiUtDeleteInternalObjectList ( /* Method name strings */ #define METHOD_NAME__HID "_HID" +#define METHOD_NAME__CID "_CID" #define METHOD_NAME__UID "_UID" #define METHOD_NAME__ADR "_ADR" #define METHOD_NAME__STA "_STA" @@ -495,6 +496,11 @@ AcpiUtExecute_HID ( ACPI_DEVICE_ID *Hid); ACPI_STATUS +AcpiUtExecute_CID ( + ACPI_NAMESPACE_NODE *DeviceNode, + ACPI_DEVICE_ID *Cid); + +ACPI_STATUS AcpiUtExecute_STA ( ACPI_NAMESPACE_NODE *DeviceNode, UINT32 *StatusFlags); @@ -613,6 +619,10 @@ ACPI_GENERIC_STATE * AcpiUtCreateGenericState ( void); +ACPI_THREAD_STATE * +AcpiUtCreateThreadState ( + void); + ACPI_GENERIC_STATE * AcpiUtCreateUpdateState ( ACPI_OPERAND_OBJECT *Object, diff --git a/sys/contrib/dev/acpica/amlcode.h b/sys/contrib/dev/acpica/amlcode.h index 763f160fe80f..effe2caa8964 100644 --- a/sys/contrib/dev/acpica/amlcode.h +++ b/sys/contrib/dev/acpica/amlcode.h @@ -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: 58 $ + * $Revision: 62 $ * *****************************************************************************/ @@ -358,8 +358,8 @@ #define OPGRP_BYTELIST 0x04 -/* - * Opcode information +/* + * Opcode information */ /* Opcode flags */ @@ -433,8 +433,8 @@ #define AML_TYPE_BOGUS 0x19 -/* - * Opcode classes +/* + * Opcode classes */ #define AML_CLASS_EXECUTE 0x00 #define AML_CLASS_CREATE 0x01 @@ -481,52 +481,76 @@ typedef enum #define MAX_MATCH_OPERATOR 5 -/* Field Access Types */ +/* + * FieldFlags + * + * This byte is extracted from the AML and includes three separate + * pieces of information about the field: + * 1) The field access type + * 2) The field update rule + * 3) The lock rule for the field + * + * Bits 00 - 03 : AccessType (AnyAcc, ByteAcc, etc.) + * 04 : LockRule (1 == Lock) + * 05 - 06 : UpdateRule + */ +#define AML_FIELD_ACCESS_TYPE_MASK 0x0F +#define AML_FIELD_LOCK_RULE_MASK 0x10 +#define AML_FIELD_UPDATE_RULE_MASK 0x60 + -#define ACCESS_TYPE_MASK 0x0f -#define ACCESS_TYPE_SHIFT 0 +/* 1) Field Access Types */ typedef enum { - ACCESS_ANY_ACC = 0, - ACCESS_BYTE_ACC = 1, - ACCESS_WORD_ACC = 2, - ACCESS_DWORD_ACC = 3, - ACCESS_QWORD_ACC = 4, /* ACPI 2.0 */ - ACCESS_BLOCK_ACC = 4, - ACCESS_SMBSEND_RECV_ACC = 5, - ACCESS_SMBQUICK_ACC = 6 + AML_FIELD_ACCESS_ANY = 0x00, + AML_FIELD_ACCESS_BYTE = 0x01, + AML_FIELD_ACCESS_WORD = 0x02, + AML_FIELD_ACCESS_DWORD = 0x03, + AML_FIELD_ACCESS_QWORD = 0x04, /* ACPI 2.0 */ + AML_FIELD_ACCESS_BUFFER = 0x05, /* ACPI 2.0 */ } AML_ACCESS_TYPE; -/* Field Lock Rules */ - -#define LOCK_RULE_MASK 0x10 -#define LOCK_RULE_SHIFT 4 +/* 2) Field Lock Rules */ typedef enum { - GLOCK_NEVER_LOCK = 0, - GLOCK_ALWAYS_LOCK = 1 + AML_FIELD_LOCK_NEVER = 0x00, + AML_FIELD_LOCK_ALWAYS = 0x10, } AML_LOCK_RULE; -/* Field Update Rules */ - -#define UPDATE_RULE_MASK 0x060 -#define UPDATE_RULE_SHIFT 5 +/* 3) Field Update Rules */ typedef enum { - UPDATE_PRESERVE = 0, - UPDATE_WRITE_AS_ONES = 1, - UPDATE_WRITE_AS_ZEROS = 2 + AML_FIELD_UPDATE_PRESERVE = 0x00, + AML_FIELD_UPDATE_WRITE_AS_ONES = 0x20, + AML_FIELD_UPDATE_WRITE_AS_ZEROS = 0x40, } AML_UPDATE_RULE; +/* + * Field Access Attributes. + * This byte is extracted from the AML via the + * AccessAs keyword + */ +typedef enum +{ + AML_FIELD_ATTRIB_SMB_QUICK = 0x02, + AML_FIELD_ATTRIB_SMB_SEND_RCV = 0x04, + AML_FIELD_ATTRIB_SMB_BYTE = 0x06, + AML_FIELD_ATTRIB_SMB_WORD = 0x08, + AML_FIELD_ATTRIB_SMB_BLOCK = 0x0A, + AML_FIELD_ATTRIB_SMB_CALL = 0x0E, + +} AML_ACCESS_ATTRIBUTE; + + /* bit fields in MethodFlags byte */ #define METHOD_FLAGS_ARG_COUNT 0x07 @@ -536,15 +560,11 @@ typedef enum /* Array sizes. Used for range checking also */ -#define NUM_REGION_TYPES 7 -#define NUM_ACCESS_TYPES 7 +#define NUM_ACCESS_TYPES 6 #define NUM_UPDATE_RULES 3 #define NUM_MATCH_OPS 7 #define NUM_OPCODES 256 #define NUM_FIELD_NAMES 2 -#define USER_REGION_BEGIN 0x80 - - #endif /* __AMLCODE_H__ */ diff --git a/sys/contrib/dev/acpica/dbcmds.c b/sys/contrib/dev/acpica/dbcmds.c index 1ba6a4dfb8d7..89002d76ca2c 100644 --- a/sys/contrib/dev/acpica/dbcmds.c +++ b/sys/contrib/dev/acpica/dbcmds.c @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: dbcmds - debug commands and output routines - * $Revision: 66 $ + * $Revision: 67 $ * ******************************************************************************/ @@ -193,7 +193,7 @@ AcpiDbWalkForReferences ( /* Check for match against the object attached to the node */ - if (Node->Object == ObjDesc) + if (AcpiNsGetAttachedObject (Node) == ObjDesc) { AcpiOsPrintf ("Reference at Node->Object %p [%4.4s]\n", Node, &Node->Name); } @@ -769,7 +769,7 @@ AcpiDbWalkForSpecificObjects ( NATIVE_CHAR Buffer[64]; - ObjDesc = ((ACPI_NAMESPACE_NODE *)ObjHandle)->Object; + ObjDesc = AcpiNsGetAttachedObject ((ACPI_NAMESPACE_NODE *) ObjHandle); BufSize = sizeof (Buffer) / sizeof (*Buffer); /* Get and display the full pathname to this object */ diff --git a/sys/contrib/dev/acpica/dbdisasm.c b/sys/contrib/dev/acpica/dbdisasm.c index 2ada95da03d6..dc24edcad7bd 100644 --- a/sys/contrib/dev/acpica/dbdisasm.c +++ b/sys/contrib/dev/acpica/dbdisasm.c @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: dbdisasm - parser op tree display routines - * $Revision: 50 $ + * $Revision: 53 $ * ******************************************************************************/ @@ -208,7 +208,6 @@ AcpiPsDisplayObjectPathname ( */ AcpiOsPrintf (" **** Path not found in parse tree"); } - else { /* The target was found, print the name and complete path */ @@ -316,139 +315,135 @@ AcpiDbDisplayOp ( UINT32 j; - if (Op) + if (!Op) + { + AcpiDbDisplayOpcode (WalkState, Op); + return; + } + + + while (Op) { - while (Op) + /* Indentation */ + + DepthCount = 0; + if (!AcpiGbl_DbOpt_verbose) { - /* indentation */ + DepthCount++; + } + + /* Determine the nesting depth of this argument */ - DepthCount = 0; - if (!AcpiGbl_DbOpt_verbose) + for (depth = Op->Parent; depth; depth = depth->Parent) + { + arg = AcpiPsGetArg (depth, 0); + while (arg && arg != Origin) { - DepthCount++; + arg = arg->Next; } - /* Determine the nesting depth of this argument */ - - for (depth = Op->Parent; depth; depth = depth->Parent) + if (arg) { - arg = AcpiPsGetArg (depth, 0); - while (arg && arg != Origin) - { - arg = arg->Next; - } + break; + } - if (arg) - { - break; - } + DepthCount++; + } + + /* Open a new block if we are nested further than last time */ - DepthCount++; + if (DepthCount > LastDepth) + { + VERBOSE_PRINT ((DB_NO_OP_INFO, LastDepth)); + for (i = 0; i < LastDepth; i++) + { + AcpiOsPrintf ("%s", AcpiGbl_DbDisasmIndent); } + if (AcpiDbBlockType (Op) == BLOCK_PAREN) + { + AcpiOsPrintf ("(\n"); + } + else + { + AcpiOsPrintf ("{\n"); + } + } - /* Open a new block if we are nested further than last time */ + /* Close a block if we are nested less than last time */ - if (DepthCount > LastDepth) + else if (DepthCount < LastDepth) + { + for (j = 0; j < (LastDepth - DepthCount); j++) { - VERBOSE_PRINT ((DB_NO_OP_INFO, LastDepth)); - for (i = 0; i < LastDepth; i++) + VERBOSE_PRINT ((DB_NO_OP_INFO, LastDepth - j)); + for (i = 0; i < (LastDepth - j - 1); i++) { AcpiOsPrintf ("%s", AcpiGbl_DbDisasmIndent); } if (AcpiDbBlockType (Op) == BLOCK_PAREN) { - AcpiOsPrintf ("(\n"); + AcpiOsPrintf (")\n"); } else { - AcpiOsPrintf ("{\n"); + AcpiOsPrintf ("}\n"); } } + } - /* Close a block if we are nested less than last time */ - - else if (DepthCount < LastDepth) - { - for (j = 0; j < (LastDepth - DepthCount); j++) - { - VERBOSE_PRINT ((DB_NO_OP_INFO, LastDepth - j)); - for (i = 0; i < (LastDepth - j - 1); i++) - { - AcpiOsPrintf ("%s", AcpiGbl_DbDisasmIndent); - } - - if (AcpiDbBlockType (Op) == BLOCK_PAREN) - { - AcpiOsPrintf (")\n"); - } - else - { - AcpiOsPrintf ("}\n"); - } - } - } - - /* In verbose mode, print the AML offset, opcode and depth count */ - - VERBOSE_PRINT ((DB_FULL_OP_INFO, (unsigned) Op->AmlOffset, Op->Opcode, DepthCount)); - + /* In verbose mode, print the AML offset, opcode and depth count */ - /* Indent the output according to the depth count */ + VERBOSE_PRINT ((DB_FULL_OP_INFO, (unsigned) Op->AmlOffset, Op->Opcode, DepthCount)); - for (i = 0; i < DepthCount; i++) - { - AcpiOsPrintf ("%s", AcpiGbl_DbDisasmIndent); - } + /* Indent the output according to the depth count */ - /* Now print the opcode */ + for (i = 0; i < DepthCount; i++) + { + AcpiOsPrintf ("%s", AcpiGbl_DbDisasmIndent); + } - AcpiDbDisplayOpcode (WalkState, Op); + /* Now print the opcode */ - /* Resolve a name reference */ + AcpiDbDisplayOpcode (WalkState, Op); - if ((Op->Opcode == AML_INT_NAMEPATH_OP && Op->Value.Name) && - (Op->Parent) && - (AcpiGbl_DbOpt_verbose)) - { - AcpiPsDisplayObjectPathname (WalkState, Op); - } + /* Resolve a name reference */ - AcpiOsPrintf ("\n"); + if ((Op->Opcode == AML_INT_NAMEPATH_OP && Op->Value.Name) && + (Op->Parent) && + (AcpiGbl_DbOpt_verbose)) + { + AcpiPsDisplayObjectPathname (WalkState, Op); + } - /* Get the next node in the tree */ + AcpiOsPrintf ("\n"); - Op = AcpiPsGetDepthNext (Origin, Op); - LastDepth = DepthCount; + /* Get the next node in the tree */ - NumOpcodes--; - if (!NumOpcodes) - { - Op = NULL; - } - } - - /* Close the last block(s) */ + Op = AcpiPsGetDepthNext (Origin, Op); + LastDepth = DepthCount; - DepthCount = LastDepth -1; - for (i = 0; i < LastDepth; i++) + NumOpcodes--; + if (!NumOpcodes) { - VERBOSE_PRINT ((DB_NO_OP_INFO, LastDepth - i)); - for (j = 0; j < DepthCount; j++) - { - AcpiOsPrintf ("%s", AcpiGbl_DbDisasmIndent); - } - AcpiOsPrintf ("}\n"); - DepthCount--; + Op = NULL; } - } - else + /* Close the last block(s) */ + + DepthCount = LastDepth -1; + for (i = 0; i < LastDepth; i++) { - AcpiDbDisplayOpcode (WalkState, Op); + VERBOSE_PRINT ((DB_NO_OP_INFO, LastDepth - i)); + for (j = 0; j < DepthCount; j++) + { + AcpiOsPrintf ("%s", AcpiGbl_DbDisasmIndent); + } + AcpiOsPrintf ("}\n"); + DepthCount--; } } @@ -557,7 +552,6 @@ AcpiDbDisplayPath ( return; } - if (OpInfo->Flags & AML_CREATE) { /* Field creation - check for a fully qualified namepath */ @@ -630,7 +624,6 @@ AcpiDbDisplayPath ( AcpiOsPrintf ("%4.4s", NamePath->Value.String); } } - else { Name = AcpiPsGetName (Search); @@ -678,24 +671,20 @@ AcpiDbDisplayOpcode ( AcpiOsPrintf ("<NULL OP PTR>"); } - /* op and arguments */ switch (Op->Opcode) { - case AML_BYTE_OP: if (AcpiGbl_DbOpt_verbose) { AcpiOsPrintf ("(UINT8) 0x%2.2X", Op->Value.Integer8); } - else { AcpiOsPrintf ("0x%2.2X", Op->Value.Integer8); } - break; @@ -705,12 +694,10 @@ AcpiDbDisplayOpcode ( { AcpiOsPrintf ("(UINT16) 0x%4.4X", Op->Value.Integer16); } - else { AcpiOsPrintf ("0x%4.4X", Op->Value.Integer16); } - break; @@ -720,12 +707,10 @@ AcpiDbDisplayOpcode ( { AcpiOsPrintf ("(UINT32) 0x%8.8X", Op->Value.Integer32); } - else { AcpiOsPrintf ("0x%8.8X", Op->Value.Integer32); } - break; @@ -736,13 +721,11 @@ AcpiDbDisplayOpcode ( AcpiOsPrintf ("(UINT64) 0x%8.8X%8.8X", Op->Value.Integer64.Hi, Op->Value.Integer64.Lo); } - else { AcpiOsPrintf ("0x%8.8X%8.8X", Op->Value.Integer64.Hi, Op->Value.Integer64.Lo); } - break; @@ -752,12 +735,10 @@ AcpiDbDisplayOpcode ( { AcpiOsPrintf ("\"%s\"", Op->Value.String); } - else { AcpiOsPrintf ("<\"NULL STRING PTR\">"); } - break; @@ -767,12 +748,10 @@ AcpiDbDisplayOpcode ( { AcpiOsPrintf ("\"%s\"", Op->Value.String); } - else { AcpiOsPrintf ("\"<NULL STATIC STRING PTR>\""); } - break; @@ -806,7 +785,6 @@ AcpiDbDisplayOpcode ( { AcpiOsPrintf ("ByteList (Length 0x%8.8X) ", Op->Value.Integer32); } - else { AcpiOsPrintf ("0x%2.2X", Op->Value.Integer32); @@ -819,7 +797,6 @@ AcpiDbDisplayOpcode ( AcpiOsPrintf (", 0x%2.2X", ByteData[i]); } } - break; @@ -839,7 +816,6 @@ AcpiDbDisplayOpcode ( AcpiDbDecodeInternalObject (WalkState->Results->Results.ObjDesc [WalkState->Results->Results.NumResults-1]); } #endif - break; } @@ -862,15 +838,12 @@ AcpiDbDisplayOpcode ( Name = AcpiPsGetName (Op); AcpiOsPrintf (" %4.4s", &Name); - if (AcpiGbl_DbOpt_verbose) + if ((AcpiGbl_DbOpt_verbose) && (Op->Opcode != AML_INT_NAMEDFIELD_OP)) { - AcpiOsPrintf (" (Path \\"); - AcpiDbDisplayPath (Op); - AcpiOsPrintf (")"); + AcpiPsDisplayObjectPathname (WalkState, Op); } } } - #endif /* ENABLE_DEBUGGER */ diff --git a/sys/contrib/dev/acpica/dbdisply.c b/sys/contrib/dev/acpica/dbdisply.c index 01489d83b92b..df43e85c350d 100644 --- a/sys/contrib/dev/acpica/dbdisply.c +++ b/sys/contrib/dev/acpica/dbdisply.c @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: dbdisply - debug display commands - * $Revision: 57 $ + * $Revision: 60 $ * ******************************************************************************/ @@ -168,7 +168,6 @@ AcpiDbGetPointer ( /* Simple flat pointer */ ObjPtr = (void *) STRTOUL (Target, NULL, 16); - #endif return (ObjPtr); @@ -228,6 +227,7 @@ AcpiDbDecodeAndDisplayObject ( { void *ObjPtr; ACPI_NAMESPACE_NODE *Node; + ACPI_OPERAND_OBJECT *ObjDesc; UINT32 Display = DB_BYTE_DISPLAY; NATIVE_CHAR Buffer[80]; ACPI_BUFFER RetBuf; @@ -259,7 +259,6 @@ AcpiDbDecodeAndDisplayObject ( } } - RetBuf.Length = sizeof (Buffer); RetBuf.Pointer = Buffer; @@ -314,7 +313,6 @@ AcpiDbDecodeAndDisplayObject ( return; } - AcpiUtDumpBuffer (ObjPtr, sizeof (ACPI_PARSE_OBJECT), Display, ACPI_UINT32_MAX); AcpiDbDumpParserDescriptor ((ACPI_PARSE_OBJECT *) ObjPtr); } @@ -368,17 +366,18 @@ DumpNte: AcpiUtDumpBuffer ((void *) Node, sizeof (ACPI_NAMESPACE_NODE), Display, ACPI_UINT32_MAX); AcpiExDumpNode (Node, 1); - if (Node->Object) + ObjDesc = AcpiNsGetAttachedObject (Node); + if (ObjDesc) { - AcpiOsPrintf ("\nAttached Object (%p):\n", Node->Object); - if (!AcpiOsReadable (Node->Object, sizeof (ACPI_OPERAND_OBJECT))) + AcpiOsPrintf ("\nAttached Object (%p):\n", ObjDesc); + if (!AcpiOsReadable (ObjDesc, sizeof (ACPI_OPERAND_OBJECT))) { - AcpiOsPrintf ("Invalid internal ACPI Object at address %p\n", Node->Object); + AcpiOsPrintf ("Invalid internal ACPI Object at address %p\n", ObjDesc); return; } - AcpiUtDumpBuffer ((void *) Node->Object, sizeof (ACPI_OPERAND_OBJECT), Display, ACPI_UINT32_MAX); - AcpiExDumpObjectDescriptor (Node->Object, 1); + AcpiUtDumpBuffer ((void *) ObjDesc, sizeof (ACPI_OPERAND_OBJECT), Display, ACPI_UINT32_MAX); + AcpiExDumpObjectDescriptor (ObjDesc, 1); } } @@ -475,7 +474,6 @@ AcpiDbDisplayInternalObject ( return; } - /* Decode the object type */ else if (VALID_DESCRIPTOR_TYPE (ObjDesc, ACPI_DESC_TYPE_PARSER)) @@ -488,6 +486,7 @@ AcpiDbDisplayInternalObject ( AcpiOsPrintf ("<Node> Name %4.4s Type-%s", &((ACPI_NAMESPACE_NODE *)ObjDesc)->Name, AcpiUtGetTypeName (((ACPI_NAMESPACE_NODE *) ObjDesc)->Type)); + if (((ACPI_NAMESPACE_NODE *) ObjDesc)->Flags & ANOBJ_METHOD_ARG) { AcpiOsPrintf (" [Method Arg]"); @@ -623,9 +622,9 @@ AcpiDbDisplayMethodInfo ( } ObjDesc = WalkState->MethodDesc; - Node = WalkState->MethodNode; + Node = WalkState->MethodNode; - NumArgs = ObjDesc->Method.ParamCount; + NumArgs = ObjDesc->Method.ParamCount; Concurrency = ObjDesc->Method.Concurrency; AcpiOsPrintf ("Currently executing control method is [%4.4s]\n", &Node->Name); @@ -682,7 +681,6 @@ AcpiDbDisplayMethodInfo ( break; } - Op = AcpiPsGetDepthNext (StartOp, Op); } @@ -724,8 +722,6 @@ AcpiDbDisplayLocals (void) ObjDesc = WalkState->MethodDesc; Node = WalkState->MethodNode; - - AcpiOsPrintf ("Local Variables for method [%4.4s]:\n", &Node->Name); for (i = 0; i < MTH_NUM_LOCALS; i++) @@ -768,12 +764,13 @@ AcpiDbDisplayArguments (void) } ObjDesc = WalkState->MethodDesc; - Node = WalkState->MethodNode; + Node = WalkState->MethodNode; - NumArgs = ObjDesc->Method.ParamCount; + NumArgs = ObjDesc->Method.ParamCount; Concurrency = ObjDesc->Method.Concurrency; - AcpiOsPrintf ("Method [%4.4s] has %X arguments, max concurrency = %X\n", &Node->Name, NumArgs, Concurrency); + AcpiOsPrintf ("Method [%4.4s] has %X arguments, max concurrency = %X\n", + &Node->Name, NumArgs, Concurrency); for (i = 0; i < NumArgs; i++) { @@ -821,7 +818,8 @@ AcpiDbDisplayResults (void) NumResults = WalkState->Results->Results.NumResults; } - AcpiOsPrintf ("Method [%4.4s] has %X stacked result objects\n", &Node->Name, NumResults); + AcpiOsPrintf ("Method [%4.4s] has %X stacked result objects\n", + &Node->Name, NumResults); for (i = 0; i < NumResults; i++) { @@ -860,7 +858,6 @@ AcpiDbDisplayCallingTree (void) } Node = WalkState->MethodNode; - AcpiOsPrintf ("Current Control Method Call Tree\n"); for (i = 0; WalkState; i++) @@ -927,7 +924,6 @@ AcpiDbDisplayArgumentObject ( ACPI_WALK_STATE *WalkState) { - if (!AcpiGbl_CmSingleStep) { return; diff --git a/sys/contrib/dev/acpica/dbfileio.c b/sys/contrib/dev/acpica/dbfileio.c index cfc366f698b7..1ab4dbfdf9ad 100644 --- a/sys/contrib/dev/acpica/dbfileio.c +++ b/sys/contrib/dev/acpica/dbfileio.c @@ -2,7 +2,7 @@ * * Module Name: dbfileio - Debugger file I/O commands. These can't usually * be used when running the debugger in Ring 0 (Kernel mode) - * $Revision: 53 $ + * $Revision: 54 $ * ******************************************************************************/ @@ -463,7 +463,7 @@ AcpiDbLoadAcpiTable ( Status = AeLocalLoadTable (AcpiGbl_DbTablePtr); if (ACPI_FAILURE (Status)) { - if (Status == AE_EXIST) + if (Status == AE_ALREADY_EXISTS) { AcpiOsPrintf ("Table %4.4s is already installed\n", &AcpiGbl_DbTablePtr->Signature); diff --git a/sys/contrib/dev/acpica/dbstats.c b/sys/contrib/dev/acpica/dbstats.c index 8a60c11d9d56..566e57d0ac98 100644 --- a/sys/contrib/dev/acpica/dbstats.c +++ b/sys/contrib/dev/acpica/dbstats.c @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: dbstats - Generation and display of ACPI table statistics - * $Revision: 47 $ + * $Revision: 49 $ * ******************************************************************************/ @@ -169,6 +169,7 @@ void AcpiDbEnumerateObject ( ACPI_OPERAND_OBJECT *ObjDesc) { + ACPI_OPERAND_OBJECT *ObjDesc2; UINT32 Type; UINT32 i; @@ -210,7 +211,16 @@ AcpiDbEnumerateObject ( AcpiDbEnumerateObject (ObjDesc->Device.AddrHandler); break; + case ACPI_TYPE_BUFFER_FIELD: + ObjDesc2 = AcpiNsGetSecondaryObject (ObjDesc); + if (ObjDesc2) + { + AcpiGbl_ObjTypeCount [INTERNAL_TYPE_EXTRA]++; + } + break; + case ACPI_TYPE_REGION: + AcpiGbl_ObjTypeCount [INTERNAL_TYPE_EXTRA]++; AcpiDbEnumerateObject (ObjDesc->Region.AddrHandler); break; @@ -264,7 +274,7 @@ AcpiDbClassifyOneObject ( AcpiGbl_NumNodes++; Node = (ACPI_NAMESPACE_NODE *) ObjHandle; - ObjDesc = ((ACPI_NAMESPACE_NODE *) ObjHandle)->Object; + ObjDesc = AcpiNsGetAttachedObject (Node); AcpiDbEnumerateObject (ObjDesc); @@ -517,6 +527,7 @@ AcpiDbDisplayStatistics ( AcpiOsPrintf ("NotifyHandler %3d\n", sizeof (ACPI_OBJECT_NOTIFY_HANDLER)); AcpiOsPrintf ("AddrHandler %3d\n", sizeof (ACPI_OBJECT_ADDR_HANDLER)); AcpiOsPrintf ("Extra %3d\n", sizeof (ACPI_OBJECT_EXTRA)); + AcpiOsPrintf ("Data %3d\n", sizeof (ACPI_OBJECT_DATA)); AcpiOsPrintf ("\n"); diff --git a/sys/contrib/dev/acpica/dbxface.c b/sys/contrib/dev/acpica/dbxface.c index 5dbd8dcdccd6..1833c97f66db 100644 --- a/sys/contrib/dev/acpica/dbxface.c +++ b/sys/contrib/dev/acpica/dbxface.c @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: dbxface - AML Debugger external interfaces - * $Revision: 45 $ + * $Revision: 46 $ * ******************************************************************************/ @@ -434,5 +434,4 @@ AcpiDbTerminate (void) } - #endif /* ENABLE_DEBUGGER */ diff --git a/sys/contrib/dev/acpica/dsfield.c b/sys/contrib/dev/acpica/dsfield.c index b0955e185711..e58f1be7768f 100644 --- a/sys/contrib/dev/acpica/dsfield.c +++ b/sys/contrib/dev/acpica/dsfield.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: dsfield - Dispatcher field routines - * $Revision: 46 $ + * $Revision: 56 $ * *****************************************************************************/ @@ -127,7 +127,6 @@ #define _COMPONENT ACPI_DISPATCHER MODULE_NAME ("dsfield") - /******************************************************************************* * @@ -139,10 +138,10 @@ * * RETURN: Status * - * DESCRIPTION: Execute the CreateField operators: + * DESCRIPTION: Execute the CreateField operators: * CreateBitFieldOp, - * CreateByteFieldOp, - * CreateWordFieldOp, + * CreateByteFieldOp, + * CreateWordFieldOp, * CreateDWordFieldOp, * CreateQWordFieldOp, * CreateFieldOp (all of which define fields in buffers) @@ -158,6 +157,8 @@ AcpiDsCreateBufferField ( ACPI_NAMESPACE_NODE *Node; ACPI_STATUS Status; ACPI_OPERAND_OBJECT *ObjDesc; + ACPI_OPERAND_OBJECT *SecondDesc = NULL; + UINT32 Flags; FUNCTION_TRACE ("DsCreateBufferField"); @@ -182,11 +183,25 @@ AcpiDsCreateBufferField ( } /* + * During the load phase, we want to enter the name of the field into + * the namespace. During the execute phase (when we evaluate the size + * operand), we want to lookup the name + */ + if (WalkState->ParseFlags & ACPI_PARSE_EXECUTE) + { + Flags = NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE; + } + else + { + Flags = NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE | NS_ERROR_IF_FOUND; + } + + /* * Enter the NameString into the namespace */ Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Value.String, INTERNAL_TYPE_DEF_ANY, IMODE_LOAD_PASS1, - NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE, + Flags, WalkState, &(Node)); if (ACPI_FAILURE (Status)) { @@ -204,7 +219,8 @@ AcpiDsCreateBufferField ( * we need to create the field object. Otherwise, this was a lookup of an * existing node and we don't want to create the field object again. */ - if (Node->Object) + ObjDesc = AcpiNsGetAttachedObject (Node); + if (ObjDesc) { return_ACPI_STATUS (AE_OK); } @@ -224,28 +240,22 @@ AcpiDsCreateBufferField ( } /* - * Allocate a method object for this field unit - */ - ObjDesc->BufferField.Extra = AcpiUtCreateInternalObject ( - INTERNAL_TYPE_EXTRA); - if (!ObjDesc->BufferField.Extra) - { - Status = AE_NO_MEMORY; - goto Cleanup; - } - - /* * Remember location in AML stream of the field unit * opcode and operands -- since the buffer and index * operands must be evaluated. */ - ObjDesc->BufferField.Extra->Extra.AmlStart = ((ACPI_PARSE2_OBJECT *) Op)->Data; - ObjDesc->BufferField.Extra->Extra.AmlLength = ((ACPI_PARSE2_OBJECT *) Op)->Length; - ObjDesc->BufferField.Node = Node; + SecondDesc = ObjDesc->Common.NextObject; + SecondDesc->Extra.AmlStart = ((ACPI_PARSE2_OBJECT *) Op)->Data; + SecondDesc->Extra.AmlLength = ((ACPI_PARSE2_OBJECT *) Op)->Length; + ObjDesc->BufferField.Node = Node; - /* Attach constructed field descriptor to parent node */ + /* Attach constructed field descriptors to parent node */ Status = AcpiNsAttachObject (Node, ObjDesc, ACPI_TYPE_BUFFER_FIELD); + if (ACPI_FAILURE (Status)) + { + goto Cleanup; + } Cleanup: @@ -257,7 +267,6 @@ Cleanup: } - /******************************************************************************* * * FUNCTION: AcpiDsGetFieldNames @@ -310,36 +319,48 @@ AcpiDsGetFieldNames ( case AML_INT_ACCESSFIELD_OP: /* - * Get a new AccessType and AccessAttribute for all - * entries (until end or another AccessAs keyword) + * Get a new AccessType and AccessAttribute -- to be used for all + * field units that follow, until field end or another AccessAs keyword. + * + * In FieldFlags, preserve the flag bits other than the ACCESS_TYPE bits */ - Info->FieldFlags = (UINT8) ((Info->FieldFlags & FIELD_ACCESS_TYPE_MASK) || - ((UINT8) (Arg->Value.Integer >> 8))); + Info->FieldFlags = (UINT8) ((Info->FieldFlags & ~(AML_FIELD_ACCESS_TYPE_MASK)) | + ((UINT8) (Arg->Value.Integer32 >> 8))); + + Info->Attribute = (UINT8) (Arg->Value.Integer32); break; case AML_INT_NAMEDFIELD_OP: - /* Enter a new field name into the namespace */ + /* Lookup the name */ Status = AcpiNsLookup (WalkState->ScopeInfo, (NATIVE_CHAR *) &((ACPI_PARSE2_OBJECT *)Arg)->Name, - Info->FieldType, IMODE_LOAD_PASS1, - NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE, + Info->FieldType, IMODE_EXECUTE, NS_DONT_OPEN_SCOPE, NULL, &Info->FieldNode); if (ACPI_FAILURE (Status)) { - return_ACPI_STATUS (Status); - } + if (Status != AE_ALREADY_EXISTS) + { + return_ACPI_STATUS (Status); + } - /* Create and initialize an object for the new Field Node */ + REPORT_ERROR (("Field name [%4.4s] already exists in current scope\n", + &((ACPI_PARSE2_OBJECT *)Arg)->Name)); + } + else + { + Arg->Node = Info->FieldNode; + Info->FieldBitLength = Arg->Value.Size; - Info->FieldBitLength = Arg->Value.Size; + /* Create and initialize an object for the new Field Node */ - Status = AcpiExPrepFieldValue (Info); - if (ACPI_FAILURE (Status)) - { - return_ACPI_STATUS (Status); + Status = AcpiExPrepFieldValue (Info); + if (ACPI_FAILURE (Status)) + { + return_ACPI_STATUS (Status); + } } /* Keep track of bit position for the next field */ @@ -409,6 +430,7 @@ AcpiDsCreateField ( Arg = Arg->Next; Info.FieldFlags = Arg->Value.Integer8; + Info.Attribute = 0; /* Each remaining arg is a Named Field */ @@ -423,6 +445,90 @@ AcpiDsCreateField ( /******************************************************************************* * + * FUNCTION: AcpiDsInitFieldObjects + * + * PARAMETERS: Op - Op containing the Field definition and args + * ` WalkState - Current method state + * + * RETURN: Status + * + * DESCRIPTION: For each "Field Unit" name in the argument list that is + * part of the field declaration, enter the name into the + * namespace. + * + ******************************************************************************/ + +ACPI_STATUS +AcpiDsInitFieldObjects ( + ACPI_PARSE_OBJECT *Op, + ACPI_WALK_STATE *WalkState) +{ + ACPI_STATUS Status = AE_AML_ERROR; + ACPI_PARSE_OBJECT *Arg = NULL; + ACPI_NAMESPACE_NODE *Node; + UINT8 Type = 0; + + + FUNCTION_TRACE_PTR ("DsInitFieldObjects", Op); + + + switch (WalkState->Opcode) + { + case AML_FIELD_OP: + Arg = AcpiPsGetArg (Op, 2); + Type = INTERNAL_TYPE_REGION_FIELD; + break; + + case AML_BANK_FIELD_OP: + Arg = AcpiPsGetArg (Op, 4); + Type = INTERNAL_TYPE_BANK_FIELD; + break; + + case AML_INDEX_FIELD_OP: + Arg = AcpiPsGetArg (Op, 3); + Type = INTERNAL_TYPE_INDEX_FIELD; + break; + } + + /* + * Walk the list of entries in the FieldList + */ + while (Arg) + { + /* Ignore OFFSET and ACCESSAS terms here */ + + if (Arg->Opcode == AML_INT_NAMEDFIELD_OP) + { + Status = AcpiNsLookup (WalkState->ScopeInfo, + (NATIVE_CHAR *) &((ACPI_PARSE2_OBJECT *)Arg)->Name, + Type, IMODE_LOAD_PASS1, + NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE | NS_ERROR_IF_FOUND, + NULL, &Node); + if (ACPI_FAILURE (Status)) + { + if (Status != AE_ALREADY_EXISTS) + { + return_ACPI_STATUS (Status); + } + + REPORT_ERROR (("Field name [%4.4s] already exists in current scope\n", + &((ACPI_PARSE2_OBJECT *)Arg)->Name)); + } + + Arg->Node = Node; + } + + /* Move on to next field in the list */ + + Arg = Arg->Next; + } + + return_ACPI_STATUS (Status); +} + + +/******************************************************************************* + * * FUNCTION: AcpiDsCreateBankField * * PARAMETERS: Op - Op containing the Field definition and args diff --git a/sys/contrib/dev/acpica/dsmethod.c b/sys/contrib/dev/acpica/dsmethod.c index decc39346707..147a4ee2e8df 100644 --- a/sys/contrib/dev/acpica/dsmethod.c +++ b/sys/contrib/dev/acpica/dsmethod.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: dsmethod - Parser/Interpreter interface - control method parsing - * $Revision: 69 $ + * $Revision: 73 $ * *****************************************************************************/ @@ -177,7 +177,7 @@ AcpiDsParseMethod ( /* Extract the method object from the method Node */ Node = (ACPI_NAMESPACE_NODE *) ObjHandle; - ObjDesc = Node->Object; + ObjDesc = AcpiNsGetAttachedObject (Node); if (!ObjDesc) { return_ACPI_STATUS (AE_NULL_OBJECT); @@ -221,11 +221,11 @@ AcpiDsParseMethod ( return_ACPI_STATUS (AE_NO_MEMORY); } - Status = AcpiDsInitAmlWalk (WalkState, Op, Node, ObjDesc->Method.AmlStart, + Status = AcpiDsInitAmlWalk (WalkState, Op, Node, ObjDesc->Method.AmlStart, ObjDesc->Method.AmlLength, NULL, NULL, 1); if (ACPI_FAILURE (Status)) { - /* TBD: delete walk state */ + AcpiDsDeleteWalkState (WalkState); return_ACPI_STATUS (Status); } @@ -351,7 +351,7 @@ AcpiDsBeginMethodExecution ( ACPI_STATUS AcpiDsCallControlMethod ( - ACPI_WALK_LIST *WalkList, + ACPI_THREAD_STATE *Thread, ACPI_WALK_STATE *ThisWalkState, ACPI_PARSE_OBJECT *Op) /* TBD: This operand is obsolete */ { @@ -411,12 +411,12 @@ AcpiDsCallControlMethod ( goto Cleanup; } - Status = AcpiDsInitAmlWalk (NextWalkState, Op, MethodNode, - ObjDesc->Method.AmlStart, ObjDesc->Method.AmlLength, + Status = AcpiDsInitAmlWalk (NextWalkState, Op, MethodNode, + ObjDesc->Method.AmlStart, ObjDesc->Method.AmlLength, NULL, NULL, 1); if (ACPI_FAILURE (Status)) { - /* TBD: delete walk state */ + AcpiDsDeleteWalkState (NextWalkState); goto Cleanup; } @@ -429,7 +429,7 @@ AcpiDsCallControlMethod ( /* 2) Execute: Create a new state for the preempting walk */ NextWalkState = AcpiDsCreateWalkState (ObjDesc->Method.OwningId, - NULL, ObjDesc, WalkList); + NULL, ObjDesc, Thread); if (!NextWalkState) { Status = AE_NO_MEMORY; @@ -440,12 +440,12 @@ AcpiDsCallControlMethod ( * The resolved arguments were put on the previous walk state's operand * stack. Operands on the previous walk state stack always * start at index 0. - * Null terminate the list of arguments + * Null terminate the list of arguments */ ThisWalkState->Operands [ThisWalkState->NumOperands] = NULL; - Status = AcpiDsInitAmlWalk (NextWalkState, NULL, MethodNode, - ObjDesc->Method.AmlStart, ObjDesc->Method.AmlLength, + Status = AcpiDsInitAmlWalk (NextWalkState, NULL, MethodNode, + ObjDesc->Method.AmlStart, ObjDesc->Method.AmlLength, &ThisWalkState->Operands[0], NULL, 3); if (ACPI_FAILURE (Status)) { diff --git a/sys/contrib/dev/acpica/dsmthdat.c b/sys/contrib/dev/acpica/dsmthdat.c index e44829def13d..e597976ff12a 100644 --- a/sys/contrib/dev/acpica/dsmthdat.c +++ b/sys/contrib/dev/acpica/dsmthdat.c @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: dsmthdat - control method arguments and local variables - * $Revision: 49 $ + * $Revision: 53 $ * ******************************************************************************/ @@ -141,6 +141,12 @@ * This allows RefOf and DeRefOf to work properly for these * special data types. * + * NOTES: WalkState fields are initialized to zero by the + * ACPI_MEM_CALLOCATE(). + * + * A pseudo-Namespace Node is assigned to each argument and local + * so that RefOf() can return a pointer to the Node. + * ******************************************************************************/ ACPI_STATUS @@ -152,13 +158,6 @@ AcpiDsMethodDataInit ( FUNCTION_TRACE ("DsMethodDataInit"); - /* - * WalkState fields are initialized to zero by the - * ACPI_MEM_CALLOCATE(). - * - * An Node is assigned to each argument and local so - * that RefOf() can return a pointer to the Node. - */ /* Init the method arguments */ @@ -207,52 +206,38 @@ AcpiDsMethodDataDeleteAll ( ACPI_WALK_STATE *WalkState) { UINT32 Index; - ACPI_OPERAND_OBJECT *Object; FUNCTION_TRACE ("DsMethodDataDeleteAll"); - /* Delete the locals */ - - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Deleting local variables in %p\n", WalkState)); + /* Detach the locals */ for (Index = 0; Index < MTH_NUM_LOCALS; Index++) { - Object = WalkState->LocalVariables[Index].Object; - if (Object) + if (WalkState->LocalVariables[Index].Object) { - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Deleting Local%d=%p\n", Index, Object)); - - /* Remove first */ + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Deleting Local%d=%p\n", + Index, WalkState->LocalVariables[Index].Object)); - WalkState->LocalVariables[Index].Object = NULL; + /* Detach object (if present) and remove a reference */ - /* Was given a ref when stored */ - - AcpiUtRemoveReference (Object); + AcpiNsDetachObject (&WalkState->LocalVariables[Index]); } } - - /* Delete the arguments */ - - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Deleting arguments in %p\n", WalkState)); + /* Detach the arguments */ for (Index = 0; Index < MTH_NUM_ARGS; Index++) { - Object = WalkState->Arguments[Index].Object; - if (Object) + if (WalkState->Arguments[Index].Object) { - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Deleting Arg%d=%p\n", Index, Object)); - - /* Remove first */ + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Deleting Arg%d=%p\n", + Index, WalkState->Arguments[Index].Object)); - WalkState->Arguments[Index].Object = NULL; + /* Detach object (if present) and remove a reference */ - /* Was given a ref when stored */ - - AcpiUtRemoveReference (Object); + AcpiNsDetachObject (&WalkState->Arguments[Index]); } } @@ -270,7 +255,9 @@ AcpiDsMethodDataDeleteAll ( * * RETURN: Status * - * DESCRIPTION: Initialize arguments for a method + * DESCRIPTION: Initialize arguments for a method. The parameter list is a list + * of ACPI operand objects, either null terminated or whose length + * is defined by MaxParamCount. * ******************************************************************************/ @@ -281,8 +268,7 @@ AcpiDsMethodDataInitArgs ( ACPI_WALK_STATE *WalkState) { ACPI_STATUS Status; - UINT32 Mindex; - UINT32 Pindex; + UINT32 Index = 0; FUNCTION_TRACE_PTR ("DsMethodDataInitArgs", Params); @@ -296,85 +282,68 @@ AcpiDsMethodDataInitArgs ( /* Copy passed parameters into the new method stack frame */ - for (Pindex = Mindex = 0; - (Mindex < MTH_NUM_ARGS) && (Pindex < MaxParamCount); - Mindex++) + while ((Index < MTH_NUM_ARGS) && (Index < MaxParamCount) && Params[Index]) { - if (Params[Pindex]) + /* + * A valid parameter. + * Store the argument in the method/walk descriptor + */ + Status = AcpiDsStoreObjectToLocal (AML_ARG_OP, Index, Params[Index], + WalkState); + if (ACPI_FAILURE (Status)) { - /* - * A valid parameter. - * Set the current method argument to the - * Params[Pindex++] argument object descriptor - */ - Status = AcpiDsStoreObjectToLocal (AML_ARG_OP, Mindex, - Params[Pindex], WalkState); - if (ACPI_FAILURE (Status)) - { - break; - } - - Pindex++; + return_ACPI_STATUS (Status); } - else - { - break; - } + Index++; } - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%d args passed to method\n", Pindex)); + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%d args passed to method\n", Index)); return_ACPI_STATUS (AE_OK); } /******************************************************************************* * - * FUNCTION: AcpiDsMethodDataGetEntry + * FUNCTION: AcpiDsMethodDataGetNode * * PARAMETERS: Opcode - Either AML_LOCAL_OP or AML_ARG_OP - * Index - Which localVar or argument to get - * Entry - Pointer to where a pointer to the stack - * entry is returned. + * Index - Which localVar or argument whose type + * to get * WalkState - Current walk state object * - * RETURN: Status - * - * DESCRIPTION: Get the address of the object entry given by Opcode:Index + * RETURN: Get the Node associated with a local or arg. * ******************************************************************************/ ACPI_STATUS -AcpiDsMethodDataGetEntry ( +AcpiDsMethodDataGetNode ( UINT16 Opcode, UINT32 Index, ACPI_WALK_STATE *WalkState, - ACPI_OPERAND_OBJECT ***Entry) + ACPI_NAMESPACE_NODE **Node) { - - FUNCTION_TRACE_U32 ("DsMethodDataGetEntry", Index); + FUNCTION_TRACE ("DsMethodDataGetNode"); /* - * Get the requested object. - * The stack "Opcode" is either a LocalVariable or an Argument + * Method Locals and Arguments are supported */ switch (Opcode) { - case AML_LOCAL_OP: if (Index > MTH_MAX_LOCAL) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "LocalVar index %d is invalid (max %d)\n", + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Local index %d is invalid (max %d)\n", Index, MTH_MAX_LOCAL)); - return_ACPI_STATUS (AE_BAD_PARAMETER); + return_ACPI_STATUS (AE_AML_INVALID_INDEX); } - *Entry = (ACPI_OPERAND_OBJECT **) - &WalkState->LocalVariables[Index].Object; - break; + /* Return a pointer to the pseudo-node */ + *Node = &WalkState->LocalVariables[Index]; + break; case AML_ARG_OP: @@ -382,27 +351,27 @@ AcpiDsMethodDataGetEntry ( { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Arg index %d is invalid (max %d)\n", Index, MTH_MAX_ARG)); - return_ACPI_STATUS (AE_BAD_PARAMETER); + return_ACPI_STATUS (AE_AML_INVALID_INDEX); } - *Entry = (ACPI_OPERAND_OBJECT **) - &WalkState->Arguments[Index].Object; - break; + /* Return a pointer to the pseudo-node */ + *Node = &WalkState->Arguments[Index]; + break; default: ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Opcode %d is invalid\n", Opcode)); - return_ACPI_STATUS (AE_BAD_PARAMETER); + return_ACPI_STATUS (AE_AML_BAD_OPCODE); + break; } - return_ACPI_STATUS (AE_OK); } /******************************************************************************* * - * FUNCTION: AcpiDsMethodDataSetEntry + * FUNCTION: AcpiDsMethodDataSetValue * * PARAMETERS: Opcode - Either AML_LOCAL_OP or AML_ARG_OP * Index - Which localVar or argument to get @@ -416,22 +385,22 @@ AcpiDsMethodDataGetEntry ( ******************************************************************************/ ACPI_STATUS -AcpiDsMethodDataSetEntry ( +AcpiDsMethodDataSetValue ( UINT16 Opcode, UINT32 Index, ACPI_OPERAND_OBJECT *Object, ACPI_WALK_STATE *WalkState) { ACPI_STATUS Status; - ACPI_OPERAND_OBJECT **Entry; + ACPI_NAMESPACE_NODE *Node; - FUNCTION_TRACE ("DsMethodDataSetEntry"); + FUNCTION_TRACE ("DsMethodDataSetValue"); - /* Get a pointer to the stack entry to set */ + /* Get the namespace node for the arg/local */ - Status = AcpiDsMethodDataGetEntry (Opcode, Index, WalkState, &Entry); + Status = AcpiDsMethodDataGetNode (Opcode, Index, WalkState, &Node); if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); @@ -443,8 +412,7 @@ AcpiDsMethodDataSetEntry ( /* Install the object into the stack entry */ - *Entry = Object; - + Node->Object = Object; return_ACPI_STATUS (AE_OK); } @@ -458,8 +426,7 @@ AcpiDsMethodDataSetEntry ( * to get * WalkState - Current walk state object * - * RETURN: Data type of selected Arg or Local - * Used only in ExecMonadic2()/TypeOp. + * RETURN: Data type of current value of the selected Arg or Local * ******************************************************************************/ @@ -470,98 +437,34 @@ AcpiDsMethodDataGetType ( ACPI_WALK_STATE *WalkState) { ACPI_STATUS Status; - ACPI_OPERAND_OBJECT **Entry; + ACPI_NAMESPACE_NODE *Node; ACPI_OPERAND_OBJECT *Object; FUNCTION_TRACE ("DsMethodDataGetType"); - /* Get a pointer to the requested stack entry */ + /* Get the namespace node for the arg/local */ - Status = AcpiDsMethodDataGetEntry (Opcode, Index, WalkState, &Entry); + Status = AcpiDsMethodDataGetNode (Opcode, Index, WalkState, &Node); if (ACPI_FAILURE (Status)) { return_VALUE ((ACPI_TYPE_NOT_FOUND)); } - /* Get the object from the method stack */ - - Object = *Entry; - - /* Get the object type */ + /* Get the object */ + Object = AcpiNsGetAttachedObject (Node); if (!Object) { - /* Any == 0 => "uninitialized" -- see spec 15.2.3.5.2.28 */ - return_VALUE (ACPI_TYPE_ANY); - } - - return_VALUE (Object->Common.Type); -} - - -/******************************************************************************* - * - * FUNCTION: AcpiDsMethodDataGetNode - * - * PARAMETERS: Opcode - Either AML_LOCAL_OP or AML_ARG_OP - * Index - Which localVar or argument whose type - * to get - * WalkState - Current walk state object - * - * RETURN: Get the Node associated with a local or arg. - * - ******************************************************************************/ - -ACPI_NAMESPACE_NODE * -AcpiDsMethodDataGetNode ( - UINT16 Opcode, - UINT32 Index, - ACPI_WALK_STATE *WalkState) -{ - ACPI_NAMESPACE_NODE *Node = NULL; - - - FUNCTION_TRACE ("DsMethodDataGetNode"); - - - switch (Opcode) - { - - case AML_LOCAL_OP: - - if (Index > MTH_MAX_LOCAL) - { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Local index %d is invalid (max %d)\n", - Index, MTH_MAX_LOCAL)); - return_PTR (Node); - } - - Node = &WalkState->LocalVariables[Index]; - break; - - - case AML_ARG_OP: - - if (Index > MTH_MAX_ARG) - { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Arg index %d is invalid (max %d)\n", - Index, MTH_MAX_ARG)); - return_PTR (Node); - } - - Node = &WalkState->Arguments[Index]; - break; - + /* Uninitialized local/arg, return TYPE_ANY */ - default: - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Opcode %d is invalid\n", Opcode)); - break; + return_VALUE (ACPI_TYPE_ANY); } + /* Get the object type */ - return_PTR (Node); + return_VALUE (Object->Common.Type); } @@ -591,7 +494,7 @@ AcpiDsMethodDataGetValue ( ACPI_OPERAND_OBJECT **DestDesc) { ACPI_STATUS Status; - ACPI_OPERAND_OBJECT **Entry; + ACPI_NAMESPACE_NODE *Node; ACPI_OPERAND_OBJECT *Object; @@ -606,26 +509,24 @@ AcpiDsMethodDataGetValue ( return_ACPI_STATUS (AE_BAD_PARAMETER); } + /* Get the namespace node for the arg/local */ - /* Get a pointer to the requested method stack entry */ - - Status = AcpiDsMethodDataGetEntry (Opcode, Index, WalkState, &Entry); + Status = AcpiDsMethodDataGetNode (Opcode, Index, WalkState, &Node); if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); } - /* Get the object from the method stack */ - - Object = *Entry; + /* Get the object from the node */ + Object = Node->Object; /* Examine the returned object, it must be valid. */ if (!Object) { /* - * Index points to uninitialized object stack value. + * Index points to uninitialized object. * This means that either 1) The expected argument was * not passed to the method, or 2) A local variable * was referenced by the method (via the ASL) @@ -635,25 +536,24 @@ AcpiDsMethodDataGetValue ( { case AML_ARG_OP: - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Uninitialized Arg[%d] at entry %p\n", - Index, Entry)); + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Uninitialized Arg[%d] at node %p\n", + Index, Node)); return_ACPI_STATUS (AE_AML_UNINITIALIZED_ARG); break; case AML_LOCAL_OP: - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Uninitialized Local[%d] at entry %p\n", - Index, Entry)); + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Uninitialized Local[%d] at node %p\n", + Index, Node)); return_ACPI_STATUS (AE_AML_UNINITIALIZED_LOCAL); break; } } - /* - * Index points to initialized and valid object stack value. + * The Index points to an initialized and valid object. * Return an additional reference to the object */ *DestDesc = Object; @@ -685,39 +585,39 @@ AcpiDsMethodDataDeleteValue ( ACPI_WALK_STATE *WalkState) { ACPI_STATUS Status; - ACPI_OPERAND_OBJECT **Entry; + ACPI_NAMESPACE_NODE *Node; ACPI_OPERAND_OBJECT *Object; FUNCTION_TRACE ("DsMethodDataDeleteValue"); - /* Get a pointer to the requested entry */ + /* Get the namespace node for the arg/local */ - Status = AcpiDsMethodDataGetEntry (Opcode, Index, WalkState, &Entry); + Status = AcpiDsMethodDataGetNode (Opcode, Index, WalkState, &Node); if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); } - /* Get the current entry in this slot k */ + /* Get the associated object */ - Object = *Entry; + Object = AcpiNsGetAttachedObject (Node); /* * Undefine the Arg or Local by setting its descriptor * pointer to NULL. Locals/Args can contain both * ACPI_OPERAND_OBJECTS and ACPI_NAMESPACE_NODEs */ - *Entry = NULL; + Node->Object = NULL; if ((Object) && (VALID_DESCRIPTOR_TYPE (Object, ACPI_DESC_TYPE_INTERNAL))) { /* - * There is a valid object in this slot + * There is a valid object. * Decrement the reference count by one to balance the - * increment when the object was stored in the slot. + * increment when the object was stored. */ AcpiUtRemoveReference (Object); } @@ -732,14 +632,14 @@ AcpiDsMethodDataDeleteValue ( * * PARAMETERS: Opcode - Either AML_LOCAL_OP or AML_ARG_OP * Index - Which localVar or argument to set - * SrcDesc - Value to be stored + * ObjDesc - Value to be stored * WalkState - Current walk state * * RETURN: Status * - * DESCRIPTION: Store a value in an Arg or Local. The SrcDesc is installed + * DESCRIPTION: Store a value in an Arg or Local. The ObjDesc is installed * as the new value for the Arg or Local and the reference count - * for SrcDesc is incremented. + * for ObjDesc is incremented. * ******************************************************************************/ @@ -747,48 +647,48 @@ ACPI_STATUS AcpiDsStoreObjectToLocal ( UINT16 Opcode, UINT32 Index, - ACPI_OPERAND_OBJECT *SrcDesc, + ACPI_OPERAND_OBJECT *ObjDesc, ACPI_WALK_STATE *WalkState) { ACPI_STATUS Status; - ACPI_OPERAND_OBJECT **Entry; + ACPI_NAMESPACE_NODE *Node; + ACPI_OPERAND_OBJECT *CurrentObjDesc; - FUNCTION_TRACE ("DsMethodDataSetValue"); + FUNCTION_TRACE ("DsStoreObjectToLocal"); ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Opcode=%d Idx=%d Obj=%p\n", - Opcode, Index, SrcDesc)); + Opcode, Index, ObjDesc)); /* Parameter validation */ - if (!SrcDesc) + if (!ObjDesc) { return_ACPI_STATUS (AE_BAD_PARAMETER); } + /* Get the namespace node for the arg/local */ - /* Get a pointer to the requested method stack entry */ - - Status = AcpiDsMethodDataGetEntry (Opcode, Index, WalkState, &Entry); + Status = AcpiDsMethodDataGetNode (Opcode, Index, WalkState, &Node); if (ACPI_FAILURE (Status)) { - goto Cleanup; + return_ACPI_STATUS (Status); } - if (*Entry == SrcDesc) + CurrentObjDesc = AcpiNsGetAttachedObject (Node); + if (CurrentObjDesc == ObjDesc) { - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Obj=%p already installed!\n", SrcDesc)); - goto Cleanup; + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Obj=%p already installed!\n", ObjDesc)); + return_ACPI_STATUS (Status); } - /* * If there is an object already in this slot, we either * have to delete it, or if this is an argument and there * is an object reference stored there, we have to do * an indirect store! */ - if (*Entry) + if (CurrentObjDesc) { /* * Check for an indirect store if an argument @@ -807,38 +707,25 @@ AcpiDsStoreObjectToLocal ( * Weird, but true. */ if ((Opcode == AML_ARG_OP) && - (VALID_DESCRIPTOR_TYPE (*Entry, ACPI_DESC_TYPE_NAMED))) + (VALID_DESCRIPTOR_TYPE (CurrentObjDesc, ACPI_DESC_TYPE_NAMED))) { ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, - "Arg (%p) is an ObjRef(Node), storing in %p\n", - SrcDesc, *Entry)); + "Arg (%p) is an ObjRef(Node), storing in node %p\n", + ObjDesc, CurrentObjDesc)); /* Detach an existing object from the Node */ - AcpiNsDetachObject ((ACPI_NAMESPACE_NODE *) *Entry); + AcpiNsDetachObject ((ACPI_NAMESPACE_NODE *) CurrentObjDesc); /* * Store this object into the Node - * (do the indirect store) + * (perform the indirect store) */ - Status = AcpiNsAttachObject ((ACPI_NAMESPACE_NODE *) *Entry, SrcDesc, - SrcDesc->Common.Type); + Status = AcpiNsAttachObject ((ACPI_NAMESPACE_NODE *) CurrentObjDesc, + ObjDesc, ObjDesc->Common.Type); return_ACPI_STATUS (Status); } - -#ifdef ACPI_ENABLE_IMPLICIT_CONVERSION - /* - * Perform "Implicit conversion" of the new object to the type of the - * existing object - */ - Status = AcpiExConvertToTargetType ((*Entry)->Common.Type, &SrcDesc, WalkState); - if (ACPI_FAILURE (Status)) - { - goto Cleanup; - } -#endif - /* * Delete the existing object * before storing the new one @@ -846,28 +733,14 @@ AcpiDsStoreObjectToLocal ( AcpiDsMethodDataDeleteValue (Opcode, Index, WalkState); } - /* - * Install the ObjStack descriptor (*SrcDesc) into + * Install the ObjStack descriptor (*ObjDesc) into * the descriptor for the Arg or Local. * Install the new object in the stack entry * (increments the object reference count by one) */ - Status = AcpiDsMethodDataSetEntry (Opcode, Index, SrcDesc, WalkState); - if (ACPI_FAILURE (Status)) - { - goto Cleanup; - } - - /* Normal exit */ - - return_ACPI_STATUS (AE_OK); - - - /* Error exit */ - -Cleanup: - + Status = AcpiDsMethodDataSetValue (Opcode, Index, ObjDesc, WalkState); return_ACPI_STATUS (Status); } + diff --git a/sys/contrib/dev/acpica/dsobject.c b/sys/contrib/dev/acpica/dsobject.c index a997831e939e..62640385abed 100644 --- a/sys/contrib/dev/acpica/dsobject.c +++ b/sys/contrib/dev/acpica/dsobject.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: dsobject - Dispatcher object management routines - * $Revision: 81 $ + * $Revision: 85 $ * *****************************************************************************/ @@ -352,6 +352,8 @@ AcpiDsInitObjectFromOp ( { case ACPI_TYPE_BUFFER: + ObjDesc->Buffer.Node = (ACPI_NAMESPACE_NODE *) WalkState->Operands[0]; + /* First arg is a number */ AcpiDsCreateOperand (WalkState, Op->Value.Arg, 0); @@ -448,11 +450,11 @@ AcpiDsInitObjectFromOp ( ObjDesc->String.Pointer = Op->Value.String; ObjDesc->String.Length = STRLEN (Op->Value.String); - /* + /* * The string is contained in the ACPI table, don't ever try * to delete it */ - ObjDesc->Common.Flags |= AOPOBJ_STATIC_POINTER; + ObjDesc->Common.Flags |= AOPOBJ_STATIC_POINTER; break; @@ -531,7 +533,6 @@ AcpiDsBuildInternalSimpleObj ( ACPI_OPERAND_OBJECT **ObjDescPtr) { ACPI_OPERAND_OBJECT *ObjDesc; - ACPI_OBJECT_TYPE8 Type; ACPI_STATUS Status; UINT32 Length; char *Name; @@ -543,17 +544,15 @@ AcpiDsBuildInternalSimpleObj ( if (Op->Opcode == AML_INT_NAMEPATH_OP) { /* - * This is an object reference. If The name was - * previously looked up in the NS, it is stored in this op. + * This is an object reference. If this name was + * previously looked up in the namespace, it was stored in this op. * Otherwise, go ahead and look it up now */ if (!Op->Node) { - Status = AcpiNsLookup (WalkState->ScopeInfo, - Op->Value.String, ACPI_TYPE_ANY, - IMODE_EXECUTE, - NS_SEARCH_PARENT | NS_DONT_OPEN_SCOPE, - NULL, + Status = AcpiNsLookup (WalkState->ScopeInfo, Op->Value.String, + ACPI_TYPE_ANY, IMODE_EXECUTE, + NS_SEARCH_PARENT | NS_DONT_OPEN_SCOPE, NULL, (ACPI_NAMESPACE_NODE **)&(Op->Node)); if (ACPI_FAILURE (Status)) @@ -585,24 +584,11 @@ AcpiDsBuildInternalSimpleObj ( } } } - - /* - * The reference will be a Reference - * TBD: [Restructure] unless we really need a separate - * type of INTERNAL_TYPE_REFERENCE change - * AcpiDsMapOpcodeToDataType to handle this case - */ - Type = INTERNAL_TYPE_REFERENCE; - } - else - { - Type = AcpiDsMapOpcodeToDataType (Op->Opcode, NULL); } - /* Create and init the internal ACPI object */ - ObjDesc = AcpiUtCreateInternalObject (Type); + ObjDesc = AcpiUtCreateInternalObject ((AcpiPsGetOpcodeInfo (Op->Opcode))->ObjectType); if (!ObjDesc) { return_ACPI_STATUS (AE_NO_MEMORY); @@ -785,7 +771,7 @@ AcpiDsCreateNode ( * parts of the table, we can arrive here twice. Only init * the named object node the first time through */ - if (Node->Object) + if (AcpiNsGetAttachedObject (Node)) { return_ACPI_STATUS (AE_OK); } diff --git a/sys/contrib/dev/acpica/dsopcode.c b/sys/contrib/dev/acpica/dsopcode.c index 52dec60fa275..1787efdb5566 100644 --- a/sys/contrib/dev/acpica/dsopcode.c +++ b/sys/contrib/dev/acpica/dsopcode.c @@ -2,7 +2,7 @@ * * Module Name: dsopcode - Dispatcher Op Region support and handling of * "control" opcodes - * $Revision: 56 $ + * $Revision: 66 $ * *****************************************************************************/ @@ -132,90 +132,61 @@ /***************************************************************************** * - * FUNCTION: AcpiDsGetBufferFieldArguments + * FUNCTION: AcpiDsExecuteArguments * - * PARAMETERS: ObjDesc - A valid BufferField object + * PARAMETERS: Node - Parent NS node + * ExtraDesc - Has AML pointer and length * * RETURN: Status. * - * DESCRIPTION: Get BufferField Buffer and Index. This implements the late - * evaluation of these field attributes. + * DESCRIPTION: Late execution of region or field arguments * ****************************************************************************/ ACPI_STATUS -AcpiDsGetBufferFieldArguments ( - ACPI_OPERAND_OBJECT *ObjDesc) +AcpiDsExecuteArguments ( + ACPI_NAMESPACE_NODE *Node, + ACPI_OPERAND_OBJECT *ExtraDesc) { - ACPI_OPERAND_OBJECT *ExtraDesc; - ACPI_NAMESPACE_NODE *Node; - ACPI_PARSE_OBJECT *Op; - ACPI_PARSE_OBJECT *FieldOp; ACPI_STATUS Status; - ACPI_TABLE_DESC *TableDesc; + ACPI_PARSE_OBJECT *Op; ACPI_WALK_STATE *WalkState; + ACPI_PARSE_OBJECT *Arg; - FUNCTION_TRACE_PTR ("DsGetBufferFieldArguments", ObjDesc); - - - if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID) - { - return_ACPI_STATUS (AE_OK); - } - - - /* Get the AML pointer (method object) and BufferField node */ - - ExtraDesc = ObjDesc->BufferField.Extra; - Node = ObjDesc->BufferField.Node; - - DEBUG_EXEC(AcpiUtDisplayInitPathname (Node, " [Field]")); - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] BufferField JIT Init\n", - (char*)&Node->Name)); + FUNCTION_TRACE ("AcpiDsExecuteArguments"); /* * Allocate a new parser op to be the root of the parsed - * OpRegion tree + * BufferField tree */ Op = AcpiPsAllocOp (AML_SCOPE_OP); if (!Op) { - return (AE_NO_MEMORY); + return_ACPI_STATUS (AE_NO_MEMORY); } /* Save the Node for use in AcpiPsParseAml */ Op->Node = AcpiNsGetParentObject (Node); - /* Get a handle to the parent ACPI table */ - - Status = AcpiTbHandleToObject (Node->OwnerId, &TableDesc); - if (ACPI_FAILURE (Status)) - { - return_ACPI_STATUS (Status); - } - /* Create and initialize a new parser state */ - WalkState = AcpiDsCreateWalkState (TABLE_ID_DSDT, - NULL, NULL, NULL); + WalkState = AcpiDsCreateWalkState (TABLE_ID_DSDT, NULL, NULL, NULL); if (!WalkState) { return_ACPI_STATUS (AE_NO_MEMORY); } - Status = AcpiDsInitAmlWalk (WalkState, Op, NULL, ExtraDesc->Extra.AmlStart, + Status = AcpiDsInitAmlWalk (WalkState, Op, NULL, ExtraDesc->Extra.AmlStart, ExtraDesc->Extra.AmlLength, NULL, NULL, 1); if (ACPI_FAILURE (Status)) { - /* TBD: delete walk state */ + AcpiDsDeleteWalkState (WalkState); return_ACPI_STATUS (Status); } - /* TBD: No Walk flags?? */ - WalkState->ParseFlags = 0; /* Pass1: Parse the entire BufferField declaration */ @@ -229,28 +200,24 @@ AcpiDsGetBufferFieldArguments ( /* Get and init the actual FieldUnit Op created above */ - FieldOp = Op->Value.Arg; + Arg = Op->Value.Arg; Op->Node = Node; - - - FieldOp = Op->Value.Arg; - FieldOp->Node = Node; + Arg->Node = Node; AcpiPsDeleteParseTree (Op); - /* Evaluate the address and length arguments for the OpRegion */ + /* Evaluate the address and length arguments for the Buffer Field */ Op = AcpiPsAllocOp (AML_SCOPE_OP); if (!Op) { - return (AE_NO_MEMORY); + return_ACPI_STATUS (AE_NO_MEMORY); } Op->Node = AcpiNsGetParentObject (Node); /* Create and initialize a new parser state */ - WalkState = AcpiDsCreateWalkState (TABLE_ID_DSDT, - NULL, NULL, NULL); + WalkState = AcpiDsCreateWalkState (TABLE_ID_DSDT, NULL, NULL, NULL); if (!WalkState) { return_ACPI_STATUS (AE_NO_MEMORY); @@ -260,160 +227,110 @@ AcpiDsGetBufferFieldArguments ( ExtraDesc->Extra.AmlLength, NULL, NULL, 3); if (ACPI_FAILURE (Status)) { - /* TBD: delete walk state */ + AcpiDsDeleteWalkState (WalkState); return_ACPI_STATUS (Status); } Status = AcpiPsParseAml (WalkState); AcpiPsDeleteParseTree (Op); - /* - * The pseudo-method object is no longer needed since the region is - * now initialized - */ - AcpiUtRemoveReference (ObjDesc->BufferField.Extra); - ObjDesc->BufferField.Extra = NULL; - return_ACPI_STATUS (Status); } /***************************************************************************** * - * FUNCTION: AcpiDsGetRegionArguments + * FUNCTION: AcpiDsGetBufferFieldArguments * - * PARAMETERS: ObjDesc - A valid region object + * PARAMETERS: ObjDesc - A valid BufferField object * * RETURN: Status. * - * DESCRIPTION: Get region address and length. This implements the late - * evaluation of these region attributes. + * DESCRIPTION: Get BufferField Buffer and Index. This implements the late + * evaluation of these field attributes. * ****************************************************************************/ ACPI_STATUS -AcpiDsGetRegionArguments ( +AcpiDsGetBufferFieldArguments ( ACPI_OPERAND_OBJECT *ObjDesc) { - ACPI_OPERAND_OBJECT *ExtraDesc = NULL; + ACPI_OPERAND_OBJECT *ExtraDesc; ACPI_NAMESPACE_NODE *Node; - ACPI_PARSE_OBJECT *Op; - ACPI_PARSE_OBJECT *RegionOp; ACPI_STATUS Status; - ACPI_TABLE_DESC *TableDesc; - ACPI_WALK_STATE *WalkState; - FUNCTION_TRACE_PTR ("DsGetRegionArguments", ObjDesc); + FUNCTION_TRACE_PTR ("DsGetBufferFieldArguments", ObjDesc); - if (ObjDesc->Region.Flags & AOPOBJ_DATA_VALID) + if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID) { return_ACPI_STATUS (AE_OK); } + /* Get the AML pointer (method object) and BufferField node */ - /* Get the AML pointer (method object) and region node */ - - ExtraDesc = ObjDesc->Region.Extra; - Node = ObjDesc->Region.Node; + ExtraDesc = AcpiNsGetSecondaryObject (ObjDesc); + Node = ObjDesc->BufferField.Node; - DEBUG_EXEC(AcpiUtDisplayInitPathname (Node, " [Operation Region]")); + DEBUG_EXEC(AcpiUtDisplayInitPathname (Node, " [Field]")); + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] BufferField JIT Init\n", + (char *) &Node->Name)); - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] OpRegion Init at AML %p\n", - (char*)&Node->Name, ExtraDesc->Extra.AmlStart)); + /* Execute the AML code for the TermArg arguments */ - /* - * Allocate a new parser op to be the root of the parsed - * OpRegion tree - */ - Op = AcpiPsAllocOp (AML_SCOPE_OP); - if (!Op) - { - return (AE_NO_MEMORY); - } + Status = AcpiDsExecuteArguments (Node, ExtraDesc); + return_ACPI_STATUS (Status); +} - /* Save the Node for use in AcpiPsParseAml */ - Op->Node = AcpiNsGetParentObject (Node); +/***************************************************************************** + * + * FUNCTION: AcpiDsGetRegionArguments + * + * PARAMETERS: ObjDesc - A valid region object + * + * RETURN: Status. + * + * DESCRIPTION: Get region address and length. This implements the late + * evaluation of these region attributes. + * + ****************************************************************************/ - /* Get a handle to the parent ACPI table */ +ACPI_STATUS +AcpiDsGetRegionArguments ( + ACPI_OPERAND_OBJECT *ObjDesc) +{ + ACPI_NAMESPACE_NODE *Node; + ACPI_STATUS Status; + ACPI_OPERAND_OBJECT *RegionObj2; - Status = AcpiTbHandleToObject (Node->OwnerId, &TableDesc); - if (ACPI_FAILURE (Status)) - { - return_ACPI_STATUS (Status); - } - /* Create and initialize a new parser state */ + FUNCTION_TRACE_PTR ("DsGetRegionArguments", ObjDesc); - WalkState = AcpiDsCreateWalkState (TABLE_ID_DSDT, - Op, NULL, NULL); - if (!WalkState) - { - return_ACPI_STATUS (AE_NO_MEMORY); - } - Status = AcpiDsInitAmlWalk (WalkState, Op, NULL, ExtraDesc->Extra.AmlStart, - ExtraDesc->Extra.AmlLength, NULL, NULL, 1); - if (ACPI_FAILURE (Status)) + if (ObjDesc->Region.Flags & AOPOBJ_DATA_VALID) { - /* TBD: delete walk state */ - return_ACPI_STATUS (Status); + return_ACPI_STATUS (AE_OK); } - /* TBD: No Walk flags?? */ - - WalkState->ParseFlags = 0; - - /* Parse the entire OpRegion declaration, creating a parse tree */ - - Status = AcpiPsParseAml (WalkState); - if (ACPI_FAILURE (Status)) + RegionObj2 = AcpiNsGetSecondaryObject (ObjDesc); + if (!RegionObj2) { - AcpiPsDeleteParseTree (Op); - return_ACPI_STATUS (Status); + return_ACPI_STATUS (AE_NOT_EXIST); } - /* Get and init the actual RegionOp created above */ - - RegionOp = Op->Value.Arg; - Op->Node = Node; - - - RegionOp = Op->Value.Arg; - RegionOp->Node = Node; - AcpiPsDeleteParseTree (Op); - - /* Evaluate the address and length arguments for the OpRegion */ - - Op = AcpiPsAllocOp (AML_SCOPE_OP); - if (!Op) - { - return (AE_NO_MEMORY); - } + /* Get the AML pointer (method object) and region node */ - Op->Node = AcpiNsGetParentObject (Node); + Node = ObjDesc->Region.Node; - /* Create and initialize a new parser state */ + DEBUG_EXEC(AcpiUtDisplayInitPathname (Node, " [Operation Region]")); - WalkState = AcpiDsCreateWalkState (TABLE_ID_DSDT, - Op, NULL, NULL); - if (!WalkState) - { - return_ACPI_STATUS (AE_NO_MEMORY); - } + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] OpRegion Init at AML %p\n", + (char *) &Node->Name, RegionObj2->Extra.AmlStart)); - Status = AcpiDsInitAmlWalk (WalkState, Op, NULL, ExtraDesc->Extra.AmlStart, - ExtraDesc->Extra.AmlLength, NULL, NULL, 3); - if (ACPI_FAILURE (Status)) - { - /* TBD: delete walk state */ - return_ACPI_STATUS (Status); - } - Status = AcpiPsParseAml (WalkState); - AcpiPsDeleteParseTree (Op); + Status = AcpiDsExecuteArguments (Node, RegionObj2); return_ACPI_STATUS (Status); } @@ -460,21 +377,6 @@ AcpiDsInitializeRegion ( * DESCRIPTION: Get BufferField Buffer and Index * Called from AcpiDsExecEndOp during BufferField parse tree walk * - * ACPI SPECIFICATION REFERENCES: - * Each of the Buffer Field opcodes is defined as specified in in-line - * comments below. For each one, use the following definitions. - * - * DefBitField := BitFieldOp SrcBuf BitIdx Destination - * DefByteField := ByteFieldOp SrcBuf ByteIdx Destination - * DefCreateField := CreateFieldOp SrcBuf BitIdx NumBits NameString - * DefDWordField := DWordFieldOp SrcBuf ByteIdx Destination - * DefWordField := WordFieldOp SrcBuf ByteIdx Destination - * BitIndex := TermArg=>Integer - * ByteIndex := TermArg=>Integer - * Destination := NameString - * NumBits := TermArg=>Integer - * SourceBuf := TermArg=>Buffer - * ****************************************************************************/ ACPI_STATUS @@ -523,7 +425,6 @@ AcpiDsEvalBufferFieldOperands ( return_ACPI_STATUS (AE_NOT_EXIST); } - /* Resolve the operands */ Status = AcpiExResolveOperands (Op->Opcode, WALK_OPERANDS, WalkState); @@ -552,10 +453,7 @@ AcpiDsEvalBufferFieldOperands ( OffDesc = WalkState->Operands[1]; SrcDesc = WalkState->Operands[0]; - - - - Offset = (UINT32) OffDesc->Integer.Value; + Offset = (UINT32) OffDesc->Integer.Value; /* * If ResDesc is a Name, it will be a direct name pointer after @@ -576,78 +474,60 @@ AcpiDsEvalBufferFieldOperands ( switch (Op->Opcode) { - /* DefCreateField */ - case AML_CREATE_FIELD_OP: /* Offset is in bits, count is in bits */ BitOffset = Offset; BitCount = (UINT32) CntDesc->Integer.Value; - FieldFlags = ACCESS_BYTE_ACC; + FieldFlags = AML_FIELD_ACCESS_BYTE; break; - - /* DefCreateBitField */ - case AML_CREATE_BIT_FIELD_OP: /* Offset is in bits, Field is one bit */ BitOffset = Offset; BitCount = 1; - FieldFlags = ACCESS_BYTE_ACC; + FieldFlags = AML_FIELD_ACCESS_BYTE; break; - - /* DefCreateByteField */ - case AML_CREATE_BYTE_FIELD_OP: /* Offset is in bytes, field is one byte */ BitOffset = 8 * Offset; BitCount = 8; - FieldFlags = ACCESS_BYTE_ACC; + FieldFlags = AML_FIELD_ACCESS_BYTE; break; - - /* DefCreateWordField */ - case AML_CREATE_WORD_FIELD_OP: /* Offset is in bytes, field is one word */ BitOffset = 8 * Offset; BitCount = 16; - FieldFlags = ACCESS_WORD_ACC; + FieldFlags = AML_FIELD_ACCESS_WORD; break; - - /* DefCreateDWordField */ - case AML_CREATE_DWORD_FIELD_OP: /* Offset is in bytes, field is one dword */ BitOffset = 8 * Offset; BitCount = 32; - FieldFlags = ACCESS_DWORD_ACC; + FieldFlags = AML_FIELD_ACCESS_DWORD; break; - - /* DefCreateQWordField */ - case AML_CREATE_QWORD_FIELD_OP: /* Offset is in bytes, field is one qword */ BitOffset = 8 * Offset; BitCount = 64; - FieldFlags = ACCESS_QWORD_ACC; + FieldFlags = AML_FIELD_ACCESS_QWORD; break; - default: ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, @@ -657,7 +537,6 @@ AcpiDsEvalBufferFieldOperands ( goto Cleanup; } - /* * Setup field according to the object type */ @@ -678,12 +557,11 @@ AcpiDsEvalBufferFieldOperands ( goto Cleanup; } - /* * Initialize areas of the field object that are common to all fields * For FieldFlags, use LOCK_RULE = 0 (NO_LOCK), UPDATE_RULE = 0 (UPDATE_PRESERVE) */ - Status = AcpiExPrepCommonFieldObject (ObjDesc, FieldFlags, + Status = AcpiExPrepCommonFieldObject (ObjDesc, FieldFlags, 0, BitOffset, BitCount); if (ACPI_FAILURE (Status)) { @@ -696,7 +574,6 @@ AcpiDsEvalBufferFieldOperands ( SrcDesc->Common.ReferenceCount = (UINT16) (SrcDesc->Common.ReferenceCount + ObjDesc->Common.ReferenceCount); - break; @@ -704,7 +581,7 @@ AcpiDsEvalBufferFieldOperands ( default: - if ((SrcDesc->Common.Type > (UINT8) INTERNAL_TYPE_REFERENCE) || !AcpiUtValidObjectType (SrcDesc->Common.Type)) /* TBD: This line MUST be a single line until AcpiSrc can handle it (block deletion) */ + if ((SrcDesc->Common.Type > (UINT8) INTERNAL_TYPE_REFERENCE) || !AcpiUtValidObjectType (SrcDesc->Common.Type)) /* This line MUST be a single line until AcpiSrc can handle it (block deletion) */ { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Tried to create field in invalid object type %X\n", @@ -915,11 +792,8 @@ AcpiDsExecBeginControlOp ( */ WalkState->ControlState->Control.AmlPredicateStart = WalkState->ParserState.Aml - 1; - /* TBD: can this be removed? */ - /*AcpiPsPkgLengthEncodingSize (GET8 (WalkState->ParserState->Aml));*/ break; - case AML_ELSE_OP: /* Predicate is in the state object */ @@ -932,12 +806,10 @@ AcpiDsExecBeginControlOp ( break; - case AML_RETURN_OP: break; - default: break; } @@ -958,7 +830,6 @@ AcpiDsExecBeginControlOp ( * DESCRIPTION: Handles all control ops encountered during control method * execution. * - * ******************************************************************************/ ACPI_STATUS @@ -1077,11 +948,11 @@ AcpiDsExecEndControlOp ( ((WalkState->Results->Results.ObjDesc [0])->Common.Type == INTERNAL_TYPE_REFERENCE) && ((WalkState->Results->Results.ObjDesc [0])->Reference.Opcode != AML_INDEX_OP)) { - Status = AcpiExResolveToValue (&WalkState->Results->Results.ObjDesc [0], WalkState); - if (ACPI_FAILURE (Status)) - { - return (Status); - } + Status = AcpiExResolveToValue (&WalkState->Results->Results.ObjDesc [0], WalkState); + if (ACPI_FAILURE (Status)) + { + return (Status); + } } WalkState->ReturnDesc = WalkState->Results->Results.ObjDesc [0]; @@ -1166,7 +1037,6 @@ AcpiDsExecEndControlOp ( break; } - return (Status); } diff --git a/sys/contrib/dev/acpica/dsutils.c b/sys/contrib/dev/acpica/dsutils.c index 011db55d67b0..68a2ff8f4072 100644 --- a/sys/contrib/dev/acpica/dsutils.c +++ b/sys/contrib/dev/acpica/dsutils.c @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: dsutils - Dispatcher utilities - * $Revision: 80 $ + * $Revision: 84 $ * ******************************************************************************/ @@ -161,7 +161,6 @@ AcpiDsIsResultUsed ( return_VALUE (TRUE); } - /* * If there is no parent, the result can't possibly be used! * (An executing method typically has no parent, since each @@ -173,11 +172,9 @@ AcpiDsIsResultUsed ( return_VALUE (FALSE); } - /* * Get info on the parent. The root Op is AML_SCOPE */ - ParentInfo = AcpiPsGetOpcodeInfo (Op->Parent->Opcode); if (ParentInfo->Class == AML_CLASS_UNKNOWN) { @@ -185,7 +182,6 @@ AcpiDsIsResultUsed ( return_VALUE (FALSE); } - /* * Decide what to do with the result based on the parent. If * the parent opcode will not use the result, delete the object. @@ -194,10 +190,7 @@ AcpiDsIsResultUsed ( */ switch (ParentInfo->Class) { - /* - * In these cases, the parent will never use the return object - */ - case AML_CLASS_CONTROL: /* IF, ELSE, WHILE only */ + case AML_CLASS_CONTROL: switch (Op->Parent->Opcode) { @@ -205,9 +198,7 @@ AcpiDsIsResultUsed ( /* Never delete the return value associated with a return opcode */ - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "Result used, [RETURN] opcode=%X Op=%p\n", Op->Opcode, Op)); - return_VALUE (TRUE); + goto ResultUsed; break; case AML_IF_OP: @@ -215,60 +206,72 @@ AcpiDsIsResultUsed ( /* * If we are executing the predicate AND this is the predicate op, - * we will use the return value! + * we will use the return value */ if ((WalkState->ControlState->Common.State == CONTROL_PREDICATE_EXECUTING) && (WalkState->ControlState->Control.PredicateOp == Op)) { - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "Result used as a predicate, [IF/WHILE] opcode=%X Op=%p\n", - Op->Opcode, Op)); - return_VALUE (TRUE); + goto ResultUsed; } - - break; } + /* The general control opcode returns no result */ - /* Fall through to not used case below */ + goto ResultNotUsed; + break; - case AML_CLASS_NAMED_OBJECT: /* Scope, method, etc. */ case AML_CLASS_CREATE: /* * These opcodes allow TermArg(s) as operands and therefore - * method calls. The result is used. + * the operands can be method calls. The result is used. */ - if ((Op->Parent->Opcode == AML_REGION_OP) || - (Op->Parent->Opcode == AML_CREATE_FIELD_OP) || - (Op->Parent->Opcode == AML_CREATE_BIT_FIELD_OP) || - (Op->Parent->Opcode == AML_CREATE_BYTE_FIELD_OP) || - (Op->Parent->Opcode == AML_CREATE_WORD_FIELD_OP) || - (Op->Parent->Opcode == AML_CREATE_DWORD_FIELD_OP) || - (Op->Parent->Opcode == AML_CREATE_QWORD_FIELD_OP)) + goto ResultUsed; + break; + + + case AML_CLASS_NAMED_OBJECT: + + if ((Op->Parent->Opcode == AML_REGION_OP) || + (Op->Parent->Opcode == AML_DATA_REGION_OP)) { - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "Result used, [Region or CreateField] opcode=%X Op=%p\n", - Op->Opcode, Op)); - return_VALUE (TRUE); + /* + * These opcodes allow TermArg(s) as operands and therefore + * the operands can be method calls. The result is used. + */ + goto ResultUsed; } - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "Result not used, Parent opcode=%X Op=%p\n", Op->Opcode, Op)); - - return_VALUE (FALSE); + goto ResultNotUsed; break; + /* * In all other cases. the parent will actually use the return * object, so keep it. */ default: + goto ResultUsed; break; } + +ResultUsed: + ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Result of [%s] used by Parent [%s] Op=%p\n", + AcpiPsGetOpcodeName (Op->Opcode), + AcpiPsGetOpcodeName (Op->Parent->Opcode), Op)); + return_VALUE (TRUE); + + +ResultNotUsed: + ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Result of [%s] not used by Parent [%s] Op=%p\n", + AcpiPsGetOpcodeName (Op->Opcode), + AcpiPsGetOpcodeName (Op->Parent->Opcode), Op)); + + return_VALUE (FALSE); + } @@ -355,11 +358,9 @@ AcpiDsCreateOperand ( ACPI_STATUS Status = AE_OK; NATIVE_CHAR *NameString; UINT32 NameLength; - ACPI_OBJECT_TYPE8 DataType; ACPI_OPERAND_OBJECT *ObjDesc; ACPI_PARSE_OBJECT *ParentOp; UINT16 Opcode; - UINT32 Flags; OPERATING_MODE InterpreterMode; const ACPI_OPCODE_INFO *OpInfo; @@ -452,7 +453,7 @@ AcpiDsCreateOperand ( /* TBD: Externalize NameString and print */ - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Object name was not found in namespace\n")); } } @@ -490,11 +491,6 @@ AcpiDsCreateOperand ( Opcode = AML_ZERO_OP; /* Has no arguments! */ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Null namepath: Arg=%p\n", Arg)); - - /* - * TBD: [Investigate] anything else needed for the - * zero op lvalue? - */ } else @@ -502,16 +498,15 @@ AcpiDsCreateOperand ( Opcode = Arg->Opcode; } + /* Get the object type of the argument */ - /* Get the data type of the argument */ - - DataType = AcpiDsMapOpcodeToDataType (Opcode, &Flags); - if (DataType == INTERNAL_TYPE_INVALID) + OpInfo = AcpiPsGetOpcodeInfo (Opcode); + if (OpInfo->ObjectType == INTERNAL_TYPE_INVALID) { return_ACPI_STATUS (AE_NOT_IMPLEMENTED); } - if (Flags & OP_HAS_RETURN_VALUE) + if (OpInfo->Flags & AML_HAS_RETVAL) { ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Argument previously created, already stacked \n")); @@ -533,14 +528,13 @@ AcpiDsCreateOperand ( AcpiFormatException (Status))); return_ACPI_STATUS (Status); } - } else { /* Create an ACPI_INTERNAL_OBJECT for the argument */ - ObjDesc = AcpiUtCreateInternalObject (DataType); + ObjDesc = AcpiUtCreateInternalObject (OpInfo->ObjectType); if (!ObjDesc) { return_ACPI_STATUS (AE_NO_MEMORY); @@ -665,11 +659,6 @@ AcpiDsResolveOperands ( * Attempt to resolve each of the valid operands * Method arguments are passed by value, not by reference */ - - /* - * TBD: [Investigate] Note from previous parser: - * RefOf problem with AcpiExResolveToValue() conversion. - */ for (i = 0; i < WalkState->NumOperands; i++) { Status = AcpiExResolveToValue (&WalkState->Operands[i], WalkState); @@ -682,269 +671,3 @@ AcpiDsResolveOperands ( return_ACPI_STATUS (Status); } - -/******************************************************************************* - * - * FUNCTION: AcpiDsMapOpcodeToDataType - * - * PARAMETERS: Opcode - AML opcode to map - * OutFlags - Additional info about the opcode - * - * RETURN: The ACPI type associated with the opcode - * - * DESCRIPTION: Convert a raw AML opcode to the associated ACPI data type, - * if any. If the opcode returns a value as part of the - * intepreter execution, a flag is returned in OutFlags. - * - ******************************************************************************/ - -ACPI_OBJECT_TYPE8 -AcpiDsMapOpcodeToDataType ( - UINT16 Opcode, - UINT32 *OutFlags) -{ - ACPI_OBJECT_TYPE8 DataType = INTERNAL_TYPE_INVALID; - const ACPI_OPCODE_INFO *OpInfo; - UINT32 Flags = 0; - - - PROC_NAME ("DsMapOpcodeToDataType"); - - - OpInfo = AcpiPsGetOpcodeInfo (Opcode); - if (OpInfo->Class == AML_CLASS_UNKNOWN) - { - /* Unknown opcode */ - - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown AML opcode: %x\n", Opcode)); - return (DataType); - } - - -/* - * TBD: Use op class - */ - - switch (OpInfo->Type) - { - - case AML_TYPE_LITERAL: - - switch (Opcode) - { - case AML_BYTE_OP: - case AML_WORD_OP: - case AML_DWORD_OP: - case AML_QWORD_OP: - - DataType = ACPI_TYPE_INTEGER; - break; - - - case AML_STRING_OP: - - DataType = ACPI_TYPE_STRING; - break; - - case AML_INT_NAMEPATH_OP: - DataType = INTERNAL_TYPE_REFERENCE; - break; - - default: - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "Unknown (type LITERAL) AML opcode: %x\n", Opcode)); - break; - } - break; - - - case AML_TYPE_DATA_TERM: - - switch (Opcode) - { - case AML_BUFFER_OP: - - DataType = ACPI_TYPE_BUFFER; - break; - - case AML_PACKAGE_OP: - case AML_VAR_PACKAGE_OP: - - DataType = ACPI_TYPE_PACKAGE; - break; - - default: - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "Unknown (type DATA_TERM) AML opcode: %x\n", Opcode)); - break; - } - break; - - - case AML_TYPE_CONSTANT: - case AML_TYPE_METHOD_ARGUMENT: - case AML_TYPE_LOCAL_VARIABLE: - - DataType = INTERNAL_TYPE_REFERENCE; - break; - - - case AML_TYPE_EXEC_1A_0T_1R: - case AML_TYPE_EXEC_1A_1T_1R: - case AML_TYPE_EXEC_2A_0T_1R: - case AML_TYPE_EXEC_2A_1T_1R: - case AML_TYPE_EXEC_2A_2T_1R: - case AML_TYPE_EXEC_3A_1T_1R: - case AML_TYPE_EXEC_6A_0T_1R: - case AML_TYPE_RETURN: - - Flags = OP_HAS_RETURN_VALUE; - DataType = ACPI_TYPE_ANY; - break; - - - case AML_TYPE_METHOD_CALL: - - Flags = OP_HAS_RETURN_VALUE; - DataType = ACPI_TYPE_METHOD; - break; - - - case AML_TYPE_NAMED_FIELD: - case AML_TYPE_NAMED_SIMPLE: - case AML_TYPE_NAMED_COMPLEX: - case AML_TYPE_NAMED_NO_OBJ: - - DataType = AcpiDsMapNamedOpcodeToDataType (Opcode); - break; - - - case AML_TYPE_EXEC_1A_0T_0R: - case AML_TYPE_EXEC_2A_0T_0R: - case AML_TYPE_EXEC_3A_0T_0R: - case AML_TYPE_EXEC_1A_1T_0R: - case AML_TYPE_CONTROL: - - /* No mapping needed at this time */ - - break; - - - default: - - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "Unimplemented data type opcode: %x\n", Opcode)); - break; - } - - /* Return flags to caller if requested */ - - if (OutFlags) - { - *OutFlags = Flags; - } - - return (DataType); -} - - -/******************************************************************************* - * - * FUNCTION: AcpiDsMapNamedOpcodeToDataType - * - * PARAMETERS: Opcode - The Named AML opcode to map - * - * RETURN: The ACPI type associated with the named opcode - * - * DESCRIPTION: Convert a raw Named AML opcode to the associated data type. - * Named opcodes are a subsystem of the AML opcodes. - * - ******************************************************************************/ - -ACPI_OBJECT_TYPE8 -AcpiDsMapNamedOpcodeToDataType ( - UINT16 Opcode) -{ - ACPI_OBJECT_TYPE8 DataType; - - - FUNCTION_ENTRY (); - - - /* Decode Opcode */ - - switch (Opcode) - { - case AML_SCOPE_OP: - DataType = INTERNAL_TYPE_SCOPE; - break; - - case AML_DEVICE_OP: - DataType = ACPI_TYPE_DEVICE; - break; - - case AML_THERMAL_ZONE_OP: - DataType = ACPI_TYPE_THERMAL; - break; - - case AML_METHOD_OP: - DataType = ACPI_TYPE_METHOD; - break; - - case AML_POWER_RES_OP: - DataType = ACPI_TYPE_POWER; - break; - - case AML_PROCESSOR_OP: - DataType = ACPI_TYPE_PROCESSOR; - break; - - case AML_FIELD_OP: /* FieldOp */ - DataType = INTERNAL_TYPE_FIELD_DEFN; - break; - - case AML_INDEX_FIELD_OP: /* IndexFieldOp */ - DataType = INTERNAL_TYPE_INDEX_FIELD_DEFN; - break; - - case AML_BANK_FIELD_OP: /* BankFieldOp */ - DataType = INTERNAL_TYPE_BANK_FIELD_DEFN; - break; - - case AML_INT_NAMEDFIELD_OP: /* NO CASE IN ORIGINAL */ - DataType = ACPI_TYPE_ANY; - break; - - case AML_NAME_OP: /* NameOp - special code in original */ - case AML_INT_NAMEPATH_OP: - DataType = ACPI_TYPE_ANY; - break; - - case AML_ALIAS_OP: - DataType = INTERNAL_TYPE_ALIAS; - break; - - case AML_MUTEX_OP: - DataType = ACPI_TYPE_MUTEX; - break; - - case AML_EVENT_OP: - DataType = ACPI_TYPE_EVENT; - break; - - case AML_DATA_REGION_OP: - case AML_REGION_OP: - DataType = ACPI_TYPE_REGION; - break; - - - default: - DataType = ACPI_TYPE_ANY; - break; - - } - - return (DataType); -} - - diff --git a/sys/contrib/dev/acpica/dswexec.c b/sys/contrib/dev/acpica/dswexec.c index 95c5a3e641af..26aa24764a84 100644 --- a/sys/contrib/dev/acpica/dswexec.c +++ b/sys/contrib/dev/acpica/dswexec.c @@ -2,7 +2,7 @@ * * Module Name: dswexec - Dispatcher method execution callbacks; * dispatch to interpreter. - * $Revision: 79 $ + * $Revision: 82 $ * *****************************************************************************/ @@ -130,7 +130,7 @@ MODULE_NAME ("dswexec") /* - * Dispatch tables for opcode classes + * Dispatch table for opcode classes */ ACPI_EXECUTE_OP AcpiGbl_OpTypeDispatch [] = { AcpiExOpcode_1A_0T_0R, @@ -183,7 +183,6 @@ AcpiDsGetPredicateValue ( return_ACPI_STATUS (Status); } } - else { Status = AcpiDsCreateOperand (WalkState, WalkState->Op, 0); @@ -209,7 +208,6 @@ AcpiDsGetPredicateValue ( return_ACPI_STATUS (AE_AML_NO_OPERAND); } - /* * Result of predicate evaluation currently must * be a number @@ -224,7 +222,6 @@ AcpiDsGetPredicateValue ( goto Cleanup; } - /* Truncate the predicate to 32-bits if necessary */ AcpiExTruncateFor32bitTable (ObjDesc, WalkState); @@ -237,7 +234,6 @@ AcpiDsGetPredicateValue ( { WalkState->ControlState->Common.Value = TRUE; } - else { /* @@ -251,7 +247,7 @@ AcpiDsGetPredicateValue ( Cleanup: - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Completed a predicate eval=%X Op=%pn", + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Completed a predicate eval=%X Op=%p\n", WalkState->ControlState->Common.Value, WalkState->Op)); /* Break to debugger to display result */ @@ -382,20 +378,17 @@ AcpiDsExecBeginOp ( Status = AcpiDsLoad2BeginOp (WalkState, NULL); } - if (Op->Opcode == AML_REGION_OP) { Status = AcpiDsResultStackPush (WalkState); } - break; - /* most operators with arguments */ - case AML_CLASS_EXECUTE: case AML_CLASS_CREATE: + /* most operators with arguments */ /* Start a new result/operand state */ Status = AcpiDsResultStackPush (WalkState); @@ -462,23 +455,20 @@ AcpiDsExecEndOp ( WalkState->ReturnDesc = NULL; WalkState->ResultObj = NULL; - /* Call debugger for single step support (DEBUG build only) */ DEBUGGER_EXEC (Status = AcpiDbSingleStep (WalkState, Op, OpClass)); DEBUGGER_EXEC (if (ACPI_FAILURE (Status)) {return_ACPI_STATUS (Status);}); + /* Decode the Opcode Class */ switch (OpClass) { - /* Decode the Opcode Class */ - - case AML_CLASS_ARGUMENT: /* constants, literals, etc. do nothing */ + case AML_CLASS_ARGUMENT: /* constants, literals, etc. -- do nothing */ break; - /* most operators with arguments */ - - case AML_CLASS_EXECUTE: + + case AML_CLASS_EXECUTE: /* most operators with arguments */ /* Build resolved operand stack */ @@ -498,53 +488,41 @@ AcpiDsExecEndOp ( /* Resolve all operands */ - Status = AcpiExResolveOperands (WalkState->Opcode, - &(WalkState->Operands [WalkState->NumOperands -1]), + Status = AcpiExResolveOperands (WalkState->Opcode, + &(WalkState->Operands [WalkState->NumOperands -1]), WalkState); - if (ACPI_FAILURE (Status)) + if (ACPI_SUCCESS (Status)) { - /* TBD: must pop and delete operands */ - - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "[%s]: Could not resolve operands, %s\n", - AcpiPsGetOpcodeName (WalkState->Opcode), AcpiFormatException (Status))); + DUMP_OPERANDS (WALK_OPERANDS, IMODE_EXECUTE, + AcpiPsGetOpcodeName (WalkState->Opcode), + WalkState->NumOperands, "after ExResolveOperands"); /* - * On error, we must delete all the operands and clear the - * operand stack + * Dispatch the request to the appropriate interpreter handler + * routine. There is one routine per opcode "type" based upon the + * number of opcode arguments and return type. */ - for (i = 0; i < WalkState->NumOperands; i++) - { - AcpiUtRemoveReference (WalkState->Operands[i]); - WalkState->Operands[i] = NULL; - } - - WalkState->NumOperands = 0; - goto Cleanup; + Status = AcpiGbl_OpTypeDispatch [OpType] (WalkState); + } + else + { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, + "[%s]: Could not resolve operands, %s\n", + AcpiPsGetOpcodeName (WalkState->Opcode), + AcpiFormatException (Status))); } - DUMP_OPERANDS (WALK_OPERANDS, IMODE_EXECUTE, AcpiPsGetOpcodeName (WalkState->Opcode), - WalkState->NumOperands, "after ExResolveOperands"); - - /* - * Dispatch the request to the appropriate interpreter handler - * routine. There is one routine per opcode "type" based upon the - * number of opcode arguments and return type. - */ - Status = AcpiGbl_OpTypeDispatch [OpType] (WalkState); - - - /* Delete argument objects and clear the operand stack */ + /* Always delete the argument objects and clear the operand stack */ for (i = 0; i < WalkState->NumOperands; i++) { /* - * Remove a reference to all operands, including both + * Remove a reference to all operands, including both * "Arguments" and "Targets". */ AcpiUtRemoveReference (WalkState->Operands[i]); WalkState->Operands[i] = NULL; } - WalkState->NumOperands = 0; /* @@ -600,10 +578,9 @@ AcpiDsExecEndOp ( } /* - * Since the operands will be passed to another - * control method, we must resolve all local - * references here (Local variables, arguments - * to *this* method, etc.) + * Since the operands will be passed to another control method, + * we must resolve all local references here (Local variables, + * arguments to *this* method, etc.) */ Status = AcpiDsResolveOperands (WalkState); if (ACPI_FAILURE (Status)) @@ -666,6 +643,7 @@ AcpiDsExecEndOp ( break; + case AML_TYPE_UNDEFINED: ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Undefined opcode type Op=%p\n", Op)); @@ -674,10 +652,13 @@ AcpiDsExecEndOp ( case AML_TYPE_BOGUS: - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Internal opcode=%X type Op=%p\n", + + ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, + "Internal opcode=%X type Op=%p\n", WalkState->Opcode, Op)); break; + default: ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, @@ -690,8 +671,8 @@ AcpiDsExecEndOp ( } /* - * ACPI 2.0 support for 64-bit integers: - * Truncate numeric result value if we are executing from a 32-bit ACPI table + * ACPI 2.0 support for 64-bit integers: Truncate numeric + * result value if we are executing from a 32-bit ACPI table */ AcpiExTruncateFor32bitTable (WalkState->ResultObj, WalkState); diff --git a/sys/contrib/dev/acpica/dswload.c b/sys/contrib/dev/acpica/dswload.c index 844aa01e5e08..c18e25132053 100644 --- a/sys/contrib/dev/acpica/dswload.c +++ b/sys/contrib/dev/acpica/dswload.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: dswload - Dispatcher namespace load callbacks - * $Revision: 50 $ + * $Revision: 54 $ * *****************************************************************************/ @@ -177,7 +177,6 @@ AcpiDsInitCallbacks ( } - /******************************************************************************* * * FUNCTION: AcpiDsLoad1BeginOp @@ -200,7 +199,7 @@ AcpiDsLoad1BeginOp ( ACPI_PARSE_OBJECT *Op; ACPI_NAMESPACE_NODE *Node; ACPI_STATUS Status; - ACPI_OBJECT_TYPE8 DataType; + ACPI_OBJECT_TYPE8 ObjectType; NATIVE_CHAR *Path; @@ -210,6 +209,11 @@ AcpiDsLoad1BeginOp ( ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p State=%p\n", Op, WalkState)); + if (Op && (Op->Opcode == AML_INT_NAMEDFIELD_OP)) + { + ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p State=%p\n", Op, WalkState)); + } + /* We are only interested in opcodes that have an associated name */ if (WalkState->Op) @@ -233,25 +237,17 @@ AcpiDsLoad1BeginOp ( /* Map the raw opcode into an internal object type */ - DataType = AcpiDsMapNamedOpcodeToDataType (WalkState->Opcode); - + ObjectType = WalkState->OpInfo->ObjectType; ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "State=%p Op=%p Type=%x\n", WalkState, Op, DataType)); - - - if (WalkState->Opcode == AML_SCOPE_OP) - { - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "State=%p Op=%p Type=%x\n", WalkState, Op, DataType)); - } + "State=%p Op=%p Type=%x\n", WalkState, Op, ObjectType)); /* * Enter the named type into the internal namespace. We enter the name * as we go downward in the parse tree. Any necessary subobjects that involve * arguments to the opcode must be created as we go back up the parse tree later. */ - Status = AcpiNsLookup (WalkState->ScopeInfo, Path, DataType, + Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType, IMODE_LOAD_PASS1, NS_NO_UPSEARCH, WalkState, &(Node)); if (ACPI_FAILURE (Status)) @@ -306,7 +302,7 @@ AcpiDsLoad1EndOp ( ACPI_WALK_STATE *WalkState) { ACPI_PARSE_OBJECT *Op; - ACPI_OBJECT_TYPE8 DataType; + ACPI_OBJECT_TYPE8 ObjectType; PROC_NAME ("DsLoad1EndOp"); @@ -317,34 +313,51 @@ AcpiDsLoad1EndOp ( /* We are only interested in opcodes that have an associated name */ - if (!(WalkState->OpInfo->Flags & AML_NAMED)) + if (!(WalkState->OpInfo->Flags & (AML_NAMED | AML_FIELD))) { return (AE_OK); } - /* Get the type to determine if we should pop the scope */ + /* Get the object type to determine if we should pop the scope */ - DataType = AcpiDsMapNamedOpcodeToDataType (Op->Opcode); + ObjectType = WalkState->OpInfo->ObjectType; + + if (WalkState->OpInfo->Flags & AML_FIELD) + { + if (WalkState->Opcode == AML_FIELD_OP || + WalkState->Opcode == AML_BANK_FIELD_OP || + WalkState->Opcode == AML_INDEX_FIELD_OP) + { + AcpiDsInitFieldObjects (Op, WalkState); + } + return (AE_OK); + } + + + if (Op->Opcode == AML_REGION_OP) + { + /*Status = */AcpiExCreateRegion (((ACPI_PARSE2_OBJECT *) Op)->Data, + ((ACPI_PARSE2_OBJECT *) Op)->Length, + (ACPI_ADR_SPACE_TYPE) ((Op->Value.Arg)->Value.Integer), WalkState); + } if (Op->Opcode == AML_NAME_OP) { - /* For Name opcode, check the argument */ + /* For Name opcode, get the object type from the argument */ if (Op->Value.Arg) { - DataType = AcpiDsMapOpcodeToDataType ( - (Op->Value.Arg)->Opcode, NULL); - ((ACPI_NAMESPACE_NODE *)Op->Node)->Type = - (UINT8) DataType; + ObjectType = (AcpiPsGetOpcodeInfo ((Op->Value.Arg)->Opcode))->ObjectType; + Op->Node->Type = (UINT8) ObjectType; } } /* Pop the scope stack */ - if (AcpiNsOpensScope (DataType)) + if (AcpiNsOpensScope (ObjectType)) { ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "(%s): Popping scope for Op %p\n", - AcpiUtGetTypeName (DataType), Op)); + AcpiUtGetTypeName (ObjectType), Op)); AcpiDsScopeStackPop (WalkState); } @@ -375,7 +388,7 @@ AcpiDsLoad2BeginOp ( ACPI_PARSE_OBJECT *Op; ACPI_NAMESPACE_NODE *Node; ACPI_STATUS Status; - ACPI_OBJECT_TYPE8 DataType; + ACPI_OBJECT_TYPE8 ObjectType; NATIVE_CHAR *BufferPtr; void *Original = NULL; @@ -433,10 +446,10 @@ AcpiDsLoad2BeginOp ( /* Map the raw opcode into an internal object type */ - DataType = AcpiDsMapNamedOpcodeToDataType (WalkState->Opcode); + ObjectType = WalkState->OpInfo->ObjectType; ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "State=%p Op=%p Type=%x\n", WalkState, Op, DataType)); + "State=%p Op=%p Type=%x\n", WalkState, Op, ObjectType)); if (WalkState->Opcode == AML_FIELD_OP || @@ -453,7 +466,7 @@ AcpiDsLoad2BeginOp ( * The NamePath is an object reference to an existing object. Don't enter the * name into the namespace, but look it up for use later */ - Status = AcpiNsLookup (WalkState->ScopeInfo, BufferPtr, DataType, + Status = AcpiNsLookup (WalkState->ScopeInfo, BufferPtr, ObjectType, IMODE_EXECUTE, NS_SEARCH_PARENT, WalkState, &(Node)); } @@ -464,9 +477,9 @@ AcpiDsLoad2BeginOp ( Original = Op->Node; Node = Op->Node; - if (AcpiNsOpensScope (DataType)) + if (AcpiNsOpensScope (ObjectType)) { - Status = AcpiDsScopeStackPush (Node, DataType, WalkState); + Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState); if (ACPI_FAILURE (Status)) { return (Status); @@ -481,7 +494,7 @@ AcpiDsLoad2BeginOp ( * as we go downward in the parse tree. Any necessary subobjects that involve * arguments to the opcode must be created as we go back up the parse tree later. */ - Status = AcpiNsLookup (WalkState->ScopeInfo, BufferPtr, DataType, + Status = AcpiNsLookup (WalkState->ScopeInfo, BufferPtr, ObjectType, IMODE_EXECUTE, NS_NO_UPSEARCH, WalkState, &(Node)); } @@ -546,7 +559,7 @@ AcpiDsLoad2EndOp ( { ACPI_PARSE_OBJECT *Op; ACPI_STATUS Status = AE_OK; - ACPI_OBJECT_TYPE8 DataType; + ACPI_OBJECT_TYPE8 ObjectType; ACPI_NAMESPACE_NODE *Node; ACPI_PARSE_OBJECT *Arg; ACPI_NAMESPACE_NODE *NewNode; @@ -580,7 +593,7 @@ AcpiDsLoad2EndOp ( } - DataType = AcpiDsMapNamedOpcodeToDataType (Op->Opcode); + ObjectType = WalkState->OpInfo->ObjectType; /* * Get the Node/name from the earlier lookup @@ -597,11 +610,10 @@ AcpiDsLoad2EndOp ( /* Pop the scope stack */ - if (AcpiNsOpensScope (DataType)) + if (AcpiNsOpensScope (ObjectType)) { - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "(%s) Popping scope for Op %p\n", - AcpiUtGetTypeName (DataType), Op)); + AcpiUtGetTypeName (ObjectType), Op)); AcpiDsScopeStackPop (WalkState); } @@ -655,7 +667,6 @@ AcpiDsLoad2EndOp ( case AML_TYPE_NAMED_FIELD: - Arg = Op->Value.Arg; switch (Op->Opcode) { case AML_INDEX_FIELD_OP: @@ -664,13 +675,11 @@ AcpiDsLoad2EndOp ( WalkState); break; - case AML_BANK_FIELD_OP: Status = AcpiDsCreateBankField (Op, Arg->Node, WalkState); break; - case AML_FIELD_OP: Status = AcpiDsCreateField (Op, Arg->Node, WalkState); @@ -694,25 +703,21 @@ AcpiDsLoad2EndOp ( Status = AcpiExCreateProcessor (WalkState); break; - case AML_POWER_RES_OP: Status = AcpiExCreatePowerResource (WalkState); break; - case AML_MUTEX_OP: Status = AcpiExCreateMutex (WalkState); break; - case AML_EVENT_OP: Status = AcpiExCreateEvent (WalkState); break; - case AML_DATA_REGION_OP: Status = AcpiExCreateTableRegion (WalkState); @@ -748,13 +753,13 @@ AcpiDsLoad2EndOp ( { case AML_METHOD_OP: /* - * MethodOp PkgLength NamesString MethodFlags TermList + * MethodOp PkgLength NameString MethodFlags TermList */ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "LOADING-Method: State=%p Op=%p NamedObj=%p\n", WalkState, Op, Node)); - if (!Node->Object) + if (!AcpiNsGetAttachedObject (Node)) { Status = AcpiDsCreateOperands (WalkState, Arg); if (ACPI_FAILURE (Status)) @@ -774,9 +779,23 @@ AcpiDsLoad2EndOp ( * The OpRegion is not fully parsed at this time. Only valid argument is the SpaceId. * (We must save the address of the AML of the address and length operands) */ - Status = AcpiExCreateRegion (((ACPI_PARSE2_OBJECT *) Op)->Data, - ((ACPI_PARSE2_OBJECT *) Op)->Length, - (ACPI_ADR_SPACE_TYPE) Arg->Value.Integer, WalkState); + /* + * If we have a valid region, initialize it + * Namespace is NOT locked at this point. + */ + Status = AcpiEvInitializeRegion (AcpiNsGetAttachedObject (Node), FALSE); + if (ACPI_FAILURE (Status)) + { + /* + * If AE_NOT_EXIST is returned, it is not fatal + * because many regions get created before a handler + * is installed for said region. + */ + if (AE_NOT_EXIST == Status) + { + Status = AE_OK; + } + } break; @@ -809,10 +828,14 @@ AcpiDsLoad2EndOp ( WalkState, &(NewNode)); if (ACPI_SUCCESS (Status)) { - /* TBD: has name already been resolved by here ??*/ - - /* TBD: [Restructure] Make sure that what we found is indeed a method! */ - /* We didn't search for a method on purpose, to see if the name would resolve! */ + /* + * Make sure that what we found is indeed a method + * We didn't search for a method on purpose, to see if the name would resolve + */ + if (NewNode->Type != ACPI_TYPE_METHOD) + { + Status = AE_AML_OPERAND_TYPE; + } /* We could put the returned object (Node) on the object stack for later, but * for now, we will put it in the "op" object that the parser uses, so we diff --git a/sys/contrib/dev/acpica/dswstate.c b/sys/contrib/dev/acpica/dswstate.c index 321e2bb29b21..0de7fa336a73 100644 --- a/sys/contrib/dev/acpica/dswstate.c +++ b/sys/contrib/dev/acpica/dswstate.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: dswstate - Dispatcher parse tree walk management routines - * $Revision: 54 $ + * $Revision: 57 $ * *****************************************************************************/ @@ -828,32 +828,33 @@ AcpiDsObjStackGetValue ( * * FUNCTION: AcpiDsGetCurrentWalkState * - * PARAMETERS: WalkList - Get current active state for this walk list + * PARAMETERS: Thread - Get current active state for this Thread * * RETURN: Pointer to the current walk state * * DESCRIPTION: Get the walk state that is at the head of the list (the "current" - * walk state. + * walk state.) * ******************************************************************************/ ACPI_WALK_STATE * AcpiDsGetCurrentWalkState ( - ACPI_WALK_LIST *WalkList) + ACPI_THREAD_STATE *Thread) { PROC_NAME ("DsGetCurrentWalkState"); - ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "DsGetCurrentWalkState, =%p\n", - WalkList->WalkState)); - - if (!WalkList) + if (!Thread) { return (NULL); } - return (WalkList->WalkState); + ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "DsGetCurrentWalkState, =%p\n", + Thread->WalkStateList)); + + + return (Thread->WalkStateList); } @@ -873,13 +874,13 @@ AcpiDsGetCurrentWalkState ( void AcpiDsPushWalkState ( ACPI_WALK_STATE *WalkState, - ACPI_WALK_LIST *WalkList) + ACPI_THREAD_STATE *Thread) { FUNCTION_TRACE ("DsPushWalkState"); - WalkState->Next = WalkList->WalkState; - WalkList->WalkState = WalkState; + WalkState->Next = Thread->WalkStateList; + Thread->WalkStateList = WalkState; return_VOID; } @@ -901,7 +902,7 @@ AcpiDsPushWalkState ( ACPI_WALK_STATE * AcpiDsPopWalkState ( - ACPI_WALK_LIST *WalkList) + ACPI_THREAD_STATE *Thread) { ACPI_WALK_STATE *WalkState; @@ -909,18 +910,18 @@ AcpiDsPopWalkState ( FUNCTION_TRACE ("DsPopWalkState"); - WalkState = WalkList->WalkState; + WalkState = Thread->WalkStateList; if (WalkState) { /* Next walk state becomes the current walk state */ - WalkList->WalkState = WalkState->Next; + Thread->WalkStateList = WalkState->Next; /* * Don't clear the NEXT field, this serves as an indicator * that there is a parent WALK STATE - * WalkState->Next = NULL; + * NO: WalkState->Next = NULL; */ } @@ -933,12 +934,12 @@ AcpiDsPopWalkState ( * FUNCTION: AcpiDsCreateWalkState * * PARAMETERS: Origin - Starting point for this walk - * WalkList - Owning walk list + * Thread - Current thread state * * RETURN: Pointer to the new walk state. * - * DESCRIPTION: Allocate and initialize a new walk state. The current walk state - * is set to this new state. + * DESCRIPTION: Allocate and initialize a new walk state. The current walk + * state is set to this new state. * ******************************************************************************/ @@ -947,7 +948,7 @@ AcpiDsCreateWalkState ( ACPI_OWNER_ID OwnerId, ACPI_PARSE_OBJECT *Origin, ACPI_OPERAND_OBJECT *MthDesc, - ACPI_WALK_LIST *WalkList) + ACPI_THREAD_STATE *Thread) { ACPI_WALK_STATE *WalkState; ACPI_STATUS Status; @@ -966,7 +967,7 @@ AcpiDsCreateWalkState ( WalkState->OwnerId = OwnerId; WalkState->Origin = Origin; WalkState->MethodDesc = MthDesc; - WalkState->WalkList = WalkList; + WalkState->Thread = Thread; /* Init the method args/local */ @@ -984,9 +985,9 @@ AcpiDsCreateWalkState ( /* Put the new state at the head of the walk list */ - if (WalkList) + if (Thread) { - AcpiDsPushWalkState (WalkState, WalkList); + AcpiDsPushWalkState (WalkState, Thread); } return_PTR (WalkState); @@ -1030,7 +1031,6 @@ AcpiDsInitAmlWalk ( WalkState->ParserState.PkgEnd = AmlStart + AmlLength; /* The NextOp of the NextWalk will be the beginning of the method */ - /* TBD: [Restructure] -- obsolete? */ WalkState->NextOp = NULL; WalkState->Params = Params; @@ -1062,7 +1062,7 @@ AcpiDsInitAmlWalk ( AcpiDsMethodDataInitArgs (Params, MTH_NUM_ARGS, WalkState); } - + else { /* Setup the current scope */ @@ -1088,7 +1088,6 @@ AcpiDsInitAmlWalk ( #endif - /******************************************************************************* * * FUNCTION: AcpiDsDeleteWalkState diff --git a/sys/contrib/dev/acpica/evevent.c b/sys/contrib/dev/acpica/evevent.c index fc5226884f7c..20c9953d2cc4 100644 --- a/sys/contrib/dev/acpica/evevent.c +++ b/sys/contrib/dev/acpica/evevent.c @@ -2,7 +2,7 @@ * * Module Name: evevent - Fixed and General Purpose AcpiEvent * handling and dispatch - * $Revision: 51 $ + * $Revision: 54 $ * *****************************************************************************/ @@ -156,18 +156,6 @@ AcpiEvInitialize ( return_ACPI_STATUS (AE_NO_ACPI_TABLES); } - - /* Make sure the BIOS supports ACPI mode */ - - if (SYS_MODE_LEGACY == AcpiHwGetModeCapabilities()) - { - ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "ACPI Mode is not supported!\n")); - return_ACPI_STATUS (AE_ERROR); - } - - - AcpiGbl_OriginalMode = AcpiHwGetMode(); - /* * Initialize the Fixed and General Purpose AcpiEvents prior. This is * done prior to enabling SCIs to prevent interrupts from occuring @@ -196,7 +184,6 @@ AcpiEvInitialize ( return_ACPI_STATUS (Status); } - /* Install handlers for control method GPE handlers (_Lxx, _Exx) */ Status = AcpiEvInitGpeControlMethods (); @@ -215,7 +202,6 @@ AcpiEvInitialize ( return_ACPI_STATUS (Status); } - return_ACPI_STATUS (Status); } @@ -235,7 +221,8 @@ AcpiEvInitialize ( ACPI_STATUS AcpiEvFixedEventInitialize(void) { - int i = 0; + NATIVE_UINT i; + /* Initialize the structure that keeps track of fixed event handlers */ @@ -289,8 +276,7 @@ AcpiEvFixedEventDetect (void) "Fixed AcpiEvent Block: Enable %08X Status %08X\n", EnableRegister, StatusRegister)); - - /* power management timer roll over */ + /* Power management timer roll over */ if ((StatusRegister & ACPI_STATUS_PMTIMER) && (EnableRegister & ACPI_ENABLE_PMTIMER)) @@ -298,7 +284,7 @@ AcpiEvFixedEventDetect (void) IntStatus |= AcpiEvFixedEventDispatch (ACPI_EVENT_PMTIMER); } - /* global event (BIOS wants the global lock) */ + /* Global event (BIOS wants the global lock) */ if ((StatusRegister & ACPI_STATUS_GLOBAL) && (EnableRegister & ACPI_ENABLE_GLOBAL)) @@ -306,7 +292,7 @@ AcpiEvFixedEventDetect (void) IntStatus |= AcpiEvFixedEventDispatch (ACPI_EVENT_GLOBAL); } - /* power button event */ + /* Power button event */ if ((StatusRegister & ACPI_STATUS_POWER_BUTTON) && (EnableRegister & ACPI_ENABLE_POWER_BUTTON)) @@ -314,7 +300,7 @@ AcpiEvFixedEventDetect (void) IntStatus |= AcpiEvFixedEventDispatch (ACPI_EVENT_POWER_BUTTON); } - /* sleep button event */ + /* Sleep button event */ if ((StatusRegister & ACPI_STATUS_SLEEP_BUTTON) && (EnableRegister & ACPI_ENABLE_SLEEP_BUTTON)) @@ -654,7 +640,6 @@ AcpiEvSaveMethodInfo ( AcpiGbl_GpeInfo [GpeNumber].Type = Type; AcpiGbl_GpeInfo [GpeNumber].MethodHandle = ObjHandle; - /* * Enable the GPE (SCIs should be disabled at this point) */ @@ -811,6 +796,7 @@ AcpiEvAsynchExecuteGpeMethod ( FUNCTION_TRACE ("EvAsynchExecuteGpeMethod"); + /* * Take a snapshot of the GPE info for this level */ diff --git a/sys/contrib/dev/acpica/evmisc.c b/sys/contrib/dev/acpica/evmisc.c index b1010f315046..7e1ecda6e4ef 100644 --- a/sys/contrib/dev/acpica/evmisc.c +++ b/sys/contrib/dev/acpica/evmisc.c @@ -2,7 +2,7 @@ * * Module Name: evmisc - ACPI device notification handler dispatch * and ACPI Global Lock support - * $Revision: 35 $ + * $Revision: 36 $ * *****************************************************************************/ @@ -220,7 +220,6 @@ AcpiEvQueueNotifyRequest ( } } - /* If there is any handler to run, schedule the dispatcher */ if ((AcpiGbl_SysNotify.Handler && (NotifyValue <= MAX_SYS_NOTIFY)) || @@ -298,7 +297,6 @@ AcpiEvNotifyDispatch ( GlobalContext = AcpiGbl_SysNotify.Context; } } - else { /* Global driver notification handler */ @@ -310,7 +308,6 @@ AcpiEvNotifyDispatch ( } } - /* Invoke the system handler first, if present */ if (GlobalHandler) @@ -476,7 +473,6 @@ AcpiEvAcquireGlobalLock(void) AcpiGbl_GlobalLockThreadCount++; - /* If we (OS side) have the hardware lock already, we are done */ if (AcpiGbl_GlobalLockAcquired) @@ -491,7 +487,6 @@ AcpiEvAcquireGlobalLock(void) return_ACPI_STATUS (AE_OK); } - /* We must acquire the actual hardware lock */ GlobalLock = AcpiGbl_FACS->GlobalLock; @@ -506,7 +501,6 @@ AcpiEvAcquireGlobalLock(void) return_ACPI_STATUS (AE_OK); } - /* * Did not get the lock. The pending bit was set above, and we must now * wait until we get the global lock released interrupt. diff --git a/sys/contrib/dev/acpica/evregion.c b/sys/contrib/dev/acpica/evregion.c index f0e35b2d5e64..544e7fb9410d 100644 --- a/sys/contrib/dev/acpica/evregion.c +++ b/sys/contrib/dev/acpica/evregion.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: evregion - ACPI AddressSpace (OpRegion) handler dispatch - * $Revision: 113 $ + * $Revision: 120 $ * *****************************************************************************/ @@ -161,14 +161,14 @@ AcpiEvInstallDefaultAddressSpaceHandlers ( * space must be always available -- even though we are nowhere * near ready to find the PCI root buses at this point. * - * NOTE: We ignore AE_EXIST because this means that a handler has - * already been installed (via AcpiInstallAddressSpaceHandler) + * NOTE: We ignore AE_ALREADY_EXISTS because this means that a handler + * has already been installed (via AcpiInstallAddressSpaceHandler) */ Status = AcpiInstallAddressSpaceHandler (AcpiGbl_RootNode, ACPI_ADR_SPACE_SYSTEM_MEMORY, ACPI_DEFAULT_HANDLER, NULL, NULL); if ((ACPI_FAILURE (Status)) && - (Status != AE_EXIST)) + (Status != AE_ALREADY_EXISTS)) { return_ACPI_STATUS (Status); } @@ -177,7 +177,7 @@ AcpiEvInstallDefaultAddressSpaceHandlers ( ACPI_ADR_SPACE_SYSTEM_IO, ACPI_DEFAULT_HANDLER, NULL, NULL); if ((ACPI_FAILURE (Status)) && - (Status != AE_EXIST)) + (Status != AE_ALREADY_EXISTS)) { return_ACPI_STATUS (Status); } @@ -186,7 +186,7 @@ AcpiEvInstallDefaultAddressSpaceHandlers ( ACPI_ADR_SPACE_PCI_CONFIG, ACPI_DEFAULT_HANDLER, NULL, NULL); if ((ACPI_FAILURE (Status)) && - (Status != AE_EXIST)) + (Status != AE_ALREADY_EXISTS)) { return_ACPI_STATUS (Status); } @@ -196,8 +196,6 @@ AcpiEvInstallDefaultAddressSpaceHandlers ( } -/* TBD: [Restructure] Move elsewhere */ - /******************************************************************************* * * FUNCTION: AcpiEvExecuteRegMethod @@ -217,13 +215,20 @@ AcpiEvExecuteRegMethod ( UINT32 Function) { ACPI_OPERAND_OBJECT *Params[3]; + ACPI_OPERAND_OBJECT *RegionObj2; ACPI_STATUS Status; FUNCTION_TRACE ("EvExecuteRegMethod"); - if (RegionObj->Region.Extra->Extra.Method_REG == NULL) + RegionObj2 = AcpiNsGetSecondaryObject (RegionObj); + if (!RegionObj2) + { + return_ACPI_STATUS (AE_NOT_EXIST); + } + + if (RegionObj2->Extra.Method_REG == NULL) { return_ACPI_STATUS (AE_OK); } @@ -260,8 +265,8 @@ AcpiEvExecuteRegMethod ( /* * Execute the method, no return value */ - DEBUG_EXEC(AcpiUtDisplayInitPathname (RegionObj->Region.Extra->Extra.Method_REG, " [Method]")); - Status = AcpiNsEvaluateByHandle (RegionObj->Region.Extra->Extra.Method_REG, Params, NULL); + DEBUG_EXEC(AcpiUtDisplayInitPathname (RegionObj2->Extra.Method_REG, " [Method]")); + Status = AcpiNsEvaluateByHandle (RegionObj2->Extra.Method_REG, Params, NULL); AcpiUtRemoveReference (Params[1]); @@ -280,7 +285,7 @@ Cleanup: * 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, or 32) + * BitWidth - Field width in bits (8, 16, 32, or 64) * Value - Pointer to in or out value * * RETURN: Status @@ -296,18 +301,25 @@ AcpiEvAddressSpaceDispatch ( UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 BitWidth, - UINT32 *Value) + ACPI_INTEGER *Value) { ACPI_STATUS Status; ACPI_ADR_SPACE_HANDLER Handler; ACPI_ADR_SPACE_SETUP RegionSetup; ACPI_OPERAND_OBJECT *HandlerDesc; + ACPI_OPERAND_OBJECT *RegionObj2; void *RegionContext = NULL; FUNCTION_TRACE ("EvAddressSpaceDispatch"); + RegionObj2 = AcpiNsGetSecondaryObject (RegionObj); + if (!RegionObj2) + { + return_ACPI_STATUS (AE_NOT_EXIST); + } + /* * Ensure that there is a handler associated with this region */ @@ -317,14 +329,14 @@ AcpiEvAddressSpaceDispatch ( ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "no handler for region(%p) [%s]\n", RegionObj, AcpiUtGetRegionName (RegionObj->Region.SpaceId))); - return_ACPI_STATUS(AE_NOT_EXIST); + return_ACPI_STATUS (AE_NOT_EXIST); } /* * It may be the case that the region has never been initialized * Some types of regions require special init code */ - if (!(RegionObj->Region.Flags & AOPOBJ_INITIALIZED)) + if (!(RegionObj->Region.Flags & AOPOBJ_SETUP_COMPLETE)) { /* * This region has not been initialized yet, do it @@ -361,16 +373,16 @@ AcpiEvAddressSpaceDispatch ( ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Region Init: %s [%s]\n", AcpiFormatException (Status), AcpiUtGetRegionName (RegionObj->Region.SpaceId))); - return_ACPI_STATUS(Status); + return_ACPI_STATUS (Status); } - RegionObj->Region.Flags |= AOPOBJ_INITIALIZED; + RegionObj->Region.Flags |= AOPOBJ_SETUP_COMPLETE; /* * Save the returned context for use in all accesses to * this particular region. */ - RegionObj->Region.Extra->Extra.RegionContext = RegionContext; + RegionObj2->Extra.RegionContext = RegionContext; } /* @@ -398,7 +410,7 @@ AcpiEvAddressSpaceDispatch ( */ Status = Handler (Function, Address, BitWidth, Value, HandlerDesc->AddrHandler.Context, - RegionObj->Region.Extra->Extra.RegionContext); + RegionObj2->Extra.RegionContext); if (ACPI_FAILURE (Status)) { @@ -443,13 +455,19 @@ AcpiEvDisassociateRegionFromHandler( ACPI_OPERAND_OBJECT **LastObjPtr; ACPI_ADR_SPACE_SETUP RegionSetup; void *RegionContext; + ACPI_OPERAND_OBJECT *RegionObj2; ACPI_STATUS Status; FUNCTION_TRACE ("EvDisassociateRegionFromHandler"); - RegionContext = RegionObj->Region.Extra->Extra.RegionContext; + RegionObj2 = AcpiNsGetSecondaryObject (RegionObj); + if (!RegionObj2) + { + return; + } + RegionContext = RegionObj2->Extra.RegionContext; /* * Get the address handler from the region object @@ -518,7 +536,7 @@ AcpiEvDisassociateRegionFromHandler( AcpiUtGetRegionName (RegionObj->Region.SpaceId))); } - RegionObj->Region.Flags &= ~(AOPOBJ_INITIALIZED); + RegionObj->Region.Flags &= ~(AOPOBJ_SETUP_COMPLETE); /* * Remove handler reference in the region @@ -587,18 +605,19 @@ AcpiEvAssociateRegionAndHandler ( /* - * Link this region to the front of the handler's list + * Link this region to the front of the handler's list */ RegionObj->Region.Next = HandlerObj->AddrHandler.RegionList; HandlerObj->AddrHandler.RegionList = RegionObj; /* - * set the region's handler + * Set the region's handler */ RegionObj->Region.AddrHandler = HandlerObj; /* - * Last thing, tell all users that this region is usable + * Tell all users that this region is usable by running the _REG + * method */ if (AcpiNsIsLocked) { @@ -624,8 +643,8 @@ AcpiEvAssociateRegionAndHandler ( * Level - Nesting level of the handle * Context - Passed into AcpiNsWalkNamespace * - * DESCRIPTION: This routine checks to see if the object is a Region if it - * is then the address handler is installed in it. + * DESCRIPTION: This routine installs an address handler into objects that are + * of type Region. * * If the Object is a Device, and the device has a handler of * the same type then the search is terminated in that branch. diff --git a/sys/contrib/dev/acpica/evrgnini.c b/sys/contrib/dev/acpica/evrgnini.c index 17adfdd03e11..23e0c2b02e81 100644 --- a/sys/contrib/dev/acpica/evrgnini.c +++ b/sys/contrib/dev/acpica/evrgnini.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: evrgnini- ACPI AddressSpace (OpRegion) init - * $Revision: 48 $ + * $Revision: 51 $ * *****************************************************************************/ @@ -371,7 +371,6 @@ AcpiEvPciConfigRegionSetup ( } - /******************************************************************************* * * FUNCTION: AcpiEvPciBarRegionSetup @@ -507,6 +506,7 @@ AcpiEvInitializeRegion ( ACPI_STATUS Status; ACPI_NAMESPACE_NODE *MethodNode; ACPI_NAME *RegNamePtr = (ACPI_NAME *) METHOD_NAME__REG; + ACPI_OPERAND_OBJECT *RegionObj2; FUNCTION_TRACE_U32 ("EvInitializeRegion", AcpiNsLocked); @@ -517,12 +517,25 @@ AcpiEvInitializeRegion ( return_ACPI_STATUS (AE_BAD_PARAMETER); } + if (RegionObj->Common.Flags & AOPOBJ_OBJECT_INITIALIZED) + { + return_ACPI_STATUS (AE_OK); + } + + RegionObj2 = AcpiNsGetSecondaryObject (RegionObj); + if (!RegionObj2) + { + return_ACPI_STATUS (AE_NOT_EXIST); + } Node = AcpiNsGetParentObject (RegionObj->Region.Node); + + SpaceId = RegionObj->Region.SpaceId; RegionObj->Region.AddrHandler = NULL; - RegionObj->Region.Extra->Extra.Method_REG = NULL; - RegionObj->Region.Flags &= ~(AOPOBJ_INITIALIZED); + RegionObj2->Extra.Method_REG = NULL; + RegionObj->Common.Flags &= ~(AOPOBJ_SETUP_COMPLETE); + RegionObj->Common.Flags |= AOPOBJ_OBJECT_INITIALIZED; /* * Find any "_REG" associated with this region definition @@ -536,7 +549,7 @@ AcpiEvInitializeRegion ( * definition. This will be executed when the handler is attached * or removed */ - RegionObj->Region.Extra->Extra.Method_REG = MethodNode; + RegionObj2->Extra.Method_REG = MethodNode; } /* @@ -590,6 +603,7 @@ AcpiEvInitializeRegion ( */ AcpiEvAssociateRegionAndHandler (HandlerObj, RegionObj, AcpiNsLocked); + return_ACPI_STATUS (AE_OK); } diff --git a/sys/contrib/dev/acpica/evxface.c b/sys/contrib/dev/acpica/evxface.c index 1fa9432c26f3..42828ac26303 100644 --- a/sys/contrib/dev/acpica/evxface.c +++ b/sys/contrib/dev/acpica/evxface.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: evxface - External interfaces for ACPI events - * $Revision: 116 $ + * $Revision: 118 $ * *****************************************************************************/ @@ -169,7 +169,7 @@ AcpiInstallFixedEventHandler ( if (NULL != AcpiGbl_FixedEventHandlers[Event].Handler) { - Status = AE_EXIST; + Status = AE_ALREADY_EXISTS; goto Cleanup; } @@ -327,7 +327,7 @@ AcpiInstallNotifyHandler ( ((HandlerType == ACPI_DEVICE_NOTIFY) && AcpiGbl_DrvNotify.Handler)) { - Status = AE_EXIST; + Status = AE_ALREADY_EXISTS; goto UnlockAndExit; } @@ -352,7 +352,7 @@ AcpiInstallNotifyHandler ( * Caller will only receive notifications specific to the target object. * Note that only certain object types can receive notifications. */ - else + else { /* * These are the ONLY objects that can receive ACPI notifications @@ -379,7 +379,7 @@ AcpiInstallNotifyHandler ( ((HandlerType == ACPI_DEVICE_NOTIFY) && ObjDesc->Device.DrvHandler)) { - Status = AE_EXIST; + Status = AE_ALREADY_EXISTS; goto UnlockAndExit; } } @@ -488,7 +488,7 @@ AcpiRemoveNotifyHandler ( /* * Root Object */ - if (Device == ACPI_ROOT_OBJECT) + if (Device == ACPI_ROOT_OBJECT) { ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Removing notify handler for ROOT object.\n")); @@ -501,13 +501,13 @@ AcpiRemoveNotifyHandler ( goto UnlockAndExit; } - if (HandlerType == ACPI_SYSTEM_NOTIFY) + if (HandlerType == ACPI_SYSTEM_NOTIFY) { AcpiGbl_SysNotify.Node = NULL; AcpiGbl_SysNotify.Handler = NULL; AcpiGbl_SysNotify.Context = NULL; } - else + else { AcpiGbl_DrvNotify.Node = NULL; AcpiGbl_DrvNotify.Handler = NULL; @@ -518,7 +518,7 @@ AcpiRemoveNotifyHandler ( /* * All Other Objects */ - else + else { /* * These are the ONLY objects that can receive ACPI notifications @@ -630,7 +630,7 @@ AcpiInstallGpeHandler ( if (AcpiGbl_GpeInfo[GpeNumber].Handler) { - Status = AE_EXIST; + Status = AE_ALREADY_EXISTS; goto Cleanup; } diff --git a/sys/contrib/dev/acpica/evxfevnt.c b/sys/contrib/dev/acpica/evxfevnt.c index 9abf4eb54509..3e123eae3ecc 100644 --- a/sys/contrib/dev/acpica/evxfevnt.c +++ b/sys/contrib/dev/acpica/evxfevnt.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: evxfevnt - External Interfaces, ACPI event disable/enable - * $Revision: 38 $ + * $Revision: 42 $ * *****************************************************************************/ @@ -143,13 +143,13 @@ ACPI_STATUS AcpiEnable (void) { - ACPI_STATUS Status; + ACPI_STATUS Status = AE_OK; FUNCTION_TRACE ("AcpiEnable"); - /* Make sure we've got ACPI tables */ + /* Make sure we have ACPI tables */ if (!AcpiGbl_DSDT) { @@ -157,24 +157,26 @@ AcpiEnable (void) return_ACPI_STATUS (AE_NO_ACPI_TABLES); } - /* Make sure the BIOS supports ACPI mode */ + AcpiGbl_OriginalMode = AcpiHwGetMode (); - if (SYS_MODE_LEGACY == AcpiHwGetModeCapabilities()) + if (AcpiGbl_OriginalMode == SYS_MODE_ACPI) { - ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Only legacy mode supported!\n")); - return_ACPI_STATUS (AE_ERROR); + ACPI_DEBUG_PRINT ((ACPI_DB_OK, "Already in ACPI mode.\n")); } - /* Transition to ACPI mode */ - - Status = AcpiHwSetMode (SYS_MODE_ACPI); - if (ACPI_FAILURE (Status)) + else { - ACPI_DEBUG_PRINT ((ACPI_DB_FATAL, "Could not transition to ACPI mode.\n")); - return_ACPI_STATUS (Status); - } + /* Transition to ACPI mode */ - ACPI_DEBUG_PRINT ((ACPI_DB_OK, "Transition to ACPI mode successful\n")); + Status = AcpiHwSetMode (SYS_MODE_ACPI); + if (ACPI_FAILURE (Status)) + { + ACPI_DEBUG_PRINT ((ACPI_DB_FATAL, "Could not transition to ACPI mode.\n")); + return_ACPI_STATUS (Status); + } + + ACPI_DEBUG_PRINT ((ACPI_DB_OK, "Transition to ACPI mode successful\n")); + } return_ACPI_STATUS (Status); } @@ -196,19 +198,22 @@ AcpiEnable (void) ACPI_STATUS AcpiDisable (void) { - ACPI_STATUS Status; + ACPI_STATUS Status = AE_OK; FUNCTION_TRACE ("AcpiDisable"); - /* Restore original mode */ - - Status = AcpiHwSetMode (AcpiGbl_OriginalMode); - if (ACPI_FAILURE (Status)) + if (AcpiHwGetMode () != AcpiGbl_OriginalMode) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unable to transition to original mode")); - return_ACPI_STATUS (Status); + /* Restore original mode */ + + Status = AcpiHwSetMode (AcpiGbl_OriginalMode); + if (ACPI_FAILURE (Status)) + { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unable to transition to original mode")); + return_ACPI_STATUS (Status); + } } /* Unload the SCI interrupt handler */ diff --git a/sys/contrib/dev/acpica/evxfregn.c b/sys/contrib/dev/acpica/evxfregn.c index 6e93229ca0d9..5b8e728737c7 100644 --- a/sys/contrib/dev/acpica/evxfregn.c +++ b/sys/contrib/dev/acpica/evxfregn.c @@ -2,7 +2,7 @@ * * Module Name: evxfregn - External Interfaces, ACPI Operation Regions and * Address Spaces. - * $Revision: 40 $ + * $Revision: 41 $ * *****************************************************************************/ @@ -265,7 +265,7 @@ AcpiInstallAddressSpaceHandler ( */ if(HandlerObj->AddrHandler.SpaceId == SpaceId) { - Status = AE_EXIST; + Status = AE_ALREADY_EXISTS; goto UnlockAndExit; } diff --git a/sys/contrib/dev/acpica/exconfig.c b/sys/contrib/dev/acpica/exconfig.c index ec9b92374370..f8c1a1c8978d 100644 --- a/sys/contrib/dev/acpica/exconfig.c +++ b/sys/contrib/dev/acpica/exconfig.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: exconfig - Namespace reconfiguration (Load/Unload opcodes) - * $Revision: 44 $ + * $Revision: 47 $ * *****************************************************************************/ @@ -160,7 +160,9 @@ AcpiExLoadOp ( FUNCTION_TRACE ("ExLoadOp"); - /* TBD: [Unhandled] Object can be either a field or an opregion */ + /* Object can be either a field or an opregion */ + + /* TBD: Handle field vs. Opregion *? /* Get the table header */ @@ -168,9 +170,9 @@ AcpiExLoadOp ( TableHeader.Length = 0; for (i = 0; i < sizeof (ACPI_TABLE_HEADER); i++) { - Status = AcpiEvAddressSpaceDispatch (RgnDesc, ACPI_READ_ADR_SPACE, + Status = AcpiEvAddressSpaceDispatch (RgnDesc, ACPI_READ, (ACPI_PHYSICAL_ADDRESS) i, 8, - (UINT32 *) ((UINT8 *) &TableHeader + i)); + (ACPI_INTEGER *) ((UINT8 *) &TableHeader + i)); if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); @@ -195,16 +197,15 @@ AcpiExLoadOp ( for (i = 0; i < TableHeader.Length; i++) { - Status = AcpiEvAddressSpaceDispatch (RgnDesc, ACPI_READ_ADR_SPACE, + Status = AcpiEvAddressSpaceDispatch (RgnDesc, ACPI_READ, (ACPI_PHYSICAL_ADDRESS) i, 8, - (UINT32 *) (TableDataPtr + i)); + (ACPI_INTEGER *) (TableDataPtr + i)); if (ACPI_FAILURE (Status)) { goto Cleanup; } } - /* Table must be either an SSDT or a PSDT */ if ((!STRNCMP (TableHeader.Signature, @@ -230,7 +231,6 @@ AcpiExLoadOp ( goto Cleanup; } - /* Install the new table into the local data structures */ TableInfo.Pointer = (ACPI_TABLE_HEADER *) TablePtr; @@ -246,27 +246,24 @@ AcpiExLoadOp ( /* Add the table to the namespace */ - /* TBD: [Restructure] - change to whatever new interface is appropriate */ -/* - Status = AcpiLoadNamespace (); + Status = AcpiNsLoadTable (TableInfo.InstalledDesc, AcpiGbl_RootNode); if (ACPI_FAILURE (Status)) { -*/ - /* TBD: [Errors] Unload the table on failure ? */ -/* + /* Uninstall table and free the buffer */ + + AcpiTbUninstallTable (TableInfo.InstalledDesc); goto Cleanup; } -*/ - /* TBD: [Investigate] we need a pointer to the table desc */ + /* We need a pointer to the table desc */ /* Init the table handle */ TableDesc->Reference.Opcode = AML_LOAD_OP; TableDesc->Reference.Object = TableInfo.InstalledDesc; - /* TBD: store the tabledesc into the DdbHandle target */ + /* Store the tabledesc into the DdbHandle target */ /* DdbHandle = TableDesc; */ return_ACPI_STATUS (Status); diff --git a/sys/contrib/dev/acpica/excreate.c b/sys/contrib/dev/acpica/excreate.c index 0a86f6d2ed6f..0410fe5b7488 100644 --- a/sys/contrib/dev/acpica/excreate.c +++ b/sys/contrib/dev/acpica/excreate.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: excreate - Named object creation - * $Revision: 71 $ + * $Revision: 79 $ * *****************************************************************************/ @@ -130,7 +130,6 @@ MODULE_NAME ("excreate") - /***************************************************************************** * * FUNCTION: AcpiExCreateAlias @@ -162,8 +161,8 @@ AcpiExCreateAlias ( /* Attach the original source object to the new Alias Node */ - Status = AcpiNsAttachObject ((ACPI_NAMESPACE_NODE *) WalkState->Operands[0], - SourceNode->Object, + Status = AcpiNsAttachObject ((ACPI_NAMESPACE_NODE *) WalkState->Operands[0], + AcpiNsGetAttachedObject (SourceNode), SourceNode->Type); /* @@ -209,11 +208,11 @@ AcpiExCreateEvent ( goto Cleanup; } - /* Create the actual OS semaphore */ - - /* TBD: [Investigate] should be created with 0 or 1 units? */ - - Status = AcpiOsCreateSemaphore (ACPI_NO_UNIT_LIMIT, 1, + /* + * Create the actual OS semaphore, with zero initial units -- meaning + * that the event is created in an unsignalled state + */ + Status = AcpiOsCreateSemaphore (ACPI_NO_UNIT_LIMIT, 0, &ObjDesc->Event.Semaphore); if (ACPI_FAILURE (Status)) { @@ -226,7 +225,7 @@ AcpiExCreateEvent ( ObjDesc, (UINT8) ACPI_TYPE_EVENT); Cleanup: - /* + /* * Remove local reference to the object (on error, will cause deletion * of both object and semaphore if present.) */ @@ -269,8 +268,11 @@ AcpiExCreateMutex ( goto Cleanup; } - /* Create the actual OS semaphore */ - + /* + * Create the actual OS semaphore. + * One unit max to make it a mutex, with one initial unit to allow + * the mutex to be acquired. + */ Status = AcpiOsCreateSemaphore (1, 1, &ObjDesc->Mutex.Semaphore); if (ACPI_FAILURE (Status)) { @@ -286,7 +288,7 @@ AcpiExCreateMutex ( Cleanup: - /* + /* * Remove local reference to the object (on error, will cause deletion * of both object and semaphore if present.) */ @@ -320,6 +322,7 @@ AcpiExCreateRegion ( ACPI_STATUS Status; ACPI_OPERAND_OBJECT *ObjDesc; ACPI_NAMESPACE_NODE *Node; + ACPI_OPERAND_OBJECT *RegionObj2 = NULL; FUNCTION_TRACE ("ExCreateRegion"); @@ -327,13 +330,13 @@ AcpiExCreateRegion ( /* Get the Node from the object stack */ - Node = (ACPI_NAMESPACE_NODE *) WalkState->Operands[0]; + Node = WalkState->Op->Node; /* * If the region object is already attached to this node, * just return */ - if (Node->Object) + if (AcpiNsGetAttachedObject (Node)) { return_ACPI_STATUS (AE_OK); } @@ -342,8 +345,8 @@ AcpiExCreateRegion ( * Space ID must be one of the predefined IDs, or in the user-defined * range */ - if ((RegionSpace >= NUM_REGION_TYPES) && - (RegionSpace < USER_REGION_BEGIN)) + if ((RegionSpace >= ACPI_NUM_PREDEFINED_REGIONS) && + (RegionSpace < ACPI_USER_REGION_BEGIN)) { REPORT_ERROR (("Invalid AddressSpace type %X\n", RegionSpace)); return_ACPI_STATUS (AE_AML_INVALID_SPACE_ID); @@ -362,22 +365,13 @@ AcpiExCreateRegion ( goto Cleanup; } - /* Allocate a method object for this region */ - - ObjDesc->Region.Extra = AcpiUtCreateInternalObject ( - INTERNAL_TYPE_EXTRA); - if (!ObjDesc->Region.Extra) - { - Status = AE_NO_MEMORY; - goto Cleanup; - } - /* * Remember location in AML stream of address & length * operands since they need to be evaluated at run time. */ - ObjDesc->Region.Extra->Extra.AmlStart = AmlStart; - ObjDesc->Region.Extra->Extra.AmlLength = AmlLength; + RegionObj2 = ObjDesc->Common.NextObject; + RegionObj2->Extra.AmlStart = AmlStart; + RegionObj2->Extra.AmlLength = AmlLength; /* Init the region from the operands */ @@ -388,37 +382,14 @@ AcpiExCreateRegion ( /* Install the new region object in the parent Node */ - Status = AcpiNsAttachObject (Node, ObjDesc, - (UINT8) ACPI_TYPE_REGION); - if (ACPI_FAILURE (Status)) - { - goto Cleanup; - } + Status = AcpiNsAttachObject (Node, ObjDesc, (UINT8) ACPI_TYPE_REGION); - /* - * If we have a valid region, initialize it - * Namespace is NOT locked at this point. - */ - Status = AcpiEvInitializeRegion (ObjDesc, FALSE); - if (ACPI_FAILURE (Status)) - { - /* - * If AE_NOT_EXIST is returned, it is not fatal - * because many regions get created before a handler - * is installed for said region. - */ - if (AE_NOT_EXIST == Status) - { - Status = AE_OK; - } - } Cleanup: /* Remove local reference to the object */ AcpiUtRemoveReference (ObjDesc); - return_ACPI_STATUS (Status); } @@ -506,7 +477,7 @@ AcpiExCreateProcessor ( /* Install the processor object in the parent Node */ - Status = AcpiNsAttachObject ((ACPI_NAMESPACE_NODE *) Operand[0], + Status = AcpiNsAttachObject ((ACPI_NAMESPACE_NODE *) Operand[0], ObjDesc, (UINT8) ACPI_TYPE_PROCESSOR); @@ -560,7 +531,7 @@ AcpiExCreatePowerResource ( /* Install the power resource object in the parent Node */ - Status = AcpiNsAttachObject ((ACPI_NAMESPACE_NODE *) Operand[0], + Status = AcpiNsAttachObject ((ACPI_NAMESPACE_NODE *) Operand[0], ObjDesc, (UINT8) ACPI_TYPE_POWER); @@ -642,7 +613,7 @@ AcpiExCreateMethod ( /* Attach the new object to the method Node */ - Status = AcpiNsAttachObject ((ACPI_NAMESPACE_NODE *) Operand[0], + Status = AcpiNsAttachObject ((ACPI_NAMESPACE_NODE *) Operand[0], ObjDesc, (UINT8) ACPI_TYPE_METHOD); /* Remove local reference to the object */ diff --git a/sys/contrib/dev/acpica/exdump.c b/sys/contrib/dev/acpica/exdump.c index 63ea2681c8c9..6b0a455628df 100644 --- a/sys/contrib/dev/acpica/exdump.c +++ b/sys/contrib/dev/acpica/exdump.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: exdump - Interpreter debug output routines - * $Revision: 126 $ + * $Revision: 138 $ * *****************************************************************************/ @@ -164,9 +164,15 @@ AcpiExShowHexValue ( FUNCTION_TRACE ("ExShowHexValue"); + if (!((ACPI_LV_LOAD & AcpiDbgLevel) && (_COMPONENT & AcpiDbgLayer))) + { + return; + } + if (!AmlStart) { REPORT_ERROR (("ExShowHexValue: null pointer\n")); + return; } /* @@ -194,30 +200,29 @@ AcpiExShowHexValue ( for (Length = LeadSpace; Length; --Length ) { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_LOAD, " ")); + AcpiOsPrintf (" "); } while (ByteCount--) { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_LOAD, "%02x", *AmlStart++)); - + AcpiOsPrintf ("%02x", *AmlStart++); if (ByteCount) { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_LOAD, " ")); + AcpiOsPrintf (" "); } } if (ShowDecimalValue) { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_LOAD, " [%d]", Value)); + AcpiOsPrintf (" [%d]", Value); } if (0 == LeadSpace) { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_LOAD, " ")); + AcpiOsPrintf (" "); } - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_LOAD, "\n")); + AcpiOsPrintf ("\n"); return_VOID; } @@ -246,6 +251,11 @@ AcpiExDumpOperand ( PROC_NAME ("ExDumpOperand") + if (!((ACPI_LV_INFO & AcpiDbgLevel) && (_COMPONENT & AcpiDbgLayer))) + { + return (AE_OK); + } + if (!EntryDesc) { /* @@ -283,31 +293,31 @@ AcpiExDumpOperand ( { case AML_ZERO_OP: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "Reference: Zero\n")); + AcpiOsPrintf ("Reference: Zero\n"); break; case AML_ONE_OP: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "Reference: One\n")); + AcpiOsPrintf ("Reference: One\n"); break; case AML_ONES_OP: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "Reference: Ones\n")); + AcpiOsPrintf ("Reference: Ones\n"); break; case AML_REVISION_OP: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "Reference: Revision\n")); + AcpiOsPrintf ("Reference: Revision\n"); break; case AML_DEBUG_OP: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "Reference: Debug\n")); + AcpiOsPrintf ("Reference: Debug\n"); break; @@ -321,59 +331,59 @@ AcpiExDumpOperand ( case AML_INDEX_OP: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "Reference: Index %p\n", - EntryDesc->Reference.Object)); + AcpiOsPrintf ("Reference: Index %p\n", + EntryDesc->Reference.Object); break; case AML_ARG_OP: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "Reference: Arg%d", - EntryDesc->Reference.Offset)); + AcpiOsPrintf ("Reference: Arg%d", + EntryDesc->Reference.Offset); if (ACPI_TYPE_INTEGER == EntryDesc->Common.Type) { /* Value is a Number */ - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, " value is [%8.8X%8.8x]", + AcpiOsPrintf (" value is [%8.8X%8.8x]", HIDWORD(EntryDesc->Integer.Value), - LODWORD(EntryDesc->Integer.Value))); + LODWORD(EntryDesc->Integer.Value)); } - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "\n")); + AcpiOsPrintf ("\n"); break; case AML_LOCAL_OP: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "Reference: Local%d", - EntryDesc->Reference.Offset)); + AcpiOsPrintf ("Reference: Local%d", + EntryDesc->Reference.Offset); if (ACPI_TYPE_INTEGER == EntryDesc->Common.Type) { /* Value is a Number */ - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, " value is [%8.8X%8.8x]", + AcpiOsPrintf (" value is [%8.8X%8.8x]", HIDWORD(EntryDesc->Integer.Value), - LODWORD(EntryDesc->Integer.Value))); + LODWORD(EntryDesc->Integer.Value)); } - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "\n")); + AcpiOsPrintf ("\n"); break; case AML_INT_NAMEPATH_OP: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "Reference.Node->Name %X\n", - EntryDesc->Reference.Node->Name)); + AcpiOsPrintf ("Reference.Node->Name %X\n", + EntryDesc->Reference.Node->Name); break; default: /* unknown opcode */ - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "Unknown opcode=%X\n", - EntryDesc->Reference.Opcode)); + AcpiOsPrintf ("Unknown opcode=%X\n", + EntryDesc->Reference.Opcode); break; } @@ -383,9 +393,9 @@ AcpiExDumpOperand ( case ACPI_TYPE_BUFFER: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "Buffer len %X @ %p \n", + AcpiOsPrintf ("Buffer len %X @ %p \n", EntryDesc->Buffer.Length, - EntryDesc->Buffer.Pointer)); + EntryDesc->Buffer.Pointer); Length = EntryDesc->Buffer.Length; @@ -398,13 +408,13 @@ AcpiExDumpOperand ( if (EntryDesc->Buffer.Pointer) { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "Buffer Contents: ")); + AcpiOsPrintf ("Buffer Contents: "); for (Buf = EntryDesc->Buffer.Pointer; Length--; ++Buf) { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, " %02x", *Buf)); + AcpiOsPrintf (" %02x", *Buf); } - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO,"\n")); + AcpiOsPrintf ("\n"); } break; @@ -412,32 +422,32 @@ AcpiExDumpOperand ( case ACPI_TYPE_INTEGER: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "Integer %8.8X%8.8X\n", + AcpiOsPrintf ("Integer %8.8X%8.8X\n", HIDWORD (EntryDesc->Integer.Value), - LODWORD (EntryDesc->Integer.Value))); + LODWORD (EntryDesc->Integer.Value)); break; case INTERNAL_TYPE_IF: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "If [Integer] %8.8X%8.8X\n", + AcpiOsPrintf ("If [Integer] %8.8X%8.8X\n", HIDWORD (EntryDesc->Integer.Value), - LODWORD (EntryDesc->Integer.Value))); + LODWORD (EntryDesc->Integer.Value)); break; case INTERNAL_TYPE_WHILE: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "While [Integer] %8.8X%8.8X\n", + AcpiOsPrintf ("While [Integer] %8.8X%8.8X\n", HIDWORD (EntryDesc->Integer.Value), - LODWORD (EntryDesc->Integer.Value))); + LODWORD (EntryDesc->Integer.Value)); break; case ACPI_TYPE_PACKAGE: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "Package count %X @ %p\n", - EntryDesc->Package.Count, EntryDesc->Package.Elements)); + AcpiOsPrintf ("Package count %X @ %p\n", + EntryDesc->Package.Count, EntryDesc->Package.Elements); /* * If elements exist, package vector pointer is valid, @@ -458,16 +468,16 @@ AcpiExDumpOperand ( } } - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "\n")); + AcpiOsPrintf ("\n"); break; case ACPI_TYPE_REGION: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "Region %s (%X)", + AcpiOsPrintf ("Region %s (%X)", AcpiUtGetRegionName (EntryDesc->Region.SpaceId), - EntryDesc->Region.SpaceId)); + EntryDesc->Region.SpaceId); /* * If the address and length have not been evaluated, @@ -475,62 +485,63 @@ AcpiExDumpOperand ( */ if (!(EntryDesc->Region.Flags & AOPOBJ_DATA_VALID)) { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "\n")); + AcpiOsPrintf ("\n"); } else { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, " base %8.8X%8.8X Length %X\n", + AcpiOsPrintf (" base %8.8X%8.8X Length %X\n", HIDWORD(EntryDesc->Region.Address), LODWORD(EntryDesc->Region.Address), - EntryDesc->Region.Length)); + EntryDesc->Region.Length); } break; case ACPI_TYPE_STRING: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "String length %X @ %p \"", - EntryDesc->String.Length, EntryDesc->String.Pointer)); + AcpiOsPrintf ("String length %X @ %p \"", + EntryDesc->String.Length, EntryDesc->String.Pointer); for (i = 0; i < EntryDesc->String.Length; i++) { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "%c", - EntryDesc->String.Pointer[i])); + AcpiOsPrintf ("%c", + EntryDesc->String.Pointer[i]); } - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "\"\n")); + AcpiOsPrintf ("\"\n"); break; case INTERNAL_TYPE_BANK_FIELD: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "BankField\n")); + AcpiOsPrintf ("BankField\n"); break; case INTERNAL_TYPE_REGION_FIELD: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, - "RegionField: bits=%X bitaccwidth=%X lock=%X update=%X at byte=%X bit=%X of below:\n", + AcpiOsPrintf ( + "RegionField: Bits=%X BitAccWidth=%X Lock=%X Update=%X at byte=%X bit=%X of below:\n", EntryDesc->Field.BitLength, EntryDesc->Field.AccessBitWidth, - EntryDesc->Field.LockRule, EntryDesc->Field.UpdateRule, - EntryDesc->Field.BaseByteOffset, EntryDesc->Field.StartFieldBitOffset)); + EntryDesc->Field.FieldFlags & AML_FIELD_LOCK_RULE_MASK, + EntryDesc->Field.FieldFlags & AML_FIELD_UPDATE_RULE_MASK, + EntryDesc->Field.BaseByteOffset, EntryDesc->Field.StartFieldBitOffset); DUMP_STACK_ENTRY (EntryDesc->Field.RegionObj); break; case INTERNAL_TYPE_INDEX_FIELD: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "IndexField\n")); + AcpiOsPrintf ("IndexField\n"); break; case ACPI_TYPE_BUFFER_FIELD: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, + AcpiOsPrintf ( "BufferField: %X bits at byte %X bit %X of \n", EntryDesc->BufferField.BitLength, EntryDesc->BufferField.BaseByteOffset, - EntryDesc->BufferField.StartFieldBitOffset)); + EntryDesc->BufferField.StartFieldBitOffset); if (!EntryDesc->BufferField.BufferObj) { @@ -540,7 +551,7 @@ AcpiExDumpOperand ( else if (ACPI_TYPE_BUFFER != EntryDesc->BufferField.BufferObj->Common.Type) { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "*not a Buffer* \n")); + AcpiOsPrintf ("*not a Buffer* \n"); } else @@ -553,68 +564,54 @@ AcpiExDumpOperand ( case ACPI_TYPE_EVENT: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "Event\n")); + AcpiOsPrintf ("Event\n"); break; case ACPI_TYPE_METHOD: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, + AcpiOsPrintf ( "Method(%X) @ %p:%X\n", EntryDesc->Method.ParamCount, - EntryDesc->Method.AmlStart, EntryDesc->Method.AmlLength)); + EntryDesc->Method.AmlStart, EntryDesc->Method.AmlLength); break; case ACPI_TYPE_MUTEX: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "Mutex\n")); + AcpiOsPrintf ("Mutex\n"); break; case ACPI_TYPE_DEVICE: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "Device\n")); + AcpiOsPrintf ("Device\n"); break; case ACPI_TYPE_POWER: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "Power\n")); + AcpiOsPrintf ("Power\n"); break; case ACPI_TYPE_PROCESSOR: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "Processor\n")); + AcpiOsPrintf ("Processor\n"); break; case ACPI_TYPE_THERMAL: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "Thermal\n")); + AcpiOsPrintf ("Thermal\n"); break; default: /* unknown EntryDesc->Common.Type value */ - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "Unknown Type %X\n", - EntryDesc->Common.Type)); - - /* Back up to previous entry */ - - EntryDesc--; - - - /* TBD: [Restructure] Change to use dump object routine !! */ - /* What is all of this?? */ - - DUMP_BUFFER (EntryDesc, sizeof (ACPI_OPERAND_OBJECT)); - DUMP_BUFFER (++EntryDesc, sizeof (ACPI_OPERAND_OBJECT)); - DUMP_BUFFER (++EntryDesc, sizeof (ACPI_OPERAND_OBJECT)); + AcpiOsPrintf ("Unknown Type %X\n", EntryDesc->Common.Type); break; - } return (AE_OK); @@ -692,6 +689,57 @@ AcpiExDumpOperands ( /***************************************************************************** * + * FUNCTION: AcpiExOut* + * + * PARAMETERS: Title - Descriptive text + * Value - Value to be displayed + * + * DESCRIPTION: Object dump output formatting functions. These functions + * reduce the number of format strings required and keeps them + * all in one place for easy modification. + * + ****************************************************************************/ + +void +AcpiExOutString ( + char *Title, + char *Value) +{ + AcpiOsPrintf ("%20s : %s\n", Title, Value); +} + +void +AcpiExOutPointer ( + char *Title, + void *Value) +{ + AcpiOsPrintf ("%20s : %p\n", Title, Value); +} + +void +AcpiExOutInteger ( + char *Title, + UINT32 Value) +{ + AcpiOsPrintf ("%20s : %X\n", Title, Value); +} + +void +AcpiExOutAddress ( + char *Title, + ACPI_PHYSICAL_ADDRESS Value) +{ +#ifdef _IA16 + AcpiOsPrintf ("%20s : %p\n", Title, Value); +#else + AcpiOsPrintf ("%20s : %8.8X%8.8X\n", Title, + HIDWORD (Value), LODWORD (Value)); +#endif +} + + +/***************************************************************************** + * * FUNCTION: AcpiExDumpNode * * PARAMETERS: *Node - Descriptor to dump @@ -720,14 +768,14 @@ AcpiExDumpNode ( AcpiOsPrintf ("%20s : %4.4s\n", "Name", (char*)&Node->Name); - AcpiOsPrintf ("%20s : %s\n", "Type", AcpiUtGetTypeName (Node->Type)); - AcpiOsPrintf ("%20s : %X\n", "Flags", Node->Flags); - AcpiOsPrintf ("%20s : %X\n", "Owner Id", Node->OwnerId); - AcpiOsPrintf ("%20s : %X\n", "Reference Count", Node->ReferenceCount); - AcpiOsPrintf ("%20s : %p\n", "Attached Object", Node->Object); - AcpiOsPrintf ("%20s : %p\n", "ChildList", Node->Child); - AcpiOsPrintf ("%20s : %p\n", "NextPeer", Node->Peer); - AcpiOsPrintf ("%20s : %p\n", "Parent", AcpiNsGetParentObject (Node)); + AcpiExOutString ("Type", AcpiUtGetTypeName (Node->Type)); + AcpiExOutInteger ("Flags", Node->Flags); + AcpiExOutInteger ("Owner Id", Node->OwnerId); + AcpiExOutInteger ("Reference Count", Node->ReferenceCount); + AcpiExOutPointer ("Attached Object", AcpiNsGetAttachedObject (Node)); + AcpiExOutPointer ("ChildList", Node->Child); + AcpiExOutPointer ("NextPeer", Node->Peer); + AcpiExOutPointer ("Parent", AcpiNsGetParentObject (Node)); } @@ -747,7 +795,7 @@ AcpiExDumpObjectDescriptor ( ACPI_OPERAND_OBJECT *ObjDesc, UINT32 Flags) { - const ACPI_OPCODE_INFO *OpInfo; + UINT32 i; FUNCTION_TRACE ("ExDumpObjectDescriptor"); @@ -763,14 +811,15 @@ AcpiExDumpObjectDescriptor ( if (!(VALID_DESCRIPTOR_TYPE (ObjDesc, ACPI_DESC_TYPE_INTERNAL))) { - AcpiOsPrintf ("%p is not a valid ACPI object\n", ObjDesc); + AcpiOsPrintf ("ExDumpObjectDescriptor: %p is not a valid ACPI object\n", ObjDesc); return; } /* Common Fields */ - AcpiOsPrintf ("%20s : %X\n", "Reference Count", ObjDesc->Common.ReferenceCount); - AcpiOsPrintf ("%20s : %X\n", "Flags", ObjDesc->Common.Flags); + AcpiExOutString ("Type", AcpiUtGetTypeName (ObjDesc->Common.Type)); + AcpiExOutInteger ("Reference Count", ObjDesc->Common.ReferenceCount); + AcpiExOutInteger ("Flags", ObjDesc->Common.Flags); /* Object-specific Fields */ @@ -778,7 +827,6 @@ AcpiExDumpObjectDescriptor ( { case ACPI_TYPE_INTEGER: - AcpiOsPrintf ("%20s : %s\n", "Type", "Integer"); AcpiOsPrintf ("%20s : %X%8.8X\n", "Value", HIDWORD (ObjDesc->Integer.Value), LODWORD (ObjDesc->Integer.Value)); break; @@ -786,190 +834,181 @@ AcpiExDumpObjectDescriptor ( case ACPI_TYPE_STRING: - AcpiOsPrintf ("%20s : %s\n", "Type", "String"); - AcpiOsPrintf ("%20s : %X\n", "Length", ObjDesc->String.Length); - AcpiOsPrintf ("%20s : %p\n", "Pointer", ObjDesc->String.Pointer); + AcpiExOutInteger ("Length", ObjDesc->String.Length); + AcpiExOutPointer ("Pointer", ObjDesc->String.Pointer); break; case ACPI_TYPE_BUFFER: - AcpiOsPrintf ("%20s : %s\n", "Type", "Buffer"); - AcpiOsPrintf ("%20s : %X\n", "Length", ObjDesc->Buffer.Length); - AcpiOsPrintf ("%20s : %p\n", "Pointer", ObjDesc->Buffer.Pointer); + AcpiExOutInteger ("Length", ObjDesc->Buffer.Length); + AcpiExOutPointer ("Pointer", ObjDesc->Buffer.Pointer); break; case ACPI_TYPE_PACKAGE: - AcpiOsPrintf ("%20s : %s\n", "Type", "Package"); - AcpiOsPrintf ("%20s : %X\n", "Flags", ObjDesc->Package.Flags); - AcpiOsPrintf ("%20s : %X\n", "Count", ObjDesc->Package.Count); - AcpiOsPrintf ("%20s : %p\n", "Elements", ObjDesc->Package.Elements); - AcpiOsPrintf ("%20s : %p\n", "NextElement", ObjDesc->Package.NextElement); - break; - + AcpiExOutInteger ("Flags", ObjDesc->Package.Flags); + AcpiExOutInteger ("Count", ObjDesc->Package.Count); + AcpiExOutPointer ("Elements", ObjDesc->Package.Elements); + AcpiExOutPointer ("NextElement", ObjDesc->Package.NextElement); - case ACPI_TYPE_BUFFER_FIELD: + /* Dump the package contents */ - AcpiOsPrintf ("%20s : %s\n", "Type", "BufferField"); - AcpiOsPrintf ("%20s : %X\n", "BitLength", ObjDesc->BufferField.BitLength); - AcpiOsPrintf ("%20s : %X\n", "BitOffset", ObjDesc->BufferField.StartFieldBitOffset); - AcpiOsPrintf ("%20s : %X\n", "BaseByteOffset",ObjDesc->BufferField.BaseByteOffset); - AcpiOsPrintf ("%20s : %p\n", "BufferObj", ObjDesc->BufferField.BufferObj); + if (ObjDesc->Package.Count > 0) + { + AcpiOsPrintf ("\nPackage Contents:\n"); + for (i = 0; i < ObjDesc->Package.Count; i++) + { + AcpiOsPrintf ("[%.3d] %p", i, ObjDesc->Package.Elements[i]); + if (ObjDesc->Package.Elements[i]) + { + AcpiOsPrintf (" %s", AcpiUtGetTypeName ((ObjDesc->Package.Elements[i])->Common.Type)); + } + AcpiOsPrintf ("\n"); + } + } break; case ACPI_TYPE_DEVICE: - AcpiOsPrintf ("%20s : %s\n", "Type", "Device"); - AcpiOsPrintf ("%20s : %p\n", "AddrHandler", ObjDesc->Device.AddrHandler); - AcpiOsPrintf ("%20s : %p\n", "SysHandler", ObjDesc->Device.SysHandler); - AcpiOsPrintf ("%20s : %p\n", "DrvHandler", ObjDesc->Device.DrvHandler); + AcpiExOutPointer ("AddrHandler", ObjDesc->Device.AddrHandler); + AcpiExOutPointer ("SysHandler", ObjDesc->Device.SysHandler); + AcpiExOutPointer ("DrvHandler", ObjDesc->Device.DrvHandler); break; + case ACPI_TYPE_EVENT: - AcpiOsPrintf ("%20s : %s\n", "Type", "Event"); - AcpiOsPrintf ("%20s : %X\n", "Semaphore", ObjDesc->Event.Semaphore); + AcpiExOutPointer ("Semaphore", ObjDesc->Event.Semaphore); break; case ACPI_TYPE_METHOD: - AcpiOsPrintf ("%20s : %s\n", "Type", "Method"); - AcpiOsPrintf ("%20s : %X\n", "ParamCount", ObjDesc->Method.ParamCount); - AcpiOsPrintf ("%20s : %X\n", "Concurrency", ObjDesc->Method.Concurrency); - AcpiOsPrintf ("%20s : %p\n", "Semaphore", ObjDesc->Method.Semaphore); - AcpiOsPrintf ("%20s : %X\n", "AmlLength", ObjDesc->Method.AmlLength); - AcpiOsPrintf ("%20s : %X\n", "AmlStart", ObjDesc->Method.AmlStart); + AcpiExOutInteger ("ParamCount", ObjDesc->Method.ParamCount); + AcpiExOutInteger ("Concurrency", ObjDesc->Method.Concurrency); + AcpiExOutPointer ("Semaphore", ObjDesc->Method.Semaphore); + AcpiExOutInteger ("AmlLength", ObjDesc->Method.AmlLength); + AcpiExOutPointer ("AmlStart", ObjDesc->Method.AmlStart); break; case ACPI_TYPE_MUTEX: - AcpiOsPrintf ("%20s : %s\n", "Type", "Mutex"); - AcpiOsPrintf ("%20s : %X\n", "SyncLevel", ObjDesc->Mutex.SyncLevel); - AcpiOsPrintf ("%20s : %p\n", "Owner", ObjDesc->Mutex.Owner); - AcpiOsPrintf ("%20s : %X\n", "AcquisitionDepth", ObjDesc->Mutex.AcquisitionDepth); - AcpiOsPrintf ("%20s : %p\n", "Semaphore", ObjDesc->Mutex.Semaphore); + AcpiExOutInteger ("SyncLevel", ObjDesc->Mutex.SyncLevel); + AcpiExOutPointer ("OwnerThread", ObjDesc->Mutex.OwnerThread); + AcpiExOutInteger ("AcquisitionDepth",ObjDesc->Mutex.AcquisitionDepth); + AcpiExOutPointer ("Semaphore", ObjDesc->Mutex.Semaphore); break; case ACPI_TYPE_REGION: - AcpiOsPrintf ("%20s : %s\n", "Type", "Region"); - AcpiOsPrintf ("%20s : %X\n", "SpaceId", ObjDesc->Region.SpaceId); - AcpiOsPrintf ("%20s : %X\n", "Flags", ObjDesc->Region.Flags); - AcpiOsPrintf ("%20s : %X\n", "Address", ObjDesc->Region.Address); - AcpiOsPrintf ("%20s : %X\n", "Length", ObjDesc->Region.Length); - AcpiOsPrintf ("%20s : %p\n", "AddrHandler", ObjDesc->Region.AddrHandler); - AcpiOsPrintf ("%20s : %p\n", "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 ("AddrHandler", ObjDesc->Region.AddrHandler); + AcpiExOutPointer ("Next", ObjDesc->Region.Next); break; case ACPI_TYPE_POWER: - AcpiOsPrintf ("%20s : %s\n", "Type", "PowerResource"); - AcpiOsPrintf ("%20s : %X\n", "SystemLevel", ObjDesc->PowerResource.SystemLevel); - AcpiOsPrintf ("%20s : %X\n", "ResourceOrder", ObjDesc->PowerResource.ResourceOrder); - AcpiOsPrintf ("%20s : %p\n", "SysHandler", ObjDesc->PowerResource.SysHandler); - AcpiOsPrintf ("%20s : %p\n", "DrvHandler", ObjDesc->PowerResource.DrvHandler); + AcpiExOutInteger ("SystemLevel", ObjDesc->PowerResource.SystemLevel); + AcpiExOutInteger ("ResourceOrder", ObjDesc->PowerResource.ResourceOrder); + AcpiExOutPointer ("SysHandler", ObjDesc->PowerResource.SysHandler); + AcpiExOutPointer ("DrvHandler", ObjDesc->PowerResource.DrvHandler); break; case ACPI_TYPE_PROCESSOR: - AcpiOsPrintf ("%20s : %s\n", "Type", "Processor"); - AcpiOsPrintf ("%20s : %X\n", "Processor ID", ObjDesc->Processor.ProcId); - AcpiOsPrintf ("%20s : %X\n", "Length", ObjDesc->Processor.Length); - AcpiOsPrintf ("%20s : %X\n", "Address", ObjDesc->Processor.Address); - AcpiOsPrintf ("%20s : %p\n", "SysHandler", ObjDesc->Processor.SysHandler); - AcpiOsPrintf ("%20s : %p\n", "DrvHandler", ObjDesc->Processor.DrvHandler); - AcpiOsPrintf ("%20s : %p\n", "AddrHandler", ObjDesc->Processor.AddrHandler); + AcpiExOutInteger ("Processor ID", ObjDesc->Processor.ProcId); + AcpiExOutInteger ("Length", ObjDesc->Processor.Length); + AcpiExOutInteger ("Address", ObjDesc->Processor.Address); + AcpiExOutPointer ("SysHandler", ObjDesc->Processor.SysHandler); + AcpiExOutPointer ("DrvHandler", ObjDesc->Processor.DrvHandler); + AcpiExOutPointer ("AddrHandler", ObjDesc->Processor.AddrHandler); break; case ACPI_TYPE_THERMAL: - AcpiOsPrintf ("%20s : %s\n", "Type", "ThermalZone"); - AcpiOsPrintf ("%20s : %p\n", "SysHandler", ObjDesc->ThermalZone.SysHandler); - AcpiOsPrintf ("%20s : %p\n", "DrvHandler", ObjDesc->ThermalZone.DrvHandler); - AcpiOsPrintf ("%20s : %p\n", "AddrHandler", ObjDesc->ThermalZone.AddrHandler); + AcpiExOutPointer ("SysHandler", ObjDesc->ThermalZone.SysHandler); + AcpiExOutPointer ("DrvHandler", ObjDesc->ThermalZone.DrvHandler); + AcpiExOutPointer ("AddrHandler", ObjDesc->ThermalZone.AddrHandler); break; + case ACPI_TYPE_BUFFER_FIELD: case INTERNAL_TYPE_REGION_FIELD: - - AcpiOsPrintf ("%20s : %p\n", "AccessBitWidth", ObjDesc->Field.AccessBitWidth); - AcpiOsPrintf ("%20s : %p\n", "BitLength", ObjDesc->Field.BitLength); - AcpiOsPrintf ("%20s : %p\n", "BaseByteOffset",ObjDesc->Field.BaseByteOffset); - AcpiOsPrintf ("%20s : %p\n", "BitOffset", ObjDesc->Field.StartFieldBitOffset); - AcpiOsPrintf ("%20s : %p\n", "RegionObj", ObjDesc->Field.RegionObj); - break; - - case INTERNAL_TYPE_BANK_FIELD: + case INTERNAL_TYPE_INDEX_FIELD: - AcpiOsPrintf ("%20s : %s\n", "Type", "BankField"); - AcpiOsPrintf ("%20s : %X\n", "AccessBitWidth", ObjDesc->BankField.AccessBitWidth); - AcpiOsPrintf ("%20s : %X\n", "LockRule", ObjDesc->BankField.LockRule); - AcpiOsPrintf ("%20s : %X\n", "UpdateRule", ObjDesc->BankField.UpdateRule); - AcpiOsPrintf ("%20s : %X\n", "BitLength", ObjDesc->BankField.BitLength); - AcpiOsPrintf ("%20s : %X\n", "BitOffset", ObjDesc->BankField.StartFieldBitOffset); - AcpiOsPrintf ("%20s : %X\n", "BaseByteOffset", ObjDesc->BankField.BaseByteOffset); - AcpiOsPrintf ("%20s : %X\n", "Value", ObjDesc->BankField.Value); - AcpiOsPrintf ("%20s : %p\n", "RegionObj", ObjDesc->BankField.RegionObj); - AcpiOsPrintf ("%20s : %X\n", "BankRegisterObj", ObjDesc->BankField.BankRegisterObj); - break; + AcpiExOutInteger ("FieldFlags", ObjDesc->CommonField.FieldFlags); + AcpiExOutInteger ("AccessBitWidth", ObjDesc->CommonField.AccessBitWidth); + 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 (ObjDesc->Common.Type) + { + case ACPI_TYPE_BUFFER_FIELD: + AcpiExOutPointer ("BufferObj", ObjDesc->BufferField.BufferObj); + break; + case INTERNAL_TYPE_REGION_FIELD: + AcpiExOutPointer ("RegionObj", ObjDesc->Field.RegionObj); + break; - case INTERNAL_TYPE_INDEX_FIELD: + case INTERNAL_TYPE_BANK_FIELD: + AcpiExOutInteger ("Value", ObjDesc->BankField.Value); + AcpiExOutPointer ("RegionObj", ObjDesc->BankField.RegionObj); + AcpiExOutPointer ("BankObj", ObjDesc->BankField.BankObj); + break; - AcpiOsPrintf ("%20s : %s\n", "Type", "IndexField"); - AcpiOsPrintf ("%20s : %X\n", "AccessBitWidth", ObjDesc->IndexField.AccessBitWidth); - AcpiOsPrintf ("%20s : %X\n", "LockRule", ObjDesc->IndexField.LockRule); - AcpiOsPrintf ("%20s : %X\n", "UpdateRule", ObjDesc->IndexField.UpdateRule); - AcpiOsPrintf ("%20s : %X\n", "BitLength", ObjDesc->IndexField.BitLength); - AcpiOsPrintf ("%20s : %X\n", "BitOffset", ObjDesc->IndexField.StartFieldBitOffset); - AcpiOsPrintf ("%20s : %X\n", "Value", ObjDesc->IndexField.Value); - AcpiOsPrintf ("%20s : %X\n", "Index", ObjDesc->IndexField.IndexObj); - AcpiOsPrintf ("%20s : %X\n", "Data", ObjDesc->IndexField.DataObj); + case INTERNAL_TYPE_INDEX_FIELD: + AcpiExOutInteger ("Value", ObjDesc->IndexField.Value); + AcpiExOutPointer ("Index", ObjDesc->IndexField.IndexObj); + AcpiExOutPointer ("Data", ObjDesc->IndexField.DataObj); + break; + } break; case INTERNAL_TYPE_REFERENCE: - OpInfo = AcpiPsGetOpcodeInfo (ObjDesc->Reference.Opcode); - - AcpiOsPrintf ("%20s : %s\n", "Type", "Reference"); - AcpiOsPrintf ("%20s : %X\n", "TargetType", ObjDesc->Reference.TargetType); - AcpiOsPrintf ("%20s : %s\n", "Opcode", OpInfo->Name); - AcpiOsPrintf ("%20s : %X\n", "Offset", ObjDesc->Reference.Offset); - AcpiOsPrintf ("%20s : %p\n", "ObjDesc", ObjDesc->Reference.Object); - AcpiOsPrintf ("%20s : %p\n", "Node", ObjDesc->Reference.Node); - AcpiOsPrintf ("%20s : %p\n", "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 INTERNAL_TYPE_ADDRESS_HANDLER: - AcpiOsPrintf ("%20s : %s\n", "Type", "Address Handler"); - AcpiOsPrintf ("%20s : %X\n", "SpaceId", ObjDesc->AddrHandler.SpaceId); - AcpiOsPrintf ("%20s : %p\n", "Next", ObjDesc->AddrHandler.Next); - AcpiOsPrintf ("%20s : %p\n", "RegionList", ObjDesc->AddrHandler.RegionList); - AcpiOsPrintf ("%20s : %p\n", "Node", ObjDesc->AddrHandler.Node); - AcpiOsPrintf ("%20s : %p\n", "Handler", ObjDesc->AddrHandler.Handler); - AcpiOsPrintf ("%20s : %p\n", "Context", ObjDesc->AddrHandler.Context); + AcpiExOutInteger ("SpaceId", ObjDesc->AddrHandler.SpaceId); + AcpiExOutPointer ("Next", ObjDesc->AddrHandler.Next); + AcpiExOutPointer ("RegionList", ObjDesc->AddrHandler.RegionList); + AcpiExOutPointer ("Node", ObjDesc->AddrHandler.Node); + AcpiExOutPointer ("Context", ObjDesc->AddrHandler.Context); break; case INTERNAL_TYPE_NOTIFY: - AcpiOsPrintf ("%20s : %s\n", "Type", "Notify Handler"); - AcpiOsPrintf ("%20s : %p\n", "Node", ObjDesc->NotifyHandler.Node); - AcpiOsPrintf ("%20s : %p\n", "Handler", ObjDesc->NotifyHandler.Handler); - AcpiOsPrintf ("%20s : %p\n", "Context", ObjDesc->NotifyHandler.Context); + AcpiExOutPointer ("Node", ObjDesc->NotifyHandler.Node); + AcpiExOutPointer ("Context", ObjDesc->NotifyHandler.Context); break; @@ -982,15 +1021,17 @@ AcpiExDumpObjectDescriptor ( case INTERNAL_TYPE_WHILE: case INTERNAL_TYPE_SCOPE: case INTERNAL_TYPE_DEF_ANY: + case INTERNAL_TYPE_EXTRA: + case INTERNAL_TYPE_DATA: - AcpiOsPrintf ("*** Structure display not implemented for type %X! ***\n", + AcpiOsPrintf ("ExDumpObjectDescriptor: Display not implemented for object type %X\n", ObjDesc->Common.Type); break; default: - AcpiOsPrintf ("*** Cannot display unknown type %X! ***\n", ObjDesc->Common.Type); + AcpiOsPrintf ("ExDumpObjectDescriptor: Unknown object type %X\n", ObjDesc->Common.Type); break; } diff --git a/sys/contrib/dev/acpica/exfield.c b/sys/contrib/dev/acpica/exfield.c index 49f30620e854..d6a75a57b884 100644 --- a/sys/contrib/dev/acpica/exfield.c +++ b/sys/contrib/dev/acpica/exfield.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: exfield - ACPI AML (p-code) execution - field manipulation - * $Revision: 95 $ + * $Revision: 101 $ * *****************************************************************************/ @@ -134,14 +134,13 @@ * * FUNCTION: AcpiExReadDataFromField * - * PARAMETERS: Mode - ACPI_READ or ACPI_WRITE - * *FieldNode - Parent node for field to be accessed - * *Buffer - Value(s) to be read or written - * BufferLength - Number of bytes to transfer + * PARAMETERS: ObjDesc - The named field + * RetBufferDesc - Where the return data object is stored * - * RETURN: Status3 + * RETURN: Status * - * DESCRIPTION: Read or write a named field + * DESCRIPTION: Read from a named field. Returns either an Integer or a + * Buffer, depending on the size of the field. * ******************************************************************************/ @@ -154,6 +153,7 @@ AcpiExReadDataFromField ( ACPI_OPERAND_OBJECT *BufferDesc; UINT32 Length; void *Buffer; + BOOLEAN Locked; FUNCTION_TRACE_PTR ("ExReadDataFromField", ObjDesc); @@ -166,6 +166,22 @@ AcpiExReadDataFromField ( return_ACPI_STATUS (AE_AML_NO_OPERAND); } + if (ObjDesc->Common.Type == ACPI_TYPE_BUFFER_FIELD) + { + /* + * If the BufferField arguments have not been previously evaluated, + * evaluate them now and save the results. + */ + if (!(ObjDesc->Common.Flags & AOPOBJ_DATA_VALID)) + { + Status = AcpiDsGetBufferFieldArguments (ObjDesc); + if (ACPI_FAILURE (Status)) + { + return_ACPI_STATUS (Status); + } + } + } + /* * Allocate a buffer for the contents of the field. * @@ -200,7 +216,6 @@ AcpiExReadDataFromField ( BufferDesc->Buffer.Length = Length; Buffer = BufferDesc->Buffer.Pointer; } - else { /* Field will fit within an Integer (normal case) */ @@ -215,37 +230,30 @@ AcpiExReadDataFromField ( Buffer = &BufferDesc->Integer.Value; } + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, + "Obj=%p Type=%X Buf=%p Len=%X\n", + ObjDesc, ObjDesc->Common.Type, Buffer, Length)); + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, + "FieldWrite: BitLen=%X BitOff=%X ByteOff=%X\n", + ObjDesc->CommonField.BitLength, + ObjDesc->CommonField.StartFieldBitOffset, + ObjDesc->CommonField.BaseByteOffset)); - /* Read from the appropriate field */ - - switch (ObjDesc->Common.Type) - { - case ACPI_TYPE_BUFFER_FIELD: - Status = AcpiExAccessBufferField (ACPI_READ, ObjDesc, Buffer, Length); - break; - - case INTERNAL_TYPE_REGION_FIELD: - Status = AcpiExAccessRegionField (ACPI_READ, ObjDesc, Buffer, Length); - break; - - case INTERNAL_TYPE_BANK_FIELD: - Status = AcpiExAccessBankField (ACPI_READ, ObjDesc, Buffer, Length); - break; + Locked = AcpiExAcquireGlobalLock (ObjDesc->CommonField.FieldFlags); - case INTERNAL_TYPE_INDEX_FIELD: - Status = AcpiExAccessIndexField (ACPI_READ, ObjDesc, Buffer, Length); - break; + /* Read from the field */ - default: - Status = AE_AML_INTERNAL; - } + Status = AcpiExExtractFromField (ObjDesc, Buffer, Length); + /* + * Release global lock if we acquired it earlier + */ + AcpiExReleaseGlobalLock (Locked); if (ACPI_FAILURE (Status)) { AcpiUtRemoveReference (BufferDesc); } - else if (RetBufferDesc) { *RetBufferDesc = BufferDesc; @@ -259,18 +267,15 @@ AcpiExReadDataFromField ( * * FUNCTION: AcpiExWriteDataToField * - * PARAMETERS: Mode - ACPI_READ or ACPI_WRITE - * *FieldNode - Parent node for field to be accessed - * *Buffer - Value(s) to be read or written - * BufferLength - Number of bytes to transfer + * PARAMETERS: SourceDesc - Contains data to write + * ObjDesc - The named field * * RETURN: Status * - * DESCRIPTION: Read or write a named field + * DESCRIPTION: Write to a named field * ******************************************************************************/ - ACPI_STATUS AcpiExWriteDataToField ( ACPI_OPERAND_OBJECT *SourceDesc, @@ -278,7 +283,10 @@ AcpiExWriteDataToField ( { ACPI_STATUS Status; UINT32 Length; + UINT32 RequiredLength; void *Buffer; + void *NewBuffer; + BOOLEAN Locked; FUNCTION_TRACE_PTR ("ExWriteDataToField", ObjDesc); @@ -291,6 +299,21 @@ AcpiExWriteDataToField ( return_ACPI_STATUS (AE_AML_NO_OPERAND); } + if (ObjDesc->Common.Type == ACPI_TYPE_BUFFER_FIELD) + { + /* + * If the BufferField arguments have not been previously evaluated, + * evaluate them now and save the results. + */ + if (!(ObjDesc->Common.Flags & AOPOBJ_DATA_VALID)) + { + Status = AcpiDsGetBufferFieldArguments (ObjDesc); + if (ACPI_FAILURE (Status)) + { + return_ACPI_STATUS (Status); + } + } + } /* * Get a pointer to the data to be written @@ -314,323 +337,67 @@ AcpiExWriteDataToField ( default: return_ACPI_STATUS (AE_AML_OPERAND_TYPE); - } - - - /* - * Decode the type of field to be written - */ - switch (ObjDesc->Common.Type) - { - case ACPI_TYPE_BUFFER_FIELD: - Status = AcpiExAccessBufferField (ACPI_WRITE, ObjDesc, Buffer, Length); - break; - - case INTERNAL_TYPE_REGION_FIELD: - Status = AcpiExAccessRegionField (ACPI_WRITE, ObjDesc, Buffer, Length); - break; - - case INTERNAL_TYPE_BANK_FIELD: - Status = AcpiExAccessBankField (ACPI_WRITE, ObjDesc, Buffer, Length); break; - - case INTERNAL_TYPE_INDEX_FIELD: - Status = AcpiExAccessIndexField (ACPI_WRITE, ObjDesc, Buffer, Length); - break; - - default: - return_ACPI_STATUS (AE_AML_INTERNAL); } - - return_ACPI_STATUS (Status); -} - - -/******************************************************************************* - * - * FUNCTION: AcpiExAccessBufferField - * - * PARAMETERS: Mode - ACPI_READ or ACPI_WRITE - * *FieldNode - Parent node for field to be accessed - * *Buffer - Value(s) to be read or written - * BufferLength - Number of bytes to transfer - * - * RETURN: Status - * - * DESCRIPTION: Read or write a named field - * - ******************************************************************************/ - -ACPI_STATUS -AcpiExAccessBufferField ( - UINT32 Mode, - ACPI_OPERAND_OBJECT *ObjDesc, - void *Buffer, - UINT32 BufferLength) -{ - ACPI_STATUS Status; - - - FUNCTION_TRACE_PTR ("ExAccessBufferField", ObjDesc); - - /* - * If the BufferField arguments have not been previously evaluated, - * evaluate them now and save the results. + * We must have a buffer that is at least as long as the field + * we are writing to. This is because individual fields are + * indivisible and partial writes are not supported -- as per + * the ACPI specification. */ - if (!(ObjDesc->Common.Flags & AOPOBJ_DATA_VALID)) + NewBuffer = NULL; + RequiredLength = ROUND_BITS_UP_TO_BYTES (ObjDesc->CommonField.BitLength); + + if (Length < RequiredLength) { - Status = AcpiDsGetBufferFieldArguments (ObjDesc); - if (ACPI_FAILURE (Status)) + /* We need to create a new buffer */ + + NewBuffer = ACPI_MEM_CALLOCATE (RequiredLength); + if (!NewBuffer) { - return_ACPI_STATUS (Status); + return_ACPI_STATUS (AE_NO_MEMORY); } - } - - Status = AcpiExCommonAccessField (Mode, ObjDesc, Buffer, BufferLength); - - return_ACPI_STATUS (Status); -} - - -/******************************************************************************* - * - * FUNCTION: AcpiExAccessRegionField - * - * PARAMETERS: Mode - ACPI_READ or ACPI_WRITE - * *FieldNode - Parent node for field to be accessed - * *Buffer - Value(s) to be read or written - * BufferLength - Number of bytes to transfer - * - * RETURN: Status - * - * DESCRIPTION: Read or write a named field - * - ******************************************************************************/ - -ACPI_STATUS -AcpiExAccessRegionField ( - UINT32 Mode, - ACPI_OPERAND_OBJECT *ObjDesc, - void *Buffer, - UINT32 BufferLength) -{ - ACPI_STATUS Status; - BOOLEAN Locked; - - - FUNCTION_TRACE_PTR ("ExAccessRegionField", ObjDesc); - - - /* - * Get the global lock if needed - */ - Locked = AcpiExAcquireGlobalLock (ObjDesc->Field.LockRule); - - Status = AcpiExCommonAccessField (Mode, ObjDesc, Buffer, BufferLength); - - - /* - * Release global lock if we acquired it earlier - */ - AcpiExReleaseGlobalLock (Locked); - - return_ACPI_STATUS (Status); -} - - -/******************************************************************************* - * - * FUNCTION: AcpiExAccessBankField - * - * PARAMETERS: Mode - ACPI_READ or ACPI_WRITE - * *FieldNode - Parent node for field to be accessed - * *Buffer - Value(s) to be read or written - * BufferLength - Number of bytes to transfer - * - * RETURN: Status - * - * DESCRIPTION: Read or write a Bank Field - * - ******************************************************************************/ - -ACPI_STATUS -AcpiExAccessBankField ( - UINT32 Mode, - ACPI_OPERAND_OBJECT *ObjDesc, - void *Buffer, - UINT32 BufferLength) -{ - ACPI_STATUS Status; - BOOLEAN Locked; - - - FUNCTION_TRACE_PTR ("ExAccessBankField", ObjDesc); - - - /* - * Get the global lock if needed - */ - Locked = AcpiExAcquireGlobalLock (ObjDesc->BankField.LockRule); - - - /* - * Write the BankValue to the BankRegister to select the bank. - * The BankValue for this BankField is specified in the - * BankField ASL declaration. The BankRegister is always a Field in - * an operation region. - */ - Status = AcpiExCommonAccessField (ACPI_WRITE, - ObjDesc->BankField.BankRegisterObj, - &ObjDesc->BankField.Value, - sizeof (ObjDesc->BankField.Value)); - if (ACPI_FAILURE (Status)) - { - goto Cleanup; + /* + * Copy the original data to the new buffer, starting + * at Byte zero. All unused (upper) bytes of the + * buffer will be 0. + */ + MEMCPY ((char *) NewBuffer, (char *) Buffer, Length); + Buffer = NewBuffer; + Length = RequiredLength; } - /* - * The bank was successfully selected, now read or write the actual - * data. - */ - Status = AcpiExCommonAccessField (Mode, ObjDesc, Buffer, BufferLength); - - -Cleanup: - /* - * Release global lock if we acquired it earlier - */ - AcpiExReleaseGlobalLock (Locked); - - return_ACPI_STATUS (Status); -} - - -/******************************************************************************* - * - * FUNCTION: AcpiExAccessIndexField - * - * PARAMETERS: Mode - ACPI_READ or ACPI_WRITE - * *FieldNode - Parent node for field to be accessed - * *Buffer - Value(s) to be read or written - * BufferLength - Number of bytes to transfer - * - * RETURN: Status - * - * DESCRIPTION: Read or write a Index Field - * - ******************************************************************************/ - -ACPI_STATUS -AcpiExAccessIndexField ( - UINT32 Mode, - ACPI_OPERAND_OBJECT *ObjDesc, - void *Buffer, - UINT32 BufferLength) -{ - ACPI_STATUS Status; - BOOLEAN Locked; - - - FUNCTION_TRACE_PTR ("ExAccessIndexField", ObjDesc); + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, + "Obj=%p Type=%X Buf=%p Len=%X\n", + ObjDesc, ObjDesc->Common.Type, Buffer, Length)); + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, + "FieldRead: BitLen=%X BitOff=%X ByteOff=%X\n", + ObjDesc->CommonField.BitLength, + ObjDesc->CommonField.StartFieldBitOffset, + ObjDesc->CommonField.BaseByteOffset)); + Locked = AcpiExAcquireGlobalLock (ObjDesc->CommonField.FieldFlags); /* - * Get the global lock if needed + * Write to the field */ - Locked = AcpiExAcquireGlobalLock (ObjDesc->IndexField.LockRule); - + Status = AcpiExInsertIntoField (ObjDesc, Buffer, Length); /* - * Set Index value to select proper Data register - */ - Status = AcpiExCommonAccessField (ACPI_WRITE, - ObjDesc->IndexField.IndexObj, - &ObjDesc->IndexField.Value, - sizeof (ObjDesc->IndexField.Value)); - if (ACPI_FAILURE (Status)) - { - goto Cleanup; - } - - /* Now read/write the data register */ - - Status = AcpiExCommonAccessField (Mode, ObjDesc->IndexField.DataObj, - Buffer, BufferLength); - -Cleanup: - /* * Release global lock if we acquired it earlier */ AcpiExReleaseGlobalLock (Locked); - return_ACPI_STATUS (Status); -} - - -/******************************************************************************* - * - * FUNCTION: AcpiExCommonAccessField - * - * PARAMETERS: Mode - ACPI_READ or ACPI_WRITE - * *FieldNode - Parent node for field to be accessed - * *Buffer - Value(s) to be read or written - * BufferLength - Size of buffer, in bytes. Must be large - * enough for all bits of the field. - * - * RETURN: Status - * - * DESCRIPTION: Read or write a named field - * - ******************************************************************************/ + /* Free temporary buffer if we used one */ -ACPI_STATUS -AcpiExCommonAccessField ( - UINT32 Mode, - ACPI_OPERAND_OBJECT *ObjDesc, - void *Buffer, - UINT32 BufferLength) -{ - ACPI_STATUS Status; - - - FUNCTION_TRACE_PTR ("ExCommonAccessField", ObjDesc); - - - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Obj=%p Type=%X Buf=%p Len=%X\n", - ObjDesc, ObjDesc->Common.Type, Buffer, BufferLength)); - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Mode=%d BitLen=%X BitOff=%X ByteOff=%X\n", - Mode, ObjDesc->CommonField.BitLength, - ObjDesc->CommonField.StartFieldBitOffset, - ObjDesc->CommonField.BaseByteOffset)); - - - /* Perform the actual read or write of the field */ - - switch (Mode) + if (NewBuffer) { - case ACPI_READ: - - Status = AcpiExExtractFromField (ObjDesc, Buffer, BufferLength); - break; - - - case ACPI_WRITE: - - Status = AcpiExInsertIntoField (ObjDesc, Buffer, BufferLength); - break; - - - default: - - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown I/O Mode: %X\n", Mode)); - Status = AE_BAD_PARAMETER; - break; + ACPI_MEM_FREE (NewBuffer); } - return_ACPI_STATUS (Status); } + diff --git a/sys/contrib/dev/acpica/exfldio.c b/sys/contrib/dev/acpica/exfldio.c index c10b3368836a..7e60ea8be4dc 100644 --- a/sys/contrib/dev/acpica/exfldio.c +++ b/sys/contrib/dev/acpica/exfldio.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: exfldio - Aml Field I/O - * $Revision: 66 $ + * $Revision: 75 $ * *****************************************************************************/ @@ -132,20 +132,21 @@ /******************************************************************************* * - * FUNCTION: AcpiExSetupField + * FUNCTION: AcpiExSetupRegion * - * PARAMETERS: *ObjDesc - Field to be read or written - * FieldDatumByteOffset - Current offset into the field + * PARAMETERS: *ObjDesc - Field to be read or written + * FieldDatumByteOffset - Byte offset of this datum within the + * parent field * * RETURN: Status * * DESCRIPTION: Common processing for AcpiExExtractFromField and - * AcpiExInsertIntoField + * AcpiExInsertIntoField. Initialize the * ******************************************************************************/ ACPI_STATUS -AcpiExSetupField ( +AcpiExSetupRegion ( ACPI_OPERAND_OBJECT *ObjDesc, UINT32 FieldDatumByteOffset) { @@ -153,7 +154,7 @@ AcpiExSetupField ( ACPI_OPERAND_OBJECT *RgnDesc; - FUNCTION_TRACE_U32 ("ExSetupField", FieldDatumByteOffset); + FUNCTION_TRACE_U32 ("ExSetupRegion", FieldDatumByteOffset); RgnDesc = ObjDesc->CommonField.RegionObj; @@ -171,7 +172,6 @@ AcpiExSetupField ( */ if (!(RgnDesc->Region.Flags & AOPOBJ_DATA_VALID)) { - Status = AcpiDsGetRegionArguments (RgnDesc); if (ACPI_FAILURE (Status)) { @@ -184,9 +184,9 @@ AcpiExSetupField ( * length of one field datum (access width) must fit within the region. * (Region length is specified in bytes) */ - if (RgnDesc->Region.Length < (ObjDesc->CommonField.BaseByteOffset + - FieldDatumByteOffset + - ObjDesc->CommonField.AccessByteWidth)) + if (RgnDesc->Region.Length < (ObjDesc->CommonField.BaseByteOffset + + FieldDatumByteOffset + + ObjDesc->CommonField.AccessByteWidth)) { if (RgnDesc->Region.Length < ObjDesc->CommonField.AccessByteWidth) { @@ -205,7 +205,7 @@ AcpiExSetupField ( * exceeds region length, indicate an error */ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "Field base+offset+width %X+%X+%X exceeds region size (%X bytes) field=%p region=%p\n", + "Field Base+Offset+Width %X+%X+%X exceeds region size (%X bytes) field=%p region=%p\n", ObjDesc->CommonField.BaseByteOffset, FieldDatumByteOffset, ObjDesc->CommonField.AccessByteWidth, RgnDesc->Region.Length, ObjDesc, RgnDesc)); @@ -219,121 +219,427 @@ AcpiExSetupField ( /******************************************************************************* * - * FUNCTION: AcpiExReadFieldDatum + * FUNCTION: AcpiExAccessRegion * - * PARAMETERS: *ObjDesc - Field to be read - * *Value - Where to store value (must be 32 bits) + * PARAMETERS: *ObjDesc - Field to be read + * FieldDatumByteOffset - Byte offset of this datum within the + * parent field + * *Value - Where to store value (must be 32 bits) + * ReadWrite - Read or Write flag * * RETURN: Status * - * DESCRIPTION: Retrieve the value of the given field + * DESCRIPTION: Read or Write a single field datum to an Operation Region. * ******************************************************************************/ ACPI_STATUS -AcpiExReadFieldDatum ( +AcpiExAccessRegion ( ACPI_OPERAND_OBJECT *ObjDesc, UINT32 FieldDatumByteOffset, - UINT32 *Value) + ACPI_INTEGER *Value, + UINT32 ReadWrite) { ACPI_STATUS Status; ACPI_OPERAND_OBJECT *RgnDesc; ACPI_PHYSICAL_ADDRESS Address; - UINT32 LocalValue; - FUNCTION_TRACE_U32 ("ExReadFieldDatum", FieldDatumByteOffset); + FUNCTION_TRACE ("AcpiExAccessRegion"); - if (!Value) + /* + * The physical address of this field datum is: + * + * 1) The base of the region, plus + * 2) The base offset of the field, plus + * 3) The current offset into the field + */ + RgnDesc = ObjDesc->CommonField.RegionObj; + Address = RgnDesc->Region.Address + + ObjDesc->CommonField.BaseByteOffset + + FieldDatumByteOffset; + + if (ReadWrite == ACPI_READ) + { + ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "[READ]")); + } + else { - LocalValue = 0; - Value = &LocalValue; /* support reads without saving value */ + ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "[WRITE]")); } - /* Clear the entire return buffer first, [Very Important!] */ + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_BFIELD, + " Region[%s-%X] Width %X Base:Off %X:%X at %8.8X%8.8X\n", + AcpiUtGetRegionName (RgnDesc->Region.SpaceId), + RgnDesc->Region.SpaceId, + ObjDesc->CommonField.AccessBitWidth, + ObjDesc->CommonField.BaseByteOffset, + FieldDatumByteOffset, + HIDWORD (Address), LODWORD (Address))); - *Value = 0; + /* Invoke the appropriate AddressSpace/OpRegion handler */ + + Status = AcpiEvAddressSpaceDispatch (RgnDesc, ReadWrite, + Address, ObjDesc->CommonField.AccessBitWidth, Value); + + if (ACPI_FAILURE (Status)) + { + if (Status == AE_NOT_IMPLEMENTED) + { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, + "Region %s(%X) not implemented\n", + AcpiUtGetRegionName (RgnDesc->Region.SpaceId), + RgnDesc->Region.SpaceId)); + } + + else if (Status == AE_NOT_EXIST) + { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, + "Region %s(%X) has no handler\n", + AcpiUtGetRegionName (RgnDesc->Region.SpaceId), + RgnDesc->Region.SpaceId)); + } + } + + return_ACPI_STATUS (Status); +} + + +/******************************************************************************* + * + * FUNCTION: AcpiExRegisterOverflow + * + * PARAMETERS: *ObjDesc - Register(Field) to be written + * Value - Value to be stored + * + * RETURN: TRUE if value overflows the field, FALSE otherwise + * + * DESCRIPTION: Check if a value is out of range of the field being written. + * Used to check if the values written to Index and Bank registers + * are out of range. Normally, the value is simply truncated + * to fit the field, but this case is most likely a serious + * coding error in the ASL. + * + ******************************************************************************/ + +BOOLEAN +AcpiExRegisterOverflow ( + ACPI_OPERAND_OBJECT *ObjDesc, + ACPI_INTEGER Value) +{ /* - * BufferFields - Read from a Buffer - * Other Fields - Read from a Operation Region. + * Is the Value larger than the maximum value that can fit into + * the field? + */ + if (Value >= (ACPI_INTEGER) (1 << ObjDesc->CommonField.BitLength)) + { + return (TRUE); + } + + return (FALSE); +} + + +/******************************************************************************* + * + * FUNCTION: AcpiExFieldDatumIo + * + * PARAMETERS: *ObjDesc - Field to be read + * FieldDatumByteOffset - Byte offset of this datum within the + * parent field + * *Value - Where to store value (must be 64 bits) + * ReadWrite - Read or Write flag + * + * RETURN: Status + * + * DESCRIPTION: Read or Write a single datum of a field. The FieldType is + * demultiplexed here to handle the different types of fields + * (BufferField, RegionField, IndexField, BankField) + * + ******************************************************************************/ + +ACPI_STATUS +AcpiExFieldDatumIo ( + ACPI_OPERAND_OBJECT *ObjDesc, + UINT32 FieldDatumByteOffset, + ACPI_INTEGER *Value, + UINT32 ReadWrite) +{ + ACPI_STATUS Status; + ACPI_INTEGER LocalValue; + + + FUNCTION_TRACE_U32 ("ExFieldDatumIo", FieldDatumByteOffset); + + + if (ReadWrite == ACPI_READ) + { + if (!Value) + { + LocalValue = 0; + Value = &LocalValue; /* To support reads without saving return value */ + } + + /* Clear the entire return buffer first, [Very Important!] */ + + *Value = 0; + } + + /* + * The four types of fields are: + * + * BufferFields - Read/write from/to a Buffer + * RegionFields - Read/write from/to a Operation Region. + * BankFields - Write to a Bank Register, then read/write from/to an OpRegion + * IndexFields - Write to an Index Register, then read/write from/to a Data Register */ switch (ObjDesc->Common.Type) { case ACPI_TYPE_BUFFER_FIELD: - /* - * For BufferFields, we only need to copy the data from the - * source buffer. Length is the field width in bytes. + * If the BufferField arguments have not been previously evaluated, + * evaluate them now and save the results. */ - MEMCPY (Value, (ObjDesc->BufferField.BufferObj)->Buffer.Pointer - + ObjDesc->BufferField.BaseByteOffset + FieldDatumByteOffset, - ObjDesc->CommonField.AccessByteWidth); + if (!(ObjDesc->Common.Flags & AOPOBJ_DATA_VALID)) + { + Status = AcpiDsGetBufferFieldArguments (ObjDesc); + if (ACPI_FAILURE (Status)) + { + return_ACPI_STATUS (Status); + } + } + + if (ReadWrite == ACPI_READ) + { + /* + * Copy the data from the source buffer. + * Length is the field width in bytes. + */ + MEMCPY (Value, (ObjDesc->BufferField.BufferObj)->Buffer.Pointer + + ObjDesc->BufferField.BaseByteOffset + + FieldDatumByteOffset, + ObjDesc->CommonField.AccessByteWidth); + } + else + { + /* + * Copy the data to the target buffer. + * Length is the field width in bytes. + */ + MEMCPY ((ObjDesc->BufferField.BufferObj)->Buffer.Pointer + + ObjDesc->BufferField.BaseByteOffset + + FieldDatumByteOffset, + Value, ObjDesc->CommonField.AccessByteWidth); + } + Status = AE_OK; break; - case INTERNAL_TYPE_REGION_FIELD: case INTERNAL_TYPE_BANK_FIELD: + /* Ensure that the BankValue is not beyond the capacity of the register */ + + if (AcpiExRegisterOverflow (ObjDesc->BankField.BankObj, + ObjDesc->BankField.Value)) + { + return_ACPI_STATUS (AE_AML_REGISTER_LIMIT); + } + /* - * For other fields, we need to go through an Operation Region - * (Only types that will get here are RegionFields and BankFields) + * For BankFields, we must write the BankValue to the BankRegister + * (itself a RegionField) before we can access the data. */ - Status = AcpiExSetupField (ObjDesc, FieldDatumByteOffset); + Status = AcpiExInsertIntoField (ObjDesc->BankField.BankObj, + &ObjDesc->BankField.Value, + sizeof (ObjDesc->BankField.Value)); if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); } /* - * The physical address of this field datum is: - * - * 1) The base of the region, plus - * 2) The base offset of the field, plus - * 3) The current offset into the field + * Now that the Bank has been selected, fall through to the + * RegionField case and write the datum to the Operation Region */ - RgnDesc = ObjDesc->CommonField.RegionObj; - Address = RgnDesc->Region.Address + ObjDesc->CommonField.BaseByteOffset + - FieldDatumByteOffset; - ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "Region %s(%X) width %X base:off %X:%X at %8.8X%8.8X\n", - AcpiUtGetRegionName (RgnDesc->Region.SpaceId), - RgnDesc->Region.SpaceId, ObjDesc->CommonField.AccessBitWidth, - ObjDesc->CommonField.BaseByteOffset, FieldDatumByteOffset, - HIDWORD(Address), LODWORD(Address))); + /* No break; ! */ - /* Invoke the appropriate AddressSpace/OpRegion handler */ - Status = AcpiEvAddressSpaceDispatch (RgnDesc, ACPI_READ_ADR_SPACE, - Address, ObjDesc->CommonField.AccessBitWidth, Value); - if (Status == AE_NOT_IMPLEMENTED) + case INTERNAL_TYPE_REGION_FIELD: + /* + * For simple RegionFields, we just directly access the owning + * Operation Region. + */ + Status = AcpiExSetupRegion (ObjDesc, FieldDatumByteOffset); + if (ACPI_FAILURE (Status)) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Region %s(%X) not implemented\n", - AcpiUtGetRegionName (RgnDesc->Region.SpaceId), - RgnDesc->Region.SpaceId)); + return_ACPI_STATUS (Status); } - else if (Status == AE_NOT_EXIST) + Status = AcpiExAccessRegion (ObjDesc, FieldDatumByteOffset, Value, + ReadWrite); + break; + + + case INTERNAL_TYPE_INDEX_FIELD: + + + /* Ensure that the IndexValue is not beyond the capacity of the register */ + + if (AcpiExRegisterOverflow (ObjDesc->IndexField.IndexObj, + ObjDesc->IndexField.Value)) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Region %s(%X) has no handler\n", - AcpiUtGetRegionName (RgnDesc->Region.SpaceId), - RgnDesc->Region.SpaceId)); + return_ACPI_STATUS (AE_AML_REGISTER_LIMIT); + } + + /* Write the index value to the IndexRegister (itself a RegionField) */ + + Status = AcpiExInsertIntoField (ObjDesc->IndexField.IndexObj, + &ObjDesc->IndexField.Value, + sizeof (ObjDesc->IndexField.Value)); + if (ACPI_FAILURE (Status)) + { + return_ACPI_STATUS (Status); + } + + if (ReadWrite == ACPI_READ) + { + /* Read the datum from the DataRegister */ + + Status = AcpiExExtractFromField (ObjDesc->IndexField.DataObj, + Value, ObjDesc->CommonField.AccessByteWidth); + } + else + { + /* Write the datum to the Data register */ + + Status = AcpiExInsertIntoField (ObjDesc->IndexField.DataObj, + Value, ObjDesc->CommonField.AccessByteWidth); } break; default: - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "%p, wrong source type - %s\n", + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "%p, Wrong object type - %s\n", ObjDesc, AcpiUtGetTypeName (ObjDesc->Common.Type))); Status = AE_AML_INTERNAL; break; } + if (ACPI_SUCCESS (Status)) + { + if (ReadWrite == ACPI_READ) + { + ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "Value Read=%8.8X%8.8X\n", + HIDWORD(*Value), LODWORD(*Value))); + } + else + { + ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "Value Written=%8.8X%8.8X\n", + HIDWORD(*Value), LODWORD(*Value))); + } + } + + return_ACPI_STATUS (Status); +} + + +/******************************************************************************* + * + * FUNCTION: AcpiExWriteWithUpdateRule + * + * PARAMETERS: *ObjDesc - Field to be set + * Value - Value to store + * + * RETURN: Status + * + * DESCRIPTION: Apply the field update rule to a field write + * + ******************************************************************************/ + +ACPI_STATUS +AcpiExWriteWithUpdateRule ( + ACPI_OPERAND_OBJECT *ObjDesc, + ACPI_INTEGER Mask, + ACPI_INTEGER FieldValue, + UINT32 FieldDatumByteOffset) +{ + ACPI_STATUS Status = AE_OK; + ACPI_INTEGER MergedValue; + ACPI_INTEGER CurrentValue; + + + FUNCTION_TRACE_U32 ("ExWriteWithUpdateRule", Mask); + + + /* Start with the new bits */ + + MergedValue = FieldValue; + + /* If the mask is all ones, we don't need to worry about the update rule */ + + if (Mask != ACPI_UINT32_MAX) + { + /* Decode the update rule */ + + switch (ObjDesc->CommonField.FieldFlags & AML_FIELD_UPDATE_RULE_MASK) + { + case AML_FIELD_UPDATE_PRESERVE: + /* + * Check if update rule needs to be applied (not if mask is all + * ones) The left shift drops the bits we want to ignore. + */ + if ((~Mask << (sizeof (Mask) * 8 - + ObjDesc->CommonField.AccessBitWidth)) != 0) + { + /* + * Read the current contents of the byte/word/dword containing + * the field, and merge with the new field value. + */ + Status = AcpiExFieldDatumIo (ObjDesc, FieldDatumByteOffset, + &CurrentValue, ACPI_READ); + MergedValue |= (CurrentValue & ~Mask); + } + break; + + case AML_FIELD_UPDATE_WRITE_AS_ONES: + + /* Set positions outside the field to all ones */ + + MergedValue |= ~Mask; + break; + + case AML_FIELD_UPDATE_WRITE_AS_ZEROS: + + /* Set positions outside the field to all zeros */ + + MergedValue &= Mask; + break; + + default: + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, + "WriteWithUpdateRule: Unknown UpdateRule setting: %x\n", + (ObjDesc->CommonField.FieldFlags & AML_FIELD_UPDATE_RULE_MASK))); + return_ACPI_STATUS (AE_AML_OPERAND_VALUE); + break; + } + } + + /* Write the merged value */ + + Status = AcpiExFieldDatumIo (ObjDesc, FieldDatumByteOffset, + &MergedValue, ACPI_WRITE); - ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "Returned value=%08X \n", *Value)); + ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, + "Mask %8.8X%8.8X DatumOffset %X Value %8.8X%8.8X, MergedValue %8.8X%8.8X\n", + HIDWORD(Mask), LODWORD(Mask), + FieldDatumByteOffset, + HIDWORD(FieldValue), LODWORD(FieldValue), + HIDWORD(MergedValue),LODWORD(MergedValue))); return_ACPI_STATUS (Status); } @@ -343,22 +649,22 @@ AcpiExReadFieldDatum ( * * FUNCTION: AcpiExGetBufferDatum * - * PARAMETERS: MergedDatum - Value to store - * Buffer - Receiving buffer - * ByteGranularity - 1/2/4 Granularity of the field + * PARAMETERS: Datum - Where the Datum is returned + * Buffer - Raw field buffer + * ByteGranularity - 1/2/4/8 Granularity of the field * (aka Datum Size) * Offset - Datum offset into the buffer * * RETURN: none * - * DESCRIPTION: Store the merged datum to the buffer according to the + * DESCRIPTION: Get a datum from the buffer according to the buffer field * byte granularity * ******************************************************************************/ -static void +void AcpiExGetBufferDatum( - UINT32 *Datum, + ACPI_INTEGER *Datum, void *Buffer, UINT32 ByteGranularity, UINT32 Offset) @@ -380,6 +686,10 @@ AcpiExGetBufferDatum( case ACPI_FIELD_DWORD_GRANULARITY: MOVE_UNALIGNED32_TO_32 (Datum, &(((UINT32 *) Buffer) [Offset])); break; + + case ACPI_FIELD_QWORD_GRANULARITY: + MOVE_UNALIGNED64_TO_64 (Datum, &(((UINT64 *) Buffer) [Offset])); + break; } } @@ -390,7 +700,7 @@ AcpiExGetBufferDatum( * * PARAMETERS: MergedDatum - Value to store * Buffer - Receiving buffer - * ByteGranularity - 1/2/4 Granularity of the field + * ByteGranularity - 1/2/4/8 Granularity of the field * (aka Datum Size) * Offset - Datum offset into the buffer * @@ -401,9 +711,9 @@ AcpiExGetBufferDatum( * ******************************************************************************/ -static void +void AcpiExSetBufferDatum ( - UINT32 MergedDatum, + ACPI_INTEGER MergedDatum, void *Buffer, UINT32 ByteGranularity, UINT32 Offset) @@ -425,6 +735,10 @@ AcpiExSetBufferDatum ( case ACPI_FIELD_DWORD_GRANULARITY: MOVE_UNALIGNED32_TO_32 (&(((UINT32 *) Buffer)[Offset]), &MergedDatum); break; + + case ACPI_FIELD_QWORD_GRANULARITY: + MOVE_UNALIGNED64_TO_64 (&(((UINT64 *) Buffer)[Offset]), &MergedDatum); + break; } } @@ -451,9 +765,9 @@ AcpiExExtractFromField ( ACPI_STATUS Status; UINT32 FieldDatumByteOffset; UINT32 DatumOffset; - UINT32 PreviousRawDatum; - UINT32 ThisRawDatum = 0; - UINT32 MergedDatum = 0; + ACPI_INTEGER PreviousRawDatum; + ACPI_INTEGER ThisRawDatum = 0; + ACPI_INTEGER MergedDatum = 0; UINT32 ByteFieldLength; UINT32 DatumCount; @@ -467,7 +781,8 @@ AcpiExExtractFromField ( ByteFieldLength = ROUND_BITS_UP_TO_BYTES (ObjDesc->CommonField.BitLength); if (ByteFieldLength > BufferLength) { - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Field size %X (bytes) too large for buffer (%X)\n", + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, + "Field size %X (bytes) too large for buffer (%X)\n", ByteFieldLength, BufferLength)); return_ACPI_STATUS (AE_BUFFER_OVERFLOW); @@ -475,7 +790,8 @@ AcpiExExtractFromField ( /* Convert field byte count to datum count, round up if necessary */ - DatumCount = ROUND_UP_TO (ByteFieldLength, ObjDesc->CommonField.AccessByteWidth); + DatumCount = ROUND_UP_TO (ByteFieldLength, + ObjDesc->CommonField.AccessByteWidth); ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "ByteLen=%x, DatumLen=%x, BitGran=%x, ByteGran=%x\n", @@ -494,7 +810,8 @@ AcpiExExtractFromField ( FieldDatumByteOffset = 0; DatumOffset= 0; - Status = AcpiExReadFieldDatum (ObjDesc, FieldDatumByteOffset, &PreviousRawDatum); + Status = AcpiExFieldDatumIo (ObjDesc, FieldDatumByteOffset, + &PreviousRawDatum, ACPI_READ); if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); @@ -504,7 +821,7 @@ AcpiExExtractFromField ( /* We might actually be done if the request fits in one datum */ if ((DatumCount == 1) && - (ObjDesc->CommonField.AccessFlags & AFIELD_SINGLE_DATUM)) + (ObjDesc->CommonField.Flags & AOPOBJ_SINGLE_DATUM)) { /* 1) Shift the valid data bits down to start at bit 0 */ @@ -537,18 +854,19 @@ AcpiExExtractFromField ( * to perform a final read, since this would potentially read * past the end of the region. * - * TBD: [Investigate] It may make more sense to just split the aligned - * and non-aligned cases since the aligned case is so very simple, + * We could just split the aligned and non-aligned cases since the + * aligned case is so very simple, but this would require more code. */ - if ((ObjDesc->CommonField.StartFieldBitOffset != 0) || - ((ObjDesc->CommonField.StartFieldBitOffset == 0) && + if ((ObjDesc->CommonField.StartFieldBitOffset != 0) || + ((ObjDesc->CommonField.StartFieldBitOffset == 0) && (DatumOffset < (DatumCount -1)))) { /* * Get the next raw datum, it contains some or all bits * of the current field datum */ - Status = AcpiExReadFieldDatum (ObjDesc, FieldDatumByteOffset, &ThisRawDatum); + Status = AcpiExFieldDatumIo (ObjDesc, FieldDatumByteOffset, + &ThisRawDatum, ACPI_READ); if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); @@ -564,7 +882,6 @@ AcpiExExtractFromField ( MergedDatum = PreviousRawDatum; } - else { /* @@ -599,8 +916,8 @@ AcpiExExtractFromField ( * Store the merged field datum in the caller's buffer, according to * the granularity of the field (size of each datum). */ - AcpiExSetBufferDatum (MergedDatum, Buffer, ObjDesc->CommonField.AccessByteWidth, - DatumOffset); + AcpiExSetBufferDatum (MergedDatum, Buffer, + ObjDesc->CommonField.AccessByteWidth, DatumOffset); /* * Save the raw datum that was just acquired since it may contain bits @@ -616,218 +933,6 @@ AcpiExExtractFromField ( /******************************************************************************* * - * FUNCTION: AcpiExWriteFieldDatum - * - * PARAMETERS: *ObjDesc - Field to be set - * Value - Value to store - * - * RETURN: Status - * - * DESCRIPTION: Store the value into the given field - * - ******************************************************************************/ - -static ACPI_STATUS -AcpiExWriteFieldDatum ( - ACPI_OPERAND_OBJECT *ObjDesc, - UINT32 FieldDatumByteOffset, - UINT32 Value) -{ - ACPI_STATUS Status = AE_OK; - ACPI_OPERAND_OBJECT *RgnDesc = NULL; - ACPI_PHYSICAL_ADDRESS Address; - - - FUNCTION_TRACE_U32 ("ExWriteFieldDatum", FieldDatumByteOffset); - - - /* - * BufferFields - Read from a Buffer - * Other Fields - Read from a Operation Region. - */ - switch (ObjDesc->Common.Type) - { - case ACPI_TYPE_BUFFER_FIELD: - - /* - * For BufferFields, we only need to copy the data to the - * target buffer. Length is the field width in bytes. - */ - MEMCPY ((ObjDesc->BufferField.BufferObj)->Buffer.Pointer - + ObjDesc->BufferField.BaseByteOffset + FieldDatumByteOffset, - &Value, ObjDesc->CommonField.AccessByteWidth); - Status = AE_OK; - break; - - - case INTERNAL_TYPE_REGION_FIELD: - case INTERNAL_TYPE_BANK_FIELD: - - /* - * For other fields, we need to go through an Operation Region - * (Only types that will get here are RegionFields and BankFields) - */ - Status = AcpiExSetupField (ObjDesc, FieldDatumByteOffset); - if (ACPI_FAILURE (Status)) - { - return_ACPI_STATUS (Status); - } - - /* - * The physical address of this field datum is: - * - * 1) The base of the region, plus - * 2) The base offset of the field, plus - * 3) The current offset into the field - */ - RgnDesc = ObjDesc->CommonField.RegionObj; - Address = RgnDesc->Region.Address + - ObjDesc->CommonField.BaseByteOffset + - FieldDatumByteOffset; - - ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, - "Store %X in Region %s(%X) at %8.8X%8.8X width %X\n", - Value, AcpiUtGetRegionName (RgnDesc->Region.SpaceId), - RgnDesc->Region.SpaceId, HIDWORD(Address), LODWORD(Address), - ObjDesc->CommonField.AccessBitWidth)); - - /* Invoke the appropriate AddressSpace/OpRegion handler */ - - Status = AcpiEvAddressSpaceDispatch (RgnDesc, ACPI_WRITE_ADR_SPACE, - Address, ObjDesc->CommonField.AccessBitWidth, &Value); - - if (Status == AE_NOT_IMPLEMENTED) - { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "**** Region type %s(%X) not implemented\n", - AcpiUtGetRegionName (RgnDesc->Region.SpaceId), - RgnDesc->Region.SpaceId)); - } - - else if (Status == AE_NOT_EXIST) - { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "**** Region type %s(%X) does not have a handler\n", - AcpiUtGetRegionName (RgnDesc->Region.SpaceId), - RgnDesc->Region.SpaceId)); - } - - break; - - - default: - - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "%p, wrong source type - %s\n", - ObjDesc, AcpiUtGetTypeName (ObjDesc->Common.Type))); - Status = AE_AML_INTERNAL; - break; - } - - - ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "Value written=%08X \n", Value)); - return_ACPI_STATUS (Status); -} - - -/******************************************************************************* - * - * FUNCTION: AcpiExWriteFieldDatumWithUpdateRule - * - * PARAMETERS: *ObjDesc - Field to be set - * Value - Value to store - * - * RETURN: Status - * - * DESCRIPTION: Apply the field update rule to a field write - * - ******************************************************************************/ - -static ACPI_STATUS -AcpiExWriteFieldDatumWithUpdateRule ( - ACPI_OPERAND_OBJECT *ObjDesc, - UINT32 Mask, - UINT32 FieldValue, - UINT32 FieldDatumByteOffset) -{ - ACPI_STATUS Status = AE_OK; - UINT32 MergedValue; - UINT32 CurrentValue; - - - FUNCTION_TRACE ("ExWriteFieldDatumWithUpdateRule"); - - - /* Start with the new bits */ - - MergedValue = FieldValue; - - /* If the mask is all ones, we don't need to worry about the update rule */ - - if (Mask != ACPI_UINT32_MAX) - { - /* Decode the update rule */ - - switch (ObjDesc->CommonField.UpdateRule) - { - case UPDATE_PRESERVE: - /* - * Check if update rule needs to be applied (not if mask is all - * ones) The left shift drops the bits we want to ignore. - */ - if ((~Mask << (sizeof (Mask) * 8 - - ObjDesc->CommonField.AccessBitWidth)) != 0) - { - /* - * Read the current contents of the byte/word/dword containing - * the field, and merge with the new field value. - */ - Status = AcpiExReadFieldDatum (ObjDesc, FieldDatumByteOffset, - &CurrentValue); - MergedValue |= (CurrentValue & ~Mask); - } - break; - - - case UPDATE_WRITE_AS_ONES: - - /* Set positions outside the field to all ones */ - - MergedValue |= ~Mask; - break; - - - case UPDATE_WRITE_AS_ZEROS: - - /* Set positions outside the field to all zeros */ - - MergedValue &= Mask; - break; - - - default: - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "WriteWithUpdateRule: Unknown UpdateRule setting: %x\n", - ObjDesc->CommonField.UpdateRule)); - return_ACPI_STATUS (AE_AML_OPERAND_VALUE); - break; - } - } - - - /* Write the merged value */ - - Status = AcpiExWriteFieldDatum (ObjDesc, FieldDatumByteOffset, - MergedValue); - - ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "Mask %X DatumOffset %X Value %X, MergedValue %X\n", - Mask, FieldDatumByteOffset, FieldValue, MergedValue)); - - return_ACPI_STATUS (Status); -} - - -/******************************************************************************* - * * FUNCTION: AcpiExInsertIntoField * * PARAMETERS: *ObjDesc - Field to be set @@ -848,10 +953,10 @@ AcpiExInsertIntoField ( ACPI_STATUS Status; UINT32 FieldDatumByteOffset; UINT32 DatumOffset; - UINT32 Mask; - UINT32 MergedDatum; - UINT32 PreviousRawDatum; - UINT32 ThisRawDatum; + ACPI_INTEGER Mask; + ACPI_INTEGER MergedDatum; + ACPI_INTEGER PreviousRawDatum; + ACPI_INTEGER ThisRawDatum; UINT32 ByteFieldLength; UINT32 DatumCount; @@ -871,8 +976,6 @@ AcpiExInsertIntoField ( ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Buffer length %X too small for field %X\n", BufferLength, ByteFieldLength)); - /* TBD: Need a better error code */ - return_ACPI_STATUS (AE_BUFFER_OVERFLOW); } @@ -913,7 +1016,7 @@ AcpiExInsertIntoField ( /* If the field fits in one datum, may need to mask upper bits */ - if ((ObjDesc->CommonField.AccessFlags & AFIELD_SINGLE_DATUM) && + if ((ObjDesc->CommonField.Flags & AOPOBJ_SINGLE_DATUM) && ObjDesc->CommonField.EndFieldValidBits) { /* There are bits above the field, mask them off also */ @@ -928,7 +1031,7 @@ AcpiExInsertIntoField ( /* Apply the update rule (if necessary) and write the datum to the field */ - Status = AcpiExWriteFieldDatumWithUpdateRule (ObjDesc, Mask, MergedDatum, + Status = AcpiExWriteWithUpdateRule (ObjDesc, Mask, MergedDatum, FieldDatumByteOffset); if (ACPI_FAILURE (Status)) { @@ -938,7 +1041,7 @@ AcpiExInsertIntoField ( /* If the entire field fits within one datum, we are done. */ if ((DatumCount == 1) && - (ObjDesc->CommonField.AccessFlags & AFIELD_SINGLE_DATUM)) + (ObjDesc->CommonField.Flags & AOPOBJ_SINGLE_DATUM)) { return_ACPI_STATUS (AE_OK); } @@ -978,7 +1081,6 @@ AcpiExInsertIntoField ( (PreviousRawDatum >> ObjDesc->CommonField.DatumValidBits) | (ThisRawDatum << ObjDesc->CommonField.StartFieldBitOffset); } - else { /* Field began aligned on datum boundary */ @@ -1011,21 +1113,20 @@ AcpiExInsertIntoField ( /* Write the last datum with the update rule */ - Status = AcpiExWriteFieldDatumWithUpdateRule (ObjDesc, Mask, - MergedDatum, FieldDatumByteOffset); + Status = AcpiExWriteWithUpdateRule (ObjDesc, Mask, MergedDatum, + FieldDatumByteOffset); if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); } } } - else { /* Normal case -- write the completed datum */ - Status = AcpiExWriteFieldDatum (ObjDesc, - FieldDatumByteOffset, MergedDatum); + Status = AcpiExFieldDatumIo (ObjDesc, FieldDatumByteOffset, + &MergedDatum, ACPI_WRITE); if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); diff --git a/sys/contrib/dev/acpica/exmisc.c b/sys/contrib/dev/acpica/exmisc.c index bb79e8192e60..ac9b81974f17 100644 --- a/sys/contrib/dev/acpica/exmisc.c +++ b/sys/contrib/dev/acpica/exmisc.c @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exmisc - ACPI AML (p-code) execution - specific opcodes - * $Revision: 92 $ + * $Revision: 94 $ * *****************************************************************************/ @@ -129,7 +129,6 @@ MODULE_NAME ("exmisc") - /******************************************************************************* * * FUNCTION: AcpiExGetObjectReference @@ -174,8 +173,9 @@ AcpiExGetObjectReference ( case AML_LOCAL_OP: case AML_ARG_OP: - *ReturnDesc = (void *) AcpiDsMethodDataGetNode (ObjDesc->Reference.Opcode, - ObjDesc->Reference.Offset, WalkState); + Status = AcpiDsMethodDataGetNode (ObjDesc->Reference.Opcode, + ObjDesc->Reference.Offset, WalkState, + (ACPI_NAMESPACE_NODE **) ReturnDesc); break; default: @@ -473,7 +473,6 @@ AcpiExDoMathOp ( } - /******************************************************************************* * * FUNCTION: AcpiExDoLogicalOp @@ -555,5 +554,3 @@ AcpiExDoLogicalOp ( } - - diff --git a/sys/contrib/dev/acpica/exmutex.c b/sys/contrib/dev/acpica/exmutex.c index f8129a20bdaa..a9f2d7281c7f 100644 --- a/sys/contrib/dev/acpica/exmutex.c +++ b/sys/contrib/dev/acpica/exmutex.c @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exmutex - ASL Mutex Acquire/Release functions - * $Revision: 7 $ + * $Revision: 8 $ * *****************************************************************************/ @@ -143,15 +143,27 @@ void AcpiExUnlinkMutex ( ACPI_OPERAND_OBJECT *ObjDesc) { + ACPI_THREAD_STATE *Thread = ObjDesc->Mutex.OwnerThread; + + + if (!Thread) + { + return; + } if (ObjDesc->Mutex.Next) { (ObjDesc->Mutex.Next)->Mutex.Prev = ObjDesc->Mutex.Prev; } + if (ObjDesc->Mutex.Prev) { (ObjDesc->Mutex.Prev)->Mutex.Next = ObjDesc->Mutex.Next; } + else + { + Thread->AcquiredMutexList = ObjDesc->Mutex.Next; + } } @@ -171,24 +183,28 @@ AcpiExUnlinkMutex ( void AcpiExLinkMutex ( ACPI_OPERAND_OBJECT *ObjDesc, - ACPI_OPERAND_OBJECT *ListHead) + ACPI_THREAD_STATE *Thread) { + ACPI_OPERAND_OBJECT *ListHead; + + + ListHead = Thread->AcquiredMutexList; /* This object will be the first object in the list */ - ObjDesc->Mutex.Prev = ListHead; - ObjDesc->Mutex.Next = ListHead->Mutex.Next; + ObjDesc->Mutex.Prev = NULL; + ObjDesc->Mutex.Next = ListHead; /* Update old first object to point back to this object */ - if (ListHead->Mutex.Next) + if (ListHead) { - (ListHead->Mutex.Next)->Mutex.Prev = ObjDesc; + ListHead->Mutex.Prev = ObjDesc; } /* Update list head */ - ListHead->Mutex.Next = ObjDesc; + Thread->AcquiredMutexList = ObjDesc; } @@ -225,17 +241,20 @@ AcpiExAcquireMutex ( * Current Sync must be less than or equal to the sync level of the * mutex. This mechanism provides some deadlock prevention */ - if (WalkState->CurrentSyncLevel > ObjDesc->Mutex.SyncLevel) + if (WalkState->Thread->CurrentSyncLevel > ObjDesc->Mutex.SyncLevel) { return_ACPI_STATUS (AE_AML_MUTEX_ORDER); } /* - * If the mutex is already owned by this thread, - * just increment the acquisition depth + * Support for multiple acquires by the owning thread */ - if (ObjDesc->Mutex.Owner == WalkState) + if (ObjDesc->Mutex.OwnerThread == WalkState->Thread) { + /* + * The mutex is already owned by this thread, + * just increment the acquisition depth + */ ObjDesc->Mutex.AcquisitionDepth++; return_ACPI_STATUS (AE_OK); } @@ -252,14 +271,14 @@ AcpiExAcquireMutex ( /* Have the mutex, update mutex and walk info */ - ObjDesc->Mutex.Owner = WalkState; + ObjDesc->Mutex.OwnerThread = WalkState->Thread; ObjDesc->Mutex.AcquisitionDepth = 1; - WalkState->CurrentSyncLevel = ObjDesc->Mutex.SyncLevel; - /* Link the mutex to the walk state for force-unlock at method exit */ + WalkState->Thread->CurrentSyncLevel = ObjDesc->Mutex.SyncLevel; + + /* Link the mutex to the current thread for force-unlock at method exit */ - AcpiExLinkMutex (ObjDesc, (ACPI_OPERAND_OBJECT *) - &(WalkState->WalkList->AcquiredMutexList)); + AcpiExLinkMutex (ObjDesc, WalkState->Thread); return_ACPI_STATUS (AE_OK); } @@ -295,14 +314,14 @@ AcpiExReleaseMutex ( /* The mutex must have been previously acquired in order to release it */ - if (!ObjDesc->Mutex.Owner) + if (!ObjDesc->Mutex.OwnerThread) { return_ACPI_STATUS (AE_AML_MUTEX_NOT_ACQUIRED); } /* The Mutex is owned, but this thread must be the owner */ - if (ObjDesc->Mutex.Owner != WalkState) + if (ObjDesc->Mutex.OwnerThread != WalkState->Thread) { return_ACPI_STATUS (AE_AML_NOT_OWNER); } @@ -311,7 +330,7 @@ AcpiExReleaseMutex ( * The sync level of the mutex must be less than or * equal to the current sync level */ - if (ObjDesc->Mutex.SyncLevel > WalkState->CurrentSyncLevel) + if (ObjDesc->Mutex.SyncLevel > WalkState->Thread->CurrentSyncLevel) { return_ACPI_STATUS (AE_AML_MUTEX_ORDER); } @@ -327,6 +346,9 @@ AcpiExReleaseMutex ( return_ACPI_STATUS (AE_OK); } + /* Unlink the mutex from the owner's list */ + + AcpiExUnlinkMutex (ObjDesc); /* Release the mutex */ @@ -334,12 +356,8 @@ AcpiExReleaseMutex ( /* Update the mutex and walk state */ - ObjDesc->Mutex.Owner = NULL; - WalkState->CurrentSyncLevel = ObjDesc->Mutex.SyncLevel; - - /* Unlink the mutex from the owner's list */ - - AcpiExUnlinkMutex (ObjDesc); + ObjDesc->Mutex.OwnerThread = NULL; + WalkState->Thread->CurrentSyncLevel = ObjDesc->Mutex.SyncLevel; return_ACPI_STATUS (Status); } @@ -359,9 +377,9 @@ AcpiExReleaseMutex ( ACPI_STATUS AcpiExReleaseAllMutexes ( - ACPI_OPERAND_OBJECT *ListHead) + ACPI_THREAD_STATE *Thread) { - ACPI_OPERAND_OBJECT *Next = ListHead->Mutex.Next; + ACPI_OPERAND_OBJECT *Next = Thread->AcquiredMutexList; ACPI_OPERAND_OBJECT *This; @@ -376,16 +394,17 @@ AcpiExReleaseAllMutexes ( This = Next; Next = This->Mutex.Next; - /* Mark mutex un-owned */ - - This->Mutex.Owner = NULL; - This->Mutex.Prev = NULL; - This->Mutex.Next = NULL; - This->Mutex.AcquisitionDepth = 0; + This->Mutex.AcquisitionDepth = 1; + This->Mutex.Prev = NULL; + This->Mutex.Next = NULL; /* Release the mutex */ AcpiExSystemReleaseMutex (This); + + /* Mark mutex unowned */ + + This->Mutex.OwnerThread = NULL; } return (AE_OK); diff --git a/sys/contrib/dev/acpica/exoparg1.c b/sys/contrib/dev/acpica/exoparg1.c index 123c6d36a3c3..baa2534d9476 100644 --- a/sys/contrib/dev/acpica/exoparg1.c +++ b/sys/contrib/dev/acpica/exoparg1.c @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exoparg1 - AML execution - opcodes with 1 argument - * $Revision: 120 $ + * $Revision: 124 $ * *****************************************************************************/ @@ -138,21 +138,20 @@ * * AcpiExOpcode_xA_yT_zR * - * Where: + * Where: * - * xA - ARGUMENTS: The number of arguments (input operands) that are + * xA - ARGUMENTS: The number of arguments (input operands) that are * required for this opcode type (1 through 6 args). - * yT - TARGETS: The number of targets (output operands) that are required + * 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 + * zR - RETURN VALUE: Indicates whether this opcode type returns a value * as the function return (0 or 1). * - * The AcpiExOpcode* functions are called via the Dispatcher component with + * The AcpiExOpcode* functions are called via the Dispatcher component with * fully resolved operands. !*/ - /******************************************************************************* * * FUNCTION: AcpiExOpcode_1A_0T_0R @@ -177,9 +176,9 @@ AcpiExOpcode_1A_0T_0R ( FUNCTION_TRACE_STR ("ExOpcode_1A_0T_0R", AcpiPsGetOpcodeName (WalkState->Opcode)); - /* Examine the opcode */ + /* Examine the AML opcode */ - switch (WalkState->Opcode) + switch (WalkState->Opcode) { case AML_RELEASE_OP: /* Release (MutexObject) */ @@ -253,9 +252,10 @@ AcpiExOpcode_1A_1T_0R ( FUNCTION_TRACE_STR ("ExOpcode_1A_1T_0R", AcpiPsGetOpcodeName (WalkState->Opcode)); + /* Examine the AML opcode */ + switch (WalkState->Opcode) { - case AML_LOAD_OP: Status = AcpiExLoadOp (Operand[0], Operand[1]); @@ -327,6 +327,7 @@ AcpiExOpcode_1A_1T_1R ( break; } + /* Examine the AML opcode */ switch (WalkState->Opcode) { @@ -339,7 +340,6 @@ AcpiExOpcode_1A_1T_1R ( case AML_FIND_SET_LEFT_BIT_OP: /* FindSetLeftBit (Operand, Result) */ - ReturnDesc->Integer.Value = Operand[0]->Integer.Value; /* @@ -357,7 +357,6 @@ AcpiExOpcode_1A_1T_1R ( case AML_FIND_SET_RIGHT_BIT_OP: /* FindSetRightBit (Operand, Result) */ - ReturnDesc->Integer.Value = Operand[0]->Integer.Value; /* @@ -543,13 +542,12 @@ AcpiExOpcode_1A_1T_1R ( break; - /* - * These are two obsolete opcodes - */ 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))); Status = AE_SUPPORT; @@ -565,9 +563,8 @@ AcpiExOpcode_1A_1T_1R ( goto Cleanup; } - /* - * Store the return value computed above into the target object + * Store the return value computed above into the target object */ Status = AcpiExStore (ReturnDesc, Operand[1], WalkState); @@ -614,12 +611,10 @@ AcpiExOpcode_1A_0T_1R ( FUNCTION_TRACE_STR ("ExOpcode_1A_0T_0R", AcpiPsGetOpcodeName (WalkState->Opcode)); - - /* Get the operand and decode the opcode */ + /* Examine the AML opcode */ switch (WalkState->Opcode) { - case AML_LNOT_OP: /* LNot (Operand) */ ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER); @@ -661,9 +656,9 @@ AcpiExOpcode_1A_0T_1R ( goto Cleanup; } - /* + /* * ReturnDesc is now guaranteed to be an Integer object - * Do the actual increment or decrement + * Do the actual increment or decrement */ if (AML_INCREMENT_OP == WalkState->Opcode) { @@ -703,7 +698,7 @@ AcpiExOpcode_1A_0T_1R ( case AML_DEBUG_OP: - /* Per 1.0b spec, Debug object is of type "DebugObject" */ + /* The Debug Object is of type "DebugObject" */ Type = ACPI_TYPE_DEBUG_OBJECT; break; @@ -723,7 +718,6 @@ AcpiExOpcode_1A_0T_1R ( */ Type = (*(Operand[0]->Reference.Where))->Common.Type; } - break; @@ -743,7 +737,6 @@ AcpiExOpcode_1A_0T_1R ( goto Cleanup; } } - else { /* @@ -789,9 +782,13 @@ AcpiExOpcode_1A_0T_1R ( { Value = 0; } - else { + /* + * 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.) + */ switch (TempDesc->Common.Type) { case ACPI_TYPE_BUFFER: @@ -806,16 +803,9 @@ AcpiExOpcode_1A_0T_1R ( Value = TempDesc->Package.Count; break; - case INTERNAL_TYPE_REFERENCE: - - /* TBD: this must be a reference to a buf/str/pkg?? */ - - Value = 4; - break; - default: - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Not Buf/Str/Pkg - found type %X\n", - TempDesc->Common.Type)); + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "SizeOf, Not Buf/Str/Pkg - found type %s\n", + AcpiUtGetTypeName (TempDesc->Common.Type))); Status = AE_AML_OPERAND_TYPE; goto Cleanup; } @@ -857,11 +847,11 @@ AcpiExOpcode_1A_0T_1R ( */ switch (Operand[0]->Reference.Opcode) { - /* Set Operand[0] to the value of the local/arg */ - case AML_LOCAL_OP: case AML_ARG_OP: + /* Set Operand[0] to the value of the local/arg */ + AcpiDsMethodDataGetValue (Operand[0]->Reference.Opcode, Operand[0]->Reference.Offset, WalkState, &TempDesc); @@ -875,53 +865,40 @@ AcpiExOpcode_1A_0T_1R ( default: - /* Index op - handled below */ + /* Must be an Index op - handled below */ break; } } - /* Operand[0] may have changed from the code above */ if (VALID_DESCRIPTOR_TYPE (Operand[0], ACPI_DESC_TYPE_NAMED)) { /* Get the actual object from the Node (This is the dereference) */ - ReturnDesc = ((ACPI_NAMESPACE_NODE *) Operand[0])->Object; + ReturnDesc = AcpiNsGetAttachedObject ((ACPI_NAMESPACE_NODE *) Operand[0]); /* Returning a pointer to the object, add another reference! */ AcpiUtAddReference (ReturnDesc); } - else { /* - * This must be a reference object produced by the Index - * ASL operation -- check internal opcode + * This must be a reference produced by either the Index() or + * RefOf() operator */ - if ((Operand[0]->Reference.Opcode != AML_INDEX_OP) && - (Operand[0]->Reference.Opcode != AML_REF_OF_OP)) - { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown opcode in ref(%p) - %X\n", - Operand[0], Operand[0]->Reference.Opcode)); - - Status = AE_TYPE; - goto Cleanup; - } - - switch (Operand[0]->Reference.Opcode) { case AML_INDEX_OP: /* - * Supported target types for the Index operator are - * 1) A Buffer - * 2) A Package + * The target type for the Index operator must be + * either a Buffer or a Package */ - if (Operand[0]->Reference.TargetType == ACPI_TYPE_BUFFER_FIELD) + switch (Operand[0]->Reference.TargetType) { + case ACPI_TYPE_BUFFER_FIELD: /* * The target is a buffer, we must create a new object that * contains one element of the buffer, the element pointed @@ -938,17 +915,19 @@ AcpiExOpcode_1A_0T_1R ( goto Cleanup; } + /* + * Since we are returning the value of the buffer at the + * indexed location, we don't need to add an additional + * reference to the buffer itself. + */ TempDesc = Operand[0]->Reference.Object; ReturnDesc->Integer.Value = TempDesc->Buffer.Pointer[Operand[0]->Reference.Offset]; + break; + - /* TBD: [Investigate] (see below) Don't add an additional - * ref! - */ - } + case ACPI_TYPE_PACKAGE: - else if (Operand[0]->Reference.TargetType == ACPI_TYPE_PACKAGE) - { /* * The target is a package, we want to return the referenced * element of the package. We must add another reference to @@ -962,7 +941,6 @@ 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", Operand[0])); Status = AE_AML_UNINITIALIZED_ELEMENT; @@ -970,16 +948,16 @@ AcpiExOpcode_1A_0T_1R ( } AcpiUtAddReference (ReturnDesc); - } + break; - else - { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown TargetType %X in obj %p\n", + + default: + + 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; } - break; @@ -991,9 +969,17 @@ AcpiExOpcode_1A_0T_1R ( AcpiUtAddReference (ReturnDesc); break; + + + default: + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown opcode in ref(%p) - %X\n", + Operand[0], Operand[0]->Reference.Opcode)); + + Status = AE_TYPE; + goto Cleanup; + break; } } - break; diff --git a/sys/contrib/dev/acpica/exoparg2.c b/sys/contrib/dev/acpica/exoparg2.c index 32c79683cce6..719116d02684 100644 --- a/sys/contrib/dev/acpica/exoparg2.c +++ b/sys/contrib/dev/acpica/exoparg2.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: exoparg2 - AML execution - opcodes with 2 arguments - * $Revision: 97 $ + * $Revision: 98 $ * *****************************************************************************/ @@ -139,21 +139,20 @@ * * AcpiExOpcode_xA_yT_zR * - * Where: + * Where: * - * xA - ARGUMENTS: The number of arguments (input operands) that are + * xA - ARGUMENTS: The number of arguments (input operands) that are * required for this opcode type (1 through 6 args). - * yT - TARGETS: The number of targets (output operands) that are required + * 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 + * zR - RETURN VALUE: Indicates whether this opcode type returns a value * as the function return (0 or 1). * - * The AcpiExOpcode* functions are called via the Dispatcher component with + * The AcpiExOpcode* functions are called via the Dispatcher component with * fully resolved operands. !*/ - /******************************************************************************* * * FUNCTION: AcpiExOpcode_2A_0T_0R @@ -378,8 +377,8 @@ AcpiExOpcode_2A_1T_1R ( goto Cleanup; } - ReturnDesc->Integer.Value = AcpiExDoMathOp (WalkState->Opcode, - Operand[0]->Integer.Value, + ReturnDesc->Integer.Value = AcpiExDoMathOp (WalkState->Opcode, + Operand[0]->Integer.Value, Operand[1]->Integer.Value); goto StoreResultToTarget; } @@ -623,7 +622,7 @@ AcpiExOpcode_2A_0T_1R ( */ if (WalkState->OpInfo->Flags & AML_LOGICAL) /* LogicalOp (Operand0, Operand1) */ { - LogicalResult = AcpiExDoLogicalOp (WalkState->Opcode, + LogicalResult = AcpiExDoLogicalOp (WalkState->Opcode, Operand[0]->Integer.Value, Operand[1]->Integer.Value); goto StoreLogicalResult; @@ -664,9 +663,9 @@ AcpiExOpcode_2A_0T_1R ( StoreLogicalResult: - /* + /* * Set return value to according to LogicalResult. logical TRUE (all ones) - * Default is FALSE (zero) + * Default is FALSE (zero) */ if (LogicalResult) { diff --git a/sys/contrib/dev/acpica/exoparg3.c b/sys/contrib/dev/acpica/exoparg3.c index 43c5db4d9b37..52512022019c 100644 --- a/sys/contrib/dev/acpica/exoparg3.c +++ b/sys/contrib/dev/acpica/exoparg3.c @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exoparg3 - AML execution - opcodes with 3 arguments - * $Revision: 3 $ + * $Revision: 5 $ * *****************************************************************************/ @@ -137,21 +137,20 @@ * * AcpiExOpcode_xA_yT_zR * - * Where: + * Where: * - * xA - ARGUMENTS: The number of arguments (input operands) that are + * xA - ARGUMENTS: The number of arguments (input operands) that are * required for this opcode type (1 through 6 args). - * yT - TARGETS: The number of targets (output operands) that are required + * 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 + * zR - RETURN VALUE: Indicates whether this opcode type returns a value * as the function return (0 or 1). * - * The AcpiExOpcode* functions are called via the Dispatcher component with + * The AcpiExOpcode* functions are called via the Dispatcher component with * fully resolved operands. !*/ - /******************************************************************************* * * FUNCTION: AcpiExOpcode_3A_0T_0R @@ -216,7 +215,6 @@ AcpiExOpcode_3A_0T_0R ( } - Cleanup: return_ACPI_STATUS (Status); @@ -250,12 +248,11 @@ AcpiExOpcode_3A_1T_1R ( FUNCTION_TRACE_STR ("ExOpcode_3A_1T_1R", AcpiPsGetOpcodeName (WalkState->Opcode)); - switch (WalkState->Opcode) { case AML_MID_OP: /* Mid (Source[0], Index[1], Length[2], Result[3]) */ - /* + /* * Create the return object. The Source operand is guaranteed to be * either a String or a Buffer, so just use its type. */ @@ -291,7 +288,8 @@ AcpiExOpcode_3A_1T_1R ( Buffer = ACPI_MEM_CALLOCATE (Length + 1); if (!Buffer) { - return (AE_NO_MEMORY); + Status = AE_NO_MEMORY; + goto Cleanup; } /* Copy the portion requested */ @@ -304,7 +302,7 @@ AcpiExOpcode_3A_1T_1R ( ReturnDesc->String.Pointer = Buffer; ReturnDesc->String.Length = Length; } - + break; @@ -337,5 +335,3 @@ Cleanup: } - - diff --git a/sys/contrib/dev/acpica/exoparg6.c b/sys/contrib/dev/acpica/exoparg6.c index ad36e138b49a..15baa18fc3b8 100644 --- a/sys/contrib/dev/acpica/exoparg6.c +++ b/sys/contrib/dev/acpica/exoparg6.c @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exoparg6 - AML execution - opcodes with 6 arguments - * $Revision: 4 $ + * $Revision: 6 $ * *****************************************************************************/ @@ -128,7 +128,6 @@ MODULE_NAME ("exoparg6") - /*! * Naming convention for AML interpreter execution routines. * @@ -138,21 +137,20 @@ * * AcpiExOpcode_xA_yT_zR * - * Where: + * Where: * - * xA - ARGUMENTS: The number of arguments (input operands) that are + * xA - ARGUMENTS: The number of arguments (input operands) that are * required for this opcode type (1 through 6 args). - * yT - TARGETS: The number of targets (output operands) that are required + * 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 + * zR - RETURN VALUE: Indicates whether this opcode type returns a value * as the function return (0 or 1). * - * The AcpiExOpcode* functions are called via the Dispatcher component with + * The AcpiExOpcode* functions are called via the Dispatcher component with * fully resolved operands. !*/ - /******************************************************************************* * * FUNCTION: AcpiExDoMatch @@ -264,9 +262,9 @@ AcpiExOpcode_6A_0T_1R ( switch (WalkState->Opcode) { - case AML_MATCH_OP: - /* - * Match (SearchPackage[0], MatchOp1[1], MatchObject1[2], + case AML_MATCH_OP: + /* + * Match (SearchPackage[0], MatchOp1[1], MatchObject1[2], * MatchOp2[3], MatchObject2[4], StartIndex[5]) */ @@ -304,6 +302,7 @@ AcpiExOpcode_6A_0T_1R ( * Examine each element until a match is found. Within the loop, * "continue" signifies that the current element does not match * and the next should be examined. + * * Upon finding a match, the loop will terminate via "break" at * the bottom. If it terminates "normally", MatchValue will be -1 * (its initial value) indicating that no match was found. When @@ -315,8 +314,6 @@ AcpiExOpcode_6A_0T_1R ( /* * Treat any NULL or non-numeric elements as non-matching. - * TBD [Unhandled] - if an element is a Name, - * should we examine its value? */ if (!ThisElement || ThisElement->Common.Type != ACPI_TYPE_INTEGER) @@ -324,21 +321,17 @@ AcpiExOpcode_6A_0T_1R ( continue; } - /* - * Within these switch statements: - * "break" (exit from the switch) signifies a match; - * "continue" (proceed to next iteration of enclosing - * "for" loop) signifies a non-match. + * "continue" (proceed to next iteration of enclosing + * "for" loop) signifies a non-match. */ - if (!AcpiExDoMatch ((UINT32) Operand[1]->Integer.Value, + if (!AcpiExDoMatch ((UINT32) Operand[1]->Integer.Value, ThisElement->Integer.Value, Operand[2]->Integer.Value)) { continue; } - - if (!AcpiExDoMatch ((UINT32) Operand[3]->Integer.Value, + if (!AcpiExDoMatch ((UINT32) Operand[3]->Integer.Value, ThisElement->Integer.Value, Operand[4]->Integer.Value)) { continue; diff --git a/sys/contrib/dev/acpica/exprep.c b/sys/contrib/dev/acpica/exprep.c index 1089492b5b46..98660e115c1d 100644 --- a/sys/contrib/dev/acpica/exprep.c +++ b/sys/contrib/dev/acpica/exprep.c @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exprep - ACPI AML (p-code) execution - field prep utilities - * $Revision: 99 $ + * $Revision: 109 $ * *****************************************************************************/ @@ -130,74 +130,91 @@ /******************************************************************************* * - * FUNCTION: AcpiExDecodeFieldAccessType + * FUNCTION: AcpiExDecodeFieldAccess * * PARAMETERS: Access - Encoded field access bits * Length - Field length. * - * RETURN: Field granularity (8, 16, 32 or 64) + * RETURN: Field granularity (8, 16, 32 or 64) and + * ByteAlignment (1, 2, 3, or 4) * * DESCRIPTION: Decode the AccessType bits of a field definition. * ******************************************************************************/ static UINT32 -AcpiExDecodeFieldAccessType ( - UINT32 Access, - UINT16 Length, - UINT32 *Alignment) +AcpiExDecodeFieldAccess ( + ACPI_OPERAND_OBJECT *ObjDesc, + UINT8 FieldFlags, + UINT32 *ReturnByteAlignment) { - PROC_NAME ("ExDecodeFieldAccessType"); + UINT32 Access; + UINT16 Length; + UINT8 ByteAlignment; + UINT8 BitLength; + + + PROC_NAME ("ExDecodeFieldAccess"); + + Access = (FieldFlags & AML_FIELD_ACCESS_TYPE_MASK); + Length = ObjDesc->CommonField.BitLength; switch (Access) { - case ACCESS_ANY_ACC: + case AML_FIELD_ACCESS_ANY: - *Alignment = 8; + ByteAlignment = 1; /* Use the length to set the access type */ if (Length <= 8) { - return (8); + BitLength = 8; } else if (Length <= 16) { - return (16); + BitLength = 16; } else if (Length <= 32) { - return (32); + BitLength = 32; } else if (Length <= 64) { - return (64); + BitLength = 64; } + else + { + /* Larger than Qword - just use byte-size chunks */ - /* Default is 8 (byte) */ + BitLength = 8; + } + break; - return (8); + case AML_FIELD_ACCESS_BYTE: + ByteAlignment = 1; + BitLength = 8; break; - case ACCESS_BYTE_ACC: - *Alignment = 8; - return (8); + case AML_FIELD_ACCESS_WORD: + ByteAlignment = 2; + BitLength = 16; break; - case ACCESS_WORD_ACC: - *Alignment = 16; - return (16); + case AML_FIELD_ACCESS_DWORD: + ByteAlignment = 4; + BitLength = 32; break; - case ACCESS_DWORD_ACC: - *Alignment = 32; - return (32); + case AML_FIELD_ACCESS_QWORD: /* ACPI 2.0 */ + ByteAlignment = 8; + BitLength = 64; break; - case ACCESS_QWORD_ACC: /* ACPI 2.0 */ - *Alignment = 64; - return (64); + case AML_FIELD_ACCESS_BUFFER: /* ACPI 2.0 */ + ByteAlignment = 8; + BitLength = 8; break; default: @@ -208,6 +225,19 @@ AcpiExDecodeFieldAccessType ( Access)); return (0); } + + if (ObjDesc->Common.Type == ACPI_TYPE_BUFFER_FIELD) + { + /* + * BufferField access can be on any byte boundary, so the + * ByteAlignment is always 1 byte -- regardless of any ByteAlignment + * implied by the field access type. + */ + ByteAlignment = 1; + } + + *ReturnByteAlignment = ByteAlignment; + return (BitLength); } @@ -225,7 +255,9 @@ AcpiExDecodeFieldAccessType ( * RETURN: Status * * DESCRIPTION: Initialize the areas of the field object that are common - * to the various types of fields. + * to the various types of fields. Note: This is very "sensitive" + * code because we are solving the general case for field + * alignment. * ******************************************************************************/ @@ -233,45 +265,48 @@ ACPI_STATUS AcpiExPrepCommonFieldObject ( ACPI_OPERAND_OBJECT *ObjDesc, UINT8 FieldFlags, + UINT8 FieldAttribute, UINT32 FieldBitPosition, UINT32 FieldBitLength) { UINT32 AccessBitWidth; - UINT32 Alignment; + UINT32 ByteAlignment; UINT32 NearestByteAddress; FUNCTION_TRACE ("ExPrepCommonFieldObject"); + if (FieldBitLength > ACPI_UINT16_MAX) + { + REPORT_ERROR (("Field size too long (> 0xFFFF), not supported\n")); + return_ACPI_STATUS (AE_SUPPORT); + } + /* * Note: the structure being initialized is the - * ACPI_COMMON_FIELD_INFO; No structure fields outside of the common area - * are initialized by this procedure. + * ACPI_COMMON_FIELD_INFO; No structure fields outside of the common + * area are initialized by this procedure. */ - - /* Demultiplex the FieldFlags byte */ - - ObjDesc->CommonField.LockRule = (UINT8) ((FieldFlags & LOCK_RULE_MASK) - >> LOCK_RULE_SHIFT); - ObjDesc->CommonField.UpdateRule = (UINT8) ((FieldFlags & UPDATE_RULE_MASK) - >> UPDATE_RULE_SHIFT); - /* Other misc fields */ - + ObjDesc->CommonField.FieldFlags = FieldFlags; + ObjDesc->CommonField.Attribute = FieldAttribute; ObjDesc->CommonField.BitLength = (UINT16) FieldBitLength; /* * Decode the access type so we can compute offsets. The access type gives * two pieces of information - the width of each field access and the - * necessary alignment of the access. For AnyAcc, the width used is the - * largest necessary/possible in an attempt to access the whole field in one - * I/O operation. However, for AnyAcc, the alignment is 8. For all other - * access types (Byte, Word, Dword, Qword), the width is the same as the - * alignment. + * necessary ByteAlignment (address granularity) of the access. + * + * For AnyAcc, the AccessBitWidth is the largest width that is both necessary + * and possible in an attempt to access the whole field in one + * I/O operation. However, for AnyAcc, the ByteAlignment is always one byte. + * + * For all Buffer Fields, the ByteAlignment is always one byte. + * + * For all other access types (Byte, Word, Dword, Qword), the Bitwidth is the + * same (equivalent) as the ByteAlignment. */ - AccessBitWidth = AcpiExDecodeFieldAccessType ( - ((FieldFlags & ACCESS_TYPE_MASK) >> ACCESS_TYPE_SHIFT), - ObjDesc->Field.BitLength, &Alignment); + AccessBitWidth = AcpiExDecodeFieldAccess (ObjDesc, FieldFlags, &ByteAlignment); if (!AccessBitWidth) { return_ACPI_STATUS (AE_AML_OPERAND_VALUE); @@ -279,64 +314,50 @@ AcpiExPrepCommonFieldObject ( /* Setup width (access granularity) fields */ - ObjDesc->CommonField.AccessBitWidth = (UINT8) AccessBitWidth; /* 8, 16, 32, 64 */ - ObjDesc->CommonField.AccessByteWidth = (UINT8) DIV_8 (AccessBitWidth); /* 1, 2, 4, 8 */ - - if (ObjDesc->Common.Type == ACPI_TYPE_BUFFER_FIELD) - { - /* - * BufferField access can be on any byte boundary, so the - * alignment is always 8 (regardless of any alignment implied by the - * field access type.) - */ - Alignment = 8; - } - + ObjDesc->CommonField.AccessBitWidth = (UINT8) AccessBitWidth; /* 8, 16, 32, 64 */ + ObjDesc->CommonField.AccessByteWidth = (UINT8) DIV_8 (AccessBitWidth); /* 1, 2, 4, 8 */ /* * BaseByteOffset is the address of the start of the field within the region. It is * the byte address of the first *datum* (field-width data unit) of the field. * (i.e., the first datum that contains at least the first *bit* of the field.) + * Note: ByteAlignment is always either equal to the AccessBitWidth or 8 (Byte access), + * and it defines the addressing granularity of the parent region or buffer. */ - NearestByteAddress = ROUND_BITS_DOWN_TO_BYTES (FieldBitPosition); - ObjDesc->CommonField.BaseByteOffset = ROUND_DOWN (NearestByteAddress, - DIV_8 (Alignment)); + NearestByteAddress = ROUND_BITS_DOWN_TO_BYTES (FieldBitPosition); + ObjDesc->CommonField.BaseByteOffset = ROUND_DOWN (NearestByteAddress, ByteAlignment); /* * StartFieldBitOffset is the offset of the first bit of the field within a field datum. - * This is calculated as the number of bits from the BaseByteOffset. In other words, - * the start of the field is relative to a byte address, regardless of the access type - * of the field. - */ - ObjDesc->CommonField.StartFieldBitOffset = (UINT8) (MOD_8 (FieldBitPosition)); - - /* - * DatumValidBits is the number of valid field bits in the first field datum. */ - ObjDesc->CommonField.DatumValidBits = (UINT8) (AccessBitWidth - - ObjDesc->CommonField.StartFieldBitOffset); + ObjDesc->CommonField.StartFieldBitOffset = (UINT8) (FieldBitPosition - + MUL_8 (ObjDesc->CommonField.BaseByteOffset)); /* * Valid bits -- the number of bits that compose a partial datum, * 1) At the end of the field within the region (arbitrary starting bit offset) * 2) At the end of a buffer used to contain the field (starting offset always zero) */ - ObjDesc->CommonField.EndFieldValidBits = (UINT8) ((ObjDesc->CommonField.StartFieldBitOffset + - FieldBitLength) % AccessBitWidth); - ObjDesc->CommonField.EndBufferValidBits = (UINT8) (FieldBitLength % AccessBitWidth); /* StartBufferBitOffset always = 0 */ + ObjDesc->CommonField.EndFieldValidBits = (UINT8) ((ObjDesc->CommonField.StartFieldBitOffset + FieldBitLength) % + AccessBitWidth); + ObjDesc->CommonField.EndBufferValidBits = (UINT8) (FieldBitLength % AccessBitWidth); /* StartBufferBitOffset always = 0 */ + /* + * DatumValidBits is the number of valid field bits in the first field datum. + */ + ObjDesc->CommonField.DatumValidBits = (UINT8) (AccessBitWidth - + ObjDesc->CommonField.StartFieldBitOffset); /* - * Does the entire field fit within a single field access element - * (datum)? (without crossing a datum boundary) + * Does the entire field fit within a single field access element? (datum) + * (i.e., without crossing a datum boundary) */ - if ((ObjDesc->CommonField.StartFieldBitOffset + ObjDesc->CommonField.BitLength) <= - (UINT16) ObjDesc->CommonField.AccessBitWidth) + if ((ObjDesc->CommonField.StartFieldBitOffset + FieldBitLength) <= + (UINT16) AccessBitWidth) { - ObjDesc->CommonField.AccessFlags |= AFIELD_SINGLE_DATUM; + ObjDesc->Common.Flags |= AOPOBJ_SINGLE_DATUM; } - return_ACPI_STATUS (AE_OK); } @@ -383,14 +404,15 @@ AcpiExPrepFieldValue ( Type = AcpiNsGetType (Info->RegionNode); if (Type != ACPI_TYPE_REGION) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Needed Region, found type %X %s\n", + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, + "Needed Region, found type %X %s\n", Type, AcpiUtGetTypeName (Type))); return_ACPI_STATUS (AE_AML_OPERAND_TYPE); } } - /* Allocate a new region object */ + /* Allocate a new field object */ ObjDesc = AcpiUtCreateInternalObject (Info->FieldType); if (!ObjDesc) @@ -400,8 +422,9 @@ AcpiExPrepFieldValue ( /* Initialize areas of the object that are common to all fields */ - Status = AcpiExPrepCommonFieldObject (ObjDesc, Info->FieldFlags, - Info->FieldBitPosition, Info->FieldBitLength); + ObjDesc->CommonField.Node = Info->FieldNode; + Status = AcpiExPrepCommonFieldObject (ObjDesc, Info->FieldFlags, + Info->Attribute, Info->FieldBitPosition, Info->FieldBitLength); if (ACPI_FAILURE (Status)) { AcpiUtDeleteObjectDesc (ObjDesc); @@ -414,13 +437,14 @@ AcpiExPrepFieldValue ( { case INTERNAL_TYPE_REGION_FIELD: - ObjDesc->Field.RegionObj = AcpiNsGetAttachedObject (Info->RegionNode); + ObjDesc->Field.RegionObj = AcpiNsGetAttachedObject (Info->RegionNode); /* An additional reference for the container */ AcpiUtAddReference (ObjDesc->Field.RegionObj); - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "RegionField: Bitoff=%X Off=%X Gran=%X Region %p\n", + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, + "RegionField: Bitoff=%X Off=%X Gran=%X Region %p\n", ObjDesc->Field.StartFieldBitOffset, ObjDesc->Field.BaseByteOffset, ObjDesc->Field.AccessBitWidth, ObjDesc->Field.RegionObj)); break; @@ -428,19 +452,19 @@ AcpiExPrepFieldValue ( case INTERNAL_TYPE_BANK_FIELD: - ObjDesc->BankField.Value = Info->BankValue; - ObjDesc->BankField.RegionObj = AcpiNsGetAttachedObject (Info->RegionNode); - ObjDesc->BankField.BankRegisterObj = AcpiNsGetAttachedObject (Info->RegisterNode); + ObjDesc->BankField.Value = Info->BankValue; + ObjDesc->BankField.RegionObj = AcpiNsGetAttachedObject (Info->RegionNode); + ObjDesc->BankField.BankObj = AcpiNsGetAttachedObject (Info->RegisterNode); /* An additional reference for the attached objects */ AcpiUtAddReference (ObjDesc->BankField.RegionObj); - AcpiUtAddReference (ObjDesc->BankField.BankRegisterObj); + AcpiUtAddReference (ObjDesc->BankField.BankObj); ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Bank Field: BitOff=%X Off=%X Gran=%X Region %p BankReg %p\n", ObjDesc->BankField.StartFieldBitOffset, ObjDesc->BankField.BaseByteOffset, ObjDesc->Field.AccessBitWidth, ObjDesc->BankField.RegionObj, - ObjDesc->BankField.BankRegisterObj)); + ObjDesc->BankField.BankObj)); break; @@ -473,11 +497,11 @@ AcpiExPrepFieldValue ( * Store the constructed descriptor (ObjDesc) into the parent Node, * preserving the current type of that NamedObj. */ - Status = AcpiNsAttachObject (Info->FieldNode, ObjDesc, + Status = AcpiNsAttachObject (Info->FieldNode, ObjDesc, (UINT8) AcpiNsGetType (Info->FieldNode)); ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "set NamedObj %p (%4.4s) val = %p\n", - Info->FieldNode, (char*)&(Info->FieldNode->Name), ObjDesc)); + Info->FieldNode, (char*)&(Info->FieldNode->Name), ObjDesc)); /* Remove local reference to the object */ diff --git a/sys/contrib/dev/acpica/exregion.c b/sys/contrib/dev/acpica/exregion.c index 2f3a7694589f..ac53967a23a8 100644 --- a/sys/contrib/dev/acpica/exregion.c +++ b/sys/contrib/dev/acpica/exregion.c @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exregion - ACPI default OpRegion (address space) handlers - * $Revision: 61 $ + * $Revision: 64 $ * *****************************************************************************/ @@ -153,7 +153,7 @@ AcpiExSystemMemorySpaceHandler ( UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 BitWidth, - UINT32 *Value, + ACPI_INTEGER *Value, void *HandlerContext, void *RegionContext) { @@ -182,6 +182,10 @@ AcpiExSystemMemorySpaceHandler ( Length = 4; break; + case 64: + Length = 8; + break; + default: ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Invalid SystemMemory width %d\n", BitWidth)); @@ -233,9 +237,6 @@ AcpiExSystemMemorySpaceHandler ( * Generate a logical pointer corresponding to the address we want to * access */ - - /* TBD: should these pointers go to 64-bit in all cases ? */ - LogicalAddrPtr = MemInfo->MappedLogicalAddress + ((ACPI_INTEGER) Address - (ACPI_INTEGER) MemInfo->MappedPhysicalAddress); @@ -247,8 +248,7 @@ AcpiExSystemMemorySpaceHandler ( switch (Function) { - - case ACPI_READ_ADR_SPACE: + case ACPI_READ: switch (BitWidth) { @@ -263,12 +263,14 @@ AcpiExSystemMemorySpaceHandler ( case 32: MOVE_UNALIGNED32_TO_32 (Value, LogicalAddrPtr); break; - } + case 64: + MOVE_UNALIGNED64_TO_64 (Value, LogicalAddrPtr); + break; + } break; - - case ACPI_WRITE_ADR_SPACE: + case ACPI_WRITE: switch (BitWidth) { @@ -283,11 +285,13 @@ AcpiExSystemMemorySpaceHandler ( case 32: MOVE_UNALIGNED32_TO_32 (LogicalAddrPtr, Value); break; - } + case 64: + MOVE_UNALIGNED64_TO_64 (LogicalAddrPtr, Value); + break; + } break; - default: Status = AE_BAD_PARAMETER; break; @@ -320,7 +324,7 @@ AcpiExSystemIoSpaceHandler ( UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 BitWidth, - UINT32 *Value, + ACPI_INTEGER *Value, void *HandlerContext, void *RegionContext) { @@ -338,20 +342,17 @@ AcpiExSystemIoSpaceHandler ( switch (Function) { - - case ACPI_READ_ADR_SPACE: + case ACPI_READ: *Value = 0; Status = AcpiOsReadPort ((ACPI_IO_ADDRESS) Address, Value, BitWidth); break; - - case ACPI_WRITE_ADR_SPACE: + case ACPI_WRITE: Status = AcpiOsWritePort ((ACPI_IO_ADDRESS) Address, *Value, BitWidth); break; - default: Status = AE_BAD_PARAMETER; break; @@ -384,7 +385,7 @@ AcpiExPciConfigSpaceHandler ( UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 BitWidth, - UINT32 *Value, + ACPI_INTEGER *Value, void *HandlerContext, void *RegionContext) { @@ -397,7 +398,7 @@ AcpiExPciConfigSpaceHandler ( /* - * The arguments to AcpiOs(Read|Write)PciCfg(Byte|Word|Dword) are: + * The arguments to AcpiOs(Read|Write)PciConfiguration are: * * PciSegment is the PCI bus segment range 0-31 * PciBus is the PCI bus number range 0-255 @@ -418,20 +419,17 @@ AcpiExPciConfigSpaceHandler ( switch (Function) { - - case ACPI_READ_ADR_SPACE: + case ACPI_READ: *Value = 0; Status = AcpiOsReadPciConfiguration (PciId, PciRegister, Value, BitWidth); break; - - case ACPI_WRITE_ADR_SPACE: + case ACPI_WRITE: Status = AcpiOsWritePciConfiguration (PciId, PciRegister, *Value, BitWidth); break; - default: Status = AE_BAD_PARAMETER; @@ -465,7 +463,7 @@ AcpiExCmosSpaceHandler ( UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 BitWidth, - UINT32 *Value, + ACPI_INTEGER *Value, void *HandlerContext, void *RegionContext) { @@ -502,7 +500,7 @@ AcpiExPciBarSpaceHandler ( UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 BitWidth, - UINT32 *Value, + ACPI_INTEGER *Value, void *HandlerContext, void *RegionContext) { diff --git a/sys/contrib/dev/acpica/exresnte.c b/sys/contrib/dev/acpica/exresnte.c index df8122c9b422..71b56ef8718e 100644 --- a/sys/contrib/dev/acpica/exresnte.c +++ b/sys/contrib/dev/acpica/exresnte.c @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exresnte - AML Interpreter object resolution - * $Revision: 43 $ + * $Revision: 45 $ * *****************************************************************************/ @@ -178,14 +178,13 @@ AcpiExResolveNodeToValue ( * The stack pointer points to a ACPI_NAMESPACE_NODE (Node). Get the * object that is attached to the Node. */ - Node = *ObjectPtr; - SourceDesc = AcpiNsGetAttachedObject (Node); - EntryType = AcpiNsGetType ((ACPI_HANDLE) Node); + Node = *ObjectPtr; + SourceDesc = AcpiNsGetAttachedObject (Node); + EntryType = AcpiNsGetType ((ACPI_HANDLE) Node); ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Entry=%p SourceDesc=%p Type=%X\n", Node, SourceDesc, EntryType)); - /* * Several object types require no further processing: * 1) Devices rarely have an attached object, return the Node @@ -210,7 +209,6 @@ AcpiExResolveNodeToValue ( */ switch (EntryType) { - case ACPI_TYPE_PACKAGE: if (ACPI_TYPE_PACKAGE != SourceDesc->Common.Type) @@ -286,7 +284,6 @@ AcpiExResolveNodeToValue ( Status = AcpiExReadDataFromField (SourceDesc, &ObjDesc); break; - /* * For these objects, just return the object attached to the Node */ @@ -363,7 +360,7 @@ AcpiExResolveNodeToValue ( ObjDesc->Integer.Value = TempVal; - /* + /* * Truncate value if we are executing from a 32-bit ACPI table * AND actually executing AML code. If we are resolving * an object in the namespace via an external call to the diff --git a/sys/contrib/dev/acpica/exresolv.c b/sys/contrib/dev/acpica/exresolv.c index 48b753efafcc..e2cb52c5e557 100644 --- a/sys/contrib/dev/acpica/exresolv.c +++ b/sys/contrib/dev/acpica/exresolv.c @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exresolv - AML Interpreter object resolution - * $Revision: 101 $ + * $Revision: 103 $ * *****************************************************************************/ @@ -131,118 +131,6 @@ MODULE_NAME ("exresolv") -/******************************************************************************* - * - * FUNCTION: AcpiExGetBufferFieldValue - * - * PARAMETERS: *ObjDesc - Pointer to a BufferField - * *ResultDesc - Pointer to an empty descriptor which will - * become an Integer with the field's value - * - * RETURN: Status - * - * DESCRIPTION: Retrieve the value from a BufferField - * - ******************************************************************************/ - -ACPI_STATUS -AcpiExGetBufferFieldValue ( - ACPI_OPERAND_OBJECT *ObjDesc, - ACPI_OPERAND_OBJECT *ResultDesc) -{ - ACPI_STATUS Status; - UINT32 Mask; - UINT8 *Location; - - - FUNCTION_TRACE ("ExGetBufferFieldValue"); - - - /* - * Parameter validation - */ - if (!ObjDesc) - { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Internal - null field pointer\n")); - return_ACPI_STATUS (AE_AML_NO_OPERAND); - } - - if (!(ObjDesc->Common.Flags & AOPOBJ_DATA_VALID)) - { - Status = AcpiDsGetBufferFieldArguments (ObjDesc); - if (ACPI_FAILURE (Status)) - { - return_ACPI_STATUS (Status); - } - } - - if (!ObjDesc->BufferField.BufferObj) - { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Internal - null container pointer\n")); - return_ACPI_STATUS (AE_AML_INTERNAL); - } - - if (ACPI_TYPE_BUFFER != ObjDesc->BufferField.BufferObj->Common.Type) - { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Internal - container is not a Buffer\n")); - return_ACPI_STATUS (AE_AML_OPERAND_TYPE); - } - - if (!ResultDesc) - { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Internal - null result pointer\n")); - return_ACPI_STATUS (AE_AML_INTERNAL); - } - - - /* Field location is (base of buffer) + (byte offset) */ - - Location = ObjDesc->BufferField.BufferObj->Buffer.Pointer - + ObjDesc->BufferField.BaseByteOffset; - - /* - * Construct Mask with as many 1 bits as the field width - * - * NOTE: Only the bottom 5 bits are valid for a shift operation, so - * special care must be taken for any shift greater than 31 bits. - * - * TBD: [Unhandled] Fields greater than 32 bits will not work. - */ - if (ObjDesc->BufferField.BitLength < 32) - { - Mask = ((UINT32) 1 << ObjDesc->BufferField.BitLength) - (UINT32) 1; - } - else - { - Mask = ACPI_UINT32_MAX; - } - - ResultDesc->Integer.Type = (UINT8) ACPI_TYPE_INTEGER; - - /* Get the 32 bit value at the location */ - - MOVE_UNALIGNED32_TO_32 (&ResultDesc->Integer.Value, Location); - - /* - * Shift the 32-bit word containing the field, and mask off the - * resulting value - */ - ResultDesc->Integer.Value = - (ResultDesc->Integer.Value >> ObjDesc->BufferField.StartFieldBitOffset) & Mask; - - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, - "** Read from buffer %p byte %d bit %d width %d addr %p mask %08X val %8.8X%8.8X\n", - ObjDesc->BufferField.BufferObj->Buffer.Pointer, - ObjDesc->BufferField.BaseByteOffset, - ObjDesc->BufferField.StartFieldBitOffset, - ObjDesc->BufferField.BitLength, - Location, Mask, - HIDWORD(ResultDesc->Integer.Value), - LODWORD(ResultDesc->Integer.Value))); - - return_ACPI_STATUS (AE_OK); -} - /******************************************************************************* * @@ -276,7 +164,6 @@ AcpiExResolveToValue ( return_ACPI_STATUS (AE_AML_NO_OPERAND); } - /* * The entity pointed to by the StackPtr can be either * 1) A valid ACPI_OPERAND_OBJECT, or @@ -305,7 +192,6 @@ AcpiExResolveToValue ( } } - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Resolved object %p\n", *StackPtr)); return_ACPI_STATUS (AE_OK); } @@ -347,14 +233,12 @@ AcpiExResolveObjectToValue ( switch (StackDesc->Common.Type) { - case INTERNAL_TYPE_REFERENCE: Opcode = StackDesc->Reference.Opcode; switch (Opcode) { - case AML_NAME_OP: /* @@ -398,7 +282,6 @@ AcpiExResolveObjectToValue ( StackDesc->Reference.Offset, ObjDesc)); break; - /* * For constants, we must change the reference/constant object * to a real integer object @@ -439,7 +322,7 @@ AcpiExResolveObjectToValue ( break; } - /* + /* * Remove a reference from the original reference object * and put the new object in its place */ @@ -471,7 +354,6 @@ AcpiExResolveObjectToValue ( AcpiUtAddReference (ObjDesc); *StackPtr = ObjDesc; } - else { /* @@ -494,7 +376,6 @@ AcpiExResolveObjectToValue ( Status = AE_AML_INTERNAL; break; } - break; @@ -515,55 +396,24 @@ AcpiExResolveObjectToValue ( break; /* case INTERNAL_TYPE_REFERENCE */ - + /* + * These cases may never happen here, but just in case.. + */ case ACPI_TYPE_BUFFER_FIELD: - - ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_ANY); - if (!ObjDesc) - { - return_ACPI_STATUS (AE_NO_MEMORY); - } - - Status = AcpiExGetBufferFieldValue (StackDesc, ObjDesc); - if (ACPI_FAILURE (Status)) - { - AcpiUtRemoveReference (ObjDesc); - ObjDesc = NULL; - } - - *StackPtr = (void *) ObjDesc; - break; - - + case INTERNAL_TYPE_REGION_FIELD: case INTERNAL_TYPE_BANK_FIELD: + case INTERNAL_TYPE_INDEX_FIELD: - ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_ANY); - if (!ObjDesc) - { - return_ACPI_STATUS (AE_NO_MEMORY); - } - - /* TBD: WRONG! */ - - Status = AcpiExGetBufferFieldValue (StackDesc, ObjDesc); - if (ACPI_FAILURE (Status)) - { - AcpiUtRemoveReference (ObjDesc); - ObjDesc = NULL; - } + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "FieldRead SourceDesc=%p Type=%X\n", + StackDesc, StackDesc->Common.Type)); + Status = AcpiExReadDataFromField (StackDesc, &ObjDesc); *StackPtr = (void *) ObjDesc; break; - - /* TBD: [Future] - may need to handle IndexField, and DefField someday */ - default: - break; - - } /* switch (StackDesc->Common.Type) */ - + } return_ACPI_STATUS (Status); } diff --git a/sys/contrib/dev/acpica/exstore.c b/sys/contrib/dev/acpica/exstore.c index 4392b7a386fd..a49e29cfa200 100644 --- a/sys/contrib/dev/acpica/exstore.c +++ b/sys/contrib/dev/acpica/exstore.c @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exstore - AML Interpreter object store support - * $Revision: 150 $ + * $Revision: 154 $ * *****************************************************************************/ @@ -137,14 +137,16 @@ * PARAMETERS: *SourceDesc - Value to be stored * *DestDesc - Where to store it. Must be an NS node * or an ACPI_OPERAND_OBJECT of type - * Reference; + * Reference; + * WalkState - Current walk state * * RETURN: Status * * DESCRIPTION: Store the value described by SourceDesc into the location * described by DestDesc. Called by various interpreter * functions to store the result of an operation into - * the destination operand. + * the destination operand -- not just simply the actual STORE + * ASL operator. * ******************************************************************************/ @@ -185,7 +187,6 @@ AcpiExStore ( return_ACPI_STATUS (Status); } - /* Destination object must be an object of type Reference */ if (DestDesc->Common.Type != INTERNAL_TYPE_REFERENCE) @@ -203,7 +204,6 @@ AcpiExStore ( return_ACPI_STATUS (AE_AML_OPERAND_TYPE); } - /* * Examine the Reference opcode. These cases are handled: * @@ -215,7 +215,6 @@ AcpiExStore ( */ switch (RefDesc->Reference.Opcode) { - case AML_NAME_OP: /* Storing an object into a Name "container" */ @@ -299,27 +298,23 @@ AcpiExStore ( case AML_REVISION_OP: /* - * Storing to a constant is a no-op -- see ACPI Specification - * Delete the reference descriptor, however + * Storing to a constant is a no-op according to the ACPI + * Specification. (Delete the reference descriptor, however.) */ break; default: - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Internal - Unknown Reference subtype %02x\n", + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown Reference subtype %02x\n", RefDesc->Reference.Opcode)); - - /* TBD: [Restructure] use object dump routine !! */ - - DUMP_BUFFER (RefDesc, sizeof (ACPI_OPERAND_OBJECT)); + DUMP_ENTRY (RefDesc, ACPI_LV_ERROR); Status = AE_AML_INTERNAL; break; } /* switch (RefDesc->Reference.Opcode) */ - return_ACPI_STATUS (Status); } @@ -328,12 +323,13 @@ AcpiExStore ( * * FUNCTION: AcpiExStoreObjectToIndex * - * PARAMETERS: *SourceDesc - Value to be stored - * *Node - Named object to receive the value + * PARAMETERS: *SourceDesc - Value to be stored + * *DestDesc - Named object to receive the value + * WalkState - Current walk state * * RETURN: Status * - * DESCRIPTION: Store the object to the named object. + * DESCRIPTION: Store the object to indexed Buffer or Package element * ******************************************************************************/ @@ -345,8 +341,6 @@ AcpiExStoreObjectToIndex ( { ACPI_STATUS Status = AE_OK; ACPI_OPERAND_OBJECT *ObjDesc; - UINT32 Length; - UINT32 i; UINT8 Value = 0; @@ -395,10 +389,11 @@ AcpiExStoreObjectToIndex ( if (!ObjDesc) { /* - * If the ObjDesc is NULL, it means that an uninitialized package - * element has been used as a destination (this is OK), therefore, - * we must create the destination element to match the type of the - * source element NOTE: SourceDesccan be of any type. + * If the ObjDesc is NULL, it means that an uninitialized + * package element has been used as a destination (this is OK), + * therefore, we must create the destination element to match + * the type of the source element NOTE: SourceDesc can be of + * any type. */ ObjDesc = AcpiUtCreateInternalObject (SourceDesc->Common.Type); if (!ObjDesc) @@ -411,7 +406,8 @@ AcpiExStoreObjectToIndex ( */ if (ACPI_TYPE_PACKAGE == ObjDesc->Common.Type) { - Status = AcpiUtCopyIpackageToIpackage (SourceDesc, ObjDesc, WalkState); + Status = AcpiUtCopyIpackageToIpackage (SourceDesc, ObjDesc, + WalkState); if (ACPI_FAILURE (Status)) { AcpiUtRemoveReference (ObjDesc); @@ -450,18 +446,17 @@ AcpiExStoreObjectToIndex ( case ACPI_TYPE_BUFFER_FIELD: - - /* TBD: can probably call the generic Buffer/Field routines */ - /* - * Storing into a buffer at a location defined by an Index. + * Store into a Buffer (not actually a real BufferField) at a + * location defined by an Index. * - * Each 8-bit element of the source object is written to the - * 8-bit Buffer Field of the Index destination object. + * The first 8-bit element of the source object is written to the + * 8-bit Buffer location defined by the Index destination object, + * according to the ACPI 2.0 specification. */ /* - * Set the ObjDesc to the destination object and type check. + * Make sure the target is a Buffer */ ObjDesc = DestDesc->Reference.Object; if (ObjDesc->Common.Type != ACPI_TYPE_BUFFER) @@ -476,68 +471,46 @@ AcpiExStoreObjectToIndex ( switch (SourceDesc->Common.Type) { case ACPI_TYPE_INTEGER: - /* - * Type is Integer, assign bytewise - * This loop to assign each of the elements is somewhat - * backward because of the Big Endian-ness of IA-64 - */ - Length = sizeof (ACPI_INTEGER); - for (i = Length; i != 0; i--) - { - Value = (UINT8)(SourceDesc->Integer.Value >> (MUL_8 (i - 1))); - ObjDesc->Buffer.Pointer[DestDesc->Reference.Offset] = Value; - } - break; + /* Use the least-significant byte of the integer */ - case ACPI_TYPE_BUFFER: - /* - * Type is Buffer, the Length is in the structure. - * Just loop through the elements and assign each one in turn. - */ - Length = SourceDesc->Buffer.Length; - for (i = 0; i < Length; i++) - { - Value = SourceDesc->Buffer.Pointer[i]; - ObjDesc->Buffer.Pointer[DestDesc->Reference.Offset] = Value; - } + Value = (UINT8) (SourceDesc->Integer.Value); break; + case ACPI_TYPE_BUFFER: - case ACPI_TYPE_STRING: - /* - * Type is String, the Length is in the structure. - * Just loop through the elements and assign each one in turn. - */ - Length = SourceDesc->String.Length; - for (i = 0; i < Length; i++) - { - Value = SourceDesc->String.Pointer[i]; - ObjDesc->Buffer.Pointer[DestDesc->Reference.Offset] = Value; - } + Value = SourceDesc->Buffer.Pointer[0]; break; + case ACPI_TYPE_STRING: + + Value = SourceDesc->String.Pointer[0]; + break; default: - /* Other types are invalid */ + /* All other types are invalid */ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "Source must be Number/Buffer/String type, not %X\n", - SourceDesc->Common.Type)); - Status = AE_AML_OPERAND_TYPE; + "Source must be Integer/Buffer/String type, not %s\n", + AcpiUtGetTypeName (SourceDesc->Common.Type))); + return_ACPI_STATUS (AE_AML_OPERAND_TYPE); break; } + + /* Store the source value into the target buffer byte */ + + ObjDesc->Buffer.Pointer[DestDesc->Reference.Offset] = Value; break; default: - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Target is not a Package or BufferField\n")); + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, + "Target is not a Package or BufferField\n")); Status = AE_AML_OPERAND_TYPE; break; } - return_ACPI_STATUS (Status); } @@ -546,15 +519,16 @@ AcpiExStoreObjectToIndex ( * * FUNCTION: AcpiExStoreObjectToNode * - * PARAMETERS: *SourceDesc - Value to be stored - * *Node - Named object to receive the value + * PARAMETERS: SourceDesc - Value to be stored + * Node - Named object to receive the value + * WalkState - Current walk state * * RETURN: Status * * DESCRIPTION: Store the object to the named object. * * The Assignment of an object to a named object is handled here - * The val passed in will replace the current value (if any) + * The value passed in will replace the current value (if any) * with the input value. * * When storing into an object the data is converted to the @@ -562,10 +536,7 @@ AcpiExStoreObjectToIndex ( * that the target object type (for an initialized target) will * not be changed by a store operation. * - * NOTE: the global lock is acquired early. This will result - * in the global lock being held a bit longer. Also, if the - * function fails during set up we may get the lock when we - * don't really need it. I don't think we care. + * Assumes parameters are already validated. * ******************************************************************************/ @@ -584,10 +555,6 @@ AcpiExStoreObjectToNode ( /* - * Assuming the parameters were already validated - */ - - /* * Get current type of the node, and object attached to Node */ TargetType = AcpiNsGetType (Node); @@ -597,7 +564,6 @@ AcpiExStoreObjectToNode ( Node, AcpiUtGetTypeName (SourceDesc->Common.Type), SourceDesc, AcpiUtGetTypeName (TargetType))); - /* * Resolve the source object to an actual value * (If it is a reference object) @@ -608,7 +574,6 @@ AcpiExStoreObjectToNode ( return_ACPI_STATUS (Status); } - /* * Do the actual store operation */ @@ -636,7 +601,8 @@ AcpiExStoreObjectToNode ( * * Copy and/or convert the source object to a new target object */ - Status = AcpiExStoreObject (SourceDesc, TargetType, &TargetDesc, WalkState); + Status = AcpiExStoreObject (SourceDesc, TargetType, &TargetDesc, + WalkState); if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); @@ -668,7 +634,6 @@ AcpiExStoreObjectToNode ( break; } - return_ACPI_STATUS (Status); } @@ -677,8 +642,9 @@ AcpiExStoreObjectToNode ( * * FUNCTION: AcpiExStoreObjectToObject * - * PARAMETERS: *SourceDesc - Value to be stored - * *DestDesc - Object to receive the value + * PARAMETERS: SourceDesc - Value to be stored + * DestDesc - Object to receive the value + * WalkState - Current walk state * * RETURN: Status * @@ -697,6 +663,8 @@ AcpiExStoreObjectToNode ( * This module allows destination types of Number, String, * and Buffer. * + * Assumes parameters are already validated. + * ******************************************************************************/ ACPI_STATUS @@ -711,10 +679,6 @@ AcpiExStoreObjectToObject ( FUNCTION_TRACE ("ExStoreObjectToObject"); - - /* - * Assuming the parameters are valid! - */ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Storing %p(%s) to %p(%s)\n", SourceDesc, AcpiUtGetTypeName (SourceDesc->Common.Type), DestDesc, AcpiUtGetTypeName (DestDesc->Common.Type))); @@ -737,7 +701,6 @@ AcpiExStoreObjectToObject ( return_ACPI_STATUS (AE_NOT_IMPLEMENTED); } - /* * Resolve the source object to an actual value * (If it is a reference object) @@ -748,13 +711,11 @@ AcpiExStoreObjectToObject ( return_ACPI_STATUS (Status); } - /* * Copy and/or convert the source object to the destination object */ - Status = AcpiExStoreObject (SourceDesc, DestinationType, &DestDesc, WalkState); - - + Status = AcpiExStoreObject (SourceDesc, DestinationType, &DestDesc, + WalkState); return_ACPI_STATUS (Status); } diff --git a/sys/contrib/dev/acpica/exstoren.c b/sys/contrib/dev/acpica/exstoren.c index 0cd24c1f915f..e82934a6b606 100644 --- a/sys/contrib/dev/acpica/exstoren.c +++ b/sys/contrib/dev/acpica/exstoren.c @@ -3,7 +3,7 @@ * * Module Name: exstoren - AML Interpreter object store support, * Store to Node (namespace object) - * $Revision: 40 $ + * $Revision: 41 $ * *****************************************************************************/ @@ -160,30 +160,28 @@ AcpiExResolveObject ( /* - * Ensure we have a Source that can be stored in the target + * Ensure we have a Target that can be stored to */ switch (TargetType) { - - /* This case handles the "interchangeable" types Integer, String, and Buffer. */ - - /* - * These cases all require only Integers or values that - * can be converted to Integers (Strings or Buffers) - */ case ACPI_TYPE_BUFFER_FIELD: case INTERNAL_TYPE_REGION_FIELD: case INTERNAL_TYPE_BANK_FIELD: case INTERNAL_TYPE_INDEX_FIELD: + /* + * These cases all require only Integers or values that + * can be converted to Integers (Strings or Buffers) + */ - /* - * Stores into a Field/Region or into a Buffer/String - * are all essentially the same. - */ case ACPI_TYPE_INTEGER: case ACPI_TYPE_STRING: case ACPI_TYPE_BUFFER: + /* + * Stores into a Field/Region or into a Integer/Buffer/String + * are all essentially the same. This case handles the + * "interchangeable" types Integer, String, and Buffer. + */ /* TBD: FIX - check for source==REF, resolve, then check type */ diff --git a/sys/contrib/dev/acpica/exutils.c b/sys/contrib/dev/acpica/exutils.c index 407894dde1cd..0bf2ff258c34 100644 --- a/sys/contrib/dev/acpica/exutils.c +++ b/sys/contrib/dev/acpica/exutils.c @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exutils - interpreter/scanner utilities - * $Revision: 85 $ + * $Revision: 88 $ * *****************************************************************************/ @@ -152,7 +152,6 @@ * PARAMETERS: None * * DESCRIPTION: Enter the interpreter execution region - * TBD: should be a macro * ******************************************************************************/ @@ -187,8 +186,6 @@ AcpiExEnterInterpreter (void) * already executing * 7) About to invoke a user-installed opregion handler * - * TBD: should be a macro - * ******************************************************************************/ void @@ -281,7 +278,8 @@ AcpiExTruncateFor32bitTable ( * * FUNCTION: AcpiExAcquireGlobalLock * - * PARAMETERS: Rule - Lock rule: AlwaysLock, NeverLock + * PARAMETERS: FieldFlags - Flags with Lock rule: + * AlwaysLock or NeverLock * * RETURN: TRUE/FALSE indicating whether the lock was actually acquired * @@ -293,7 +291,7 @@ AcpiExTruncateFor32bitTable ( BOOLEAN AcpiExAcquireGlobalLock ( - UINT32 Rule) + UINT32 FieldFlags) { BOOLEAN Locked = FALSE; ACPI_STATUS Status; @@ -302,9 +300,9 @@ AcpiExAcquireGlobalLock ( FUNCTION_TRACE ("ExAcquireGlobalLock"); - /* Only attempt lock if the Rule says so */ + /* Only attempt lock if the AlwaysLock bit is set */ - if (Rule == (UINT32) GLOCK_ALWAYS_LOCK) + if (FieldFlags & AML_FIELD_LOCK_RULE_MASK) { /* We should attempt to get the lock */ @@ -392,8 +390,8 @@ AcpiExDigitsNeeded ( /* * ACPI_INTEGER is unsigned, which is why we don't worry about a '-' */ - for (NumDigits = 1; - (AcpiUtShortDivide (&Value, Base, &Value, NULL)); + for (NumDigits = 1; + (AcpiUtShortDivide (&Value, Base, &Value, NULL)); ++NumDigits) { ; } } diff --git a/sys/contrib/dev/acpica/hwacpi.c b/sys/contrib/dev/acpica/hwacpi.c index 6f8e0b961daa..81394306d93d 100644 --- a/sys/contrib/dev/acpica/hwacpi.c +++ b/sys/contrib/dev/acpica/hwacpi.c @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: hwacpi - ACPI Hardware Initialization/Mode Interface - * $Revision: 46 $ + * $Revision: 47 $ * *****************************************************************************/ @@ -158,124 +158,76 @@ AcpiHwInitialize ( return_ACPI_STATUS (AE_NO_ACPI_TABLES); } - - /* Identify current ACPI/legacy mode */ - - switch (AcpiGbl_SystemFlags & SYS_MODES_MASK) + + /* + * Save the initial state of the ACPI event enable registers, so + * we can restore them when we exit. We probably won't exit, though. + * + * The location of the PM1aEvtBlk enable registers is defined as the + * base of PM1aEvtBlk + DIV_2(PM1aEvtBlkLength). Since the spec further + * fully defines the PM1aEvtBlk to be a total of 4 bytes, the offset + * for the enable registers is always 2 from the base. It is hard + * coded here. If this changes in the spec, this code will need to + * be modified. The PM1bEvtBlk behaves as expected. + */ + AcpiGbl_Pm1EnableRegisterSave = (UINT16) AcpiHwRegisterRead ( + ACPI_MTX_LOCK, PM1_EN); + + + /* + * The GPEs behave similarly, except that the length of the register + * block is not fixed, so the buffer must be allocated with malloc + */ + if (ACPI_VALID_ADDRESS (AcpiGbl_FADT->XGpe0Blk.Address) && + AcpiGbl_FADT->Gpe0BlkLen) { - case (SYS_MODE_ACPI): - - AcpiGbl_OriginalMode = SYS_MODE_ACPI; - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "System supports ACPI mode only.\n")); - break; - - - case (SYS_MODE_LEGACY): - - AcpiGbl_OriginalMode = SYS_MODE_LEGACY; - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, - "Tables loaded from buffer, hardware assumed to support LEGACY mode only.\n")); - break; - + /* GPE0 specified in FADT */ - case (SYS_MODE_ACPI | SYS_MODE_LEGACY): - - if (AcpiHwGetMode () == SYS_MODE_ACPI) - { - AcpiGbl_OriginalMode = SYS_MODE_ACPI; - } - else + AcpiGbl_Gpe0EnableRegisterSave = ACPI_MEM_ALLOCATE ( + DIV_2 (AcpiGbl_FADT->Gpe0BlkLen)); + if (!AcpiGbl_Gpe0EnableRegisterSave) { - AcpiGbl_OriginalMode = SYS_MODE_LEGACY; + return_ACPI_STATUS (AE_NO_MEMORY); } - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, - "System supports both ACPI and LEGACY modes.\n")); + /* Save state of GPE0 enable bits */ - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, - "System is currently in %s mode.\n", - (AcpiGbl_OriginalMode == SYS_MODE_ACPI) ? "ACPI" : "LEGACY")); - break; + for (Index = 0; Index < DIV_2 (AcpiGbl_FADT->Gpe0BlkLen); Index++) + { + AcpiGbl_Gpe0EnableRegisterSave[Index] = + (UINT8) AcpiHwRegisterRead (ACPI_MTX_LOCK, GPE0_EN_BLOCK | Index); + } } - - if (AcpiGbl_SystemFlags & SYS_MODE_ACPI) + else { - /* Target system supports ACPI mode */ - - /* - * The purpose of this code is to save the initial state - * of the ACPI event enable registers. An exit function will be - * registered which will restore this state when the application - * exits. The exit function will also clear all of the ACPI event - * status bits prior to restoring the original mode. - * - * The location of the PM1aEvtBlk enable registers is defined as the - * base of PM1aEvtBlk + DIV_2(PM1aEvtBlkLength). Since the spec further - * fully defines the PM1aEvtBlk to be a total of 4 bytes, the offset - * for the enable registers is always 2 from the base. It is hard - * coded here. If this changes in the spec, this code will need to - * be modified. The PM1bEvtBlk behaves as expected. - */ - AcpiGbl_Pm1EnableRegisterSave = (UINT16) AcpiHwRegisterRead ( - ACPI_MTX_LOCK, PM1_EN); + AcpiGbl_Gpe0EnableRegisterSave = NULL; + } + if (ACPI_VALID_ADDRESS (AcpiGbl_FADT->XGpe1Blk.Address) && + AcpiGbl_FADT->Gpe1BlkLen) + { + /* GPE1 defined */ - /* - * The GPEs behave similarly, except that the length of the register - * block is not fixed, so the buffer must be allocated with malloc - */ - if (ACPI_VALID_ADDRESS (AcpiGbl_FADT->XGpe0Blk.Address) && - AcpiGbl_FADT->Gpe0BlkLen) + AcpiGbl_Gpe1EnableRegisterSave = ACPI_MEM_ALLOCATE ( + DIV_2 (AcpiGbl_FADT->Gpe1BlkLen)); + if (!AcpiGbl_Gpe1EnableRegisterSave) { - /* GPE0 specified in FADT */ - - AcpiGbl_Gpe0EnableRegisterSave = ACPI_MEM_ALLOCATE ( - DIV_2 (AcpiGbl_FADT->Gpe0BlkLen)); - if (!AcpiGbl_Gpe0EnableRegisterSave) - { - return_ACPI_STATUS (AE_NO_MEMORY); - } - - /* Save state of GPE0 enable bits */ - - for (Index = 0; Index < DIV_2 (AcpiGbl_FADT->Gpe0BlkLen); Index++) - { - AcpiGbl_Gpe0EnableRegisterSave[Index] = - (UINT8) AcpiHwRegisterRead (ACPI_MTX_LOCK, GPE0_EN_BLOCK | Index); - } + return_ACPI_STATUS (AE_NO_MEMORY); } - else - { - AcpiGbl_Gpe0EnableRegisterSave = NULL; - } + /* save state of GPE1 enable bits */ - if (ACPI_VALID_ADDRESS (AcpiGbl_FADT->XGpe1Blk.Address) && - AcpiGbl_FADT->Gpe1BlkLen) + for (Index = 0; Index < DIV_2 (AcpiGbl_FADT->Gpe1BlkLen); Index++) { - /* GPE1 defined */ - - AcpiGbl_Gpe1EnableRegisterSave = ACPI_MEM_ALLOCATE ( - DIV_2 (AcpiGbl_FADT->Gpe1BlkLen)); - if (!AcpiGbl_Gpe1EnableRegisterSave) - { - return_ACPI_STATUS (AE_NO_MEMORY); - } - - /* save state of GPE1 enable bits */ - - for (Index = 0; Index < DIV_2 (AcpiGbl_FADT->Gpe1BlkLen); Index++) - { - AcpiGbl_Gpe1EnableRegisterSave[Index] = - (UINT8) AcpiHwRegisterRead (ACPI_MTX_LOCK, GPE1_EN_BLOCK | Index); - } + AcpiGbl_Gpe1EnableRegisterSave[Index] = + (UINT8) AcpiHwRegisterRead (ACPI_MTX_LOCK, GPE1_EN_BLOCK | Index); } + } - else - { - AcpiGbl_Gpe1EnableRegisterSave = NULL; - } + else + { + AcpiGbl_Gpe1EnableRegisterSave = NULL; } return_ACPI_STATUS (Status); @@ -368,68 +320,3 @@ AcpiHwGetMode (void) return_VALUE (SYS_MODE_LEGACY); } } - - -/****************************************************************************** - * - * FUNCTION: AcpiHwGetModeCapabilities - * - * PARAMETERS: none - * - * RETURN: logical OR of SYS_MODE_ACPI and SYS_MODE_LEGACY determined at initial - * system state. - * - * DESCRIPTION: Returns capablities of system - * - ******************************************************************************/ - -UINT32 -AcpiHwGetModeCapabilities (void) -{ - - FUNCTION_TRACE ("HwGetModeCapabilities"); - - - if (!(AcpiGbl_SystemFlags & SYS_MODES_MASK)) - { - if (AcpiHwGetMode () == SYS_MODE_LEGACY) - { - /* - * Assume that if this call is being made, AcpiInit has been called - * and ACPI support has been established by the presence of the - * tables. Therefore since we're in SYS_MODE_LEGACY, the system - * must support both modes - */ - AcpiGbl_SystemFlags |= (SYS_MODE_ACPI | SYS_MODE_LEGACY); - } - - else - { - /* TBD: [Investigate] !!! this may be unsafe... */ - /* - * system is is ACPI mode, so try to switch back to LEGACY to see if - * it is supported - */ - AcpiHwSetMode (SYS_MODE_LEGACY); - - if (AcpiHwGetMode () == SYS_MODE_LEGACY) - { - /* Now in SYS_MODE_LEGACY, so both are supported */ - - AcpiGbl_SystemFlags |= (SYS_MODE_ACPI | SYS_MODE_LEGACY); - AcpiHwSetMode (SYS_MODE_ACPI); - } - - else - { - /* Still in SYS_MODE_ACPI so this must be an ACPI only system */ - - AcpiGbl_SystemFlags |= SYS_MODE_ACPI; - } - } - } - - return_VALUE (AcpiGbl_SystemFlags & SYS_MODES_MASK); -} - - diff --git a/sys/contrib/dev/acpica/hwsleep.c b/sys/contrib/dev/acpica/hwsleep.c index 7cbb6c877a3d..8a18138bb156 100644 --- a/sys/contrib/dev/acpica/hwsleep.c +++ b/sys/contrib/dev/acpica/hwsleep.c @@ -2,7 +2,7 @@ /****************************************************************************** * * Name: hwsleep.c - ACPI Hardware Sleep/Wake Interface - * $Revision: 22 $ + * $Revision: 25 $ * *****************************************************************************/ @@ -122,6 +122,9 @@ #define _COMPONENT ACPI_HARDWARE MODULE_NAME ("hwsleep") +static UINT8 SleepTypeA; +static UINT8 SleepTypeB; + /****************************************************************************** * @@ -214,41 +217,39 @@ AcpiGetFirmwareWakingVector ( return_ACPI_STATUS (AE_OK); } + /****************************************************************************** * - * FUNCTION: AcpiEnterSleepState + * FUNCTION: AcpiEnterSleepStatePrep * * PARAMETERS: SleepState - Which sleep state to enter * * RETURN: Status * - * DESCRIPTION: Enter a system sleep state (see ACPI 2.0 spec p 231) + * DESCRIPTION: Prepare to enter a system sleep state (see ACPI 2.0 spec p 231) + * This function must execute with interrupts enabled. + * We break sleeping into 2 stages so that OSPM can handle + * various OS-specific tasks between the two steps. * ******************************************************************************/ ACPI_STATUS -AcpiEnterSleepState ( +AcpiEnterSleepStatePrep ( UINT8 SleepState) { ACPI_STATUS Status; ACPI_OBJECT_LIST ArgList; ACPI_OBJECT Arg; - UINT8 TypeA; - UINT8 TypeB; - UINT16 PM1AControl; - UINT16 PM1BControl; - - - FUNCTION_TRACE ("AcpiEnterSleepState"); + FUNCTION_TRACE ("AcpiEnterSleepStatePrep"); /* * _PSW methods could be run here to enable wake-on keyboard, LAN, etc. */ - Status = AcpiHwObtainSleepTypeRegisterData (SleepState, &TypeA, &TypeB); + Status = AcpiHwObtainSleepTypeRegisterData (SleepState, &SleepTypeA, &SleepTypeB); if (!ACPI_SUCCESS (Status)) { - return Status; + return_ACPI_STATUS (Status); } /* run the _PTS and _GTS methods */ @@ -264,11 +265,49 @@ AcpiEnterSleepState ( AcpiEvaluateObject (NULL, "\\_PTS", &ArgList, NULL); AcpiEvaluateObject (NULL, "\\_GTS", &ArgList, NULL); + return_ACPI_STATUS (AE_OK); +} + + + +/****************************************************************************** + * + * FUNCTION: AcpiEnterSleepState + * + * PARAMETERS: SleepState - Which sleep state to enter + * + * RETURN: Status + * + * DESCRIPTION: Enter a system sleep state (see ACPI 2.0 spec p 231) + * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED + * + ******************************************************************************/ + +ACPI_STATUS +AcpiEnterSleepState ( + UINT8 SleepState) +{ + UINT16 PM1AControl; + UINT16 PM1BControl; + + + FUNCTION_TRACE ("AcpiEnterSleepState"); + + if ((SleepTypeA > ACPI_SLEEP_TYPE_MAX) || + (SleepTypeB > ACPI_SLEEP_TYPE_MAX)) + { + REPORT_ERROR (("Sleep values out of range: A=%x B=%x\n", + SleepTypeA, SleepTypeB)); + return_ACPI_STATUS (AE_ERROR); + } + /* clear wake status */ AcpiHwRegisterBitAccess (ACPI_WRITE, ACPI_MTX_LOCK, WAK_STS, 1); - disable (); + AcpiHwClearAcpiStatus(); + + /* disable arbitration here? */ AcpiHwDisableNonWakeupGpes(); @@ -283,8 +322,8 @@ AcpiEnterSleepState ( /* mask in SLP_TYP */ - PM1AControl |= (TypeA << AcpiHwGetBitShift (SLP_TYPE_X_MASK)); - PM1BControl |= (TypeB << AcpiHwGetBitShift (SLP_TYPE_X_MASK)); + PM1AControl |= (SleepTypeA << AcpiHwGetBitShift (SLP_TYPE_X_MASK)); + PM1BControl |= (SleepTypeB << AcpiHwGetBitShift (SLP_TYPE_X_MASK)); /* write #1: fill in SLP_TYP data */ @@ -296,10 +335,6 @@ AcpiEnterSleepState ( PM1AControl |= (1 << AcpiHwGetBitShift (SLP_EN_MASK)); PM1BControl |= (1 << AcpiHwGetBitShift (SLP_EN_MASK)); - /* flush caches */ - - wbinvd(); - /* write #2: SLP_TYP + SLP_EN */ AcpiHwRegisterWrite (ACPI_MTX_LOCK, PM1A_CONTROL, PM1AControl); @@ -318,15 +353,10 @@ AcpiEnterSleepState ( /* wait until we enter sleep state */ - do + while (!AcpiHwRegisterBitAccess (ACPI_READ, ACPI_MTX_LOCK, WAK_STS)) { - AcpiOsStall(10000); + /* spin until we wake */ } - while (!AcpiHwRegisterBitAccess (ACPI_READ, ACPI_MTX_LOCK, WAK_STS)); - - AcpiHwEnableNonWakeupGpes(); - - enable (); return_ACPI_STATUS (AE_OK); } @@ -353,6 +383,8 @@ AcpiLeaveSleepState ( FUNCTION_TRACE ("AcpiLeaveSleepState"); + /* Ensure EnterSleepStatePrep -> EnterSleepState ordering */ + SleepTypeA = ACPI_SLEEP_TYPE_INVALID; MEMSET (&ArgList, 0, sizeof(ArgList)); ArgList.Count = 1; diff --git a/sys/contrib/dev/acpica/nsaccess.c b/sys/contrib/dev/acpica/nsaccess.c index 4afb4b7d4020..c52a62ac3603 100644 --- a/sys/contrib/dev/acpica/nsaccess.c +++ b/sys/contrib/dev/acpica/nsaccess.c @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: nsaccess - Top-level functions for accessing ACPI namespace - * $Revision: 135 $ + * $Revision: 141 $ * ******************************************************************************/ @@ -165,14 +165,12 @@ AcpiNsRootInitialize (void) goto UnlockAndExit; } - /* * Tell the rest of the subsystem that the root is initialized * (This is OK because the namespace is locked) */ AcpiGbl_RootNode = &AcpiGbl_RootNodeStruct; - /* Enter the pre-defined names in the name table */ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Entering predefined entries into namespace\n")); @@ -213,10 +211,8 @@ AcpiNsRootInitialize (void) * internal representation. Only types actually * used for initial values are implemented here. */ - switch (InitVal->Type) { - case ACPI_TYPE_INTEGER: ObjDesc->Integer.Value = @@ -248,7 +244,6 @@ AcpiNsRootInitialize (void) */ Status = AcpiOsCreateSemaphore (ACPI_NO_UNIT_LIMIT, 1, &ObjDesc->Mutex.Semaphore); - if (ACPI_FAILURE (Status)) { goto UnlockAndExit; @@ -260,14 +255,12 @@ AcpiNsRootInitialize (void) */ AcpiGbl_GlobalLockSemaphore = ObjDesc->Mutex.Semaphore; } - else { /* Create a mutex */ Status = AcpiOsCreateSemaphore (1, 1, &ObjDesc->Mutex.Semaphore); - if (ACPI_FAILURE (Status)) { goto UnlockAndExit; @@ -337,7 +330,6 @@ AcpiNsLookup ( ACPI_STATUS Status; ACPI_NAMESPACE_NODE *PrefixNode; ACPI_NAMESPACE_NODE *CurrentNode = NULL; - ACPI_NAMESPACE_NODE *ScopeToPush = NULL; ACPI_NAMESPACE_NODE *ThisNode = NULL; UINT32 NumSegments; ACPI_NAME SimpleName; @@ -346,8 +338,6 @@ AcpiNsLookup ( ACPI_OBJECT_TYPE8 ThisSearchType; UINT32 LocalFlags = Flags & ~NS_ERROR_IF_FOUND; - DEBUG_EXEC (UINT32 i;) - FUNCTION_TRACE ("NsLookup"); @@ -357,15 +347,12 @@ AcpiNsLookup ( return_ACPI_STATUS (AE_BAD_PARAMETER); } - AcpiGbl_NsLookupCount++; - *ReturnNode = ENTRY_NOT_FOUND; - if (!AcpiGbl_RootNode) { - return (AE_NO_NAMESPACE); + return_ACPI_STATUS (AE_NO_NAMESPACE); } /* @@ -375,7 +362,8 @@ AcpiNsLookup ( if ((!ScopeInfo) || (!ScopeInfo->Scope.Node)) { - ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Null scope prefix, using root node (%p)\n", + ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, + "Null scope prefix, using root node (%p)\n", AcpiGbl_RootNode)); PrefixNode = AcpiGbl_RootNode; @@ -385,7 +373,6 @@ AcpiNsLookup ( PrefixNode = ScopeInfo->Scope.Node; } - /* * This check is explicitly split to relax the TypeToCheckFor * conditions for BankFieldDefn. Originally, both BankFieldDefn and @@ -399,34 +386,30 @@ AcpiNsLookup ( TypeToCheckFor = ACPI_TYPE_REGION; } - else if (INTERNAL_TYPE_BANK_FIELD_DEFN == Type) { /* BankFieldDefn defines data fields in a Field Object */ TypeToCheckFor = ACPI_TYPE_ANY; } - else { TypeToCheckFor = Type; } - /* TBD: [Restructure] - Move the pathname stuff into a new procedure */ - - /* Examine the name pointer */ + /* Examine the pathname */ if (!Pathname) { - /* 8-12-98 ASL Grammar Update supports null NamePath */ + /* Null NamePath -- is allowed */ NullNamePath = TRUE; - NumSegments = 0; - ThisNode = AcpiGbl_RootNode; + NumSegments = 0; + ThisNode = AcpiGbl_RootNode; ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, - "Null Pathname (Zero segments), Flags=%x\n", Flags)); + "Null Pathname (Zero segments), Flags=%x\n", Flags)); } else @@ -451,38 +434,37 @@ AcpiNsLookup ( */ if (*Pathname == AML_ROOT_PREFIX) { - /* Pathname is fully qualified, look in root name table */ + /* Pathname is fully qualified, start from the root */ CurrentNode = AcpiGbl_RootNode; - /* point to segment part */ + /* Point to segment part */ Pathname++; ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Searching from root [%p]\n", CurrentNode)); - /* Direct reference to root, "\" */ - if (!(*Pathname)) { + /* Direct reference to root, "\" */ + ThisNode = AcpiGbl_RootNode; goto CheckForNewScopeAndExit; } } - else { /* Pathname is relative to current scope, start there */ CurrentNode = PrefixNode; - ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Searching relative to pfx scope [%p]\n", + ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, + "Searching relative to pfx scope [%p]\n", PrefixNode)); /* - * Handle up-prefix (carat). More than one prefix - * is supported + * Handle up-prefix (carat). More than one prefix is supported */ while (*Pathname == AML_PARENT_PREFIX) { @@ -490,7 +472,7 @@ AcpiNsLookup ( Pathname++; - /* Backup to the parent's scope */ + /* Backup to the parent's scope */ ThisNode = AcpiNsGetParentObject (CurrentNode); if (!ThisNode) @@ -506,41 +488,36 @@ AcpiNsLookup ( } } - /* - * Examine the name prefix opcode, if any, - * to determine the number of segments + * Examine the name prefix opcode, if any, to determine the number of + * segments */ if (*Pathname == AML_DUAL_NAME_PREFIX) { - NumSegments = 2; - - /* point to first segment */ + /* Two segments, point to first segment */ + NumSegments = 2; Pathname++; ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Dual Pathname (2 segments, Flags=%X)\n", Flags)); } - else if (*Pathname == AML_MULTI_NAME_PREFIX_OP) { - NumSegments = (UINT32)* (UINT8 *) ++Pathname; - - /* point to first segment */ + /* Extract segment count, point to first segment */ + NumSegments = (UINT32)* (UINT8 *) ++Pathname; Pathname++; ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Multi Pathname (%d Segments, Flags=%X) \n", NumSegments, Flags)); } - else { /* - * No Dual or Multi prefix, hence there is only one - * segment and Pathname is already pointing to it. + * No Dual or Multi prefix, hence there is only one segment and + * Pathname is already pointing to it. */ NumSegments = 1; @@ -548,26 +525,12 @@ AcpiNsLookup ( "Simple Pathname (1 segment, Flags=%X)\n", Flags)); } -#ifdef ACPI_DEBUG - - /* TBD: [Restructure] Make this a procedure */ - - /* Debug only: print the entire name that we are about to lookup */ - - ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "[")); - - for (i = 0; i < NumSegments; i++) - { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_NAMES, "%4.4s/", (char*)&Pathname[i * 4])); - } - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_NAMES, "]\n")); -#endif + DEBUG_EXEC (AcpiNsPrintPathname (NumSegments, Pathname)); } - /* - * Search namespace for each segment of the name. - * Loop through and verify/add each name segment. + * Search namespace for each segment of the name. Loop through and + * verify/add each name segment. */ while (NumSegments-- && CurrentNode) { @@ -594,7 +557,6 @@ AcpiNsLookup ( CurrentNode, InterpreterMode, ThisSearchType, LocalFlags, &ThisNode); - if (ACPI_FAILURE (Status)) { if (Status == AE_NOT_FOUND) @@ -609,7 +571,6 @@ AcpiNsLookup ( return_ACPI_STATUS (Status); } - /* * If 1) This is the last segment (NumSegments == 0) * 2) and looking for a specific type @@ -636,7 +597,7 @@ AcpiNsLookup ( REPORT_WARNING ( ("NsLookup: %4.4s, type %X, checking for type %X\n", - (char*)&SimpleName, ThisNode->Type, TypeToCheckFor)); + (char *) &SimpleName, ThisNode->Type, TypeToCheckFor)); } /* @@ -676,32 +637,19 @@ CheckForNewScopeAndExit: if (!(Flags & NS_DONT_OPEN_SCOPE) && (WalkState)) { /* - * If entry is a type which opens a scope, - * push the new scope on the scope stack. + * If entry is a type which opens a scope, push the new scope on the + * scope stack. */ if (AcpiNsOpensScope (TypeToCheckFor)) { - /* 8-12-98 ASL Grammar Update supports null NamePath */ - - if (NullNamePath) - { - /* TBD: [Investigate] - is this the correct thing to do? */ - - ScopeToPush = NULL; - } - else - { - ScopeToPush = ThisNode; - } - - Status = AcpiDsScopeStackPush (ScopeToPush, Type, - WalkState); + Status = AcpiDsScopeStackPush (ThisNode, Type, WalkState); if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); } - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Set global scope to %p\n", ScopeToPush)); + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, + "Set global scope to %p\n", ThisNode)); } } diff --git a/sys/contrib/dev/acpica/nsalloc.c b/sys/contrib/dev/acpica/nsalloc.c index 0958bcca302c..52afd73e8745 100644 --- a/sys/contrib/dev/acpica/nsalloc.c +++ b/sys/contrib/dev/acpica/nsalloc.c @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: nsalloc - Namespace allocation and deletion utilities - * $Revision: 60 $ + * $Revision: 62 $ * ******************************************************************************/ @@ -216,13 +216,9 @@ AcpiNsDeleteNode ( ACPI_MEM_TRACKING (AcpiGbl_MemoryLists[ACPI_MEM_LIST_NSNODE].TotalFreed++); /* - * Detach an object if there is one + * Detach an object if there is one then delete the node */ - if (Node->Object) - { - AcpiNsDetachObject (Node); - } - + AcpiNsDetachObject (Node); ACPI_MEM_FREE (Node); return_VOID; } @@ -239,7 +235,11 @@ AcpiNsDeleteNode ( * * RETURN: None * - * DESCRIPTION: Initialize a new entry within a namespace table. + * DESCRIPTION: Initialize a new namespace node and install it amongst + * its peers. + * + * Note: Current namespace lookup is linear search, so the nodes + * are not linked in any particular order. * ******************************************************************************/ @@ -267,17 +267,13 @@ AcpiNsInstallNode ( OwnerId = WalkState->OwnerId; } - - /* link the new entry into the parent and existing children */ - - /* TBD: Could be first, last, or alphabetic */ + /* Link the new entry into the parent and existing children */ ChildNode = ParentNode->Child; if (!ChildNode) { ParentNode->Child = Node; } - else { while (!(ChildNode->Flags & ANOBJ_END_OF_PEER_LIST)) @@ -498,7 +494,6 @@ AcpiNsDeleteNamespaceSubtree ( ChildNode = 0; } } - else { /* @@ -641,13 +636,11 @@ AcpiNsDeleteNamespaceByOwner ( ParentNode = ChildNode; ChildNode = 0; } - else if (ChildNode->OwnerId == OwnerId) { AcpiNsRemoveReference (ChildNode); } } - else { /* diff --git a/sys/contrib/dev/acpica/nsdump.c b/sys/contrib/dev/acpica/nsdump.c index f8888c4915d0..f2b0b3549d86 100644 --- a/sys/contrib/dev/acpica/nsdump.c +++ b/sys/contrib/dev/acpica/nsdump.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: nsdump - table dumping routines for debug - * $Revision: 105 $ + * $Revision: 116 $ * *****************************************************************************/ @@ -127,9 +127,48 @@ #define _COMPONENT ACPI_NAMESPACE MODULE_NAME ("nsdump") - #if defined(ACPI_DEBUG) || defined(ENABLE_DEBUGGER) + +/******************************************************************************* + * + * FUNCTION: AcpiNsPrintPathname + * + * PARAMETERS: NumSegment - Number of ACPI name segments + * Pathname - The compressed (internal) path + * + * DESCRIPTION: Print an object's full namespace pathname + * + ******************************************************************************/ + +void +AcpiNsPrintPathname ( + UINT32 NumSegments, + char *Pathname) +{ + UINT32 i; + + PROC_NAME ("AcpiNsPrintPathname"); + + + if (!(AcpiDbgLevel & ACPI_LV_NAMES) || !(AcpiDbgLayer & ACPI_NAMESPACE)) + { + return; + } + + /* Print the entire name */ + + ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "[")); + + for (i = 0; i < NumSegments; i++) + { + AcpiOsPrintf ("%4.4s.", (char *) &Pathname[i * 4]); + } + + AcpiOsPrintf ("]\n"); +} + + /******************************************************************************* * * FUNCTION: AcpiNsDumpPathname @@ -176,7 +215,7 @@ AcpiNsDumpPathname ( Length = PATHNAME_MAX; if (ACPI_SUCCESS (AcpiNsHandleToPathname (Handle, &Length, Buffer))) { - AcpiOsPrintf ("%s %s (%p)\n", Msg, Buffer, Handle); + AcpiOsPrintf ("%s %s (Node %p)\n", Msg, Buffer, Handle); } ACPI_MEM_FREE (Buffer); @@ -232,6 +271,11 @@ AcpiNsDumpOneObject ( return (AE_OK); } + if (!((ACPI_LV_TABLES & AcpiDbgLevel) && (_COMPONENT & AcpiDbgLayer))) + { + return (AE_OK); + } + if (!ObjHandle) { ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Null object handle\n")); @@ -246,66 +290,58 @@ AcpiNsDumpOneObject ( return (AE_OK); } - /* Indent the object according to the level */ while (LevelTmp--) { - /* Print appropriate characters to form tree structure */ if (LevelTmp) { if (DownstreamSiblingMask & WhichBit) { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "|")); + AcpiOsPrintf ("|"); } - else { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " ")); + AcpiOsPrintf (" "); } WhichBit <<= 1; } - else { if (AcpiNsExistDownstreamSibling (ThisNode + 1)) { DownstreamSiblingMask |= (1 << (Level - 1)); - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "+")); + AcpiOsPrintf ("+"); } - else { DownstreamSiblingMask &= ACPI_UINT32_MAX ^ (1 << (Level - 1)); - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "+")); + AcpiOsPrintf ("+"); } if (ThisNode->Child == NULL) { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "-")); + AcpiOsPrintf ("-"); } - else if (AcpiNsExistDownstreamSibling (ThisNode->Child)) { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "+")); + AcpiOsPrintf ("+"); } - else { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "-")); + AcpiOsPrintf ("-"); } } } - /* Check the integrity of our data */ if (Type > INTERNAL_TYPE_MAX) { - Type = INTERNAL_TYPE_DEF_ANY; /* prints as *ERROR* */ + Type = INTERNAL_TYPE_DEF_ANY; /* prints as *ERROR* */ } if (!AcpiUtValidAcpiName (ThisNode->Name)) @@ -316,10 +352,10 @@ AcpiNsDumpOneObject ( /* * Now we can print out the pertinent information */ - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " %4.4s %-12s %p", - (char*)&ThisNode->Name, AcpiUtGetTypeName (Type), ThisNode)); + AcpiOsPrintf (" %4.4s %-12s %p", + (char *) &ThisNode->Name, AcpiUtGetTypeName (Type), ThisNode); - ObjDesc = ThisNode->Object; + ObjDesc = AcpiNsGetAttachedObject (ThisNode); switch (Info->DisplayType) { @@ -329,116 +365,116 @@ AcpiNsDumpOneObject ( { /* No attached object, we are done */ - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "\n")); + AcpiOsPrintf ("\n"); return (AE_OK); } - switch (Type) { case ACPI_TYPE_PROCESSOR: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " ID %d Addr %.4X Len %.4X\n", + AcpiOsPrintf (" ID %d Addr %.4X Len %.4X\n", ObjDesc->Processor.ProcId, ObjDesc->Processor.Address, - ObjDesc->Processor.Length)); + ObjDesc->Processor.Length); break; case ACPI_TYPE_DEVICE: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Notification object: %p", ObjDesc)); + AcpiOsPrintf (" Notification object: %p", ObjDesc); break; case ACPI_TYPE_METHOD: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Args %d Len %.4X Aml %p \n", + AcpiOsPrintf (" Args %d Len %.4X Aml %p \n", ObjDesc->Method.ParamCount, ObjDesc->Method.AmlLength, - ObjDesc->Method.AmlStart)); + ObjDesc->Method.AmlStart); break; case ACPI_TYPE_INTEGER: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " = %8.8X%8.8X\n", + AcpiOsPrintf (" = %8.8X%8.8X\n", HIDWORD (ObjDesc->Integer.Value), - LODWORD (ObjDesc->Integer.Value))); + LODWORD (ObjDesc->Integer.Value)); break; case ACPI_TYPE_PACKAGE: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Elements %.2X\n", - ObjDesc->Package.Count)); + AcpiOsPrintf (" Elements %.2X\n", + ObjDesc->Package.Count); break; case ACPI_TYPE_BUFFER: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Len %.2X", - ObjDesc->Buffer.Length)); + AcpiOsPrintf (" Len %.2X", + ObjDesc->Buffer.Length); /* Dump some of the buffer */ if (ObjDesc->Buffer.Length > 0) { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " =")); + AcpiOsPrintf (" ="); for (i = 0; (i < ObjDesc->Buffer.Length && i < 12); i++) { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " %.2X", - ObjDesc->Buffer.Pointer[i])); + AcpiOsPrintf (" %.2X", ObjDesc->Buffer.Pointer[i]); } } - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "\n")); + AcpiOsPrintf ("\n"); break; case ACPI_TYPE_STRING: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Len %.2X", - ObjDesc->String.Length)); - + AcpiOsPrintf (" Len %.2X", ObjDesc->String.Length); + if (ObjDesc->String.Length > 0) { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " = \"%.32s\"...", - ObjDesc->String.Pointer)); + AcpiOsPrintf (" = \"%.32s\"...", ObjDesc->String.Pointer); } - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "\n")); + AcpiOsPrintf ("\n"); break; case ACPI_TYPE_REGION: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " [%s]", - AcpiUtGetRegionName (ObjDesc->Region.SpaceId))); + AcpiOsPrintf (" [%s]", AcpiUtGetRegionName (ObjDesc->Region.SpaceId)); if (ObjDesc->Region.Flags & AOPOBJ_DATA_VALID) { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Addr %8.8X%8.8X Len %.4X\n", + AcpiOsPrintf (" Addr %8.8X%8.8X Len %.4X\n", HIDWORD(ObjDesc->Region.Address), LODWORD(ObjDesc->Region.Address), - ObjDesc->Region.Length)); + ObjDesc->Region.Length); } else { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " [Address/Length not evaluated]\n")); + AcpiOsPrintf (" [Address/Length not evaluated]\n"); } break; case INTERNAL_TYPE_REFERENCE: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " [%s]\n", - AcpiPsGetOpcodeName (ObjDesc->Reference.Opcode))); + AcpiOsPrintf (" [%s]\n", + AcpiPsGetOpcodeName (ObjDesc->Reference.Opcode)); break; case ACPI_TYPE_BUFFER_FIELD: - - /* TBD: print Buffer name when we can easily get it */ + if (ObjDesc->BufferField.BufferObj && + ObjDesc->BufferField.BufferObj->Buffer.Node) + { + AcpiOsPrintf (" Buf [%4.4s]", + (char *) &ObjDesc->BufferField.BufferObj->Buffer.Node->Name); + } break; case INTERNAL_TYPE_REGION_FIELD: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Rgn [%4.4s]", - (char *) &ObjDesc->CommonField.RegionObj->Region.Node->Name)); + AcpiOsPrintf (" Rgn [%4.4s]", + (char *) &ObjDesc->CommonField.RegionObj->Region.Node->Name); break; case INTERNAL_TYPE_BANK_FIELD: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Rgn [%4.4s]", - (char *) &ObjDesc->CommonField.RegionObj->Region.Node->Name)); + AcpiOsPrintf (" Rgn [%4.4s] Bnk [%4.4s]", + (char *) &ObjDesc->CommonField.RegionObj->Region.Node->Name, + (char *) &ObjDesc->BankField.BankObj->CommonField.Node->Name); break; case INTERNAL_TYPE_INDEX_FIELD: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Rgn [%4.4s]", - (char *) &ObjDesc->IndexField.IndexObj->CommonField.RegionObj->Region.Node->Name)); + AcpiOsPrintf (" Idx [%4.4s] Dat [%4.4s]", + (char *) &ObjDesc->IndexField.IndexObj->CommonField.Node->Name, + (char *) &ObjDesc->IndexField.DataObj->CommonField.Node->Name); break; default: - - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Object %p\n", ObjDesc)); + AcpiOsPrintf (" Object %p\n", ObjDesc); break; } @@ -450,10 +486,11 @@ AcpiNsDumpOneObject ( case INTERNAL_TYPE_REGION_FIELD: case INTERNAL_TYPE_BANK_FIELD: case INTERNAL_TYPE_INDEX_FIELD: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Off %.2X Len %.2X Acc %.2d\n", - (ObjDesc->CommonField.BaseByteOffset * 8) + ObjDesc->CommonField.StartFieldBitOffset, - ObjDesc->CommonField.BitLength, - ObjDesc->CommonField.AccessBitWidth)); + AcpiOsPrintf (" Off %.2X Len %.2X Acc %.2d\n", + (ObjDesc->CommonField.BaseByteOffset * 8) + + ObjDesc->CommonField.StartFieldBitOffset, + ObjDesc->CommonField.BitLength, + ObjDesc->CommonField.AccessBitWidth); break; } @@ -462,64 +499,59 @@ AcpiNsDumpOneObject ( case ACPI_DISPLAY_OBJECTS: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "%p O:%p", - ThisNode, ObjDesc)); + AcpiOsPrintf ("%p O:%p", + ThisNode, ObjDesc); if (!ObjDesc) { /* No attached object, we are done */ - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "\n")); + AcpiOsPrintf ("\n"); return (AE_OK); } - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "(R%d)", - ObjDesc->Common.ReferenceCount)); + AcpiOsPrintf ("(R%d)", + ObjDesc->Common.ReferenceCount); switch (Type) { - case ACPI_TYPE_METHOD: /* Name is a Method and its AML offset/length are set */ - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " M:%p-%X\n", - ObjDesc->Method.AmlStart, - ObjDesc->Method.AmlLength)); - + AcpiOsPrintf (" M:%p-%X\n", ObjDesc->Method.AmlStart, + ObjDesc->Method.AmlLength); break; - case ACPI_TYPE_INTEGER: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " N:%X%X\n", - HIDWORD(ObjDesc->Integer.Value), - LODWORD(ObjDesc->Integer.Value))); + AcpiOsPrintf (" N:%X%X\n", HIDWORD(ObjDesc->Integer.Value), + LODWORD(ObjDesc->Integer.Value)); break; - case ACPI_TYPE_STRING: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " S:%p-%X\n", - ObjDesc->String.Pointer, - ObjDesc->String.Length)); + AcpiOsPrintf (" S:%p-%X\n", ObjDesc->String.Pointer, + ObjDesc->String.Length); break; - case ACPI_TYPE_BUFFER: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " B:%p-%X\n", - ObjDesc->Buffer.Pointer, - ObjDesc->Buffer.Length)); + AcpiOsPrintf (" B:%p-%X\n", ObjDesc->Buffer.Pointer, + ObjDesc->Buffer.Length); break; - default: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "\n")); + AcpiOsPrintf ("\n"); break; } break; + + + default: + AcpiOsPrintf ("\n"); + break; } /* If debug turned off, done */ @@ -532,7 +564,7 @@ AcpiNsDumpOneObject ( /* If there is an attached object, display it */ - ObjDesc = ThisNode->Object; + ObjDesc = AcpiNsGetAttachedObject (ThisNode); /* Dump attached objects */ @@ -542,36 +574,33 @@ AcpiNsDumpOneObject ( /* Decode the type of attached object and dump the contents */ - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Attached Object %p: ", ObjDesc)); + AcpiOsPrintf (" Attached Object %p: ", ObjDesc); if (VALID_DESCRIPTOR_TYPE (ObjDesc, ACPI_DESC_TYPE_NAMED)) { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "(Ptr to Node)\n")); + AcpiOsPrintf ("(Ptr to Node)\n"); BytesToDump = sizeof (ACPI_NAMESPACE_NODE); } - else if (VALID_DESCRIPTOR_TYPE (ObjDesc, ACPI_DESC_TYPE_INTERNAL)) { ObjType = ObjDesc->Common.Type; if (ObjType > INTERNAL_TYPE_MAX) { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "(Ptr to ACPI Object type %X [UNKNOWN])\n", ObjType)); + AcpiOsPrintf ("(Ptr to ACPI Object type %X [UNKNOWN])\n", ObjType); BytesToDump = 32; } - else { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "(Ptr to ACPI Object type %2.2X [%s])\n", - ObjType, AcpiUtGetTypeName (ObjType))); + AcpiOsPrintf ("(Ptr to ACPI Object type %2.2X [%s])\n", + ObjType, AcpiUtGetTypeName (ObjType)); BytesToDump = sizeof (ACPI_OPERAND_OBJECT); } } - else { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "(String or Buffer - not descriptor)\n")); + AcpiOsPrintf ("(String or Buffer - not descriptor)\n"); BytesToDump = 16; } @@ -625,11 +654,11 @@ AcpiNsDumpOneObject ( goto Cleanup; } - ObjType = INTERNAL_TYPE_INVALID; /* Terminate loop after next pass */ + ObjType = INTERNAL_TYPE_INVALID; /* Terminate loop after next pass */ } Cleanup: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "\n")); + AcpiOsPrintf ("\n"); return (AE_OK); } @@ -799,7 +828,7 @@ AcpiNsDumpTables ( } - AcpiNsDumpObjects (ACPI_TYPE_ANY, ACPI_DISPLAY_OBJECTS, MaxDepth, + AcpiNsDumpObjects (ACPI_TYPE_ANY, ACPI_DISPLAY_OBJECTS, MaxDepth, ACPI_UINT32_MAX, SearchHandle); return_VOID; } @@ -829,6 +858,7 @@ AcpiNsDumpEntry ( Info.DebugLevel = DebugLevel; Info.OwnerId = ACPI_UINT32_MAX; + Info.DisplayType = ACPI_DISPLAY_SUMMARY; AcpiNsDumpOneObject (Handle, 1, &Info, NULL); } diff --git a/sys/contrib/dev/acpica/nseval.c b/sys/contrib/dev/acpica/nseval.c index 2cf9149845d0..d863facf0861 100644 --- a/sys/contrib/dev/acpica/nseval.c +++ b/sys/contrib/dev/acpica/nseval.c @@ -2,7 +2,7 @@ * * Module Name: nseval - Object evaluation interfaces -- includes control * method lookup and execution. - * $Revision: 102 $ + * $Revision: 104 $ * ******************************************************************************/ @@ -217,7 +217,7 @@ AcpiNsEvaluateRelative ( * to evaluate it. */ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "%s [%p] Value %p\n", - Pathname, Node, Node->Object)); + Pathname, Node, AcpiNsGetAttachedObject (Node))); Status = AcpiNsEvaluateByHandle (Node, Params, ReturnObject); @@ -295,7 +295,7 @@ AcpiNsEvaluateByName ( * to evaluate it. */ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "%s [%p] Value %p\n", - Pathname, Node, Node->Object)); + Pathname, Node, AcpiNsGetAttachedObject (Node))); Status = AcpiNsEvaluateByHandle (Node, Params, ReturnObject); @@ -498,7 +498,7 @@ AcpiNsExecuteControlMethod ( DUMP_PATHNAME (MethodNode, "NsExecuteControlMethod: Executing", ACPI_LV_NAMES, _COMPONENT); - ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "At offset %p\n", + ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "At offset %p\n", ObjDesc->Method.AmlStart + 1)); diff --git a/sys/contrib/dev/acpica/nsinit.c b/sys/contrib/dev/acpica/nsinit.c index 2456efc72077..9e6765b3ea70 100644 --- a/sys/contrib/dev/acpica/nsinit.c +++ b/sys/contrib/dev/acpica/nsinit.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: nsinit - namespace initialization - * $Revision: 33 $ + * $Revision: 35 $ * *****************************************************************************/ @@ -279,7 +279,7 @@ AcpiNsInitOneObject ( /* And even then, we are only interested in a few object types */ Type = AcpiNsGetType (ObjHandle); - ObjDesc = Node->Object; + ObjDesc = AcpiNsGetAttachedObject (Node); if (!ObjDesc) { return (AE_OK); @@ -412,7 +412,7 @@ AcpiNsInitOneDevice ( if (!Node) { AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); - return (AE_BAD_PARAMETER); + return_ACPI_STATUS (AE_BAD_PARAMETER); } AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); diff --git a/sys/contrib/dev/acpica/nsload.c b/sys/contrib/dev/acpica/nsload.c index cef3b6434c2d..f3de3620ad64 100644 --- a/sys/contrib/dev/acpica/nsload.c +++ b/sys/contrib/dev/acpica/nsload.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: nsload - namespace loading/expanding/contracting procedures - * $Revision: 47 $ + * $Revision: 48 $ * *****************************************************************************/ @@ -232,7 +232,7 @@ AcpiNsOneCompleteParse ( return_ACPI_STATUS (AE_NO_MEMORY); } - Status = AcpiDsInitAmlWalk (WalkState, ParseRoot, NULL, TableDesc->AmlStart, + Status = AcpiDsInitAmlWalk (WalkState, ParseRoot, NULL, TableDesc->AmlStart, TableDesc->AmlLength, NULL, NULL, PassNumber); if (ACPI_FAILURE (Status)) { @@ -315,7 +315,7 @@ AcpiNsParseTable ( * FUNCTION: AcpiNsLoadTable * * PARAMETERS: TableDesc - Descriptor for table to be loaded - * Node - Owning NS node + * Node - Owning NS node * * RETURN: Status * diff --git a/sys/contrib/dev/acpica/nsnames.c b/sys/contrib/dev/acpica/nsnames.c index 44731d2a45e7..644141c6a3b1 100644 --- a/sys/contrib/dev/acpica/nsnames.c +++ b/sys/contrib/dev/acpica/nsnames.c @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: nsnames - Name manipulation and search - * $Revision: 64 $ + * $Revision: 65 $ * ******************************************************************************/ @@ -250,13 +250,6 @@ AcpiNsGetPathnameLength ( Size += PATH_SEGMENT_LENGTH; } - /* Special case for size still 0 - no parent for "special" nodes */ - - if (!Size) - { - Size = PATH_SEGMENT_LENGTH; - } - return (Size + 1); } @@ -327,6 +320,13 @@ AcpiNsHandleToPathname ( goto Exit; } + if (Size < ACPI_NAME_SIZE) + { + UserBuffer[0] = '\\'; + UserBuffer[1] = 0; + goto Exit; + } + /* Store null terminator */ UserBuffer[Size] = 0; diff --git a/sys/contrib/dev/acpica/nsobject.c b/sys/contrib/dev/acpica/nsobject.c index 05bfd796f5f4..a6166c5a823b 100644 --- a/sys/contrib/dev/acpica/nsobject.c +++ b/sys/contrib/dev/acpica/nsobject.c @@ -2,7 +2,7 @@ * * Module Name: nsobject - Utilities for objects attached to namespace * table entries - * $Revision: 67 $ + * $Revision: 73 $ * ******************************************************************************/ @@ -141,6 +141,8 @@ * DESCRIPTION: Record the given object as the value associated with the * name whose ACPI_HANDLE is passed. If Object is NULL * and Type is ACPI_TYPE_ANY, set the name as having no value. + * Note: Future may require that the Node->Flags field be passed + * as a parameter. * * MUTEX: Assumes namespace is locked * @@ -153,9 +155,8 @@ AcpiNsAttachObject ( ACPI_OBJECT_TYPE8 Type) { ACPI_OPERAND_OBJECT *ObjDesc; - ACPI_OPERAND_OBJECT *PreviousObjDesc; - ACPI_OBJECT_TYPE8 ObjType = ACPI_TYPE_ANY; - UINT8 Flags; + ACPI_OPERAND_OBJECT *LastObjDesc; + ACPI_OBJECT_TYPE8 ObjectType = ACPI_TYPE_ANY; FUNCTION_TRACE ("NsAttachObject"); @@ -164,14 +165,6 @@ AcpiNsAttachObject ( /* * Parameter validation */ - if (!AcpiGbl_RootNode) - { - /* Name space not initialized */ - - REPORT_ERROR (("NsAttachObject: Namespace not initialized\n")); - return_ACPI_STATUS (AE_NO_NAMESPACE); - } - if (!Node) { /* Invalid handle */ @@ -206,19 +199,12 @@ AcpiNsAttachObject ( return_ACPI_STATUS (AE_OK); } - - /* Get the current flags field of the Node */ - - Flags = Node->Flags; - Flags &= ~ANOBJ_AML_ATTACHMENT; - - /* If null object, we will just install it */ if (!Object) { - ObjDesc = NULL; - ObjType = ACPI_TYPE_ANY; + ObjDesc = NULL; + ObjectType = ACPI_TYPE_ANY; } /* @@ -232,19 +218,10 @@ AcpiNsAttachObject ( * Value passed is a name handle and that name has a * non-null value. Use that name's value and type. */ - ObjDesc = ((ACPI_NAMESPACE_NODE *) Object)->Object; - ObjType = ((ACPI_NAMESPACE_NODE *) Object)->Type; - - /* - * Copy appropriate flags - */ - if (((ACPI_NAMESPACE_NODE *) Object)->Flags & ANOBJ_AML_ATTACHMENT) - { - Flags |= ANOBJ_AML_ATTACHMENT; - } + ObjDesc = ((ACPI_NAMESPACE_NODE *) Object)->Object; + ObjectType = ((ACPI_NAMESPACE_NODE *) Object)->Type; } - /* * Otherwise, we will use the parameter object, but we must type * it first @@ -257,41 +234,16 @@ AcpiNsAttachObject ( if (ACPI_TYPE_ANY != Type) { - ObjType = Type; + ObjectType = Type; } - else { - /* - * Cannot figure out the type -- set to DefAny which - * will print as an error in the name table dump - */ - if (AcpiDbgLevel > 0) - { - DUMP_PATHNAME (Node, - "NsAttachObject confused: setting bogus type for ", - ACPI_LV_INFO, _COMPONENT); - - if (VALID_DESCRIPTOR_TYPE (Object, ACPI_DESC_TYPE_NAMED)) - { - DUMP_PATHNAME (Object, "name ", ACPI_LV_INFO, _COMPONENT); - } - - else - { - DUMP_PATHNAME (Object, "object ", ACPI_LV_INFO, _COMPONENT); - DUMP_STACK_ENTRY (Object); - } - } - - ObjType = INTERNAL_TYPE_DEF_ANY; + ObjectType = INTERNAL_TYPE_DEF_ANY; } } - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Installing %p into Node %p [%4.4s]\n", - ObjDesc, Node, (char*)&Node->Name)); - + ObjDesc, Node, (char *) &Node->Name)); /* * Must increment the new value's reference count @@ -299,30 +251,30 @@ AcpiNsAttachObject ( */ AcpiUtAddReference (ObjDesc); - /* Save the existing object (if any) for deletion later */ + /* Detach an existing attached object if present */ - PreviousObjDesc = Node->Object; - - /* Install the object and set the type, flags */ - - Node->Object = ObjDesc; - Node->Type = (UINT8) ObjType; - Node->Flags |= Flags; + if (Node->Object) + { + AcpiNsDetachObject (Node); + } - /* - * Delete an existing attached object. + /* + * Handle objects with multiple descriptors - walk + * to the end of the descriptor list */ - if (PreviousObjDesc) + LastObjDesc = ObjDesc; + while (LastObjDesc->Common.NextObject) { - /* One for the attach to the Node */ + LastObjDesc = LastObjDesc->Common.NextObject; + } - AcpiUtRemoveReference (PreviousObjDesc); + /* Install the object at the front of the object list */ - /* Now delete */ + LastObjDesc->Common.NextObject = Node->Object; - AcpiUtRemoveReference (PreviousObjDesc); - } + Node->Type = (UINT8) ObjectType; + Node->Object = ObjDesc; return_ACPI_STATUS (AE_OK); } @@ -353,7 +305,8 @@ AcpiNsDetachObject ( ObjDesc = Node->Object; - if (!ObjDesc) + if (!ObjDesc || + (ObjDesc->Common.Type == INTERNAL_TYPE_DATA)) { return_VOID; } @@ -361,9 +314,22 @@ AcpiNsDetachObject ( /* Clear the entry in all cases */ Node->Object = NULL; + if (VALID_DESCRIPTOR_TYPE (ObjDesc, ACPI_DESC_TYPE_INTERNAL)) + { + Node->Object = ObjDesc->Common.NextObject; + if (Node->Object && + (Node->Object->Common.Type != INTERNAL_TYPE_DATA)) + { + Node->Object = Node->Object->Common.NextObject; + } + } + + /* Reset the node type to untyped */ + + Node->Type = ACPI_TYPE_ANY; ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Object=%p Value=%p Name %4.4s\n", - Node, ObjDesc, (char*)&Node->Name)); + Node, ObjDesc, (char *) &Node->Name)); /* Remove one reference on the object (and all subobjects) */ @@ -383,7 +349,7 @@ AcpiNsDetachObject ( * ******************************************************************************/ -void * +ACPI_OPERAND_OBJECT * AcpiNsGetAttachedObject ( ACPI_NAMESPACE_NODE *Node) { @@ -392,13 +358,205 @@ AcpiNsGetAttachedObject ( if (!Node) { - /* handle invalid */ - ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Null Node ptr\n")); return_PTR (NULL); } + if (!Node->Object || + ((!(VALID_DESCRIPTOR_TYPE (Node->Object, ACPI_DESC_TYPE_INTERNAL))) && + (!(VALID_DESCRIPTOR_TYPE (Node->Object, ACPI_DESC_TYPE_NAMED)))) || + (Node->Object->Common.Type == INTERNAL_TYPE_DATA)) + { + return_PTR (NULL); + } + return_PTR (Node->Object); } +/******************************************************************************* + * + * FUNCTION: AcpiNsGetSecondaryObject + * + * PARAMETERS: Node - Parent Node to be examined + * + * RETURN: Current value of the object field from the Node whose + * handle is passed + * + ******************************************************************************/ + +ACPI_OPERAND_OBJECT * +AcpiNsGetSecondaryObject ( + ACPI_OPERAND_OBJECT *ObjDesc) +{ + FUNCTION_TRACE_PTR ("AcpiNsGetSecondaryObject", ObjDesc); + + + if ((!ObjDesc) || + (ObjDesc->Common.Type == INTERNAL_TYPE_DATA) || + (!ObjDesc->Common.NextObject) || + (ObjDesc->Common.NextObject->Common.Type == INTERNAL_TYPE_DATA)) + { + return_PTR (NULL); + } + + return_PTR (ObjDesc->Common.NextObject); +} + + +/******************************************************************************* + * + * FUNCTION: AcpiNsAttachData + * + * PARAMETERS: + * + * RETURN: Status + * + * DESCRIPTION: + * + ******************************************************************************/ + +ACPI_STATUS +AcpiNsAttachData ( + ACPI_NAMESPACE_NODE *Node, + ACPI_OBJECT_HANDLER Handler, + void *Data) +{ + ACPI_OPERAND_OBJECT *PrevObjDesc; + ACPI_OPERAND_OBJECT *ObjDesc; + ACPI_OPERAND_OBJECT *DataDesc; + + + + /* */ + PrevObjDesc = NULL; + ObjDesc = Node->Object; + while (ObjDesc) + { + if ((ObjDesc->Common.Type == INTERNAL_TYPE_DATA) && + (ObjDesc->Data.Handler == Handler)) + { + return (AE_ALREADY_EXISTS); + } + + PrevObjDesc = ObjDesc; + ObjDesc = ObjDesc->Common.NextObject; + } + + + /* Create an internal object for the data */ + + DataDesc = AcpiUtCreateInternalObject (INTERNAL_TYPE_DATA); + if (!DataDesc) + { + return (AE_NO_MEMORY); + } + + DataDesc->Data.Handler = Handler; + DataDesc->Data.Pointer = Data; + + + /* Install the data object */ + + if (PrevObjDesc) + { + PrevObjDesc->Common.NextObject = DataDesc; + } + else + { + Node->Object = DataDesc; + } + + return (AE_OK); +} + + +/******************************************************************************* + * + * FUNCTION: AcpiNsDetachData + * + * PARAMETERS: + * + * RETURN: Status + * + * DESCRIPTION: + * + ******************************************************************************/ + +ACPI_STATUS +AcpiNsDetachData ( + ACPI_NAMESPACE_NODE *Node, + ACPI_OBJECT_HANDLER Handler) +{ + ACPI_OPERAND_OBJECT *ObjDesc; + ACPI_OPERAND_OBJECT *PrevObjDesc; + + + PrevObjDesc = NULL; + ObjDesc = Node->Object; + while (ObjDesc) + { + if ((ObjDesc->Common.Type == INTERNAL_TYPE_DATA) && + (ObjDesc->Data.Handler == Handler)) + { + if (PrevObjDesc) + { + PrevObjDesc->Common.NextObject = ObjDesc->Common.NextObject; + } + else + { + Node->Object = ObjDesc->Common.NextObject; + } + + AcpiUtRemoveReference (ObjDesc); + return (AE_OK); + } + + PrevObjDesc = ObjDesc; + ObjDesc = ObjDesc->Common.NextObject; + } + + return (AE_NOT_FOUND); +} + + + +/******************************************************************************* + * + * FUNCTION: AcpiNsGetAttachedData + * + * PARAMETERS: + * + * RETURN: Status + * + * DESCRIPTION: + * + ******************************************************************************/ + +ACPI_STATUS +AcpiNsGetAttachedData ( + ACPI_NAMESPACE_NODE *Node, + ACPI_OBJECT_HANDLER Handler, + void **Data) +{ + ACPI_OPERAND_OBJECT *ObjDesc; + + + ObjDesc = Node->Object; + while (ObjDesc) + { + if ((ObjDesc->Common.Type == INTERNAL_TYPE_DATA) && + (ObjDesc->Data.Handler == Handler)) + { + *Data = ObjDesc->Data.Pointer; + return (AE_OK); + } + + ObjDesc = ObjDesc->Common.NextObject; + } + + return (AE_NOT_FOUND); +} + + + diff --git a/sys/contrib/dev/acpica/nssearch.c b/sys/contrib/dev/acpica/nssearch.c index 2992f8698c11..0ca44ccb322e 100644 --- a/sys/contrib/dev/acpica/nssearch.c +++ b/sys/contrib/dev/acpica/nssearch.c @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: nssearch - Namespace search - * $Revision: 75 $ + * $Revision: 77 $ * ******************************************************************************/ @@ -174,14 +174,13 @@ AcpiNsSearchNode ( if (ScopeName) { ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Searching %s [%p] For %4.4s (type %X)\n", - ScopeName, Node, (char*)&TargetName, Type)); + ScopeName, Node, (char *) &TargetName, Type)); ACPI_MEM_FREE (ScopeName); } } #endif - /* * Search for name in this table, which is to say that we must search * for the name among the children of this object @@ -222,13 +221,12 @@ AcpiNsSearchNode ( ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Name %4.4s (actual type %X) found at %p\n", - (char*)&TargetName, NextNode->Type, NextNode)); + (char *) &TargetName, NextNode->Type, NextNode)); *ReturnNode = NextNode; return_ACPI_STATUS (AE_OK); } - /* * The last entry in the list points back to the parent, * so a flag is used to indicate the end-of-list @@ -245,11 +243,10 @@ AcpiNsSearchNode ( NextNode = NextNode->Peer; } - /* Searched entire table, not found */ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Name %4.4s (type %X) not found at %p\n", - (char*)&TargetName, Type, NextNode)); + (char *) &TargetName, Type, NextNode)); return_ACPI_STATUS (AE_NOT_FOUND); } @@ -306,22 +303,21 @@ AcpiNsSearchParentTree ( if (!ParentNode) { ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "[%4.4s] has no parent\n", - (char*)&TargetName)); + (char *) &TargetName)); } if (AcpiNsLocal (Type)) { ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "[%4.4s] type %X is local(no search)\n", - (char*)&TargetName, Type)); + (char *) &TargetName, Type)); } return_ACPI_STATUS (AE_NOT_FOUND); } - /* 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 for %4.4s\n", (char *) &TargetName)); /* * Search parents until found the target or we have backed up to @@ -329,12 +325,13 @@ AcpiNsSearchParentTree ( */ while (ParentNode) { - /* Search parent scope */ - /* TBD: [Investigate] Why ACPI_TYPE_ANY? */ - + /* + * Search parent scope. Use TYPE_ANY because we don't care about the + * object type at this point, we only care about the existence of + * the actual name we are searching for. Typechecking comes later. + */ Status = AcpiNsSearchNode (TargetName, ParentNode, ACPI_TYPE_ANY, ReturnNode); - if (ACPI_SUCCESS (Status)) { return_ACPI_STATUS (Status); @@ -347,7 +344,6 @@ AcpiNsSearchParentTree ( ParentNode = AcpiNsGetParentObject (ParentNode); } - /* Not found in parent tree */ return_ACPI_STATUS (AE_NOT_FOUND); @@ -407,7 +403,6 @@ AcpiNsSearchAndEnter ( return_ACPI_STATUS (AE_BAD_PARAMETER); } - /* Name must consist of printable characters */ if (!AcpiUtValidAcpiName (TargetName)) @@ -419,7 +414,6 @@ AcpiNsSearchAndEnter ( return_ACPI_STATUS (AE_BAD_CHARACTER); } - /* Try to find the name in the table specified by the caller */ *ReturnNode = ENTRY_NOT_FOUND; @@ -433,7 +427,7 @@ AcpiNsSearchAndEnter ( if ((Status == AE_OK) && (Flags & NS_ERROR_IF_FOUND)) { - Status = AE_EXIST; + Status = AE_ALREADY_EXISTS; } /* @@ -443,9 +437,8 @@ AcpiNsSearchAndEnter ( return_ACPI_STATUS (Status); } - /* - * Not found in the table. If we are NOT performing the + * 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 @@ -468,19 +461,17 @@ AcpiNsSearchAndEnter ( } } - /* * In execute mode, just search, never add names. Exit now. */ if (InterpreterMode == IMODE_EXECUTE) { ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "%4.4s Not found in %p [Not adding]\n", - (char*)&TargetName, Node)); + (char *) &TargetName, Node)); return_ACPI_STATUS (AE_NOT_FOUND); } - /* Create the new named object */ NewNode = AcpiNsCreateNode (TargetName); diff --git a/sys/contrib/dev/acpica/nsutils.c b/sys/contrib/dev/acpica/nsutils.c index 1a8363e0c916..c3d7cc1cbd2a 100644 --- a/sys/contrib/dev/acpica/nsutils.c +++ b/sys/contrib/dev/acpica/nsutils.c @@ -2,7 +2,7 @@ * * Module Name: nsutils - Utilities for accessing ACPI namespace, accessing * parents and siblings and Scope manipulation - * $Revision: 92 $ + * $Revision: 93 $ * *****************************************************************************/ @@ -690,6 +690,9 @@ AcpiNsExternalizeName ( * * DESCRIPTION: Convert a namespace handle to a real Node * + * Note: Real integer handles allow for more verification + * and keep all pointers within this subsystem. + * ******************************************************************************/ ACPI_NAMESPACE_NODE * @@ -701,9 +704,7 @@ AcpiNsMapHandleToNode ( /* - * Simple implementation for now; - * TBD: [Future] Real integer handles allow for more verification - * and keep all pointers within this subsystem! + * Simple implementation. */ if (!Handle) { @@ -715,7 +716,6 @@ AcpiNsMapHandleToNode ( return (AcpiGbl_RootNode); } - /* We can at least attempt to verify the handle */ if (!VALID_DESCRIPTOR_TYPE (Handle, ACPI_DESC_TYPE_NAMED)) @@ -747,8 +747,6 @@ AcpiNsConvertEntryToHandle ( /* * Simple implementation for now; - * TBD: [Future] Real integer handles allow for more verification - * and keep all pointers within this subsystem! */ return ((ACPI_HANDLE) Node); diff --git a/sys/contrib/dev/acpica/nsxfobj.c b/sys/contrib/dev/acpica/nsxfobj.c index 6012593e7386..fc0ee50aafd4 100644 --- a/sys/contrib/dev/acpica/nsxfobj.c +++ b/sys/contrib/dev/acpica/nsxfobj.c @@ -2,7 +2,7 @@ * * Module Name: nsxfobj - Public interfaces to the ACPI subsystem * ACPI Object oriented interfaces - * $Revision: 95 $ + * $Revision: 98 $ * ******************************************************************************/ @@ -134,7 +134,7 @@ * * PARAMETERS: Handle - Object handle (optional) * *Pathname - Object pathname (optional) - * **ExternalParams - List of parameters to pass to method, + * **ExternalParams - List of parameters to pass to method, * terminated by NULL. May be NULL * if no parameters are being passed. * *ReturnBuffer - Where to put method's return value (if @@ -641,8 +641,8 @@ AcpiWalkNamespace ( * must be allowed to make Acpi calls itself. */ AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); - Status = AcpiNsWalkNamespace ((ACPI_OBJECT_TYPE8) Type, StartObject, - MaxDepth, NS_WALK_UNLOCK, UserFunction, Context, + Status = AcpiNsWalkNamespace ((ACPI_OBJECT_TYPE8) Type, StartObject, + MaxDepth, NS_WALK_UNLOCK, UserFunction, Context, ReturnValue); AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); @@ -675,7 +675,8 @@ AcpiNsGetDeviceCallback ( ACPI_STATUS Status; ACPI_NAMESPACE_NODE *Node; UINT32 Flags; - ACPI_DEVICE_ID DeviceId; + ACPI_DEVICE_ID Hid; + ACPI_DEVICE_ID Cid; ACPI_GET_DEVICES_INFO *Info; @@ -701,16 +702,16 @@ AcpiNsGetDeviceCallback ( if (!(Flags & 0x01)) { - /* don't return at the device or children of the device if not there */ + /* Don't return at the device or children of the device if not there */ return (AE_CTRL_DEPTH); } /* - * Filter based on device HID + * Filter based on device HID & CID */ if (Info->Hid != NULL) { - Status = AcpiUtExecute_HID (Node, &DeviceId); + Status = AcpiUtExecute_HID (Node, &Hid); if (Status == AE_NOT_FOUND) { return (AE_OK); @@ -721,9 +722,25 @@ AcpiNsGetDeviceCallback ( return (AE_CTRL_DEPTH); } - if (STRNCMP (DeviceId.Buffer, Info->Hid, sizeof (DeviceId.Buffer)) != 0) + if (STRNCMP (Hid.Buffer, Info->Hid, sizeof (Hid.Buffer)) != 0) { - return (AE_OK); + Status = AcpiUtExecute_CID (Node, &Cid); + if (Status == AE_NOT_FOUND) + { + return (AE_OK); + } + + else if (ACPI_FAILURE (Status)) + { + return (AE_CTRL_DEPTH); + } + + /* TBD: Handle CID packages */ + + if (STRNCMP (Cid.Buffer, Info->Hid, sizeof (Cid.Buffer)) != 0) + { + return (AE_OK); + } } } @@ -803,3 +820,158 @@ AcpiGetDevices ( return_ACPI_STATUS (Status); } + + +/******************************************************************************* + * + * FUNCTION: AcpiAttachData + * + * PARAMETERS: + * + * RETURN: Status + * + * DESCRIPTION: + * + ******************************************************************************/ + +ACPI_STATUS +AcpiAttachData ( + ACPI_HANDLE ObjHandle, + ACPI_OBJECT_HANDLER Handler, + void *Data) +{ + ACPI_NAMESPACE_NODE *Node; + ACPI_STATUS Status; + + + /* Parameter validation */ + + if (!ObjHandle || + !Handler || + !Data) + { + return (AE_BAD_PARAMETER); + } + + + AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); + + /* Convert and validate the handle */ + + Node = AcpiNsMapHandleToNode (ObjHandle); + if (!Node) + { + Status = AE_BAD_PARAMETER; + goto UnlockAndExit; + } + + Status = AcpiNsAttachData (Node, Handler, Data); + +UnlockAndExit: + + AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); + return (Status); +} + + +/******************************************************************************* + * + * FUNCTION: AcpiDetachData + * + * PARAMETERS: + * + * RETURN: Status + * + * DESCRIPTION: + * + ******************************************************************************/ + +ACPI_STATUS +AcpiDetachData ( + ACPI_HANDLE ObjHandle, + ACPI_OBJECT_HANDLER Handler) +{ + ACPI_NAMESPACE_NODE *Node; + ACPI_STATUS Status; + + + /* Parameter validation */ + + if (!ObjHandle || + !Handler) + { + return (AE_BAD_PARAMETER); + } + + AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); + + /* Convert and validate the handle */ + + Node = AcpiNsMapHandleToNode (ObjHandle); + if (!Node) + { + Status = AE_BAD_PARAMETER; + goto UnlockAndExit; + } + + Status = AcpiNsDetachData (Node, Handler); + +UnlockAndExit: + + AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); + return (Status); +} + + +/******************************************************************************* + * + * FUNCTION: AcpiGetData + * + * PARAMETERS: + * + * RETURN: Status + * + * DESCRIPTION: + * + ******************************************************************************/ + +ACPI_STATUS +AcpiGetData ( + ACPI_HANDLE ObjHandle, + ACPI_OBJECT_HANDLER Handler, + void **Data) +{ + ACPI_NAMESPACE_NODE *Node; + ACPI_STATUS Status; + + + /* Parameter validation */ + + if (!ObjHandle || + !Handler || + !Data) + { + return (AE_BAD_PARAMETER); + } + + AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); + + /* Convert and validate the handle */ + + Node = AcpiNsMapHandleToNode (ObjHandle); + if (!Node) + { + Status = AE_BAD_PARAMETER; + goto UnlockAndExit; + } + + Status = AcpiNsGetAttachedData (Node, Handler, Data); + +UnlockAndExit: + + AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); + return (Status); +} + + + diff --git a/sys/contrib/dev/acpica/psargs.c b/sys/contrib/dev/acpica/psargs.c index 44b1848f5d82..3597c6bfd316 100644 --- a/sys/contrib/dev/acpica/psargs.c +++ b/sys/contrib/dev/acpica/psargs.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: psargs - Parse AML opcode arguments - * $Revision: 52 $ + * $Revision: 54 $ * *****************************************************************************/ @@ -500,12 +500,12 @@ AcpiPsGetNextNamepath ( NameOp->Node = MethodNode; AcpiPsAppendArg (Arg, NameOp); - if (!MethodNode->Object) + if (!AcpiNsGetAttachedObject (MethodNode)) { return_VOID; } - *ArgCount = (MethodNode->Object)->Method.ParamCount; + *ArgCount = (AcpiNsGetAttachedObject (MethodNode))->Method.ParamCount; } return_VOID; @@ -713,11 +713,14 @@ AcpiPsGetNextField ( case AML_INT_ACCESSFIELD_OP: - /* Get AccessType and AccessAtrib and merge into the field Op */ - - Field->Value.Integer = ((GET8 (ParserState->Aml) << 8) | - GET8 (ParserState->Aml)); - ParserState->Aml += 2; + /* + * Get AccessType and AccessAttrib and merge into the field Op + * AccessType is first operand, AccessAttribute is second + */ + Field->Value.Integer32 = (GET8 (ParserState->Aml) << 8); + ParserState->Aml++; + Field->Value.Integer32 |= GET8 (ParserState->Aml); + ParserState->Aml++; break; } } diff --git a/sys/contrib/dev/acpica/psfind.c b/sys/contrib/dev/acpica/psfind.c index 6c2ff13ca1c8..a65f9aa614af 100644 --- a/sys/contrib/dev/acpica/psfind.c +++ b/sys/contrib/dev/acpica/psfind.c @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: psfind - Parse tree search routine - * $Revision: 30 $ + * $Revision: 32 $ * *****************************************************************************/ @@ -138,7 +138,7 @@ * ******************************************************************************/ -static ACPI_PARSE_OBJECT* +ACPI_PARSE_OBJECT* AcpiPsGetParent ( ACPI_PARSE_OBJECT *Op) { @@ -183,7 +183,7 @@ AcpiPsGetParent ( * ******************************************************************************/ -static ACPI_PARSE_OBJECT * +ACPI_PARSE_OBJECT * AcpiPsFindName ( ACPI_PARSE_OBJECT *Scope, UINT32 Name, @@ -220,14 +220,12 @@ AcpiPsFindName ( Field = Field->Next; } } - else if (OpInfo->Flags & AML_CREATE) { if (Op->Opcode == AML_CREATE_FIELD_OP) { Field = AcpiPsGetArg (Op, 3); } - else { /* CreateXXXField, check name */ @@ -242,7 +240,6 @@ AcpiPsFindName ( return (Op); } } - else if ((OpInfo->Flags & AML_NAMED) && (AcpiPsGetName (Op) == Name) && (!Opcode || Op->Opcode == Opcode || Opcode == AML_SCOPE_OP)) @@ -296,17 +293,14 @@ AcpiPsFind ( return_PTR (NULL); } - AcpiGbl_PsFindCount++; - /* Handle all prefixes in the name path */ while (AcpiPsIsPrefixChar (GET8 (Path))) { switch (GET8 (Path)) { - case '\\': /* Could just use a global for "root scope" here */ @@ -315,12 +309,6 @@ AcpiPsFind ( { Scope = Scope->Parent; } - - /* get first object within the scope */ - /* TBD: [Investigate] OR - set next in root scope to point to the same value as arg */ - - /* Scope = Scope->Value.Arg; */ - break; @@ -440,14 +428,12 @@ AcpiPsFind ( { ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "[%4.4s] Found in parent tree! Op=%p Opcode=%4.4X\n", (char*)&Name, Op, Op->Opcode)); } - else { ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "[%4.4s] Not found in parent=%p\n", (char*)&Name, Scope)); } } } - else { ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Segment [%4.4s] Not Found in scope %p!\n", (char*)&Name, Scope)); diff --git a/sys/contrib/dev/acpica/psopcode.c b/sys/contrib/dev/acpica/psopcode.c index a9fc46ad182d..f439f9bf0ad0 100644 --- a/sys/contrib/dev/acpica/psopcode.c +++ b/sys/contrib/dev/acpica/psopcode.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: psopcode - Parser/Interpreter opcode information table - * $Revision: 49 $ + * $Revision: 54 $ * *****************************************************************************/ @@ -275,7 +275,7 @@ #define ARGP_TO_STRING_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) #define ARGP_TYPE_OP ARGP_LIST1 (ARGP_SUPERNAME) #define ARGP_UNLOAD_OP ARGP_LIST1 (ARGP_SUPERNAME) -#define ARGP_VAR_PACKAGE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_BYTEDATA, ARGP_DATAOBJLIST) +#define ARGP_VAR_PACKAGE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_TERMARG, ARGP_DATAOBJLIST) #define ARGP_WAIT_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_TERMARG) #define ARGP_WHILE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_TERMARG, ARGP_TERMLIST) #define ARGP_WORD_OP ARGP_LIST1 (ARGP_WORDDATA) @@ -419,7 +419,7 @@ /****************************************************************************** - Opcodes that have associated namespace objects + Opcodes that have associated namespace objects (AML_NSOBJECT flag) AML_SCOPE_OP AML_DEVICE_OP @@ -445,7 +445,7 @@ AML_INT_METHODCALL_OP AML_INT_NAMEPATH_OP - Opcodes that are "namespace" opcodes + Opcodes that are "namespace" opcodes (AML_NSOPCODE flag) AML_SCOPE_OP AML_DEVICE_OP @@ -463,7 +463,7 @@ AML_REGION_OP AML_INT_NAMEDFIELD_OP - Opcodes that have an associated namespace node + Opcodes that have an associated namespace node (AML_NSNODE flag) AML_SCOPE_OP AML_DEVICE_OP @@ -486,7 +486,7 @@ AML_INT_METHODCALL_OP AML_INT_NAMEPATH_OP - Opcodes that define named ACPI objects + Opcodes that define named ACPI objects (AML_NAMED flag) AML_SCOPE_OP AML_DEVICE_OP @@ -501,8 +501,8 @@ AML_REGION_OP AML_INT_NAMEDFIELD_OP - Opcodes that contain executable AML as part of the definition that - must be deferred until needed + Opcodes that contain executable AML as part of the definition that + must be deferred until needed AML_METHOD_OP AML_VAR_PACKAGE_OP @@ -538,145 +538,145 @@ */ -static const ACPI_OPCODE_INFO AmlOpInfo[] = +static const ACPI_OPCODE_INFO AcpiGbl_AmlOpInfo[] = { /* Index Name Parser Args Interpreter Args Class Type Flags */ -/* 00 */ ACPI_OP ("Zero", ARGP_ZERO_OP, ARGI_ZERO_OP, AML_CLASS_ARGUMENT, AML_TYPE_CONSTANT, 0), -/* 01 */ ACPI_OP ("One", ARGP_ONE_OP, ARGI_ONE_OP, AML_CLASS_ARGUMENT, AML_TYPE_CONSTANT, 0), -/* 02 */ ACPI_OP ("Alias", ARGP_ALIAS_OP, ARGI_ALIAS_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), -/* 03 */ ACPI_OP ("Name", ARGP_NAME_OP, ARGI_NAME_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_COMPLEX, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), -/* 04 */ ACPI_OP ("ByteConst", ARGP_BYTE_OP, ARGI_BYTE_OP, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, 0), -/* 05 */ ACPI_OP ("WordConst", ARGP_WORD_OP, ARGI_WORD_OP, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, 0), -/* 06 */ ACPI_OP ("DwordConst", ARGP_DWORD_OP, ARGI_DWORD_OP, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, 0), -/* 07 */ ACPI_OP ("String", ARGP_STRING_OP, ARGI_STRING_OP, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, 0), -/* 08 */ ACPI_OP ("Scope", ARGP_SCOPE_OP, ARGI_SCOPE_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_NO_OBJ, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), -/* 09 */ ACPI_OP ("Buffer", ARGP_BUFFER_OP, ARGI_BUFFER_OP, AML_CLASS_ARGUMENT, AML_TYPE_DATA_TERM, AML_HAS_ARGS), -/* 0A */ ACPI_OP ("Package", ARGP_PACKAGE_OP, ARGI_PACKAGE_OP, AML_CLASS_ARGUMENT, AML_TYPE_DATA_TERM, AML_HAS_ARGS), -/* 0B */ ACPI_OP ("Method", ARGP_METHOD_OP, ARGI_METHOD_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_COMPLEX, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED | AML_DEFER), -/* 0C */ ACPI_OP ("Local0", ARGP_LOCAL0, ARGI_LOCAL0, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), -/* 0D */ ACPI_OP ("Local1", ARGP_LOCAL1, ARGI_LOCAL1, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), -/* 0E */ ACPI_OP ("Local2", ARGP_LOCAL2, ARGI_LOCAL2, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), -/* 0F */ ACPI_OP ("Local3", ARGP_LOCAL3, ARGI_LOCAL3, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), -/* 10 */ ACPI_OP ("Local4", ARGP_LOCAL4, ARGI_LOCAL4, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), -/* 11 */ ACPI_OP ("Local5", ARGP_LOCAL5, ARGI_LOCAL5, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), -/* 12 */ ACPI_OP ("Local6", ARGP_LOCAL6, ARGI_LOCAL6, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), -/* 13 */ ACPI_OP ("Local7", ARGP_LOCAL7, ARGI_LOCAL7, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), -/* 14 */ ACPI_OP ("Arg0", ARGP_ARG0, ARGI_ARG0, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), -/* 15 */ ACPI_OP ("Arg1", ARGP_ARG1, ARGI_ARG1, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), -/* 16 */ ACPI_OP ("Arg2", ARGP_ARG2, ARGI_ARG2, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), -/* 17 */ ACPI_OP ("Arg3", ARGP_ARG3, ARGI_ARG3, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), -/* 18 */ ACPI_OP ("Arg4", ARGP_ARG4, ARGI_ARG4, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), -/* 19 */ ACPI_OP ("Arg5", ARGP_ARG5, ARGI_ARG5, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), -/* 1A */ ACPI_OP ("Arg6", ARGP_ARG6, ARGI_ARG6, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), -/* 1B */ ACPI_OP ("Store", ARGP_STORE_OP, ARGI_STORE_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), -/* 1C */ ACPI_OP ("RefOf", ARGP_REF_OF_OP, ARGI_REF_OF_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R), -/* 1D */ ACPI_OP ("Add", ARGP_ADD_OP, ARGI_ADD_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), -/* 1E */ ACPI_OP ("Concatenate", ARGP_CONCAT_OP, ARGI_CONCAT_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R), -/* 1F */ ACPI_OP ("Subtract", ARGP_SUBTRACT_OP, ARGI_SUBTRACT_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), -/* 20 */ ACPI_OP ("Increment", ARGP_INCREMENT_OP, ARGI_INCREMENT_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R), -/* 21 */ ACPI_OP ("Decrement", ARGP_DECREMENT_OP, ARGI_DECREMENT_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R), -/* 22 */ ACPI_OP ("Multiply", ARGP_MULTIPLY_OP, ARGI_MULTIPLY_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), -/* 23 */ ACPI_OP ("Divide", ARGP_DIVIDE_OP, ARGI_DIVIDE_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_2T_1R, AML_FLAGS_EXEC_2A_2T_1R), -/* 24 */ ACPI_OP ("ShiftLeft", ARGP_SHIFT_LEFT_OP, ARGI_SHIFT_LEFT_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), -/* 25 */ ACPI_OP ("ShiftRight", ARGP_SHIFT_RIGHT_OP, ARGI_SHIFT_RIGHT_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), -/* 26 */ ACPI_OP ("And", ARGP_BIT_AND_OP, ARGI_BIT_AND_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), -/* 27 */ ACPI_OP ("NAnd", ARGP_BIT_NAND_OP, ARGI_BIT_NAND_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), -/* 28 */ ACPI_OP ("Or", ARGP_BIT_OR_OP, ARGI_BIT_OR_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), -/* 29 */ ACPI_OP ("NOr", ARGP_BIT_NOR_OP, ARGI_BIT_NOR_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), -/* 2A */ ACPI_OP ("XOr", ARGP_BIT_XOR_OP, ARGI_BIT_XOR_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), -/* 2B */ ACPI_OP ("Not", ARGP_BIT_NOT_OP, ARGI_BIT_NOT_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), -/* 2C */ ACPI_OP ("FindSetLeftBit", ARGP_FIND_SET_LEFT_BIT_OP, ARGI_FIND_SET_LEFT_BIT_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), -/* 2D */ ACPI_OP ("FindSetRightBit", ARGP_FIND_SET_RIGHT_BIT_OP,ARGI_FIND_SET_RIGHT_BIT_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), -/* 2E */ ACPI_OP ("DerefOf", ARGP_DEREF_OF_OP, ARGI_DEREF_OF_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R), -/* 2F */ ACPI_OP ("Notify", ARGP_NOTIFY_OP, ARGI_NOTIFY_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_0R, AML_FLAGS_EXEC_2A_0T_0R), -/* 30 */ ACPI_OP ("SizeOf", ARGP_SIZE_OF_OP, ARGI_SIZE_OF_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R), -/* 31 */ ACPI_OP ("Index", ARGP_INDEX_OP, ARGI_INDEX_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R), -/* 32 */ ACPI_OP ("Match", ARGP_MATCH_OP, ARGI_MATCH_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_6A_0T_1R, AML_FLAGS_EXEC_6A_0T_1R), -/* 33 */ ACPI_OP ("CreateDWordField", ARGP_CREATE_DWORD_FIELD_OP,ARGI_CREATE_DWORD_FIELD_OP, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE), -/* 34 */ ACPI_OP ("CreateWordField", ARGP_CREATE_WORD_FIELD_OP, ARGI_CREATE_WORD_FIELD_OP, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE), -/* 35 */ ACPI_OP ("CreateByteField", ARGP_CREATE_BYTE_FIELD_OP, ARGI_CREATE_BYTE_FIELD_OP, 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, 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, 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, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL), -/* 39 */ ACPI_OP ("LOr", ARGP_LOR_OP, ARGI_LOR_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL), -/* 3A */ ACPI_OP ("LNot", ARGP_LNOT_OP, ARGI_LNOT_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R), -/* 3B */ ACPI_OP ("LEqual", ARGP_LEQUAL_OP, ARGI_LEQUAL_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL), -/* 3C */ ACPI_OP ("LGreater", ARGP_LGREATER_OP, ARGI_LGREATER_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL), -/* 3D */ ACPI_OP ("LLess", ARGP_LLESS_OP, ARGI_LLESS_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL), -/* 3E */ ACPI_OP ("If", ARGP_IF_OP, ARGI_IF_OP, AML_CLASS_CONTROL, AML_TYPE_CONTROL, AML_HAS_ARGS), -/* 3F */ ACPI_OP ("Else", ARGP_ELSE_OP, ARGI_ELSE_OP, AML_CLASS_CONTROL, AML_TYPE_CONTROL, AML_HAS_ARGS), -/* 40 */ ACPI_OP ("While", ARGP_WHILE_OP, ARGI_WHILE_OP, AML_CLASS_CONTROL, AML_TYPE_CONTROL, AML_HAS_ARGS), -/* 41 */ ACPI_OP ("Noop", ARGP_NOOP_OP, ARGI_NOOP_OP, AML_CLASS_CONTROL, AML_TYPE_CONTROL, 0), -/* 42 */ ACPI_OP ("Return", ARGP_RETURN_OP, ARGI_RETURN_OP, AML_CLASS_CONTROL, AML_TYPE_CONTROL, AML_HAS_ARGS), -/* 43 */ ACPI_OP ("Break", ARGP_BREAK_OP, ARGI_BREAK_OP, AML_CLASS_CONTROL, AML_TYPE_CONTROL, 0), -/* 44 */ ACPI_OP ("BreakPoint", ARGP_BREAK_POINT_OP, ARGI_BREAK_POINT_OP, AML_CLASS_CONTROL, AML_TYPE_CONTROL, 0), -/* 45 */ ACPI_OP ("Ones", ARGP_ONES_OP, ARGI_ONES_OP, AML_CLASS_ARGUMENT, AML_TYPE_CONSTANT, 0), +/* 00 */ ACPI_OP ("Zero", ARGP_ZERO_OP, ARGI_ZERO_OP, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_CONSTANT, 0), +/* 01 */ ACPI_OP ("One", ARGP_ONE_OP, ARGI_ONE_OP, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_CONSTANT, 0), +/* 02 */ ACPI_OP ("Alias", ARGP_ALIAS_OP, ARGI_ALIAS_OP, INTERNAL_TYPE_ALIAS, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), +/* 03 */ ACPI_OP ("Name", ARGP_NAME_OP, ARGI_NAME_OP, ACPI_TYPE_ANY, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_COMPLEX, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), +/* 04 */ ACPI_OP ("ByteConst", ARGP_BYTE_OP, ARGI_BYTE_OP, ACPI_TYPE_INTEGER, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, 0), +/* 05 */ ACPI_OP ("WordConst", ARGP_WORD_OP, ARGI_WORD_OP, ACPI_TYPE_INTEGER, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, 0), +/* 06 */ ACPI_OP ("DwordConst", ARGP_DWORD_OP, ARGI_DWORD_OP, ACPI_TYPE_INTEGER, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, 0), +/* 07 */ ACPI_OP ("String", ARGP_STRING_OP, ARGI_STRING_OP, ACPI_TYPE_STRING, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, 0), +/* 08 */ ACPI_OP ("Scope", ARGP_SCOPE_OP, ARGI_SCOPE_OP, INTERNAL_TYPE_SCOPE, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_NO_OBJ, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), +/* 09 */ ACPI_OP ("Buffer", ARGP_BUFFER_OP, ARGI_BUFFER_OP, ACPI_TYPE_BUFFER, AML_CLASS_ARGUMENT, AML_TYPE_DATA_TERM, AML_HAS_ARGS), +/* 0A */ ACPI_OP ("Package", ARGP_PACKAGE_OP, ARGI_PACKAGE_OP, ACPI_TYPE_PACKAGE, AML_CLASS_ARGUMENT, AML_TYPE_DATA_TERM, AML_HAS_ARGS), +/* 0B */ ACPI_OP ("Method", ARGP_METHOD_OP, ARGI_METHOD_OP, ACPI_TYPE_METHOD, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_COMPLEX, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED | AML_DEFER), +/* 0C */ ACPI_OP ("Local0", ARGP_LOCAL0, ARGI_LOCAL0, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), +/* 0D */ ACPI_OP ("Local1", ARGP_LOCAL1, ARGI_LOCAL1, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), +/* 0E */ ACPI_OP ("Local2", ARGP_LOCAL2, ARGI_LOCAL2, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), +/* 0F */ ACPI_OP ("Local3", ARGP_LOCAL3, ARGI_LOCAL3, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), +/* 10 */ ACPI_OP ("Local4", ARGP_LOCAL4, ARGI_LOCAL4, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), +/* 11 */ ACPI_OP ("Local5", ARGP_LOCAL5, ARGI_LOCAL5, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), +/* 12 */ ACPI_OP ("Local6", ARGP_LOCAL6, ARGI_LOCAL6, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), +/* 13 */ ACPI_OP ("Local7", ARGP_LOCAL7, ARGI_LOCAL7, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), +/* 14 */ ACPI_OP ("Arg0", ARGP_ARG0, ARGI_ARG0, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), +/* 15 */ ACPI_OP ("Arg1", ARGP_ARG1, ARGI_ARG1, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), +/* 16 */ ACPI_OP ("Arg2", ARGP_ARG2, ARGI_ARG2, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), +/* 17 */ ACPI_OP ("Arg3", ARGP_ARG3, ARGI_ARG3, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), +/* 18 */ ACPI_OP ("Arg4", ARGP_ARG4, ARGI_ARG4, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), +/* 19 */ ACPI_OP ("Arg5", ARGP_ARG5, ARGI_ARG5, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), +/* 1A */ ACPI_OP ("Arg6", ARGP_ARG6, ARGI_ARG6, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), +/* 1B */ ACPI_OP ("Store", ARGP_STORE_OP, ARGI_STORE_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 1C */ ACPI_OP ("RefOf", ARGP_REF_OF_OP, ARGI_REF_OF_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R), +/* 1D */ ACPI_OP ("Add", ARGP_ADD_OP, ARGI_ADD_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), +/* 1E */ ACPI_OP ("Concatenate", ARGP_CONCAT_OP, ARGI_CONCAT_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R), +/* 1F */ ACPI_OP ("Subtract", ARGP_SUBTRACT_OP, ARGI_SUBTRACT_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), +/* 20 */ ACPI_OP ("Increment", ARGP_INCREMENT_OP, ARGI_INCREMENT_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R), +/* 21 */ ACPI_OP ("Decrement", ARGP_DECREMENT_OP, ARGI_DECREMENT_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R), +/* 22 */ ACPI_OP ("Multiply", ARGP_MULTIPLY_OP, ARGI_MULTIPLY_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), +/* 23 */ ACPI_OP ("Divide", ARGP_DIVIDE_OP, ARGI_DIVIDE_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_2T_1R, AML_FLAGS_EXEC_2A_2T_1R), +/* 24 */ ACPI_OP ("ShiftLeft", ARGP_SHIFT_LEFT_OP, ARGI_SHIFT_LEFT_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), +/* 25 */ ACPI_OP ("ShiftRight", ARGP_SHIFT_RIGHT_OP, ARGI_SHIFT_RIGHT_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), +/* 26 */ ACPI_OP ("And", ARGP_BIT_AND_OP, ARGI_BIT_AND_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), +/* 27 */ ACPI_OP ("NAnd", ARGP_BIT_NAND_OP, ARGI_BIT_NAND_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), +/* 28 */ ACPI_OP ("Or", ARGP_BIT_OR_OP, ARGI_BIT_OR_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), +/* 29 */ ACPI_OP ("NOr", ARGP_BIT_NOR_OP, ARGI_BIT_NOR_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), +/* 2A */ ACPI_OP ("XOr", ARGP_BIT_XOR_OP, ARGI_BIT_XOR_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), +/* 2B */ ACPI_OP ("Not", ARGP_BIT_NOT_OP, ARGI_BIT_NOT_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 2C */ ACPI_OP ("FindSetLeftBit", ARGP_FIND_SET_LEFT_BIT_OP, ARGI_FIND_SET_LEFT_BIT_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 2D */ ACPI_OP ("FindSetRightBit", ARGP_FIND_SET_RIGHT_BIT_OP,ARGI_FIND_SET_RIGHT_BIT_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 2E */ ACPI_OP ("DerefOf", ARGP_DEREF_OF_OP, ARGI_DEREF_OF_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R), +/* 2F */ ACPI_OP ("Notify", ARGP_NOTIFY_OP, ARGI_NOTIFY_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_0R, AML_FLAGS_EXEC_2A_0T_0R), +/* 30 */ ACPI_OP ("SizeOf", ARGP_SIZE_OF_OP, ARGI_SIZE_OF_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R), +/* 31 */ ACPI_OP ("Index", ARGP_INDEX_OP, ARGI_INDEX_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R), +/* 32 */ ACPI_OP ("Match", ARGP_MATCH_OP, ARGI_MATCH_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_6A_0T_1R, AML_FLAGS_EXEC_6A_0T_1R), +/* 33 */ ACPI_OP ("CreateDWordField", ARGP_CREATE_DWORD_FIELD_OP,ARGI_CREATE_DWORD_FIELD_OP, ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE), +/* 34 */ ACPI_OP ("CreateWordField", ARGP_CREATE_WORD_FIELD_OP, ARGI_CREATE_WORD_FIELD_OP, ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE), +/* 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), +/* 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), +/* 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), +/* 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), +/* 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), +/* 3D */ ACPI_OP ("LLess", ARGP_LLESS_OP, ARGI_LLESS_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL), +/* 3E */ ACPI_OP ("If", ARGP_IF_OP, ARGI_IF_OP, ACPI_TYPE_ANY, AML_CLASS_CONTROL, AML_TYPE_CONTROL, AML_HAS_ARGS), +/* 3F */ ACPI_OP ("Else", ARGP_ELSE_OP, ARGI_ELSE_OP, ACPI_TYPE_ANY, AML_CLASS_CONTROL, AML_TYPE_CONTROL, AML_HAS_ARGS), +/* 40 */ ACPI_OP ("While", ARGP_WHILE_OP, ARGI_WHILE_OP, ACPI_TYPE_ANY, AML_CLASS_CONTROL, AML_TYPE_CONTROL, AML_HAS_ARGS), +/* 41 */ ACPI_OP ("Noop", ARGP_NOOP_OP, ARGI_NOOP_OP, ACPI_TYPE_ANY, AML_CLASS_CONTROL, AML_TYPE_CONTROL, 0), +/* 42 */ ACPI_OP ("Return", ARGP_RETURN_OP, ARGI_RETURN_OP, ACPI_TYPE_ANY, AML_CLASS_CONTROL, AML_TYPE_CONTROL, AML_HAS_ARGS), +/* 43 */ ACPI_OP ("Break", ARGP_BREAK_OP, ARGI_BREAK_OP, ACPI_TYPE_ANY, AML_CLASS_CONTROL, AML_TYPE_CONTROL, 0), +/* 44 */ ACPI_OP ("BreakPoint", ARGP_BREAK_POINT_OP, ARGI_BREAK_POINT_OP, ACPI_TYPE_ANY, AML_CLASS_CONTROL, AML_TYPE_CONTROL, 0), +/* 45 */ ACPI_OP ("Ones", ARGP_ONES_OP, ARGI_ONES_OP, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_CONSTANT, 0), /* Prefixed opcodes (Two-byte opcodes with a prefix op) */ -/* 46 */ ACPI_OP ("Mutex", ARGP_MUTEX_OP, ARGI_MUTEX_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), -/* 47 */ ACPI_OP ("Event", ARGP_EVENT_OP, ARGI_EVENT_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE, AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED ), -/* 48 */ ACPI_OP ("CondRefOf", ARGP_COND_REF_OF_OP, ARGI_COND_REF_OF_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), -/* 49 */ ACPI_OP ("CreateField", ARGP_CREATE_FIELD_OP, ARGI_CREATE_FIELD_OP, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_FIELD | AML_CREATE), -/* 4A */ ACPI_OP ("Load", ARGP_LOAD_OP, ARGI_LOAD_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_0R, AML_FLAGS_EXEC_1A_1T_0R), -/* 4B */ ACPI_OP ("Stall", ARGP_STALL_OP, ARGI_STALL_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R), -/* 4C */ ACPI_OP ("Sleep", ARGP_SLEEP_OP, ARGI_SLEEP_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R), -/* 4D */ ACPI_OP ("Acquire", ARGP_ACQUIRE_OP, ARGI_ACQUIRE_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R), -/* 4E */ ACPI_OP ("Signal", ARGP_SIGNAL_OP, ARGI_SIGNAL_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R), -/* 4F */ ACPI_OP ("Wait", ARGP_WAIT_OP, ARGI_WAIT_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R), -/* 50 */ ACPI_OP ("Reset", ARGP_RESET_OP, ARGI_RESET_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R), -/* 51 */ ACPI_OP ("Release", ARGP_RELEASE_OP, ARGI_RELEASE_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R), -/* 52 */ ACPI_OP ("FromBCD", ARGP_FROM_BCD_OP, ARGI_FROM_BCD_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), -/* 53 */ ACPI_OP ("ToBCD", ARGP_TO_BCD_OP, ARGI_TO_BCD_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), -/* 54 */ ACPI_OP ("Unload", ARGP_UNLOAD_OP, ARGI_UNLOAD_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R), -/* 55 */ ACPI_OP ("Revision", ARGP_REVISION_OP, ARGI_REVISION_OP, AML_CLASS_ARGUMENT, AML_TYPE_CONSTANT, 0), -/* 56 */ ACPI_OP ("Debug", ARGP_DEBUG_OP, ARGI_DEBUG_OP, AML_CLASS_ARGUMENT, AML_TYPE_CONSTANT, 0), -/* 57 */ ACPI_OP ("Fatal", ARGP_FATAL_OP, ARGI_FATAL_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_3A_0T_0R, AML_FLAGS_EXEC_3A_0T_0R), -/* 58 */ ACPI_OP ("OpRegion", ARGP_REGION_OP, ARGI_REGION_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_COMPLEX, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED | AML_DEFER), -/* 59 */ ACPI_OP ("Field", ARGP_FIELD_OP, ARGI_FIELD_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_FIELD), -/* 5A */ ACPI_OP ("Device", ARGP_DEVICE_OP, ARGI_DEVICE_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_NO_OBJ, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), -/* 5B */ ACPI_OP ("Processor", ARGP_PROCESSOR_OP, ARGI_PROCESSOR_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), -/* 5C */ ACPI_OP ("PowerResource", ARGP_POWER_RES_OP, ARGI_POWER_RES_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), -/* 5D */ ACPI_OP ("ThermalZone", ARGP_THERMAL_ZONE_OP, ARGI_THERMAL_ZONE_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_NO_OBJ, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), -/* 5E */ ACPI_OP ("IndexField", ARGP_INDEX_FIELD_OP, ARGI_INDEX_FIELD_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_FIELD), -/* 5F */ ACPI_OP ("BankField", ARGP_BANK_FIELD_OP, ARGI_BANK_FIELD_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_FIELD), +/* 46 */ ACPI_OP ("Mutex", ARGP_MUTEX_OP, ARGI_MUTEX_OP, ACPI_TYPE_MUTEX, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), +/* 47 */ ACPI_OP ("Event", ARGP_EVENT_OP, ARGI_EVENT_OP, ACPI_TYPE_EVENT, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE, AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED ), +/* 48 */ ACPI_OP ("CondRefOf", ARGP_COND_REF_OF_OP, ARGI_COND_REF_OF_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 49 */ ACPI_OP ("CreateField", ARGP_CREATE_FIELD_OP, ARGI_CREATE_FIELD_OP, ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_FIELD | AML_CREATE), +/* 4A */ ACPI_OP ("Load", ARGP_LOAD_OP, ARGI_LOAD_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_0R, AML_FLAGS_EXEC_1A_1T_0R), +/* 4B */ ACPI_OP ("Stall", ARGP_STALL_OP, ARGI_STALL_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R), +/* 4C */ ACPI_OP ("Sleep", ARGP_SLEEP_OP, ARGI_SLEEP_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R), +/* 4D */ ACPI_OP ("Acquire", ARGP_ACQUIRE_OP, ARGI_ACQUIRE_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R), +/* 4E */ ACPI_OP ("Signal", ARGP_SIGNAL_OP, ARGI_SIGNAL_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R), +/* 4F */ ACPI_OP ("Wait", ARGP_WAIT_OP, ARGI_WAIT_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R), +/* 50 */ ACPI_OP ("Reset", ARGP_RESET_OP, ARGI_RESET_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R), +/* 51 */ ACPI_OP ("Release", ARGP_RELEASE_OP, ARGI_RELEASE_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R), +/* 52 */ ACPI_OP ("FromBCD", ARGP_FROM_BCD_OP, ARGI_FROM_BCD_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 53 */ ACPI_OP ("ToBCD", ARGP_TO_BCD_OP, ARGI_TO_BCD_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 54 */ ACPI_OP ("Unload", ARGP_UNLOAD_OP, ARGI_UNLOAD_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R), +/* 55 */ ACPI_OP ("Revision", ARGP_REVISION_OP, ARGI_REVISION_OP, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_CONSTANT, 0), +/* 56 */ ACPI_OP ("Debug", ARGP_DEBUG_OP, ARGI_DEBUG_OP, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_CONSTANT, 0), +/* 57 */ ACPI_OP ("Fatal", ARGP_FATAL_OP, ARGI_FATAL_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_3A_0T_0R, AML_FLAGS_EXEC_3A_0T_0R), +/* 58 */ ACPI_OP ("OperationRegion", ARGP_REGION_OP, ARGI_REGION_OP, ACPI_TYPE_REGION, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_COMPLEX, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED | AML_DEFER), +/* 59 */ ACPI_OP ("Field", ARGP_FIELD_OP, ARGI_FIELD_OP, INTERNAL_TYPE_FIELD_DEFN,AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_FIELD), +/* 5A */ ACPI_OP ("Device", ARGP_DEVICE_OP, ARGI_DEVICE_OP, ACPI_TYPE_DEVICE, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_NO_OBJ, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), +/* 5B */ ACPI_OP ("Processor", ARGP_PROCESSOR_OP, ARGI_PROCESSOR_OP, ACPI_TYPE_PROCESSOR, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), +/* 5C */ ACPI_OP ("PowerResource", ARGP_POWER_RES_OP, ARGI_POWER_RES_OP, ACPI_TYPE_POWER, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), +/* 5D */ ACPI_OP ("ThermalZone", ARGP_THERMAL_ZONE_OP, ARGI_THERMAL_ZONE_OP, ACPI_TYPE_THERMAL, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_NO_OBJ, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), +/* 5E */ ACPI_OP ("IndexField", ARGP_INDEX_FIELD_OP, ARGI_INDEX_FIELD_OP, INTERNAL_TYPE_INDEX_FIELD_DEFN,AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_FIELD), +/* 5F */ ACPI_OP ("BankField", ARGP_BANK_FIELD_OP, ARGI_BANK_FIELD_OP, INTERNAL_TYPE_BANK_FIELD_DEFN,AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_FIELD), /* Internal opcodes that map to invalid AML opcodes */ -/* 60 */ ACPI_OP ("LNotEqual", ARGP_LNOTEQUAL_OP, ARGI_LNOTEQUAL_OP, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, AML_HAS_ARGS), -/* 61 */ ACPI_OP ("LLessEqual", ARGP_LLESSEQUAL_OP, ARGI_LLESSEQUAL_OP, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, AML_HAS_ARGS), -/* 62 */ ACPI_OP ("LGreaterEqual", ARGP_LGREATEREQUAL_OP, ARGI_LGREATEREQUAL_OP, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, AML_HAS_ARGS), -/* 63 */ ACPI_OP ("[NamePath]", ARGP_NAMEPATH_OP, ARGI_NAMEPATH_OP, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, AML_NSOBJECT | AML_NSNODE ), -/* 64 */ ACPI_OP ("[MethodCall]", ARGP_METHODCALL_OP, ARGI_METHODCALL_OP, AML_CLASS_METHOD_CALL, AML_TYPE_METHOD_CALL, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE), -/* 65 */ ACPI_OP ("[ByteList]", ARGP_BYTELIST_OP, ARGI_BYTELIST_OP, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, 0), -/* 66 */ ACPI_OP ("[ReservedField]", ARGP_RESERVEDFIELD_OP, ARGI_RESERVEDFIELD_OP, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, 0), -/* 67 */ ACPI_OP ("[NamedField]", ARGP_NAMEDFIELD_OP, ARGI_NAMEDFIELD_OP, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED ), -/* 68 */ ACPI_OP ("[AccessField]", ARGP_ACCESSFIELD_OP, ARGI_ACCESSFIELD_OP, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, 0), -/* 69 */ ACPI_OP ("[StaticString", ARGP_STATICSTRING_OP, ARGI_STATICSTRING_OP, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, 0), -/* 6A */ ACPI_OP ("[Return Value]", ARG_NONE, ARG_NONE, AML_CLASS_RETURN_VALUE, AML_TYPE_RETURN, AML_HAS_ARGS | AML_HAS_RETVAL), -/* 6B */ ACPI_OP ("UNKNOWN_OP!", ARG_NONE, ARG_NONE, AML_CLASS_UNKNOWN, AML_TYPE_BOGUS, AML_HAS_ARGS), -/* 6C */ ACPI_OP ("ASCII_ONLY!", ARG_NONE, ARG_NONE, AML_CLASS_ASCII, AML_TYPE_BOGUS, AML_HAS_ARGS), -/* 6D */ ACPI_OP ("PREFIX_ONLY!", ARG_NONE, ARG_NONE, AML_CLASS_PREFIX, AML_TYPE_BOGUS, AML_HAS_ARGS), +/* 60 */ ACPI_OP ("LNotEqual", ARGP_LNOTEQUAL_OP, ARGI_LNOTEQUAL_OP, ACPI_TYPE_ANY, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, AML_HAS_ARGS), +/* 61 */ ACPI_OP ("LLessEqual", ARGP_LLESSEQUAL_OP, ARGI_LLESSEQUAL_OP, ACPI_TYPE_ANY, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, AML_HAS_ARGS), +/* 62 */ ACPI_OP ("LGreaterEqual", ARGP_LGREATEREQUAL_OP, ARGI_LGREATEREQUAL_OP, ACPI_TYPE_ANY, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, AML_HAS_ARGS), +/* 63 */ ACPI_OP ("[NamePath]", ARGP_NAMEPATH_OP, ARGI_NAMEPATH_OP, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, AML_NSOBJECT | AML_NSNODE ), +/* 64 */ ACPI_OP ("[MethodCall]", ARGP_METHODCALL_OP, ARGI_METHODCALL_OP, ACPI_TYPE_METHOD, AML_CLASS_METHOD_CALL, AML_TYPE_METHOD_CALL, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE), +/* 65 */ ACPI_OP ("[ByteList]", ARGP_BYTELIST_OP, ARGI_BYTELIST_OP, ACPI_TYPE_ANY, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, 0), +/* 66 */ ACPI_OP ("[ReservedField]", ARGP_RESERVEDFIELD_OP, ARGI_RESERVEDFIELD_OP, ACPI_TYPE_ANY, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, 0), +/* 67 */ ACPI_OP ("[NamedField]", ARGP_NAMEDFIELD_OP, ARGI_NAMEDFIELD_OP, ACPI_TYPE_ANY, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED ), +/* 68 */ ACPI_OP ("[AccessField]", ARGP_ACCESSFIELD_OP, ARGI_ACCESSFIELD_OP, ACPI_TYPE_ANY, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, 0), +/* 69 */ ACPI_OP ("[StaticString", ARGP_STATICSTRING_OP, ARGI_STATICSTRING_OP, ACPI_TYPE_ANY, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, 0), +/* 6A */ ACPI_OP ("[Return Value]", ARG_NONE, ARG_NONE, ACPI_TYPE_ANY, AML_CLASS_RETURN_VALUE, AML_TYPE_RETURN, AML_HAS_ARGS | AML_HAS_RETVAL), +/* 6B */ ACPI_OP ("UNKNOWN_OP!", ARG_NONE, ARG_NONE, INTERNAL_TYPE_INVALID, AML_CLASS_UNKNOWN, AML_TYPE_BOGUS, AML_HAS_ARGS), +/* 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, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, 0), -/* 6F */ ACPI_OP ("VarPackage", ARGP_VAR_PACKAGE_OP, ARGI_VAR_PACKAGE_OP, AML_CLASS_ARGUMENT, AML_TYPE_DATA_TERM, AML_HAS_ARGS | AML_DEFER), -/* 70 */ ACPI_OP ("ConcatRes", ARGP_CONCAT_RES_OP, ARGI_CONCAT_RES_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R), -/* 71 */ ACPI_OP ("Mod", ARGP_MOD_OP, ARGI_MOD_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R), -/* 72 */ ACPI_OP ("CreateQWordField", ARGP_CREATE_QWORD_FIELD_OP,ARGI_CREATE_QWORD_FIELD_OP, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE), -/* 73 */ ACPI_OP ("ToBuffer", ARGP_TO_BUFFER_OP, ARGI_TO_BUFFER_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), -/* 74 */ ACPI_OP ("ToDecimalString", ARGP_TO_DEC_STR_OP, ARGI_TO_DEC_STR_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), -/* 75 */ ACPI_OP ("ToHexString", ARGP_TO_HEX_STR_OP, ARGI_TO_HEX_STR_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), -/* 76 */ ACPI_OP ("ToInteger", ARGP_TO_INTEGER_OP, ARGI_TO_INTEGER_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), -/* 77 */ ACPI_OP ("ToString", ARGP_TO_STRING_OP, ARGI_TO_STRING_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R), -/* 78 */ ACPI_OP ("CopyObject", ARGP_COPY_OP, ARGI_COPY_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), -/* 79 */ ACPI_OP ("Mid", ARGP_MID_OP, ARGI_MID_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_3A_1T_1R, AML_FLAGS_EXEC_3A_1T_1R), -/* 7A */ ACPI_OP ("Continue", ARGP_CONTINUE_OP, ARGI_CONTINUE_OP, AML_CLASS_CONTROL, AML_TYPE_CONTROL, 0), -/* 7B */ ACPI_OP ("LoadTable", ARGP_LOAD_TABLE_OP, ARGI_LOAD_TABLE_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_6A_0T_1R, AML_FLAGS_EXEC_6A_0T_1R), -/* 7C */ ACPI_OP ("DataOpRegion", ARGP_DATA_REGION_OP, ARGI_DATA_REGION_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 6E */ ACPI_OP ("QwordConst", ARGP_QWORD_OP, ARGI_QWORD_OP, ACPI_TYPE_INTEGER, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, 0), +/* 6F */ ACPI_OP ("Package /*Var*/", ARGP_VAR_PACKAGE_OP, ARGI_VAR_PACKAGE_OP, ACPI_TYPE_PACKAGE, AML_CLASS_ARGUMENT, AML_TYPE_DATA_TERM, AML_HAS_ARGS | AML_DEFER), +/* 70 */ ACPI_OP ("ConcatenateResTemplate", ARGP_CONCAT_RES_OP, ARGI_CONCAT_RES_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R), +/* 71 */ ACPI_OP ("Mod", ARGP_MOD_OP, ARGI_MOD_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R), +/* 72 */ ACPI_OP ("CreateQWordField", ARGP_CREATE_QWORD_FIELD_OP,ARGI_CREATE_QWORD_FIELD_OP, ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE), +/* 73 */ ACPI_OP ("ToBuffer", ARGP_TO_BUFFER_OP, ARGI_TO_BUFFER_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 74 */ ACPI_OP ("ToDecimalString", ARGP_TO_DEC_STR_OP, ARGI_TO_DEC_STR_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 75 */ ACPI_OP ("ToHexString", ARGP_TO_HEX_STR_OP, ARGI_TO_HEX_STR_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 76 */ ACPI_OP ("ToInteger", ARGP_TO_INTEGER_OP, ARGI_TO_INTEGER_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 77 */ ACPI_OP ("ToString", ARGP_TO_STRING_OP, ARGI_TO_STRING_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R), +/* 78 */ ACPI_OP ("CopyObject", ARGP_COPY_OP, ARGI_COPY_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 79 */ ACPI_OP ("Mid", ARGP_MID_OP, ARGI_MID_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_3A_1T_1R, AML_FLAGS_EXEC_3A_1T_1R), +/* 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_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), }; @@ -685,7 +685,7 @@ static const ACPI_OPCODE_INFO AmlOpInfo[] = * index into the table above */ -static const UINT8 AmlShortOpInfoIndex[256] = +static const UINT8 AcpiGbl_ShortOpIndex[256] = { /* 0 1 2 3 4 5 6 7 */ /* 8 9 A B C D E F */ @@ -724,7 +724,7 @@ static const UINT8 AmlShortOpInfoIndex[256] = }; -static const UINT8 AmlLongOpInfoIndex[NUM_EXTENDED_OPCODE] = +static const UINT8 AcpiGbl_LongOpIndex[NUM_EXTENDED_OPCODE] = { /* 0 1 2 3 4 5 6 7 */ /* 8 9 A B C D E F */ @@ -767,35 +767,19 @@ const ACPI_OPCODE_INFO * AcpiPsGetOpcodeInfo ( UINT16 Opcode) { - const ACPI_OPCODE_INFO *OpInfo; - UINT8 UpperOpcode; - UINT8 LowerOpcode; - - PROC_NAME ("PsGetOpcodeInfo"); - /* Split the 16-bit opcode into separate bytes */ - - UpperOpcode = (UINT8) (Opcode >> 8); - LowerOpcode = (UINT8) Opcode; - - /* Default is "unknown opcode" */ - - OpInfo = &AmlOpInfo [_UNK]; - - /* * Detect normal 8-bit opcode or extended 16-bit opcode */ - - switch (UpperOpcode) + switch ((UINT8) (Opcode >> 8)) { case 0: /* Simple (8-bit) opcode: 0-255, can't index beyond table */ - OpInfo = &AmlOpInfo [AmlShortOpInfoIndex [LowerOpcode]]; + return (&AcpiGbl_AmlOpInfo [AcpiGbl_ShortOpIndex [(UINT8) Opcode]]); break; @@ -803,23 +787,22 @@ AcpiPsGetOpcodeInfo ( /* Extended (16-bit, prefix+opcode) opcode */ - if (LowerOpcode <= MAX_EXTENDED_OPCODE) + if (((UINT8) Opcode) <= MAX_EXTENDED_OPCODE) { - OpInfo = &AmlOpInfo [AmlLongOpInfoIndex [LowerOpcode]]; + return (&AcpiGbl_AmlOpInfo [AcpiGbl_LongOpIndex [(UINT8) Opcode]]); + break; } - break; - default: - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown extended opcode=%X\n", Opcode)); + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown extended opcode [%X]\n", Opcode)); break; } - /* Get the Op info pointer for this opcode */ + /* Default is "unknown opcode" */ - return (OpInfo); + return (&AcpiGbl_AmlOpInfo [_UNK]); } diff --git a/sys/contrib/dev/acpica/psparse.c b/sys/contrib/dev/acpica/psparse.c index 45c6480f5446..9e8cfb76dc61 100644 --- a/sys/contrib/dev/acpica/psparse.c +++ b/sys/contrib/dev/acpica/psparse.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: psparse - Parser top level AML parse routines - * $Revision: 104 $ + * $Revision: 109 $ * *****************************************************************************/ @@ -152,7 +152,7 @@ extern UINT32 AcpiGbl_ScopeDepth; * ******************************************************************************/ -static UINT32 +UINT32 AcpiPsGetOpcodeSize ( UINT32 Opcode) { @@ -193,31 +193,15 @@ AcpiPsPeekOpcode ( Aml = ParserState->Aml; Opcode = (UINT16) GET8 (Aml); - Aml++; - - /* - * Original code special cased LNOTEQUAL, LLESSEQUAL, LGREATEREQUAL. - * These opcodes are no longer recognized. Instead, they are broken into - * two opcodes. - * - * - * if (Opcode == AML_EXTOP - * || (Opcode == AML_LNOT - * && (GET8 (Aml) == AML_LEQUAL - * || GET8 (Aml) == AML_LGREATER - * || GET8 (Aml) == AML_LLESS))) - * - * extended Opcode, !=, <=, or >= - */ if (Opcode == AML_EXTOP) { /* Extended opcode */ + Aml++; Opcode = (UINT16) ((Opcode << 8) | GET8 (Aml)); } - return (Opcode); } @@ -289,7 +273,7 @@ AcpiPsFindObject ( * ******************************************************************************/ -static BOOLEAN +BOOLEAN AcpiPsCompleteThisOp ( ACPI_WALK_STATE *WalkState, ACPI_PARSE_OBJECT *Op) @@ -304,8 +288,6 @@ AcpiPsCompleteThisOp ( FUNCTION_TRACE_PTR ("PsCompleteThisOp", Op); - - /* Delete this op and the subtree below it if asked to */ if (((WalkState->ParseFlags & ACPI_PARSE_TREE_MASK) == ACPI_PARSE_DELETE_TREE) && @@ -323,23 +305,30 @@ AcpiPsCompleteThisOp ( switch (ParentInfo->Class) { - case AML_CLASS_CONTROL: /* IF, ELSE, WHILE only */ + case AML_CLASS_CONTROL: break; - case AML_CLASS_NAMED_OBJECT: /* Scope, method, etc. */ case AML_CLASS_CREATE: /* * These opcodes contain TermArg operands. The current * op must be replace by a placeholder return op */ + ReplacementOp = AcpiPsAllocOp (AML_INT_RETURN_VALUE_OP); + if (!ReplacementOp) + { + return_VALUE (FALSE); + } + break; + + case AML_CLASS_NAMED_OBJECT: + + /* + * These opcodes contain TermArg operands. The current + * op must be replace by a placeholder return op + */ if ((Op->Parent->Opcode == AML_REGION_OP) || - (Op->Parent->Opcode == AML_CREATE_FIELD_OP) || - (Op->Parent->Opcode == AML_CREATE_BIT_FIELD_OP) || - (Op->Parent->Opcode == AML_CREATE_BYTE_FIELD_OP) || - (Op->Parent->Opcode == AML_CREATE_WORD_FIELD_OP) || - (Op->Parent->Opcode == AML_CREATE_DWORD_FIELD_OP) || - (Op->Parent->Opcode == AML_CREATE_QWORD_FIELD_OP)) + (Op->Parent->Opcode == AML_DATA_REGION_OP)) { ReplacementOp = AcpiPsAllocOp (AML_INT_RETURN_VALUE_OP); if (!ReplacementOp) @@ -347,7 +336,6 @@ AcpiPsCompleteThisOp ( return_VALUE (FALSE); } } - break; default: @@ -404,7 +392,6 @@ AcpiPsCompleteThisOp ( Prev = Next; } - } /* Now we can actually delete the subtree rooted at op */ @@ -434,7 +421,7 @@ AcpiPsCompleteThisOp ( * ******************************************************************************/ -static ACPI_STATUS +ACPI_STATUS AcpiPsNextParseState ( ACPI_WALK_STATE *WalkState, ACPI_PARSE_OBJECT *Op, @@ -478,6 +465,7 @@ AcpiPsNextParseState ( case AE_CTRL_TRUE: + /* * Predicate of an IF was true, and we are at the matching ELSE. * Just close out this package @@ -714,9 +702,6 @@ AcpiPsParseLoop ( WalkState->Op = NULL; Status = WalkState->DescendingCallback (WalkState, &Op); - - /* TBD: check status here? */ - if (ACPI_FAILURE (Status)) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "During name lookup/catalog, %s\n", @@ -728,6 +713,7 @@ AcpiPsParseLoop ( { continue; } + Status = AcpiPsNextParseState (WalkState, Op, Status); if (Status == AE_CTRL_PENDING) { @@ -744,7 +730,6 @@ AcpiPsParseLoop ( AcpiPsAppendArg (Op, PreOp.Value.Arg); AcpiGbl_Depth++; - if (Op->Opcode == AML_REGION_OP) { /* @@ -764,7 +749,6 @@ AcpiPsParseLoop ( } } - else { /* Not a named opcode, just allocate Op and append to parent */ @@ -776,7 +760,6 @@ AcpiPsParseLoop ( return_ACPI_STATUS (AE_NO_MEMORY); } - if (WalkState->OpInfo->Flags & AML_CREATE) { /* @@ -795,7 +778,7 @@ AcpiPsParseLoop ( * Find the object. This will either insert the object into * the namespace or simply look it up */ - WalkState->Op = Op; + WalkState->Op = Op; Status = WalkState->DescendingCallback (WalkState, &Op); Status = AcpiPsNextParseState (WalkState, Op, Status); @@ -827,7 +810,6 @@ AcpiPsParseLoop ( WalkState->ArgCount = 0; - if (WalkState->ArgTypes) /* Are there any arguments that must be processed? */ { /* get arguments */ @@ -872,7 +854,6 @@ AcpiPsParseLoop ( INCREMENT_ARG_LIST (WalkState->ArgTypes); } - /* For a method, save the length and address of the body */ if (Op->Opcode == AML_METHOD_OP) @@ -960,7 +941,6 @@ AcpiPsParseLoop ( CloseThisOp: - /* * Finished one argument of the containing scope */ @@ -973,7 +953,6 @@ CloseThisOp: Op = NULL; } - switch (Status) { case AE_OK: @@ -1019,8 +998,8 @@ CloseThisOp: { AcpiPsCompleteThisOp (WalkState, Op); } - AcpiPsPopScope (ParserState, &Op, &WalkState->ArgTypes, &WalkState->ArgCount); + } while (Op); return_ACPI_STATUS (Status); @@ -1037,9 +1016,8 @@ CloseThisOp: WalkState->PrevArgTypes = WalkState->ArgTypes; /* - * TEMP: + * TBD: TEMP: */ - return_ACPI_STATUS (Status); break; } @@ -1051,19 +1029,14 @@ CloseThisOp: AcpiPsPopScope (ParserState, &Op, &WalkState->ArgTypes, &WalkState->ArgCount); ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Popped scope, Op=%p\n", Op)); } - else { Op = NULL; } - } - - - /* ArgCount is non-zero */ - else { + /* ArgCount is non-zero */ /* complex argument, push Op and prepare for argument */ AcpiPsPushScope (ParserState, Op, WalkState->ArgTypes, WalkState->ArgCount); @@ -1156,8 +1129,8 @@ AcpiPsParseAml ( ACPI_WALK_STATE *WalkState) { ACPI_STATUS Status; - ACPI_WALK_LIST WalkList; - ACPI_WALK_LIST *PrevWalkList = AcpiGbl_CurrentWalkList; + ACPI_THREAD_STATE *Thread; + ACPI_THREAD_STATE *PrevWalkList = AcpiGbl_CurrentWalkList; ACPI_WALK_STATE *PreviousWalkState; @@ -1167,19 +1140,21 @@ AcpiPsParseAml ( WalkState, WalkState->ParserState.Aml, WalkState->ParserState.AmlSize)); - /* Create and initialize a new walk list */ + /* Create and initialize a new thread state */ - WalkList.WalkState = NULL; - WalkList.AcquiredMutexList.Prev = NULL; - WalkList.AcquiredMutexList.Next = NULL; + Thread = AcpiUtCreateThreadState (); + if (!Thread) + { + return_ACPI_STATUS (AE_NO_MEMORY); + } - WalkState->WalkList = &WalkList; - AcpiDsPushWalkState (WalkState, &WalkList); + WalkState->Thread = Thread; + AcpiDsPushWalkState (WalkState, Thread); /* TBD: [Restructure] TEMP until we pass WalkState to the interpreter */ - AcpiGbl_CurrentWalkList = &WalkList; + AcpiGbl_CurrentWalkList = Thread; /* * Execute the walk loop as long as there is a valid Walk State. This @@ -1208,13 +1183,13 @@ AcpiPsParseAml ( * A method call was detected. * Transfer control to the called control method */ - Status = AcpiDsCallControlMethod (&WalkList, WalkState, NULL); + Status = AcpiDsCallControlMethod (Thread, WalkState, NULL); /* * If the transfer to the new method method call worked, a new walk * state was created -- get it */ - WalkState = AcpiDsGetCurrentWalkState (&WalkList); + WalkState = AcpiDsGetCurrentWalkState (Thread); continue; } @@ -1225,7 +1200,7 @@ AcpiPsParseAml ( /* We are done with this walk, move on to the parent if any */ - WalkState = AcpiDsPopWalkState (&WalkList); + WalkState = AcpiDsPopWalkState (Thread); /* Reset the current scope to the beginning of scope stack */ @@ -1251,7 +1226,7 @@ AcpiPsParseAml ( /* Check if we have restarted a preempted walk */ - WalkState = AcpiDsGetCurrentWalkState (&WalkList); + WalkState = AcpiDsGetCurrentWalkState (Thread); if (WalkState) { if (ACPI_SUCCESS (Status)) @@ -1286,10 +1261,10 @@ AcpiPsParseAml ( AcpiDsDeleteWalkState (PreviousWalkState); } - /* Normal exit */ - AcpiExReleaseAllMutexes ((ACPI_OPERAND_OBJECT *) &WalkList.AcquiredMutexList); + AcpiExReleaseAllMutexes (Thread); + AcpiUtDeleteGenericState ((ACPI_GENERIC_STATE *) Thread); AcpiGbl_CurrentWalkList = PrevWalkList; return_ACPI_STATUS (Status); } diff --git a/sys/contrib/dev/acpica/psscope.c b/sys/contrib/dev/acpica/psscope.c index 35eed1f745a6..f3f868dec11e 100644 --- a/sys/contrib/dev/acpica/psscope.c +++ b/sys/contrib/dev/acpica/psscope.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: psscope - Parser scope stack management routines - * $Revision: 30 $ + * $Revision: 31 $ * *****************************************************************************/ @@ -239,7 +239,7 @@ AcpiPsPushScope ( Scope = AcpiUtCreateGenericState (); if (!Scope) { - return (AE_NO_MEMORY); + return_ACPI_STATUS (AE_NO_MEMORY); } diff --git a/sys/contrib/dev/acpica/pswalk.c b/sys/contrib/dev/acpica/pswalk.c index 3061ce2176f8..897556176b89 100644 --- a/sys/contrib/dev/acpica/pswalk.c +++ b/sys/contrib/dev/acpica/pswalk.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: pswalk - Parser routines to walk parsed op tree(s) - * $Revision: 58 $ + * $Revision: 61 $ * *****************************************************************************/ @@ -173,7 +173,6 @@ AcpiPsGetNextWalkOp ( return_ACPI_STATUS (AE_OK); } - /* * No more children, this Op is complete. Save Next and Parent * in case the Op object gets deleted by the callback routine @@ -222,7 +221,6 @@ AcpiPsGetNextWalkOp ( * the tree */ } - else { /* @@ -232,7 +230,6 @@ AcpiPsGetNextWalkOp ( Parent = Op; } - /* * Look for a sibling of the current Op's parent * Continue moving up the tree until we find a node that has not been @@ -287,9 +284,10 @@ AcpiPsGetNextWalkOp ( } - /* Got all the way to the top of the tree, we must be done! */ - /* However, the code should have terminated in the loop above */ - + /* + * Got all the way to the top of the tree, we must be done! + * However, the code should have terminated in the loop above + */ WalkState->NextOp = NULL; return_ACPI_STATUS (AE_OK); @@ -311,7 +309,7 @@ AcpiPsGetNextWalkOp ( * ******************************************************************************/ -static ACPI_STATUS +ACPI_STATUS AcpiPsDeleteCompletedOp ( ACPI_WALK_STATE *WalkState) { @@ -338,7 +336,7 @@ AcpiPsDeleteParseTree ( ACPI_PARSE_OBJECT *SubtreeRoot) { ACPI_WALK_STATE *WalkState; - ACPI_WALK_LIST WalkList; + ACPI_THREAD_STATE *Thread; FUNCTION_TRACE_PTR ("PsDeleteParseTree", SubtreeRoot); @@ -351,11 +349,14 @@ AcpiPsDeleteParseTree ( /* Create and initialize a new walk list */ - WalkList.WalkState = NULL; - WalkList.AcquiredMutexList.Prev = NULL; - WalkList.AcquiredMutexList.Next = NULL; + Thread = AcpiUtCreateThreadState (); + if (!Thread) + { + return_VOID; + } - WalkState = AcpiDsCreateWalkState (TABLE_ID_DSDT, NULL, NULL, &WalkList); + + WalkState = AcpiDsCreateWalkState (TABLE_ID_DSDT, NULL, NULL, Thread); if (!WalkState) { return_VOID; @@ -365,11 +366,9 @@ AcpiPsDeleteParseTree ( WalkState->DescendingCallback = NULL; WalkState->AscendingCallback = NULL; - WalkState->Origin = SubtreeRoot; WalkState->NextOp = SubtreeRoot; - /* Head downward in the tree */ WalkState->NextOpInfo = NEXT_OP_DOWNWARD; @@ -384,7 +383,7 @@ AcpiPsDeleteParseTree ( /* We are done with this walk */ - AcpiExReleaseAllMutexes ((ACPI_OPERAND_OBJECT *) &WalkList.AcquiredMutexList); + AcpiUtDeleteGenericState ((ACPI_GENERIC_STATE *) Thread); AcpiDsDeleteWalkState (WalkState); return_VOID; diff --git a/sys/contrib/dev/acpica/psxface.c b/sys/contrib/dev/acpica/psxface.c index 08b4178401b7..7ee0a8e37b8b 100644 --- a/sys/contrib/dev/acpica/psxface.c +++ b/sys/contrib/dev/acpica/psxface.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: psxface - Parser external interfaces - * $Revision: 52 $ + * $Revision: 56 $ * *****************************************************************************/ @@ -220,11 +220,11 @@ AcpiPsxExecute ( return_ACPI_STATUS (AE_NO_MEMORY); } - Status = AcpiDsInitAmlWalk (WalkState, Op, MethodNode, ObjDesc->Method.AmlStart, + Status = AcpiDsInitAmlWalk (WalkState, Op, MethodNode, ObjDesc->Method.AmlStart, ObjDesc->Method.AmlLength, NULL, NULL, 1); if (ACPI_FAILURE (Status)) { - /* TBD: delete walk state */ + AcpiDsDeleteWalkState (WalkState); return_ACPI_STATUS (Status); } @@ -263,11 +263,11 @@ AcpiPsxExecute ( return_ACPI_STATUS (AE_NO_MEMORY); } - Status = AcpiDsInitAmlWalk (WalkState, Op, MethodNode, ObjDesc->Method.AmlStart, + Status = AcpiDsInitAmlWalk (WalkState, Op, MethodNode, ObjDesc->Method.AmlStart, ObjDesc->Method.AmlLength, Params, ReturnObjDesc, 3); if (ACPI_FAILURE (Status)) { - /* TBD: delete walk state */ + AcpiDsDeleteWalkState (WalkState); return_ACPI_STATUS (Status); } @@ -287,14 +287,15 @@ AcpiPsxExecute ( } } + /* Now check status from the method execution */ if (ACPI_FAILURE (Status)) { - DUMP_PATHNAME (MethodNode, "PsExecute: method failed -", + REPORT_ERROR (("Method execution failed, %s\n", AcpiFormatException (Status))); + DUMP_PATHNAME (MethodNode, "Method pathname: ", ACPI_LV_ERROR, _COMPONENT); } - /* * If the method has returned an object, signal this to the caller with * a control exception code @@ -308,7 +309,6 @@ AcpiPsxExecute ( Status = AE_CTRL_RETURN_VALUE; } - return_ACPI_STATUS (Status); } diff --git a/sys/contrib/dev/acpica/rsaddr.c b/sys/contrib/dev/acpica/rsaddr.c index fb32d6508f75..723109842ff2 100644 --- a/sys/contrib/dev/acpica/rsaddr.c +++ b/sys/contrib/dev/acpica/rsaddr.c @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: rsaddr - Address resource descriptors (16/32/64) - * $Revision: 19 $ + * $Revision: 20 $ * ******************************************************************************/ @@ -179,6 +179,7 @@ AcpiRsAddress16Resource ( Temp8 = *Buffer; /* Values 0-2 are valid */ + if (Temp8 > 2) { return_ACPI_STATUS (AE_AML_INVALID_RESOURCE_TYPE); @@ -192,24 +193,20 @@ AcpiRsAddress16Resource ( Buffer += 1; Temp8 = *Buffer; - /* - * Producer / Consumer - */ + /* Producer / Consumer */ + OutputStruct->Data.Address16.ProducerConsumer = Temp8 & 0x01; - /* - * Decode - */ + /* Decode */ + OutputStruct->Data.Address16.Decode = (Temp8 >> 1) & 0x01; - /* - * Min Address Fixed - */ + /* Min Address Fixed */ + OutputStruct->Data.Address16.MinAddressFixed = (Temp8 >> 2) & 0x01; - /* - * Max Address Fixed - */ + /* Max Address Fixed */ + OutputStruct->Data.Address16.MaxAddressFixed = (Temp8 >> 3) & 0x01; /* @@ -225,7 +222,6 @@ AcpiRsAddress16Resource ( OutputStruct->Data.Address16.Attribute.Memory.CacheAttribute = (UINT16) ((Temp8 >> 1) & 0x0F); } - else { if (IO_RANGE == OutputStruct->Data.Address16.ResourceType) @@ -233,7 +229,6 @@ AcpiRsAddress16Resource ( OutputStruct->Data.Address16.Attribute.Io.RangeAttribute = (UINT16) (Temp8 & 0x03); } - else { /* BUS_NUMBER_RANGE == Address16.Data->ResourceType */ @@ -334,7 +329,6 @@ AcpiRsAddress16Resource ( Temp8 = (UINT8) (Index + 1); StructSize += ROUND_UP_TO_32BITS (Temp8); } - else { OutputStruct->Data.Address16.ResourceSource.Index = 0x00; @@ -434,7 +428,6 @@ AcpiRsAddress16Stream ( (LinkedList->Data.Address16.Attribute.Memory.CacheAttribute & 0x0F) << 1; } - else if (IO_RANGE == LinkedList->Data.Address16.ResourceType) { Temp8 = (UINT8) @@ -632,7 +625,6 @@ AcpiRsAddress32Resource ( OutputStruct->Data.Address32.Attribute.Memory.CacheAttribute = (UINT16) ((Temp8 >> 1) & 0x0F); } - else { if (IO_RANGE == OutputStruct->Data.Address32.ResourceType) @@ -640,7 +632,6 @@ AcpiRsAddress32Resource ( OutputStruct->Data.Address32.Attribute.Io.RangeAttribute = (UINT16) (Temp8 & 0x03); } - else { /* BUS_NUMBER_RANGE == OutputStruct->Data.Address32.ResourceType */ @@ -715,7 +706,6 @@ AcpiRsAddress32Resource ( /* Copy the string into the buffer */ Index = 0; - while (0x00 != *Buffer) { *TempPtr = *Buffer; @@ -739,7 +729,6 @@ AcpiRsAddress32Resource ( Temp8 = (UINT8) (Index + 1); StructSize += ROUND_UP_TO_32BITS (Temp8); } - else { OutputStruct->Data.Address32.ResourceSource.Index = 0x00; @@ -803,7 +792,6 @@ AcpiRsAddress32Stream ( /* * Set a pointer to the Length field - to be filled in later */ - LengthField = (UINT16 *) Buffer; Buffer += 2; @@ -841,7 +829,6 @@ AcpiRsAddress32Stream ( (LinkedList->Data.Address32.Attribute.Memory.CacheAttribute & 0x0F) << 1; } - else if (IO_RANGE == LinkedList->Data.Address32.ResourceType) { Temp8 = (UINT8) @@ -988,6 +975,7 @@ AcpiRsAddress64Resource ( Temp8 = *Buffer; /* Values 0-2 are valid */ + if(Temp8 > 2) { return_ACPI_STATUS (AE_AML_INVALID_RESOURCE_TYPE); @@ -1035,7 +1023,6 @@ AcpiRsAddress64Resource ( OutputStruct->Data.Address64.Attribute.Memory.CacheAttribute = (UINT16) ((Temp8 >> 1) & 0x0F); } - else { if (IO_RANGE == OutputStruct->Data.Address64.ResourceType) @@ -1043,7 +1030,6 @@ AcpiRsAddress64Resource ( OutputStruct->Data.Address64.Attribute.Io.RangeAttribute = (UINT16) (Temp8 & 0x03); } - else { /* BUS_NUMBER_RANGE == OutputStruct->Data.Address64.ResourceType */ @@ -1120,7 +1106,6 @@ AcpiRsAddress64Resource ( /* Copy the string into the buffer */ Index = 0; - while (0x00 != *Buffer) { *TempPtr = *Buffer; @@ -1145,7 +1130,6 @@ AcpiRsAddress64Resource ( Temp8 = (UINT8) (Index + 1); StructSize += ROUND_UP_TO_32BITS (Temp8); } - else { OutputStruct->Data.Address64.ResourceSource.Index = 0x00; @@ -1247,7 +1231,6 @@ AcpiRsAddress64Stream ( (LinkedList->Data.Address64.Attribute.Memory.CacheAttribute & 0x0F) << 1; } - else if (IO_RANGE == LinkedList->Data.Address64.ResourceType) { Temp8 = (UINT8) diff --git a/sys/contrib/dev/acpica/rscalc.c b/sys/contrib/dev/acpica/rscalc.c index 9239d6e99dbc..de3b7aa72d9e 100644 --- a/sys/contrib/dev/acpica/rscalc.c +++ b/sys/contrib/dev/acpica/rscalc.c @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: rscalc - Calculate stream and list lengths - * $Revision: 32 $ + * $Revision: 33 $ * ******************************************************************************/ @@ -627,7 +627,6 @@ AcpiRsCalculateListLength ( { Temp8 = (UINT8) (Temp16 - (9 + AdditionalBytes)); } - else { Temp8 = 0; @@ -656,7 +655,6 @@ AcpiRsCalculateListLength ( { BytesConsumed = 4; } - else { BytesConsumed = 3; @@ -805,7 +803,6 @@ AcpiRsCalculateListLength ( break; } - /* * Update the return value and counter */ @@ -818,7 +815,6 @@ AcpiRsCalculateListLength ( ByteStreamBuffer += BytesConsumed; } - /* * This is the data the caller needs */ @@ -902,7 +898,6 @@ AcpiRsCalculatePciRoutingTableLength ( { NameFound = TRUE; } - else { /* @@ -927,14 +922,12 @@ AcpiRsCalculatePciRoutingTableLength ( */ TempSizeNeeded += (*SubObjectList)->String.Length; } - else { TempSizeNeeded += AcpiNsGetPathnameLength ( (*SubObjectList)->Reference.Node); } } - else { /* @@ -954,7 +947,6 @@ AcpiRsCalculatePciRoutingTableLength ( TopObjectList++; } - /* * Adding an extra element to the end of the list, essentially a NULL terminator */ diff --git a/sys/contrib/dev/acpica/rscreate.c b/sys/contrib/dev/acpica/rscreate.c index 1081232a033d..14aaf5dfcf43 100644 --- a/sys/contrib/dev/acpica/rscreate.c +++ b/sys/contrib/dev/acpica/rscreate.c @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: rscreate - Create resource lists/tables - * $Revision: 36 $ + * $Revision: 38 $ * ******************************************************************************/ @@ -178,46 +178,33 @@ AcpiRsCreateResourceList ( ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Status=%X ListSizeNeeded=%X\n", Status, ListSizeNeeded)); - - /* - * Exit with the error passed back - */ if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); } /* - * If the linked list will fit into the available buffer - * call to fill in the list + * Is caller buffer large enough? */ - if (ListSizeNeeded <= *OutputBufferLength) + if (ListSizeNeeded > *OutputBufferLength) { - /* - * Zero out the return buffer before proceeding - */ - MEMSET (OutputBuffer, 0x00, *OutputBufferLength); - - Status = AcpiRsByteStreamToList (ByteStreamStart, ByteStreamBufferLength, - &OutputBuffer); - - /* - * Exit with the error passed back - */ - if (ACPI_FAILURE (Status)) - { - return_ACPI_STATUS (Status); - } - - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "OutputBuffer = %p\n", OutputBuffer)); + *OutputBufferLength = ListSizeNeeded; + return_ACPI_STATUS (AE_BUFFER_OVERFLOW); } - else + /* + * Zero out the return buffer before proceeding + */ + MEMSET (OutputBuffer, 0x00, *OutputBufferLength); + + Status = AcpiRsByteStreamToList (ByteStreamStart, ByteStreamBufferLength, + &OutputBuffer); + if (ACPI_FAILURE (Status)) { - *OutputBufferLength = ListSizeNeeded; - return_ACPI_STATUS (AE_BUFFER_OVERFLOW); + return_ACPI_STATUS (Status); } + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "OutputBuffer = %p\n", OutputBuffer)); *OutputBufferLength = ListSizeNeeded; return_ACPI_STATUS (AE_OK); } @@ -268,7 +255,6 @@ AcpiRsCreatePciRoutingTable ( */ Status = AcpiRsCalculatePciRoutingTableLength (PackageObject, &BufferSizeNeeded); - if (!ACPI_SUCCESS(Status)) { return_ACPI_STATUS (Status); @@ -276,195 +262,186 @@ AcpiRsCreatePciRoutingTable ( ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "BufferSizeNeeded = %X\n", BufferSizeNeeded)); + /* Is caller buffer large enough? */ + + if (BufferSizeNeeded > *OutputBufferLength) + { + return_ACPI_STATUS (AE_BUFFER_OVERFLOW); + } + *OutputBufferLength = BufferSizeNeeded; + + /* + * Zero out the return buffer before proceeding + */ + MEMSET (OutputBuffer, 0x00, *OutputBufferLength); + /* - * If the data will fit into the available buffer - * call to fill in the list + * Loop through the ACPI_INTERNAL_OBJECTS - Each object should + * contain a UINT32 Address, a UINT8 Pin, a Name and a UINT8 + * SourceIndex. */ - if (BufferSizeNeeded <= *OutputBufferLength) + TopObjectList = PackageObject->Package.Elements; + NumberOfElements = PackageObject->Package.Count; + UserPrt = (PCI_ROUTING_TABLE *) Buffer; + + + Buffer = ROUND_PTR_UP_TO_8 (Buffer, UINT8); + + for (Index = 0; Index < NumberOfElements; Index++) { /* - * Zero out the return buffer before proceeding + * Point UserPrt past this current structure + * + * NOTE: On the first iteration, UserPrt->Length will + * be zero because we cleared the return buffer earlier */ - MEMSET (OutputBuffer, 0x00, *OutputBufferLength); + Buffer += UserPrt->Length; + UserPrt = (PCI_ROUTING_TABLE *) Buffer; /* - * Loop through the ACPI_INTERNAL_OBJECTS - Each object should - * contain a UINT32 Address, a UINT8 Pin, a Name and a UINT8 - * SourceIndex. + * Fill in the Length field with the information we + * have at this point. + * The minus four is to subtract the size of the + * UINT8 Source[4] member because it is added below. */ - TopObjectList = PackageObject->Package.Elements; - NumberOfElements = PackageObject->Package.Count; - UserPrt = (PCI_ROUTING_TABLE *) Buffer; + UserPrt->Length = (sizeof (PCI_ROUTING_TABLE) -4); + /* + * Dereference the sub-package + */ + PackageElement = *TopObjectList; - Buffer = ROUND_PTR_UP_TO_8 (Buffer, UINT8); + /* + * The SubObjectList will now point to an array of + * the four IRQ elements: Address, Pin, Source and + * SourceIndex + */ + SubObjectList = PackageElement->Package.Elements; - for (Index = 0; Index < NumberOfElements; Index++) + /* + * 1) First subobject: Dereference the Address + */ + if (ACPI_TYPE_INTEGER == (*SubObjectList)->Common.Type) { - /* - * Point UserPrt past this current structure - * - * NOTE: On the first iteration, UserPrt->Length will - * be zero because we cleared the return buffer earlier - */ - Buffer += UserPrt->Length; - UserPrt = (PCI_ROUTING_TABLE *) Buffer; - - - /* - * Fill in the Length field with the information we - * have at this point. - * The minus four is to subtract the size of the - * UINT8 Source[4] member because it is added below. - */ - UserPrt->Length = (sizeof (PCI_ROUTING_TABLE) -4); - - /* - * Dereference the sub-package - */ - PackageElement = *TopObjectList; - - /* - * The SubObjectList will now point to an array of - * the four IRQ elements: Address, Pin, Source and - * SourceIndex - */ - SubObjectList = PackageElement->Package.Elements; + UserPrt->Address = (*SubObjectList)->Integer.Value; + } + else + { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Need Integer, found %s\n", + AcpiUtGetTypeName ((*SubObjectList)->Common.Type))); + return_ACPI_STATUS (AE_BAD_DATA); + } - /* - * 1) First subobject: Dereference the Address - */ - if (ACPI_TYPE_INTEGER == (*SubObjectList)->Common.Type) - { - UserPrt->Address = (*SubObjectList)->Integer.Value; - } + /* + * 2) Second subobject: Dereference the Pin + */ + SubObjectList++; - else - { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Need Integer, found %s\n", - AcpiUtGetTypeName ((*SubObjectList)->Common.Type))); - return_ACPI_STATUS (AE_BAD_DATA); - } + if (ACPI_TYPE_INTEGER == (*SubObjectList)->Common.Type) + { + UserPrt->Pin = (UINT32) (*SubObjectList)->Integer.Value; + } + else + { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Need Integer, found %s\n", + AcpiUtGetTypeName ((*SubObjectList)->Common.Type))); + return_ACPI_STATUS (AE_BAD_DATA); + } - /* - * 2) Second subobject: Dereference the Pin - */ - SubObjectList++; + /* + * 3) Third subobject: Dereference the Source Name + */ + SubObjectList++; - if (ACPI_TYPE_INTEGER == (*SubObjectList)->Common.Type) - { - UserPrt->Pin = (UINT32) (*SubObjectList)->Integer.Value; - } + switch ((*SubObjectList)->Common.Type) + { + case INTERNAL_TYPE_REFERENCE: - else + if ((*SubObjectList)->Reference.Opcode != AML_INT_NAMEPATH_OP) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Need Integer, found %s\n", - AcpiUtGetTypeName ((*SubObjectList)->Common.Type))); + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Need name, found reference op %X\n", + (*SubObjectList)->Reference.Opcode)); return_ACPI_STATUS (AE_BAD_DATA); } - /* - * 3) Third subobject: Dereference the Source Name - */ - SubObjectList++; - - switch ((*SubObjectList)->Common.Type) - { - case INTERNAL_TYPE_REFERENCE: - - if ((*SubObjectList)->Reference.Opcode != AML_INT_NAMEPATH_OP) - { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Need name, found reference op %X\n", - (*SubObjectList)->Reference.Opcode)); - return_ACPI_STATUS (AE_BAD_DATA); - } - - Node = (*SubObjectList)->Reference.Node; - - /* TBD: use *remaining* length of the buffer! */ - - Status = AcpiNsHandleToPathname ((ACPI_HANDLE *) Node, - OutputBufferLength, UserPrt->Source); - - UserPrt->Length += STRLEN (UserPrt->Source) + 1; /* include null terminator */ - break; + Node = (*SubObjectList)->Reference.Node; + /* Use *remaining* length of the buffer as max for pathname */ - case ACPI_TYPE_STRING: + BufferSizeNeeded = *OutputBufferLength - + (UINT32) ((UINT8 *) UserPrt->Source - OutputBuffer); - STRCPY (UserPrt->Source, - (*SubObjectList)->String.Pointer); + Status = AcpiNsHandleToPathname ((ACPI_HANDLE *) Node, + &BufferSizeNeeded, UserPrt->Source); - /* - * Add to the Length field the length of the string - */ - UserPrt->Length += (*SubObjectList)->String.Length; - break; + UserPrt->Length += STRLEN (UserPrt->Source) + 1; /* include null terminator */ + break; - case ACPI_TYPE_INTEGER: - /* - * If this is a number, then the Source Name - * is NULL, since the entire buffer was zeroed - * out, we can leave this alone. - */ - /* - * Add to the Length field the length of - * the UINT32 NULL - */ - UserPrt->Length += sizeof (UINT32); - break; + case ACPI_TYPE_STRING: + STRCPY (UserPrt->Source, + (*SubObjectList)->String.Pointer); - default: - - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Need Integer, found %s\n", - AcpiUtGetTypeName ((*SubObjectList)->Common.Type))); - return_ACPI_STATUS (AE_BAD_DATA); - break; - } - - /* Now align the current length */ + /* + * Add to the Length field the length of the string + */ + UserPrt->Length += (*SubObjectList)->String.Length; + break; - UserPrt->Length = ROUND_UP_TO_64BITS (UserPrt->Length); + case ACPI_TYPE_INTEGER: + /* + * If this is a number, then the Source Name + * is NULL, since the entire buffer was zeroed + * out, we can leave this alone. + */ /* - * 4) Fourth subobject: Dereference the Source Index + * Add to the Length field the length of + * the UINT32 NULL */ - SubObjectList++; + UserPrt->Length += sizeof (UINT32); + break; - if (ACPI_TYPE_INTEGER == (*SubObjectList)->Common.Type) - { - UserPrt->SourceIndex = (UINT32) (*SubObjectList)->Integer.Value; - } - else - { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Need Integer, found %s\n", - AcpiUtGetTypeName ((*SubObjectList)->Common.Type))); - return_ACPI_STATUS (AE_BAD_DATA); - } + default: - /* - * Point to the next ACPI_OPERAND_OBJECT - */ - TopObjectList++; + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Need Integer, found %s\n", + AcpiUtGetTypeName ((*SubObjectList)->Common.Type))); + return_ACPI_STATUS (AE_BAD_DATA); + break; } - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "OutputBuffer = %p\n", OutputBuffer)); - } + /* Now align the current length */ - else - { - *OutputBufferLength = BufferSizeNeeded; + UserPrt->Length = ROUND_UP_TO_64BITS (UserPrt->Length); - return_ACPI_STATUS (AE_BUFFER_OVERFLOW); + /* + * 4) Fourth subobject: Dereference the Source Index + */ + SubObjectList++; + + if (ACPI_TYPE_INTEGER == (*SubObjectList)->Common.Type) + { + UserPrt->SourceIndex = (UINT32) (*SubObjectList)->Integer.Value; + } + else + { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Need Integer, found %s\n", + AcpiUtGetTypeName ((*SubObjectList)->Common.Type))); + return_ACPI_STATUS (AE_BAD_DATA); + } + + /* + * Point to the next ACPI_OPERAND_OBJECT + */ + TopObjectList++; } /* * Report the amount of buffer used */ - *OutputBufferLength = BufferSizeNeeded; + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "OutputBuffer = %p\n", OutputBuffer)); return_ACPI_STATUS (AE_OK); } @@ -506,7 +483,7 @@ AcpiRsCreateByteStream ( /* * Params already validated, so we don't re-validate here * - * Pass the LinkedListBuffer into a module that can calculate + * Pass the LinkedListBuffer into a module that calculates * the buffer size needed for the byte stream. */ Status = AcpiRsCalculateByteStreamLength (LinkedListBuffer, @@ -514,46 +491,33 @@ AcpiRsCreateByteStream ( ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "ByteStreamSizeNeeded=%X, %s\n", ByteStreamSizeNeeded, AcpiFormatException (Status))); - - /* - * Exit with the error passed back - */ if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); } /* - * If the linked list will fit into the available buffer - * call to fill in the list + * Is caller buffer large enough? */ - if (ByteStreamSizeNeeded <= *OutputBufferLength) + if (ByteStreamSizeNeeded > *OutputBufferLength) { - /* - * Zero out the return buffer before proceeding - */ - MEMSET (OutputBuffer, 0x00, *OutputBufferLength); - - Status = AcpiRsListToByteStream (LinkedListBuffer, ByteStreamSizeNeeded, - &OutputBuffer); - - /* - * Exit with the error passed back - */ - if (ACPI_FAILURE (Status)) - { - return_ACPI_STATUS (Status); - } - - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "OutputBuffer = %p\n", OutputBuffer)); + *OutputBufferLength = ByteStreamSizeNeeded; + return_ACPI_STATUS (AE_BUFFER_OVERFLOW); } - else + /* + * Zero out the return buffer before proceeding + */ + MEMSET (OutputBuffer, 0x00, *OutputBufferLength); + + Status = AcpiRsListToByteStream (LinkedListBuffer, ByteStreamSizeNeeded, + &OutputBuffer); + if (ACPI_FAILURE (Status)) { - *OutputBufferLength = ByteStreamSizeNeeded; - return_ACPI_STATUS (AE_BUFFER_OVERFLOW); + return_ACPI_STATUS (Status); } + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "OutputBuffer = %p\n", OutputBuffer)); return_ACPI_STATUS (AE_OK); } diff --git a/sys/contrib/dev/acpica/rsirq.c b/sys/contrib/dev/acpica/rsirq.c index 6aa1cf5ee0b9..7944046c0edc 100644 --- a/sys/contrib/dev/acpica/rsirq.c +++ b/sys/contrib/dev/acpica/rsirq.c @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: rsirq - IRQ resource descriptors - * $Revision: 18 $ + * $Revision: 19 $ * ******************************************************************************/ @@ -213,7 +213,6 @@ AcpiRsIrqResource ( OutputStruct->Data.Irq.EdgeLevel = EDGE_SENSITIVE; OutputStruct->Data.Irq.ActiveHighLow = ACTIVE_HIGH; } - else { if (Temp8 & 0x8) @@ -221,7 +220,6 @@ AcpiRsIrqResource ( OutputStruct->Data.Irq.EdgeLevel = LEVEL_SENSITIVE; OutputStruct->Data.Irq.ActiveHighLow = ACTIVE_LOW; } - else { /* @@ -238,7 +236,6 @@ AcpiRsIrqResource ( */ OutputStruct->Data.Irq.SharedExclusive = (Temp8 >> 3) & 0x01; } - else { /* @@ -307,7 +304,6 @@ AcpiRsIrqStream ( *Buffer = 0x22; IRQInfoByteNeeded = FALSE; } - else { *Buffer = 0x23; @@ -345,7 +341,6 @@ AcpiRsIrqStream ( { Temp8 |= 0x08; } - else { Temp8 |= 0x01; @@ -429,7 +424,6 @@ AcpiRsExtendedIrqResource ( OutputStruct->Data.ExtendedIrq.EdgeLevel = EDGE_SENSITIVE; OutputStruct->Data.ExtendedIrq.ActiveHighLow = ACTIVE_HIGH; } - else { if(Temp8 & 0x4) @@ -437,7 +431,6 @@ AcpiRsExtendedIrqResource ( OutputStruct->Data.ExtendedIrq.EdgeLevel = LEVEL_SENSITIVE; OutputStruct->Data.ExtendedIrq.ActiveHighLow = ACTIVE_LOW; } - else { /* @@ -516,7 +509,6 @@ AcpiRsExtendedIrqResource ( /* Copy the string into the buffer */ Index = 0; - while (0x00 != *Buffer) { *TempPtr = *Buffer; @@ -540,7 +532,6 @@ AcpiRsExtendedIrqResource ( Temp8 = (UINT8) (Index + 1); StructSize += ROUND_UP_TO_32BITS (Temp8); } - else { OutputStruct->Data.ExtendedIrq.ResourceSource.Index = 0x00; diff --git a/sys/contrib/dev/acpica/rsmisc.c b/sys/contrib/dev/acpica/rsmisc.c index 830991d40f3c..ee1732fbb798 100644 --- a/sys/contrib/dev/acpica/rsmisc.c +++ b/sys/contrib/dev/acpica/rsmisc.c @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: rsmisc - Miscellaneous resource descriptors - * $Revision: 16 $ + * $Revision: 17 $ * ******************************************************************************/ @@ -283,8 +283,7 @@ AcpiRsVendorResource ( if (Temp8 & 0x80) { /* - * Large Item - * Point to the length field + * Large Item, point to the length field */ Buffer += 1; @@ -300,12 +299,10 @@ AcpiRsVendorResource ( Buffer += 2; } - else { /* - * Small Item - * Dereference the size + * Small Item, dereference the size */ Temp16 = (UINT8)(*Buffer & 0x07); @@ -385,8 +382,7 @@ AcpiRsVendorStream ( if(LinkedList->Data.VendorSpecific.Length > 7) { /* - * Large Item - * Set the descriptor field and length bytes + * Large Item, Set the descriptor field and length bytes */ *Buffer = 0x84; Buffer += 1; @@ -396,12 +392,10 @@ AcpiRsVendorStream ( MOVE_UNALIGNED16_TO_16 (Buffer, &Temp16); Buffer += 2; } - else { /* - * Small Item - * Set the descriptor field + * Small Item, Set the descriptor field */ Temp8 = 0x70; Temp8 |= LinkedList->Data.VendorSpecific.Length; @@ -504,7 +498,6 @@ AcpiRsStartDependentFunctionsResource ( return_ACPI_STATUS (AE_AML_ERROR); } } - else { OutputStruct->Data.StartDpf.CompatibilityPriority = diff --git a/sys/contrib/dev/acpica/tbget.c b/sys/contrib/dev/acpica/tbget.c index e30e4bd38276..4e0d7d929166 100644 --- a/sys/contrib/dev/acpica/tbget.c +++ b/sys/contrib/dev/acpica/tbget.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: tbget - ACPI Table get* routines - * $Revision: 56 $ + * $Revision: 57 $ * *****************************************************************************/ @@ -465,13 +465,6 @@ AcpiTbGetAllTables ( AcpiGbl_DSDT->Length, AcpiGbl_DSDT->Length)); DUMP_BUFFER ((UINT8 *) (AcpiGbl_DSDT + 1), AcpiGbl_DSDT->Length); - /* - * Initialize the capabilities flags. - * Assumes that platform supports ACPI_MODE since we have tables! - */ - AcpiGbl_SystemFlags |= AcpiHwGetModeCapabilities (); - - /* Always delete the RSDP mapping, we are done with it */ AcpiTbDeleteAcpiTable (ACPI_TABLE_RSDP); diff --git a/sys/contrib/dev/acpica/tbinstal.c b/sys/contrib/dev/acpica/tbinstal.c index 8e7ffdb0fe89..a7c889c524f9 100644 --- a/sys/contrib/dev/acpica/tbinstal.c +++ b/sys/contrib/dev/acpica/tbinstal.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: tbinstal - ACPI table installation and removal - * $Revision: 45 $ + * $Revision: 47 $ * *****************************************************************************/ @@ -321,7 +321,7 @@ AcpiTbInitTableDescriptor ( */ if (ListHead->Pointer) { - return_ACPI_STATUS (AE_EXIST); + return_ACPI_STATUS (AE_ALREADY_EXISTS); } TableDesc->Count = 1; @@ -659,7 +659,6 @@ AcpiTbUninstallTable ( } - return_PTR (NextDesc); } diff --git a/sys/contrib/dev/acpica/tbutils.c b/sys/contrib/dev/acpica/tbutils.c index 4e4762379da0..8b7dfa04d568 100644 --- a/sys/contrib/dev/acpica/tbutils.c +++ b/sys/contrib/dev/acpica/tbutils.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: tbutils - Table manipulation utilities - * $Revision: 42 $ + * $Revision: 43 $ * *****************************************************************************/ @@ -174,87 +174,6 @@ AcpiTbHandleToObject ( /******************************************************************************* * - * FUNCTION: AcpiTbSystemTablePointer - * - * PARAMETERS: *Where - Pointer to be examined - * - * RETURN: TRUE if Where is within the AML stream (in one of the ACPI - * system tables such as the DSDT or an SSDT.) - * FALSE otherwise - * - ******************************************************************************/ - -BOOLEAN -AcpiTbSystemTablePointer ( - void *Where) -{ - UINT32 i; - ACPI_TABLE_DESC *TableDesc; - ACPI_TABLE_HEADER *Table; - - - /* No function trace, called too often! */ - - - /* Ignore null pointer */ - - if (!Where) - { - return (FALSE); - } - - - /* Check for a pointer within the DSDT */ - - if ((AcpiGbl_DSDT) && - (IS_IN_ACPI_TABLE (Where, AcpiGbl_DSDT))) - { - return (TRUE); - } - - - /* Check each of the loaded SSDTs (if any)*/ - - TableDesc = &AcpiGbl_AcpiTables[ACPI_TABLE_SSDT]; - - for (i = 0; i < AcpiGbl_AcpiTables[ACPI_TABLE_SSDT].Count; i++) - { - Table = TableDesc->Pointer; - - if (IS_IN_ACPI_TABLE (Where, Table)) - { - return (TRUE); - } - - TableDesc = TableDesc->Next; - } - - - /* Check each of the loaded PSDTs (if any)*/ - - TableDesc = &AcpiGbl_AcpiTables[ACPI_TABLE_PSDT]; - - for (i = 0; i < AcpiGbl_AcpiTables[ACPI_TABLE_PSDT].Count; i++) - { - Table = TableDesc->Pointer; - - if (IS_IN_ACPI_TABLE (Where, Table)) - { - return (TRUE); - } - - TableDesc = TableDesc->Next; - } - - - /* Pointer does not point into any system table */ - - return (FALSE); -} - - -/******************************************************************************* - * * FUNCTION: AcpiTbValidateTableHeader * * PARAMETERS: TableHeader - Logical pointer to the table diff --git a/sys/contrib/dev/acpica/utalloc.c b/sys/contrib/dev/acpica/utalloc.c index 7b1bc435ca29..e2f3d29eff4e 100644 --- a/sys/contrib/dev/acpica/utalloc.c +++ b/sys/contrib/dev/acpica/utalloc.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: utalloc - local cache and memory allocation routines - * $Revision: 106 $ + * $Revision: 109 $ * *****************************************************************************/ @@ -590,40 +590,30 @@ AcpiUtDumpAllocations ( NATIVE_CHAR *Module) { ACPI_DEBUG_MEM_BLOCK *Element; - UINT32 i; + UINT32 NumOutstanding = 0; FUNCTION_TRACE ("UtDumpAllocations"); - Element = AcpiGbl_MemoryLists[0].ListHead; - if (Element == NULL) - { - ACPI_DEBUG_PRINT ((ACPI_DB_OK, - "No outstanding allocations.\n")); - return_VOID; - } - - /* * Walk the allocation list. */ AcpiUtAcquireMutex (ACPI_MTX_MEMORY); - ACPI_DEBUG_PRINT ((ACPI_DB_OK, - "Outstanding allocations:\n")); - - for (i = 1; ; i++) /* Just a counter */ + Element = AcpiGbl_MemoryLists[0].ListHead; + while (Element) { if ((Element->Component & Component) && ((Module == NULL) || (0 == STRCMP (Module, Element->Module)))) { + /* Ignore allocated objects that are in a cache */ + if (((ACPI_OPERAND_OBJECT *)(&Element->UserSpace))->Common.Type != ACPI_CACHED_OBJECT) { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, - "%p Len %04X %9.9s-%d", + AcpiOsPrintf ("%p Len %04X %9.9s-%d ", &Element->UserSpace, Element->Size, Element->Module, - Element->Line)); + Element->Line); /* Most of the elements will be internal objects. */ @@ -631,90 +621,86 @@ AcpiUtDumpAllocations ( (&Element->UserSpace))->Common.DataType) { case ACPI_DESC_TYPE_INTERNAL: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, - " ObjType %12.12s R%d", + AcpiOsPrintf ("ObjType %12.12s R%d", AcpiUtGetTypeName (((ACPI_OPERAND_OBJECT *)(&Element->UserSpace))->Common.Type), - ((ACPI_OPERAND_OBJECT *)(&Element->UserSpace))->Common.ReferenceCount)); + ((ACPI_OPERAND_OBJECT *)(&Element->UserSpace))->Common.ReferenceCount); break; case ACPI_DESC_TYPE_PARSER: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, - " ParseObj Opcode %04X", - ((ACPI_PARSE_OBJECT *)(&Element->UserSpace))->Opcode)); + AcpiOsPrintf ("ParseObj Opcode %04X", + ((ACPI_PARSE_OBJECT *)(&Element->UserSpace))->Opcode); break; case ACPI_DESC_TYPE_NAMED: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, - " Node %4.4s", - (char*)&((ACPI_NAMESPACE_NODE *)(&Element->UserSpace))->Name)); + AcpiOsPrintf ("Node %4.4s", + (char *) &((ACPI_NAMESPACE_NODE *)(&Element->UserSpace))->Name); break; case ACPI_DESC_TYPE_STATE: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, - " Untyped StateObj")); + AcpiOsPrintf ("Untyped StateObj"); break; case ACPI_DESC_TYPE_STATE_UPDATE: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, - " UPDATE StateObj")); + AcpiOsPrintf ("UPDATE StateObj"); break; case ACPI_DESC_TYPE_STATE_PACKAGE: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, - " PACKAGE StateObj")); + AcpiOsPrintf ("PACKAGE StateObj"); break; case ACPI_DESC_TYPE_STATE_CONTROL: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, - " CONTROL StateObj")); + AcpiOsPrintf ("CONTROL StateObj"); break; case ACPI_DESC_TYPE_STATE_RPSCOPE: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, - " ROOT-PARSE-SCOPE StateObj")); + AcpiOsPrintf ("ROOT-PARSE-SCOPE StateObj"); break; case ACPI_DESC_TYPE_STATE_PSCOPE: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, - " PARSE-SCOPE StateObj")); + AcpiOsPrintf ("PARSE-SCOPE StateObj"); break; case ACPI_DESC_TYPE_STATE_WSCOPE: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, - " WALK-SCOPE StateObj")); + AcpiOsPrintf ("WALK-SCOPE StateObj"); break; case ACPI_DESC_TYPE_STATE_RESULT: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, - " RESULT StateObj")); + AcpiOsPrintf ("RESULT StateObj"); break; case ACPI_DESC_TYPE_STATE_NOTIFY: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, - " NOTIFY StateObj")); + AcpiOsPrintf ("NOTIFY StateObj"); + break; + + case ACPI_DESC_TYPE_STATE_THREAD: + AcpiOsPrintf ("THREAD StateObj"); break; } - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, "\n")); + AcpiOsPrintf ( "\n"); + NumOutstanding++; } } - - if (Element->Next == NULL) - { - break; - } - Element = Element->Next; } AcpiUtReleaseMutex (ACPI_MTX_MEMORY); - ACPI_DEBUG_PRINT ((ACPI_DB_OK, - "Total number of unfreed allocations = %d(%X)\n", i,i)); + /* Print summary */ + if (!NumOutstanding) + { + ACPI_DEBUG_PRINT ((ACPI_DB_OK, + "No outstanding allocations.\n")); + } + else + { + ACPI_DEBUG_PRINT ((ACPI_DB_OK, + "%d(%X) Outstanding allocations\n", + NumOutstanding, NumOutstanding)); + } return_VOID; - } diff --git a/sys/contrib/dev/acpica/utcopy.c b/sys/contrib/dev/acpica/utcopy.c index 821f0ab553f6..58202a705988 100644 --- a/sys/contrib/dev/acpica/utcopy.c +++ b/sys/contrib/dev/acpica/utcopy.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: utcopy - Internal to external object translation utilities - * $Revision: 83 $ + * $Revision: 86 $ * *****************************************************************************/ @@ -332,7 +332,7 @@ AcpiUtCopyIelementToEelement ( case ACPI_COPY_TYPE_SIMPLE: /* - * This is a simple or null object -- get the size + * This is a simple or null object */ Status = AcpiUtCopyIsimpleToEsimple (SourceObject, TargetObject, Info->FreeSpace, &ObjectSpace); @@ -340,9 +340,9 @@ AcpiUtCopyIelementToEelement ( { return (Status); } - break; + case ACPI_COPY_TYPE_PACKAGE: /* @@ -365,14 +365,14 @@ AcpiUtCopyIelementToEelement ( TargetObject->Package.Count * sizeof (ACPI_OBJECT)); break; + default: return (AE_BAD_PARAMETER); + break; } - Info->FreeSpace += ObjectSpace; Info->Length += ObjectSpace; - return (Status); } @@ -423,12 +423,10 @@ AcpiUtCopyIpackageToEpackage ( Info.NumPackages = 1; Info.FreeSpace = Buffer + ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT)); - ExternalObject->Type = InternalObject->Common.Type; ExternalObject->Package.Count = InternalObject->Package.Count; ExternalObject->Package.Elements = (ACPI_OBJECT *) Info.FreeSpace; - /* * Build an array of ACPI_OBJECTS in the buffer * and move the free space past it @@ -436,16 +434,14 @@ AcpiUtCopyIpackageToEpackage ( Info.FreeSpace += ExternalObject->Package.Count * ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT)); - Status = AcpiUtWalkPackageTree (InternalObject, ExternalObject, AcpiUtCopyIelementToEelement, &Info); *SpaceUsed = Info.Length; - return_ACPI_STATUS (Status); - } + /******************************************************************************* * * FUNCTION: AcpiUtCopyIobjectToEobject @@ -480,7 +476,6 @@ AcpiUtCopyIobjectToEobject ( Status = AcpiUtCopyIpackageToEpackage (InternalObject, RetBuffer->Pointer, &RetBuffer->Length); } - else { /* @@ -529,7 +524,6 @@ AcpiUtCopyEsimpleToIsimple ( FUNCTION_TRACE ("UtCopyEsimpleToIsimple"); - /* * Simple types supported are: String, Buffer, Integer */ @@ -568,8 +562,8 @@ AcpiUtCopyEsimpleToIsimple ( return_ACPI_STATUS (AE_NO_MEMORY); } - MEMCPY (InternalObject->String.Pointer, - ExternalObject->String.Pointer, + MEMCPY (InternalObject->String.Pointer, + ExternalObject->String.Pointer, ExternalObject->String.Length); InternalObject->String.Length = ExternalObject->String.Length; @@ -584,8 +578,8 @@ AcpiUtCopyEsimpleToIsimple ( return_ACPI_STATUS (AE_NO_MEMORY); } - MEMCPY (InternalObject->Buffer.Pointer, - ExternalObject->Buffer.Pointer, + MEMCPY (InternalObject->Buffer.Pointer, + ExternalObject->Buffer.Pointer, ExternalObject->Buffer.Length); InternalObject->Buffer.Length = ExternalObject->Buffer.Length; @@ -598,7 +592,6 @@ AcpiUtCopyEsimpleToIsimple ( break; } - *RetInternalObject = InternalObject; return_ACPI_STATUS (AE_OK); } @@ -702,18 +695,8 @@ AcpiUtCopyEobjectToIobject ( if (ExternalObject->Type == ACPI_TYPE_PACKAGE) { /* - * Package objects contain other objects (which can be objects) - * buildpackage does it all - * - * TBD: Package conversion must be completed and tested - * NOTE: this code converts packages as input parameters to - * control methods only. This is a very, very rare case. + * Packages as external input to control methods are not supported, */ -/* - Status = AcpiUtCopyEpackageToIpackage(InternalObject, - RetBuffer->Pointer, - &RetBuffer->Length); -*/ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Packages as parameters not implemented!\n")); @@ -789,6 +772,7 @@ AcpiUtCopyIelementToIelement ( case 1: + /* * This object is a package - go down another nesting level * Create and build the package object @@ -796,8 +780,6 @@ AcpiUtCopyIelementToIelement ( TargetObject = AcpiUtCreateInternalObject (ACPI_TYPE_PACKAGE); if (!TargetObject) { - /* TBD: must delete package created up to this point */ - return (AE_NO_MEMORY); } @@ -814,11 +796,12 @@ AcpiUtCopyIelementToIelement ( *ThisTargetPtr = TargetObject; break; + default: return (AE_BAD_PARAMETER); + break; } - return (Status); } @@ -858,8 +841,6 @@ AcpiUtCopyIpackageToIpackage ( */ DestObj->Package.Elements = ACPI_MEM_CALLOCATE ((SourceObj->Package.Count + 1) * sizeof (void *)); - DestObj->Package.NextElement = DestObj->Package.Elements; - if (!DestObj->Package.Elements) { REPORT_ERROR ( @@ -867,9 +848,22 @@ AcpiUtCopyIpackageToIpackage ( return_ACPI_STATUS (AE_NO_MEMORY); } + /* Init */ + DestObj->Package.NextElement = DestObj->Package.Elements; + + /* + * Copy the package element-by-element by walking the package "tree". + * This handles nested packages of arbitrary depth. + */ Status = AcpiUtWalkPackageTree (SourceObj, DestObj, AcpiUtCopyIelementToIelement, WalkState); + if (ACPI_FAILURE (Status)) + { + /* On failure, delete the destination package object */ + + AcpiUtRemoveReference (DestObj); + } return_ACPI_STATUS (Status); } diff --git a/sys/contrib/dev/acpica/utdebug.c b/sys/contrib/dev/acpica/utdebug.c index b6193a09a004..bc46c68be7c1 100644 --- a/sys/contrib/dev/acpica/utdebug.c +++ b/sys/contrib/dev/acpica/utdebug.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: utdebug - Debug print routines - * $Revision: 90 $ + * $Revision: 91 $ * *****************************************************************************/ @@ -127,7 +127,6 @@ char *AcpiGbl_FnEntryStr = "----Entry"; char *AcpiGbl_FnExitStr = "----Exit-"; - #ifdef ACPI_DEBUG @@ -573,8 +572,6 @@ AcpiUtPtrExit ( #endif - - /***************************************************************************** * * FUNCTION: AcpiUtDumpBuffer diff --git a/sys/contrib/dev/acpica/utdelete.c b/sys/contrib/dev/acpica/utdelete.c index 0c741d85b3d6..ccbe0da347c8 100644 --- a/sys/contrib/dev/acpica/utdelete.c +++ b/sys/contrib/dev/acpica/utdelete.c @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: utdelete - object deletion and reference count utilities - * $Revision: 81 $ + * $Revision: 83 $ * ******************************************************************************/ @@ -145,6 +145,7 @@ AcpiUtDeleteInternalObj ( { void *ObjPointer = NULL; ACPI_OPERAND_OBJECT *HandlerDesc; + ACPI_OPERAND_OBJECT *SecondDesc; FUNCTION_TRACE_PTR ("UtDeleteInternalObj", Object); @@ -234,7 +235,6 @@ AcpiUtDeleteInternalObj ( AcpiOsDeleteSemaphore (Object->Method.Semaphore); Object->Method.Semaphore = NULL; } - break; @@ -242,7 +242,8 @@ AcpiUtDeleteInternalObj ( ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "***** Region %p\n", Object)); - if (Object->Region.Extra) + SecondDesc = AcpiNsGetSecondaryObject (Object); + if (SecondDesc) { /* * Free the RegionContext if and only if the handler is one of the @@ -253,12 +254,12 @@ AcpiUtDeleteInternalObj ( if ((HandlerDesc) && (HandlerDesc->AddrHandler.Hflags == ADDR_HANDLER_DEFAULT_INSTALLED)) { - ObjPointer = Object->Region.Extra->Extra.RegionContext; + ObjPointer = SecondDesc->Extra.RegionContext; } /* Now we can free the Extra object */ - AcpiUtDeleteObjectDesc (Object->Region.Extra); + AcpiUtDeleteObjectDesc (SecondDesc); } break; @@ -267,12 +268,14 @@ AcpiUtDeleteInternalObj ( ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "***** Buffer Field %p\n", Object)); - if (Object->BufferField.Extra) + SecondDesc = AcpiNsGetSecondaryObject (Object); + if (SecondDesc) { - AcpiUtDeleteObjectDesc (Object->BufferField.Extra); + AcpiUtDeleteObjectDesc (SecondDesc); } break; + default: break; } @@ -610,7 +613,7 @@ AcpiUtUpdateObjectReference ( case INTERNAL_TYPE_BANK_FIELD: Status = AcpiUtCreateUpdateStateAndPush ( - Object->BankField.BankRegisterObj, Action, &StateList); + Object->BankField.BankObj, Action, &StateList); if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); diff --git a/sys/contrib/dev/acpica/uteval.c b/sys/contrib/dev/acpica/uteval.c index 463c4f7ad0fb..d2dd7c5e6d03 100644 --- a/sys/contrib/dev/acpica/uteval.c +++ b/sys/contrib/dev/acpica/uteval.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: uteval - Object evaluation - * $Revision: 31 $ + * $Revision: 34 $ * *****************************************************************************/ @@ -250,7 +250,6 @@ AcpiUtExecute_HID ( ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "_HID on %4.4s was not found\n", (char*)&DeviceNode->Name)); } - else { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "_HID on %4.4s failed %s\n", @@ -280,7 +279,6 @@ AcpiUtExecute_HID ( "Type returned from _HID not a number or string: %s(%X) \n", AcpiUtGetTypeName (ObjDesc->Common.Type), ObjDesc->Common.Type)); } - else { if (ObjDesc->Common.Type == ACPI_TYPE_INTEGER) @@ -289,7 +287,6 @@ AcpiUtExecute_HID ( AcpiExEisaIdToString ((UINT32) ObjDesc->Integer.Value, Hid->Buffer); } - else { /* Copy the String HID from the returned object */ @@ -298,6 +295,103 @@ AcpiUtExecute_HID ( } } + /* On exit, we must delete the return object */ + + AcpiUtRemoveReference (ObjDesc); + + return_ACPI_STATUS (Status); +} + + +/******************************************************************************* + * + * FUNCTION: AcpiUtExecute_CID + * + * PARAMETERS: DeviceNode - Node for the device + * *Cid - Where the CID is returned + * + * RETURN: Status + * + * DESCRIPTION: Executes the _CID control method that returns one or more + * compatible hardware IDs for the device. + * + * NOTE: Internal function, no parameter validation + * + ******************************************************************************/ + +ACPI_STATUS +AcpiUtExecute_CID ( + ACPI_NAMESPACE_NODE *DeviceNode, + ACPI_DEVICE_ID *Cid) +{ + ACPI_OPERAND_OBJECT *ObjDesc; + ACPI_STATUS Status; + + + FUNCTION_TRACE ("UtExecute_CID"); + + /* Execute the method */ + + Status = AcpiNsEvaluateRelative (DeviceNode, + METHOD_NAME__CID, NULL, &ObjDesc); + if (ACPI_FAILURE (Status)) + { + if (Status == AE_NOT_FOUND) + { + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "_CID on %4.4s was not found\n", + (char *)&DeviceNode->Name)); + } + else + { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "_CID on %4.4s failed %s\n", + (char *)&DeviceNode->Name, AcpiFormatException (Status))); + } + + return_ACPI_STATUS (Status); + } + + /* Did we get a return object? */ + + if (!ObjDesc) + { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "No object was returned from _CID\n")); + return_ACPI_STATUS (AE_TYPE); + } + + /* + * A _CID can return either a single compatible ID or a package of compatible + * IDs. Each compatible ID can be a Number (32 bit compressed EISA ID) or + * string (PCI ID format, e.g. "PCI\VEN_vvvv&DEV_dddd&SUBSYS_ssssssss"). + */ + switch (ObjDesc->Common.Type) + { + case ACPI_TYPE_INTEGER: + + /* Convert the Numeric CID to string */ + + AcpiExEisaIdToString ((UINT32) ObjDesc->Integer.Value, Cid->Buffer); + break; + + case ACPI_TYPE_STRING: + + /* Copy the String CID from the returned object */ + + STRNCPY(Cid->Buffer, ObjDesc->String.Pointer, sizeof(Cid->Buffer)); + break; + + case ACPI_TYPE_PACKAGE: + + /* TBD: Parse package elements; need different return struct, etc. */ + break; + + default: + + Status = AE_TYPE; + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, + "Type returned from _CID not a number, string, or package: %s(%X) \n", + AcpiUtGetTypeName (ObjDesc->Common.Type), ObjDesc->Common.Type)); + break; + } /* On exit, we must delete the return object */ @@ -346,7 +440,6 @@ AcpiUtExecute_UID ( ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "_UID on %4.4s was not found\n", (char*)&DeviceNode->Name)); } - else { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, @@ -377,7 +470,6 @@ AcpiUtExecute_UID ( "Type returned from _UID was not a number or string: %X \n", ObjDesc->Common.Type)); } - else { if (ObjDesc->Common.Type == ACPI_TYPE_INTEGER) @@ -386,7 +478,6 @@ AcpiUtExecute_UID ( AcpiExUnsignedIntegerToString (ObjDesc->Integer.Value, Uid->Buffer); } - else { /* Copy the String UID from the returned object */ @@ -472,7 +563,6 @@ AcpiUtExecute_STA ( "Type returned from _STA was not a number: %X \n", ObjDesc->Common.Type)); } - else { /* Extract the status flags */ diff --git a/sys/contrib/dev/acpica/utglobal.c b/sys/contrib/dev/acpica/utglobal.c index bb71d87ae880..453cd0226fd4 100644 --- a/sys/contrib/dev/acpica/utglobal.c +++ b/sys/contrib/dev/acpica/utglobal.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: utglobal - Global variables for the ACPI subsystem - * $Revision: 133 $ + * $Revision: 136 $ * *****************************************************************************/ @@ -234,10 +234,9 @@ BOOLEAN AcpiGbl_MethodExecuting = FALSE; /* System flags */ -UINT32 AcpiGbl_SystemFlags = 0; UINT32 AcpiGbl_StartupFlags = 0; -/* System starts unitialized! */ +/* System starts uninitialized */ BOOLEAN AcpiGbl_Shutdown = TRUE; @@ -324,7 +323,8 @@ const UINT8 AcpiGbl_NsProperties[] = NSP_NEWSCOPE, /* 32 Scope */ NSP_LOCAL, /* 33 DefAny */ NSP_NORMAL, /* 34 Extra */ - NSP_NORMAL /* 35 Invalid */ + NSP_NORMAL, /* 35 Data */ + NSP_NORMAL /* 36 Invalid */ }; @@ -469,7 +469,8 @@ static const NATIVE_CHAR *AcpiGbl_NsTypeNames[] = /* printable names of AC /* 32 */ "Scope", /* 33 */ "DefAny", /* 34 */ "Extra", - /* 35 */ "Invalid" + /* 35 */ "Data", + /* 36 */ "Invalid" }; @@ -501,7 +502,7 @@ AcpiUtGetTypeName ( /* Region type decoding */ -const NATIVE_CHAR *AcpiGbl_RegionTypes[NUM_REGION_TYPES] = +const NATIVE_CHAR *AcpiGbl_RegionTypes[ACPI_NUM_PREDEFINED_REGIONS] = { "SystemMemory", "SystemIO", @@ -530,12 +531,12 @@ AcpiUtGetRegionName ( UINT8 SpaceId) { - if (SpaceId >= USER_REGION_BEGIN) + if (SpaceId >= ACPI_USER_REGION_BEGIN) { return ("UserDefinedRegion"); } - else if (SpaceId >= NUM_REGION_TYPES) + else if (SpaceId >= ACPI_NUM_PREDEFINED_REGIONS) { return ("InvalidSpaceID"); } @@ -573,9 +574,8 @@ const NATIVE_CHAR *AcpiGbl_AccessTypes[NUM_ACCESS_TYPES] = "ByteAcc", "WordAcc", "DWordAcc", - "BlockAcc", - "SMBSendRecvAcc", - "SMBQuickAcc" + "QWordAcc", + "BufferAcc", }; @@ -739,15 +739,6 @@ AcpiUtInitGlobals ( AcpiGbl_AcpiTables[i].Count = 0; } - - /* Address Space handler array */ - - for (i = 0; i < ACPI_NUM_ADDRESS_SPACES; i++) - { - AcpiGbl_AddressSpaces[i].Handler = NULL; - AcpiGbl_AddressSpaces[i].Context = NULL; - } - /* Mutex locked flags */ for (i = 0; i < NUM_MTX; i++) @@ -777,8 +768,6 @@ AcpiUtInitGlobals ( /* Miscellaneous variables */ - AcpiGbl_SystemFlags = 0; - AcpiGbl_StartupFlags = 0; AcpiGbl_RsdpOriginalLocation = 0; AcpiGbl_CmSingleStep = FALSE; AcpiGbl_DbTerminateThreads = FALSE; diff --git a/sys/contrib/dev/acpica/utinit.c b/sys/contrib/dev/acpica/utinit.c index 35c9b4fce021..40a429438b04 100644 --- a/sys/contrib/dev/acpica/utinit.c +++ b/sys/contrib/dev/acpica/utinit.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: utinit - Common ACPI subsystem initialization - * $Revision: 102 $ + * $Revision: 103 $ * *****************************************************************************/ @@ -121,8 +121,6 @@ #include "achware.h" #include "acnamesp.h" #include "acevents.h" -#include "acparser.h" -#include "acdispat.h" #define _COMPONENT ACPI_UTILITIES MODULE_NAME ("utinit") @@ -322,7 +320,6 @@ AcpiUtSubsystemShutdown (void) AcpiGbl_Shutdown = TRUE; ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Shutting down ACPI Subsystem...\n")); - /* Close the Namespace */ AcpiNsTerminate (); @@ -335,17 +332,9 @@ AcpiUtSubsystemShutdown (void) AcpiUtTerminate (); - /* Flush the local cache(s) */ - - AcpiUtDeleteGenericStateCache (); - AcpiUtDeleteObjectCache (); - AcpiDsDeleteWalkStateCache (); - - /* Close the Parser */ - - /* TBD: [Restructure] AcpiPsTerminate () */ + /* Purge the local caches */ - AcpiPsDeleteParseCache (); + AcpiPurgeCachedObjects (); /* Debug only - display leftover memory allocation, if any */ diff --git a/sys/contrib/dev/acpica/utmath.c b/sys/contrib/dev/acpica/utmath.c index f7bf84e2f80f..1ac8cf439b25 100644 --- a/sys/contrib/dev/acpica/utmath.c +++ b/sys/contrib/dev/acpica/utmath.c @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: utmath - Integer math support routines - * $Revision: 7 $ + * $Revision: 8 $ * ******************************************************************************/ @@ -129,7 +129,7 @@ * library is not available. */ -#ifndef ACPI_USE_NATIVE_DIVIDE +#ifndef ACPI_USE_NATIVE_DIVIDE /******************************************************************************* * * FUNCTION: AcpiUtShortDivide @@ -175,9 +175,9 @@ AcpiUtShortDivide ( * 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, Dividend.Part.Hi, Divisor, Quotient.Part.Hi, Remainder32); - ACPI_DIV_64_BY_32 (Remainder32, Dividend.Part.Lo, Divisor, + ACPI_DIV_64_BY_32 (Remainder32, Dividend.Part.Lo, Divisor, Quotient.Part.Lo, Remainder32); /* Return only what was requested */ @@ -253,9 +253,9 @@ AcpiUtDivide ( * 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.Part.Lo, + ACPI_DIV_64_BY_32 (0, Dividend.Part.Hi, Divisor.Part.Lo, Quotient.Part.Hi, Partial1); - ACPI_DIV_64_BY_32 (Partial1, Dividend.Part.Lo, Divisor.Part.Lo, + ACPI_DIV_64_BY_32 (Partial1, Dividend.Part.Lo, Divisor.Part.Lo, Quotient.Part.Lo, Remainder.Part.Lo); } @@ -273,18 +273,18 @@ AcpiUtDivide ( do { - ACPI_SHIFT_RIGHT_64 (NormalizedDivisor.Part.Hi, + ACPI_SHIFT_RIGHT_64 (NormalizedDivisor.Part.Hi, NormalizedDivisor.Part.Lo); - ACPI_SHIFT_RIGHT_64 (NormalizedDividend.Part.Hi, + ACPI_SHIFT_RIGHT_64 (NormalizedDividend.Part.Hi, NormalizedDividend.Part.Lo); } while (NormalizedDivisor.Part.Hi != 0); /* Partial divide */ - ACPI_DIV_64_BY_32 (NormalizedDividend.Part.Hi, - NormalizedDividend.Part.Lo, - NormalizedDivisor.Part.Lo, + ACPI_DIV_64_BY_32 (NormalizedDividend.Part.Hi, + NormalizedDividend.Part.Lo, + NormalizedDivisor.Part.Lo, Quotient.Part.Lo, Partial1); /* @@ -351,8 +351,8 @@ AcpiUtDivide ( * DESCRIPTION: Native versions of the UtDivide functions. Use these if either * 1) The target is a 64-bit platform and therefore 64-bit * integer math is supported directly by the machine. - * 2) The target is a 32-bit or 16-bit platform, and the - * double-precision integer math library is available to + * 2) The target is a 32-bit or 16-bit platform, and the + * double-precision integer math library is available to * perform the divide. * ******************************************************************************/ diff --git a/sys/contrib/dev/acpica/utmisc.c b/sys/contrib/dev/acpica/utmisc.c index c4c99f24ff62..e0e1fa151cd5 100644 --- a/sys/contrib/dev/acpica/utmisc.c +++ b/sys/contrib/dev/acpica/utmisc.c @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: utmisc - common utility procedures - * $Revision: 52 $ + * $Revision: 56 $ * ******************************************************************************/ @@ -130,7 +130,6 @@ MODULE_NAME ("utmisc") - /******************************************************************************* * * FUNCTION: AcpiUtValidAcpiName @@ -749,6 +748,46 @@ AcpiUtCreateGenericState (void) /******************************************************************************* * + * FUNCTION: AcpiUtCreateThreadState + * + * PARAMETERS: None + * + * RETURN: Thread State + * + * DESCRIPTION: Create a "Thread State" - a flavor of the generic state used + * to track per-thread info during method execution + * + ******************************************************************************/ + +ACPI_THREAD_STATE * +AcpiUtCreateThreadState ( + void) +{ + ACPI_GENERIC_STATE *State; + + + FUNCTION_TRACE ("UtCreateThreadState"); + + + /* Create the generic state object */ + + State = AcpiUtCreateGenericState (); + if (!State) + { + return_PTR (NULL); + } + + /* Init fields specific to the update struct */ + + State->Common.DataType = ACPI_DESC_TYPE_STATE_THREAD; + State->Thread.ThreadId = AcpiOsGetThreadId (); + + return_PTR ((ACPI_THREAD_STATE *) State); +} + + +/******************************************************************************* + * * FUNCTION: AcpiUtCreateUpdateState * * PARAMETERS: Object - Initial Object to be installed in the @@ -779,7 +818,7 @@ AcpiUtCreateUpdateState ( State = AcpiUtCreateGenericState (); if (!State) { - return (NULL); + return_PTR (NULL); } /* Init fields specific to the update struct */ @@ -823,7 +862,7 @@ AcpiUtCreatePkgState ( State = AcpiUtCreateGenericState (); if (!State) { - return (NULL); + return_PTR (NULL); } /* Init fields specific to the update struct */ @@ -866,7 +905,7 @@ AcpiUtCreateControlState ( State = AcpiUtCreateGenericState (); if (!State) { - return (NULL); + return_PTR (NULL); } @@ -1077,7 +1116,7 @@ AcpiUtWalkPackageTree ( State->Pkg.SourceObject->Package.Elements[ThisIndex]; /* - * Check for + * Check for: * 1) An uninitialized package element. It is completely * legal to declare a package and leave it uninitialized * 2) Not an internal object - can be a namespace node instead @@ -1095,8 +1134,6 @@ AcpiUtWalkPackageTree ( State, Context); if (ACPI_FAILURE (Status)) { - /* TBD: must delete package created up to this point */ - return_ACPI_STATUS (Status); } @@ -1113,7 +1150,6 @@ AcpiUtWalkPackageTree ( AcpiUtDeleteGenericState (State); State = AcpiUtPopGenericState (&StateList); - /* Finished when there are no more states */ if (!State) @@ -1133,35 +1169,26 @@ AcpiUtWalkPackageTree ( State->Pkg.Index++; } } - else { - /* This is a sub-object of type package */ + /* This is a subobject of type package */ Status = WalkCallback (ACPI_COPY_TYPE_PACKAGE, ThisSourceObj, State, Context); if (ACPI_FAILURE (Status)) { - /* TBD: must delete package created up to this point */ - return_ACPI_STATUS (Status); } - - /* - * The callback above returned a new target package object. - */ - /* * Push the current state and create a new one + * The callback above returned a new target package object. */ AcpiUtPushGenericState (&StateList, State); State = AcpiUtCreatePkgState (ThisSourceObj, State->Pkg.ThisTargetObj, 0); if (!State) { - /* TBD: must delete package created up to this point */ - return_ACPI_STATUS (AE_NO_MEMORY); } } @@ -1169,7 +1196,7 @@ AcpiUtWalkPackageTree ( /* We should never get here */ - return (AE_AML_INTERNAL); + return_ACPI_STATUS (AE_AML_INTERNAL); } diff --git a/sys/contrib/dev/acpica/utobject.c b/sys/contrib/dev/acpica/utobject.c index 52979a37c34f..b8fa4ab08615 100644 --- a/sys/contrib/dev/acpica/utobject.c +++ b/sys/contrib/dev/acpica/utobject.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: utobject - ACPI object create/delete/size/cache routines - * $Revision: 57 $ + * $Revision: 61 $ * *****************************************************************************/ @@ -157,6 +157,7 @@ AcpiUtCreateInternalObjectDbg ( ACPI_OBJECT_TYPE8 Type) { ACPI_OPERAND_OBJECT *Object; + ACPI_OPERAND_OBJECT *SecondObject; FUNCTION_TRACE_STR ("UtCreateInternalObjectDbg", AcpiUtGetTypeName (Type)); @@ -167,11 +168,32 @@ AcpiUtCreateInternalObjectDbg ( Object = AcpiUtAllocateObjectDescDbg (ModuleName, LineNumber, ComponentId); if (!Object) { - /* Allocation failure */ - return_PTR (NULL); } + switch (Type) + { + case ACPI_TYPE_REGION: + case ACPI_TYPE_BUFFER_FIELD: + + /* These types require a secondary object */ + + SecondObject = AcpiUtAllocateObjectDescDbg (ModuleName, LineNumber, ComponentId); + if (!SecondObject) + { + AcpiUtDeleteObjectDesc (Object); + return_PTR (NULL); + } + + SecondObject->Common.Type = INTERNAL_TYPE_EXTRA; + SecondObject->Common.ReferenceCount = 1; + + /* Link the second object to the first */ + + Object->Common.NextObject = SecondObject; + break; + } + /* Save the object type in the object descriptor */ Object->Common.Type = Type; @@ -355,7 +377,6 @@ AcpiUtDeleteObjectCache ( } - /******************************************************************************* * * FUNCTION: AcpiUtGetSimpleObjectSize @@ -578,6 +599,10 @@ AcpiUtGetPackageObjectSize ( Status = AcpiUtWalkPackageTree (InternalObject, NULL, AcpiUtGetElementLength, &Info); + if (ACPI_FAILURE (Status)) + { + return_ACPI_STATUS (Status); + } /* * We have handled all of the objects in all levels of the package. diff --git a/sys/contrib/dev/acpica/utxface.c b/sys/contrib/dev/acpica/utxface.c index 67b18bfad30b..5400026d5fee 100644 --- a/sys/contrib/dev/acpica/utxface.c +++ b/sys/contrib/dev/acpica/utxface.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: utxface - External interfaces for "global" ACPI functions - * $Revision: 82 $ + * $Revision: 85 $ * *****************************************************************************/ @@ -125,6 +125,8 @@ #include "amlcode.h" #include "acdebug.h" #include "acexcep.h" +#include "acparser.h" +#include "acdispat.h" #define _COMPONENT ACPI_UTILITIES @@ -295,7 +297,6 @@ AcpiEnableSubsystem ( } } - /* * Initialize all device objects in the namespace * This runs the _STA and _INI methods. @@ -311,7 +312,6 @@ AcpiEnableSubsystem ( } } - /* * Initialize the objects that remain uninitialized. This * runs the executable AML that is part of the declaration of OpRegions @@ -328,8 +328,14 @@ AcpiEnableSubsystem ( } } - AcpiGbl_StartupFlags |= ACPI_INITIALIZED_OK; + /* + * Empty the caches (delete the cached objects) on the assumption that + * the table load filled them up more than they will be at runtime -- + * thus wasting non-paged memory. + */ + Status = AcpiPurgeCachedObjects (); + AcpiGbl_StartupFlags |= ACPI_INITIALIZED_OK; return_ACPI_STATUS (Status); } @@ -356,10 +362,6 @@ AcpiTerminate (void) DEBUGGER_EXEC(AcpiGbl_DbTerminateThreads = TRUE); - /* TBD: [Investigate] This is no longer needed?*/ -/* AcpiUtReleaseMutex (ACPI_MTX_DEBUG_CMD_READY); */ - - /* Shutdown and free all resources */ AcpiUtSubsystemShutdown (); @@ -474,7 +476,7 @@ AcpiGetSystemInfo ( /* System flags (ACPI capabilities) */ - InfoPtr->Flags = AcpiGbl_SystemFlags; + InfoPtr->Flags = SYS_MODE_ACPI; /* Timer resolution - 24 or 32 bits */ if (!AcpiGbl_FADT) @@ -512,3 +514,28 @@ AcpiGetSystemInfo ( } +/***************************************************************************** + * + * FUNCTION: AcpiPurgeCachedObjects + * + * PARAMETERS: None + * + * RETURN: Status + * + * DESCRIPTION: Empty all caches (delete the cached objects) + * + ****************************************************************************/ + +ACPI_STATUS +AcpiPurgeCachedObjects (void) +{ + FUNCTION_TRACE ("AcpiPurgeCachedObjects"); + + + AcpiUtDeleteGenericStateCache (); + AcpiUtDeleteObjectCache (); + AcpiDsDeleteWalkStateCache (); + AcpiPsDeleteParseCache (); + + return_ACPI_STATUS (AE_OK); +} |