Message ID | 20200326230249.65759-1-colin.king@canonical.com |
---|---|
State | Accepted |
Headers | show |
Series | ACPICA: Update to version 20200326 | expand |
On 2020-03-26 5:02 p.m., Colin King wrote: > From: Colin Ian King <colin.king@canonical.com> > > Changes in this release of ACPICA are detailed at the following > link on the ACPICA developer mailing list: > > https://lists.acpica.org/hyperkitty/list/devel@acpica.org/thread/BDLNZMTZ5R32EY7UQPXFY6CBKH5OKBSJ > > Signed-off-by: Colin Ian King <colin.king@canonical.com> > --- > src/acpica/source/common/ahtable.c | 2 +- > src/acpica/source/common/dmtable.c | 3 +- > src/acpica/source/common/dmtbdump2.c | 25 +- > src/acpica/source/common/dmtbinfo2.c | 16 +- > src/acpica/source/common/dmtbinfo3.c | 2 +- > src/acpica/source/compiler/aslcompile.c | 1 + > src/acpica/source/compiler/aslcompiler.h | 8 +- > src/acpica/source/compiler/aslcompiler.l | 20 +- > src/acpica/source/compiler/asldefine.h | 1 + > src/acpica/source/compiler/aslerror.c | 125 +++++++++- > src/acpica/source/compiler/aslglobal.h | 1 + > src/acpica/source/compiler/aslload.c | 88 +++++-- > src/acpica/source/compiler/asloptions.c | 2 +- > src/acpica/source/compiler/asltypes.h | 31 ++- > src/acpica/source/compiler/dtcompiler.h | 1 - > src/acpica/source/compiler/dtcompilerparser.l | 1 - > src/acpica/source/compiler/dtcompilerparser.y | 1 - > src/acpica/source/compiler/dtparser.l | 2 +- > src/acpica/source/compiler/dttable1.c | 10 +- > src/acpica/source/compiler/dtutils.c | 3 +- > src/acpica/source/compiler/prparser.l | 2 +- > .../source/components/debugger/dbinput.c | 19 +- > .../source/components/debugger/dbxface.c | 1 + > .../source/components/dispatcher/dswexec.c | 32 ++- > .../source/components/dispatcher/dswload.c | 2 - > .../source/components/dispatcher/dswload2.c | 37 +++ > .../source/components/hardware/hwsleep.c | 4 +- > .../source/components/namespace/nsnames.c | 8 +- > .../source/components/utilities/utdecode.c | 2 +- > .../source/components/utilities/utdelete.c | 9 +- > src/acpica/source/include/acdisasm.h | 1 + > src/acpica/source/include/acnamesp.h | 4 + > src/acpica/source/include/acpixf.h | 2 +- > src/acpica/source/include/actbinfo.h | 3 +- > src/acpica/source/include/actbl2.h | 24 +- > src/acpica/source/include/actbl3.h | 6 +- > src/acpica/source/include/acuuid.h | 2 +- > src/acpica/source/tools/acpiexec/aecommon.h | 20 +- > src/acpica/source/tools/acpiexec/aeinitfile.c | 220 +++++++++++------- > 39 files changed, 568 insertions(+), 173 deletions(-) Acked-by: Alex Hung <alex.hung@canonical.com>
On 3/27/20 7:02 AM, Colin King wrote: > From: Colin Ian King <colin.king@canonical.com> > > Changes in this release of ACPICA are detailed at the following > link on the ACPICA developer mailing list: > > https://lists.acpica.org/hyperkitty/list/devel@acpica.org/thread/BDLNZMTZ5R32EY7UQPXFY6CBKH5OKBSJ > > Signed-off-by: Colin Ian King <colin.king@canonical.com> > --- > src/acpica/source/common/ahtable.c | 2 +- > src/acpica/source/common/dmtable.c | 3 +- > src/acpica/source/common/dmtbdump2.c | 25 +- > src/acpica/source/common/dmtbinfo2.c | 16 +- > src/acpica/source/common/dmtbinfo3.c | 2 +- > src/acpica/source/compiler/aslcompile.c | 1 + > src/acpica/source/compiler/aslcompiler.h | 8 +- > src/acpica/source/compiler/aslcompiler.l | 20 +- > src/acpica/source/compiler/asldefine.h | 1 + > src/acpica/source/compiler/aslerror.c | 125 +++++++++- > src/acpica/source/compiler/aslglobal.h | 1 + > src/acpica/source/compiler/aslload.c | 88 +++++-- > src/acpica/source/compiler/asloptions.c | 2 +- > src/acpica/source/compiler/asltypes.h | 31 ++- > src/acpica/source/compiler/dtcompiler.h | 1 - > src/acpica/source/compiler/dtcompilerparser.l | 1 - > src/acpica/source/compiler/dtcompilerparser.y | 1 - > src/acpica/source/compiler/dtparser.l | 2 +- > src/acpica/source/compiler/dttable1.c | 10 +- > src/acpica/source/compiler/dtutils.c | 3 +- > src/acpica/source/compiler/prparser.l | 2 +- > .../source/components/debugger/dbinput.c | 19 +- > .../source/components/debugger/dbxface.c | 1 + > .../source/components/dispatcher/dswexec.c | 32 ++- > .../source/components/dispatcher/dswload.c | 2 - > .../source/components/dispatcher/dswload2.c | 37 +++ > .../source/components/hardware/hwsleep.c | 4 +- > .../source/components/namespace/nsnames.c | 8 +- > .../source/components/utilities/utdecode.c | 2 +- > .../source/components/utilities/utdelete.c | 9 +- > src/acpica/source/include/acdisasm.h | 1 + > src/acpica/source/include/acnamesp.h | 4 + > src/acpica/source/include/acpixf.h | 2 +- > src/acpica/source/include/actbinfo.h | 3 +- > src/acpica/source/include/actbl2.h | 24 +- > src/acpica/source/include/actbl3.h | 6 +- > src/acpica/source/include/acuuid.h | 2 +- > src/acpica/source/tools/acpiexec/aecommon.h | 20 +- > src/acpica/source/tools/acpiexec/aeinitfile.c | 220 +++++++++++------- > 39 files changed, 568 insertions(+), 173 deletions(-) > > diff --git a/src/acpica/source/common/ahtable.c b/src/acpica/source/common/ahtable.c > index 25fd525e..32d5dedb 100644 > --- a/src/acpica/source/common/ahtable.c > +++ b/src/acpica/source/common/ahtable.c > @@ -258,7 +258,7 @@ const AH_TABLE AcpiGbl_SupportedTables[] = > {ACPI_SIG_WDDT, "Watchdog Description Table"}, > {ACPI_SIG_WDRT, "Watchdog Resource Table"}, > {ACPI_SIG_WPBT, "Windows Platform Binary Table"}, > - {ACPI_SIG_WSMT, "Windows SMM Security Migrations Table"}, > + {ACPI_SIG_WSMT, "Windows SMM Security Mitigations Table"}, > {ACPI_SIG_XENV, "Xen Environment table"}, > {ACPI_SIG_XSDT, "Extended System Description Table"}, > {NULL, NULL} > diff --git a/src/acpica/source/common/dmtable.c b/src/acpica/source/common/dmtable.c > index 02220d26..5896b2f2 100644 > --- a/src/acpica/source/common/dmtable.c > +++ b/src/acpica/source/common/dmtable.c > @@ -1676,7 +1676,8 @@ AcpiDmDumpTable ( > Temp8 = *Target; > switch (Temp8) > { > - case ACPI_IVRS_TYPE_HARDWARE: > + case ACPI_IVRS_TYPE_HARDWARE1: > + case ACPI_IVRS_TYPE_HARDWARE2: > > Name = AcpiDmIvrsSubnames[0]; > break; > diff --git a/src/acpica/source/common/dmtbdump2.c b/src/acpica/source/common/dmtbdump2.c > index 95eea6d9..688a2cf9 100644 > --- a/src/acpica/source/common/dmtbdump2.c > +++ b/src/acpica/source/common/dmtbdump2.c > @@ -475,11 +475,16 @@ AcpiDmDumpIvrs ( > > switch (Subtable->Type) > { > - case ACPI_IVRS_TYPE_HARDWARE: > + case ACPI_IVRS_TYPE_HARDWARE1: > > InfoTable = AcpiDmTableInfoIvrs0; > break; > > + case ACPI_IVRS_TYPE_HARDWARE2: > + > + InfoTable = AcpiDmTableInfoIvrs01; > + break; > + > case ACPI_IVRS_TYPE_MEMORY1: > case ACPI_IVRS_TYPE_MEMORY2: > case ACPI_IVRS_TYPE_MEMORY3: > @@ -514,11 +519,21 @@ AcpiDmDumpIvrs ( > > /* The hardware subtable can contain multiple device entries */ > > - if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE) > + if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE1 || > + Subtable->Type == ACPI_IVRS_TYPE_HARDWARE2) > { > - EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE); > - DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, Subtable, > - sizeof (ACPI_IVRS_HARDWARE)); > + if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE1) > + { > + EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE1); > + DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, Subtable, > + sizeof (ACPI_IVRS_HARDWARE1)); > + } > + else if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE2) > + { > + EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE2); > + DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, Subtable, > + sizeof (ACPI_IVRS_HARDWARE2)); > + } > > while (EntryOffset < (Offset + Subtable->Length)) > { > diff --git a/src/acpica/source/common/dmtbinfo2.c b/src/acpica/source/common/dmtbinfo2.c > index 79802830..c000a921 100644 > --- a/src/acpica/source/common/dmtbinfo2.c > +++ b/src/acpica/source/common/dmtbinfo2.c > @@ -403,7 +403,21 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoIvrs0[] = > {ACPI_DMT_UINT64, ACPI_IVRS0_OFFSET (BaseAddress), "Base Address", 0}, > {ACPI_DMT_UINT16, ACPI_IVRS0_OFFSET (PciSegmentGroup), "PCI Segment Group", 0}, > {ACPI_DMT_UINT16, ACPI_IVRS0_OFFSET (Info), "Virtualization Info", 0}, > - {ACPI_DMT_UINT32, ACPI_IVRS0_OFFSET (Reserved), "Reserved", 0}, > + {ACPI_DMT_UINT32, ACPI_IVRS0_OFFSET (FeatureReporting), "Feature Reporting", 0}, > + ACPI_DMT_TERMINATOR > +}; > + > +/* 0x10: I/O Virtualization Hardware Definition (IVHD) Block */ > + > +ACPI_DMTABLE_INFO AcpiDmTableInfoIvrs01[] = > +{ > + {ACPI_DMT_UINT16, ACPI_IVRS01_OFFSET (CapabilityOffset), "Capability Offset", 0}, > + {ACPI_DMT_UINT64, ACPI_IVRS01_OFFSET (BaseAddress), "Base Address", 0}, > + {ACPI_DMT_UINT16, ACPI_IVRS01_OFFSET (PciSegmentGroup), "PCI Segment Group", 0}, > + {ACPI_DMT_UINT16, ACPI_IVRS01_OFFSET (Info), "Virtualization Info", 0}, > + {ACPI_DMT_UINT32, ACPI_IVRS01_OFFSET (Attributes), "Attributes", 0}, > + {ACPI_DMT_UINT64, ACPI_IVRS01_OFFSET (EfrRegisterImage), "EFR Image", 0}, > + {ACPI_DMT_UINT64, ACPI_IVRS01_OFFSET (Reserved), "Reserved", 0}, > ACPI_DMT_TERMINATOR > }; > > diff --git a/src/acpica/source/common/dmtbinfo3.c b/src/acpica/source/common/dmtbinfo3.c > index 07a26c2b..f4092c24 100644 > --- a/src/acpica/source/common/dmtbinfo3.c > +++ b/src/acpica/source/common/dmtbinfo3.c > @@ -691,7 +691,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoWpbt0[] = > > /******************************************************************************* > * > - * WSMT - Windows SMM Security Migrations Table > + * WSMT - Windows SMM Security Mitigations Table > * > ******************************************************************************/ > > diff --git a/src/acpica/source/compiler/aslcompile.c b/src/acpica/source/compiler/aslcompile.c > index 9481b6bb..787a5444 100644 > --- a/src/acpica/source/compiler/aslcompile.c > +++ b/src/acpica/source/compiler/aslcompile.c > @@ -283,6 +283,7 @@ CmDoCompile ( > > LsDumpParseTree (); > > + UtEndEvent (Event); > UtEndEvent (FullCompile); > return (AE_OK); > > diff --git a/src/acpica/source/compiler/aslcompiler.h b/src/acpica/source/compiler/aslcompiler.h > index 9bebc380..82d777d8 100644 > --- a/src/acpica/source/compiler/aslcompiler.h > +++ b/src/acpica/source/compiler/aslcompiler.h > @@ -488,7 +488,7 @@ AslCheckExpectedExceptions ( > void); > > ACPI_STATUS > -AslExpectException ( > +AslLogExpectedException ( > char *MessageIdString); > > ACPI_STATUS > @@ -501,9 +501,15 @@ AslDisableException ( > > BOOLEAN > AslIsExceptionIgnored ( > + char *Filename, > + UINT32 LineNumber, > UINT8 Level, > UINT16 MessageId); > > +void > +AslLogExpectedExceptionByLine ( > + char *MessageIdString); > + > void > AslCoreSubsystemError ( > ACPI_PARSE_OBJECT *Op, > diff --git a/src/acpica/source/compiler/aslcompiler.l b/src/acpica/source/compiler/aslcompiler.l > index 797f9899..4c3fbde3 100644 > --- a/src/acpica/source/compiler/aslcompiler.l > +++ b/src/acpica/source/compiler/aslcompiler.l > @@ -156,7 +156,6 @@ > > #include <stdlib.h> > #include <string.h> > -YYSTYPE AslCompilerlval; > > /* > * Generation: Use the following command line: > @@ -195,6 +194,7 @@ count (int type); > > LeadNameChar [A-Za-z_] > DigitChar [0-9] > +ErrorCode [(][ ]*[1-9][0-9][0-9][0-9][ ]*[)] > OctalChar [0-7] > HexDigitChar [A-Fa-f0-9] > RootChar [\\] > @@ -692,7 +692,7 @@ NamePathTail [.]{NameSeg} > "IPMI" { count (0); return (PARSEOP_REGIONSPACE_IPMI); } > "GeneralPurposeIo" { count (0); return (PARSEOP_REGIONSPACE_GPIO); } /* ACPI 5.0 */ > "GenericSerialBus" { count (0); return (PARSEOP_REGIONSPACE_GSBUS); } /* ACPI 5.0 */ > -"PlatformCommChannel" { count (0); return (PARSEOP_REGIONSPACE_PCC); } /* ACPI 5.0 */ > +"PCC" { count (0); return (PARSEOP_REGIONSPACE_PCC); } /* ACPI 5.0 */ > "FFixedHW" { count (0); return (PARSEOP_REGIONSPACE_FFIXEDHW); } > > /* ResourceTypeKeyword: Resource Usage - Resource Descriptors */ > @@ -810,6 +810,22 @@ NamePathTail [.]{NameSeg} > "__LINE__" { count (0); return (PARSEOP___LINE__); } > "__PATH__" { count (0); return (PARSEOP___PATH__); } > "__METHOD__" { count (0); return (PARSEOP___METHOD__); } > +"__EXPECT__"{ErrorCode} { char *s; > + int index = 0; > + count (0); > + while (!isdigit (AslCompilertext[index])) > + { > + index++; > + } > + > + /* > + * The eror code is contained inside the > + * {ErrorCode} pattern. Extract it and log it > + * as the expected error code. > + */ > + s = UtLocalCacheCalloc (ASL_ERROR_CODE_LENGTH + 1); > + memcpy (s, AslCompilertext + index, ASL_ERROR_CODE_LENGTH); > + AslLogExpectedExceptionByLine (s); } > > {NameSeg} { char *s; > count (0); > diff --git a/src/acpica/source/compiler/asldefine.h b/src/acpica/source/compiler/asldefine.h > index 12a4cdd5..2627a58a 100644 > --- a/src/acpica/source/compiler/asldefine.h > +++ b/src/acpica/source/compiler/asldefine.h > @@ -227,6 +227,7 @@ > #define ASL_NO_ABORT FALSE > #define ASL_EOF ACPI_UINT32_MAX > #define ASL_IGNORE_LINE (ACPI_UINT32_MAX -1) > +#define ASL_ERROR_CODE_LENGTH 4 > > > /* Listings */ > diff --git a/src/acpica/source/compiler/aslerror.c b/src/acpica/source/compiler/aslerror.c > index 1931fffc..8fae779d 100644 > --- a/src/acpica/source/compiler/aslerror.c > +++ b/src/acpica/source/compiler/aslerror.c > @@ -162,6 +162,8 @@ AeAddToErrorLog ( > > static BOOLEAN > AslIsExceptionExpected ( > + char *Filename, > + UINT32 LineNumber, > UINT8 Level, > UINT16 MessageId); > > @@ -170,7 +172,8 @@ AslIsExceptionDisabled ( > UINT8 Level, > UINT16 MessageId); > > -static void AslInitEnode ( > +static void > +AslInitEnode ( > ASL_ERROR_MSG **Enode, > UINT8 Level, > UINT16 MessageId, > @@ -956,7 +959,7 @@ AslCommonError ( > { > /* Check if user wants to ignore this exception */ > > - if (AslIsExceptionIgnored (Level, MessageId)) > + if (AslIsExceptionIgnored (Filename, LogicalLineNumber, Level, MessageId)) > { > return; > } > @@ -1087,6 +1090,8 @@ GetModifiedLevel ( > > BOOLEAN > AslIsExceptionIgnored ( > + char *Filename, > + UINT32 LineNumber, > UINT8 Level, > UINT16 MessageId) > { > @@ -1096,7 +1101,8 @@ AslIsExceptionIgnored ( > /* Note: this allows exception to be disabled and expected */ > > ExceptionIgnored = AslIsExceptionDisabled (Level, MessageId); > - ExceptionIgnored |= AslIsExceptionExpected (Level, MessageId); > + ExceptionIgnored |= > + AslIsExceptionExpected (Filename, LineNumber, Level, MessageId); > > return (AslGbl_AllExceptionsDisabled || ExceptionIgnored); > } > @@ -1104,7 +1110,7 @@ AslIsExceptionIgnored ( > > /******************************************************************************* > * > - * FUNCTION: AslCheckExpectException > + * FUNCTION: AslCheckExpectedException > * > * PARAMETERS: none > * > @@ -1120,6 +1126,8 @@ AslCheckExpectedExceptions ( > void) > { > UINT8 i; > + ASL_EXPECTED_MSG_NODE *Current = AslGbl_ExpectedErrorCodeList; > + ASL_LOCATION_NODE *LocationNode; > > > for (i = 0; i < AslGbl_ExpectedMessagesIndex; ++i) > @@ -1130,12 +1138,32 @@ AslCheckExpectedExceptions ( > AslGbl_ExpectedMessages[i].MessageIdStr); > } > } > + > + while (Current) > + { > + LocationNode = Current->LocationList; > + > + while (LocationNode) > + { > + if (!LocationNode->MessageReceived) > + { > + AslCommonError (ASL_ERROR, ASL_MSG_EXCEPTION_NOT_RECEIVED, > + LocationNode->LineNumber, LocationNode->LineNumber, > + LocationNode->LogicalByteOffset, LocationNode->Column, > + LocationNode->Filename, Current->MessageIdStr); > + } > + > + LocationNode = LocationNode->Next; > + } > + > + Current = Current->Next; > + } > } > > > /******************************************************************************* > * > - * FUNCTION: AslExpectException > + * FUNCTION: AslLogExpectedException > * > * PARAMETERS: MessageIdString - ID of excepted exception during compile > * > @@ -1148,7 +1176,7 @@ AslCheckExpectedExceptions ( > ******************************************************************************/ > > ACPI_STATUS > -AslExpectException ( > +AslLogExpectedException ( > char *MessageIdString) > { > UINT32 MessageId; > @@ -1182,6 +1210,61 @@ AslExpectException ( > } > > > +/******************************************************************************* > + * > + * FUNCTION: AslLogExpectedExceptionByLine > + * > + * PARAMETERS: MessageIdString - ID of excepted exception during compile > + * > + * RETURN: Status > + * > + * DESCRIPTION: Enter a message ID into the global expected messages table > + * based on file and line number. If these messages are not raised > + * during the compilation, throw an error. > + * > + ******************************************************************************/ > + > +void > +AslLogExpectedExceptionByLine ( > + char *MessageIdString) > +{ > + ASL_LOCATION_NODE *NewErrorLocationNode; > + ASL_EXPECTED_MSG_NODE *Current = AslGbl_ExpectedErrorCodeList; > + UINT32 MessageId; > + > + > + NewErrorLocationNode = UtLocalCalloc (sizeof (ASL_LOCATION_NODE)); > + > + NewErrorLocationNode->LineNumber = AslGbl_CurrentLineNumber; > + NewErrorLocationNode->Filename = AslGbl_Files[ASL_FILE_INPUT].Filename; > + NewErrorLocationNode->LogicalByteOffset = AslGbl_CurrentLineOffset; > + NewErrorLocationNode->Column = AslGbl_CurrentColumn; > + > + MessageId = (UINT32) strtoul (MessageIdString, NULL, 0); > + > + /* search the existing list for a matching message ID */ > + > + while (Current && Current->MessageId != MessageId ) > + { > + Current = Current->Next; > + } > + if (!Current) > + { > + /* ID was not found, create a new node for this message ID */ > + > + Current = UtLocalCalloc (sizeof (ASL_EXPECTED_MSG_NODE)); > + > + Current->Next = AslGbl_ExpectedErrorCodeList; > + Current->MessageIdStr = MessageIdString; > + Current->MessageId = MessageId; > + AslGbl_ExpectedErrorCodeList = Current; > + } > + > + NewErrorLocationNode->Next = Current->LocationList; > + Current->LocationList = NewErrorLocationNode; > +} > + > + > /******************************************************************************* > * > * FUNCTION: AslDisableException > @@ -1272,6 +1355,7 @@ AslElevateException ( > return (AE_OK); > } > > + > /******************************************************************************* > * > * FUNCTION: AslIsExceptionDisabled > @@ -1288,9 +1372,13 @@ AslElevateException ( > > static BOOLEAN > AslIsExceptionExpected ( > + char *Filename, > + UINT32 LineNumber, > UINT8 Level, > UINT16 MessageId) > { > + ASL_EXPECTED_MSG_NODE *Current = AslGbl_ExpectedErrorCodeList; > + ASL_LOCATION_NODE *CurrentErrorLocation; > UINT32 EncodedMessageId; > UINT32 i; > > @@ -1308,6 +1396,28 @@ AslIsExceptionExpected ( > } > } > > + while (Current && Current->MessageId != EncodedMessageId) > + { > + Current = Current->Next; > + } > + if (!Current) > + { > + return (FALSE); > + } > + > + CurrentErrorLocation = Current->LocationList; > + > + while (CurrentErrorLocation) > + { > + if (!strcmp (CurrentErrorLocation->Filename, Filename) && > + CurrentErrorLocation->LineNumber == LineNumber) > + { > + return (CurrentErrorLocation->MessageReceived = TRUE); > + } > + > + CurrentErrorLocation = CurrentErrorLocation->Next; > + } > + > return (FALSE); > } > > @@ -1410,7 +1520,8 @@ AslDualParseOpError ( > > /* Check if user wants to ignore this exception */ > > - if (AslIsExceptionIgnored (Level, MainMsgId) || !MainOp) > + if (!MainOp || AslIsExceptionIgnored (MainOp->Asl.Filename, > + MainOp->Asl.LogicalLineNumber, Level, MainMsgId)) > { > return; > } > diff --git a/src/acpica/source/compiler/aslglobal.h b/src/acpica/source/compiler/aslglobal.h > index 1a66dea9..231ed876 100644 > --- a/src/acpica/source/compiler/aslglobal.h > +++ b/src/acpica/source/compiler/aslglobal.h > @@ -420,6 +420,7 @@ ASL_EXTERN char ASL_INIT_GLOBAL (*AslGbl_TableSignature, "NO > ASL_EXTERN char ASL_INIT_GLOBAL (*AslGbl_TableId, "NO_ID"); > ASL_EXTERN ASL_FILE_INFO ASL_INIT_GLOBAL (*AslGbl_Files, NULL); > ASL_EXTERN ASL_GLOBAL_FILE_NODE ASL_INIT_GLOBAL (*AslGbl_FilesList, NULL); > +ASL_EXTERN ASL_EXPECTED_MSG_NODE ASL_INIT_GLOBAL (*AslGbl_ExpectedErrorCodeList, NULL); > > /* Specific to the -q option */ > > diff --git a/src/acpica/source/compiler/aslload.c b/src/acpica/source/compiler/aslload.c > index 0d26c641..bd2fc977 100644 > --- a/src/acpica/source/compiler/aslload.c > +++ b/src/acpica/source/compiler/aslload.c > @@ -1018,6 +1018,74 @@ FinishNode: > } > > > +/******************************************************************************* > + * > + * FUNCTION: LdAnalyzeExternals > + * > + * PARAMETERS: Type1 > + * Type2 > + * > + * RETURN: BOOLEAN > + * > + * DESCRIPTION: Match Type1 and Type2 with the assumption that one might be > + * using external types and another might be using local types. > + * This should be used to compare the types found in external > + * declarations with types found in other external declarations or > + * named object declaration. This should not be used to match two > + * object type declarations. > + * > + ******************************************************************************/ > + > +static BOOLEAN > +LdTypesMatchExternType ( > + ACPI_OBJECT_TYPE Type1, > + ACPI_OBJECT_TYPE Type2) > +{ > + BOOLEAN Type1IsLocal = Type1 > ACPI_TYPE_EXTERNAL_MAX; > + BOOLEAN Type2IsLocal = Type2 > ACPI_TYPE_EXTERNAL_MAX; > + ACPI_OBJECT_TYPE ExternalType; > + ACPI_OBJECT_TYPE LocalType; > + > + > + /* > + * The inputs could represent types that are local to ACPICA or types that > + * are known externally. Some local types, such as the OperationRegion > + * field units, are defined with more granularity than ACPICA local types. > + * > + * Therefore, map the local types to the external types before matching. > + */ > + if (Type1IsLocal && !Type2IsLocal) > + { > + LocalType = Type1; > + ExternalType = Type2; > + } > + else if (!Type1IsLocal && Type2IsLocal) > + { > + LocalType = Type2; > + ExternalType = Type1; > + } > + else > + { > + return (Type1 == Type2); > + } > + > + switch (LocalType) > + { > + case ACPI_TYPE_LOCAL_REGION_FIELD: > + case ACPI_TYPE_LOCAL_BANK_FIELD: > + case ACPI_TYPE_LOCAL_INDEX_FIELD: > + > + LocalType = ACPI_TYPE_FIELD_UNIT; > + break; > + > + default: > + break; > + } > + > + return (LocalType == ExternalType); > +} > + > + > /******************************************************************************* > * > * FUNCTION: LdAnalyzeExternals > @@ -1072,12 +1140,12 @@ LdAnalyzeExternals ( > > if ((ActualOpType != ACPI_TYPE_ANY) && > (ActualExternalOpType != ACPI_TYPE_ANY) && > - (ActualExternalOpType != ActualOpType)) > + !LdTypesMatchExternType (ActualExternalOpType, ActualOpType)) > { > if (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL && > Node->Op->Asl.ParseOpcode == PARSEOP_EXTERNAL) > { > - AslDualParseOpError (ASL_ERROR, > + AslDualParseOpError (ASL_WARNING, > ASL_MSG_DUPLICATE_EXTERN_MISMATCH, Op, NULL, > ASL_MSG_DUPLICATE_EXTERN_FOUND_HERE, Node->Op, NULL); > } > @@ -1094,7 +1162,7 @@ LdAnalyzeExternals ( > ExternalOp = Node->Op; > ActualOp = Op; > } > - AslDualParseOpError (ASL_ERROR, > + AslDualParseOpError (ASL_WARNING, > ASL_MSG_DECLARATION_TYPE_MISMATCH, ExternalOp, NULL, > ASL_MSG_TYPE_MISMATCH_FOUND_HERE, ActualOp, NULL); > } > @@ -1139,18 +1207,8 @@ LdAnalyzeExternals ( > { > /* Allow update of externals of unknown type. */ > > - if (AcpiNsOpensScope (ExternalOpType)) > - { > - Node->Type = (UINT8) ExternalOpType; > - Status = AE_OK; > - } > - else > - { > - sprintf (AslGbl_MsgBuffer, "%s [%s]", Op->Asl.ExternalName, > - AcpiUtGetTypeName (Node->Type)); > - AslError (ASL_ERROR, ASL_MSG_SCOPE_TYPE, Op, AslGbl_MsgBuffer); > - Status = AE_ERROR; > - } > + Node->Type = (UINT8) ExternalOpType; > + Status = AE_OK; > } > > return (Status); > diff --git a/src/acpica/source/compiler/asloptions.c b/src/acpica/source/compiler/asloptions.c > index e3b3f8e7..4bf9465b 100644 > --- a/src/acpica/source/compiler/asloptions.c > +++ b/src/acpica/source/compiler/asloptions.c > @@ -948,7 +948,7 @@ AslDoOptions ( > return (-1); > } > > - Status = AslExpectException (AcpiGbl_Optarg); > + Status = AslLogExpectedException (AcpiGbl_Optarg); > if (ACPI_FAILURE (Status)) > { > return (-1); > diff --git a/src/acpica/source/compiler/asltypes.h b/src/acpica/source/compiler/asltypes.h > index cd54dbc0..33c547e4 100644 > --- a/src/acpica/source/compiler/asltypes.h > +++ b/src/acpica/source/compiler/asltypes.h > @@ -381,12 +381,37 @@ typedef struct asl_error_msg > > typedef struct asl_expected_message > { > - UINT32 MessageId; > - char *MessageIdStr; > - BOOLEAN MessageReceived; > + UINT32 MessageId; > + char *MessageIdStr; > + BOOLEAN MessageReceived; > > } ASL_EXPECTED_MESSAGE; > > +/* > + * An entry in the line-based expected messages list > + * > + * TBD: might be possible to merge this with ASL_EXPECTED_MESSAGE > + */ > +typedef struct asl_expected_msg_node > +{ > + struct asl_expected_msg_node *Next; > + UINT32 MessageId; > + char *MessageIdStr; > + struct asl_location_node *LocationList; > + > +} ASL_EXPECTED_MSG_NODE; > + > +typedef struct asl_location_node > +{ > + struct asl_location_node *Next; > + char *Filename; > + UINT32 LineNumber; > + UINT32 Column; > + UINT32 LogicalByteOffset; > + BOOLEAN MessageReceived; > + > +} ASL_LOCATION_NODE; > + > > /* An entry in the listing file stack (for include files) */ > > diff --git a/src/acpica/source/compiler/dtcompiler.h b/src/acpica/source/compiler/dtcompiler.h > index 9d9008a8..18de92ff 100644 > --- a/src/acpica/source/compiler/dtcompiler.h > +++ b/src/acpica/source/compiler/dtcompiler.h > @@ -461,7 +461,6 @@ DtCreateTableUnit ( > > /* dtparser - lex/yacc files */ > > -UINT64 DtCompilerParserResult; /* Expression return value */ > int > DtCompilerParserparse ( > void); > diff --git a/src/acpica/source/compiler/dtcompilerparser.l b/src/acpica/source/compiler/dtcompilerparser.l > index 28dcf6af..ecc07c48 100644 > --- a/src/acpica/source/compiler/dtcompilerparser.l > +++ b/src/acpica/source/compiler/dtcompilerparser.l > @@ -153,7 +153,6 @@ > #include "aslcompiler.h" > #include "dtcompilerparser.y.h" > > -YYSTYPE DtCompilerlval; > > #define _COMPONENT ACPI_COMPILER > ACPI_MODULE_NAME ("dtcompilerscanner") > diff --git a/src/acpica/source/compiler/dtcompilerparser.y b/src/acpica/source/compiler/dtcompilerparser.y > index 43eba4e9..e97e2a90 100644 > --- a/src/acpica/source/compiler/dtcompilerparser.y > +++ b/src/acpica/source/compiler/dtcompilerparser.y > @@ -170,7 +170,6 @@ extern char *DtCompilerParsertext; > extern DT_FIELD *AslGbl_CurrentField; > > extern int DtLabelByteOffset; > -extern UINT64 DtCompilerParserResult; /* Expression return value */ > extern UINT64 DtCompilerParserlineno; /* Current line number */ > > extern UINT32 DtTokenFirstLine; > diff --git a/src/acpica/source/compiler/dtparser.l b/src/acpica/source/compiler/dtparser.l > index ff7df507..631921df 100644 > --- a/src/acpica/source/compiler/dtparser.l > +++ b/src/acpica/source/compiler/dtparser.l > @@ -208,7 +208,7 @@ NewLine [\n] > /* > * Local support functions > */ > -YY_BUFFER_STATE LexBuffer; > +static YY_BUFFER_STATE LexBuffer; > > /****************************************************************************** > * > diff --git a/src/acpica/source/compiler/dttable1.c b/src/acpica/source/compiler/dttable1.c > index c7256b77..33df4dc2 100644 > --- a/src/acpica/source/compiler/dttable1.c > +++ b/src/acpica/source/compiler/dttable1.c > @@ -1967,11 +1967,16 @@ DtCompileIvrs ( > > switch (IvrsHeader->Type) > { > - case ACPI_IVRS_TYPE_HARDWARE: > + case ACPI_IVRS_TYPE_HARDWARE1: > > InfoTable = AcpiDmTableInfoIvrs0; > break; > > + case ACPI_IVRS_TYPE_HARDWARE2: > + > + InfoTable = AcpiDmTableInfoIvrs01; > + break; > + > case ACPI_IVRS_TYPE_MEMORY1: > case ACPI_IVRS_TYPE_MEMORY2: > case ACPI_IVRS_TYPE_MEMORY3: > @@ -1994,7 +1999,8 @@ DtCompileIvrs ( > ParentTable = DtPeekSubtable (); > DtInsertSubtable (ParentTable, Subtable); > > - if (IvrsHeader->Type == ACPI_IVRS_TYPE_HARDWARE) > + if (IvrsHeader->Type == ACPI_IVRS_TYPE_HARDWARE1 || > + IvrsHeader->Type == ACPI_IVRS_TYPE_HARDWARE2) > { > while (*PFieldList && > !strcmp ((*PFieldList)->Name, "Entry Type")) > diff --git a/src/acpica/source/compiler/dtutils.c b/src/acpica/source/compiler/dtutils.c > index 067d0ece..bb07894e 100644 > --- a/src/acpica/source/compiler/dtutils.c > +++ b/src/acpica/source/compiler/dtutils.c > @@ -189,7 +189,8 @@ DtError ( > > /* Check if user wants to ignore this exception */ > > - if (AslIsExceptionIgnored (Level, MessageId)) > + if (AslIsExceptionIgnored (AslGbl_Files[ASL_FILE_INPUT].Filename, > + FieldObject->Line, Level, MessageId)) > { > return; > } > diff --git a/src/acpica/source/compiler/prparser.l b/src/acpica/source/compiler/prparser.l > index 65595fa8..8752d3fc 100644 > --- a/src/acpica/source/compiler/prparser.l > +++ b/src/acpica/source/compiler/prparser.l > @@ -224,7 +224,7 @@ Identifier [a-zA-Z][0-9a-zA-Z]* > /* > * Local support functions > */ > -YY_BUFFER_STATE LexBuffer; > +static YY_BUFFER_STATE LexBuffer; > > > /****************************************************************************** > diff --git a/src/acpica/source/components/debugger/dbinput.c b/src/acpica/source/components/debugger/dbinput.c > index 0bfe9947..378e3db1 100644 > --- a/src/acpica/source/components/debugger/dbinput.c > +++ b/src/acpica/source/components/debugger/dbinput.c > @@ -637,19 +637,16 @@ AcpiDbGetNextToken ( > return (NULL); > } > > - /* Remove any spaces at the beginning */ > + /* Remove any spaces at the beginning, ignore blank lines */ > > - if (*String == ' ') > + while (*String && isspace (*String)) > { > - while (*String && (*String == ' ')) > - { > - String++; > - } > + String++; > + } > > - if (!(*String)) > - { > - return (NULL); > - } > + if (!(*String)) > + { > + return (NULL); > } > > switch (*String) > @@ -754,7 +751,7 @@ AcpiDbGetNextToken ( > > /* Find end of token */ > > - while (*String && (*String != ' ')) > + while (*String && !isspace (*String)) > { > String++; > } > diff --git a/src/acpica/source/components/debugger/dbxface.c b/src/acpica/source/components/debugger/dbxface.c > index e7d354d8..f84db8c9 100644 > --- a/src/acpica/source/components/debugger/dbxface.c > +++ b/src/acpica/source/components/debugger/dbxface.c > @@ -594,6 +594,7 @@ AcpiInitializeDebugger ( > AcpiGbl_DbOutputFlags = ACPI_DB_CONSOLE_OUTPUT; > > AcpiGbl_DbOpt_NoIniMethods = FALSE; > + AcpiGbl_DbOpt_NoRegionSupport = FALSE; > > AcpiGbl_DbBuffer = AcpiOsAllocate (ACPI_DEBUG_BUFFER_SIZE); > if (!AcpiGbl_DbBuffer) > diff --git a/src/acpica/source/components/dispatcher/dswexec.c b/src/acpica/source/components/dispatcher/dswexec.c > index f2925ecf..3fa7b95b 100644 > --- a/src/acpica/source/components/dispatcher/dswexec.c > +++ b/src/acpica/source/components/dispatcher/dswexec.c > @@ -158,7 +158,9 @@ > #include "acinterp.h" > #include "acnamesp.h" > #include "acdebug.h" > - > +#ifdef ACPI_EXEC_APP > +#include "aecommon.h" > +#endif > > #define _COMPONENT ACPI_DISPATCHER > ACPI_MODULE_NAME ("dswexec") > @@ -504,7 +506,10 @@ AcpiDsExecEndOp ( > UINT32 OpClass; > ACPI_PARSE_OBJECT *NextOp; > ACPI_PARSE_OBJECT *FirstArg; > - > +#ifdef ACPI_EXEC_APP > + char *Namepath; > + ACPI_OPERAND_OBJECT *ObjDesc; > +#endif > > ACPI_FUNCTION_TRACE_PTR (DsExecEndOp, WalkState); > > @@ -717,6 +722,29 @@ AcpiDsExecEndOp ( > } > > Status = AcpiDsEvalBufferFieldOperands (WalkState, Op); > + if (ACPI_FAILURE (Status)) > + { > + break; > + } > + > +#ifdef ACPI_EXEC_APP > + /* > + * AcpiExec support for namespace initialization file (initialize > + * BufferFields in this code.) > + */ > + Namepath = AcpiNsGetExternalPathname (Op->Common.Node); > + Status = AeLookupInitFileEntry (Namepath, &ObjDesc); > + if (ACPI_SUCCESS (Status)) > + { > + Status = AcpiExWriteDataToField (ObjDesc, Op->Common.Node->Object, NULL); > + if ACPI_FAILURE (Status) > + { > + ACPI_EXCEPTION ((AE_INFO, Status, "While writing to buffer field")); > + } > + } > + ACPI_FREE (Namepath); > + Status = AE_OK; > +#endif > break; > > > diff --git a/src/acpica/source/components/dispatcher/dswload.c b/src/acpica/source/components/dispatcher/dswload.c > index d37bd5d4..62a4fdca 100644 > --- a/src/acpica/source/components/dispatcher/dswload.c > +++ b/src/acpica/source/components/dispatcher/dswload.c > @@ -156,7 +156,6 @@ > #include "acdispat.h" > #include "acinterp.h" > #include "acnamesp.h" > - > #ifdef ACPI_ASL_COMPILER > #include "acdisasm.h" > #endif > @@ -555,7 +554,6 @@ AcpiDsLoad1EndOp ( > ACPI_PARSE_OBJECT *Op; > ACPI_OBJECT_TYPE ObjectType; > ACPI_STATUS Status = AE_OK; > - > #ifdef ACPI_ASL_COMPILER > UINT8 ParamCount; > #endif > diff --git a/src/acpica/source/components/dispatcher/dswload2.c b/src/acpica/source/components/dispatcher/dswload2.c > index ff2135ce..0ab715cd 100644 > --- a/src/acpica/source/components/dispatcher/dswload2.c > +++ b/src/acpica/source/components/dispatcher/dswload2.c > @@ -157,6 +157,9 @@ > #include "acinterp.h" > #include "acnamesp.h" > #include "acevents.h" > +#ifdef ACPI_EXEC_APP > +#include "aecommon.h" > +#endif > > #define _COMPONENT ACPI_DISPATCHER > ACPI_MODULE_NAME ("dswload2") > @@ -531,6 +534,10 @@ AcpiDsLoad2EndOp ( > ACPI_NAMESPACE_NODE *NewNode; > UINT32 i; > UINT8 RegionSpace; > +#ifdef ACPI_EXEC_APP > + ACPI_OPERAND_OBJECT *ObjDesc; > + char *Namepath; > +#endif > > > ACPI_FUNCTION_TRACE (DsLoad2EndOp); > @@ -627,6 +634,11 @@ AcpiDsLoad2EndOp ( > * be evaluated later during the execution phase > */ > Status = AcpiDsCreateBufferField (Op, WalkState); > + if ACPI_FAILURE (Status) > + { > + ACPI_EXCEPTION ((AE_INFO, Status, "CreateBufferField failure")); > + goto Cleanup; > + } > break; > > case AML_TYPE_NAMED_FIELD: > @@ -766,6 +778,31 @@ AcpiDsLoad2EndOp ( > case AML_NAME_OP: > > Status = AcpiDsCreateNode (WalkState, Node, Op); > + if (ACPI_FAILURE (Status)) > + { > + goto Cleanup; > + } > + > +#ifdef ACPI_EXEC_APP > + /* > + * AcpiExec support for namespace initialization file (initialize > + * Name opcodes in this code.) > + */ > + Namepath = AcpiNsGetExternalPathname (Node); > + Status = AeLookupInitFileEntry (Namepath, &ObjDesc); > + if (ACPI_SUCCESS (Status)) > + { > + /* Detach any existing object, attach new object */ > + > + if (Node->Object) > + { > + AcpiNsDetachObject (Node); > + } > + AcpiNsAttachObject (Node, ObjDesc, ObjDesc->Common.Type); > + } > + ACPI_FREE (Namepath); > + Status = AE_OK; > +#endif > break; > > case AML_METHOD_OP: > diff --git a/src/acpica/source/components/hardware/hwsleep.c b/src/acpica/source/components/hardware/hwsleep.c > index 016f62be..d503f1cf 100644 > --- a/src/acpica/source/components/hardware/hwsleep.c > +++ b/src/acpica/source/components/hardware/hwsleep.c > @@ -466,11 +466,11 @@ AcpiHwLegacyWake ( > > /* Enable sleep button */ > > - (void) AcpiWriteBitRegister ( > + (void) AcpiWriteBitRegister ( > AcpiGbl_FixedEventInfo[ACPI_EVENT_SLEEP_BUTTON].EnableRegisterId, > ACPI_ENABLE_EVENT); > > - (void) AcpiWriteBitRegister ( > + (void) AcpiWriteBitRegister ( > AcpiGbl_FixedEventInfo[ACPI_EVENT_SLEEP_BUTTON].StatusRegisterId, > ACPI_CLEAR_STATUS); > > diff --git a/src/acpica/source/components/namespace/nsnames.c b/src/acpica/source/components/namespace/nsnames.c > index a9509195..a27a87f0 100644 > --- a/src/acpica/source/components/namespace/nsnames.c > +++ b/src/acpica/source/components/namespace/nsnames.c > @@ -158,12 +158,6 @@ > #define _COMPONENT ACPI_NAMESPACE > ACPI_MODULE_NAME ("nsnames") > > -/* Local Prototypes */ > - > -static void > -AcpiNsNormalizePathname ( > - char *OriginalPath); > - > > /******************************************************************************* > * > @@ -616,7 +610,7 @@ Cleanup: > * > ******************************************************************************/ > > -static void > +void > AcpiNsNormalizePathname ( > char *OriginalPath) > { > diff --git a/src/acpica/source/components/utilities/utdecode.c b/src/acpica/source/components/utilities/utdecode.c > index aec32969..01b1823e 100644 > --- a/src/acpica/source/components/utilities/utdecode.c > +++ b/src/acpica/source/components/utilities/utdecode.c > @@ -224,7 +224,7 @@ const char *AcpiGbl_RegionTypes[ACPI_NUM_PREDEFINED_REGIONS] = > "IPMI", /* 0x07 */ > "GeneralPurposeIo", /* 0x08 */ > "GenericSerialBus", /* 0x09 */ > - "PlatformCommChannel"/* 0x0A */ > + "PCC" /* 0x0A */ > }; > > > diff --git a/src/acpica/source/components/utilities/utdelete.c b/src/acpica/source/components/utilities/utdelete.c > index 2f60917b..502ff413 100644 > --- a/src/acpica/source/components/utilities/utdelete.c > +++ b/src/acpica/source/components/utilities/utdelete.c > @@ -626,13 +626,13 @@ AcpiUtUpdateRefCount ( > * > * FUNCTION: AcpiUtUpdateObjectReference > * > - * PARAMETERS: Object - Increment ref count for this object > - * and all sub-objects > + * PARAMETERS: Object - Increment or decrement the ref count for > + * this object and all sub-objects > * Action - Either REF_INCREMENT or REF_DECREMENT > * > * RETURN: Status > * > - * DESCRIPTION: Increment the object reference count > + * DESCRIPTION: Increment or decrement the object reference count > * > * Object references are incremented when: > * 1) An object is attached to a Node (namespace object) > @@ -671,7 +671,7 @@ AcpiUtUpdateObjectReference ( > } > > /* > - * All sub-objects must have their reference count incremented > + * All sub-objects must have their reference count updated > * also. Different object types have different subobjects. > */ > switch (Object->Common.Type) > @@ -740,6 +740,7 @@ AcpiUtUpdateObjectReference ( > break; > } > } > + > NextObject = NULL; > break; > > diff --git a/src/acpica/source/include/acdisasm.h b/src/acpica/source/include/acdisasm.h > index 960af4b0..d0ffe390 100644 > --- a/src/acpica/source/include/acdisasm.h > +++ b/src/acpica/source/include/acdisasm.h > @@ -457,6 +457,7 @@ extern ACPI_DMTABLE_INFO AcpiDmTableInfoIortMap[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoIortPad[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoIvrs[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoIvrs0[]; > +extern ACPI_DMTABLE_INFO AcpiDmTableInfoIvrs01[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoIvrs1[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoIvrs4[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoIvrs8a[]; > diff --git a/src/acpica/source/include/acnamesp.h b/src/acpica/source/include/acnamesp.h > index 3dd605a0..48b36593 100644 > --- a/src/acpica/source/include/acnamesp.h > +++ b/src/acpica/source/include/acnamesp.h > @@ -487,6 +487,10 @@ AcpiNsBuildNormalizedPath ( > UINT32 PathSize, > BOOLEAN NoTrailing); > > +void > +AcpiNsNormalizePathname ( > + char *OriginalPath); > + > char * > AcpiNsGetNormalizedPathname ( > ACPI_NAMESPACE_NODE *Node, > diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h > index a39d180e..eeb63cd5 100644 > --- a/src/acpica/source/include/acpixf.h > +++ b/src/acpica/source/include/acpixf.h > @@ -154,7 +154,7 @@ > > /* Current ACPICA subsystem version in YYYYMMDD format */ > > -#define ACPI_CA_VERSION 0x20200214 > +#define ACPI_CA_VERSION 0x20200326 > > #include "acconfig.h" > #include "actypes.h" > diff --git a/src/acpica/source/include/actbinfo.h b/src/acpica/source/include/actbinfo.h > index 74da8bac..59c38a29 100644 > --- a/src/acpica/source/include/actbinfo.h > +++ b/src/acpica/source/include/actbinfo.h > @@ -264,7 +264,8 @@ > #define ACPI_IORTH_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_IORT_NODE,f) > #define ACPI_IORTM_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_IORT_ID_MAPPING,f) > #define ACPI_IVRSH_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_IVRS_HEADER,f) > -#define ACPI_IVRS0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_IVRS_HARDWARE,f) > +#define ACPI_IVRS0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_IVRS_HARDWARE1,f) > +#define ACPI_IVRS01_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_IVRS_HARDWARE2,f) > #define ACPI_IVRS1_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_IVRS_MEMORY,f) > #define ACPI_IVRSD_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_IVRS_DE_HEADER,f) > #define ACPI_IVRS8A_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_IVRS_DEVICE8A,f) > diff --git a/src/acpica/source/include/actbl2.h b/src/acpica/source/include/actbl2.h > index fe17576b..2f1dd299 100644 > --- a/src/acpica/source/include/actbl2.h > +++ b/src/acpica/source/include/actbl2.h > @@ -187,6 +187,7 @@ > #define ACPI_SIG_SBST "SBST" /* Smart Battery Specification Table */ > #define ACPI_SIG_SDEI "SDEI" /* Software Delegated Exception Interface Table */ > #define ACPI_SIG_SDEV "SDEV" /* Secure Devices table */ > +#define ACPI_SIG_NHLT "NHLT" /* Non-HDAudio Link Table */ > > > /* > @@ -457,7 +458,8 @@ typedef struct acpi_ivrs_header > > enum AcpiIvrsType > { > - ACPI_IVRS_TYPE_HARDWARE = 0x10, > + ACPI_IVRS_TYPE_HARDWARE1 = 0x10, > + ACPI_IVRS_TYPE_HARDWARE2 = 0x11, > ACPI_IVRS_TYPE_MEMORY1 = 0x20, > ACPI_IVRS_TYPE_MEMORY2 = 0x21, > ACPI_IVRS_TYPE_MEMORY3 = 0x22 > @@ -485,16 +487,30 @@ enum AcpiIvrsType > > /* 0x10: I/O Virtualization Hardware Definition Block (IVHD) */ > > -typedef struct acpi_ivrs_hardware > +typedef struct acpi_ivrs_hardware_10 > { > ACPI_IVRS_HEADER Header; > UINT16 CapabilityOffset; /* Offset for IOMMU control fields */ > UINT64 BaseAddress; /* IOMMU control registers */ > UINT16 PciSegmentGroup; > UINT16 Info; /* MSI number and unit ID */ > - UINT32 Reserved; > + UINT32 FeatureReporting; > + > +} ACPI_IVRS_HARDWARE1; > + > +/* 0x11: I/O Virtualization Hardware Definition Block (IVHD) */ > > -} ACPI_IVRS_HARDWARE; > +typedef struct acpi_ivrs_hardware_11 > +{ > + ACPI_IVRS_HEADER Header; > + UINT16 CapabilityOffset; /* Offset for IOMMU control fields */ > + UINT64 BaseAddress; /* IOMMU control registers */ > + UINT16 PciSegmentGroup; > + UINT16 Info; /* MSI number and unit ID */ > + UINT32 Attributes; > + UINT64 EfrRegisterImage; > + UINT64 Reserved; > +} ACPI_IVRS_HARDWARE2; > > /* Masks for Info field above */ > > diff --git a/src/acpica/source/include/actbl3.h b/src/acpica/source/include/actbl3.h > index cfae7c42..74d4648a 100644 > --- a/src/acpica/source/include/actbl3.h > +++ b/src/acpica/source/include/actbl3.h > @@ -183,7 +183,7 @@ > #define ACPI_SIG_WDDT "WDDT" /* Watchdog Timer Description Table */ > #define ACPI_SIG_WDRT "WDRT" /* Watchdog Resource Table */ > #define ACPI_SIG_WPBT "WPBT" /* Windows Platform Binary Table */ > -#define ACPI_SIG_WSMT "WSMT" /* Windows SMM Security Migrations Table */ > +#define ACPI_SIG_WSMT "WSMT" /* Windows SMM Security Mitigations Table */ > #define ACPI_SIG_XENV "XENV" /* Xen Environment table */ > #define ACPI_SIG_XXXX "XXXX" /* Intermediate AML header for ASL/ASL+ converter */ > > @@ -904,10 +904,10 @@ typedef struct acpi_table_wpbt > > /******************************************************************************* > * > - * WSMT - Windows SMM Security Migrations Table > + * WSMT - Windows SMM Security Mitigations Table > * Version 1 > * > - * Conforms to "Windows SMM Security Migrations Table", > + * Conforms to "Windows SMM Security Mitigations Table", > * Version 1.0, April 18, 2016 > * > ******************************************************************************/ > diff --git a/src/acpica/source/include/acuuid.h b/src/acpica/source/include/acuuid.h > index bcbf6b1d..b856219c 100644 > --- a/src/acpica/source/include/acuuid.h > +++ b/src/acpica/source/include/acuuid.h > @@ -200,4 +200,4 @@ > #define UUID_DEVICE_PROPERTIES "daffd814-6eba-4d8c-8a91-bc9bbf4aa301" > > > -#endif /* __AUUID_H__ */ > +#endif /* __ACUUID_H__ */ > diff --git a/src/acpica/source/tools/acpiexec/aecommon.h b/src/acpica/source/tools/acpiexec/aecommon.h > index d9ade0b6..9dbb3fac 100644 > --- a/src/acpica/source/tools/acpiexec/aecommon.h > +++ b/src/acpica/source/tools/acpiexec/aecommon.h > @@ -195,7 +195,9 @@ typedef struct ae_debug_regions > typedef struct init_file_entry > { > char *Name; > + char *Value; > ACPI_OPERAND_OBJECT *ObjDesc; > + BOOLEAN IsUsed; > > } INIT_FILE_ENTRY; > > @@ -346,19 +348,23 @@ int > AeOpenInitializationFile ( > char *Filename); > > -void > +ACPI_STATUS > AeProcessInitFile ( > void); > > -ACPI_STATUS > -AeSetupConfiguration ( > - void *RegionAddr); > - > ACPI_STATUS > AeLookupInitFileEntry ( > char *Pathname, > ACPI_OPERAND_OBJECT **ObjDesc); > > +void > +AeDisplayUnusedInitFileItems ( > + void); > + > +void > +AeDeleteInitFileList ( > + void); > + > /* aeexec */ > > void > @@ -376,6 +382,10 @@ AeGetDevices ( > void *Context, > void **ReturnValue); > > +ACPI_STATUS > +AeSetupConfiguration ( > + void *RegionAddr); > + > ACPI_STATUS > ExecuteOSI ( > char *OsiString, > diff --git a/src/acpica/source/tools/acpiexec/aeinitfile.c b/src/acpica/source/tools/acpiexec/aeinitfile.c > index 0813c873..ce758ed1 100644 > --- a/src/acpica/source/tools/acpiexec/aeinitfile.c > +++ b/src/acpica/source/tools/acpiexec/aeinitfile.c > @@ -151,24 +151,17 @@ > > #include "aecommon.h" > #include "acdispat.h" > +#include "acnamesp.h" > + > > #define _COMPONENT ACPI_TOOLS > ACPI_MODULE_NAME ("aeinitfile") > > > -/* Local prototypes */ > - > -static void > -AeEnterInitFileEntry ( > - INIT_FILE_ENTRY InitEntry, > - ACPI_WALK_STATE *WalkState); > - > - > #define AE_FILE_BUFFER_SIZE 512 > > static char LineBuffer[AE_FILE_BUFFER_SIZE]; > static char NameBuffer[AE_FILE_BUFFER_SIZE]; > -static char ValueBuffer[AE_FILE_BUFFER_SIZE]; > static FILE *InitFile; > > > @@ -211,23 +204,23 @@ AeOpenInitializationFile ( > * RETURN: None > * > * DESCRIPTION: Read the initialization file and perform all namespace > - * initializations. AcpiGbl_InitEntries will be used for region > - * field initialization. > + * initializations. AcpiGbl_InitEntries will be used for all > + * object initialization. > * > * NOTE: The format of the file is multiple lines, each of format: > - * <ACPI-pathname> <Integer Value> > + * <ACPI-pathname> <New Value> > * > *****************************************************************************/ > > -void > -AeProcessInitFile( > +ACPI_STATUS > +AeProcessInitFile ( > void) > { > ACPI_WALK_STATE *WalkState; > UINT64 idx; > - ACPI_STATUS Status; > + ACPI_STATUS Status = AE_OK; > char *Token; > - char *ObjectBuffer; > + char *ValueBuffer; > char *TempNameBuffer; > ACPI_OBJECT_TYPE Type; > ACPI_OBJECT TempObject; > @@ -235,13 +228,14 @@ AeProcessInitFile( > > if (!InitFile) > { > - return; > + return (AE_OK); > } > > /* Create needed objects to be reused for each init entry */ > > WalkState = AcpiDsCreateWalkState (0, NULL, NULL, NULL); > NameBuffer[0] = '\\'; > + NameBuffer[1] = 0; > > while (fgets (LineBuffer, AE_FILE_BUFFER_SIZE, InitFile) != NULL) > { > @@ -249,12 +243,20 @@ AeProcessInitFile( > } > rewind (InitFile); > > + /* > + * Allocate and populate the Gbl_InitEntries array > + */ > AcpiGbl_InitEntries = > - AcpiOsAllocate (sizeof (INIT_FILE_ENTRY) * AcpiGbl_InitFileLineCount); > + AcpiOsAllocateZeroed (sizeof (INIT_FILE_ENTRY) * AcpiGbl_InitFileLineCount); > for (idx = 0; fgets (LineBuffer, AE_FILE_BUFFER_SIZE, InitFile); ++idx) > { > - > TempNameBuffer = AcpiDbGetNextToken (LineBuffer, &Token, &Type); > + if (!TempNameBuffer) > + { > + AcpiGbl_InitEntries[idx].Name = NULL; > + continue; > + } > + > if (LineBuffer[0] == '\\') > { > strcpy (NameBuffer, TempNameBuffer); > @@ -266,48 +268,67 @@ AeProcessInitFile( > strcpy (NameBuffer + 1, TempNameBuffer); > } > > + AcpiNsNormalizePathname (NameBuffer); > AcpiGbl_InitEntries[idx].Name = > AcpiOsAllocateZeroed (strnlen (NameBuffer, AE_FILE_BUFFER_SIZE) + 1); > - > strcpy (AcpiGbl_InitEntries[idx].Name, NameBuffer); > > - ObjectBuffer = AcpiDbGetNextToken (Token, &Token, &Type); > + ValueBuffer = AcpiDbGetNextToken (Token, &Token, &Type); > + if (!ValueBuffer) > + { > + AcpiGbl_InitEntries[idx].Value = NULL; > + continue; > + } > + > + AcpiGbl_InitEntries[idx].Value = > + AcpiOsAllocateZeroed (strnlen (ValueBuffer, AE_FILE_BUFFER_SIZE) + 1); > + strcpy (AcpiGbl_InitEntries[idx].Value, ValueBuffer); > > if (Type == ACPI_TYPE_FIELD_UNIT) > { > - Status = AcpiDbConvertToObject (ACPI_TYPE_BUFFER, ObjectBuffer, > + Status = AcpiDbConvertToObject (ACPI_TYPE_BUFFER, ValueBuffer, > &TempObject); > } > else > { > - Status = AcpiDbConvertToObject (Type, ObjectBuffer, &TempObject); > + Status = AcpiDbConvertToObject (Type, ValueBuffer, &TempObject); > + } > + > + if (ACPI_FAILURE (Status)) > + { > + AcpiOsPrintf ("%s[%s]: %s\n", NameBuffer, AcpiUtGetTypeName (Type), > + AcpiFormatException (Status)); > + goto CleanupAndExit; > } > > Status = AcpiUtCopyEobjectToIobject (&TempObject, > &AcpiGbl_InitEntries[idx].ObjDesc); > > - if (Type == ACPI_TYPE_BUFFER || Type == ACPI_TYPE_FIELD_UNIT) > + /* Cleanup the external object created by DbConvertToObject above */ > + > + if (ACPI_SUCCESS (Status)) > { > - ACPI_FREE (TempObject.Buffer.Pointer); > + if (Type == ACPI_TYPE_BUFFER || Type == ACPI_TYPE_FIELD_UNIT) > + { > + ACPI_FREE (TempObject.Buffer.Pointer); > + } > + else if (Type == ACPI_TYPE_PACKAGE) > + { > + AcpiDbDeleteObjects (1, &TempObject); > + } > } > - > - if (ACPI_FAILURE (Status)) > + else > { > - AcpiOsPrintf ("%s %s\n", ValueBuffer, > + AcpiOsPrintf ("%s[%s]: %s\n", NameBuffer, AcpiUtGetTypeName (Type), > AcpiFormatException (Status)); > goto CleanupAndExit; > } > > /* > - * Special case for field units. Field units are dependent on the > - * parent region. This parent region has yet to be created so defer the > - * initialization until the dispatcher. For all other types, initialize > - * the namespace node with the value found in the init file. > + * Initialize the namespace node with the value found in the init file. > */ > - if (Type != ACPI_TYPE_FIELD_UNIT) > - { > - AeEnterInitFileEntry (AcpiGbl_InitEntries[idx], WalkState); > - } > + AcpiOsPrintf ("Namespace object init from file: %16s, Value \"%s\", Type %s\n", > + AcpiGbl_InitEntries[idx].Name, AcpiGbl_InitEntries[idx].Value, AcpiUtGetTypeName (Type)); > } > > /* Cleanup */ > @@ -315,97 +336,130 @@ AeProcessInitFile( > CleanupAndExit: > fclose (InitFile); > AcpiDsDeleteWalkState (WalkState); > + return (Status); > } > > > /****************************************************************************** > * > - * FUNCTION: AeInitFileEntry > - * > - * PARAMETERS: InitEntry - Entry of the init file > - * WalkState - Used for the Store operation > + * FUNCTION: AeLookupInitFileEntry > * > - * RETURN: None > + * PARAMETERS: Pathname - AML namepath in external format > + * ObjDesc - Where the object is returned if it exists > * > - * DESCRIPTION: Perform initialization of a single namespace object > + * RETURN: Status. AE_OK if a match was found > * > - * Note: namespace of objects are limited to integers and region > - * fields units of 8 bytes at this time. > + * DESCRIPTION: Search the init file for a particular name and its value. > * > *****************************************************************************/ > > -static void > -AeEnterInitFileEntry ( > - INIT_FILE_ENTRY InitEntry, > - ACPI_WALK_STATE *WalkState) > +ACPI_STATUS > +AeLookupInitFileEntry ( > + char *Pathname, > + ACPI_OPERAND_OBJECT **ObjDesc) > { > - char *Pathname = InitEntry.Name; > - ACPI_OPERAND_OBJECT *ObjDesc = InitEntry.ObjDesc; > - ACPI_NAMESPACE_NODE *NewNode; > - ACPI_STATUS Status; > + UINT32 i; > > + ACPI_FUNCTION_TRACE (AeLookupInitFileEntry); > > - Status = AcpiNsLookup (NULL, Pathname, ObjDesc->Common.Type, > - ACPI_IMODE_LOAD_PASS2, ACPI_NS_ERROR_IF_FOUND | ACPI_NS_NO_UPSEARCH | > - ACPI_NS_EARLY_INIT, NULL, &NewNode); > - if (ACPI_FAILURE (Status)) > + ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Lookup: %s\n", Pathname)); > + > + if (!AcpiGbl_InitEntries) > { > - ACPI_EXCEPTION ((AE_INFO, Status, > - "While creating name from namespace initialization file: %s", > - Pathname)); > - return; > + return (AE_NOT_FOUND); > } > > - /* Store pointer to value descriptor in the Node */ > + AcpiNsNormalizePathname (Pathname); > > - Status = AcpiNsAttachObject (NewNode, ObjDesc, > - ObjDesc->Common.Type); > - if (ACPI_FAILURE (Status)) > + for (i = 0; i < AcpiGbl_InitFileLineCount; ++i) > { > - ACPI_EXCEPTION ((AE_INFO, Status, > - "While attaching object to node from namespace initialization file: %s", > - Pathname)); > - return; > + if (AcpiGbl_InitEntries[i].Name && > + !strcmp (AcpiGbl_InitEntries[i].Name, Pathname)) > + { > + *ObjDesc = AcpiGbl_InitEntries[i].ObjDesc; > + AcpiGbl_InitEntries[i].IsUsed = TRUE; > + ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Found match: %s, %p\n", Pathname, *ObjDesc)); > + return_ACPI_STATUS (AE_OK); > + } > } > > - /* Remove local reference to the object */ > + ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "No match found: %s\n", Pathname)); > + return_ACPI_STATUS (AE_NOT_FOUND); > +} > + > + > +/****************************************************************************** > + * > + * FUNCTION: AeDisplayUnusedInitFileItems > + * > + * PARAMETERS: None > + * > + * RETURN: None > + * > + * DESCRIPTION: Display all init file items that have not been referenced > + * (i.e., items that have not been found in the namespace). > + * > + *****************************************************************************/ > + > +void > +AeDisplayUnusedInitFileItems ( > + void) > +{ > + UINT32 i; > + > + > + if (!AcpiGbl_InitEntries) > + { > + return; > + } > > - AcpiUtRemoveReference (ObjDesc); > + for (i = 0; i < AcpiGbl_InitFileLineCount; ++i) > + { > + if (AcpiGbl_InitEntries[i].Name && > + !AcpiGbl_InitEntries[i].IsUsed) > + { > + AcpiOsPrintf ("Init file entry not found in namespace " > + "(or is a non-data type): %s\n", > + AcpiGbl_InitEntries[i].Name); > + } > + } > } > > > /****************************************************************************** > * > - * FUNCTION: AeLookupInitFileEntry > + * FUNCTION: AeDeleteInitFileList > * > - * PARAMETERS: Pathname - AML namepath in external format > - * ValueString - value of the namepath if it exitst > + * PARAMETERS: None > * > * RETURN: None > * > - * DESCRIPTION: Search the init file for a particular name and its value. > + * DESCRIPTION: Delete the global namespace initialization file data > * > *****************************************************************************/ > > -ACPI_STATUS > -AeLookupInitFileEntry ( > - char *Pathname, > - ACPI_OPERAND_OBJECT **ObjDesc) > +void > +AeDeleteInitFileList ( > + void) > { > UINT32 i; > > + > if (!AcpiGbl_InitEntries) > { > - return AE_NOT_FOUND; > + return; > } > > for (i = 0; i < AcpiGbl_InitFileLineCount; ++i) > { > - if (!strcmp(AcpiGbl_InitEntries[i].Name, Pathname)) > + > + if ((AcpiGbl_InitEntries[i].ObjDesc) && (AcpiGbl_InitEntries[i].Value)) > { > - *ObjDesc = AcpiGbl_InitEntries[i].ObjDesc; > - return AE_OK; > + /* Remove one reference on the object (and all subobjects) */ > + > + AcpiUtRemoveReference (AcpiGbl_InitEntries[i].ObjDesc); > } > } > - return AE_NOT_FOUND; > + > + AcpiOsFree (AcpiGbl_InitEntries); > } > Acked-by: Ivan Hu <ivan.hu@canonical.com>
diff --git a/src/acpica/source/common/ahtable.c b/src/acpica/source/common/ahtable.c index 25fd525e..32d5dedb 100644 --- a/src/acpica/source/common/ahtable.c +++ b/src/acpica/source/common/ahtable.c @@ -258,7 +258,7 @@ const AH_TABLE AcpiGbl_SupportedTables[] = {ACPI_SIG_WDDT, "Watchdog Description Table"}, {ACPI_SIG_WDRT, "Watchdog Resource Table"}, {ACPI_SIG_WPBT, "Windows Platform Binary Table"}, - {ACPI_SIG_WSMT, "Windows SMM Security Migrations Table"}, + {ACPI_SIG_WSMT, "Windows SMM Security Mitigations Table"}, {ACPI_SIG_XENV, "Xen Environment table"}, {ACPI_SIG_XSDT, "Extended System Description Table"}, {NULL, NULL} diff --git a/src/acpica/source/common/dmtable.c b/src/acpica/source/common/dmtable.c index 02220d26..5896b2f2 100644 --- a/src/acpica/source/common/dmtable.c +++ b/src/acpica/source/common/dmtable.c @@ -1676,7 +1676,8 @@ AcpiDmDumpTable ( Temp8 = *Target; switch (Temp8) { - case ACPI_IVRS_TYPE_HARDWARE: + case ACPI_IVRS_TYPE_HARDWARE1: + case ACPI_IVRS_TYPE_HARDWARE2: Name = AcpiDmIvrsSubnames[0]; break; diff --git a/src/acpica/source/common/dmtbdump2.c b/src/acpica/source/common/dmtbdump2.c index 95eea6d9..688a2cf9 100644 --- a/src/acpica/source/common/dmtbdump2.c +++ b/src/acpica/source/common/dmtbdump2.c @@ -475,11 +475,16 @@ AcpiDmDumpIvrs ( switch (Subtable->Type) { - case ACPI_IVRS_TYPE_HARDWARE: + case ACPI_IVRS_TYPE_HARDWARE1: InfoTable = AcpiDmTableInfoIvrs0; break; + case ACPI_IVRS_TYPE_HARDWARE2: + + InfoTable = AcpiDmTableInfoIvrs01; + break; + case ACPI_IVRS_TYPE_MEMORY1: case ACPI_IVRS_TYPE_MEMORY2: case ACPI_IVRS_TYPE_MEMORY3: @@ -514,11 +519,21 @@ AcpiDmDumpIvrs ( /* The hardware subtable can contain multiple device entries */ - if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE) + if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE1 || + Subtable->Type == ACPI_IVRS_TYPE_HARDWARE2) { - EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE); - DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, Subtable, - sizeof (ACPI_IVRS_HARDWARE)); + if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE1) + { + EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE1); + DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, Subtable, + sizeof (ACPI_IVRS_HARDWARE1)); + } + else if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE2) + { + EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE2); + DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, Subtable, + sizeof (ACPI_IVRS_HARDWARE2)); + } while (EntryOffset < (Offset + Subtable->Length)) { diff --git a/src/acpica/source/common/dmtbinfo2.c b/src/acpica/source/common/dmtbinfo2.c index 79802830..c000a921 100644 --- a/src/acpica/source/common/dmtbinfo2.c +++ b/src/acpica/source/common/dmtbinfo2.c @@ -403,7 +403,21 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoIvrs0[] = {ACPI_DMT_UINT64, ACPI_IVRS0_OFFSET (BaseAddress), "Base Address", 0}, {ACPI_DMT_UINT16, ACPI_IVRS0_OFFSET (PciSegmentGroup), "PCI Segment Group", 0}, {ACPI_DMT_UINT16, ACPI_IVRS0_OFFSET (Info), "Virtualization Info", 0}, - {ACPI_DMT_UINT32, ACPI_IVRS0_OFFSET (Reserved), "Reserved", 0}, + {ACPI_DMT_UINT32, ACPI_IVRS0_OFFSET (FeatureReporting), "Feature Reporting", 0}, + ACPI_DMT_TERMINATOR +}; + +/* 0x10: I/O Virtualization Hardware Definition (IVHD) Block */ + +ACPI_DMTABLE_INFO AcpiDmTableInfoIvrs01[] = +{ + {ACPI_DMT_UINT16, ACPI_IVRS01_OFFSET (CapabilityOffset), "Capability Offset", 0}, + {ACPI_DMT_UINT64, ACPI_IVRS01_OFFSET (BaseAddress), "Base Address", 0}, + {ACPI_DMT_UINT16, ACPI_IVRS01_OFFSET (PciSegmentGroup), "PCI Segment Group", 0}, + {ACPI_DMT_UINT16, ACPI_IVRS01_OFFSET (Info), "Virtualization Info", 0}, + {ACPI_DMT_UINT32, ACPI_IVRS01_OFFSET (Attributes), "Attributes", 0}, + {ACPI_DMT_UINT64, ACPI_IVRS01_OFFSET (EfrRegisterImage), "EFR Image", 0}, + {ACPI_DMT_UINT64, ACPI_IVRS01_OFFSET (Reserved), "Reserved", 0}, ACPI_DMT_TERMINATOR }; diff --git a/src/acpica/source/common/dmtbinfo3.c b/src/acpica/source/common/dmtbinfo3.c index 07a26c2b..f4092c24 100644 --- a/src/acpica/source/common/dmtbinfo3.c +++ b/src/acpica/source/common/dmtbinfo3.c @@ -691,7 +691,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoWpbt0[] = /******************************************************************************* * - * WSMT - Windows SMM Security Migrations Table + * WSMT - Windows SMM Security Mitigations Table * ******************************************************************************/ diff --git a/src/acpica/source/compiler/aslcompile.c b/src/acpica/source/compiler/aslcompile.c index 9481b6bb..787a5444 100644 --- a/src/acpica/source/compiler/aslcompile.c +++ b/src/acpica/source/compiler/aslcompile.c @@ -283,6 +283,7 @@ CmDoCompile ( LsDumpParseTree (); + UtEndEvent (Event); UtEndEvent (FullCompile); return (AE_OK); diff --git a/src/acpica/source/compiler/aslcompiler.h b/src/acpica/source/compiler/aslcompiler.h index 9bebc380..82d777d8 100644 --- a/src/acpica/source/compiler/aslcompiler.h +++ b/src/acpica/source/compiler/aslcompiler.h @@ -488,7 +488,7 @@ AslCheckExpectedExceptions ( void); ACPI_STATUS -AslExpectException ( +AslLogExpectedException ( char *MessageIdString); ACPI_STATUS @@ -501,9 +501,15 @@ AslDisableException ( BOOLEAN AslIsExceptionIgnored ( + char *Filename, + UINT32 LineNumber, UINT8 Level, UINT16 MessageId); +void +AslLogExpectedExceptionByLine ( + char *MessageIdString); + void AslCoreSubsystemError ( ACPI_PARSE_OBJECT *Op, diff --git a/src/acpica/source/compiler/aslcompiler.l b/src/acpica/source/compiler/aslcompiler.l index 797f9899..4c3fbde3 100644 --- a/src/acpica/source/compiler/aslcompiler.l +++ b/src/acpica/source/compiler/aslcompiler.l @@ -156,7 +156,6 @@ #include <stdlib.h> #include <string.h> -YYSTYPE AslCompilerlval; /* * Generation: Use the following command line: @@ -195,6 +194,7 @@ count (int type); LeadNameChar [A-Za-z_] DigitChar [0-9] +ErrorCode [(][ ]*[1-9][0-9][0-9][0-9][ ]*[)] OctalChar [0-7] HexDigitChar [A-Fa-f0-9] RootChar [\\] @@ -692,7 +692,7 @@ NamePathTail [.]{NameSeg} "IPMI" { count (0); return (PARSEOP_REGIONSPACE_IPMI); } "GeneralPurposeIo" { count (0); return (PARSEOP_REGIONSPACE_GPIO); } /* ACPI 5.0 */ "GenericSerialBus" { count (0); return (PARSEOP_REGIONSPACE_GSBUS); } /* ACPI 5.0 */ -"PlatformCommChannel" { count (0); return (PARSEOP_REGIONSPACE_PCC); } /* ACPI 5.0 */ +"PCC" { count (0); return (PARSEOP_REGIONSPACE_PCC); } /* ACPI 5.0 */ "FFixedHW" { count (0); return (PARSEOP_REGIONSPACE_FFIXEDHW); } /* ResourceTypeKeyword: Resource Usage - Resource Descriptors */ @@ -810,6 +810,22 @@ NamePathTail [.]{NameSeg} "__LINE__" { count (0); return (PARSEOP___LINE__); } "__PATH__" { count (0); return (PARSEOP___PATH__); } "__METHOD__" { count (0); return (PARSEOP___METHOD__); } +"__EXPECT__"{ErrorCode} { char *s; + int index = 0; + count (0); + while (!isdigit (AslCompilertext[index])) + { + index++; + } + + /* + * The eror code is contained inside the + * {ErrorCode} pattern. Extract it and log it + * as the expected error code. + */ + s = UtLocalCacheCalloc (ASL_ERROR_CODE_LENGTH + 1); + memcpy (s, AslCompilertext + index, ASL_ERROR_CODE_LENGTH); + AslLogExpectedExceptionByLine (s); } {NameSeg} { char *s; count (0); diff --git a/src/acpica/source/compiler/asldefine.h b/src/acpica/source/compiler/asldefine.h index 12a4cdd5..2627a58a 100644 --- a/src/acpica/source/compiler/asldefine.h +++ b/src/acpica/source/compiler/asldefine.h @@ -227,6 +227,7 @@ #define ASL_NO_ABORT FALSE #define ASL_EOF ACPI_UINT32_MAX #define ASL_IGNORE_LINE (ACPI_UINT32_MAX -1) +#define ASL_ERROR_CODE_LENGTH 4 /* Listings */ diff --git a/src/acpica/source/compiler/aslerror.c b/src/acpica/source/compiler/aslerror.c index 1931fffc..8fae779d 100644 --- a/src/acpica/source/compiler/aslerror.c +++ b/src/acpica/source/compiler/aslerror.c @@ -162,6 +162,8 @@ AeAddToErrorLog ( static BOOLEAN AslIsExceptionExpected ( + char *Filename, + UINT32 LineNumber, UINT8 Level, UINT16 MessageId); @@ -170,7 +172,8 @@ AslIsExceptionDisabled ( UINT8 Level, UINT16 MessageId); -static void AslInitEnode ( +static void +AslInitEnode ( ASL_ERROR_MSG **Enode, UINT8 Level, UINT16 MessageId, @@ -956,7 +959,7 @@ AslCommonError ( { /* Check if user wants to ignore this exception */ - if (AslIsExceptionIgnored (Level, MessageId)) + if (AslIsExceptionIgnored (Filename, LogicalLineNumber, Level, MessageId)) { return; } @@ -1087,6 +1090,8 @@ GetModifiedLevel ( BOOLEAN AslIsExceptionIgnored ( + char *Filename, + UINT32 LineNumber, UINT8 Level, UINT16 MessageId) { @@ -1096,7 +1101,8 @@ AslIsExceptionIgnored ( /* Note: this allows exception to be disabled and expected */ ExceptionIgnored = AslIsExceptionDisabled (Level, MessageId); - ExceptionIgnored |= AslIsExceptionExpected (Level, MessageId); + ExceptionIgnored |= + AslIsExceptionExpected (Filename, LineNumber, Level, MessageId); return (AslGbl_AllExceptionsDisabled || ExceptionIgnored); } @@ -1104,7 +1110,7 @@ AslIsExceptionIgnored ( /******************************************************************************* * - * FUNCTION: AslCheckExpectException + * FUNCTION: AslCheckExpectedException * * PARAMETERS: none * @@ -1120,6 +1126,8 @@ AslCheckExpectedExceptions ( void) { UINT8 i; + ASL_EXPECTED_MSG_NODE *Current = AslGbl_ExpectedErrorCodeList; + ASL_LOCATION_NODE *LocationNode; for (i = 0; i < AslGbl_ExpectedMessagesIndex; ++i) @@ -1130,12 +1138,32 @@ AslCheckExpectedExceptions ( AslGbl_ExpectedMessages[i].MessageIdStr); } } + + while (Current) + { + LocationNode = Current->LocationList; + + while (LocationNode) + { + if (!LocationNode->MessageReceived) + { + AslCommonError (ASL_ERROR, ASL_MSG_EXCEPTION_NOT_RECEIVED, + LocationNode->LineNumber, LocationNode->LineNumber, + LocationNode->LogicalByteOffset, LocationNode->Column, + LocationNode->Filename, Current->MessageIdStr); + } + + LocationNode = LocationNode->Next; + } + + Current = Current->Next; + } } /******************************************************************************* * - * FUNCTION: AslExpectException + * FUNCTION: AslLogExpectedException * * PARAMETERS: MessageIdString - ID of excepted exception during compile * @@ -1148,7 +1176,7 @@ AslCheckExpectedExceptions ( ******************************************************************************/ ACPI_STATUS -AslExpectException ( +AslLogExpectedException ( char *MessageIdString) { UINT32 MessageId; @@ -1182,6 +1210,61 @@ AslExpectException ( } +/******************************************************************************* + * + * FUNCTION: AslLogExpectedExceptionByLine + * + * PARAMETERS: MessageIdString - ID of excepted exception during compile + * + * RETURN: Status + * + * DESCRIPTION: Enter a message ID into the global expected messages table + * based on file and line number. If these messages are not raised + * during the compilation, throw an error. + * + ******************************************************************************/ + +void +AslLogExpectedExceptionByLine ( + char *MessageIdString) +{ + ASL_LOCATION_NODE *NewErrorLocationNode; + ASL_EXPECTED_MSG_NODE *Current = AslGbl_ExpectedErrorCodeList; + UINT32 MessageId; + + + NewErrorLocationNode = UtLocalCalloc (sizeof (ASL_LOCATION_NODE)); + + NewErrorLocationNode->LineNumber = AslGbl_CurrentLineNumber; + NewErrorLocationNode->Filename = AslGbl_Files[ASL_FILE_INPUT].Filename; + NewErrorLocationNode->LogicalByteOffset = AslGbl_CurrentLineOffset; + NewErrorLocationNode->Column = AslGbl_CurrentColumn; + + MessageId = (UINT32) strtoul (MessageIdString, NULL, 0); + + /* search the existing list for a matching message ID */ + + while (Current && Current->MessageId != MessageId ) + { + Current = Current->Next; + } + if (!Current) + { + /* ID was not found, create a new node for this message ID */ + + Current = UtLocalCalloc (sizeof (ASL_EXPECTED_MSG_NODE)); + + Current->Next = AslGbl_ExpectedErrorCodeList; + Current->MessageIdStr = MessageIdString; + Current->MessageId = MessageId; + AslGbl_ExpectedErrorCodeList = Current; + } + + NewErrorLocationNode->Next = Current->LocationList; + Current->LocationList = NewErrorLocationNode; +} + + /******************************************************************************* * * FUNCTION: AslDisableException @@ -1272,6 +1355,7 @@ AslElevateException ( return (AE_OK); } + /******************************************************************************* * * FUNCTION: AslIsExceptionDisabled @@ -1288,9 +1372,13 @@ AslElevateException ( static BOOLEAN AslIsExceptionExpected ( + char *Filename, + UINT32 LineNumber, UINT8 Level, UINT16 MessageId) { + ASL_EXPECTED_MSG_NODE *Current = AslGbl_ExpectedErrorCodeList; + ASL_LOCATION_NODE *CurrentErrorLocation; UINT32 EncodedMessageId; UINT32 i; @@ -1308,6 +1396,28 @@ AslIsExceptionExpected ( } } + while (Current && Current->MessageId != EncodedMessageId) + { + Current = Current->Next; + } + if (!Current) + { + return (FALSE); + } + + CurrentErrorLocation = Current->LocationList; + + while (CurrentErrorLocation) + { + if (!strcmp (CurrentErrorLocation->Filename, Filename) && + CurrentErrorLocation->LineNumber == LineNumber) + { + return (CurrentErrorLocation->MessageReceived = TRUE); + } + + CurrentErrorLocation = CurrentErrorLocation->Next; + } + return (FALSE); } @@ -1410,7 +1520,8 @@ AslDualParseOpError ( /* Check if user wants to ignore this exception */ - if (AslIsExceptionIgnored (Level, MainMsgId) || !MainOp) + if (!MainOp || AslIsExceptionIgnored (MainOp->Asl.Filename, + MainOp->Asl.LogicalLineNumber, Level, MainMsgId)) { return; } diff --git a/src/acpica/source/compiler/aslglobal.h b/src/acpica/source/compiler/aslglobal.h index 1a66dea9..231ed876 100644 --- a/src/acpica/source/compiler/aslglobal.h +++ b/src/acpica/source/compiler/aslglobal.h @@ -420,6 +420,7 @@ ASL_EXTERN char ASL_INIT_GLOBAL (*AslGbl_TableSignature, "NO ASL_EXTERN char ASL_INIT_GLOBAL (*AslGbl_TableId, "NO_ID"); ASL_EXTERN ASL_FILE_INFO ASL_INIT_GLOBAL (*AslGbl_Files, NULL); ASL_EXTERN ASL_GLOBAL_FILE_NODE ASL_INIT_GLOBAL (*AslGbl_FilesList, NULL); +ASL_EXTERN ASL_EXPECTED_MSG_NODE ASL_INIT_GLOBAL (*AslGbl_ExpectedErrorCodeList, NULL); /* Specific to the -q option */ diff --git a/src/acpica/source/compiler/aslload.c b/src/acpica/source/compiler/aslload.c index 0d26c641..bd2fc977 100644 --- a/src/acpica/source/compiler/aslload.c +++ b/src/acpica/source/compiler/aslload.c @@ -1018,6 +1018,74 @@ FinishNode: } +/******************************************************************************* + * + * FUNCTION: LdAnalyzeExternals + * + * PARAMETERS: Type1 + * Type2 + * + * RETURN: BOOLEAN + * + * DESCRIPTION: Match Type1 and Type2 with the assumption that one might be + * using external types and another might be using local types. + * This should be used to compare the types found in external + * declarations with types found in other external declarations or + * named object declaration. This should not be used to match two + * object type declarations. + * + ******************************************************************************/ + +static BOOLEAN +LdTypesMatchExternType ( + ACPI_OBJECT_TYPE Type1, + ACPI_OBJECT_TYPE Type2) +{ + BOOLEAN Type1IsLocal = Type1 > ACPI_TYPE_EXTERNAL_MAX; + BOOLEAN Type2IsLocal = Type2 > ACPI_TYPE_EXTERNAL_MAX; + ACPI_OBJECT_TYPE ExternalType; + ACPI_OBJECT_TYPE LocalType; + + + /* + * The inputs could represent types that are local to ACPICA or types that + * are known externally. Some local types, such as the OperationRegion + * field units, are defined with more granularity than ACPICA local types. + * + * Therefore, map the local types to the external types before matching. + */ + if (Type1IsLocal && !Type2IsLocal) + { + LocalType = Type1; + ExternalType = Type2; + } + else if (!Type1IsLocal && Type2IsLocal) + { + LocalType = Type2; + ExternalType = Type1; + } + else + { + return (Type1 == Type2); + } + + switch (LocalType) + { + case ACPI_TYPE_LOCAL_REGION_FIELD: + case ACPI_TYPE_LOCAL_BANK_FIELD: + case ACPI_TYPE_LOCAL_INDEX_FIELD: + + LocalType = ACPI_TYPE_FIELD_UNIT; + break; + + default: + break; + } + + return (LocalType == ExternalType); +} + + /******************************************************************************* * * FUNCTION: LdAnalyzeExternals @@ -1072,12 +1140,12 @@ LdAnalyzeExternals ( if ((ActualOpType != ACPI_TYPE_ANY) && (ActualExternalOpType != ACPI_TYPE_ANY) && - (ActualExternalOpType != ActualOpType)) + !LdTypesMatchExternType (ActualExternalOpType, ActualOpType)) { if (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL && Node->Op->Asl.ParseOpcode == PARSEOP_EXTERNAL) { - AslDualParseOpError (ASL_ERROR, + AslDualParseOpError (ASL_WARNING, ASL_MSG_DUPLICATE_EXTERN_MISMATCH, Op, NULL, ASL_MSG_DUPLICATE_EXTERN_FOUND_HERE, Node->Op, NULL); } @@ -1094,7 +1162,7 @@ LdAnalyzeExternals ( ExternalOp = Node->Op; ActualOp = Op; } - AslDualParseOpError (ASL_ERROR, + AslDualParseOpError (ASL_WARNING, ASL_MSG_DECLARATION_TYPE_MISMATCH, ExternalOp, NULL, ASL_MSG_TYPE_MISMATCH_FOUND_HERE, ActualOp, NULL); } @@ -1139,18 +1207,8 @@ LdAnalyzeExternals ( { /* Allow update of externals of unknown type. */ - if (AcpiNsOpensScope (ExternalOpType)) - { - Node->Type = (UINT8) ExternalOpType; - Status = AE_OK; - } - else - { - sprintf (AslGbl_MsgBuffer, "%s [%s]", Op->Asl.ExternalName, - AcpiUtGetTypeName (Node->Type)); - AslError (ASL_ERROR, ASL_MSG_SCOPE_TYPE, Op, AslGbl_MsgBuffer); - Status = AE_ERROR; - } + Node->Type = (UINT8) ExternalOpType; + Status = AE_OK; } return (Status); diff --git a/src/acpica/source/compiler/asloptions.c b/src/acpica/source/compiler/asloptions.c index e3b3f8e7..4bf9465b 100644 --- a/src/acpica/source/compiler/asloptions.c +++ b/src/acpica/source/compiler/asloptions.c @@ -948,7 +948,7 @@ AslDoOptions ( return (-1); } - Status = AslExpectException (AcpiGbl_Optarg); + Status = AslLogExpectedException (AcpiGbl_Optarg); if (ACPI_FAILURE (Status)) { return (-1); diff --git a/src/acpica/source/compiler/asltypes.h b/src/acpica/source/compiler/asltypes.h index cd54dbc0..33c547e4 100644 --- a/src/acpica/source/compiler/asltypes.h +++ b/src/acpica/source/compiler/asltypes.h @@ -381,12 +381,37 @@ typedef struct asl_error_msg typedef struct asl_expected_message { - UINT32 MessageId; - char *MessageIdStr; - BOOLEAN MessageReceived; + UINT32 MessageId; + char *MessageIdStr; + BOOLEAN MessageReceived; } ASL_EXPECTED_MESSAGE; +/* + * An entry in the line-based expected messages list + * + * TBD: might be possible to merge this with ASL_EXPECTED_MESSAGE + */ +typedef struct asl_expected_msg_node +{ + struct asl_expected_msg_node *Next; + UINT32 MessageId; + char *MessageIdStr; + struct asl_location_node *LocationList; + +} ASL_EXPECTED_MSG_NODE; + +typedef struct asl_location_node +{ + struct asl_location_node *Next; + char *Filename; + UINT32 LineNumber; + UINT32 Column; + UINT32 LogicalByteOffset; + BOOLEAN MessageReceived; + +} ASL_LOCATION_NODE; + /* An entry in the listing file stack (for include files) */ diff --git a/src/acpica/source/compiler/dtcompiler.h b/src/acpica/source/compiler/dtcompiler.h index 9d9008a8..18de92ff 100644 --- a/src/acpica/source/compiler/dtcompiler.h +++ b/src/acpica/source/compiler/dtcompiler.h @@ -461,7 +461,6 @@ DtCreateTableUnit ( /* dtparser - lex/yacc files */ -UINT64 DtCompilerParserResult; /* Expression return value */ int DtCompilerParserparse ( void); diff --git a/src/acpica/source/compiler/dtcompilerparser.l b/src/acpica/source/compiler/dtcompilerparser.l index 28dcf6af..ecc07c48 100644 --- a/src/acpica/source/compiler/dtcompilerparser.l +++ b/src/acpica/source/compiler/dtcompilerparser.l @@ -153,7 +153,6 @@ #include "aslcompiler.h" #include "dtcompilerparser.y.h" -YYSTYPE DtCompilerlval; #define _COMPONENT ACPI_COMPILER ACPI_MODULE_NAME ("dtcompilerscanner") diff --git a/src/acpica/source/compiler/dtcompilerparser.y b/src/acpica/source/compiler/dtcompilerparser.y index 43eba4e9..e97e2a90 100644 --- a/src/acpica/source/compiler/dtcompilerparser.y +++ b/src/acpica/source/compiler/dtcompilerparser.y @@ -170,7 +170,6 @@ extern char *DtCompilerParsertext; extern DT_FIELD *AslGbl_CurrentField; extern int DtLabelByteOffset; -extern UINT64 DtCompilerParserResult; /* Expression return value */ extern UINT64 DtCompilerParserlineno; /* Current line number */ extern UINT32 DtTokenFirstLine; diff --git a/src/acpica/source/compiler/dtparser.l b/src/acpica/source/compiler/dtparser.l index ff7df507..631921df 100644 --- a/src/acpica/source/compiler/dtparser.l +++ b/src/acpica/source/compiler/dtparser.l @@ -208,7 +208,7 @@ NewLine [\n] /* * Local support functions */ -YY_BUFFER_STATE LexBuffer; +static YY_BUFFER_STATE LexBuffer; /****************************************************************************** * diff --git a/src/acpica/source/compiler/dttable1.c b/src/acpica/source/compiler/dttable1.c index c7256b77..33df4dc2 100644 --- a/src/acpica/source/compiler/dttable1.c +++ b/src/acpica/source/compiler/dttable1.c @@ -1967,11 +1967,16 @@ DtCompileIvrs ( switch (IvrsHeader->Type) { - case ACPI_IVRS_TYPE_HARDWARE: + case ACPI_IVRS_TYPE_HARDWARE1: InfoTable = AcpiDmTableInfoIvrs0; break; + case ACPI_IVRS_TYPE_HARDWARE2: + + InfoTable = AcpiDmTableInfoIvrs01; + break; + case ACPI_IVRS_TYPE_MEMORY1: case ACPI_IVRS_TYPE_MEMORY2: case ACPI_IVRS_TYPE_MEMORY3: @@ -1994,7 +1999,8 @@ DtCompileIvrs ( ParentTable = DtPeekSubtable (); DtInsertSubtable (ParentTable, Subtable); - if (IvrsHeader->Type == ACPI_IVRS_TYPE_HARDWARE) + if (IvrsHeader->Type == ACPI_IVRS_TYPE_HARDWARE1 || + IvrsHeader->Type == ACPI_IVRS_TYPE_HARDWARE2) { while (*PFieldList && !strcmp ((*PFieldList)->Name, "Entry Type")) diff --git a/src/acpica/source/compiler/dtutils.c b/src/acpica/source/compiler/dtutils.c index 067d0ece..bb07894e 100644 --- a/src/acpica/source/compiler/dtutils.c +++ b/src/acpica/source/compiler/dtutils.c @@ -189,7 +189,8 @@ DtError ( /* Check if user wants to ignore this exception */ - if (AslIsExceptionIgnored (Level, MessageId)) + if (AslIsExceptionIgnored (AslGbl_Files[ASL_FILE_INPUT].Filename, + FieldObject->Line, Level, MessageId)) { return; } diff --git a/src/acpica/source/compiler/prparser.l b/src/acpica/source/compiler/prparser.l index 65595fa8..8752d3fc 100644 --- a/src/acpica/source/compiler/prparser.l +++ b/src/acpica/source/compiler/prparser.l @@ -224,7 +224,7 @@ Identifier [a-zA-Z][0-9a-zA-Z]* /* * Local support functions */ -YY_BUFFER_STATE LexBuffer; +static YY_BUFFER_STATE LexBuffer; /****************************************************************************** diff --git a/src/acpica/source/components/debugger/dbinput.c b/src/acpica/source/components/debugger/dbinput.c index 0bfe9947..378e3db1 100644 --- a/src/acpica/source/components/debugger/dbinput.c +++ b/src/acpica/source/components/debugger/dbinput.c @@ -637,19 +637,16 @@ AcpiDbGetNextToken ( return (NULL); } - /* Remove any spaces at the beginning */ + /* Remove any spaces at the beginning, ignore blank lines */ - if (*String == ' ') + while (*String && isspace (*String)) { - while (*String && (*String == ' ')) - { - String++; - } + String++; + } - if (!(*String)) - { - return (NULL); - } + if (!(*String)) + { + return (NULL); } switch (*String) @@ -754,7 +751,7 @@ AcpiDbGetNextToken ( /* Find end of token */ - while (*String && (*String != ' ')) + while (*String && !isspace (*String)) { String++; } diff --git a/src/acpica/source/components/debugger/dbxface.c b/src/acpica/source/components/debugger/dbxface.c index e7d354d8..f84db8c9 100644 --- a/src/acpica/source/components/debugger/dbxface.c +++ b/src/acpica/source/components/debugger/dbxface.c @@ -594,6 +594,7 @@ AcpiInitializeDebugger ( AcpiGbl_DbOutputFlags = ACPI_DB_CONSOLE_OUTPUT; AcpiGbl_DbOpt_NoIniMethods = FALSE; + AcpiGbl_DbOpt_NoRegionSupport = FALSE; AcpiGbl_DbBuffer = AcpiOsAllocate (ACPI_DEBUG_BUFFER_SIZE); if (!AcpiGbl_DbBuffer) diff --git a/src/acpica/source/components/dispatcher/dswexec.c b/src/acpica/source/components/dispatcher/dswexec.c index f2925ecf..3fa7b95b 100644 --- a/src/acpica/source/components/dispatcher/dswexec.c +++ b/src/acpica/source/components/dispatcher/dswexec.c @@ -158,7 +158,9 @@ #include "acinterp.h" #include "acnamesp.h" #include "acdebug.h" - +#ifdef ACPI_EXEC_APP +#include "aecommon.h" +#endif #define _COMPONENT ACPI_DISPATCHER ACPI_MODULE_NAME ("dswexec") @@ -504,7 +506,10 @@ AcpiDsExecEndOp ( UINT32 OpClass; ACPI_PARSE_OBJECT *NextOp; ACPI_PARSE_OBJECT *FirstArg; - +#ifdef ACPI_EXEC_APP + char *Namepath; + ACPI_OPERAND_OBJECT *ObjDesc; +#endif ACPI_FUNCTION_TRACE_PTR (DsExecEndOp, WalkState); @@ -717,6 +722,29 @@ AcpiDsExecEndOp ( } Status = AcpiDsEvalBufferFieldOperands (WalkState, Op); + if (ACPI_FAILURE (Status)) + { + break; + } + +#ifdef ACPI_EXEC_APP + /* + * AcpiExec support for namespace initialization file (initialize + * BufferFields in this code.) + */ + Namepath = AcpiNsGetExternalPathname (Op->Common.Node); + Status = AeLookupInitFileEntry (Namepath, &ObjDesc); + if (ACPI_SUCCESS (Status)) + { + Status = AcpiExWriteDataToField (ObjDesc, Op->Common.Node->Object, NULL); + if ACPI_FAILURE (Status) + { + ACPI_EXCEPTION ((AE_INFO, Status, "While writing to buffer field")); + } + } + ACPI_FREE (Namepath); + Status = AE_OK; +#endif break; diff --git a/src/acpica/source/components/dispatcher/dswload.c b/src/acpica/source/components/dispatcher/dswload.c index d37bd5d4..62a4fdca 100644 --- a/src/acpica/source/components/dispatcher/dswload.c +++ b/src/acpica/source/components/dispatcher/dswload.c @@ -156,7 +156,6 @@ #include "acdispat.h" #include "acinterp.h" #include "acnamesp.h" - #ifdef ACPI_ASL_COMPILER #include "acdisasm.h" #endif @@ -555,7 +554,6 @@ AcpiDsLoad1EndOp ( ACPI_PARSE_OBJECT *Op; ACPI_OBJECT_TYPE ObjectType; ACPI_STATUS Status = AE_OK; - #ifdef ACPI_ASL_COMPILER UINT8 ParamCount; #endif diff --git a/src/acpica/source/components/dispatcher/dswload2.c b/src/acpica/source/components/dispatcher/dswload2.c index ff2135ce..0ab715cd 100644 --- a/src/acpica/source/components/dispatcher/dswload2.c +++ b/src/acpica/source/components/dispatcher/dswload2.c @@ -157,6 +157,9 @@ #include "acinterp.h" #include "acnamesp.h" #include "acevents.h" +#ifdef ACPI_EXEC_APP +#include "aecommon.h" +#endif #define _COMPONENT ACPI_DISPATCHER ACPI_MODULE_NAME ("dswload2") @@ -531,6 +534,10 @@ AcpiDsLoad2EndOp ( ACPI_NAMESPACE_NODE *NewNode; UINT32 i; UINT8 RegionSpace; +#ifdef ACPI_EXEC_APP + ACPI_OPERAND_OBJECT *ObjDesc; + char *Namepath; +#endif ACPI_FUNCTION_TRACE (DsLoad2EndOp); @@ -627,6 +634,11 @@ AcpiDsLoad2EndOp ( * be evaluated later during the execution phase */ Status = AcpiDsCreateBufferField (Op, WalkState); + if ACPI_FAILURE (Status) + { + ACPI_EXCEPTION ((AE_INFO, Status, "CreateBufferField failure")); + goto Cleanup; + } break; case AML_TYPE_NAMED_FIELD: @@ -766,6 +778,31 @@ AcpiDsLoad2EndOp ( case AML_NAME_OP: Status = AcpiDsCreateNode (WalkState, Node, Op); + if (ACPI_FAILURE (Status)) + { + goto Cleanup; + } + +#ifdef ACPI_EXEC_APP + /* + * AcpiExec support for namespace initialization file (initialize + * Name opcodes in this code.) + */ + Namepath = AcpiNsGetExternalPathname (Node); + Status = AeLookupInitFileEntry (Namepath, &ObjDesc); + if (ACPI_SUCCESS (Status)) + { + /* Detach any existing object, attach new object */ + + if (Node->Object) + { + AcpiNsDetachObject (Node); + } + AcpiNsAttachObject (Node, ObjDesc, ObjDesc->Common.Type); + } + ACPI_FREE (Namepath); + Status = AE_OK; +#endif break; case AML_METHOD_OP: diff --git a/src/acpica/source/components/hardware/hwsleep.c b/src/acpica/source/components/hardware/hwsleep.c index 016f62be..d503f1cf 100644 --- a/src/acpica/source/components/hardware/hwsleep.c +++ b/src/acpica/source/components/hardware/hwsleep.c @@ -466,11 +466,11 @@ AcpiHwLegacyWake ( /* Enable sleep button */ - (void) AcpiWriteBitRegister ( + (void) AcpiWriteBitRegister ( AcpiGbl_FixedEventInfo[ACPI_EVENT_SLEEP_BUTTON].EnableRegisterId, ACPI_ENABLE_EVENT); - (void) AcpiWriteBitRegister ( + (void) AcpiWriteBitRegister ( AcpiGbl_FixedEventInfo[ACPI_EVENT_SLEEP_BUTTON].StatusRegisterId, ACPI_CLEAR_STATUS); diff --git a/src/acpica/source/components/namespace/nsnames.c b/src/acpica/source/components/namespace/nsnames.c index a9509195..a27a87f0 100644 --- a/src/acpica/source/components/namespace/nsnames.c +++ b/src/acpica/source/components/namespace/nsnames.c @@ -158,12 +158,6 @@ #define _COMPONENT ACPI_NAMESPACE ACPI_MODULE_NAME ("nsnames") -/* Local Prototypes */ - -static void -AcpiNsNormalizePathname ( - char *OriginalPath); - /******************************************************************************* * @@ -616,7 +610,7 @@ Cleanup: * ******************************************************************************/ -static void +void AcpiNsNormalizePathname ( char *OriginalPath) { diff --git a/src/acpica/source/components/utilities/utdecode.c b/src/acpica/source/components/utilities/utdecode.c index aec32969..01b1823e 100644 --- a/src/acpica/source/components/utilities/utdecode.c +++ b/src/acpica/source/components/utilities/utdecode.c @@ -224,7 +224,7 @@ const char *AcpiGbl_RegionTypes[ACPI_NUM_PREDEFINED_REGIONS] = "IPMI", /* 0x07 */ "GeneralPurposeIo", /* 0x08 */ "GenericSerialBus", /* 0x09 */ - "PlatformCommChannel"/* 0x0A */ + "PCC" /* 0x0A */ }; diff --git a/src/acpica/source/components/utilities/utdelete.c b/src/acpica/source/components/utilities/utdelete.c index 2f60917b..502ff413 100644 --- a/src/acpica/source/components/utilities/utdelete.c +++ b/src/acpica/source/components/utilities/utdelete.c @@ -626,13 +626,13 @@ AcpiUtUpdateRefCount ( * * FUNCTION: AcpiUtUpdateObjectReference * - * PARAMETERS: Object - Increment ref count for this object - * and all sub-objects + * PARAMETERS: Object - Increment or decrement the ref count for + * this object and all sub-objects * Action - Either REF_INCREMENT or REF_DECREMENT * * RETURN: Status * - * DESCRIPTION: Increment the object reference count + * DESCRIPTION: Increment or decrement the object reference count * * Object references are incremented when: * 1) An object is attached to a Node (namespace object) @@ -671,7 +671,7 @@ AcpiUtUpdateObjectReference ( } /* - * All sub-objects must have their reference count incremented + * All sub-objects must have their reference count updated * also. Different object types have different subobjects. */ switch (Object->Common.Type) @@ -740,6 +740,7 @@ AcpiUtUpdateObjectReference ( break; } } + NextObject = NULL; break; diff --git a/src/acpica/source/include/acdisasm.h b/src/acpica/source/include/acdisasm.h index 960af4b0..d0ffe390 100644 --- a/src/acpica/source/include/acdisasm.h +++ b/src/acpica/source/include/acdisasm.h @@ -457,6 +457,7 @@ extern ACPI_DMTABLE_INFO AcpiDmTableInfoIortMap[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoIortPad[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoIvrs[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoIvrs0[]; +extern ACPI_DMTABLE_INFO AcpiDmTableInfoIvrs01[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoIvrs1[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoIvrs4[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoIvrs8a[]; diff --git a/src/acpica/source/include/acnamesp.h b/src/acpica/source/include/acnamesp.h index 3dd605a0..48b36593 100644 --- a/src/acpica/source/include/acnamesp.h +++ b/src/acpica/source/include/acnamesp.h @@ -487,6 +487,10 @@ AcpiNsBuildNormalizedPath ( UINT32 PathSize, BOOLEAN NoTrailing); +void +AcpiNsNormalizePathname ( + char *OriginalPath); + char * AcpiNsGetNormalizedPathname ( ACPI_NAMESPACE_NODE *Node, diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h index a39d180e..eeb63cd5 100644 --- a/src/acpica/source/include/acpixf.h +++ b/src/acpica/source/include/acpixf.h @@ -154,7 +154,7 @@ /* Current ACPICA subsystem version in YYYYMMDD format */ -#define ACPI_CA_VERSION 0x20200214 +#define ACPI_CA_VERSION 0x20200326 #include "acconfig.h" #include "actypes.h" diff --git a/src/acpica/source/include/actbinfo.h b/src/acpica/source/include/actbinfo.h index 74da8bac..59c38a29 100644 --- a/src/acpica/source/include/actbinfo.h +++ b/src/acpica/source/include/actbinfo.h @@ -264,7 +264,8 @@ #define ACPI_IORTH_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_IORT_NODE,f) #define ACPI_IORTM_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_IORT_ID_MAPPING,f) #define ACPI_IVRSH_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_IVRS_HEADER,f) -#define ACPI_IVRS0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_IVRS_HARDWARE,f) +#define ACPI_IVRS0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_IVRS_HARDWARE1,f) +#define ACPI_IVRS01_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_IVRS_HARDWARE2,f) #define ACPI_IVRS1_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_IVRS_MEMORY,f) #define ACPI_IVRSD_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_IVRS_DE_HEADER,f) #define ACPI_IVRS8A_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_IVRS_DEVICE8A,f) diff --git a/src/acpica/source/include/actbl2.h b/src/acpica/source/include/actbl2.h index fe17576b..2f1dd299 100644 --- a/src/acpica/source/include/actbl2.h +++ b/src/acpica/source/include/actbl2.h @@ -187,6 +187,7 @@ #define ACPI_SIG_SBST "SBST" /* Smart Battery Specification Table */ #define ACPI_SIG_SDEI "SDEI" /* Software Delegated Exception Interface Table */ #define ACPI_SIG_SDEV "SDEV" /* Secure Devices table */ +#define ACPI_SIG_NHLT "NHLT" /* Non-HDAudio Link Table */ /* @@ -457,7 +458,8 @@ typedef struct acpi_ivrs_header enum AcpiIvrsType { - ACPI_IVRS_TYPE_HARDWARE = 0x10, + ACPI_IVRS_TYPE_HARDWARE1 = 0x10, + ACPI_IVRS_TYPE_HARDWARE2 = 0x11, ACPI_IVRS_TYPE_MEMORY1 = 0x20, ACPI_IVRS_TYPE_MEMORY2 = 0x21, ACPI_IVRS_TYPE_MEMORY3 = 0x22 @@ -485,16 +487,30 @@ enum AcpiIvrsType /* 0x10: I/O Virtualization Hardware Definition Block (IVHD) */ -typedef struct acpi_ivrs_hardware +typedef struct acpi_ivrs_hardware_10 { ACPI_IVRS_HEADER Header; UINT16 CapabilityOffset; /* Offset for IOMMU control fields */ UINT64 BaseAddress; /* IOMMU control registers */ UINT16 PciSegmentGroup; UINT16 Info; /* MSI number and unit ID */ - UINT32 Reserved; + UINT32 FeatureReporting; + +} ACPI_IVRS_HARDWARE1; + +/* 0x11: I/O Virtualization Hardware Definition Block (IVHD) */ -} ACPI_IVRS_HARDWARE; +typedef struct acpi_ivrs_hardware_11 +{ + ACPI_IVRS_HEADER Header; + UINT16 CapabilityOffset; /* Offset for IOMMU control fields */ + UINT64 BaseAddress; /* IOMMU control registers */ + UINT16 PciSegmentGroup; + UINT16 Info; /* MSI number and unit ID */ + UINT32 Attributes; + UINT64 EfrRegisterImage; + UINT64 Reserved; +} ACPI_IVRS_HARDWARE2; /* Masks for Info field above */ diff --git a/src/acpica/source/include/actbl3.h b/src/acpica/source/include/actbl3.h index cfae7c42..74d4648a 100644 --- a/src/acpica/source/include/actbl3.h +++ b/src/acpica/source/include/actbl3.h @@ -183,7 +183,7 @@ #define ACPI_SIG_WDDT "WDDT" /* Watchdog Timer Description Table */ #define ACPI_SIG_WDRT "WDRT" /* Watchdog Resource Table */ #define ACPI_SIG_WPBT "WPBT" /* Windows Platform Binary Table */ -#define ACPI_SIG_WSMT "WSMT" /* Windows SMM Security Migrations Table */ +#define ACPI_SIG_WSMT "WSMT" /* Windows SMM Security Mitigations Table */ #define ACPI_SIG_XENV "XENV" /* Xen Environment table */ #define ACPI_SIG_XXXX "XXXX" /* Intermediate AML header for ASL/ASL+ converter */ @@ -904,10 +904,10 @@ typedef struct acpi_table_wpbt /******************************************************************************* * - * WSMT - Windows SMM Security Migrations Table + * WSMT - Windows SMM Security Mitigations Table * Version 1 * - * Conforms to "Windows SMM Security Migrations Table", + * Conforms to "Windows SMM Security Mitigations Table", * Version 1.0, April 18, 2016 * ******************************************************************************/ diff --git a/src/acpica/source/include/acuuid.h b/src/acpica/source/include/acuuid.h index bcbf6b1d..b856219c 100644 --- a/src/acpica/source/include/acuuid.h +++ b/src/acpica/source/include/acuuid.h @@ -200,4 +200,4 @@ #define UUID_DEVICE_PROPERTIES "daffd814-6eba-4d8c-8a91-bc9bbf4aa301" -#endif /* __AUUID_H__ */ +#endif /* __ACUUID_H__ */ diff --git a/src/acpica/source/tools/acpiexec/aecommon.h b/src/acpica/source/tools/acpiexec/aecommon.h index d9ade0b6..9dbb3fac 100644 --- a/src/acpica/source/tools/acpiexec/aecommon.h +++ b/src/acpica/source/tools/acpiexec/aecommon.h @@ -195,7 +195,9 @@ typedef struct ae_debug_regions typedef struct init_file_entry { char *Name; + char *Value; ACPI_OPERAND_OBJECT *ObjDesc; + BOOLEAN IsUsed; } INIT_FILE_ENTRY; @@ -346,19 +348,23 @@ int AeOpenInitializationFile ( char *Filename); -void +ACPI_STATUS AeProcessInitFile ( void); -ACPI_STATUS -AeSetupConfiguration ( - void *RegionAddr); - ACPI_STATUS AeLookupInitFileEntry ( char *Pathname, ACPI_OPERAND_OBJECT **ObjDesc); +void +AeDisplayUnusedInitFileItems ( + void); + +void +AeDeleteInitFileList ( + void); + /* aeexec */ void @@ -376,6 +382,10 @@ AeGetDevices ( void *Context, void **ReturnValue); +ACPI_STATUS +AeSetupConfiguration ( + void *RegionAddr); + ACPI_STATUS ExecuteOSI ( char *OsiString, diff --git a/src/acpica/source/tools/acpiexec/aeinitfile.c b/src/acpica/source/tools/acpiexec/aeinitfile.c index 0813c873..ce758ed1 100644 --- a/src/acpica/source/tools/acpiexec/aeinitfile.c +++ b/src/acpica/source/tools/acpiexec/aeinitfile.c @@ -151,24 +151,17 @@ #include "aecommon.h" #include "acdispat.h" +#include "acnamesp.h" + #define _COMPONENT ACPI_TOOLS ACPI_MODULE_NAME ("aeinitfile") -/* Local prototypes */ - -static void -AeEnterInitFileEntry ( - INIT_FILE_ENTRY InitEntry, - ACPI_WALK_STATE *WalkState); - - #define AE_FILE_BUFFER_SIZE 512 static char LineBuffer[AE_FILE_BUFFER_SIZE]; static char NameBuffer[AE_FILE_BUFFER_SIZE]; -static char ValueBuffer[AE_FILE_BUFFER_SIZE]; static FILE *InitFile; @@ -211,23 +204,23 @@ AeOpenInitializationFile ( * RETURN: None * * DESCRIPTION: Read the initialization file and perform all namespace - * initializations. AcpiGbl_InitEntries will be used for region - * field initialization. + * initializations. AcpiGbl_InitEntries will be used for all + * object initialization. * * NOTE: The format of the file is multiple lines, each of format: - * <ACPI-pathname> <Integer Value> + * <ACPI-pathname> <New Value> * *****************************************************************************/ -void -AeProcessInitFile( +ACPI_STATUS +AeProcessInitFile ( void) { ACPI_WALK_STATE *WalkState; UINT64 idx; - ACPI_STATUS Status; + ACPI_STATUS Status = AE_OK; char *Token; - char *ObjectBuffer; + char *ValueBuffer; char *TempNameBuffer; ACPI_OBJECT_TYPE Type; ACPI_OBJECT TempObject; @@ -235,13 +228,14 @@ AeProcessInitFile( if (!InitFile) { - return; + return (AE_OK); } /* Create needed objects to be reused for each init entry */ WalkState = AcpiDsCreateWalkState (0, NULL, NULL, NULL); NameBuffer[0] = '\\'; + NameBuffer[1] = 0; while (fgets (LineBuffer, AE_FILE_BUFFER_SIZE, InitFile) != NULL) { @@ -249,12 +243,20 @@ AeProcessInitFile( } rewind (InitFile); + /* + * Allocate and populate the Gbl_InitEntries array + */ AcpiGbl_InitEntries = - AcpiOsAllocate (sizeof (INIT_FILE_ENTRY) * AcpiGbl_InitFileLineCount); + AcpiOsAllocateZeroed (sizeof (INIT_FILE_ENTRY) * AcpiGbl_InitFileLineCount); for (idx = 0; fgets (LineBuffer, AE_FILE_BUFFER_SIZE, InitFile); ++idx) { - TempNameBuffer = AcpiDbGetNextToken (LineBuffer, &Token, &Type); + if (!TempNameBuffer) + { + AcpiGbl_InitEntries[idx].Name = NULL; + continue; + } + if (LineBuffer[0] == '\\') { strcpy (NameBuffer, TempNameBuffer); @@ -266,48 +268,67 @@ AeProcessInitFile( strcpy (NameBuffer + 1, TempNameBuffer); } + AcpiNsNormalizePathname (NameBuffer); AcpiGbl_InitEntries[idx].Name = AcpiOsAllocateZeroed (strnlen (NameBuffer, AE_FILE_BUFFER_SIZE) + 1); - strcpy (AcpiGbl_InitEntries[idx].Name, NameBuffer); - ObjectBuffer = AcpiDbGetNextToken (Token, &Token, &Type); + ValueBuffer = AcpiDbGetNextToken (Token, &Token, &Type); + if (!ValueBuffer) + { + AcpiGbl_InitEntries[idx].Value = NULL; + continue; + } + + AcpiGbl_InitEntries[idx].Value = + AcpiOsAllocateZeroed (strnlen (ValueBuffer, AE_FILE_BUFFER_SIZE) + 1); + strcpy (AcpiGbl_InitEntries[idx].Value, ValueBuffer); if (Type == ACPI_TYPE_FIELD_UNIT) { - Status = AcpiDbConvertToObject (ACPI_TYPE_BUFFER, ObjectBuffer, + Status = AcpiDbConvertToObject (ACPI_TYPE_BUFFER, ValueBuffer, &TempObject); } else { - Status = AcpiDbConvertToObject (Type, ObjectBuffer, &TempObject); + Status = AcpiDbConvertToObject (Type, ValueBuffer, &TempObject); + } + + if (ACPI_FAILURE (Status)) + { + AcpiOsPrintf ("%s[%s]: %s\n", NameBuffer, AcpiUtGetTypeName (Type), + AcpiFormatException (Status)); + goto CleanupAndExit; } Status = AcpiUtCopyEobjectToIobject (&TempObject, &AcpiGbl_InitEntries[idx].ObjDesc); - if (Type == ACPI_TYPE_BUFFER || Type == ACPI_TYPE_FIELD_UNIT) + /* Cleanup the external object created by DbConvertToObject above */ + + if (ACPI_SUCCESS (Status)) { - ACPI_FREE (TempObject.Buffer.Pointer); + if (Type == ACPI_TYPE_BUFFER || Type == ACPI_TYPE_FIELD_UNIT) + { + ACPI_FREE (TempObject.Buffer.Pointer); + } + else if (Type == ACPI_TYPE_PACKAGE) + { + AcpiDbDeleteObjects (1, &TempObject); + } } - - if (ACPI_FAILURE (Status)) + else { - AcpiOsPrintf ("%s %s\n", ValueBuffer, + AcpiOsPrintf ("%s[%s]: %s\n", NameBuffer, AcpiUtGetTypeName (Type), AcpiFormatException (Status)); goto CleanupAndExit; } /* - * Special case for field units. Field units are dependent on the - * parent region. This parent region has yet to be created so defer the - * initialization until the dispatcher. For all other types, initialize - * the namespace node with the value found in the init file. + * Initialize the namespace node with the value found in the init file. */ - if (Type != ACPI_TYPE_FIELD_UNIT) - { - AeEnterInitFileEntry (AcpiGbl_InitEntries[idx], WalkState); - } + AcpiOsPrintf ("Namespace object init from file: %16s, Value \"%s\", Type %s\n", + AcpiGbl_InitEntries[idx].Name, AcpiGbl_InitEntries[idx].Value, AcpiUtGetTypeName (Type)); } /* Cleanup */ @@ -315,97 +336,130 @@ AeProcessInitFile( CleanupAndExit: fclose (InitFile); AcpiDsDeleteWalkState (WalkState); + return (Status); } /****************************************************************************** * - * FUNCTION: AeInitFileEntry - * - * PARAMETERS: InitEntry - Entry of the init file - * WalkState - Used for the Store operation + * FUNCTION: AeLookupInitFileEntry * - * RETURN: None + * PARAMETERS: Pathname - AML namepath in external format + * ObjDesc - Where the object is returned if it exists * - * DESCRIPTION: Perform initialization of a single namespace object + * RETURN: Status. AE_OK if a match was found * - * Note: namespace of objects are limited to integers and region - * fields units of 8 bytes at this time. + * DESCRIPTION: Search the init file for a particular name and its value. * *****************************************************************************/ -static void -AeEnterInitFileEntry ( - INIT_FILE_ENTRY InitEntry, - ACPI_WALK_STATE *WalkState) +ACPI_STATUS +AeLookupInitFileEntry ( + char *Pathname, + ACPI_OPERAND_OBJECT **ObjDesc) { - char *Pathname = InitEntry.Name; - ACPI_OPERAND_OBJECT *ObjDesc = InitEntry.ObjDesc; - ACPI_NAMESPACE_NODE *NewNode; - ACPI_STATUS Status; + UINT32 i; + ACPI_FUNCTION_TRACE (AeLookupInitFileEntry); - Status = AcpiNsLookup (NULL, Pathname, ObjDesc->Common.Type, - ACPI_IMODE_LOAD_PASS2, ACPI_NS_ERROR_IF_FOUND | ACPI_NS_NO_UPSEARCH | - ACPI_NS_EARLY_INIT, NULL, &NewNode); - if (ACPI_FAILURE (Status)) + ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Lookup: %s\n", Pathname)); + + if (!AcpiGbl_InitEntries) { - ACPI_EXCEPTION ((AE_INFO, Status, - "While creating name from namespace initialization file: %s", - Pathname)); - return; + return (AE_NOT_FOUND); } - /* Store pointer to value descriptor in the Node */ + AcpiNsNormalizePathname (Pathname); - Status = AcpiNsAttachObject (NewNode, ObjDesc, - ObjDesc->Common.Type); - if (ACPI_FAILURE (Status)) + for (i = 0; i < AcpiGbl_InitFileLineCount; ++i) { - ACPI_EXCEPTION ((AE_INFO, Status, - "While attaching object to node from namespace initialization file: %s", - Pathname)); - return; + if (AcpiGbl_InitEntries[i].Name && + !strcmp (AcpiGbl_InitEntries[i].Name, Pathname)) + { + *ObjDesc = AcpiGbl_InitEntries[i].ObjDesc; + AcpiGbl_InitEntries[i].IsUsed = TRUE; + ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Found match: %s, %p\n", Pathname, *ObjDesc)); + return_ACPI_STATUS (AE_OK); + } } - /* Remove local reference to the object */ + ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "No match found: %s\n", Pathname)); + return_ACPI_STATUS (AE_NOT_FOUND); +} + + +/****************************************************************************** + * + * FUNCTION: AeDisplayUnusedInitFileItems + * + * PARAMETERS: None + * + * RETURN: None + * + * DESCRIPTION: Display all init file items that have not been referenced + * (i.e., items that have not been found in the namespace). + * + *****************************************************************************/ + +void +AeDisplayUnusedInitFileItems ( + void) +{ + UINT32 i; + + + if (!AcpiGbl_InitEntries) + { + return; + } - AcpiUtRemoveReference (ObjDesc); + for (i = 0; i < AcpiGbl_InitFileLineCount; ++i) + { + if (AcpiGbl_InitEntries[i].Name && + !AcpiGbl_InitEntries[i].IsUsed) + { + AcpiOsPrintf ("Init file entry not found in namespace " + "(or is a non-data type): %s\n", + AcpiGbl_InitEntries[i].Name); + } + } } /****************************************************************************** * - * FUNCTION: AeLookupInitFileEntry + * FUNCTION: AeDeleteInitFileList * - * PARAMETERS: Pathname - AML namepath in external format - * ValueString - value of the namepath if it exitst + * PARAMETERS: None * * RETURN: None * - * DESCRIPTION: Search the init file for a particular name and its value. + * DESCRIPTION: Delete the global namespace initialization file data * *****************************************************************************/ -ACPI_STATUS -AeLookupInitFileEntry ( - char *Pathname, - ACPI_OPERAND_OBJECT **ObjDesc) +void +AeDeleteInitFileList ( + void) { UINT32 i; + if (!AcpiGbl_InitEntries) { - return AE_NOT_FOUND; + return; } for (i = 0; i < AcpiGbl_InitFileLineCount; ++i) { - if (!strcmp(AcpiGbl_InitEntries[i].Name, Pathname)) + + if ((AcpiGbl_InitEntries[i].ObjDesc) && (AcpiGbl_InitEntries[i].Value)) { - *ObjDesc = AcpiGbl_InitEntries[i].ObjDesc; - return AE_OK; + /* Remove one reference on the object (and all subobjects) */ + + AcpiUtRemoveReference (AcpiGbl_InitEntries[i].ObjDesc); } } - return AE_NOT_FOUND; + + AcpiOsFree (AcpiGbl_InitEntries); }