From d28459aaaf532373b12c80aa5b869f8b591954e7 Mon Sep 17 00:00:00 2001 From: Jung-uk Kim Date: Thu, 13 Dec 2018 19:04:25 +0000 Subject: [PATCH] Import ACPICA 20181213. --- changes.txt | 65 +++++++++++- source/common/ahpredef.c | 16 +-- source/common/dmswitch.c | 6 ++ source/compiler/aslcodegen.c | 6 -- source/compiler/aslcompile.c | 27 +++-- source/compiler/aslcompiler.h | 4 + source/compiler/aslerror.c | 97 +++++++++++++++++- source/compiler/aslglobal.h | 4 +- source/compiler/aslhelp.c | 1 + source/compiler/asllength.c | 5 +- source/compiler/aslopcodes.c | 9 -- source/compiler/asloptions.c | 17 ++++ source/compiler/asltransform.c | 6 +- source/components/dispatcher/dsmethod.c | 12 +++ source/components/dispatcher/dsobject.c | 10 -- source/components/dispatcher/dspkginit.c | 26 +++++ source/components/dispatcher/dsutils.c | 2 - source/components/dispatcher/dswload.c | 6 +- source/components/dispatcher/dswload2.c | 6 -- source/components/dispatcher/dswstate.c | 2 +- source/components/executer/exconvrt.c | 49 ++++++--- source/components/executer/excreate.c | 2 - source/components/executer/exoparg2.c | 6 +- source/components/executer/exserial.c | 20 +--- source/components/executer/exutils.c | 2 - source/components/namespace/nseval.c | 12 +++ source/components/namespace/nsload.c | 2 - source/components/namespace/nsparse.c | 10 ++ source/components/parser/psloop.c | 2 +- source/components/parser/psparse.c | 12 +++ source/components/parser/psxface.c | 6 ++ source/components/utilities/utglobal.c | 3 - source/components/utilities/utmisc.c | 3 +- source/components/utilities/utosi.c | 2 + source/include/acglobal.h | 4 - source/include/acoutput.h | 6 +- source/include/acpixf.h | 2 +- source/include/acstruct.h | 5 +- source/include/actbl.h | 1 + source/include/actypes.h | 6 ++ source/tools/acpibin/abcompare.c | 6 +- source/tools/acpiexec/aemain.c | 7 ++ source/tools/acpihelp/ahdecode.c | 120 +++++++++++++++++++++-- source/tools/acpixtract/acpixtract.c | 27 +++-- source/tools/acpixtract/acpixtract.h | 7 +- source/tools/acpixtract/axutils.c | 33 ++++--- 46 files changed, 516 insertions(+), 166 deletions(-) diff --git a/changes.txt b/changes.txt index 91ac04cfef80..3104ba1f38b8 100644 --- a/changes.txt +++ b/changes.txt @@ -1,8 +1,69 @@ +---------------------------------------- +13 December 2018. Summary of changes for version 20181213: + + +1) ACPICA Kernel-resident Subsystem: + +Fixed some buffer length issues with the GenericSerialBus, related to two +of the bidirectional protocols: AttribRawProcessBytes and AttribRawBytes, +which are rarely seen in the field. For these, the LEN field of the ASL +buffer is now ignored. Hans de Goede + +Implemented a new object evaluation trace mechanism for control methods +and data objects. This includes nested control methods. It is +particularly useful for examining the ACPI execution during system +initialization since the output is relatively terse. The flag below +enables the output of the trace via the ACPI_DEBUG_PRINT_RAW interface: + #define ACPI_LV_EVALUATION 0x00080000 + +Examples: + Enter evaluation : _SB.PCI0._INI (Method) + Exit evaluation : _SB.PCI0._INI + Enter evaluation : _OSI (Method) + Exit evaluation : _OSI + Enter evaluation : _SB.PCI0.TEST (Method) + Nested method call : _SB.PCI0.NST1 + Exit nested method : _SB.PCI0.NST1 + Exit evaluation : _SB.PCI0.TEST + +Added two recently-defined _OSI strings. See +https://docs.microsoft.com/en-us/windows-hardware/drivers/acpi/winacpi- +osi. + "Windows 2018" + "Windows 2018.2" + +Update for buffer-to-string conversions via the ToHexString ASL operator. +A "0x" is now prepended to each of the hex values in the output string. +This provides compatibility with other ACPI implementations. The ACPI +specification is somewhat vague on this issue. + Example output string after conversion: +"0x01,0x02,0x03,0x04,0x05,0x06" + +Return a run-time error for TermArg expressions within individual package +elements. Although this is technically supported by the ASL grammar, +other ACPI implementations do not support this either. Also, this fixes a +fault if this type of construct is ever encountered (it never has been). + + +2) iASL Compiler/Disassembler and Tools: + +iASL: Implemented a new compile option (-ww) that will promote individual +warnings and remarks to errors. This is intended to enhance the firmware +build process. + +AcpiExec: Implemented a new command-line option (-eo) to support the new +object evaluation trace mechanism described above. + +Disassembler: Added support to disassemble OEMx tables as AML/ASL tables +instead of a "unknown table" message. + +AcpiHelp: Improved support for the "special" predefined names such as +_Lxx, _Exx, _EJx, _T_x, etc. For these, any legal hex value can now be +used for "xx" and "x". + ---------------------------------------- 31 October 2018. Summary of changes for version 20181031: -This release is available at https://acpica.org/downloads - An Operation Region regression was fixed by properly adding address ranges to a global list during initialization. This allows OS to diff --git a/source/common/ahpredef.c b/source/common/ahpredef.c index 0a5587227e90..1c3af7ef8e19 100644 --- a/source/common/ahpredef.c +++ b/source/common/ahpredef.c @@ -171,7 +171,7 @@ */ const AH_PREDEFINED_NAME AslPredefinedInfo[] = { - AH_PREDEF ("_ACx", "Active Cooling", "Returns the active cooling policy threshold values"), + AH_PREDEF ("_ACx", "Active Cooling, x=0-9", "Returns the active cooling policy threshold values"), AH_PREDEF ("_ADR", "Address", "Returns address of a device on parent bus, and resource field"), AH_PREDEF ("_AEI", "ACPI Event Interrupts", "Returns a list of GPIO events to be used as ACPI events"), AH_PREDEF ("_ALC", "Ambient Light Chromaticity", "Returns the ambient light color chromaticity"), @@ -180,7 +180,7 @@ const AH_PREDEFINED_NAME AslPredefinedInfo[] = AH_PREDEF ("_ALP", "Ambient Light Polling", "Returns the ambient light sensor polling frequency"), AH_PREDEF ("_ALR", "Ambient Light Response", "Returns the ambient light brightness to display brightness mappings"), AH_PREDEF ("_ALT", "Ambient Light Temperature", "Returns the ambient light color temperature"), - AH_PREDEF ("_ALx", "Active List", "Returns a list of active cooling device objects"), + AH_PREDEF ("_ALx", "Active List, x=0-9", "Returns a list of active cooling device objects"), AH_PREDEF ("_ART", "Active Cooling Relationship Table", "Returns thermal relationship information between platform devices and fan devices"), AH_PREDEF ("_ASI", "Address Space Id", "Resource Descriptor field"), AH_PREDEF ("_ASZ", "Access Size", "Resource Descriptor field"), @@ -237,11 +237,11 @@ const AH_PREDEFINED_NAME AslPredefinedInfo[] = AH_PREDEF ("_DSS", "Device Set State", "Sets the display device state"), AH_PREDEF ("_DSW", "Device Sleep Wake", "Sets the sleep and wake transition states for a device"), AH_PREDEF ("_DTI", "Device Temperature Indication", "Conveys native device temperature to the platform"), - AH_PREDEF ("_Exx", "Edge-Triggered GPE", "Method executed as a result of a general-purpose event"), + AH_PREDEF ("_Exx", "Edge-Triggered GPE, xx=0x00-0xFF", "Method executed as a result of a general-purpose event"), AH_PREDEF ("_EC_", "Embedded Controller", "returns EC offset and query information"), AH_PREDEF ("_EDL", "Eject Device List", "Returns a list of devices that are dependent on a device (docking)"), AH_PREDEF ("_EJD", "Ejection Dependent Device", "Returns the name of dependent (parent) device (docking)"), - AH_PREDEF ("_EJx", "Eject Device", "Begin or cancel a device ejection request (docking)"), + AH_PREDEF ("_EJx", "Eject Device, x=0-9", "Begin or cancel a device ejection request (docking)"), AH_PREDEF ("_END", "Endianness", "Endian orientation, Resource Descriptor field"), AH_PREDEF ("_EVT", "Event", "Event method for GPIO events"), AH_PREDEF ("_FDE", "Floppy Disk Enumerate", "Returns floppy disk configuration information"), @@ -281,7 +281,7 @@ const AH_PREDEFINED_NAME AslPredefinedInfo[] = AH_PREDEF ("_INT", "Interrupts", "Interrupt mask bits, Resource Descriptor field"), AH_PREDEF ("_IOR", "I/O Restriction", "Restriction type, Resource Descriptor field"), AH_PREDEF ("_IRC", "Inrush Current", "Presence indicates that a device has a significant inrush current draw"), - AH_PREDEF ("_Lxx", "Level-Triggered GPE", "Control method executed as a result of a general-purpose event"), + AH_PREDEF ("_Lxx", "Level-Triggered GPE, xx=0x00-0xFF", "Control method executed as a result of a general-purpose event"), AH_PREDEF ("_LCK", "Lock Device", "Locks or unlocks a device (docking)"), AH_PREDEF ("_LEN", "Length", "Range length, Resource Descriptor field"), AH_PREDEF ("_LID", "Lid Status", "Returns the open/closed status of the lid on a mobile system"), @@ -358,7 +358,7 @@ const AH_PREDEFINED_NAME AslPredefinedInfo[] = AH_PREDEF ("_PTS", "Prepare To Sleep", "Inform the platform of an impending sleep transition"), AH_PREDEF ("_PUR", "Processor Utilization Request", "Returns the number of processors that the platform would like to idle"), AH_PREDEF ("_PXM", "Device Proximity", "Returns a device's proximity domain identifier"), - AH_PREDEF ("_Qxx", "EC Query", "Embedded Controller query and SMBus Alarm control method"), + AH_PREDEF ("_Qxx", "EC Query, xx=0x00-0xFF", "Embedded Controller query and SMBus Alarm control method"), AH_PREDEF ("_RBO", "Register Bit Offset", "Resource Descriptor field"), AH_PREDEF ("_RBW", "Register Bit Width", "Resource Descriptor field"), AH_PREDEF ("_RDI", "Resource Dependencies for Idle", "Returns a list of dependencies for idle states"), @@ -413,7 +413,7 @@ const AH_PREDEFINED_NAME AslPredefinedInfo[] = AH_PREDEF ("_SUB", "Subsystem ID", "Returns the subsystem ID for a device"), AH_PREDEF ("_SUN", "Slot User Number", "Returns the slot unique ID number"), AH_PREDEF ("_SWS", "System Wake Source", "Returns the source event that caused the system to wake"), - AH_PREDEF ("_T_x", "Emitted by ASL Compiler", "Reserved for use by ASL compilers"), + AH_PREDEF ("_T_x", "Emitted by ASL Compiler, x=0-9, A-Z", "Reserved for use by ASL compilers"), AH_PREDEF ("_TC1", "Thermal Constant 1", "Returns TC1 for the passive cooling formula"), AH_PREDEF ("_TC2", "Thermal Constant 2", "Returns TC2 for the passive cooling formula"), AH_PREDEF ("_TDL", "T-State Depth Limit", "Returns the _TSS entry number of the lowest power throttling state"), @@ -447,7 +447,7 @@ const AH_PREDEFINED_NAME AslPredefinedInfo[] = AH_PREDEF ("_VAL", "Pin Configuration Value", "Resource Descriptor field"), AH_PREDEF ("_VEN", "Vendor Data", "Resource Descriptor field"), AH_PREDEF ("_VPO", "Video Post Options", "Returns the implemented video post options"), - AH_PREDEF ("_Wxx", "Wake Event", "Method executed as a result of a wake event"), + AH_PREDEF ("_Wxx", "Wake Event, xx=0x00-0xFF", "Method executed as a result of a wake event"), AH_PREDEF ("_WAK", "Wake", "Inform AML that the system has just awakened"), AH_PREDEF ("_WPC", "Wireless Power Calibration", "Calibrate power and notify wireless device"), AH_PREDEF ("_WPP", "Wireless Power Polling", "Get recommended polling interval"), diff --git a/source/common/dmswitch.c b/source/common/dmswitch.c index f04ec7434c1c..46546fbb43b2 100644 --- a/source/common/dmswitch.c +++ b/source/common/dmswitch.c @@ -325,6 +325,8 @@ AcpiDmClearTempList ( * FUNCTION: AcpiDmIsSwitchBlock * * PARAMETERS: Op - While Object + * Temp - Where the compiler temp name is returned + * (_T_x) * * RETURN: TRUE if While block can be converted to a Switch/Case block * @@ -550,6 +552,10 @@ AcpiDmIsSwitchBlock ( if (CurrentOp->Common.AmlOpcode == AML_ELSE_OP) { CurrentOp = CurrentOp->Common.Next; + if (!CurrentOp) + { + return (FALSE); + } } /* Ignore the Break Op */ diff --git a/source/compiler/aslcodegen.c b/source/compiler/aslcodegen.c index 7b2e3e5ce0c8..356011f0608c 100644 --- a/source/compiler/aslcodegen.c +++ b/source/compiler/aslcodegen.c @@ -773,12 +773,6 @@ CgWriteNode ( return; } - if ((Op->Asl.ParseOpcode == PARSEOP_EXTERNAL) && - AslGbl_DoExternals == FALSE) - { - return; - } - Op->Asl.FinalAmlLength = 0; switch (Op->Asl.AmlOpcode) diff --git a/source/compiler/aslcompile.c b/source/compiler/aslcompile.c index 4ae190763cc9..1b8838aabae6 100644 --- a/source/compiler/aslcompile.c +++ b/source/compiler/aslcompile.c @@ -388,23 +388,20 @@ CmDoCompile ( /* Resolve External Declarations */ - if (AslGbl_DoExternals) - { - Event = UtBeginEvent ("Resolve all Externals"); - DbgPrint (ASL_DEBUG_OUTPUT, "\nResolve Externals\n\n"); + Event = UtBeginEvent ("Resolve all Externals"); + DbgPrint (ASL_DEBUG_OUTPUT, "\nResolve Externals\n\n"); - if (AslGbl_DoExternalsInPlace) - { - TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD, - ExAmlExternalWalkBegin, NULL, NULL); - } - else - { - TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_TWICE, - ExAmlExternalWalkBegin, ExAmlExternalWalkEnd, NULL); - } - UtEndEvent (Event); + if (AslGbl_DoExternalsInPlace) + { + TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD, + ExAmlExternalWalkBegin, NULL, NULL); } + else + { + TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_TWICE, + ExAmlExternalWalkBegin, ExAmlExternalWalkEnd, NULL); + } + UtEndEvent (Event); /* * Semantic analysis. This can happen only after the diff --git a/source/compiler/aslcompiler.h b/source/compiler/aslcompiler.h index bd02879d584a..c5e8cb0c2537 100644 --- a/source/compiler/aslcompiler.h +++ b/source/compiler/aslcompiler.h @@ -474,6 +474,10 @@ ACPI_STATUS AslExpectException ( char *MessageIdString); +ACPI_STATUS +AslElevateException ( + char *MessageIdString); + ACPI_STATUS AslDisableException ( char *MessageIdString); diff --git a/source/compiler/aslerror.c b/source/compiler/aslerror.c index 10ea3ec1b4bd..2a18dded597e 100644 --- a/source/compiler/aslerror.c +++ b/source/compiler/aslerror.c @@ -201,6 +201,11 @@ AePrintSubError ( FILE *OutputFile, ASL_ERROR_MSG *Enode); +static UINT8 +GetModifiedLevel ( + UINT8 Level, + UINT16 MessageId); + /******************************************************************************* * @@ -968,11 +973,12 @@ AslLogNewError ( ASL_ERROR_MSG *SubError) { ASL_ERROR_MSG *Enode = NULL; + UINT8 ModifiedLevel = GetModifiedLevel (Level, MessageId); - AslInitEnode (&Enode, Level, MessageId, LineNumber, LogicalLineNumber, - LogicalByteOffset, Column, Filename, Message, SourceLine, - SubError); + AslInitEnode (&Enode, ModifiedLevel, MessageId, LineNumber, + LogicalLineNumber, LogicalByteOffset, Column, Filename, Message, + SourceLine, SubError); /* Add the new node to the error node list */ @@ -985,7 +991,7 @@ AslLogNewError ( AePrintException (ASL_FILE_STDERR, Enode, NULL); } - AslGbl_ExceptionCount[Level]++; + AslGbl_ExceptionCount[ModifiedLevel]++; if (AslGbl_ExceptionCount[ASL_ERROR] > ASL_MAX_ERROR_COUNT) { printf ("\nMaximum error count (%u) exceeded\n", ASL_MAX_ERROR_COUNT); @@ -999,6 +1005,44 @@ AslLogNewError ( return; } + +/******************************************************************************* + * + * FUNCTION: GetModifiedLevel + * + * PARAMETERS: Level - Seriousness (Warning/error, etc.) + * MessageId - Index into global message buffer + * + * RETURN: UINT8 - modified level + * + * DESCRIPTION: Get the modified level of exception codes that are reported as + * errors from the -ww option. + * + ******************************************************************************/ + +static UINT8 +GetModifiedLevel ( + UINT8 Level, + UINT16 MessageId) +{ + UINT16 i; + UINT16 ExceptionCode; + + + ExceptionCode = AeBuildFullExceptionCode (Level, MessageId); + + for (i = 0; i < AslGbl_ElevatedMessagesIndex; i++) + { + if (ExceptionCode == AslGbl_ElevatedMessages[i]) + { + return (ASL_ERROR); + } + } + + return (Level); +} + + /******************************************************************************* * * FUNCTION: AslIsExceptionIgnored @@ -1155,6 +1199,51 @@ AslDisableException ( } +/******************************************************************************* + * + * FUNCTION: AslElevateException + * + * PARAMETERS: MessageIdString - ID of excepted exception during compile + * + * RETURN: Status + * + * DESCRIPTION: Enter a message ID into the global elevated exceptions table. + * These messages will be considered as compilation errors. + * + ******************************************************************************/ + +ACPI_STATUS +AslElevateException ( + char *MessageIdString) +{ + UINT32 MessageId; + + + /* Convert argument to an integer and validate it */ + + MessageId = (UINT32) strtoul (MessageIdString, NULL, 0); + + if (MessageId > 6999) + { + printf ("\"%s\" is not a valid warning/remark/erro ID\n", + MessageIdString); + return (AE_BAD_PARAMETER); + } + + /* Insert value into the global expected message array */ + + if (AslGbl_ElevatedMessagesIndex >= ASL_MAX_ELEVATED_MESSAGES) + { + printf ("Too many messages have been registered as elevated (max %d)\n", + ASL_MAX_DISABLED_MESSAGES); + return (AE_LIMIT); + } + + AslGbl_ElevatedMessages[AslGbl_ExpectedMessagesIndex] = MessageId; + AslGbl_ElevatedMessagesIndex++; + return (AE_OK); +} + /******************************************************************************* * * FUNCTION: AslIsExceptionDisabled diff --git a/source/compiler/aslglobal.h b/source/compiler/aslglobal.h index c3e69cbbda3d..fd00da7802db 100644 --- a/source/compiler/aslglobal.h +++ b/source/compiler/aslglobal.h @@ -255,6 +255,7 @@ extern int AslCompilerdebug; #define ASL_STRING_BUFFER_SIZE (1024 * 32) /* 32k */ #define ASL_MAX_DISABLED_MESSAGES 32 #define ASL_MAX_EXPECTED_MESSAGES 32 +#define ASL_MAX_ELEVATED_MESSAGES 32 #define HEX_TABLE_LINE_SIZE 8 #define HEX_LISTING_LINE_SIZE 8 @@ -319,7 +320,6 @@ ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_AllExceptionsDisable ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_PruneParseTree, FALSE); ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_DoTypechecking, TRUE); ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_EnableReferenceTypechecking, FALSE); -ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_DoExternals, TRUE); ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_DoExternalsInPlace, FALSE); ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_DoAslConversion, FALSE); ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_OptimizeTrivialParseNodes, TRUE); @@ -394,6 +394,7 @@ ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_CurrentAmlOffset, 0) ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_CurrentLine, 0); ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_DisabledMessagesIndex, 0); ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_ExpectedMessagesIndex, 0); +ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_ElevatedMessagesIndex, 0); ASL_EXTERN UINT8 ASL_INIT_GLOBAL (AslGbl_HexBytesWereWritten, FALSE); ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_NumNamespaceObjects, 0); ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_ReservedMethods, 0); @@ -435,6 +436,7 @@ ASL_EXTERN char AslGbl_StringBuffer[ASL_STRING_BUFFER_SIZE]; ASL_EXTERN char AslGbl_StringBuffer2[ASL_STRING_BUFFER_SIZE]; ASL_EXTERN UINT32 AslGbl_DisabledMessages[ASL_MAX_DISABLED_MESSAGES]; ASL_EXTERN ASL_EXPECTED_MESSAGE AslGbl_ExpectedMessages[ASL_MAX_EXPECTED_MESSAGES]; +ASL_EXTERN UINT32 AslGbl_ElevatedMessages[ASL_MAX_ELEVATED_MESSAGES]; #endif /* __ASLGLOBAL_H */ diff --git a/source/compiler/aslhelp.c b/source/compiler/aslhelp.c index 608f18532b54..4377f83c6221 100644 --- a/source/compiler/aslhelp.c +++ b/source/compiler/aslhelp.c @@ -209,6 +209,7 @@ Usage ( ACPI_OPTION ("-vx ", "Expect a specific warning, remark, or error"); ACPI_OPTION ("-w <1|2|3>", "Set warning reporting level"); ACPI_OPTION ("-we", "Report warnings as errors"); + ACPI_OPTION ("-ww ", "Report specific warning or remark as error"); printf ("\nAML Bytecode Generation (*.aml):\n"); ACPI_OPTION ("-oa", "Disable all optimizations (compatibility mode)"); diff --git a/source/compiler/asllength.c b/source/compiler/asllength.c index 696dc2424128..8fef83b91742 100644 --- a/source/compiler/asllength.c +++ b/source/compiler/asllength.c @@ -519,10 +519,7 @@ CgGenerateAmlLengths ( case PARSEOP_EXTERNAL: - if (AslGbl_DoExternals == TRUE) - { - CgGenerateAmlOpcodeLength (Op); - } + CgGenerateAmlOpcodeLength (Op); break; default: diff --git a/source/compiler/aslopcodes.c b/source/compiler/aslopcodes.c index 218223b836b1..32d04781c5d4 100644 --- a/source/compiler/aslopcodes.c +++ b/source/compiler/aslopcodes.c @@ -927,15 +927,6 @@ OpcGenerateAmlOpcode ( AslGbl_HasIncludeFiles = TRUE; break; - case PARSEOP_EXTERNAL: - - if (AslGbl_DoExternals == FALSE) - { - Op->Asl.Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG; - Op->Asl.Child->Asl.Next->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG; - } - break; - case PARSEOP_TIMER: if (AcpiGbl_IntegerBitWidth == 32) diff --git a/source/compiler/asloptions.c b/source/compiler/asloptions.c index 15519634ae92..325ee4aca7ca 100644 --- a/source/compiler/asloptions.c +++ b/source/compiler/asloptions.c @@ -982,6 +982,23 @@ AslDoOptions ( AslGbl_WarningsAsErrors = TRUE; break; + case 'w': + + /* Get the required argument */ + + if (AcpiGetoptArgument (argc, argv)) + { + return (-1); + } + + Status = AslElevateException (AcpiGbl_Optarg); + if (ACPI_FAILURE (Status)) + { + return (-1); + } + break; + + default: printf ("Unknown option: -w%s\n", AcpiGbl_Optarg); diff --git a/source/compiler/asltransform.c b/source/compiler/asltransform.c index 324b0364dc9d..2bf32db4b9f8 100644 --- a/source/compiler/asltransform.c +++ b/source/compiler/asltransform.c @@ -460,11 +460,7 @@ TrTransformSubtree ( case PARSEOP_EXTERNAL: - if (AslGbl_DoExternals == TRUE) - { - ExDoExternal (Op); - } - + ExDoExternal (Op); break; case PARSEOP___METHOD__: diff --git a/source/components/dispatcher/dsmethod.c b/source/components/dispatcher/dsmethod.c index 3db8010f7311..009151f91061 100644 --- a/source/components/dispatcher/dsmethod.c +++ b/source/components/dispatcher/dsmethod.c @@ -720,6 +720,8 @@ AcpiDsCallControlMethod ( goto Cleanup; } + NextWalkState->MethodNestingDepth = ThisWalkState->MethodNestingDepth + 1; + /* * Delete the operands on the previous walkstate operand stack * (they were copied to new objects) @@ -738,6 +740,16 @@ AcpiDsCallControlMethod ( "**** Begin nested execution of [%4.4s] **** WalkState=%p\n", MethodNode->Name.Ascii, NextWalkState)); + ThisWalkState->MethodPathname = AcpiNsGetNormalizedPathname (MethodNode, TRUE); + ThisWalkState->MethodIsNested = TRUE; + + /* Optional object evaluation log */ + + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EVALUATION, + "%-26s: %*s%s\n", " Nested method call", + NextWalkState->MethodNestingDepth * 3, " ", + &ThisWalkState->MethodPathname[1])); + /* Invoke an internal method if necessary */ if (ObjDesc->Method.InfoFlags & ACPI_METHOD_INTERNAL_ONLY) diff --git a/source/components/dispatcher/dsobject.c b/source/components/dispatcher/dsobject.c index e9b7413a2feb..4ec23d466c48 100644 --- a/source/components/dispatcher/dsobject.c +++ b/source/components/dispatcher/dsobject.c @@ -161,7 +161,6 @@ ACPI_MODULE_NAME ("dsobject") -#ifndef ACPI_NO_METHOD_EXECUTION /******************************************************************************* * * FUNCTION: AcpiDsBuildInternalObject @@ -460,7 +459,6 @@ AcpiDsCreateNode ( return_ACPI_STATUS (Status); } -#endif /* ACPI_NO_METHOD_EXECUTION */ /******************************************************************************* @@ -571,9 +569,7 @@ AcpiDsInitObjectFromOp ( /* Truncate value if we are executing from a 32-bit ACPI table */ -#ifndef ACPI_NO_METHOD_EXECUTION (void) AcpiExTruncateFor32bitTable (ObjDesc); -#endif break; case AML_REVISION_OP: @@ -594,7 +590,6 @@ AcpiDsInitObjectFromOp ( ObjDesc->Integer.Value = Op->Common.Value.Integer; -#ifndef ACPI_NO_METHOD_EXECUTION if (AcpiExTruncateFor32bitTable (ObjDesc)) { /* Warn if we found a 64-bit constant in a 32-bit table */ @@ -604,7 +599,6 @@ AcpiDsInitObjectFromOp ( ACPI_FORMAT_UINT64 (Op->Common.Value.Integer), (UINT32) ObjDesc->Integer.Value)); } -#endif break; default: @@ -642,12 +636,10 @@ AcpiDsInitObjectFromOp ( ObjDesc->Reference.Value = ((UINT32) Opcode) - AML_FIRST_LOCAL_OP; ObjDesc->Reference.Class = ACPI_REFCLASS_LOCAL; -#ifndef ACPI_NO_METHOD_EXECUTION Status = AcpiDsMethodDataGetNode (ACPI_REFCLASS_LOCAL, ObjDesc->Reference.Value, WalkState, ACPI_CAST_INDIRECT_PTR (ACPI_NAMESPACE_NODE, &ObjDesc->Reference.Object)); -#endif break; case AML_TYPE_METHOD_ARGUMENT: @@ -657,12 +649,10 @@ AcpiDsInitObjectFromOp ( ObjDesc->Reference.Value = ((UINT32) Opcode) - AML_FIRST_ARG_OP; ObjDesc->Reference.Class = ACPI_REFCLASS_ARG; -#ifndef ACPI_NO_METHOD_EXECUTION Status = AcpiDsMethodDataGetNode (ACPI_REFCLASS_ARG, ObjDesc->Reference.Value, WalkState, ACPI_CAST_INDIRECT_PTR (ACPI_NAMESPACE_NODE, &ObjDesc->Reference.Object)); -#endif break; default: /* Object name or Debug object */ diff --git a/source/components/dispatcher/dspkginit.c b/source/components/dispatcher/dspkginit.c index 9e1cd6115fd4..1e7e7383a088 100644 --- a/source/components/dispatcher/dspkginit.c +++ b/source/components/dispatcher/dspkginit.c @@ -308,6 +308,32 @@ AcpiDsBuildInternalPackageObj ( { if (Arg->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP) { + if (!Arg->Common.Node) + { + /* + * This is the case where an expression has returned a value. + * The use of expressions (TermArgs) within individual + * package elements is not supported by the AML interpreter, + * even though the ASL grammar supports it. Example: + * + * Name (INT1, 0x1234) + * + * Name (PKG3, Package () { + * Add (INT1, 0xAAAA0000) + * }) + * + * 1) No known AML interpreter supports this type of construct + * 2) This fixes a fault if the construct is encountered + */ + ACPI_EXCEPTION ((AE_INFO, AE_SUPPORT, + "Expressions within package elements are not supported")); + + /* Cleanup the return object, it is not needed */ + + AcpiUtRemoveReference (WalkState->Results->Results.ObjDesc[0]); + return_ACPI_STATUS (AE_SUPPORT); + } + if (Arg->Common.Node->Type == ACPI_TYPE_METHOD) { /* diff --git a/source/components/dispatcher/dsutils.c b/source/components/dispatcher/dsutils.c index c03f9268f886..20a9e25602d4 100644 --- a/source/components/dispatcher/dsutils.c +++ b/source/components/dispatcher/dsutils.c @@ -209,7 +209,6 @@ AcpiDsClearImplicitReturn ( } -#ifndef ACPI_NO_METHOD_EXECUTION /******************************************************************************* * * FUNCTION: AcpiDsDoImplicitReturn @@ -583,7 +582,6 @@ AcpiDsClearOperands ( WalkState->NumOperands = 0; return_VOID; } -#endif /******************************************************************************* diff --git a/source/components/dispatcher/dswload.c b/source/components/dispatcher/dswload.c index 91f5b3050042..db0f0e8596dd 100644 --- a/source/components/dispatcher/dswload.c +++ b/source/components/dispatcher/dswload.c @@ -221,12 +221,10 @@ AcpiDsInitCallbacks ( /* Execution pass */ -#ifndef ACPI_NO_METHOD_EXECUTION WalkState->ParseFlags |= ACPI_PARSE_EXECUTE | ACPI_PARSE_DELETE_TREE; WalkState->DescendingCallback = AcpiDsExecBeginOp; WalkState->AscendingCallback = AcpiDsExecEndOp; -#endif break; default: @@ -517,7 +515,7 @@ AcpiDsLoad1BeginOp ( /* Initialize the op */ -#if (defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY)) +#ifdef ACPI_CONSTANT_EVAL_ONLY Op->Named.Path = Path; #endif @@ -580,7 +578,6 @@ AcpiDsLoad1EndOp ( ObjectType = WalkState->OpInfo->ObjectType; -#ifndef ACPI_NO_METHOD_EXECUTION if (WalkState->OpInfo->Flags & AML_FIELD) { /* @@ -626,7 +623,6 @@ AcpiDsLoad1EndOp ( } } } -#endif if (Op->Common.AmlOpcode == AML_NAME_OP) { diff --git a/source/components/dispatcher/dswload2.c b/source/components/dispatcher/dswload2.c index 4b6e41d8dd30..7387690e2a09 100644 --- a/source/components/dispatcher/dswload2.c +++ b/source/components/dispatcher/dswload2.c @@ -529,10 +529,8 @@ AcpiDsLoad2EndOp ( ACPI_NAMESPACE_NODE *Node; ACPI_PARSE_OBJECT *Arg; ACPI_NAMESPACE_NODE *NewNode; -#ifndef ACPI_NO_METHOD_EXECUTION UINT32 i; UINT8 RegionSpace; -#endif ACPI_FUNCTION_TRACE (DsLoad2EndOp); @@ -622,7 +620,6 @@ AcpiDsLoad2EndOp ( switch (WalkState->OpInfo->Type) { -#ifndef ACPI_NO_METHOD_EXECUTION case AML_TYPE_CREATE_FIELD: /* @@ -718,13 +715,11 @@ AcpiDsLoad2EndOp ( } break; -#endif /* ACPI_NO_METHOD_EXECUTION */ case AML_TYPE_NAMED_COMPLEX: switch (Op->Common.AmlOpcode) { -#ifndef ACPI_NO_METHOD_EXECUTION case AML_REGION_OP: case AML_DATA_REGION_OP: @@ -809,7 +804,6 @@ AcpiDsLoad2EndOp ( } break; -#endif /* ACPI_NO_METHOD_EXECUTION */ default: diff --git a/source/components/dispatcher/dswstate.c b/source/components/dispatcher/dswstate.c index 7994cb12dd1c..409d7f71fa64 100644 --- a/source/components/dispatcher/dswstate.c +++ b/source/components/dispatcher/dswstate.c @@ -733,7 +733,7 @@ AcpiDsCreateWalkState ( /* Init the method args/local */ -#if (!defined (ACPI_NO_METHOD_EXECUTION) && !defined (ACPI_CONSTANT_EVAL_ONLY)) +#ifndef ACPI_CONSTANT_EVAL_ONLY AcpiDsMethodDataInit (WalkState); #endif diff --git a/source/components/executer/exconvrt.c b/source/components/executer/exconvrt.c index 5c58746e3a4d..a147ba214107 100644 --- a/source/components/executer/exconvrt.c +++ b/source/components/executer/exconvrt.c @@ -496,7 +496,7 @@ AcpiExConvertToAscii ( /* HexLength: 2 ascii hex chars per data byte */ - HexLength = ACPI_MUL_2 (DataWidth); + HexLength = (DataWidth * 2); for (i = 0, j = (HexLength-1); i < HexLength; i++, j--) { /* Get one hex digit, most significant digits first */ @@ -539,7 +539,8 @@ AcpiExConvertToAscii ( * * RETURN: Status * - * DESCRIPTION: Convert an ACPI Object to a string + * DESCRIPTION: Convert an ACPI Object to a string. Supports both implicit + * and explicit conversions and related rules. * ******************************************************************************/ @@ -574,9 +575,11 @@ AcpiExConvertToString ( switch (Type) { case ACPI_EXPLICIT_CONVERT_DECIMAL: - - /* Make room for maximum decimal number */ - + /* + * From ToDecimalString, integer source. + * + * Make room for the maximum decimal number size + */ StringLength = ACPI_MAX_DECIMAL_DIGITS; Base = 10; break; @@ -620,8 +623,10 @@ AcpiExConvertToString ( { case ACPI_EXPLICIT_CONVERT_DECIMAL: /* Used by ToDecimalString */ /* - * From ACPI: "If Data is a buffer, it is converted to a string of - * decimal values separated by commas." + * Explicit conversion from the ToDecimalString ASL operator. + * + * From ACPI: "If the input is a buffer, it is converted to a + * a string of decimal values separated by commas." */ Base = 10; @@ -648,20 +653,29 @@ AcpiExConvertToString ( case ACPI_IMPLICIT_CONVERT_HEX: /* + * Implicit buffer-to-string conversion + * * From the ACPI spec: - *"The entire contents of the buffer are converted to a string of + * "The entire contents of the buffer are converted to a string of * two-character hexadecimal numbers, each separated by a space." + * + * Each hex number is prefixed with 0x (11/2018) */ Separator = ' '; - StringLength = (ObjDesc->Buffer.Length * 3); + StringLength = (ObjDesc->Buffer.Length * 5); break; - case ACPI_EXPLICIT_CONVERT_HEX: /* Used by ToHexString */ + case ACPI_EXPLICIT_CONVERT_HEX: /* + * Explicit conversion from the ToHexString ASL operator. + * * From ACPI: "If Data is a buffer, it is converted to a string of * hexadecimal values separated by commas." + * + * Each hex number is prefixed with 0x (11/2018) */ - StringLength = (ObjDesc->Buffer.Length * 3); + Separator = ','; + StringLength = (ObjDesc->Buffer.Length * 5); break; default: @@ -692,9 +706,20 @@ AcpiExConvertToString ( */ for (i = 0; i < ObjDesc->Buffer.Length; i++) { + if (Base == 16) + { + /* Emit 0x prefix for explict/implicit hex conversion */ + + *NewBuf++ = '0'; + *NewBuf++ = 'x'; + } + NewBuf += AcpiExConvertToAscii ( (UINT64) ObjDesc->Buffer.Pointer[i], Base, NewBuf, 1); - *NewBuf++ = Separator; /* each separated by a comma or space */ + + /* Each digit is separated by either a comma or space */ + + *NewBuf++ = Separator; } /* diff --git a/source/components/executer/excreate.c b/source/components/executer/excreate.c index 524960c2f5cc..f4dd8298f4c4 100644 --- a/source/components/executer/excreate.c +++ b/source/components/executer/excreate.c @@ -161,7 +161,6 @@ ACPI_MODULE_NAME ("excreate") -#ifndef ACPI_NO_METHOD_EXECUTION /******************************************************************************* * * FUNCTION: AcpiExCreateAlias @@ -573,7 +572,6 @@ AcpiExCreatePowerResource ( AcpiUtRemoveReference (ObjDesc); return_ACPI_STATUS (Status); } -#endif /******************************************************************************* diff --git a/source/components/executer/exoparg2.c b/source/components/executer/exoparg2.c index 73d0bd26cc39..0693dcbe2441 100644 --- a/source/components/executer/exoparg2.c +++ b/source/components/executer/exoparg2.c @@ -460,9 +460,9 @@ AcpiExOpcode_2A_1T_1R ( * NOTE: A length of zero is ok, and will create a zero-length, null * terminated string. */ - while ((Length < Operand[0]->Buffer.Length) && - (Length < Operand[1]->Integer.Value) && - (Operand[0]->Buffer.Pointer[Length])) + while ((Length < Operand[0]->Buffer.Length) && /* Length of input buffer */ + (Length < Operand[1]->Integer.Value) && /* Length operand */ + (Operand[0]->Buffer.Pointer[Length])) /* Null terminator */ { Length++; } diff --git a/source/components/executer/exserial.c b/source/components/executer/exserial.c index 73f2aa4a3e12..553aedfb6312 100644 --- a/source/components/executer/exserial.c +++ b/source/components/executer/exserial.c @@ -445,14 +445,12 @@ AcpiExWriteSerialBus ( case ACPI_ADR_SPACE_SMBUS: BufferLength = ACPI_SMBUS_BUFFER_SIZE; - DataLength = ACPI_SMBUS_DATA_SIZE; Function = ACPI_WRITE | (ObjDesc->Field.Attribute << 16); break; case ACPI_ADR_SPACE_IPMI: BufferLength = ACPI_IPMI_BUFFER_SIZE; - DataLength = ACPI_IPMI_DATA_SIZE; Function = ACPI_WRITE; break; @@ -471,7 +469,6 @@ AcpiExWriteSerialBus ( /* Add header length to get the full size of the buffer */ BufferLength += ACPI_SERIAL_HEADER_SIZE; - DataLength = SourceDesc->Buffer.Pointer[1]; Function = ACPI_WRITE | (AccessorType << 16); break; @@ -479,21 +476,6 @@ AcpiExWriteSerialBus ( return_ACPI_STATUS (AE_AML_INVALID_SPACE_ID); } -#if 0 -OBSOLETE? - /* Check for possible buffer overflow */ - - if (DataLength > SourceDesc->Buffer.Length) - { - ACPI_ERROR ((AE_INFO, - "Length in buffer header (%u)(%u) is greater than " - "the physical buffer length (%u) and will overflow", - DataLength, BufferLength, SourceDesc->Buffer.Length)); - - return_ACPI_STATUS (AE_AML_BUFFER_LIMIT); - } -#endif - /* Create the transfer/bidirectional/return buffer */ BufferDesc = AcpiUtCreateBufferObject (BufferLength); @@ -505,6 +487,8 @@ OBSOLETE? /* Copy the input buffer data to the transfer buffer */ Buffer = BufferDesc->Buffer.Pointer; + DataLength = (BufferLength < SourceDesc->Buffer.Length ? + BufferLength : SourceDesc->Buffer.Length); memcpy (Buffer, SourceDesc->Buffer.Pointer, DataLength); /* Lock entire transaction if requested */ diff --git a/source/components/executer/exutils.c b/source/components/executer/exutils.c index a38ce940c481..06ad2b5f32b3 100644 --- a/source/components/executer/exutils.c +++ b/source/components/executer/exutils.c @@ -181,7 +181,6 @@ AcpiExDigitsNeeded ( UINT32 Base); -#ifndef ACPI_NO_METHOD_EXECUTION /******************************************************************************* * * FUNCTION: AcpiExEnterInterpreter @@ -615,4 +614,3 @@ AcpiIsValidSpaceId ( return (TRUE); } -#endif diff --git a/source/components/namespace/nseval.c b/source/components/namespace/nseval.c index 8262d992fec5..0dbac5bf0f9c 100644 --- a/source/components/namespace/nseval.c +++ b/source/components/namespace/nseval.c @@ -259,6 +259,12 @@ AcpiNsEvaluate ( return_ACPI_STATUS (AE_NO_MEMORY); } + /* Optional object evaluation log */ + + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EVALUATION, + "%-26s: %s (%s)\n", " Enter evaluation", + &Info->FullPathname[1], AcpiUtGetTypeName (Info->Node->Type))); + /* Count the number of arguments being passed in */ Info->ParamCount = 0; @@ -445,6 +451,12 @@ AcpiNsEvaluate ( Info->RelativePathname)); Cleanup: + /* Optional object evaluation log */ + + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EVALUATION, + "%-26s: %s\n", " Exit evaluation", + &Info->FullPathname[1])); + /* * Namespace was unlocked by the handling AcpiNs* function, so we * just free the pathname and return diff --git a/source/components/namespace/nsload.c b/source/components/namespace/nsload.c index 698d3a572326..68946074e18d 100644 --- a/source/components/namespace/nsload.c +++ b/source/components/namespace/nsload.c @@ -173,7 +173,6 @@ AcpiNsDeleteSubtree ( #endif -#ifndef ACPI_NO_METHOD_EXECUTION /******************************************************************************* * * FUNCTION: AcpiNsLoadTable @@ -477,4 +476,3 @@ AcpiNsUnloadNamespace ( return_ACPI_STATUS (Status); } #endif -#endif diff --git a/source/components/namespace/nsparse.c b/source/components/namespace/nsparse.c index 8e86ee4c5de9..e781a4ded6b0 100644 --- a/source/components/namespace/nsparse.c +++ b/source/components/namespace/nsparse.c @@ -261,8 +261,18 @@ AcpiNsExecuteTable ( goto Cleanup; } + /* Optional object evaluation log */ + + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EVALUATION, + "%-26s: (Definition Block level)\n", "Module-level evaluation")); + Status = AcpiPsExecuteTable (Info); + /* Optional object evaluation log */ + + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EVALUATION, + "%-26s: (Definition Block level)\n", "Module-level complete")); + Cleanup: if (Info) { diff --git a/source/components/parser/psloop.c b/source/components/parser/psloop.c index 9625834c56f6..1fa2c880ca43 100644 --- a/source/components/parser/psloop.c +++ b/source/components/parser/psloop.c @@ -580,7 +580,7 @@ AcpiPsParseLoop ( ParserState = &WalkState->ParserState; WalkState->ArgTypes = 0; -#if (!defined (ACPI_NO_METHOD_EXECUTION) && !defined (ACPI_CONSTANT_EVAL_ONLY)) +#ifndef ACPI_CONSTANT_EVAL_ONLY if (WalkState->WalkType & ACPI_WALK_METHOD_RESTART) { diff --git a/source/components/parser/psparse.c b/source/components/parser/psparse.c index 0ad62b771bef..378bfab5b212 100644 --- a/source/components/parser/psparse.c +++ b/source/components/parser/psparse.c @@ -637,6 +637,18 @@ AcpiPsParseAml ( "Completed one call to walk loop, %s State=%p\n", AcpiFormatException (Status), WalkState)); + if (WalkState->MethodPathname && WalkState->MethodIsNested) + { + /* Optional object evaluation log */ + + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EVALUATION, "%-26s: %*s%s\n", + " Exit nested method", + (WalkState->MethodNestingDepth + 1) * 3, " ", + &WalkState->MethodPathname[1])); + + ACPI_FREE (WalkState->MethodPathname); + WalkState->MethodIsNested = FALSE; + } if (Status == AE_CTRL_TRANSFER) { /* diff --git a/source/components/parser/psxface.c b/source/components/parser/psxface.c index 8516fe3a35df..54f54eab15cd 100644 --- a/source/components/parser/psxface.c +++ b/source/components/parser/psxface.c @@ -307,6 +307,9 @@ AcpiPsExecuteMethod ( goto Cleanup; } + WalkState->MethodPathname = Info->FullPathname; + WalkState->MethodIsNested = FALSE; + if (Info->ObjDesc->Method.InfoFlags & ACPI_METHOD_MODULE_LEVEL) { WalkState->ParseFlags |= ACPI_PARSE_MODULE_LEVEL; @@ -437,6 +440,9 @@ AcpiPsExecuteTable ( goto Cleanup; } + WalkState->MethodPathname = Info->FullPathname; + WalkState->MethodIsNested = FALSE; + if (Info->ObjDesc->Method.InfoFlags & ACPI_METHOD_MODULE_LEVEL) { WalkState->ParseFlags |= ACPI_PARSE_MODULE_LEVEL; diff --git a/source/components/utilities/utglobal.c b/source/components/utilities/utglobal.c index a41c17da727b..d4cde4dbea99 100644 --- a/source/components/utilities/utglobal.c +++ b/source/components/utilities/utglobal.c @@ -235,10 +235,7 @@ const ACPI_PREDEFINED_NAMES AcpiGbl_PreDefinedNames[] = {"_REV", ACPI_TYPE_INTEGER, ACPI_CAST_PTR (char, 2)}, {"_OS_", ACPI_TYPE_STRING, ACPI_OS_NAME}, {"_GL_", ACPI_TYPE_MUTEX, ACPI_CAST_PTR (char, 1)}, - -#if !defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY) {"_OSI", ACPI_TYPE_METHOD, ACPI_CAST_PTR (char, 1)}, -#endif /* Table terminator */ diff --git a/source/components/utilities/utmisc.c b/source/components/utilities/utmisc.c index 0e04aff06972..c6dbf915c513 100644 --- a/source/components/utilities/utmisc.c +++ b/source/components/utilities/utmisc.c @@ -217,7 +217,8 @@ AcpiUtIsAmlTable ( if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_DSDT) || ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_PSDT) || ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_SSDT) || - ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_OSDT)) + ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_OSDT) || + ACPI_IS_OEM_SIG (Table->Signature)) { return (TRUE); } diff --git a/source/components/utilities/utosi.c b/source/components/utilities/utosi.c index e63690786417..3713d033b7e7 100644 --- a/source/components/utilities/utosi.c +++ b/source/components/utilities/utosi.c @@ -217,6 +217,8 @@ static ACPI_INTERFACE_INFO AcpiDefaultSupportedInterfaces[] = {"Windows 2016", NULL, 0, ACPI_OSI_WIN_10_RS1}, /* Windows 10 version 1607 - Added 12/2017 */ {"Windows 2017", NULL, 0, ACPI_OSI_WIN_10_RS2}, /* Windows 10 version 1703 - Added 12/2017 */ {"Windows 2017.2", NULL, 0, ACPI_OSI_WIN_10_RS3}, /* Windows 10 version 1709 - Added 02/2018 */ + {"Windows 2018", NULL, 0, ACPI_OSI_WIN_10_RS4}, /* Windows 10 version 1803 - Added 11/2018 */ + {"Windows 2018.2", NULL, 0, ACPI_OSI_WIN_10_RS5}, /* Windows 10 version 1809 - Added 11/2018 */ /* Feature Group Strings */ diff --git a/source/include/acglobal.h b/source/include/acglobal.h index 3c2a4ed4ce0e..b21c92bdeb98 100644 --- a/source/include/acglobal.h +++ b/source/include/acglobal.h @@ -317,11 +317,7 @@ ACPI_GLOBAL (BOOLEAN, AcpiGbl_DisableMemTracking); * ****************************************************************************/ -#if !defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY) #define NUM_PREDEFINED_NAMES 10 -#else -#define NUM_PREDEFINED_NAMES 9 -#endif ACPI_GLOBAL (ACPI_NAMESPACE_NODE, AcpiGbl_RootNodeStruct); ACPI_GLOBAL (ACPI_NAMESPACE_NODE *, AcpiGbl_RootNode); diff --git a/source/include/acoutput.h b/source/include/acoutput.h index 358ff55a08bf..2a4d31574bc7 100644 --- a/source/include/acoutput.h +++ b/source/include/acoutput.h @@ -216,7 +216,8 @@ #define ACPI_LV_RESOURCES 0x00010000 #define ACPI_LV_USER_REQUESTS 0x00020000 #define ACPI_LV_PACKAGE 0x00040000 -#define ACPI_LV_VERBOSITY1 0x0007FF40 | ACPI_LV_ALL_EXCEPTIONS +#define ACPI_LV_EVALUATION 0x00080000 +#define ACPI_LV_VERBOSITY1 0x000FFF40 | ACPI_LV_ALL_EXCEPTIONS /* Trace verbosity level 2 [Function tracing and memory allocation] */ @@ -285,6 +286,7 @@ #define ACPI_DB_INTERRUPTS ACPI_DEBUG_LEVEL (ACPI_LV_INTERRUPTS) #define ACPI_DB_USER_REQUESTS ACPI_DEBUG_LEVEL (ACPI_LV_USER_REQUESTS) #define ACPI_DB_PACKAGE ACPI_DEBUG_LEVEL (ACPI_LV_PACKAGE) +#define ACPI_DB_EVALUATION ACPI_DEBUG_LEVEL (ACPI_LV_EVALUATION) #define ACPI_DB_MUTEX ACPI_DEBUG_LEVEL (ACPI_LV_MUTEX) #define ACPI_DB_EVENTS ACPI_DEBUG_LEVEL (ACPI_LV_EVENTS) @@ -292,7 +294,7 @@ /* Defaults for DebugLevel, debug and normal */ -#define ACPI_DEBUG_DEFAULT (ACPI_LV_INIT | ACPI_LV_DEBUG_OBJECT | ACPI_LV_REPAIR) +#define ACPI_DEBUG_DEFAULT (ACPI_LV_INIT | ACPI_LV_DEBUG_OBJECT | ACPI_LV_EVALUATION | ACPI_LV_REPAIR) #define ACPI_NORMAL_DEFAULT (ACPI_LV_INIT | ACPI_LV_DEBUG_OBJECT | ACPI_LV_REPAIR) #define ACPI_DEBUG_ALL (ACPI_LV_AML_DISASSEMBLE | ACPI_LV_ALL_EXCEPTIONS | ACPI_LV_ALL) diff --git a/source/include/acpixf.h b/source/include/acpixf.h index 27e9aa7f298d..24deae67851a 100644 --- a/source/include/acpixf.h +++ b/source/include/acpixf.h @@ -154,7 +154,7 @@ /* Current ACPICA subsystem version in YYYYMMDD format */ -#define ACPI_CA_VERSION 0x20181031 +#define ACPI_CA_VERSION 0x20181213 #include "acconfig.h" #include "actypes.h" diff --git a/source/include/acstruct.h b/source/include/acstruct.h index 9c55d357ec58..177057266edf 100644 --- a/source/include/acstruct.h +++ b/source/include/acstruct.h @@ -205,6 +205,8 @@ typedef struct acpi_walk_state ACPI_PARSE_STATE ParserState; /* Current state of parser */ UINT32 PrevArgTypes; UINT32 ArgCount; /* push for fixed or var args */ + UINT16 MethodNestingDepth; + UINT8 MethodIsNested; struct acpi_namespace_node Arguments[ACPI_METHOD_NUM_ARGS]; /* Control method arguments */ struct acpi_namespace_node LocalVariables[ACPI_METHOD_NUM_LOCALS]; /* Control method locals */ @@ -219,7 +221,8 @@ typedef struct acpi_walk_state struct acpi_namespace_node *MethodCallNode; /* Called method Node*/ ACPI_PARSE_OBJECT *MethodCallOp; /* MethodCall Op if running a method */ union acpi_operand_object *MethodDesc; /* Method descriptor if running a method */ - struct acpi_namespace_node *MethodNode; /* Method node if running a method. */ + struct acpi_namespace_node *MethodNode; /* Method node if running a method */ + char *MethodPathname; /* Full pathname of running method */ ACPI_PARSE_OBJECT *Op; /* Current parser op */ const ACPI_OPCODE_INFO *OpInfo; /* Info on current opcode */ ACPI_PARSE_OBJECT *Origin; /* Start of walk [Obsolete] */ diff --git a/source/include/actbl.h b/source/include/actbl.h index 58a9b73455fb..f6a2f7c50b1c 100644 --- a/source/include/actbl.h +++ b/source/include/actbl.h @@ -182,6 +182,7 @@ #define ACPI_SIG_XSDT "XSDT" /* Extended System Description Table */ #define ACPI_SIG_SSDT "SSDT" /* Secondary System Description Table */ #define ACPI_RSDP_NAME "RSDP" /* Short name for RSDP, not signature */ +#define ACPI_OEM_NAME "OEM" /* Short name for OEM, not signature */ /* diff --git a/source/include/actypes.h b/source/include/actypes.h index 4d2438c9ec69..396fb52440ac 100644 --- a/source/include/actypes.h +++ b/source/include/actypes.h @@ -678,6 +678,10 @@ typedef UINT64 ACPI_INTEGER; #define ACPI_VALIDATE_RSDP_SIG(a) (!strncmp (ACPI_CAST_PTR (char, (a)), ACPI_SIG_RSDP, 8)) #define ACPI_MAKE_RSDP_SIG(dest) (memcpy (ACPI_CAST_PTR (char, (dest)), ACPI_SIG_RSDP, 8)) +/* Support for OEMx signature (x can be any character) */ +#define ACPI_IS_OEM_SIG(a) (!strncmp (ACPI_CAST_PTR (char, (a)), ACPI_OEM_NAME, 3) &&\ + strnlen (a, ACPI_NAME_SIZE) == ACPI_NAME_SIZE) + /* * Algorithm to obtain access bit width. * Can be used with AccessWidth of ACPI_GENERIC_ADDRESS and AccessSize of @@ -1512,6 +1516,8 @@ typedef enum #define ACPI_OSI_WIN_10_RS1 0x0E #define ACPI_OSI_WIN_10_RS2 0x0F #define ACPI_OSI_WIN_10_RS3 0x10 +#define ACPI_OSI_WIN_10_RS4 0x11 +#define ACPI_OSI_WIN_10_RS5 0x12 /* Definitions of getopt */ diff --git a/source/tools/acpibin/abcompare.c b/source/tools/acpibin/abcompare.c index 740d995fc2bf..ca80def96406 100644 --- a/source/tools/acpibin/abcompare.c +++ b/source/tools/acpibin/abcompare.c @@ -537,7 +537,11 @@ AbCompareAmlFiles ( printf ("Compare offset: %u\n", AbGbl_CompareOffset); if (AbGbl_CompareOffset) { - fseek (File2, AbGbl_CompareOffset, SEEK_CUR); + if (fseek (File2, AbGbl_CompareOffset, SEEK_CUR)) + { + printf ("Seek error on file %s\n", File2Path); + goto Exit2; + } } Actual1 = fread (&Char1, 1, 1, File1); diff --git a/source/tools/acpiexec/aemain.c b/source/tools/acpiexec/aemain.c index e8ae348cdf9b..58e639fae8dd 100644 --- a/source/tools/acpiexec/aemain.c +++ b/source/tools/acpiexec/aemain.c @@ -266,6 +266,7 @@ usage ( ACPI_OPTION ("-ef", "Enable display of final memory statistics"); ACPI_OPTION ("-ei", "Enable additional tests for ACPICA interfaces"); ACPI_OPTION ("-el", "Enable loading of additional test tables"); + ACPI_OPTION ("-eo", "Enable object evaluation log"); ACPI_OPTION ("-es", "Enable Interpreter Slack Mode"); ACPI_OPTION ("-et", "Enable debug semaphore timeout"); printf ("\n"); @@ -406,6 +407,12 @@ AeDoOptions ( AcpiGbl_LoadTestTables = TRUE; break; + case 'o': + + AcpiDbgLevel |= ACPI_LV_EVALUATION; + AcpiGbl_DbConsoleDebugLevel |= ACPI_LV_EVALUATION; + break; + case 's': AcpiGbl_EnableInterpreterSlack = TRUE; diff --git a/source/tools/acpihelp/ahdecode.c b/source/tools/acpihelp/ahdecode.c index 4c6850385cb1..416acf4d3787 100644 --- a/source/tools/acpihelp/ahdecode.c +++ b/source/tools/acpihelp/ahdecode.c @@ -167,6 +167,10 @@ static void AhDisplayPredefinedInfo ( char *Name); +static void +AhDoSpecialNames ( + char *Name); + static void AhDisplayResourceName ( const ACPI_PREDEFINED_INFO *ThisName); @@ -293,15 +297,23 @@ AhFindPredefinedNames ( { UINT32 Length; BOOLEAN Found; - char Name[9]; + char Name[ACPI_NAME_SIZE + 1]; - if (!NamePrefix || (NamePrefix[0] == '*')) + if (!NamePrefix || (*NamePrefix == '*')) { Found = AhDisplayPredefinedName (NULL, 0); return; } + Length = strlen (NamePrefix); + if (Length > ACPI_NAME_SIZE) + { + printf ("%.8s: Predefined name must be 4 characters maximum\n", + NamePrefix); + return; + } + /* Contruct a local name or name prefix */ AcpiUtStrupr (NamePrefix); @@ -311,14 +323,13 @@ AhFindPredefinedNames ( } Name[0] = '_'; - AcpiUtSafeStrncpy (&Name[1], NamePrefix, 7); + AcpiUtSafeStrncpy (&Name[1], NamePrefix, 4); - Length = strlen (Name); - if (Length > ACPI_NAME_SIZE) - { - printf ("%.8s: Predefined name must be 4 characters maximum\n", Name); - return; - } + /* Check for special names such as _Exx, _ACx, etc. */ + + AhDoSpecialNames (Name); + + /* Lookup and display the name(s) */ Found = AhDisplayPredefinedName (Name, Length); if (!Found) @@ -328,6 +339,95 @@ AhFindPredefinedNames ( } +/******************************************************************************* + * + * FUNCTION: AhDoSpecialNames + * + * PARAMETERS: Name - Name or prefix to find + * + * RETURN: None + * + * DESCRIPTION: Detect and handle the "special" names such as _Exx, _ACx, etc. + * + * Current support: + * _EJx + * _Exx + * _Lxx + * _Qxx + * _Wxx + * _ACx + * _ALx + * _T_x + * + ******************************************************************************/ + +static void +AhDoSpecialNames ( + char *Name) +{ + + /* + * Check for the special names that have one or more numeric + * suffixes. For example, _Lxx can have 256 different flavors, + * from _L00 to _LFF. + */ + switch (Name[1]) + { + case 'E': + if (Name[2] == 'J') + { + if (isdigit (Name[3]) || (Name[3] == 'X')) + { + /* _EJx */ + + Name[3] = 'x'; + break; + } + } + + /* Fallthrough */ + + case 'L': + case 'Q': + case 'W': + if ((isxdigit (Name[2]) && isxdigit (Name[3])) + || + ((Name[2] == 'X') && (Name[3] == 'X'))) + { + /* _Exx, _Lxx, _Qxx, or _Wxx */ + + Name[2] = 'x'; + Name[3] = 'x'; + } + break; + + case 'A': + if ((Name[2] == 'C') || (Name[2] == 'L')) + { + if (isdigit (Name[3]) || (Name[3] == 'X')) + { + /* _ACx or _ALx */ + + Name[3] = 'x'; + } + } + break; + + case 'T': + if (Name[2] == '_') + { + /* _T_x (Reserved for iASL compiler */ + + Name[3] = 'x'; + } + break; + + default: + break; + } +} + + /******************************************************************************* * * FUNCTION: AhDisplayPredefinedName @@ -420,7 +520,7 @@ AhDisplayPredefinedInfo ( /* NOTE: we check both tables always because there are some dupes */ - /* Check against the predefine methods first */ + /* Check against the predefined methods first */ ThisName = AcpiUtMatchPredefinedMethod (Name); if (ThisName) diff --git a/source/tools/acpixtract/acpixtract.c b/source/tools/acpixtract/acpixtract.c index be9a5210de63..6de90de2d5bd 100644 --- a/source/tools/acpixtract/acpixtract.c +++ b/source/tools/acpixtract/acpixtract.c @@ -176,8 +176,8 @@ AxExtractTables ( { FILE *InputFile; FILE *OutputFile = NULL; - unsigned int BytesConverted; - unsigned int ThisTableBytesWritten = 0; + int BytesConverted; + int ThisTableBytesWritten = 0; unsigned int FoundTable = 0; unsigned int Instances = 0; unsigned int ThisInstance; @@ -323,8 +323,7 @@ AxExtractTables ( /* Empty line or non-data line terminates the data block */ - BytesConverted = AxConvertAndWrite (OutputFile, ThisSignature, - ThisTableBytesWritten); + BytesConverted = AxConvertAndWrite (OutputFile, ThisSignature); switch (BytesConverted) { case 0: @@ -334,6 +333,7 @@ AxExtractTables ( case -1: + Status = -1; goto CleanupAndExit; /* There was a write error */ default: /* Normal case, get next line */ @@ -397,8 +397,8 @@ AxExtractToMultiAmlFile ( FILE *InputFile; FILE *OutputFile; int Status = 0; - unsigned int TotalBytesWritten = 0; - unsigned int ThisTableBytesWritten = 0; + int TotalBytesWritten = 0; + int ThisTableBytesWritten = 0; unsigned int BytesConverted; char ThisSignature[4]; unsigned int State = AX_STATE_FIND_HEADER; @@ -494,8 +494,7 @@ AxExtractToMultiAmlFile ( /* Empty line or non-data line terminates the data block */ - BytesConverted = AxConvertAndWrite ( - OutputFile, ThisSignature, ThisTableBytesWritten); + BytesConverted = AxConvertAndWrite (OutputFile, ThisSignature); switch (BytesConverted) { case 0: @@ -505,6 +504,7 @@ AxExtractToMultiAmlFile ( case -1: + Status = -1; goto CleanupAndExit; /* There was a write error */ default: /* Normal case, get next line */ @@ -561,6 +561,7 @@ AxListAllTables ( FILE *InputFile; unsigned char Header[48]; UINT32 ByteCount = 0; + UINT32 ThisLineByteCount; unsigned int State = AX_STATE_FIND_HEADER; @@ -633,7 +634,15 @@ AxListAllTables ( /* Convert header to hex and display it */ - ByteCount += AxConvertToBinary (Gbl_LineBuffer, &Header[ByteCount]); + ThisLineByteCount = AxConvertToBinary (Gbl_LineBuffer, + &Header[ByteCount]); + if (ThisLineByteCount == EOF) + { + fclose (InputFile); + return (-1); + } + + ByteCount += ThisLineByteCount; if (ByteCount >= sizeof (ACPI_TABLE_HEADER)) { AxDumpTableHeader (Header); diff --git a/source/tools/acpixtract/acpixtract.h b/source/tools/acpixtract/acpixtract.h index 88b16670ec10..3adf89055fe6 100644 --- a/source/tools/acpixtract/acpixtract.h +++ b/source/tools/acpixtract/acpixtract.h @@ -276,13 +276,12 @@ BOOLEAN AxIsDataBlockHeader ( void); -long +int AxConvertAndWrite ( FILE *OutputFile, - char *ThisSignature, - unsigned int ThisTableBytesWritten); + char *ThisSignature); -size_t +int AxConvertToBinary ( char *InputLine, unsigned char *OutputData); diff --git a/source/tools/acpixtract/axutils.c b/source/tools/acpixtract/axutils.c index 8fba70047f93..61cb2d8a8b6a 100644 --- a/source/tools/acpixtract/axutils.c +++ b/source/tools/acpixtract/axutils.c @@ -427,7 +427,7 @@ AxNormalizeSignature ( * ******************************************************************************/ -size_t +int AxConvertToBinary ( char *InputLine, unsigned char *OutputData) @@ -468,14 +468,22 @@ AxConvertToBinary ( &Converted[8], &Converted[9], &Converted[10], &Converted[11], &Converted[12], &Converted[13], &Converted[14], &Converted[15]); - /* Pack converted data into a byte array */ + if (BytesConverted == EOF) + { + printf ("EOF while converting ASCII line to binary\n"); + return (-1); + } + /* + * Pack converted data into a byte array. + * Note: BytesConverted == 0 is acceptable. + */ for (i = 0; i < BytesConverted; i++) { OutputData[i] = (unsigned char) Converted[i]; } - return ((size_t) BytesConverted); + return (BytesConverted); } @@ -603,7 +611,6 @@ AxGetNextInstance ( * * PARAMETERS: OutputFile - Where to write the binary data * ThisSignature - Signature of current ACPI table - * ThisTableBytesWritten - Total count of data written * * RETURN: Length of the converted line * @@ -616,27 +623,29 @@ AxGetNextInstance ( * ******************************************************************************/ -long +int AxConvertAndWrite ( FILE *OutputFile, - char *ThisSignature, - unsigned int ThisTableBytesWritten) + char *ThisSignature) { - size_t BytesWritten; - size_t BytesConverted; + int BytesWritten; + int BytesConverted; /* Convert one line of ascii hex data to binary */ BytesConverted = AxConvertToBinary (Gbl_LineBuffer, Gbl_BinaryData); - - /* Write the binary data */ - + if (BytesConverted == EOF) + { + return (EOF); + } if (!BytesConverted) { return (0); } + /* Write the binary data */ + BytesWritten = fwrite (Gbl_BinaryData, 1, BytesConverted, OutputFile); if (BytesWritten != BytesConverted) {