diff options
Diffstat (limited to 'sys/contrib/dev/acpica/compiler')
-rw-r--r-- | sys/contrib/dev/acpica/compiler/aslanalyze.c | 153 | ||||
-rw-r--r-- | sys/contrib/dev/acpica/compiler/aslcodegen.c | 9 | ||||
-rw-r--r-- | sys/contrib/dev/acpica/compiler/aslcompiler.h | 7 | ||||
-rw-r--r-- | sys/contrib/dev/acpica/compiler/aslcompiler.l | 20 | ||||
-rw-r--r-- | sys/contrib/dev/acpica/compiler/aslcompiler.y | 281 | ||||
-rw-r--r-- | sys/contrib/dev/acpica/compiler/aslglobal.h | 3 | ||||
-rw-r--r-- | sys/contrib/dev/acpica/compiler/aslmain.c | 16 | ||||
-rw-r--r-- | sys/contrib/dev/acpica/compiler/aslmap.c | 58 | ||||
-rw-r--r-- | sys/contrib/dev/acpica/compiler/aslopcodes.c | 120 | ||||
-rw-r--r-- | sys/contrib/dev/acpica/compiler/aslopt.c | 20 | ||||
-rw-r--r-- | sys/contrib/dev/acpica/compiler/asltransform.c | 211 | ||||
-rw-r--r-- | sys/contrib/dev/acpica/compiler/asltypes.h | 17 |
12 files changed, 772 insertions, 143 deletions
diff --git a/sys/contrib/dev/acpica/compiler/aslanalyze.c b/sys/contrib/dev/acpica/compiler/aslanalyze.c index 9f5dd55..93bcca1 100644 --- a/sys/contrib/dev/acpica/compiler/aslanalyze.c +++ b/sys/contrib/dev/acpica/compiler/aslanalyze.c @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: aslanalyze.c - check for semantic errors - * $Revision: 80 $ + * $Revision: 84 $ * *****************************************************************************/ @@ -454,8 +454,9 @@ AnGetBtype ( if (!Node) { DbgPrint (ASL_DEBUG_OUTPUT, - "Null attached Nsnode: [%s] at line %d\n", - Op->Asl.ParseOpName, Op->Asl.LineNumber); + "No attached Nsnode: [%s] at line %d name [%s], ignoring typecheck\n", + Op->Asl.ParseOpName, Op->Asl.LineNumber, + Op->Asl.ExternalName); return ACPI_UINT32_MAX; } @@ -582,6 +583,13 @@ AnCheckForReservedName ( else if ((Op->Asl.ExternalName[1] == 'T') && (Op->Asl.ExternalName[2] == '_')) { + /* Ignore if actually emitted by the compiler */ + + if (Op->Asl.CompileFlags & NODE_COMPILER_EMITTED) + { + return (ACPI_NOT_RESERVED_NAME); + } + AslError (ASL_ERROR, ASL_MSG_RESERVED_WORD, Op, Op->Asl.ExternalName); return (ACPI_COMPILER_RESERVED_NAME); } @@ -683,6 +691,64 @@ AnCheckForReservedMethod ( } +UINT32 +AnMapObjTypeToBtype ( + ACPI_PARSE_OBJECT *Op) +{ + + switch (Op->Asl.ParseOpcode) + { + case PARSEOP_OBJECTTYPE_BFF: /* "BuffFieldObj" */ + return (ACPI_BTYPE_BUFFER_FIELD); + + case PARSEOP_OBJECTTYPE_BUF: /* "BuffObj" */ + return (ACPI_BTYPE_BUFFER); + + case PARSEOP_OBJECTTYPE_DDB: /* "DDBHandleObj" */ + return (ACPI_BTYPE_DDB_HANDLE); + + case PARSEOP_OBJECTTYPE_DEV: /* "DeviceObj" */ + return (ACPI_BTYPE_DEVICE); + + case PARSEOP_OBJECTTYPE_EVT: /* "EventObj" */ + return (ACPI_BTYPE_EVENT); + + case PARSEOP_OBJECTTYPE_FLD: /* "FieldUnitObj" */ + return (ACPI_BTYPE_FIELD_UNIT); + + case PARSEOP_OBJECTTYPE_INT: /* "IntObj" */ + return (ACPI_BTYPE_INTEGER); + + case PARSEOP_OBJECTTYPE_MTH: /* "MethodObj" */ + return (ACPI_BTYPE_METHOD); + + case PARSEOP_OBJECTTYPE_MTX: /* "MutexObj" */ + return (ACPI_BTYPE_MUTEX); + + case PARSEOP_OBJECTTYPE_OPR: /* "OpRegionObj" */ + return (ACPI_BTYPE_REGION); + + case PARSEOP_OBJECTTYPE_PKG: /* "PkgObj" */ + return (ACPI_BTYPE_PACKAGE); + + case PARSEOP_OBJECTTYPE_POW: /* "PowerResObj" */ + return (ACPI_BTYPE_POWER); + + case PARSEOP_OBJECTTYPE_STR: /* "StrObj" */ + return (ACPI_BTYPE_STRING); + + case PARSEOP_OBJECTTYPE_THZ: /* "ThermalZoneObj" */ + return (ACPI_BTYPE_THERMAL); + + case PARSEOP_OBJECTTYPE_UNK: /* "UnknownObj" */ + return (ACPI_BTYPE_OBJECTS_AND_REFS); + + default: + return (0); + } +} + + /******************************************************************************* * * FUNCTION: AnMethodAnalysisWalkBegin @@ -711,6 +777,10 @@ AnMethodAnalysisWalkBegin ( UINT32 i; char LocalName[] = "Local0"; char ArgName[] = "Arg0"; + ACPI_PARSE_OBJECT *ArgNode; + ACPI_PARSE_OBJECT *NextType; + ACPI_PARSE_OBJECT *NextParamType; + char ActualArgs = 0; ACPI_FUNCTION_NAME ("AnMethodAnalysisWalkBegin"); @@ -731,12 +801,76 @@ AnMethodAnalysisWalkBegin ( WalkInfo->MethodStack = MethodInfo; - /* Get the NumArguments node */ + /* Get the name node, ignored here */ Next = Op->Asl.Child; + + /* Get the NumArguments node */ + Next = Next->Asl.Next; MethodInfo->NumArguments = (UINT8) (((UINT8) Next->Asl.Value.Integer) & 0x07); + /* Get the SerializeRule and SyncLevel nodes, ignored here */ + + Next = Next->Asl.Next; + Next = Next->Asl.Next; + ArgNode = Next; + + /* Get the ReturnType node */ + + Next = Next->Asl.Next; + + NextType = Next->Asl.Child; + while (NextType) + { + /* Get and map each of the ReturnTypes */ + + MethodInfo->ValidReturnTypes |= AnMapObjTypeToBtype (NextType); + NextType->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG; + NextType = NextType->Asl.Next; + } + + /* Get the ParameterType node */ + + Next = Next->Asl.Next; + + NextType = Next->Asl.Child; + while (NextType) + { + if (NextType->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG) + { + NextParamType = NextType->Asl.Child; + while (NextParamType) + { + MethodInfo->ValidArgTypes[ActualArgs] |= AnMapObjTypeToBtype (NextParamType); + NextParamType->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG; + NextParamType = NextParamType->Asl.Next; + } + } + else + { + MethodInfo->ValidArgTypes[ActualArgs] = AnMapObjTypeToBtype (NextType); + NextType->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG; + } + + ActualArgs++; + NextType = NextType->Asl.Next; + } + + if ((MethodInfo->NumArguments) && + (MethodInfo->NumArguments != ActualArgs)) + { + /* error: Param list did not match number of args */ + } + + /* Allow numarguments == 0 for Function() */ + + if ((!MethodInfo->NumArguments) && (ActualArgs)) + { + MethodInfo->NumArguments = ActualArgs; + ArgNode->Asl.Value.Integer |= ActualArgs; + } + /* * Actual arguments are initialized at method entry. * All other ArgX "registers" can be used as locals, so we @@ -746,7 +880,6 @@ AnMethodAnalysisWalkBegin ( { MethodInfo->ArgInitialized[i] = TRUE; } - break; @@ -791,8 +924,11 @@ AnMethodAnalysisWalkBegin ( /* * Otherwise, this is a reference, check if the local * has been previously initialized. + * + * The only operator that accepts an uninitialized value is ObjectType() */ - else if (!MethodInfo->LocalInitialized[RegisterNumber]) + else if ((!MethodInfo->LocalInitialized[RegisterNumber]) && + (Op->Asl.Parent->Asl.ParseOpcode != PARSEOP_OBJECTTYPE)) { LocalName[strlen (LocalName) -1] = (char) (RegisterNumber + 0x30); AslError (ASL_ERROR, ASL_MSG_LOCAL_INIT, Op, LocalName); @@ -831,8 +967,11 @@ AnMethodAnalysisWalkBegin ( /* * Otherwise, this is a reference, check if the Arg * has been previously initialized. + * + * The only operator that accepts an uninitialized value is ObjectType() */ - else if (!MethodInfo->ArgInitialized[RegisterNumber]) + else if ((!MethodInfo->ArgInitialized[RegisterNumber]) && + (Op->Asl.Parent->Asl.ParseOpcode != PARSEOP_OBJECTTYPE)) { AslError (ASL_ERROR, ASL_MSG_ARG_INIT, Op, ArgName); } diff --git a/sys/contrib/dev/acpica/compiler/aslcodegen.c b/sys/contrib/dev/acpica/compiler/aslcodegen.c index fc5ddbd..6087bfb 100644 --- a/sys/contrib/dev/acpica/compiler/aslcodegen.c +++ b/sys/contrib/dev/acpica/compiler/aslcodegen.c @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: aslcodegen - AML code generation - * $Revision: 50 $ + * $Revision: 51 $ * *****************************************************************************/ @@ -445,6 +445,13 @@ CgWriteTableHeader ( Child = Child->Asl.Next; TableHeader.Revision = (UINT8) Child->Asl.Value.Integer; + /* Command-line Revision override */ + + if (Gbl_RevisionOverride) + { + TableHeader.Revision = Gbl_RevisionOverride; + } + /* OEMID */ Child = Child->Asl.Next; diff --git a/sys/contrib/dev/acpica/compiler/aslcompiler.h b/sys/contrib/dev/acpica/compiler/aslcompiler.h index 0172e47..3da39af 100644 --- a/sys/contrib/dev/acpica/compiler/aslcompiler.h +++ b/sys/contrib/dev/acpica/compiler/aslcompiler.h @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: aslcompiler.h - common include file - * $Revision: 129 $ + * $Revision: 130 $ * *****************************************************************************/ @@ -581,11 +581,6 @@ void TrDoDefinitionBlock ( ACPI_PARSE_OBJECT *Op); -void -TrDoElseif ( - ACPI_PARSE_OBJECT *Op); - - /* * asltree - parse tree support */ diff --git a/sys/contrib/dev/acpica/compiler/aslcompiler.l b/sys/contrib/dev/acpica/compiler/aslcompiler.l index c2b2581..dbef089 100644 --- a/sys/contrib/dev/acpica/compiler/aslcompiler.l +++ b/sys/contrib/dev/acpica/compiler/aslcompiler.l @@ -207,6 +207,7 @@ NamePathTail [.]{NameSeg} "Device" { count (2); return (PARSEOP_DEVICE); } "Event" { count (2); return (PARSEOP_EVENT); } "Field" { count (2); return (PARSEOP_FIELD); } +"Function" { count (2); return (PARSEOP_FUNCTION); } "IndexField" { count (2); return (PARSEOP_INDEXFIELD); } "Method" { count (2); return (PARSEOP_METHOD); } "Mutex" { count (2); return (PARSEOP_MUTEX); } @@ -279,6 +280,7 @@ NamePathTail [.]{NameSeg} "SizeOf" { count (3); return (PARSEOP_SIZEOF); } "Store" { count (3); return (PARSEOP_STORE); } "Subtract" { count (3); return (PARSEOP_SUBTRACT); } +"Timer" { count (3); return (PARSEOP_TIMER); } "ToBCD" { count (3); return (PARSEOP_TOBCD); } "ToBuffer" { count (3); return (PARSEOP_TOBUFFER); } "ToDecimalString" { count (3); return (PARSEOP_TODECIMALSTRING); } @@ -313,11 +315,16 @@ NamePathTail [.]{NameSeg} "EISAID" { count (1); return (PARSEOP_EISAID); } "ResourceTemplate" { count (1); return (PARSEOP_RESOURCETEMPLATE); } +"ToUUID" { count (1); return (PARSEOP_TOUUID); } "Unicode" { count (1); return (PARSEOP_UNICODE); } "DMA" { count (1); return (PARSEOP_DMA); } "DWordIO" { count (1); return (PARSEOP_DWORDIO); } "DWordMemory" { count (1); return (PARSEOP_DWORDMEMORY); } +"DWordSpace" { count (1); return (PARSEOP_DWORDSPACE); } "EndDependentFn" { count (1); return (PARSEOP_ENDDEPENDENTFN); } +"ExtendedIO" { count (1); return (PARSEOP_EXTENDEDIO); } +"ExtendedMemory" { count (1); return (PARSEOP_EXTENDEDMEMORY); } +"ExtendedSpace" { count (1); return (PARSEOP_EXTENDEDSPACE); } "FixedIO" { count (1); return (PARSEOP_FIXEDIO); } "Interrupt" { count (1); return (PARSEOP_INTERRUPT); } "IO" { count (1); return (PARSEOP_IO); } @@ -328,6 +335,7 @@ NamePathTail [.]{NameSeg} "Memory32" { count (1); return (PARSEOP_MEMORY32); } "QWordIO" { count (1); return (PARSEOP_QWORDIO); } "QWordMemory" { count (1); return (PARSEOP_QWORDMEMORY); } +"QWordSpace" { count (1); return (PARSEOP_QWORDSPACE); } "Register" { count (1); return (PARSEOP_REGISTER); } "StartDependentFn" { count (1); return (PARSEOP_STARTDEPENDENTFN); } "StartDependentFnNoPri" { count (1); return (PARSEOP_STARTDEPENDENTFN_NOPRI); } @@ -335,6 +343,7 @@ NamePathTail [.]{NameSeg} "VendorShort" { count (1); return (PARSEOP_VENDORSHORT); } "WordBusNumber" { count (1); return (PARSEOP_WORDBUSNUMBER); } "WordIO" { count (1); return (PARSEOP_WORDIO); } +"WordSpace" { count (1); return (PARSEOP_WORDSPACE); } "UnknownObj" { count (0); return (PARSEOP_OBJECTTYPE_UNK); } "IntObj" { count (0); return (PARSEOP_OBJECTTYPE_INT); } @@ -886,14 +895,9 @@ comment2 (void) if (c == EOF) { - /* - * Premature End-Of-File - */ - AslCommonError (ASL_ERROR, ASL_MSG_EARLY_EOF, - Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, - Gbl_CurrentLineOffset, Gbl_CurrentColumn, - Gbl_Files[ASL_FILE_INPUT].Filename, NULL); - return (FALSE); + /* End of file is OK, change to newline. Let parser detect EOF later */ + + c = '\n'; } InsertLineBuffer (c); diff --git a/sys/contrib/dev/acpica/compiler/aslcompiler.y b/sys/contrib/dev/acpica/compiler/aslcompiler.y index a3cbf5a..dec6d33 100644 --- a/sys/contrib/dev/acpica/compiler/aslcompiler.y +++ b/sys/contrib/dev/acpica/compiler/aslcompiler.y @@ -250,12 +250,16 @@ AslLocalAllocate (unsigned int Size); %token <i> PARSEOP_DWORDCONST %token <i> PARSEOP_DWORDIO %token <i> PARSEOP_DWORDMEMORY +%token <i> PARSEOP_DWORDSPACE %token <i> PARSEOP_EISAID %token <i> PARSEOP_ELSE %token <i> PARSEOP_ELSEIF %token <i> PARSEOP_ENDDEPENDENTFN %token <i> PARSEOP_ERRORNODE %token <i> PARSEOP_EVENT +%token <i> PARSEOP_EXTENDEDIO +%token <i> PARSEOP_EXTENDEDMEMORY +%token <i> PARSEOP_EXTENDEDSPACE %token <i> PARSEOP_EXTERNAL %token <i> PARSEOP_FATAL %token <i> PARSEOP_FIELD @@ -263,6 +267,7 @@ AslLocalAllocate (unsigned int Size); %token <i> PARSEOP_FINDSETRIGHTBIT %token <i> PARSEOP_FIXEDIO %token <i> PARSEOP_FROMBCD +%token <i> PARSEOP_FUNCTION %token <i> PARSEOP_IF %token <i> PARSEOP_INCLUDE %token <i> PARSEOP_INCLUDE_CSTYLE @@ -363,6 +368,7 @@ AslLocalAllocate (unsigned int Size); %token <i> PARSEOP_QWORDCONST %token <i> PARSEOP_QWORDIO %token <i> PARSEOP_QWORDMEMORY +%token <i> PARSEOP_QWORDSPACE %token <i> PARSEOP_RANGETYPE_ENTIRE %token <i> PARSEOP_RANGETYPE_ISAONLY %token <i> PARSEOP_RANGETYPE_NONISAONLY @@ -404,12 +410,14 @@ AslLocalAllocate (unsigned int Size); %token <i> PARSEOP_SUBTRACT %token <i> PARSEOP_SWITCH %token <i> PARSEOP_THERMALZONE +%token <i> PARSEOP_TIMER %token <i> PARSEOP_TOBCD %token <i> PARSEOP_TOBUFFER %token <i> PARSEOP_TODECIMALSTRING %token <i> PARSEOP_TOHEXSTRING %token <i> PARSEOP_TOINTEGER %token <i> PARSEOP_TOSTRING +%token <i> PARSEOP_TOUUID %token <i> PARSEOP_TRANSLATIONTYPE_DENSE %token <i> PARSEOP_TRANSLATIONTYPE_SPARSE %token <i> PARSEOP_TYPE_STATIC @@ -427,6 +435,7 @@ AslLocalAllocate (unsigned int Size); %token <i> PARSEOP_WORDBUSNUMBER %token <i> PARSEOP_WORDCONST %token <i> PARSEOP_WORDIO +%token <i> PARSEOP_WORDSPACE %token <i> PARSEOP_XFERTYPE_8 %token <i> PARSEOP_XFERTYPE_8_16 %token <i> PARSEOP_XFERTYPE_16 @@ -460,6 +469,10 @@ AslLocalAllocate (unsigned int Size); %type <n> RequiredTarget %type <n> SimpleTarget %type <n> BufferTermData +%type <n> ParameterTypePackage +%type <n> ParameterTypePackageList +%type <n> ParameterTypesPackage +%type <n> ParameterTypesPackageList %type <n> Type1Opcode %type <n> Type2Opcode @@ -502,6 +515,7 @@ AslLocalAllocate (unsigned int Size); %type <n> DeviceTerm %type <n> EventTerm %type <n> FieldTerm +%type <n> FunctionTerm %type <n> IndexFieldTerm %type <n> MethodTerm %type <n> MutexTerm @@ -586,6 +600,7 @@ AslLocalAllocate (unsigned int Size); %type <n> SizeOfTerm %type <n> StoreTerm %type <n> SubtractTerm +%type <n> TimerTerm %type <n> ToBCDTerm %type <n> ToBufferTerm %type <n> ToDecimalStringTerm @@ -671,9 +686,11 @@ AslLocalAllocate (unsigned int Size); %type <n> VarPackageLengthTerm +/* Macros */ %type <n> EISAIDTerm %type <n> ResourceTemplateTerm +%type <n> ToUUIDTerm %type <n> UnicodeTerm %type <n> ResourceMacroList %type <n> ResourceMacroTerm @@ -681,7 +698,11 @@ AslLocalAllocate (unsigned int Size); %type <n> DMATerm %type <n> DWordIOTerm %type <n> DWordMemoryTerm +%type <n> DWordSpaceTerm %type <n> EndDependentFnTerm +%type <n> ExtendedIOTerm +%type <n> ExtendedMemoryTerm +%type <n> ExtendedSpaceTerm %type <n> FixedIOTerm %type <n> InterruptTerm %type <n> IOTerm @@ -692,6 +713,7 @@ AslLocalAllocate (unsigned int Size); %type <n> Memory32Term %type <n> QWordIOTerm %type <n> QWordMemoryTerm +%type <n> QWordSpaceTerm %type <n> RegisterTerm %type <n> StartDependentFnTerm %type <n> StartDependentFnNoPriTerm @@ -699,6 +721,7 @@ AslLocalAllocate (unsigned int Size); %type <n> VendorShortTerm %type <n> WordBusNumberTerm %type <n> WordIOTerm +%type <n> WordSpaceTerm %type <n> NameString %type <n> NameSeg @@ -710,8 +733,10 @@ AslLocalAllocate (unsigned int Size); %type <n> AmlPackageLengthTerm %type <n> OptionalByteConstExpr %type <n> OptionalDWordConstExpr +%type <n> OptionalQWordConstExpr %type <n> OptionalSerializeRuleKeyword %type <n> OptionalResourceType_First +%type <n> OptionalResourceType %type <n> OptionalMinType %type <n> OptionalMaxType %type <n> OptionalMemType @@ -728,6 +753,8 @@ AslLocalAllocate (unsigned int Size); %type <n> OptionalNameString_Last %type <n> OptionalAddressRange %type <n> OptionalObjectTypeKeyword +%type <n> OptionalParameterTypePackage +%type <n> OptionalParameterTypesPackage %type <n> OptionalReference @@ -769,9 +796,12 @@ DefinitionBlockTerm '{' ObjectList '}' {$$ = TrLinkChildren ($<n>3,7,$4,$6,$8,$10,$12,$14,$18);} ; +/* ACPI 3.0 -- allow semicolons between terms */ + TermList : {$$ = NULL;} | Term TermList {$$ = TrLinkPeerNode (TrSetNodeFlags ($1, NODE_RESULT_NOT_USED),$2);} + | Term ';' TermList {$$ = TrLinkPeerNode (TrSetNodeFlags ($1, NODE_RESULT_NOT_USED),$3);} ; Term @@ -846,6 +876,7 @@ NamedObject | DeviceTerm {} | EventTerm {} | FieldTerm {} + | FunctionTerm {} | IndexFieldTerm {} | MethodTerm {} | MutexTerm {} @@ -905,6 +936,52 @@ SimpleTarget | ArgTerm {} ; +/* Rules for specifying the Return type for control methods */ + +ParameterTypePackageList + : {$$ = NULL;} + | ObjectTypeKeyword {$$ = $1;} + | ObjectTypeKeyword ',' + ParameterTypePackageList {$$ = TrLinkPeerNodes (2,$1,$3);} + ; + +ParameterTypePackage + : {$$ = NULL;} + | ObjectTypeKeyword {$$ = $1;} + | '{' + ParameterTypePackageList + '}' {$$ = $2;} + ; + +OptionalParameterTypePackage + : {$$ = TrCreateLeafNode (PARSEOP_DEFAULT_ARG);} + | ',' {$$ = TrCreateLeafNode (PARSEOP_DEFAULT_ARG);} + | ',' ParameterTypePackage {$$ = TrLinkChildren (TrCreateLeafNode (PARSEOP_DEFAULT_ARG),1,$2);} + ; + +/* Rules for specifying the Argument types for control methods */ + +ParameterTypesPackageList + : {$$ = NULL;} + | ObjectTypeKeyword {$$ = $1;} + | ObjectTypeKeyword ',' + ParameterTypesPackage {$$ = TrLinkPeerNodes (2,$1,$3);} + ; + +ParameterTypesPackage + : {$$ = NULL;} + | ObjectTypeKeyword {$$ = $1;} + | '{' + ParameterTypesPackageList + '}' {$$ = TrLinkChildren (TrCreateLeafNode (PARSEOP_DEFAULT_ARG),1,$2);} + ; + +OptionalParameterTypesPackage + : {$$ = TrCreateLeafNode (PARSEOP_DEFAULT_ARG);} + | ',' {$$ = TrCreateLeafNode (PARSEOP_DEFAULT_ARG);} + | ',' ParameterTypesPackage {$$ = $2;} + ; + /* Opcode types */ @@ -937,12 +1014,13 @@ Type2Opcode | RefOfTerm {} | SizeOfTerm {} | StoreTerm {} + | TimerTerm {} | WaitTerm {} | UserTerm {} ; /* - * A type 2 opcode evaluates to an Integer and cannot have a destination operand + * Type 3/4/5 opcodes */ Type2IntegerOpcode /* "Type3" opcodes */ @@ -980,7 +1058,6 @@ Type2IntegerOpcode /* "Type3" opcodes */ | XOrTerm {} ; - Type2StringOpcode /* "Type4" Opcodes */ : ToDecimalStringTerm {} | ToHexStringTerm {} @@ -1019,6 +1096,7 @@ Type4Opcode Type5Opcode : ResourceTemplateTerm {} | UnicodeTerm {} + | ToUUIDTerm {} ; Type6Opcode @@ -1053,7 +1131,9 @@ ExternalTerm : PARSEOP_EXTERNAL '(' NameString OptionalObjectTypeKeyword - ')' {$$ = TrCreateNode (PARSEOP_EXTERNAL,2,$3,$4);} + OptionalParameterTypePackage + OptionalParameterTypesPackage + ')' {$$ = TrCreateNode (PARSEOP_EXTERNAL,4,$3,$4,$5,$6);} | PARSEOP_EXTERNAL '(' error ')' {$$ = AslDoError(); yyclearin;} ; @@ -1219,6 +1299,20 @@ FieldTerm error ')' {$$ = AslDoError(); yyclearin;} ; +FunctionTerm + : PARSEOP_FUNCTION '(' {$$ = TrCreateLeafNode (PARSEOP_METHOD);} + NameString + OptionalParameterTypePackage + OptionalParameterTypesPackage + ')' '{' + TermList '}' {$$ = TrLinkChildren ($<n>3,7,TrSetNodeFlags ($4, NODE_IS_NAME_DECLARATION), + TrCreateValuedLeafNode (PARSEOP_BYTECONST, 0), + TrCreateLeafNode (PARSEOP_SERIALIZERULE_NOTSERIAL), + TrCreateValuedLeafNode (PARSEOP_BYTECONST, 0),$5,$6,$9);} + | PARSEOP_FUNCTION '(' + error ')' {$$ = AslDoError(); yyclearin;} + ; + IndexFieldTerm : PARSEOP_INDEXFIELD '(' {$$ = TrCreateLeafNode (PARSEOP_INDEXFIELD);} NameString @@ -1238,8 +1332,10 @@ MethodTerm OptionalByteConstExpr {$$ = UtCheckIntegerRange ($5, 0, 7);} OptionalSerializeRuleKeyword OptionalByteConstExpr + OptionalParameterTypePackage + OptionalParameterTypesPackage ')' '{' - TermList '}' {$$ = TrLinkChildren ($<n>3,5,TrSetNodeFlags ($4, NODE_IS_NAME_DECLARATION),$5,$7,$8,$11);} + TermList '}' {$$ = TrLinkChildren ($<n>3,7,TrSetNodeFlags ($4, NODE_IS_NAME_DECLARATION),$5,$7,$8,$9,$10,$13);} | PARSEOP_METHOD '(' error ')' {$$ = AslDoError(); yyclearin;} ; @@ -1377,13 +1473,15 @@ ElseTerm | PARSEOP_ELSE '{' {$$ = TrCreateLeafNode (PARSEOP_ELSE);} TermList '}' {$$ = TrLinkChildren ($<n>3,1,$4);} + | PARSEOP_ELSE '{' + error '}' {$$ = AslDoError(); yyclearin;} - | PARSEOP_ELSEIF '(' {$$ = TrCreateLeafNode (PARSEOP_ELSEIF);} - TermArg + | PARSEOP_ELSEIF '(' {$$ = TrCreateLeafNode (PARSEOP_ELSE);} + TermArg {$$ = TrCreateLeafNode (PARSEOP_IF);} ')' '{' - TermList '}' - ElseTerm {$$ = TrLinkChildren ($<n>3,3,$4,$7,$9);} - + TermList '}' {$$ = TrLinkChildren ($<n>5,2,$4,$8);} + ElseTerm {$$ = TrLinkPeerNode ($<n>5,$11);} + {$$ = TrLinkChildren ($<n>3,1,$<n>5);} | PARSEOP_ELSEIF '(' error ')' {$$ = AslDoError(); yyclearin;} ; @@ -1430,6 +1528,7 @@ ReturnTerm : PARSEOP_RETURN '(' {$$ = TrCreateLeafNode (PARSEOP_RETURN);} OptionalTermArg ')' {$$ = TrLinkChildren ($<n>3,1,$4);} + | PARSEOP_RETURN {$$ = TrLinkChildren (TrCreateLeafNode (PARSEOP_RETURN),0);} | PARSEOP_RETURN '(' error ')' {$$ = AslDoError(); yyclearin;} ; @@ -1496,8 +1595,8 @@ CaseTerm DefaultTerm : PARSEOP_DEFAULT '{' {$$ = TrCreateLeafNode (PARSEOP_DEFAULT);} TermList '}' {$$ = TrLinkChildren ($<n>3,1,$4);} - | PARSEOP_DEFAULT '(' - error ')' {$$ = AslDoError(); yyclearin;} + | PARSEOP_DEFAULT '{' + error '}' {$$ = AslDoError(); yyclearin;} ; UnloadTerm @@ -1902,6 +2001,14 @@ SubtractTerm error ')' {$$ = AslDoError(); yyclearin;} ; +TimerTerm + : PARSEOP_TIMER '(' {$$ = TrCreateLeafNode (PARSEOP_TIMER);} + ')' {$$ = TrLinkChildren ($<n>3,0);} + | PARSEOP_TIMER {$$ = TrLinkChildren (TrCreateLeafNode (PARSEOP_TIMER),0);} + | PARSEOP_TIMER '(' + error ')' {$$ = AslDoError(); yyclearin;} + ; + ToBCDTerm : PARSEOP_TOBCD '(' {$$ = TrCreateLeafNode (PARSEOP_TOBCD);} TermArg @@ -1957,6 +2064,13 @@ ToStringTerm error ')' {$$ = AslDoError(); yyclearin;} ; +ToUUIDTerm + : PARSEOP_TOUUID '(' + StringData ')' {$$ = TrUpdateNode (PARSEOP_TOUUID, $3);} + | PARSEOP_TOUUID '(' + error ')' {$$ = AslDoError(); yyclearin;} + ; + WaitTerm : PARSEOP_WAIT '(' {$$ = TrCreateLeafNode (PARSEOP_WAIT);} SuperName @@ -2381,7 +2495,11 @@ ResourceMacroTerm : DMATerm {} | DWordIOTerm {} | DWordMemoryTerm {} + | DWordSpaceTerm {} | EndDependentFnTerm {} + | ExtendedIOTerm {} + | ExtendedMemoryTerm {} + | ExtendedSpaceTerm {} | FixedIOTerm {} | InterruptTerm {} | IOTerm {} @@ -2392,6 +2510,7 @@ ResourceMacroTerm | Memory32Term {} | QWordIOTerm {} | QWordMemoryTerm {} + | QWordSpaceTerm {} | RegisterTerm {} | StartDependentFnTerm {} | StartDependentFnNoPriTerm {} @@ -2399,6 +2518,7 @@ ResourceMacroTerm | VendorShortTerm {} | WordBusNumberTerm {} | WordIOTerm {} + | WordSpaceTerm {} ; DMATerm @@ -2458,6 +2578,28 @@ DWordMemoryTerm error ')' {$$ = AslDoError(); yyclearin;} ; +DWordSpaceTerm + : PARSEOP_DWORDSPACE '(' {$$ = TrCreateLeafNode (PARSEOP_DWORDSPACE);} + ByteConstExpr {$$ = UtCheckIntegerRange ($4, 0xC0, 0xFF);} + OptionalResourceType + OptionalDecodeType + OptionalMinType + OptionalMaxType + ',' ByteConstExpr + ',' DWordConstExpr + ',' DWordConstExpr + ',' DWordConstExpr + ',' DWordConstExpr + ',' DWordConstExpr + OptionalByteConstExpr + OptionalStringData + OptionalNameString_Last + ')' {$$ = TrLinkChildren ($<n>3,14,$4,$6,$7,$8,$9,$11,$13,$15,$17,$19,$21,$22,$23,$24);} + | PARSEOP_DWORDSPACE '(' + error ')' {$$ = AslDoError(); yyclearin;} + ; + + EndDependentFnTerm : PARSEOP_ENDDEPENDENTFN '(' ')' {$$ = TrCreateLeafNode (PARSEOP_ENDDEPENDENTFN);} @@ -2465,6 +2607,69 @@ EndDependentFnTerm error ')' {$$ = AslDoError(); yyclearin;} ; +ExtendedIOTerm + : PARSEOP_EXTENDEDIO '(' {$$ = TrCreateLeafNode (PARSEOP_EXTENDEDIO);} + OptionalResourceType_First + OptionalMinType + OptionalMaxType + OptionalDecodeType + OptionalRangeType + ',' QWordConstExpr + ',' QWordConstExpr + ',' QWordConstExpr + ',' QWordConstExpr + ',' QWordConstExpr + OptionalQWordConstExpr + OptionalNameString + OptionalType + OptionalTranslationType_Last + ')' {$$ = TrLinkChildren ($<n>3,14,$4,$5,$6,$7,$8,$10,$12,$14,$16,$18,$19,$20,$21,$22);} + | PARSEOP_EXTENDEDIO '(' + error ')' {$$ = AslDoError(); yyclearin;} + ; + +ExtendedMemoryTerm + : PARSEOP_EXTENDEDMEMORY '(' {$$ = TrCreateLeafNode (PARSEOP_EXTENDEDMEMORY);} + OptionalResourceType_First + OptionalDecodeType + OptionalMinType + OptionalMaxType + OptionalMemType + ',' ReadWriteKeyword + ',' QWordConstExpr + ',' QWordConstExpr + ',' QWordConstExpr + ',' QWordConstExpr + ',' QWordConstExpr + OptionalQWordConstExpr + OptionalNameString + OptionalAddressRange + OptionalType_Last + ')' {$$ = TrLinkChildren ($<n>3,15,$4,$5,$6,$7,$8,$10,$12,$14,$16,$18,$20,$21,$22,$23,$24);} + | PARSEOP_EXTENDEDMEMORY '(' + error ')' {$$ = AslDoError(); yyclearin;} + ; + +ExtendedSpaceTerm + : PARSEOP_EXTENDEDSPACE '(' {$$ = TrCreateLeafNode (PARSEOP_EXTENDEDSPACE);} + ByteConstExpr {$$ = UtCheckIntegerRange ($4, 0xC0, 0xFF);} + OptionalResourceType + OptionalDecodeType + OptionalMinType + OptionalMaxType + ',' ByteConstExpr + ',' QWordConstExpr + ',' QWordConstExpr + ',' QWordConstExpr + ',' QWordConstExpr + ',' QWordConstExpr + OptionalQWordConstExpr + OptionalNameString_Last + ')' {$$ = TrLinkChildren ($<n>3,13,$4,$6,$7,$8,$9,$11,$13,$15,$17,$19,$21,$22,$23);} + | PARSEOP_EXTENDEDSPACE '(' + error ')' {$$ = AslDoError(); yyclearin;} + ; + FixedIOTerm : PARSEOP_FIXEDIO '(' {$$ = TrCreateLeafNode (PARSEOP_FIXEDIO);} WordConstExpr @@ -2606,6 +2811,27 @@ QWordMemoryTerm error ')' {$$ = AslDoError(); yyclearin;} ; +QWordSpaceTerm + : PARSEOP_QWORDSPACE '(' {$$ = TrCreateLeafNode (PARSEOP_QWORDSPACE);} + ByteConstExpr {$$ = UtCheckIntegerRange ($4, 0xC0, 0xFF);} + OptionalResourceType + OptionalDecodeType + OptionalMinType + OptionalMaxType + ',' ByteConstExpr + ',' QWordConstExpr + ',' QWordConstExpr + ',' QWordConstExpr + ',' QWordConstExpr + ',' QWordConstExpr + OptionalByteConstExpr + OptionalStringData + OptionalNameString_Last + ')' {$$ = TrLinkChildren ($<n>3,14,$4,$6,$7,$8,$9,$11,$13,$15,$17,$19,$21,$22,$23,$24);} + | PARSEOP_QWORDSPACE '(' + error ')' {$$ = AslDoError(); yyclearin;} + ; + RegisterTerm : PARSEOP_REGISTER '(' {$$ = TrCreateLeafNode (PARSEOP_REGISTER);} AddressSpaceKeyword @@ -2694,6 +2920,27 @@ WordIOTerm error ')' {$$ = AslDoError(); yyclearin;} ; +WordSpaceTerm + : PARSEOP_WORDSPACE '(' {$$ = TrCreateLeafNode (PARSEOP_WORDSPACE);} + ByteConstExpr {$$ = UtCheckIntegerRange ($4, 0xC0, 0xFF);} + OptionalResourceType + OptionalDecodeType + OptionalMinType + OptionalMaxType + ',' ByteConstExpr + ',' WordConstExpr + ',' WordConstExpr + ',' WordConstExpr + ',' WordConstExpr + ',' WordConstExpr + OptionalByteConstExpr + OptionalStringData + OptionalNameString_Last + ')' {$$ = TrLinkChildren ($<n>3,14,$4,$6,$7,$8,$9,$11,$13,$15,$17,$19,$21,$22,$23,$24);} + | PARSEOP_WORDSPACE '(' + error ')' {$$ = AslDoError(); yyclearin;} + ; + /******* Object References ***********************************************/ @@ -2788,6 +3035,12 @@ OptionalObjectTypeKeyword | ',' ObjectTypeKeyword {$$ = $2;} ; +OptionalQWordConstExpr + : {$$ = NULL;} + | ',' {$$ = NULL;} + | ',' QWordConstExpr {$$ = $2;} + ; + OptionalRangeType : ',' {$$ = NULL;} | ',' RangeTypeKeyword {$$ = $2;} @@ -2805,6 +3058,12 @@ OptionalResourceType_First | ResourceTypeKeyword {$$ = $1;} ; +OptionalResourceType + : {$$ = NULL;} + | ',' {$$ = NULL;} + | ',' ResourceTypeKeyword {$$ = $2;} + ; + OptionalSerializeRuleKeyword : {$$ = NULL;} | ',' {$$ = NULL;} diff --git a/sys/contrib/dev/acpica/compiler/aslglobal.h b/sys/contrib/dev/acpica/compiler/aslglobal.h index 199178f..6dfe3cb 100644 --- a/sys/contrib/dev/acpica/compiler/aslglobal.h +++ b/sys/contrib/dev/acpica/compiler/aslglobal.h @@ -3,7 +3,7 @@ /****************************************************************************** * * Module Name: aslglobal.h - Global variable definitions - * $Revision: 43 $ + * $Revision: 44 $ * *****************************************************************************/ @@ -225,6 +225,7 @@ ASL_EXTERN UINT32 ASL_INIT_GLOBAL (TotalFolds, 0); /* Misc */ +ASL_EXTERN UINT8 ASL_INIT_GLOBAL (Gbl_RevisionOverride, 0); ASL_EXTERN ACPI_PARSE_OBJECT ASL_INIT_GLOBAL (*RootNode, NULL); ASL_EXTERN UINT32 ASL_INIT_GLOBAL (Gbl_TableLength, 0); ASL_EXTERN UINT32 ASL_INIT_GLOBAL (Gbl_SourceLine, 0); diff --git a/sys/contrib/dev/acpica/compiler/aslmain.c b/sys/contrib/dev/acpica/compiler/aslmain.c index 203a6e7..8d82026 100644 --- a/sys/contrib/dev/acpica/compiler/aslmain.c +++ b/sys/contrib/dev/acpica/compiler/aslmain.c @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: aslmain - compiler main and utilities - * $Revision: 76 $ + * $Revision: 77 $ * *****************************************************************************/ @@ -161,16 +161,17 @@ Options ( printf (" -vr Disable remarks\n"); printf (" -vs Disable signon\n"); - printf ("\nAML Output:\n"); + printf ("\nAML Output Files:\n"); printf (" -s<a|c> Create AML in assembler or C source file (*.asm or *.c)\n"); printf (" -i<a|c> Create assembler or C include file (*.inc or *.h)\n"); printf (" -t<a|c> Create AML in assembler or C hex table (*.hex)\n"); - printf ("\nAML Optimization:\n"); + printf ("\nAML Code Generation:\n"); printf (" -oa Disable all optimizations (compatibility mode)\n"); printf (" -of Disable constant folding\n"); printf (" -oi Disable integer optimization to Zero/One/Ones\n"); printf (" -on Disable named reference string optimization\n"); + printf (" -r<Revision> Override table header Revision (1-255)\n"); printf ("\nListings:\n"); printf (" -l Create mixed listing file (ASL source and AML) (*.lst)\n"); @@ -321,8 +322,13 @@ AslCommandLine ( /* Get the command line options */ - while ((j = AcpiGetopt (argc, argv, "b:cd^efgh^i^l^o:p:rs:t:v:x:")) != EOF) switch (j) + while ((j = AcpiGetopt (argc, argv, "ab:cd^efgh^i^l^o:p:r:s:t:v:x:")) != EOF) switch (j) { + case 'a': + AslToFile = FALSE; + break; + + case 'b': switch (AcpiGbl_Optarg[0]) @@ -544,7 +550,7 @@ AslCommandLine ( case 'r': - AslToFile = FALSE; + Gbl_RevisionOverride = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0); break; diff --git a/sys/contrib/dev/acpica/compiler/aslmap.c b/sys/contrib/dev/acpica/compiler/aslmap.c index d631dd4..b0927f6 100644 --- a/sys/contrib/dev/acpica/compiler/aslmap.c +++ b/sys/contrib/dev/acpica/compiler/aslmap.c @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: aslmap - parser to AML opcode mapping table - * $Revision: 71 $ + * $Revision: 76 $ * *****************************************************************************/ @@ -209,7 +209,12 @@ const ASL_RESERVED_INFO ReservedMethods[] = { {"_AL7", 0, ASL_RSVD_RETURN_VALUE}, {"_AL8", 0, ASL_RSVD_RETURN_VALUE}, {"_AL9", 0, ASL_RSVD_RETURN_VALUE}, + {"_ALC", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ + {"_ALI", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ {"_ALN", 0, ASL_RSVD_RESOURCE_NAME}, + {"_ALP", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ + {"_ALR", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ + {"_ALT", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ {"_ASI", 0, ASL_RSVD_RESOURCE_NAME}, {"_BAS", 0, ASL_RSVD_RESOURCE_NAME}, {"_BBN", 0, ASL_RSVD_RETURN_VALUE}, @@ -218,12 +223,19 @@ const ASL_RESERVED_INFO ReservedMethods[] = { {"_BDN", 0, ASL_RSVD_RETURN_VALUE}, {"_BFS", 1, 0}, {"_BIF", 0, ASL_RSVD_RETURN_VALUE}, + {"_BLT", 3, 0}, /* Acpi 3.0 */ {"_BM_", 0, ASL_RSVD_RESOURCE_NAME}, + {"_BMC", 1, 0}, /* Acpi 3.0 */ + {"_BMD", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ + {"_BQC", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ {"_BST", 0, ASL_RSVD_RETURN_VALUE}, + {"_BTM", 1, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ {"_BTP", 1, 0}, + {"_CBA", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ {"_CID", 0, ASL_RSVD_RETURN_VALUE}, {"_CRS", 0, ASL_RSVD_RETURN_VALUE}, {"_CRT", 0, ASL_RSVD_RETURN_VALUE}, + {"_CSD", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ {"_CST", 0, ASL_RSVD_RETURN_VALUE}, {"_DCK", 1, ASL_RSVD_RETURN_VALUE}, {"_DCS", 0, ASL_RSVD_RETURN_VALUE}, @@ -235,7 +247,9 @@ const ASL_RESERVED_INFO ReservedMethods[] = { {"_DMA", 0, ASL_RSVD_RETURN_VALUE}, {"_DOD", 0, ASL_RSVD_RETURN_VALUE}, {"_DOS", 1, 0}, + {"_DSM", 4, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ {"_DSS", 1, 0}, + {"_DSW", 3, 0}, /* Acpi 3.0 */ {"_EC_", 0, ASL_RSVD_RETURN_VALUE}, {"_EDL", 0, ASL_RSVD_RETURN_VALUE}, {"_EJ0", 1, 0}, @@ -244,6 +258,7 @@ const ASL_RESERVED_INFO ReservedMethods[] = { {"_EJ3", 1, 0}, {"_EJ4", 1, 0}, {"_EJD", 0, ASL_RSVD_RETURN_VALUE}, + {"_ERR", 2, ASL_RSVD_RETURN_VALUE}, {"_FDE", 0, ASL_RSVD_RETURN_VALUE}, {"_FDI", 0, ASL_RSVD_RETURN_VALUE}, {"_FDM", 1, 0}, @@ -253,6 +268,7 @@ const ASL_RESERVED_INFO ReservedMethods[] = { {"_GPD", 0, ASL_RSVD_RETURN_VALUE}, {"_GPE", 0, ASL_RSVD_RETURN_VALUE}, {"_GRA", 0, ASL_RSVD_RESOURCE_NAME}, + {"_GSB", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ {"_GTF", 0, ASL_RSVD_RETURN_VALUE}, {"_GTM", 0, ASL_RSVD_RETURN_VALUE}, {"_GTS", 1, 0}, @@ -260,6 +276,8 @@ const ASL_RESERVED_INFO ReservedMethods[] = { {"_HID", 0, ASL_RSVD_RETURN_VALUE}, {"_HOT", 0, ASL_RSVD_RETURN_VALUE}, {"_HPP", 0, ASL_RSVD_RETURN_VALUE}, + {"_HPX", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ + {"_IFT", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ {"_INI", 0, 0}, {"_INT", 0, ASL_RSVD_RESOURCE_NAME}, {"_IRC", 0, 0}, @@ -273,16 +291,21 @@ const ASL_RESERVED_INFO ReservedMethods[] = { {"_MEM", 0, ASL_RSVD_RESOURCE_NAME}, {"_MIF", 0, ASL_RSVD_RESOURCE_NAME}, {"_MIN", 0, ASL_RSVD_RESOURCE_NAME}, + {"_MLS", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ {"_MSG", 1, 0}, {"_OFF", 0, 0}, {"_ON_", 0, 0}, {"_OS_", 0, ASL_RSVD_RETURN_VALUE}, + {"_OSC", 4, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ {"_OSI", 1, ASL_RSVD_RETURN_VALUE}, + {"_OST", 3, 0}, /* Acpi 3.0 */ {"_PCL", 0, ASL_RSVD_RETURN_VALUE}, {"_PCT", 0, ASL_RSVD_RETURN_VALUE}, {"_PDC", 1, 0}, {"_PIC", 1, 0}, + {"_PLD", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ {"_PPC", 0, ASL_RSVD_RETURN_VALUE}, + {"_PPE", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ {"_PR0", 0, ASL_RSVD_RETURN_VALUE}, {"_PR1", 0, ASL_RSVD_RETURN_VALUE}, {"_PR2", 0, ASL_RSVD_RETURN_VALUE}, @@ -294,6 +317,7 @@ const ASL_RESERVED_INFO ReservedMethods[] = { {"_PS2", 0, 0}, {"_PS3", 0, 0}, {"_PSC", 0, ASL_RSVD_RETURN_VALUE}, + {"_PSD", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ {"_PSL", 0, ASL_RSVD_RETURN_VALUE}, {"_PSR", 0, ASL_RSVD_RETURN_VALUE}, {"_PSS", 0, ASL_RSVD_RETURN_VALUE}, @@ -309,6 +333,8 @@ const ASL_RESERVED_INFO ReservedMethods[] = { {"_RMV", 0, ASL_RSVD_RETURN_VALUE}, {"_RNG", 0, ASL_RSVD_RESOURCE_NAME}, {"_ROM", 2, ASL_RSVD_RETURN_VALUE}, + {"_RT_", 0, ASL_RSVD_RESOURCE_NAME}, /* Acpi 3.0 */ + {"_RTV", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ {"_RW_", 0, ASL_RSVD_RESOURCE_NAME}, {"_S0_", 0, ASL_RSVD_RETURN_VALUE}, {"_S1_", 0, ASL_RSVD_RETURN_VALUE}, @@ -320,32 +346,53 @@ const ASL_RESERVED_INFO ReservedMethods[] = { {"_S2D", 0, ASL_RSVD_RETURN_VALUE}, {"_S3D", 0, ASL_RSVD_RETURN_VALUE}, {"_S4D", 0, ASL_RSVD_RETURN_VALUE}, + {"_S0W", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ + {"_S1W", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ + {"_S2W", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ + {"_S3W", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ + {"_S4W", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ {"_SB_", 0, ASL_RSVD_SCOPE}, {"_SBS", 0, ASL_RSVD_RETURN_VALUE}, {"_SCP", 1, 0}, + {"_SDD", 1, 0}, /* Acpi 3.0 */ {"_SEG", 0, ASL_RSVD_RETURN_VALUE}, {"_SHR", 0, ASL_RSVD_RESOURCE_NAME}, {"_SI_", 0, ASL_RSVD_SCOPE}, {"_SIZ", 0, ASL_RSVD_RESOURCE_NAME}, + {"_SLI", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ {"_SPD", 1, ASL_RSVD_RETURN_VALUE}, {"_SRS", 1, 0}, + {"_SRV", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ {"_SST", 1, 0}, {"_STA", 0, ASL_RSVD_RETURN_VALUE}, {"_STM", 3, 0}, {"_STR", 0, ASL_RSVD_RETURN_VALUE}, {"_SUN", 0, ASL_RSVD_RETURN_VALUE}, + {"_SWS", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ {"_TC1", 0, ASL_RSVD_RETURN_VALUE}, {"_TC2", 0, ASL_RSVD_RETURN_VALUE}, {"_TMP", 0, ASL_RSVD_RETURN_VALUE}, + {"_TPC", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ + {"_TPT", 1, 0}, /* Acpi 3.0 */ {"_TRA", 0, ASL_RSVD_RESOURCE_NAME}, {"_TRS", 0, ASL_RSVD_RESOURCE_NAME}, + {"_TRT", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ + {"_TSD", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ + {"_TSF", 0, ASL_RSVD_RESOURCE_NAME}, /* Acpi 3.0 */ {"_TSP", 0, ASL_RSVD_RETURN_VALUE}, + {"_TSS", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ + {"_TST", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ {"_TTP", 0, ASL_RSVD_RESOURCE_NAME}, + {"_TTS", 1, 0}, /* Acpi 3.0 */ {"_TYP", 0, ASL_RSVD_RESOURCE_NAME}, {"_TZ_", 0, ASL_RSVD_SCOPE}, {"_TZD", 0, ASL_RSVD_RETURN_VALUE}, + {"_TZM", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ {"_TZP", 0, ASL_RSVD_RETURN_VALUE}, {"_UID", 0, ASL_RSVD_RETURN_VALUE}, + {"_UPC", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ + {"_UPD", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ + {"_UPP", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */ {"_VPO", 0, ASL_RSVD_RETURN_VALUE}, {"_WAK", 1, ASL_RSVD_RETURN_VALUE}, {NULL, 0, 0}, @@ -497,12 +544,16 @@ const ASL_MAPPING_ENTRY AslKeywordMapping [] = /* DWORDCONST */ OP_TABLE_ENTRY (AML_RAW_DATA_DWORD, 0, 0, ACPI_BTYPE_INTEGER), /* DWORDIO */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0), /* DWORDMEMORY */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0), +/* DWORDSPACE */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0), /* EISAID */ OP_TABLE_ENTRY (AML_DWORD_OP, 0, 0, ACPI_BTYPE_INTEGER), /* ELSE */ OP_TABLE_ENTRY (AML_ELSE_OP, 0, NODE_AML_PACKAGE, 0), /* ELSEIF */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, NODE_AML_PACKAGE, 0), /* ENDDEPENDENTFN */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0), /* ERRORNODE */ OP_TABLE_ENTRY (AML_NOOP_OP, 0, 0, 0), /* EVENT */ OP_TABLE_ENTRY (AML_EVENT_OP, 0, 0, 0), +/* EXTENDEDIO */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0), +/* EXTENDEDMEMORY */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0), +/* EXTENDEDSPACE */ OP_TABLE_ENTRY (AML_RAW_DATA_QWORD, 0, 0, ACPI_BTYPE_INTEGER), /* EXTERNAL */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0), /* FATAL */ OP_TABLE_ENTRY (AML_FATAL_OP, 0, 0, 0), /* FIELD */ OP_TABLE_ENTRY (AML_FIELD_OP, 0, NODE_AML_PACKAGE, 0), @@ -510,6 +561,7 @@ const ASL_MAPPING_ENTRY AslKeywordMapping [] = /* FINDSETRIGHTBIT */ OP_TABLE_ENTRY (AML_FIND_SET_RIGHT_BIT_OP, 0, 0, ACPI_BTYPE_INTEGER), /* FIXEDIO */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0), /* FROMBCD */ OP_TABLE_ENTRY (AML_FROM_BCD_OP, 0, 0, ACPI_BTYPE_INTEGER), +/* FUNCTION */ OP_TABLE_ENTRY (AML_METHOD_OP, 0, NODE_AML_PACKAGE, 0), /* IF */ OP_TABLE_ENTRY (AML_IF_OP, 0, NODE_AML_PACKAGE, 0), /* INCLUDE */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0), /* INCLUDE_CSTYLE */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0), @@ -610,6 +662,7 @@ const ASL_MAPPING_ENTRY AslKeywordMapping [] = /* QWORDCONST */ OP_TABLE_ENTRY (AML_RAW_DATA_QWORD, 0, 0, ACPI_BTYPE_INTEGER), /* QWORDIO */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0), /* QWORDMEMORY */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0), +/* QWORDSPACE */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0), /* RANGE_TYPE_ENTIRE */ OP_TABLE_ENTRY (AML_BYTE_OP, 3, 0, 0), /* RANGE_TYPE_ISAONLY */ OP_TABLE_ENTRY (AML_BYTE_OP, 2, 0, 0), /* RANGE_TYPE_NONISAONLY */ OP_TABLE_ENTRY (AML_BYTE_OP, 1, 0, 0), @@ -651,12 +704,14 @@ const ASL_MAPPING_ENTRY AslKeywordMapping [] = /* SUBTRACT */ OP_TABLE_ENTRY (AML_SUBTRACT_OP, 0, 0, ACPI_BTYPE_INTEGER), /* SWITCH */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0), /* THERMALZONE */ OP_TABLE_ENTRY (AML_THERMAL_ZONE_OP, 0, NODE_AML_PACKAGE, 0), +/* TIMER */ OP_TABLE_ENTRY (AML_TIMER_OP, 0, 0, ACPI_BTYPE_INTEGER), /* TOBCD */ OP_TABLE_ENTRY (AML_TO_BCD_OP, 0, 0, ACPI_BTYPE_INTEGER), /* TOBUFFER */ OP_TABLE_ENTRY (AML_TO_BUFFER_OP, 0, 0, ACPI_BTYPE_COMPUTE_DATA), /* TODECIMALSTRING */ OP_TABLE_ENTRY (AML_TO_DECSTRING_OP, 0, 0, ACPI_BTYPE_STRING), /* TOHEXSTRING */ OP_TABLE_ENTRY (AML_TO_HEXSTRING_OP, 0, 0, ACPI_BTYPE_STRING), /* TOINTEGER */ OP_TABLE_ENTRY (AML_TO_INTEGER_OP, 0, 0, ACPI_BTYPE_INTEGER), /* TOSTRING */ OP_TABLE_ENTRY (AML_TO_STRING_OP, 0, 0, ACPI_BTYPE_STRING), +/* TOUUID */ OP_TABLE_ENTRY (AML_DWORD_OP, 0, NODE_AML_PACKAGE, ACPI_BTYPE_INTEGER), /* TRANSLATIONTYPE_DENSE */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0), /* TRANSLATIONTYPE_SPARSE */ OP_TABLE_ENTRY (AML_BYTE_OP, 1, 0, 0), /* TYPE_STATIC */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0), @@ -674,6 +729,7 @@ const ASL_MAPPING_ENTRY AslKeywordMapping [] = /* WORDBUSNUMBER */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0), /* WORDCONST */ OP_TABLE_ENTRY (AML_RAW_DATA_WORD, 0, 0, ACPI_BTYPE_INTEGER), /* WORDIO */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0), +/* WORDSPACE */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0), /* XFERTYPE_8 */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0), /* XFERTYPE_8_16 */ OP_TABLE_ENTRY (AML_BYTE_OP, 1, 0, 0), /* XFERTYPE_16 */ OP_TABLE_ENTRY (AML_BYTE_OP, 2, 0, 0), diff --git a/sys/contrib/dev/acpica/compiler/aslopcodes.c b/sys/contrib/dev/acpica/compiler/aslopcodes.c index e838d7b..4f2033b 100644 --- a/sys/contrib/dev/acpica/compiler/aslopcodes.c +++ b/sys/contrib/dev/acpica/compiler/aslopcodes.c @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: aslopcode - AML opcode generation - * $Revision: 55 $ + * $Revision: 60 $ * *****************************************************************************/ @@ -206,6 +206,18 @@ OpcSetOptimalIntegerSize ( ACPI_PARSE_OBJECT *Op) { +/* + TBD: - we don't want to optimize integers in the block header, but the + code below does not work correctly. + + if (Op->Asl.Parent && + Op->Asl.Parent->Asl.Parent && + (Op->Asl.Parent->Asl.Parent->Asl.ParseOpcode == PARSEOP_DEFINITIONBLOCK)) + { + return 0; + } +*/ + /* * Check for the special AML integers first - Zero, One, Ones. * These are single-byte opcodes that are the smallest possible @@ -407,7 +419,6 @@ OpcDoUnicode ( * * RETURN: None * - * * DESCRIPTION: Convert a string EISA ID to numeric representation. See the * Pnp BIOS Specification for details. Here is an excerpt: * @@ -464,11 +475,11 @@ OpcDoEisaId ( for (i = 0; i < 7; i++) { - /* First 3 characters must be letters */ + /* First 3 characters must be uppercase letters */ if (i < 3) { - if (!isalpha (InString[i])) + if (!isupper (InString[i])) { Status = AE_BAD_PARAMETER; } @@ -523,6 +534,102 @@ OpcDoEisaId ( /******************************************************************************* * + * FUNCTION: OpcDoUiId + * + * PARAMETERS: Op - Parse node + * + * RETURN: None + * + * DESCRIPTION: + * + ******************************************************************************/ + +static UINT8 OpcMapToUUID[16] = {6,4,2,0,11,9,16,14,19,21,24,26,28,30,32,34}; + +void +OpcDoUuId ( + ACPI_PARSE_OBJECT *Op) +{ + char *InString; + char *Buffer; + ACPI_STATUS Status = AE_OK; + ACPI_NATIVE_UINT i; + ACPI_PARSE_OBJECT *NewOp; + + + InString = (char *) Op->Asl.Value.String; + + if (ACPI_STRLEN (InString) != 36) + { + Status = AE_BAD_PARAMETER; + } + else + { + /* Check all 36 characters for correct format */ + + for (i = 0; i < 36; i++) + { + if ((i == 8) || (i == 13) || (i == 18) || (i == 23)) + { + if (InString[i] != '-') + { + Status = AE_BAD_PARAMETER; + } + } + else + { + if (!isxdigit (InString[i])) + { + Status = AE_BAD_PARAMETER; + } + } + } + } + + Buffer = UtLocalCalloc (16); + + if (ACPI_FAILURE (Status)) + { + AslError (ASL_ERROR, ASL_MSG_INVALID_UUID, Op, Op->Asl.Value.String); + } + else for (i = 0; i < 16; i++) + { + Buffer[i] = (char) (UtHexCharToValue (InString[OpcMapToUUID[i]]) << 4); + Buffer[i] = (char) UtHexCharToValue (InString[OpcMapToUUID[i] + 1]); + } + + /* Change Op to a Buffer */ + + Op->Asl.ParseOpcode = PARSEOP_BUFFER; + Op->Common.AmlOpcode = AML_BUFFER_OP; + Op->Asl.CompileFlags &= ~NODE_COMPILE_TIME_CONST; /* Disable further optimization */ + UtSetParseOpName (Op); + + /* Child node is the buffer length */ + + NewOp = TrAllocateNode (PARSEOP_INTEGER); + + NewOp->Asl.AmlOpcode = AML_BYTE_OP; + NewOp->Asl.Value.Integer = 16; + NewOp->Asl.Parent = Op; + + Op->Asl.Child = NewOp; + Op = NewOp; + + /* Peer to the child is the raw buffer data */ + + NewOp = TrAllocateNode (PARSEOP_RAW_DATA); + NewOp->Asl.AmlOpcode = AML_RAW_DATA_BUFFER; + NewOp->Asl.AmlLength = 16; + NewOp->Asl.Value.String = (char *) Buffer; + NewOp->Asl.Parent = Op->Asl.Parent; + + Op->Asl.Next = NewOp; +} + + +/******************************************************************************* + * * FUNCTION: OpcGenerateAmlOpcode * * PARAMETERS: Op - Parse node @@ -580,6 +687,11 @@ OpcGenerateAmlOpcode ( OpcDoEisaId (Op); break; + case PARSEOP_TOUUID: + + OpcDoUuId (Op); + break; + case PARSEOP_UNICODE: OpcDoUnicode (Op); diff --git a/sys/contrib/dev/acpica/compiler/aslopt.c b/sys/contrib/dev/acpica/compiler/aslopt.c index 5aeea27..f0416d8 100644 --- a/sys/contrib/dev/acpica/compiler/aslopt.c +++ b/sys/contrib/dev/acpica/compiler/aslopt.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: aslopt- Compiler optimizations - * $Revision: 13 $ + * $Revision: 16 $ * *****************************************************************************/ @@ -211,8 +211,11 @@ OptSearchToRoot ( *NewPath = ACPI_MEM_CALLOCATE (ACPI_NAME_SIZE + 1); ACPI_STRCPY (*NewPath, Path); - AslError (ASL_OPTIMIZATION, ASL_MSG_SINGLE_NAME_OPTIMIZATION, Op, - *NewPath); + if (ACPI_STRNCMP (*NewPath, "_T_", 3)) + { + AslError (ASL_OPTIMIZATION, ASL_MSG_SINGLE_NAME_OPTIMIZATION, Op, + *NewPath); + } return (AE_OK); } @@ -354,6 +357,15 @@ OptBuildShortestPath ( * of the current path. We must include one more NameSeg of the target path */ Index -= ACPI_PATH_SEGMENT_LENGTH; + + /* Special handling for Scope() operator */ + + if (Op->Asl.AmlOpcode == AML_SCOPE_OP) + { + NewPathExternal[i] = '^'; + i++; + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS, "(EXTRA ^)")); + } } ACPI_STRCPY (&NewPathExternal[i], &((char *) TargetPath->Pointer)[Index]); @@ -581,7 +593,7 @@ OptOptimizeNamePath ( /* Various required items */ - if (!TargetNode || !WalkState || !Op->Common.Parent) + if (!TargetNode || !WalkState || !AmlNameString || !Op->Common.Parent) { return_VOID; } diff --git a/sys/contrib/dev/acpica/compiler/asltransform.c b/sys/contrib/dev/acpica/compiler/asltransform.c index fc771d5..f05f2f7 100644 --- a/sys/contrib/dev/acpica/compiler/asltransform.c +++ b/sys/contrib/dev/acpica/compiler/asltransform.c @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: asltransform - Parse tree transforms - * $Revision: 20 $ + * $Revision: 25 $ * *****************************************************************************/ @@ -131,7 +131,7 @@ * * RETURN: A pointer to the second character of the name * - * DESCRIPTION: Generate an ACPI name of the form _Txx. These names are + * DESCRIPTION: Generate an ACPI name of the form _T_x. These names are * reserved for use by the ASL compiler. * ******************************************************************************/ @@ -143,7 +143,7 @@ TrAmlGetNextTempName ( char *TempName; - if (Gbl_TempCount > 255) + if (Gbl_TempCount > (9+26+26)) { /* Too many temps */ /* TBD: issue eror message */ @@ -152,14 +152,27 @@ TrAmlGetNextTempName ( } TempName = UtLocalCalloc (6); - UtConvertByteToHex ((UINT8) Gbl_TempCount, (UINT8 *) &TempName [1]); + + if (Gbl_TempCount < 9) + { + TempName[4] = (char) (Gbl_TempCount + 0x30); + } + else if (Gbl_TempCount < (9 + 26)) + { + TempName[4] = (char) (Gbl_TempCount + 0x41); + } + else + { + TempName[4] = (char) (Gbl_TempCount + 0x61); + } Gbl_TempCount++; - /* First three characters are always "\_T" */ + /* First four characters are always "\_T_" */ TempName[0] = '\\'; TempName[1] = '_'; TempName[2] = 'T'; + TempName[3] = '_'; *NamePath = TempName; return (&TempName[1]); @@ -326,10 +339,6 @@ TrTransformSubtree ( TrDoDefinitionBlock (Op); break; - case PARSEOP_ELSEIF: - TrDoElseif (Op); - break; - case PARSEOP_SWITCH: TrDoSwitch (Op); break; @@ -375,59 +384,6 @@ TrDoDefinitionBlock ( /******************************************************************************* * - * FUNCTION: TrDoElseif - * - * PARAMETERS: Op - Parse node for ELSEIF - * - * RETURN: None - * - * DESCRIPTION: Transform an Elseif into an Else and If AML opcode pair. - * There is no AML opcode for ELSEIF -- it must be simulated - * with an if/else pair. - * - ******************************************************************************/ - -void -TrDoElseif ( - ACPI_PARSE_OBJECT *ElseNode) -{ - ACPI_PARSE_OBJECT *IfNode = NULL; - ACPI_PARSE_OBJECT *NextNode; - - - /* Change the ELSEIF into an ELSE */ - - TrAmlInitNode (ElseNode, PARSEOP_ELSE); - - /* Create a new IF node */ - - IfNode = TrCreateLeafNode (PARSEOP_IF); - IfNode->Asl.Parent = ElseNode; - TrAmlInitLineNumbers (IfNode, ElseNode); - - /* Insert the the IF node first in the ELSE child list */ - - IfNode->Asl.Child = ElseNode->Asl.Child; - ElseNode->Asl.Child = IfNode; - - /* Go to the end of the IF <Predicate><TermList> block */ - - NextNode = IfNode->Asl.Child; /* Next = Predicate */ - NextNode = NextNode->Asl.Next; /* Nest = TermList */ - - /* Make the next node after the IF the rest of the original tree */ - - IfNode->Asl.Next = NextNode->Asl.Next; - - /* Terminate the IF subtree and set IF node as the parent for all nodes */ - - NextNode->Asl.Next = NULL; - TrAmlSetSubtreeParent (IfNode->Asl.Child, IfNode); -} - - -/******************************************************************************* - * * FUNCTION: TrDoSwitch * * PARAMETERS: StartNode - Parse node for SWITCH @@ -493,34 +449,96 @@ TrDoSwitch ( Conditional = CaseOp; CaseBlock = CaseOp->Asl.Child->Asl.Next; Conditional->Asl.Child->Asl.Next = NULL; + Predicate = CaseOp->Asl.Child; - /* - * change CaseOp() to: If (PredicateValue == CaseValue) {...} - * CaseOp->Child is the case value - * CaseOp->Child->Peer is the beginning of the case block - */ - NewOp = TrCreateValuedLeafNode (PARSEOP_NAMESTRING, - (ACPI_INTEGER) ACPI_TO_INTEGER (PredicateValuePath)); + if (Predicate->Asl.ParseOpcode == PARSEOP_PACKAGE) + { + AcpiOsPrintf ("Package\n"); - Predicate = CaseOp->Asl.Child; - Predicate->Asl.Next = NewOp; - TrAmlInitLineNumbers (NewOp, Predicate); + /* + * Convert the package declaration to this form: + * + * If (LNotEqual (Match (Package(){4}, MEQ, _Txx, MTR, 0, 0), Ones)) + */ + NewOp2 = TrCreateLeafNode (PARSEOP_MATCHTYPE_MEQ); + Predicate->Asl.Next = NewOp2; + TrAmlInitLineNumbers (NewOp2, Conditional); + + NewOp = NewOp2; + NewOp2 = TrCreateValuedLeafNode (PARSEOP_NAMESTRING, + (ACPI_INTEGER) ACPI_TO_INTEGER (PredicateValuePath)); + NewOp->Asl.Next = NewOp2; + TrAmlInitLineNumbers (NewOp2, Predicate); + + NewOp = NewOp2; + NewOp2 = TrCreateLeafNode (PARSEOP_MATCHTYPE_MTR); + NewOp->Asl.Next = NewOp2; + TrAmlInitLineNumbers (NewOp2, Predicate); + + NewOp = NewOp2; + NewOp2 = TrCreateLeafNode (PARSEOP_ZERO); + NewOp->Asl.Next = NewOp2; + TrAmlInitLineNumbers (NewOp2, Predicate); + + NewOp = NewOp2; + NewOp2 = TrCreateLeafNode (PARSEOP_ZERO); + NewOp->Asl.Next = NewOp2; + TrAmlInitLineNumbers (NewOp2, Predicate); + + NewOp2 = TrCreateLeafNode (PARSEOP_MATCH); + NewOp2->Asl.Child = Predicate; /* PARSEOP_PACKAGE */ + TrAmlInitLineNumbers (NewOp2, Conditional); + TrAmlSetSubtreeParent (Predicate, NewOp2); + + NewOp = NewOp2; + NewOp2 = TrCreateLeafNode (PARSEOP_ONES); + NewOp->Asl.Next = NewOp2; + TrAmlInitLineNumbers (NewOp2, Conditional); + + NewOp2 = TrCreateLeafNode (PARSEOP_LEQUAL); + NewOp2->Asl.Child = NewOp; + NewOp->Asl.Parent = NewOp2; + TrAmlInitLineNumbers (NewOp2, Conditional); + TrAmlSetSubtreeParent (NewOp, NewOp2); + + NewOp = NewOp2; + NewOp2 = TrCreateLeafNode (PARSEOP_LNOT); + NewOp2->Asl.Child = NewOp; + NewOp2->Asl.Parent = Conditional; + NewOp->Asl.Parent = NewOp2; + TrAmlInitLineNumbers (NewOp2, Conditional); + + Conditional->Asl.Child = NewOp2; + NewOp2->Asl.Next = CaseBlock; + } + else + { + /* + * Change CaseOp() to: If (PredicateValue == CaseValue) {...} + * CaseOp->Child is the case value + * CaseOp->Child->Peer is the beginning of the case block + */ + NewOp = TrCreateValuedLeafNode (PARSEOP_NAMESTRING, + (ACPI_INTEGER) ACPI_TO_INTEGER (PredicateValuePath)); + Predicate->Asl.Next = NewOp; + TrAmlInitLineNumbers (NewOp, Predicate); - NewOp2 = TrCreateLeafNode (PARSEOP_LEQUAL); - NewOp2->Asl.Parent = Conditional; - NewOp2->Asl.Child = Predicate; - TrAmlInitLineNumbers (NewOp2, Conditional); + NewOp2 = TrCreateLeafNode (PARSEOP_LEQUAL); + NewOp2->Asl.Parent = Conditional; + NewOp2->Asl.Child = Predicate; + TrAmlInitLineNumbers (NewOp2, Conditional); - TrAmlSetSubtreeParent (Predicate, NewOp2); + TrAmlSetSubtreeParent (Predicate, NewOp2); - Predicate = NewOp2; - Predicate->Asl.Next = CaseBlock; + Predicate = NewOp2; + Predicate->Asl.Next = CaseBlock; - TrAmlSetSubtreeParent (Predicate, Conditional); + TrAmlSetSubtreeParent (Predicate, Conditional); + Conditional->Asl.Child = Predicate; + } /* Reinitialize the CASE node to an IF node */ - Conditional->Asl.Child = Predicate; TrAmlInitNode (Conditional, PARSEOP_IF); /* @@ -550,7 +568,12 @@ TrDoSwitch ( { if (DefaultOp) { - /* More than one Default */ + /* + * More than one Default + * (Parser should catch this, should not get here) + */ + AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL, Next, + "Found more than one Default()"); } /* Save the DEFAULT node for later, after CASEs */ @@ -559,7 +582,7 @@ TrDoSwitch ( } else { - /* Unkown peer opcode */ + /* Unknown peer opcode */ printf ("Unknown parse opcode for switch statement: %s (%d)\n", Next->Asl.ParseOpName, Next->Asl.ParseOpcode); @@ -567,30 +590,36 @@ TrDoSwitch ( } /* - * Add the default at the end of the if/else construct + * Add the default case at the end of the if/else construct */ if (DefaultOp) { + /* If no CASE statements, this is an error - see below */ + if (CaseOp) { - /* Add an ELSE first */ + /* Convert the DEFAULT node to an ELSE */ TrAmlInitNode (DefaultOp, PARSEOP_ELSE); DefaultOp->Asl.Parent = Conditional->Asl.Parent; - } - else - { - /* There were no CASE statements, no ELSE needed */ - TrAmlInsertPeer (CurrentParentNode, DefaultOp->Asl.Child); + /* Link ELSE node as a peer to the previous IF */ + + TrAmlInsertPeer (Conditional, DefaultOp); } } + if (!CaseOp) + { + AslError (ASL_ERROR, ASL_MSG_NO_CASES, StartNode, NULL); + } + /* * Add a NAME node for the temp integer */ NewOp = TrCreateLeafNode (PARSEOP_NAME); NewOp->Asl.Parent = Gbl_FirstLevelInsertionNode->Asl.Parent; + NewOp->Asl.CompileFlags |= NODE_COMPILER_EMITTED; NewOp2 = TrCreateValuedLeafNode (PARSEOP_NAMESTRING, (ACPI_INTEGER) ACPI_TO_INTEGER (PredicateValueName)); @@ -612,8 +641,6 @@ TrDoSwitch ( TrAmlInitNode (StartNode, PARSEOP_STORE); Predicate = StartNode->Asl.Child; - Predicate->Asl.Child = NULL; - NewOp = TrCreateValuedLeafNode (PARSEOP_NAMESTRING, (ACPI_INTEGER) ACPI_TO_INTEGER (PredicateValuePath)); NewOp->Asl.Parent = StartNode; diff --git a/sys/contrib/dev/acpica/compiler/asltypes.h b/sys/contrib/dev/acpica/compiler/asltypes.h index 5f1bcb3..ae7876c 100644 --- a/sys/contrib/dev/acpica/compiler/asltypes.h +++ b/sys/contrib/dev/acpica/compiler/asltypes.h @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: asltypes.h - compiler data types and struct definitions - * $Revision: 62 $ + * $Revision: 65 $ * *****************************************************************************/ @@ -149,6 +149,7 @@ #define NODE_IS_TERM_ARG 0x00004000 #define NODE_WAS_ONES_OP 0x00008000 #define NODE_IS_NAME_DECLARATION 0x00010000 +#define NODE_COMPILER_EMITTED 0x00020000 /* Keeps information about individual control methods */ @@ -157,6 +158,8 @@ typedef struct asl_method_info UINT8 NumArguments; UINT8 LocalInitialized[ACPI_METHOD_NUM_LOCALS]; UINT8 ArgInitialized[ACPI_METHOD_NUM_ARGS]; + UINT32 ValidArgTypes[ACPI_METHOD_NUM_ARGS]; + UINT32 ValidReturnTypes; UINT32 NumReturnNoValue; UINT32 NumReturnWithValue; ACPI_PARSE_OBJECT *Op; @@ -387,7 +390,10 @@ typedef enum ASL_MSG_EARLY_EOF, ASL_MSG_SCOPE_FWD_REF, ASL_MSG_NON_ASCII, - ASL_MSG_INVALID_TIME + ASL_MSG_INVALID_TIME, + ASL_MSG_DUPLICATE_CASE, + ASL_MSG_NO_CASES, + ASL_MSG_INVALID_UUID } ASL_MESSAGE_IDS; @@ -477,7 +483,12 @@ char *AslMessages [] = { /* ASL_MSG_EARLY_EOF */ "Premature end-of-file reached", /* ASL_MSG_SCOPE_FWD_REF */ "Forward references from Scope() not allowed", /* ASL_MSG_NON_ASCII */ "Invalid characters found in file", -/* ASL_MSG_INVALID_TIME */ "Time parameter too long (255 max)" +/* ASL_MSG_INVALID_TIME */ "Time parameter too long (255 max)", +/* ASL_MSG_DUPLICATE_CASE */ "Case value already specified", +/* ASL_MSG_NO_CASES */ "No Case() statements under Switch()", +/* ASL_MSG_INVALID_UUID */ "UUID string must be of the form \"aabbccdd-eeff-gghh-iijj-kkllmmnnoopp\"" + + }; |