Message ID | 20181101092610.18733-1-colin.king@canonical.com |
---|---|
State | Accepted |
Headers | show |
Series | ACPICA: Update to version 20181031 | expand |
On 2018-11-01 5:26 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/pipermail/devel/2018-October/001832.html > > Signed-off-by: Colin Ian King <colin.king@canonical.com> > --- > src/acpica/fwts_acpica.c | 1 - > src/acpica/source/common/adisasm.c | 1 - > src/acpica/source/common/dmtbdump3.c | 52 ++++++++ > src/acpica/source/common/dmtbinfo3.c | 20 +++ > src/acpica/source/compiler/aslcompile.c | 2 +- > src/acpica/source/compiler/aslerror.c | 4 +- > src/acpica/source/compiler/aslload.c | 97 +++++++++----- > src/acpica/source/compiler/aslmain.c | 2 +- > src/acpica/source/compiler/aslmessages.c | 6 +- > src/acpica/source/compiler/aslmessages.h | 2 + > src/acpica/source/compiler/aslpredef.c | 2 +- > src/acpica/source/compiler/aslxref.c | 46 ++++++- > src/acpica/source/compiler/dtio.c | 28 +++- > src/acpica/source/compiler/dttable2.c | 66 ++++++++++ > src/acpica/source/compiler/prscan.c | 1 - > .../source/components/debugger/dbxface.c | 122 +++++++++++------- > .../source/components/dispatcher/dsopcode.c | 3 + > .../source/components/dispatcher/dswload2.c | 9 ++ > .../source/components/namespace/nsaccess.c | 21 ++- > src/acpica/source/components/parser/psloop.c | 22 +++- > .../source/components/parser/psobject.c | 2 +- > .../source/components/tables/tbxfload.c | 2 +- > src/acpica/source/include/acdisasm.h | 2 + > src/acpica/source/include/acnamesp.h | 1 + > src/acpica/source/include/acpixf.h | 9 +- > src/acpica/source/include/actbinfo.h | 2 + > src/acpica/source/include/actbl3.h | 28 ++++ > 27 files changed, 443 insertions(+), 110 deletions(-) > > diff --git a/src/acpica/fwts_acpica.c b/src/acpica/fwts_acpica.c > index d0c6ed7c..75f8fe3d 100644 > --- a/src/acpica/fwts_acpica.c > +++ b/src/acpica/fwts_acpica.c > @@ -1061,7 +1061,6 @@ int fwts_acpica_init(fwts_framework *fw) > FWTS_ACPICA_MODE(fw, FWTS_ACPICA_MODE_IGNORE_ERRORS); > AcpiGbl_DisableAutoRepair = > FWTS_ACPICA_MODE(fw, FWTS_ACPICA_MODE_DISABLE_AUTO_REPAIR); > - AcpiGbl_GroupModuleLevelCode = FALSE; > AcpiGbl_CstyleDisassembly = FALSE; > > pthread_mutex_init(&mutex_lock_sem_table, NULL); > diff --git a/src/acpica/source/common/adisasm.c b/src/acpica/source/common/adisasm.c > index ed35f31a..70f7932b 100644 > --- a/src/acpica/source/common/adisasm.c > +++ b/src/acpica/source/common/adisasm.c > @@ -775,7 +775,6 @@ AdDoExternalFileList ( > AcpiDmFinishNamespaceLoad (AcpiGbl_ParseOpRoot, > AcpiGbl_RootNode, OwnerId); > AcpiPsDeleteParseTree (AcpiGbl_ParseOpRoot); > - AcpiGbl_ParseOpRoot = NULL; /* for fwts */ > > ExternalListHead = ExternalListHead->Next; > } > diff --git a/src/acpica/source/common/dmtbdump3.c b/src/acpica/source/common/dmtbdump3.c > index 3c1dea6c..1bc3fa6c 100644 > --- a/src/acpica/source/common/dmtbdump3.c > +++ b/src/acpica/source/common/dmtbdump3.c > @@ -486,6 +486,51 @@ AcpiDmDumpTcpa ( > } > > > +/******************************************************************************* > + * > + * FUNCTION: AcpiDmDumpTpm2 > + * > + * PARAMETERS: Table - A TPM2 table > + * > + * RETURN: None > + * > + * DESCRIPTION: Format the contents of a TPM2. > + * > + ******************************************************************************/ > +static void > +AcpiDmDumpTpm2Rev3 ( > + ACPI_TABLE_HEADER *Table) > +{ > + UINT32 Offset = sizeof (ACPI_TABLE_TPM23); > + ACPI_TABLE_TPM23 *CommonHeader = ACPI_CAST_PTR (ACPI_TABLE_TPM23, Table); > + ACPI_TPM23_TRAILER *Subtable = ACPI_ADD_PTR (ACPI_TPM23_TRAILER, Table, Offset); > + ACPI_STATUS Status; > + > + > + /* Main table */ > + > + Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoTpm23); > + if (ACPI_FAILURE (Status)) > + { > + return; > + } > + > + /* Optional subtable if start method is ACPI start method */ > + > + switch (CommonHeader->StartMethod) > + { > + case ACPI_TPM23_ACPI_START_METHOD: > + > + Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, > + Table->Length - Offset, AcpiDmTableInfoTpm23a); > + break; > + > + default: > + break; > + } > +} > + > + > /******************************************************************************* > * > * FUNCTION: AcpiDmDumpTpm2 > @@ -509,9 +554,16 @@ AcpiDmDumpTpm2 ( > ACPI_STATUS Status; > > > + if (Table->Revision == 3) > + { > + AcpiDmDumpTpm2Rev3(Table); > + return; > + } > + > /* Main table */ > > Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoTpm2); > + > if (ACPI_FAILURE (Status)) > { > return; > diff --git a/src/acpica/source/common/dmtbinfo3.c b/src/acpica/source/common/dmtbinfo3.c > index c82e3db5..33d99287 100644 > --- a/src/acpica/source/common/dmtbinfo3.c > +++ b/src/acpica/source/common/dmtbinfo3.c > @@ -446,6 +446,26 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoTcpaServer[] = > * > ******************************************************************************/ > > +/* TPM2 revision 3 */ > + > +ACPI_DMTABLE_INFO AcpiDmTableInfoTpm23[] = > +{ > + {ACPI_DMT_UINT32, ACPI_TPM23_OFFSET (Reserved), "Reserved", 0}, > + {ACPI_DMT_UINT64, ACPI_TPM23_OFFSET (ControlAddress), "Control Address", 0}, > + {ACPI_DMT_UINT32, ACPI_TPM23_OFFSET (StartMethod), "Start Method", 0}, > + ACPI_DMT_TERMINATOR > +}; > + > +/* Trailer in the case that StartMethod == 2 */ > + > +ACPI_DMTABLE_INFO AcpiDmTableInfoTpm23a[] = > +{ > + {ACPI_DMT_UINT32, ACPI_TPM23A_OFFSET (Reserved), "Reserved", DT_OPTIONAL}, > + ACPI_DMT_TERMINATOR > +}; > + > +/* TPM2 revision 4 */ > + > ACPI_DMTABLE_INFO AcpiDmTableInfoTpm2[] = > { > {ACPI_DMT_UINT16, ACPI_TPM2_OFFSET (PlatformClass), "Platform Class", 0}, > diff --git a/src/acpica/source/compiler/aslcompile.c b/src/acpica/source/compiler/aslcompile.c > index e08442e0..4ae19076 100644 > --- a/src/acpica/source/compiler/aslcompile.c > +++ b/src/acpica/source/compiler/aslcompile.c > @@ -858,7 +858,7 @@ CmCleanupAndExit ( > > if (AslGbl_ExceptionCount[ASL_ERROR] > ASL_MAX_ERROR_COUNT) > { > - printf ("\nMaximum error count (%u) exceeded\n", > + printf ("\nMaximum error count (%d) exceeded\n", > ASL_MAX_ERROR_COUNT); > } > > diff --git a/src/acpica/source/compiler/aslerror.c b/src/acpica/source/compiler/aslerror.c > index 6d45cd40..10ea3ec1 100644 > --- a/src/acpica/source/compiler/aslerror.c > +++ b/src/acpica/source/compiler/aslerror.c > @@ -1097,7 +1097,7 @@ AslExpectException ( > > if (AslGbl_ExpectedMessagesIndex >= ASL_MAX_EXPECTED_MESSAGES) > { > - printf ("Too many messages have been registered as expected (max %u)\n", > + printf ("Too many messages have been registered as expected (max %d)\n", > ASL_MAX_DISABLED_MESSAGES); > return (AE_LIMIT); > } > @@ -1144,7 +1144,7 @@ AslDisableException ( > > if (AslGbl_DisabledMessagesIndex >= ASL_MAX_DISABLED_MESSAGES) > { > - printf ("Too many messages have been disabled (max %u)\n", > + printf ("Too many messages have been disabled (max %d)\n", > ASL_MAX_DISABLED_MESSAGES); > return (AE_LIMIT); > } > diff --git a/src/acpica/source/compiler/aslload.c b/src/acpica/source/compiler/aslload.c > index 5bb0a851..7f29b90c 100644 > --- a/src/acpica/source/compiler/aslload.c > +++ b/src/acpica/source/compiler/aslload.c > @@ -417,10 +417,8 @@ LdLoadResourceElements ( > { > Status = AcpiNsLookup (WalkState->ScopeInfo, > InitializerOp->Asl.ExternalName, > - ACPI_TYPE_LOCAL_RESOURCE_FIELD, > - ACPI_IMODE_LOAD_PASS1, > - ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE, > - NULL, &Node); > + ACPI_TYPE_LOCAL_RESOURCE_FIELD, ACPI_IMODE_LOAD_PASS1, > + ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE, NULL, &Node); > if (ACPI_FAILURE (Status)) > { > return (Status); > @@ -687,8 +685,7 @@ LdNamespace1Begin ( > * handle this case. Perhaps someday this case can go away. > */ > Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY, > - ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, > - WalkState, &(Node)); > + ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, WalkState, &Node); > if (ACPI_FAILURE (Status)) > { > if (Status == AE_NOT_FOUND) > @@ -696,23 +693,26 @@ LdNamespace1Begin ( > /* The name was not found, go ahead and create it */ > > Status = AcpiNsLookup (WalkState->ScopeInfo, Path, > - ACPI_TYPE_LOCAL_SCOPE, > - ACPI_IMODE_LOAD_PASS1, Flags, > - WalkState, &(Node)); > + ACPI_TYPE_LOCAL_SCOPE, ACPI_IMODE_LOAD_PASS1, > + Flags, WalkState, &Node); > if (ACPI_FAILURE (Status)) > { > return_ACPI_STATUS (Status); > } > > - /* > - * However, this is an error -- primarily because the MS > - * interpreter can't handle a forward reference from the > - * Scope() operator. > - */ > - AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op, > - Op->Asl.ExternalName); > - AslError (ASL_ERROR, ASL_MSG_SCOPE_FWD_REF, Op, > - Op->Asl.ExternalName); > + /* However, this is an error -- operand to Scope must exist */ > + > + if (strlen (Op->Asl.ExternalName) == ACPI_NAME_SIZE) > + { > + AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op, > + Op->Asl.ExternalName); > + } > + else > + { > + AslError (ASL_ERROR, ASL_MSG_NAMEPATH_NOT_EXIST, Op, > + Op->Asl.ExternalName); > + } > + > goto FinishNode; > } > > @@ -824,7 +824,6 @@ LdNamespace1Begin ( > break; > } > > - > ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Loading name: %s, (%s)\n", > Op->Asl.ExternalName, AcpiUtGetTypeName (ObjectType))); > > @@ -832,6 +831,18 @@ LdNamespace1Begin ( > > Flags |= ACPI_NS_ERROR_IF_FOUND; > > + /* > + * For opcodes that enter new names into the namespace, > + * all prefix NameSegs must exist. > + */ > + WalkState->OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode); > + if (((WalkState->OpInfo->Flags & AML_NAMED) || > + (WalkState->OpInfo->Flags & AML_CREATE)) && > + (Op->Asl.AmlOpcode != AML_EXTERNAL_OP)) > + { > + Flags |= ACPI_NS_PREFIX_MUST_EXIST; > + } > + > /* > * Enter the named type into the internal namespace. We enter the name > * as we go downward in the parse tree. Any necessary subobjects that > @@ -915,8 +926,20 @@ LdNamespace1Begin ( > return_ACPI_STATUS (AE_OK); > } > } > + else if (AE_NOT_FOUND) > + { > + /* > + * One or more prefix NameSegs of the NamePath do not exist > + * (all of them must exist). Attempt to continue compilation > + * by setting the current scope to the root. > + */ > + Node = AcpiGbl_RootNode; > + Status = AE_OK; > + } > else > { > + /* Flag all other errors as coming from the ACPICA core */ > + > AslCoreSubsystemError (Op, Status, > "Failure from namespace lookup", FALSE); > return_ACPI_STATUS (Status); > @@ -1043,10 +1066,10 @@ LdNamespace2Begin ( > > if (Op->Asl.ParseOpcode == PARSEOP_ALIAS) > { > - /* Complete the alias node by getting and saving the target node */ > - > - /* First child is the alias target */ > - > + /* > + * Complete the alias node by getting and saving the target node. > + * First child is the alias target > + */ > Arg = Op->Asl.Child; > > /* Get the target pathname */ > @@ -1070,18 +1093,34 @@ LdNamespace2Begin ( > { > if (Status == AE_NOT_FOUND) > { > - AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op, > - Op->Asl.ExternalName); > + /* Standalone NameSeg vs. NamePath */ > + > + if (strlen (Arg->Asl.ExternalName) == ACPI_NAME_SIZE) > + { > + AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op, > + Arg->Asl.ExternalName); > + } > + else > + { > + AslError (ASL_ERROR, ASL_MSG_NAMEPATH_NOT_EXIST, Op, > + Arg->Asl.ExternalName); > + } > > +#if 0 > +/* > + * NOTE: Removed 10/2018 to enhance compiler error reporting. No > + * regressions seen. > + */ > /* > * The name was not found, go ahead and create it. > * This prevents more errors later. > */ > Status = AcpiNsLookup (WalkState->ScopeInfo, Path, > - ACPI_TYPE_ANY, > - ACPI_IMODE_LOAD_PASS1, ACPI_NS_NO_UPSEARCH, > - WalkState, &(Node)); > - return (AE_OK); > + ACPI_TYPE_ANY, ACPI_IMODE_LOAD_PASS1, > + ACPI_NS_NO_UPSEARCH, WalkState, &Node); > +#endif > + return (Status); > +/* Removed: return (AE_OK)*/ > } > > AslCoreSubsystemError (Op, Status, > diff --git a/src/acpica/source/compiler/aslmain.c b/src/acpica/source/compiler/aslmain.c > index 4f24bb3e..70386f8a 100644 > --- a/src/acpica/source/compiler/aslmain.c > +++ b/src/acpica/source/compiler/aslmain.c > @@ -329,7 +329,7 @@ AslSignalHandler ( > > default: > > - printf (ASL_PREFIX "Unknown interrupt signal (%u)\n", Sig); > + printf (ASL_PREFIX "Unknown interrupt signal (%d)\n", Sig); > break; > } > > diff --git a/src/acpica/source/compiler/aslmessages.c b/src/acpica/source/compiler/aslmessages.c > index 14e140b2..23297183 100644 > --- a/src/acpica/source/compiler/aslmessages.c > +++ b/src/acpica/source/compiler/aslmessages.c > @@ -285,7 +285,7 @@ const char *AslCompilerMsgs [] = > /* ASL_MSG_NON_ASCII */ "Invalid characters found in file", > /* ASL_MSG_NON_ZERO */ "Operand evaluates to zero", > /* ASL_MSG_NOT_EXIST */ "Object does not exist", > -/* ASL_MSG_NOT_FOUND */ "Object not found or not accessible from scope", > +/* ASL_MSG_NOT_FOUND */ "Object not found or not accessible from current scope", > /* ASL_MSG_NOT_METHOD */ "Not a control method, cannot invoke", > /* ASL_MSG_NOT_PARAMETER */ "Not a parameter, used as local only", > /* ASL_MSG_NOT_REACHABLE */ "Object is not accessible from this scope", > @@ -359,7 +359,9 @@ const char *AslCompilerMsgs [] = > /* ASL_MSG_OEM_ID */ "Invalid OEM ID", > /* ASL_MSG_UNLOAD */ "Unload is not supported by all operating systems", > /* ASL_MSG_OFFSET */ "Unnecessary/redundant use of Offset operator", > -/* ASL_MSG_LONG_SLEEP */ "Very long Sleep, greater than 1 second" > +/* ASL_MSG_LONG_SLEEP */ "Very long Sleep, greater than 1 second", > +/* ASL_MSG_PREFIX_NOT_EXIST */ "One or more prefix Scopes do not exist", > +/* ASL_MSG_NAMEPATH_NOT_EXIST */ "One or more objects within the Pathname do not exist" > }; > > /* Table compiler */ > diff --git a/src/acpica/source/compiler/aslmessages.h b/src/acpica/source/compiler/aslmessages.h > index 907744a2..c932aded 100644 > --- a/src/acpica/source/compiler/aslmessages.h > +++ b/src/acpica/source/compiler/aslmessages.h > @@ -362,6 +362,8 @@ typedef enum > ASL_MSG_UNLOAD, > ASL_MSG_OFFSET, > ASL_MSG_LONG_SLEEP, > + ASL_MSG_PREFIX_NOT_EXIST, > + ASL_MSG_NAMEPATH_NOT_EXIST, > > /* These messages are used by the Data Table compiler only */ > > diff --git a/src/acpica/source/compiler/aslpredef.c b/src/acpica/source/compiler/aslpredef.c > index bc30fe91..ae806412 100644 > --- a/src/acpica/source/compiler/aslpredef.c > +++ b/src/acpica/source/compiler/aslpredef.c > @@ -222,7 +222,7 @@ ApCheckForPredefinedMethod ( > > if (MethodInfo->NumArguments != 0) > { > - sprintf (AslGbl_MsgBuffer, "%s requires %u", Op->Asl.ExternalName, 0); > + sprintf (AslGbl_MsgBuffer, "%s requires %d", Op->Asl.ExternalName, 0); > > AslError (ASL_WARNING, ASL_MSG_RESERVED_ARG_COUNT_HI, Op, > AslGbl_MsgBuffer); > diff --git a/src/acpica/source/compiler/aslxref.c b/src/acpica/source/compiler/aslxref.c > index 5273ea82..8b213577 100644 > --- a/src/acpica/source/compiler/aslxref.c > +++ b/src/acpica/source/compiler/aslxref.c > @@ -718,11 +718,34 @@ XfNamespaceLocateBegin ( > } > else > { > - /* Check for a fully qualified path */ > + /* The NamePath contains multiple NameSegs */ > > - if (Path[0] == AML_ROOT_PREFIX) > + if ((OpInfo->Flags & AML_CREATE) || > + (OpInfo->ObjectType == ACPI_TYPE_LOCAL_ALIAS)) > { > - /* Gave full path, the object does not exist */ > + /* > + * The new name is the last parameter. For the > + * CreateXXXXField and Alias operators > + */ > + NextOp = Op->Asl.Child; > + while (!(NextOp->Asl.CompileFlags & OP_IS_NAME_DECLARATION)) > + { > + NextOp = NextOp->Asl.Next; > + } > + > + AslError (ASL_ERROR, ASL_MSG_PREFIX_NOT_EXIST, NextOp, > + NextOp->Asl.ExternalName); > + } > + else if (OpInfo->Flags & AML_NAMED) > + { > + /* The new name is the first parameter */ > + > + AslError (ASL_ERROR, ASL_MSG_PREFIX_NOT_EXIST, Op, > + Op->Asl.ExternalName); > + } > + else if (Path[0] == AML_ROOT_PREFIX) > + { > + /* Full namepath from root, the object does not exist */ > > AslError (ASL_ERROR, ASL_MSG_NOT_EXIST, Op, > Op->Asl.ExternalName); > @@ -730,11 +753,20 @@ XfNamespaceLocateBegin ( > else > { > /* > - * We can't tell whether it doesn't exist or just > - * can't be reached. > + * Generic "not found" error. Cannot determine whether it > + * doesn't exist or just can't be reached. However, we > + * can differentiate between a NameSeg vs. NamePath. > */ > - AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op, > - Op->Asl.ExternalName); > + if (strlen (Op->Asl.ExternalName) == ACPI_NAME_SIZE) > + { > + AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op, > + Op->Asl.ExternalName); > + } > + else > + { > + AslError (ASL_ERROR, ASL_MSG_NAMEPATH_NOT_EXIST, Op, > + Op->Asl.ExternalName); > + } > } > } > > diff --git a/src/acpica/source/compiler/dtio.c b/src/acpica/source/compiler/dtio.c > index b15d3b97..bd189053 100644 > --- a/src/acpica/source/compiler/dtio.c > +++ b/src/acpica/source/compiler/dtio.c > @@ -236,7 +236,7 @@ DtTrim ( > > /* Skip lines that start with a space */ > > - if (!strcmp (String, " ")) > + if (*String == 0 || !strcmp (String, " ")) > { > ReturnString = UtLocalCacheCalloc (1); > return (ReturnString); > @@ -258,7 +258,7 @@ DtTrim ( > > while (End >= Start) > { > - if (*End == '\r' || *End == '\n') > + if (*End == '\n') > { > End--; > continue; > @@ -522,6 +522,7 @@ DtGetNextLine ( > UINT32 CurrentLineOffset; > UINT32 i; > int c; > + int c1; > > > memset (AslGbl_CurrentLineBuffer, 0, AslGbl_LineBufferSize); > @@ -569,6 +570,29 @@ DtGetNextLine ( > c = '\n'; > State = DT_NORMAL_TEXT; > } > + else if (c == '\r') > + { > + c1 = getc (Handle); > + if (c1 == '\n') > + { > + /* > + * Skip the carriage return as if it didn't exist. This is > + * onlt meant for input files in DOS format in unix. fopen in > + * unix may not support "text mode" and leaves CRLF intact. > + */ > + c = '\n'; > + } > + else > + { > + /* This was not a CRLF. Only a CR */ > + > + ungetc(c1, Handle); > + > + DtFatal (ASL_MSG_COMPILER_INTERNAL, NULL, > + "Carriage return without linefeed detected"); > + return (ASL_EOF); > + } > + } > > switch (State) > { > diff --git a/src/acpica/source/compiler/dttable2.c b/src/acpica/source/compiler/dttable2.c > index 3f970377..0b196a2f 100644 > --- a/src/acpica/source/compiler/dttable2.c > +++ b/src/acpica/source/compiler/dttable2.c > @@ -1876,6 +1876,62 @@ DtCompileTcpa ( > } > > > +/****************************************************************************** > + * > + * FUNCTION: DtCompileTpm2Rev3 > + * > + * PARAMETERS: PFieldList - Current field list pointer > + * > + * RETURN: Status > + * > + * DESCRIPTION: Compile TPM2 revision 3 > + * > + *****************************************************************************/ > +static ACPI_STATUS > +DtCompileTpm2Rev3 ( > + void **List) > +{ > + DT_FIELD **PFieldList = (DT_FIELD **) List; > + DT_SUBTABLE *Subtable; > + ACPI_TABLE_TPM23 *Tpm23Header; > + DT_SUBTABLE *ParentTable; > + ACPI_STATUS Status = AE_OK; > + > + > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm23, > + &Subtable); > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + Tpm23Header = ACPI_CAST_PTR (ACPI_TABLE_TPM23, ParentTable->Buffer); > + > + /* Subtable type depends on the StartMethod */ > + > + switch (Tpm23Header->StartMethod) > + { > + case ACPI_TPM23_ACPI_START_METHOD: > + > + /* Subtable specific to to ARM_SMC */ > + > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm23a, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + break; > + > + default: > + break; > + } > + > + return (Status); > +} > + > + > /****************************************************************************** > * > * FUNCTION: DtCompileTpm2 > @@ -1897,8 +1953,18 @@ DtCompileTpm2 ( > ACPI_TABLE_TPM2 *Tpm2Header; > DT_SUBTABLE *ParentTable; > ACPI_STATUS Status = AE_OK; > + ACPI_TABLE_HEADER *Header; > > > + ParentTable = DtPeekSubtable (); > + > + Header = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer); > + > + if (Header->Revision == 3) > + { > + return (DtCompileTpm2Rev3 (List)); > + } > + > /* Compile the main table */ > > Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm2, > diff --git a/src/acpica/source/compiler/prscan.c b/src/acpica/source/compiler/prscan.c > index 580b47f0..325569ed 100644 > --- a/src/acpica/source/compiler/prscan.c > +++ b/src/acpica/source/compiler/prscan.c > @@ -1259,7 +1259,6 @@ PrPopDirective ( > AslGbl_DirectiveInfo[Info->Directive].Name, > Info->Argument, AslGbl_IgnoringThisCodeBlock ? "TRUE" : "FALSE"); > > - ACPI_FREE (Info); > return (AE_OK); > } > > diff --git a/src/acpica/source/components/debugger/dbxface.c b/src/acpica/source/components/debugger/dbxface.c > index c661b248..a0f3ed6b 100644 > --- a/src/acpica/source/components/debugger/dbxface.c > +++ b/src/acpica/source/components/debugger/dbxface.c > @@ -174,6 +174,12 @@ AcpiDbMethodEnd ( > ACPI_WALK_STATE *WalkState); > #endif > > +#ifdef ACPI_DISASSEMBLER > +static ACPI_PARSE_OBJECT * > +AcpiDbGetDisplayOp ( > + ACPI_WALK_STATE *WalkState, > + ACPI_PARSE_OBJECT *Op); > +#endif > > /******************************************************************************* > * > @@ -273,6 +279,74 @@ AcpiDbSignalBreakPoint ( > } > > > +#ifdef ACPI_DISASSEMBLER > +/******************************************************************************* > + * > + * FUNCTION: AcpiDbGetDisplayOp > + * > + * PARAMETERS: WalkState - Current walk > + * Op - Current executing op (from aml interpreter) > + * > + * RETURN: Opcode to display > + * > + * DESCRIPTION: Find the opcode to display during single stepping > + * > + ******************************************************************************/ > + > +static ACPI_PARSE_OBJECT * > +AcpiDbGetDisplayOp ( > + ACPI_WALK_STATE *WalkState, > + ACPI_PARSE_OBJECT *Op) > +{ > + ACPI_PARSE_OBJECT *DisplayOp; > + ACPI_PARSE_OBJECT *ParentOp; > + > + DisplayOp = Op; > + ParentOp = Op->Common.Parent; > + if (ParentOp) > + { > + if ((WalkState->ControlState) && > + (WalkState->ControlState->Common.State == > + ACPI_CONTROL_PREDICATE_EXECUTING)) > + { > + /* > + * We are executing the predicate of an IF or WHILE statement > + * Search upwards for the containing IF or WHILE so that the > + * entire predicate can be displayed. > + */ > + while (ParentOp) > + { > + if ((ParentOp->Common.AmlOpcode == AML_IF_OP) || > + (ParentOp->Common.AmlOpcode == AML_WHILE_OP)) > + { > + DisplayOp = ParentOp; > + break; > + } > + ParentOp = ParentOp->Common.Parent; > + } > + } > + else > + { > + while (ParentOp) > + { > + if ((ParentOp->Common.AmlOpcode == AML_IF_OP) || > + (ParentOp->Common.AmlOpcode == AML_ELSE_OP) || > + (ParentOp->Common.AmlOpcode == AML_SCOPE_OP) || > + (ParentOp->Common.AmlOpcode == AML_METHOD_OP) || > + (ParentOp->Common.AmlOpcode == AML_WHILE_OP)) > + { > + break; > + } > + DisplayOp = ParentOp; > + ParentOp = ParentOp->Common.Parent; > + } > + } > + } > + return DisplayOp; > +} > +#endif > + > + > /******************************************************************************* > * > * FUNCTION: AcpiDbSingleStep > @@ -296,8 +370,6 @@ AcpiDbSingleStep ( > ACPI_PARSE_OBJECT *Next; > ACPI_STATUS Status = AE_OK; > UINT32 OriginalDebugLevel; > - ACPI_PARSE_OBJECT *DisplayOp; > - ACPI_PARSE_OBJECT *ParentOp; > UINT32 AmlOffset; > > > @@ -393,53 +465,11 @@ AcpiDbSingleStep ( > Next = Op->Common.Next; > Op->Common.Next = NULL; > > - > - DisplayOp = Op; > - ParentOp = Op->Common.Parent; > - if (ParentOp) > - { > - if ((WalkState->ControlState) && > - (WalkState->ControlState->Common.State == > - ACPI_CONTROL_PREDICATE_EXECUTING)) > - { > - /* > - * We are executing the predicate of an IF or WHILE statement > - * Search upwards for the containing IF or WHILE so that the > - * entire predicate can be displayed. > - */ > - while (ParentOp) > - { > - if ((ParentOp->Common.AmlOpcode == AML_IF_OP) || > - (ParentOp->Common.AmlOpcode == AML_WHILE_OP)) > - { > - DisplayOp = ParentOp; > - break; > - } > - ParentOp = ParentOp->Common.Parent; > - } > - } > - else > - { > - while (ParentOp) > - { > - if ((ParentOp->Common.AmlOpcode == AML_IF_OP) || > - (ParentOp->Common.AmlOpcode == AML_ELSE_OP) || > - (ParentOp->Common.AmlOpcode == AML_SCOPE_OP) || > - (ParentOp->Common.AmlOpcode == AML_METHOD_OP) || > - (ParentOp->Common.AmlOpcode == AML_WHILE_OP)) > - { > - break; > - } > - DisplayOp = ParentOp; > - ParentOp = ParentOp->Common.Parent; > - } > - } > - } > - > /* Now we can disassemble and display it */ > > #ifdef ACPI_DISASSEMBLER > - AcpiDmDisassemble (WalkState, DisplayOp, ACPI_UINT32_MAX); > + AcpiDmDisassemble (WalkState, AcpiDbGetDisplayOp (WalkState, Op), > + ACPI_UINT32_MAX); > #else > /* > * The AML Disassembler is not configured - at least we can > diff --git a/src/acpica/source/components/dispatcher/dsopcode.c b/src/acpica/source/components/dispatcher/dsopcode.c > index 038993c7..ca2cd470 100644 > --- a/src/acpica/source/components/dispatcher/dsopcode.c > +++ b/src/acpica/source/components/dispatcher/dsopcode.c > @@ -586,6 +586,9 @@ AcpiDsEvalRegionOperands ( > ObjDesc, ACPI_FORMAT_UINT64 (ObjDesc->Region.Address), > ObjDesc->Region.Length)); > > + Status = AcpiUtAddAddressRange (ObjDesc->Region.SpaceId, > + ObjDesc->Region.Address, ObjDesc->Region.Length, Node); > + > /* Now the address and length are valid for this opregion */ > > ObjDesc->Region.Flags |= AOPOBJ_DATA_VALID; > diff --git a/src/acpica/source/components/dispatcher/dswload2.c b/src/acpica/source/components/dispatcher/dswload2.c > index 9bc6ecfa..4b6e41d8 100644 > --- a/src/acpica/source/components/dispatcher/dswload2.c > +++ b/src/acpica/source/components/dispatcher/dswload2.c > @@ -448,6 +448,15 @@ AcpiDsLoad2BeginOp ( > } > #endif > > + /* > + * For name creation opcodes, the full namepath prefix must > + * exist, except for the final (new) nameseg. > + */ > + if (WalkState->OpInfo->Flags & AML_NAMED) > + { > + Flags |= ACPI_NS_PREFIX_MUST_EXIST; > + } > + > /* Add new entry or lookup existing entry */ > > Status = AcpiNsLookup (WalkState->ScopeInfo, BufferPtr, ObjectType, > diff --git a/src/acpica/source/components/namespace/nsaccess.c b/src/acpica/source/components/namespace/nsaccess.c > index af97c51f..11c652e0 100644 > --- a/src/acpica/source/components/namespace/nsaccess.c > +++ b/src/acpica/source/components/namespace/nsaccess.c > @@ -421,6 +421,7 @@ AcpiNsLookup ( > ACPI_OBJECT_TYPE ThisSearchType; > UINT32 SearchParentFlag = ACPI_NS_SEARCH_PARENT; > UINT32 LocalFlags; > + ACPI_INTERPRETER_MODE LocalInterpreterMode; > > > ACPI_FUNCTION_TRACE (NsLookup); > @@ -670,6 +671,7 @@ AcpiNsLookup ( > */ > ThisSearchType = ACPI_TYPE_ANY; > CurrentNode = ThisNode; > + > while (NumSegments && CurrentNode) > { > NumSegments--; > @@ -704,6 +706,16 @@ AcpiNsLookup ( > } > } > > + /* Handle opcodes that create a new NameSeg via a full NamePath */ > + > + LocalInterpreterMode = InterpreterMode; > + if ((Flags & ACPI_NS_PREFIX_MUST_EXIST) && (NumSegments > 0)) > + { > + /* Every element of the path must exist (except for the final NameSeg) */ > + > + LocalInterpreterMode = ACPI_IMODE_EXECUTE; > + } > + > /* Extract one ACPI name from the front of the pathname */ > > ACPI_MOVE_32_TO_32 (&SimpleName, Path); > @@ -711,11 +723,18 @@ AcpiNsLookup ( > /* Try to find the single (4 character) ACPI name */ > > Status = AcpiNsSearchAndEnter (SimpleName, WalkState, CurrentNode, > - InterpreterMode, ThisSearchType, LocalFlags, &ThisNode); > + LocalInterpreterMode, ThisSearchType, LocalFlags, &ThisNode); > if (ACPI_FAILURE (Status)) > { > if (Status == AE_NOT_FOUND) > { > +#if !defined ACPI_ASL_COMPILER /* Note: iASL reports this error by itself, not needed here */ > + if (Flags & ACPI_NS_PREFIX_MUST_EXIST) > + { > + AcpiOsPrintf (ACPI_MSG_BIOS_ERROR > + "Object does not exist: %4.4s\n", &SimpleName); > + } > +#endif > /* Name not found in ACPI namespace */ > > ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, > diff --git a/src/acpica/source/components/parser/psloop.c b/src/acpica/source/components/parser/psloop.c > index ef517b54..9625834c 100644 > --- a/src/acpica/source/components/parser/psloop.c > +++ b/src/acpica/source/components/parser/psloop.c > @@ -298,7 +298,7 @@ AcpiPsGetArguments ( > * future. Use of this option can cause problems with AML code that > * depends upon in-order immediate execution of module-level code. > */ > - if (AcpiGbl_GroupModuleLevelCode && > + if (!AcpiGbl_ExecuteTablesAsMethods && > (WalkState->PassNumber <= ACPI_IMODE_LOAD_PASS2) && > ((WalkState->ParseFlags & ACPI_PARSE_DISASSEMBLE) == 0)) > { > @@ -566,6 +566,7 @@ AcpiPsParseLoop ( > ACPI_PARSE_OBJECT *Op = NULL; /* current op */ > ACPI_PARSE_STATE *ParserState; > UINT8 *AmlOpStart = NULL; > + UINT8 OpcodeLength; > > > ACPI_FUNCTION_TRACE_PTR (PsParseLoop, WalkState); > @@ -654,7 +655,7 @@ AcpiPsParseLoop ( > * status to AE_OK to proceed with the table load. > */ > if ((WalkState->ParseFlags & ACPI_PARSE_MODULE_LEVEL) && > - Status == AE_ALREADY_EXISTS) > + ((Status == AE_ALREADY_EXISTS) || (Status == AE_NOT_FOUND))) > { > Status = AE_OK; > } > @@ -686,9 +687,20 @@ AcpiPsParseLoop ( > * the scope op because the parse failure indicates that > * the device may not exist. > */ > - ACPI_ERROR ((AE_INFO, "Skip parsing opcode %s", > - AcpiPsGetOpcodeName (WalkState->Opcode))); > - WalkState->ParserState.Aml = WalkState->Aml + 1; > + ACPI_INFO (("Skipping parse of AML opcode: %s (0x%4.4X)", > + AcpiPsGetOpcodeName (WalkState->Opcode), WalkState->Opcode)); > + > + /* > + * Determine the opcode length before skipping the opcode. > + * An opcode can be 1 byte or 2 bytes in length. > + */ > + OpcodeLength = 1; > + if ((WalkState->Opcode & 0xFF00) == AML_EXTENDED_OPCODE) > + { > + OpcodeLength = 2; > + } > + WalkState->ParserState.Aml = WalkState->Aml + OpcodeLength; > + > WalkState->ParserState.Aml = > AcpiPsGetNextPackageEnd(&WalkState->ParserState); > WalkState->Aml = WalkState->ParserState.Aml; > diff --git a/src/acpica/source/components/parser/psobject.c b/src/acpica/source/components/parser/psobject.c > index 8d6f81bd..ca7ab0ae 100644 > --- a/src/acpica/source/components/parser/psobject.c > +++ b/src/acpica/source/components/parser/psobject.c > @@ -773,7 +773,7 @@ AcpiPsCompleteOp ( > * because there could be correct AML beyond the parts that caused > * the runtime error. > */ > - ACPI_ERROR ((AE_INFO, "Ignore error and continue table load")); > + ACPI_INFO (("Ignoring error and continuing table load")); > return_ACPI_STATUS (AE_OK); > } > return_ACPI_STATUS (Status); > diff --git a/src/acpica/source/components/tables/tbxfload.c b/src/acpica/source/components/tables/tbxfload.c > index 0119b684..a956806e 100644 > --- a/src/acpica/source/components/tables/tbxfload.c > +++ b/src/acpica/source/components/tables/tbxfload.c > @@ -219,7 +219,7 @@ AcpiLoadTables ( > "While loading namespace from ACPI tables")); > } > > - if (AcpiGbl_ExecuteTablesAsMethods || !AcpiGbl_GroupModuleLevelCode) > + if (AcpiGbl_ExecuteTablesAsMethods) > { > /* > * If the module-level code support is enabled, initialize the objects > diff --git a/src/acpica/source/include/acdisasm.h b/src/acpica/source/include/acdisasm.h > index b774b20f..edd108d2 100644 > --- a/src/acpica/source/include/acdisasm.h > +++ b/src/acpica/source/include/acdisasm.h > @@ -561,6 +561,8 @@ extern ACPI_DMTABLE_INFO AcpiDmTableInfoTcpaServer[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoTpm2[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoTpm2a[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoTpm211[]; > +extern ACPI_DMTABLE_INFO AcpiDmTableInfoTpm23[]; > +extern ACPI_DMTABLE_INFO AcpiDmTableInfoTpm23a[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoUefi[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoVrtc[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoVrtc0[]; > diff --git a/src/acpica/source/include/acnamesp.h b/src/acpica/source/include/acnamesp.h > index 1e3db8d1..7c2083d3 100644 > --- a/src/acpica/source/include/acnamesp.h > +++ b/src/acpica/source/include/acnamesp.h > @@ -177,6 +177,7 @@ > #define ACPI_NS_TEMPORARY 0x0040 > #define ACPI_NS_OVERRIDE_IF_FOUND 0x0080 > #define ACPI_NS_EARLY_INIT 0x0100 > +#define ACPI_NS_PREFIX_MUST_EXIST 0x0200 > > /* Flags for AcpiNsWalkNamespace */ > > diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h > index aaf284cb..27e9aa7f 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 0x20181003 > +#define ACPI_CA_VERSION 0x20181031 > > #include "acconfig.h" > #include "actypes.h" > @@ -300,13 +300,6 @@ ACPI_INIT_GLOBAL (UINT8, AcpiGbl_CopyDsdtLocally, FALSE); > */ > ACPI_INIT_GLOBAL (UINT8, AcpiGbl_DoNotUseXsdt, FALSE); > > -/* > - * Optionally support group module level code. > - * NOTE, this is essentially obsolete and will be removed soon > - * (01/2018). > - */ > -ACPI_INIT_GLOBAL (UINT8, AcpiGbl_GroupModuleLevelCode, FALSE); > - > /* > * Optionally support module level code by parsing an entire table as > * a method as it is loaded. Default is TRUE. > diff --git a/src/acpica/source/include/actbinfo.h b/src/acpica/source/include/actbinfo.h > index 347a3940..19eeeccb 100644 > --- a/src/acpica/source/include/actbinfo.h > +++ b/src/acpica/source/include/actbinfo.h > @@ -194,6 +194,7 @@ > #define ACPI_STAO_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_STAO,f) > #define ACPI_TCPA_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_TCPA_HDR,f) > #define ACPI_TPM2_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_TPM2,f) > +#define ACPI_TPM23_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_TPM23,f) > #define ACPI_UEFI_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_UEFI,f) > #define ACPI_WAET_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_WAET,f) > #define ACPI_WDAT_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_WDAT,f) > @@ -337,6 +338,7 @@ > #define ACPI_TCPA_SERVER_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_TCPA_SERVER,f) > #define ACPI_TPM2A_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TPM2_TRAILER,f) > #define ACPI_TPM211_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TPM2_ARM_SMC,f) > +#define ACPI_TPM23A_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TPM23_TRAILER,f) > #define ACPI_VRTC0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_VRTC_ENTRY,f) > #define ACPI_WDAT0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_WDAT_ENTRY,f) > > diff --git a/src/acpica/source/include/actbl3.h b/src/acpica/source/include/actbl3.h > index d4c15838..99b466c1 100644 > --- a/src/acpica/source/include/actbl3.h > +++ b/src/acpica/source/include/actbl3.h > @@ -552,6 +552,34 @@ typedef struct acpi_table_tcpa_server > * > ******************************************************************************/ > > +/* Revision 3 */ > + > +typedef struct acpi_table_tpm23 > +{ > + ACPI_TABLE_HEADER Header; /* Common ACPI table header */ > + UINT32 Reserved; > + UINT64 ControlAddress; > + UINT32 StartMethod; > + > +} ACPI_TABLE_TPM23; > + > +/* Value for StartMethod above */ > + > +#define ACPI_TPM23_ACPI_START_METHOD 2 > + > +/* > + * Optional trailer for revision 3. If start method is 2, there is a 4 byte > + * reserved area of all zeros. > + */ > +typedef struct acpi_tmp23_trailer > +{ > + UINT32 Reserved; > + > +} ACPI_TPM23_TRAILER; > + > + > +/* Revision 4 */ > + > typedef struct acpi_table_tpm2 > { > ACPI_TABLE_HEADER Header; /* Common ACPI table header */ > Acked-by: Alex Hung <alex.hung@canonical.com>
On 11/1/18 5:26 PM, 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/pipermail/devel/2018-October/001832.html > > Signed-off-by: Colin Ian King <colin.king@canonical.com> > --- > src/acpica/fwts_acpica.c | 1 - > src/acpica/source/common/adisasm.c | 1 - > src/acpica/source/common/dmtbdump3.c | 52 ++++++++ > src/acpica/source/common/dmtbinfo3.c | 20 +++ > src/acpica/source/compiler/aslcompile.c | 2 +- > src/acpica/source/compiler/aslerror.c | 4 +- > src/acpica/source/compiler/aslload.c | 97 +++++++++----- > src/acpica/source/compiler/aslmain.c | 2 +- > src/acpica/source/compiler/aslmessages.c | 6 +- > src/acpica/source/compiler/aslmessages.h | 2 + > src/acpica/source/compiler/aslpredef.c | 2 +- > src/acpica/source/compiler/aslxref.c | 46 ++++++- > src/acpica/source/compiler/dtio.c | 28 +++- > src/acpica/source/compiler/dttable2.c | 66 ++++++++++ > src/acpica/source/compiler/prscan.c | 1 - > .../source/components/debugger/dbxface.c | 122 +++++++++++------- > .../source/components/dispatcher/dsopcode.c | 3 + > .../source/components/dispatcher/dswload2.c | 9 ++ > .../source/components/namespace/nsaccess.c | 21 ++- > src/acpica/source/components/parser/psloop.c | 22 +++- > .../source/components/parser/psobject.c | 2 +- > .../source/components/tables/tbxfload.c | 2 +- > src/acpica/source/include/acdisasm.h | 2 + > src/acpica/source/include/acnamesp.h | 1 + > src/acpica/source/include/acpixf.h | 9 +- > src/acpica/source/include/actbinfo.h | 2 + > src/acpica/source/include/actbl3.h | 28 ++++ > 27 files changed, 443 insertions(+), 110 deletions(-) > > diff --git a/src/acpica/fwts_acpica.c b/src/acpica/fwts_acpica.c > index d0c6ed7c..75f8fe3d 100644 > --- a/src/acpica/fwts_acpica.c > +++ b/src/acpica/fwts_acpica.c > @@ -1061,7 +1061,6 @@ int fwts_acpica_init(fwts_framework *fw) > FWTS_ACPICA_MODE(fw, FWTS_ACPICA_MODE_IGNORE_ERRORS); > AcpiGbl_DisableAutoRepair = > FWTS_ACPICA_MODE(fw, FWTS_ACPICA_MODE_DISABLE_AUTO_REPAIR); > - AcpiGbl_GroupModuleLevelCode = FALSE; > AcpiGbl_CstyleDisassembly = FALSE; > > pthread_mutex_init(&mutex_lock_sem_table, NULL); > diff --git a/src/acpica/source/common/adisasm.c b/src/acpica/source/common/adisasm.c > index ed35f31a..70f7932b 100644 > --- a/src/acpica/source/common/adisasm.c > +++ b/src/acpica/source/common/adisasm.c > @@ -775,7 +775,6 @@ AdDoExternalFileList ( > AcpiDmFinishNamespaceLoad (AcpiGbl_ParseOpRoot, > AcpiGbl_RootNode, OwnerId); > AcpiPsDeleteParseTree (AcpiGbl_ParseOpRoot); > - AcpiGbl_ParseOpRoot = NULL; /* for fwts */ > > ExternalListHead = ExternalListHead->Next; > } > diff --git a/src/acpica/source/common/dmtbdump3.c b/src/acpica/source/common/dmtbdump3.c > index 3c1dea6c..1bc3fa6c 100644 > --- a/src/acpica/source/common/dmtbdump3.c > +++ b/src/acpica/source/common/dmtbdump3.c > @@ -486,6 +486,51 @@ AcpiDmDumpTcpa ( > } > > > +/******************************************************************************* > + * > + * FUNCTION: AcpiDmDumpTpm2 > + * > + * PARAMETERS: Table - A TPM2 table > + * > + * RETURN: None > + * > + * DESCRIPTION: Format the contents of a TPM2. > + * > + ******************************************************************************/ > +static void > +AcpiDmDumpTpm2Rev3 ( > + ACPI_TABLE_HEADER *Table) > +{ > + UINT32 Offset = sizeof (ACPI_TABLE_TPM23); > + ACPI_TABLE_TPM23 *CommonHeader = ACPI_CAST_PTR (ACPI_TABLE_TPM23, Table); > + ACPI_TPM23_TRAILER *Subtable = ACPI_ADD_PTR (ACPI_TPM23_TRAILER, Table, Offset); > + ACPI_STATUS Status; > + > + > + /* Main table */ > + > + Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoTpm23); > + if (ACPI_FAILURE (Status)) > + { > + return; > + } > + > + /* Optional subtable if start method is ACPI start method */ > + > + switch (CommonHeader->StartMethod) > + { > + case ACPI_TPM23_ACPI_START_METHOD: > + > + Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, > + Table->Length - Offset, AcpiDmTableInfoTpm23a); > + break; > + > + default: > + break; > + } > +} > + > + > /******************************************************************************* > * > * FUNCTION: AcpiDmDumpTpm2 > @@ -509,9 +554,16 @@ AcpiDmDumpTpm2 ( > ACPI_STATUS Status; > > > + if (Table->Revision == 3) > + { > + AcpiDmDumpTpm2Rev3(Table); > + return; > + } > + > /* Main table */ > > Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoTpm2); > + > if (ACPI_FAILURE (Status)) > { > return; > diff --git a/src/acpica/source/common/dmtbinfo3.c b/src/acpica/source/common/dmtbinfo3.c > index c82e3db5..33d99287 100644 > --- a/src/acpica/source/common/dmtbinfo3.c > +++ b/src/acpica/source/common/dmtbinfo3.c > @@ -446,6 +446,26 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoTcpaServer[] = > * > ******************************************************************************/ > > +/* TPM2 revision 3 */ > + > +ACPI_DMTABLE_INFO AcpiDmTableInfoTpm23[] = > +{ > + {ACPI_DMT_UINT32, ACPI_TPM23_OFFSET (Reserved), "Reserved", 0}, > + {ACPI_DMT_UINT64, ACPI_TPM23_OFFSET (ControlAddress), "Control Address", 0}, > + {ACPI_DMT_UINT32, ACPI_TPM23_OFFSET (StartMethod), "Start Method", 0}, > + ACPI_DMT_TERMINATOR > +}; > + > +/* Trailer in the case that StartMethod == 2 */ > + > +ACPI_DMTABLE_INFO AcpiDmTableInfoTpm23a[] = > +{ > + {ACPI_DMT_UINT32, ACPI_TPM23A_OFFSET (Reserved), "Reserved", DT_OPTIONAL}, > + ACPI_DMT_TERMINATOR > +}; > + > +/* TPM2 revision 4 */ > + > ACPI_DMTABLE_INFO AcpiDmTableInfoTpm2[] = > { > {ACPI_DMT_UINT16, ACPI_TPM2_OFFSET (PlatformClass), "Platform Class", 0}, > diff --git a/src/acpica/source/compiler/aslcompile.c b/src/acpica/source/compiler/aslcompile.c > index e08442e0..4ae19076 100644 > --- a/src/acpica/source/compiler/aslcompile.c > +++ b/src/acpica/source/compiler/aslcompile.c > @@ -858,7 +858,7 @@ CmCleanupAndExit ( > > if (AslGbl_ExceptionCount[ASL_ERROR] > ASL_MAX_ERROR_COUNT) > { > - printf ("\nMaximum error count (%u) exceeded\n", > + printf ("\nMaximum error count (%d) exceeded\n", > ASL_MAX_ERROR_COUNT); > } > > diff --git a/src/acpica/source/compiler/aslerror.c b/src/acpica/source/compiler/aslerror.c > index 6d45cd40..10ea3ec1 100644 > --- a/src/acpica/source/compiler/aslerror.c > +++ b/src/acpica/source/compiler/aslerror.c > @@ -1097,7 +1097,7 @@ AslExpectException ( > > if (AslGbl_ExpectedMessagesIndex >= ASL_MAX_EXPECTED_MESSAGES) > { > - printf ("Too many messages have been registered as expected (max %u)\n", > + printf ("Too many messages have been registered as expected (max %d)\n", > ASL_MAX_DISABLED_MESSAGES); > return (AE_LIMIT); > } > @@ -1144,7 +1144,7 @@ AslDisableException ( > > if (AslGbl_DisabledMessagesIndex >= ASL_MAX_DISABLED_MESSAGES) > { > - printf ("Too many messages have been disabled (max %u)\n", > + printf ("Too many messages have been disabled (max %d)\n", > ASL_MAX_DISABLED_MESSAGES); > return (AE_LIMIT); > } > diff --git a/src/acpica/source/compiler/aslload.c b/src/acpica/source/compiler/aslload.c > index 5bb0a851..7f29b90c 100644 > --- a/src/acpica/source/compiler/aslload.c > +++ b/src/acpica/source/compiler/aslload.c > @@ -417,10 +417,8 @@ LdLoadResourceElements ( > { > Status = AcpiNsLookup (WalkState->ScopeInfo, > InitializerOp->Asl.ExternalName, > - ACPI_TYPE_LOCAL_RESOURCE_FIELD, > - ACPI_IMODE_LOAD_PASS1, > - ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE, > - NULL, &Node); > + ACPI_TYPE_LOCAL_RESOURCE_FIELD, ACPI_IMODE_LOAD_PASS1, > + ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE, NULL, &Node); > if (ACPI_FAILURE (Status)) > { > return (Status); > @@ -687,8 +685,7 @@ LdNamespace1Begin ( > * handle this case. Perhaps someday this case can go away. > */ > Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY, > - ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, > - WalkState, &(Node)); > + ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, WalkState, &Node); > if (ACPI_FAILURE (Status)) > { > if (Status == AE_NOT_FOUND) > @@ -696,23 +693,26 @@ LdNamespace1Begin ( > /* The name was not found, go ahead and create it */ > > Status = AcpiNsLookup (WalkState->ScopeInfo, Path, > - ACPI_TYPE_LOCAL_SCOPE, > - ACPI_IMODE_LOAD_PASS1, Flags, > - WalkState, &(Node)); > + ACPI_TYPE_LOCAL_SCOPE, ACPI_IMODE_LOAD_PASS1, > + Flags, WalkState, &Node); > if (ACPI_FAILURE (Status)) > { > return_ACPI_STATUS (Status); > } > > - /* > - * However, this is an error -- primarily because the MS > - * interpreter can't handle a forward reference from the > - * Scope() operator. > - */ > - AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op, > - Op->Asl.ExternalName); > - AslError (ASL_ERROR, ASL_MSG_SCOPE_FWD_REF, Op, > - Op->Asl.ExternalName); > + /* However, this is an error -- operand to Scope must exist */ > + > + if (strlen (Op->Asl.ExternalName) == ACPI_NAME_SIZE) > + { > + AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op, > + Op->Asl.ExternalName); > + } > + else > + { > + AslError (ASL_ERROR, ASL_MSG_NAMEPATH_NOT_EXIST, Op, > + Op->Asl.ExternalName); > + } > + > goto FinishNode; > } > > @@ -824,7 +824,6 @@ LdNamespace1Begin ( > break; > } > > - > ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Loading name: %s, (%s)\n", > Op->Asl.ExternalName, AcpiUtGetTypeName (ObjectType))); > > @@ -832,6 +831,18 @@ LdNamespace1Begin ( > > Flags |= ACPI_NS_ERROR_IF_FOUND; > > + /* > + * For opcodes that enter new names into the namespace, > + * all prefix NameSegs must exist. > + */ > + WalkState->OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode); > + if (((WalkState->OpInfo->Flags & AML_NAMED) || > + (WalkState->OpInfo->Flags & AML_CREATE)) && > + (Op->Asl.AmlOpcode != AML_EXTERNAL_OP)) > + { > + Flags |= ACPI_NS_PREFIX_MUST_EXIST; > + } > + > /* > * Enter the named type into the internal namespace. We enter the name > * as we go downward in the parse tree. Any necessary subobjects that > @@ -915,8 +926,20 @@ LdNamespace1Begin ( > return_ACPI_STATUS (AE_OK); > } > } > + else if (AE_NOT_FOUND) > + { > + /* > + * One or more prefix NameSegs of the NamePath do not exist > + * (all of them must exist). Attempt to continue compilation > + * by setting the current scope to the root. > + */ > + Node = AcpiGbl_RootNode; > + Status = AE_OK; > + } > else > { > + /* Flag all other errors as coming from the ACPICA core */ > + > AslCoreSubsystemError (Op, Status, > "Failure from namespace lookup", FALSE); > return_ACPI_STATUS (Status); > @@ -1043,10 +1066,10 @@ LdNamespace2Begin ( > > if (Op->Asl.ParseOpcode == PARSEOP_ALIAS) > { > - /* Complete the alias node by getting and saving the target node */ > - > - /* First child is the alias target */ > - > + /* > + * Complete the alias node by getting and saving the target node. > + * First child is the alias target > + */ > Arg = Op->Asl.Child; > > /* Get the target pathname */ > @@ -1070,18 +1093,34 @@ LdNamespace2Begin ( > { > if (Status == AE_NOT_FOUND) > { > - AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op, > - Op->Asl.ExternalName); > + /* Standalone NameSeg vs. NamePath */ > + > + if (strlen (Arg->Asl.ExternalName) == ACPI_NAME_SIZE) > + { > + AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op, > + Arg->Asl.ExternalName); > + } > + else > + { > + AslError (ASL_ERROR, ASL_MSG_NAMEPATH_NOT_EXIST, Op, > + Arg->Asl.ExternalName); > + } > > +#if 0 > +/* > + * NOTE: Removed 10/2018 to enhance compiler error reporting. No > + * regressions seen. > + */ > /* > * The name was not found, go ahead and create it. > * This prevents more errors later. > */ > Status = AcpiNsLookup (WalkState->ScopeInfo, Path, > - ACPI_TYPE_ANY, > - ACPI_IMODE_LOAD_PASS1, ACPI_NS_NO_UPSEARCH, > - WalkState, &(Node)); > - return (AE_OK); > + ACPI_TYPE_ANY, ACPI_IMODE_LOAD_PASS1, > + ACPI_NS_NO_UPSEARCH, WalkState, &Node); > +#endif > + return (Status); > +/* Removed: return (AE_OK)*/ > } > > AslCoreSubsystemError (Op, Status, > diff --git a/src/acpica/source/compiler/aslmain.c b/src/acpica/source/compiler/aslmain.c > index 4f24bb3e..70386f8a 100644 > --- a/src/acpica/source/compiler/aslmain.c > +++ b/src/acpica/source/compiler/aslmain.c > @@ -329,7 +329,7 @@ AslSignalHandler ( > > default: > > - printf (ASL_PREFIX "Unknown interrupt signal (%u)\n", Sig); > + printf (ASL_PREFIX "Unknown interrupt signal (%d)\n", Sig); > break; > } > > diff --git a/src/acpica/source/compiler/aslmessages.c b/src/acpica/source/compiler/aslmessages.c > index 14e140b2..23297183 100644 > --- a/src/acpica/source/compiler/aslmessages.c > +++ b/src/acpica/source/compiler/aslmessages.c > @@ -285,7 +285,7 @@ const char *AslCompilerMsgs [] = > /* ASL_MSG_NON_ASCII */ "Invalid characters found in file", > /* ASL_MSG_NON_ZERO */ "Operand evaluates to zero", > /* ASL_MSG_NOT_EXIST */ "Object does not exist", > -/* ASL_MSG_NOT_FOUND */ "Object not found or not accessible from scope", > +/* ASL_MSG_NOT_FOUND */ "Object not found or not accessible from current scope", > /* ASL_MSG_NOT_METHOD */ "Not a control method, cannot invoke", > /* ASL_MSG_NOT_PARAMETER */ "Not a parameter, used as local only", > /* ASL_MSG_NOT_REACHABLE */ "Object is not accessible from this scope", > @@ -359,7 +359,9 @@ const char *AslCompilerMsgs [] = > /* ASL_MSG_OEM_ID */ "Invalid OEM ID", > /* ASL_MSG_UNLOAD */ "Unload is not supported by all operating systems", > /* ASL_MSG_OFFSET */ "Unnecessary/redundant use of Offset operator", > -/* ASL_MSG_LONG_SLEEP */ "Very long Sleep, greater than 1 second" > +/* ASL_MSG_LONG_SLEEP */ "Very long Sleep, greater than 1 second", > +/* ASL_MSG_PREFIX_NOT_EXIST */ "One or more prefix Scopes do not exist", > +/* ASL_MSG_NAMEPATH_NOT_EXIST */ "One or more objects within the Pathname do not exist" > }; > > /* Table compiler */ > diff --git a/src/acpica/source/compiler/aslmessages.h b/src/acpica/source/compiler/aslmessages.h > index 907744a2..c932aded 100644 > --- a/src/acpica/source/compiler/aslmessages.h > +++ b/src/acpica/source/compiler/aslmessages.h > @@ -362,6 +362,8 @@ typedef enum > ASL_MSG_UNLOAD, > ASL_MSG_OFFSET, > ASL_MSG_LONG_SLEEP, > + ASL_MSG_PREFIX_NOT_EXIST, > + ASL_MSG_NAMEPATH_NOT_EXIST, > > /* These messages are used by the Data Table compiler only */ > > diff --git a/src/acpica/source/compiler/aslpredef.c b/src/acpica/source/compiler/aslpredef.c > index bc30fe91..ae806412 100644 > --- a/src/acpica/source/compiler/aslpredef.c > +++ b/src/acpica/source/compiler/aslpredef.c > @@ -222,7 +222,7 @@ ApCheckForPredefinedMethod ( > > if (MethodInfo->NumArguments != 0) > { > - sprintf (AslGbl_MsgBuffer, "%s requires %u", Op->Asl.ExternalName, 0); > + sprintf (AslGbl_MsgBuffer, "%s requires %d", Op->Asl.ExternalName, 0); > > AslError (ASL_WARNING, ASL_MSG_RESERVED_ARG_COUNT_HI, Op, > AslGbl_MsgBuffer); > diff --git a/src/acpica/source/compiler/aslxref.c b/src/acpica/source/compiler/aslxref.c > index 5273ea82..8b213577 100644 > --- a/src/acpica/source/compiler/aslxref.c > +++ b/src/acpica/source/compiler/aslxref.c > @@ -718,11 +718,34 @@ XfNamespaceLocateBegin ( > } > else > { > - /* Check for a fully qualified path */ > + /* The NamePath contains multiple NameSegs */ > > - if (Path[0] == AML_ROOT_PREFIX) > + if ((OpInfo->Flags & AML_CREATE) || > + (OpInfo->ObjectType == ACPI_TYPE_LOCAL_ALIAS)) > { > - /* Gave full path, the object does not exist */ > + /* > + * The new name is the last parameter. For the > + * CreateXXXXField and Alias operators > + */ > + NextOp = Op->Asl.Child; > + while (!(NextOp->Asl.CompileFlags & OP_IS_NAME_DECLARATION)) > + { > + NextOp = NextOp->Asl.Next; > + } > + > + AslError (ASL_ERROR, ASL_MSG_PREFIX_NOT_EXIST, NextOp, > + NextOp->Asl.ExternalName); > + } > + else if (OpInfo->Flags & AML_NAMED) > + { > + /* The new name is the first parameter */ > + > + AslError (ASL_ERROR, ASL_MSG_PREFIX_NOT_EXIST, Op, > + Op->Asl.ExternalName); > + } > + else if (Path[0] == AML_ROOT_PREFIX) > + { > + /* Full namepath from root, the object does not exist */ > > AslError (ASL_ERROR, ASL_MSG_NOT_EXIST, Op, > Op->Asl.ExternalName); > @@ -730,11 +753,20 @@ XfNamespaceLocateBegin ( > else > { > /* > - * We can't tell whether it doesn't exist or just > - * can't be reached. > + * Generic "not found" error. Cannot determine whether it > + * doesn't exist or just can't be reached. However, we > + * can differentiate between a NameSeg vs. NamePath. > */ > - AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op, > - Op->Asl.ExternalName); > + if (strlen (Op->Asl.ExternalName) == ACPI_NAME_SIZE) > + { > + AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op, > + Op->Asl.ExternalName); > + } > + else > + { > + AslError (ASL_ERROR, ASL_MSG_NAMEPATH_NOT_EXIST, Op, > + Op->Asl.ExternalName); > + } > } > } > > diff --git a/src/acpica/source/compiler/dtio.c b/src/acpica/source/compiler/dtio.c > index b15d3b97..bd189053 100644 > --- a/src/acpica/source/compiler/dtio.c > +++ b/src/acpica/source/compiler/dtio.c > @@ -236,7 +236,7 @@ DtTrim ( > > /* Skip lines that start with a space */ > > - if (!strcmp (String, " ")) > + if (*String == 0 || !strcmp (String, " ")) > { > ReturnString = UtLocalCacheCalloc (1); > return (ReturnString); > @@ -258,7 +258,7 @@ DtTrim ( > > while (End >= Start) > { > - if (*End == '\r' || *End == '\n') > + if (*End == '\n') > { > End--; > continue; > @@ -522,6 +522,7 @@ DtGetNextLine ( > UINT32 CurrentLineOffset; > UINT32 i; > int c; > + int c1; > > > memset (AslGbl_CurrentLineBuffer, 0, AslGbl_LineBufferSize); > @@ -569,6 +570,29 @@ DtGetNextLine ( > c = '\n'; > State = DT_NORMAL_TEXT; > } > + else if (c == '\r') > + { > + c1 = getc (Handle); > + if (c1 == '\n') > + { > + /* > + * Skip the carriage return as if it didn't exist. This is > + * onlt meant for input files in DOS format in unix. fopen in > + * unix may not support "text mode" and leaves CRLF intact. > + */ > + c = '\n'; > + } > + else > + { > + /* This was not a CRLF. Only a CR */ > + > + ungetc(c1, Handle); > + > + DtFatal (ASL_MSG_COMPILER_INTERNAL, NULL, > + "Carriage return without linefeed detected"); > + return (ASL_EOF); > + } > + } > > switch (State) > { > diff --git a/src/acpica/source/compiler/dttable2.c b/src/acpica/source/compiler/dttable2.c > index 3f970377..0b196a2f 100644 > --- a/src/acpica/source/compiler/dttable2.c > +++ b/src/acpica/source/compiler/dttable2.c > @@ -1876,6 +1876,62 @@ DtCompileTcpa ( > } > > > +/****************************************************************************** > + * > + * FUNCTION: DtCompileTpm2Rev3 > + * > + * PARAMETERS: PFieldList - Current field list pointer > + * > + * RETURN: Status > + * > + * DESCRIPTION: Compile TPM2 revision 3 > + * > + *****************************************************************************/ > +static ACPI_STATUS > +DtCompileTpm2Rev3 ( > + void **List) > +{ > + DT_FIELD **PFieldList = (DT_FIELD **) List; > + DT_SUBTABLE *Subtable; > + ACPI_TABLE_TPM23 *Tpm23Header; > + DT_SUBTABLE *ParentTable; > + ACPI_STATUS Status = AE_OK; > + > + > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm23, > + &Subtable); > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + Tpm23Header = ACPI_CAST_PTR (ACPI_TABLE_TPM23, ParentTable->Buffer); > + > + /* Subtable type depends on the StartMethod */ > + > + switch (Tpm23Header->StartMethod) > + { > + case ACPI_TPM23_ACPI_START_METHOD: > + > + /* Subtable specific to to ARM_SMC */ > + > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm23a, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + break; > + > + default: > + break; > + } > + > + return (Status); > +} > + > + > /****************************************************************************** > * > * FUNCTION: DtCompileTpm2 > @@ -1897,8 +1953,18 @@ DtCompileTpm2 ( > ACPI_TABLE_TPM2 *Tpm2Header; > DT_SUBTABLE *ParentTable; > ACPI_STATUS Status = AE_OK; > + ACPI_TABLE_HEADER *Header; > > > + ParentTable = DtPeekSubtable (); > + > + Header = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer); > + > + if (Header->Revision == 3) > + { > + return (DtCompileTpm2Rev3 (List)); > + } > + > /* Compile the main table */ > > Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm2, > diff --git a/src/acpica/source/compiler/prscan.c b/src/acpica/source/compiler/prscan.c > index 580b47f0..325569ed 100644 > --- a/src/acpica/source/compiler/prscan.c > +++ b/src/acpica/source/compiler/prscan.c > @@ -1259,7 +1259,6 @@ PrPopDirective ( > AslGbl_DirectiveInfo[Info->Directive].Name, > Info->Argument, AslGbl_IgnoringThisCodeBlock ? "TRUE" : "FALSE"); > > - ACPI_FREE (Info); > return (AE_OK); > } > > diff --git a/src/acpica/source/components/debugger/dbxface.c b/src/acpica/source/components/debugger/dbxface.c > index c661b248..a0f3ed6b 100644 > --- a/src/acpica/source/components/debugger/dbxface.c > +++ b/src/acpica/source/components/debugger/dbxface.c > @@ -174,6 +174,12 @@ AcpiDbMethodEnd ( > ACPI_WALK_STATE *WalkState); > #endif > > +#ifdef ACPI_DISASSEMBLER > +static ACPI_PARSE_OBJECT * > +AcpiDbGetDisplayOp ( > + ACPI_WALK_STATE *WalkState, > + ACPI_PARSE_OBJECT *Op); > +#endif > > /******************************************************************************* > * > @@ -273,6 +279,74 @@ AcpiDbSignalBreakPoint ( > } > > > +#ifdef ACPI_DISASSEMBLER > +/******************************************************************************* > + * > + * FUNCTION: AcpiDbGetDisplayOp > + * > + * PARAMETERS: WalkState - Current walk > + * Op - Current executing op (from aml interpreter) > + * > + * RETURN: Opcode to display > + * > + * DESCRIPTION: Find the opcode to display during single stepping > + * > + ******************************************************************************/ > + > +static ACPI_PARSE_OBJECT * > +AcpiDbGetDisplayOp ( > + ACPI_WALK_STATE *WalkState, > + ACPI_PARSE_OBJECT *Op) > +{ > + ACPI_PARSE_OBJECT *DisplayOp; > + ACPI_PARSE_OBJECT *ParentOp; > + > + DisplayOp = Op; > + ParentOp = Op->Common.Parent; > + if (ParentOp) > + { > + if ((WalkState->ControlState) && > + (WalkState->ControlState->Common.State == > + ACPI_CONTROL_PREDICATE_EXECUTING)) > + { > + /* > + * We are executing the predicate of an IF or WHILE statement > + * Search upwards for the containing IF or WHILE so that the > + * entire predicate can be displayed. > + */ > + while (ParentOp) > + { > + if ((ParentOp->Common.AmlOpcode == AML_IF_OP) || > + (ParentOp->Common.AmlOpcode == AML_WHILE_OP)) > + { > + DisplayOp = ParentOp; > + break; > + } > + ParentOp = ParentOp->Common.Parent; > + } > + } > + else > + { > + while (ParentOp) > + { > + if ((ParentOp->Common.AmlOpcode == AML_IF_OP) || > + (ParentOp->Common.AmlOpcode == AML_ELSE_OP) || > + (ParentOp->Common.AmlOpcode == AML_SCOPE_OP) || > + (ParentOp->Common.AmlOpcode == AML_METHOD_OP) || > + (ParentOp->Common.AmlOpcode == AML_WHILE_OP)) > + { > + break; > + } > + DisplayOp = ParentOp; > + ParentOp = ParentOp->Common.Parent; > + } > + } > + } > + return DisplayOp; > +} > +#endif > + > + > /******************************************************************************* > * > * FUNCTION: AcpiDbSingleStep > @@ -296,8 +370,6 @@ AcpiDbSingleStep ( > ACPI_PARSE_OBJECT *Next; > ACPI_STATUS Status = AE_OK; > UINT32 OriginalDebugLevel; > - ACPI_PARSE_OBJECT *DisplayOp; > - ACPI_PARSE_OBJECT *ParentOp; > UINT32 AmlOffset; > > > @@ -393,53 +465,11 @@ AcpiDbSingleStep ( > Next = Op->Common.Next; > Op->Common.Next = NULL; > > - > - DisplayOp = Op; > - ParentOp = Op->Common.Parent; > - if (ParentOp) > - { > - if ((WalkState->ControlState) && > - (WalkState->ControlState->Common.State == > - ACPI_CONTROL_PREDICATE_EXECUTING)) > - { > - /* > - * We are executing the predicate of an IF or WHILE statement > - * Search upwards for the containing IF or WHILE so that the > - * entire predicate can be displayed. > - */ > - while (ParentOp) > - { > - if ((ParentOp->Common.AmlOpcode == AML_IF_OP) || > - (ParentOp->Common.AmlOpcode == AML_WHILE_OP)) > - { > - DisplayOp = ParentOp; > - break; > - } > - ParentOp = ParentOp->Common.Parent; > - } > - } > - else > - { > - while (ParentOp) > - { > - if ((ParentOp->Common.AmlOpcode == AML_IF_OP) || > - (ParentOp->Common.AmlOpcode == AML_ELSE_OP) || > - (ParentOp->Common.AmlOpcode == AML_SCOPE_OP) || > - (ParentOp->Common.AmlOpcode == AML_METHOD_OP) || > - (ParentOp->Common.AmlOpcode == AML_WHILE_OP)) > - { > - break; > - } > - DisplayOp = ParentOp; > - ParentOp = ParentOp->Common.Parent; > - } > - } > - } > - > /* Now we can disassemble and display it */ > > #ifdef ACPI_DISASSEMBLER > - AcpiDmDisassemble (WalkState, DisplayOp, ACPI_UINT32_MAX); > + AcpiDmDisassemble (WalkState, AcpiDbGetDisplayOp (WalkState, Op), > + ACPI_UINT32_MAX); > #else > /* > * The AML Disassembler is not configured - at least we can > diff --git a/src/acpica/source/components/dispatcher/dsopcode.c b/src/acpica/source/components/dispatcher/dsopcode.c > index 038993c7..ca2cd470 100644 > --- a/src/acpica/source/components/dispatcher/dsopcode.c > +++ b/src/acpica/source/components/dispatcher/dsopcode.c > @@ -586,6 +586,9 @@ AcpiDsEvalRegionOperands ( > ObjDesc, ACPI_FORMAT_UINT64 (ObjDesc->Region.Address), > ObjDesc->Region.Length)); > > + Status = AcpiUtAddAddressRange (ObjDesc->Region.SpaceId, > + ObjDesc->Region.Address, ObjDesc->Region.Length, Node); > + > /* Now the address and length are valid for this opregion */ > > ObjDesc->Region.Flags |= AOPOBJ_DATA_VALID; > diff --git a/src/acpica/source/components/dispatcher/dswload2.c b/src/acpica/source/components/dispatcher/dswload2.c > index 9bc6ecfa..4b6e41d8 100644 > --- a/src/acpica/source/components/dispatcher/dswload2.c > +++ b/src/acpica/source/components/dispatcher/dswload2.c > @@ -448,6 +448,15 @@ AcpiDsLoad2BeginOp ( > } > #endif > > + /* > + * For name creation opcodes, the full namepath prefix must > + * exist, except for the final (new) nameseg. > + */ > + if (WalkState->OpInfo->Flags & AML_NAMED) > + { > + Flags |= ACPI_NS_PREFIX_MUST_EXIST; > + } > + > /* Add new entry or lookup existing entry */ > > Status = AcpiNsLookup (WalkState->ScopeInfo, BufferPtr, ObjectType, > diff --git a/src/acpica/source/components/namespace/nsaccess.c b/src/acpica/source/components/namespace/nsaccess.c > index af97c51f..11c652e0 100644 > --- a/src/acpica/source/components/namespace/nsaccess.c > +++ b/src/acpica/source/components/namespace/nsaccess.c > @@ -421,6 +421,7 @@ AcpiNsLookup ( > ACPI_OBJECT_TYPE ThisSearchType; > UINT32 SearchParentFlag = ACPI_NS_SEARCH_PARENT; > UINT32 LocalFlags; > + ACPI_INTERPRETER_MODE LocalInterpreterMode; > > > ACPI_FUNCTION_TRACE (NsLookup); > @@ -670,6 +671,7 @@ AcpiNsLookup ( > */ > ThisSearchType = ACPI_TYPE_ANY; > CurrentNode = ThisNode; > + > while (NumSegments && CurrentNode) > { > NumSegments--; > @@ -704,6 +706,16 @@ AcpiNsLookup ( > } > } > > + /* Handle opcodes that create a new NameSeg via a full NamePath */ > + > + LocalInterpreterMode = InterpreterMode; > + if ((Flags & ACPI_NS_PREFIX_MUST_EXIST) && (NumSegments > 0)) > + { > + /* Every element of the path must exist (except for the final NameSeg) */ > + > + LocalInterpreterMode = ACPI_IMODE_EXECUTE; > + } > + > /* Extract one ACPI name from the front of the pathname */ > > ACPI_MOVE_32_TO_32 (&SimpleName, Path); > @@ -711,11 +723,18 @@ AcpiNsLookup ( > /* Try to find the single (4 character) ACPI name */ > > Status = AcpiNsSearchAndEnter (SimpleName, WalkState, CurrentNode, > - InterpreterMode, ThisSearchType, LocalFlags, &ThisNode); > + LocalInterpreterMode, ThisSearchType, LocalFlags, &ThisNode); > if (ACPI_FAILURE (Status)) > { > if (Status == AE_NOT_FOUND) > { > +#if !defined ACPI_ASL_COMPILER /* Note: iASL reports this error by itself, not needed here */ > + if (Flags & ACPI_NS_PREFIX_MUST_EXIST) > + { > + AcpiOsPrintf (ACPI_MSG_BIOS_ERROR > + "Object does not exist: %4.4s\n", &SimpleName); > + } > +#endif > /* Name not found in ACPI namespace */ > > ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, > diff --git a/src/acpica/source/components/parser/psloop.c b/src/acpica/source/components/parser/psloop.c > index ef517b54..9625834c 100644 > --- a/src/acpica/source/components/parser/psloop.c > +++ b/src/acpica/source/components/parser/psloop.c > @@ -298,7 +298,7 @@ AcpiPsGetArguments ( > * future. Use of this option can cause problems with AML code that > * depends upon in-order immediate execution of module-level code. > */ > - if (AcpiGbl_GroupModuleLevelCode && > + if (!AcpiGbl_ExecuteTablesAsMethods && > (WalkState->PassNumber <= ACPI_IMODE_LOAD_PASS2) && > ((WalkState->ParseFlags & ACPI_PARSE_DISASSEMBLE) == 0)) > { > @@ -566,6 +566,7 @@ AcpiPsParseLoop ( > ACPI_PARSE_OBJECT *Op = NULL; /* current op */ > ACPI_PARSE_STATE *ParserState; > UINT8 *AmlOpStart = NULL; > + UINT8 OpcodeLength; > > > ACPI_FUNCTION_TRACE_PTR (PsParseLoop, WalkState); > @@ -654,7 +655,7 @@ AcpiPsParseLoop ( > * status to AE_OK to proceed with the table load. > */ > if ((WalkState->ParseFlags & ACPI_PARSE_MODULE_LEVEL) && > - Status == AE_ALREADY_EXISTS) > + ((Status == AE_ALREADY_EXISTS) || (Status == AE_NOT_FOUND))) > { > Status = AE_OK; > } > @@ -686,9 +687,20 @@ AcpiPsParseLoop ( > * the scope op because the parse failure indicates that > * the device may not exist. > */ > - ACPI_ERROR ((AE_INFO, "Skip parsing opcode %s", > - AcpiPsGetOpcodeName (WalkState->Opcode))); > - WalkState->ParserState.Aml = WalkState->Aml + 1; > + ACPI_INFO (("Skipping parse of AML opcode: %s (0x%4.4X)", > + AcpiPsGetOpcodeName (WalkState->Opcode), WalkState->Opcode)); > + > + /* > + * Determine the opcode length before skipping the opcode. > + * An opcode can be 1 byte or 2 bytes in length. > + */ > + OpcodeLength = 1; > + if ((WalkState->Opcode & 0xFF00) == AML_EXTENDED_OPCODE) > + { > + OpcodeLength = 2; > + } > + WalkState->ParserState.Aml = WalkState->Aml + OpcodeLength; > + > WalkState->ParserState.Aml = > AcpiPsGetNextPackageEnd(&WalkState->ParserState); > WalkState->Aml = WalkState->ParserState.Aml; > diff --git a/src/acpica/source/components/parser/psobject.c b/src/acpica/source/components/parser/psobject.c > index 8d6f81bd..ca7ab0ae 100644 > --- a/src/acpica/source/components/parser/psobject.c > +++ b/src/acpica/source/components/parser/psobject.c > @@ -773,7 +773,7 @@ AcpiPsCompleteOp ( > * because there could be correct AML beyond the parts that caused > * the runtime error. > */ > - ACPI_ERROR ((AE_INFO, "Ignore error and continue table load")); > + ACPI_INFO (("Ignoring error and continuing table load")); > return_ACPI_STATUS (AE_OK); > } > return_ACPI_STATUS (Status); > diff --git a/src/acpica/source/components/tables/tbxfload.c b/src/acpica/source/components/tables/tbxfload.c > index 0119b684..a956806e 100644 > --- a/src/acpica/source/components/tables/tbxfload.c > +++ b/src/acpica/source/components/tables/tbxfload.c > @@ -219,7 +219,7 @@ AcpiLoadTables ( > "While loading namespace from ACPI tables")); > } > > - if (AcpiGbl_ExecuteTablesAsMethods || !AcpiGbl_GroupModuleLevelCode) > + if (AcpiGbl_ExecuteTablesAsMethods) > { > /* > * If the module-level code support is enabled, initialize the objects > diff --git a/src/acpica/source/include/acdisasm.h b/src/acpica/source/include/acdisasm.h > index b774b20f..edd108d2 100644 > --- a/src/acpica/source/include/acdisasm.h > +++ b/src/acpica/source/include/acdisasm.h > @@ -561,6 +561,8 @@ extern ACPI_DMTABLE_INFO AcpiDmTableInfoTcpaServer[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoTpm2[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoTpm2a[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoTpm211[]; > +extern ACPI_DMTABLE_INFO AcpiDmTableInfoTpm23[]; > +extern ACPI_DMTABLE_INFO AcpiDmTableInfoTpm23a[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoUefi[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoVrtc[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoVrtc0[]; > diff --git a/src/acpica/source/include/acnamesp.h b/src/acpica/source/include/acnamesp.h > index 1e3db8d1..7c2083d3 100644 > --- a/src/acpica/source/include/acnamesp.h > +++ b/src/acpica/source/include/acnamesp.h > @@ -177,6 +177,7 @@ > #define ACPI_NS_TEMPORARY 0x0040 > #define ACPI_NS_OVERRIDE_IF_FOUND 0x0080 > #define ACPI_NS_EARLY_INIT 0x0100 > +#define ACPI_NS_PREFIX_MUST_EXIST 0x0200 > > /* Flags for AcpiNsWalkNamespace */ > > diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h > index aaf284cb..27e9aa7f 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 0x20181003 > +#define ACPI_CA_VERSION 0x20181031 > > #include "acconfig.h" > #include "actypes.h" > @@ -300,13 +300,6 @@ ACPI_INIT_GLOBAL (UINT8, AcpiGbl_CopyDsdtLocally, FALSE); > */ > ACPI_INIT_GLOBAL (UINT8, AcpiGbl_DoNotUseXsdt, FALSE); > > -/* > - * Optionally support group module level code. > - * NOTE, this is essentially obsolete and will be removed soon > - * (01/2018). > - */ > -ACPI_INIT_GLOBAL (UINT8, AcpiGbl_GroupModuleLevelCode, FALSE); > - > /* > * Optionally support module level code by parsing an entire table as > * a method as it is loaded. Default is TRUE. > diff --git a/src/acpica/source/include/actbinfo.h b/src/acpica/source/include/actbinfo.h > index 347a3940..19eeeccb 100644 > --- a/src/acpica/source/include/actbinfo.h > +++ b/src/acpica/source/include/actbinfo.h > @@ -194,6 +194,7 @@ > #define ACPI_STAO_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_STAO,f) > #define ACPI_TCPA_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_TCPA_HDR,f) > #define ACPI_TPM2_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_TPM2,f) > +#define ACPI_TPM23_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_TPM23,f) > #define ACPI_UEFI_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_UEFI,f) > #define ACPI_WAET_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_WAET,f) > #define ACPI_WDAT_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_WDAT,f) > @@ -337,6 +338,7 @@ > #define ACPI_TCPA_SERVER_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_TCPA_SERVER,f) > #define ACPI_TPM2A_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TPM2_TRAILER,f) > #define ACPI_TPM211_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TPM2_ARM_SMC,f) > +#define ACPI_TPM23A_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TPM23_TRAILER,f) > #define ACPI_VRTC0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_VRTC_ENTRY,f) > #define ACPI_WDAT0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_WDAT_ENTRY,f) > > diff --git a/src/acpica/source/include/actbl3.h b/src/acpica/source/include/actbl3.h > index d4c15838..99b466c1 100644 > --- a/src/acpica/source/include/actbl3.h > +++ b/src/acpica/source/include/actbl3.h > @@ -552,6 +552,34 @@ typedef struct acpi_table_tcpa_server > * > ******************************************************************************/ > > +/* Revision 3 */ > + > +typedef struct acpi_table_tpm23 > +{ > + ACPI_TABLE_HEADER Header; /* Common ACPI table header */ > + UINT32 Reserved; > + UINT64 ControlAddress; > + UINT32 StartMethod; > + > +} ACPI_TABLE_TPM23; > + > +/* Value for StartMethod above */ > + > +#define ACPI_TPM23_ACPI_START_METHOD 2 > + > +/* > + * Optional trailer for revision 3. If start method is 2, there is a 4 byte > + * reserved area of all zeros. > + */ > +typedef struct acpi_tmp23_trailer > +{ > + UINT32 Reserved; > + > +} ACPI_TPM23_TRAILER; > + > + > +/* Revision 4 */ > + > typedef struct acpi_table_tpm2 > { > ACPI_TABLE_HEADER Header; /* Common ACPI table header */ Acked-by: Ivan Hu <ivan.hu@canonical.com>
diff --git a/src/acpica/fwts_acpica.c b/src/acpica/fwts_acpica.c index d0c6ed7c..75f8fe3d 100644 --- a/src/acpica/fwts_acpica.c +++ b/src/acpica/fwts_acpica.c @@ -1061,7 +1061,6 @@ int fwts_acpica_init(fwts_framework *fw) FWTS_ACPICA_MODE(fw, FWTS_ACPICA_MODE_IGNORE_ERRORS); AcpiGbl_DisableAutoRepair = FWTS_ACPICA_MODE(fw, FWTS_ACPICA_MODE_DISABLE_AUTO_REPAIR); - AcpiGbl_GroupModuleLevelCode = FALSE; AcpiGbl_CstyleDisassembly = FALSE; pthread_mutex_init(&mutex_lock_sem_table, NULL); diff --git a/src/acpica/source/common/adisasm.c b/src/acpica/source/common/adisasm.c index ed35f31a..70f7932b 100644 --- a/src/acpica/source/common/adisasm.c +++ b/src/acpica/source/common/adisasm.c @@ -775,7 +775,6 @@ AdDoExternalFileList ( AcpiDmFinishNamespaceLoad (AcpiGbl_ParseOpRoot, AcpiGbl_RootNode, OwnerId); AcpiPsDeleteParseTree (AcpiGbl_ParseOpRoot); - AcpiGbl_ParseOpRoot = NULL; /* for fwts */ ExternalListHead = ExternalListHead->Next; } diff --git a/src/acpica/source/common/dmtbdump3.c b/src/acpica/source/common/dmtbdump3.c index 3c1dea6c..1bc3fa6c 100644 --- a/src/acpica/source/common/dmtbdump3.c +++ b/src/acpica/source/common/dmtbdump3.c @@ -486,6 +486,51 @@ AcpiDmDumpTcpa ( } +/******************************************************************************* + * + * FUNCTION: AcpiDmDumpTpm2 + * + * PARAMETERS: Table - A TPM2 table + * + * RETURN: None + * + * DESCRIPTION: Format the contents of a TPM2. + * + ******************************************************************************/ +static void +AcpiDmDumpTpm2Rev3 ( + ACPI_TABLE_HEADER *Table) +{ + UINT32 Offset = sizeof (ACPI_TABLE_TPM23); + ACPI_TABLE_TPM23 *CommonHeader = ACPI_CAST_PTR (ACPI_TABLE_TPM23, Table); + ACPI_TPM23_TRAILER *Subtable = ACPI_ADD_PTR (ACPI_TPM23_TRAILER, Table, Offset); + ACPI_STATUS Status; + + + /* Main table */ + + Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoTpm23); + if (ACPI_FAILURE (Status)) + { + return; + } + + /* Optional subtable if start method is ACPI start method */ + + switch (CommonHeader->StartMethod) + { + case ACPI_TPM23_ACPI_START_METHOD: + + Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, + Table->Length - Offset, AcpiDmTableInfoTpm23a); + break; + + default: + break; + } +} + + /******************************************************************************* * * FUNCTION: AcpiDmDumpTpm2 @@ -509,9 +554,16 @@ AcpiDmDumpTpm2 ( ACPI_STATUS Status; + if (Table->Revision == 3) + { + AcpiDmDumpTpm2Rev3(Table); + return; + } + /* Main table */ Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoTpm2); + if (ACPI_FAILURE (Status)) { return; diff --git a/src/acpica/source/common/dmtbinfo3.c b/src/acpica/source/common/dmtbinfo3.c index c82e3db5..33d99287 100644 --- a/src/acpica/source/common/dmtbinfo3.c +++ b/src/acpica/source/common/dmtbinfo3.c @@ -446,6 +446,26 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoTcpaServer[] = * ******************************************************************************/ +/* TPM2 revision 3 */ + +ACPI_DMTABLE_INFO AcpiDmTableInfoTpm23[] = +{ + {ACPI_DMT_UINT32, ACPI_TPM23_OFFSET (Reserved), "Reserved", 0}, + {ACPI_DMT_UINT64, ACPI_TPM23_OFFSET (ControlAddress), "Control Address", 0}, + {ACPI_DMT_UINT32, ACPI_TPM23_OFFSET (StartMethod), "Start Method", 0}, + ACPI_DMT_TERMINATOR +}; + +/* Trailer in the case that StartMethod == 2 */ + +ACPI_DMTABLE_INFO AcpiDmTableInfoTpm23a[] = +{ + {ACPI_DMT_UINT32, ACPI_TPM23A_OFFSET (Reserved), "Reserved", DT_OPTIONAL}, + ACPI_DMT_TERMINATOR +}; + +/* TPM2 revision 4 */ + ACPI_DMTABLE_INFO AcpiDmTableInfoTpm2[] = { {ACPI_DMT_UINT16, ACPI_TPM2_OFFSET (PlatformClass), "Platform Class", 0}, diff --git a/src/acpica/source/compiler/aslcompile.c b/src/acpica/source/compiler/aslcompile.c index e08442e0..4ae19076 100644 --- a/src/acpica/source/compiler/aslcompile.c +++ b/src/acpica/source/compiler/aslcompile.c @@ -858,7 +858,7 @@ CmCleanupAndExit ( if (AslGbl_ExceptionCount[ASL_ERROR] > ASL_MAX_ERROR_COUNT) { - printf ("\nMaximum error count (%u) exceeded\n", + printf ("\nMaximum error count (%d) exceeded\n", ASL_MAX_ERROR_COUNT); } diff --git a/src/acpica/source/compiler/aslerror.c b/src/acpica/source/compiler/aslerror.c index 6d45cd40..10ea3ec1 100644 --- a/src/acpica/source/compiler/aslerror.c +++ b/src/acpica/source/compiler/aslerror.c @@ -1097,7 +1097,7 @@ AslExpectException ( if (AslGbl_ExpectedMessagesIndex >= ASL_MAX_EXPECTED_MESSAGES) { - printf ("Too many messages have been registered as expected (max %u)\n", + printf ("Too many messages have been registered as expected (max %d)\n", ASL_MAX_DISABLED_MESSAGES); return (AE_LIMIT); } @@ -1144,7 +1144,7 @@ AslDisableException ( if (AslGbl_DisabledMessagesIndex >= ASL_MAX_DISABLED_MESSAGES) { - printf ("Too many messages have been disabled (max %u)\n", + printf ("Too many messages have been disabled (max %d)\n", ASL_MAX_DISABLED_MESSAGES); return (AE_LIMIT); } diff --git a/src/acpica/source/compiler/aslload.c b/src/acpica/source/compiler/aslload.c index 5bb0a851..7f29b90c 100644 --- a/src/acpica/source/compiler/aslload.c +++ b/src/acpica/source/compiler/aslload.c @@ -417,10 +417,8 @@ LdLoadResourceElements ( { Status = AcpiNsLookup (WalkState->ScopeInfo, InitializerOp->Asl.ExternalName, - ACPI_TYPE_LOCAL_RESOURCE_FIELD, - ACPI_IMODE_LOAD_PASS1, - ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE, - NULL, &Node); + ACPI_TYPE_LOCAL_RESOURCE_FIELD, ACPI_IMODE_LOAD_PASS1, + ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE, NULL, &Node); if (ACPI_FAILURE (Status)) { return (Status); @@ -687,8 +685,7 @@ LdNamespace1Begin ( * handle this case. Perhaps someday this case can go away. */ Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY, - ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, - WalkState, &(Node)); + ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, WalkState, &Node); if (ACPI_FAILURE (Status)) { if (Status == AE_NOT_FOUND) @@ -696,23 +693,26 @@ LdNamespace1Begin ( /* The name was not found, go ahead and create it */ Status = AcpiNsLookup (WalkState->ScopeInfo, Path, - ACPI_TYPE_LOCAL_SCOPE, - ACPI_IMODE_LOAD_PASS1, Flags, - WalkState, &(Node)); + ACPI_TYPE_LOCAL_SCOPE, ACPI_IMODE_LOAD_PASS1, + Flags, WalkState, &Node); if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); } - /* - * However, this is an error -- primarily because the MS - * interpreter can't handle a forward reference from the - * Scope() operator. - */ - AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op, - Op->Asl.ExternalName); - AslError (ASL_ERROR, ASL_MSG_SCOPE_FWD_REF, Op, - Op->Asl.ExternalName); + /* However, this is an error -- operand to Scope must exist */ + + if (strlen (Op->Asl.ExternalName) == ACPI_NAME_SIZE) + { + AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op, + Op->Asl.ExternalName); + } + else + { + AslError (ASL_ERROR, ASL_MSG_NAMEPATH_NOT_EXIST, Op, + Op->Asl.ExternalName); + } + goto FinishNode; } @@ -824,7 +824,6 @@ LdNamespace1Begin ( break; } - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Loading name: %s, (%s)\n", Op->Asl.ExternalName, AcpiUtGetTypeName (ObjectType))); @@ -832,6 +831,18 @@ LdNamespace1Begin ( Flags |= ACPI_NS_ERROR_IF_FOUND; + /* + * For opcodes that enter new names into the namespace, + * all prefix NameSegs must exist. + */ + WalkState->OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode); + if (((WalkState->OpInfo->Flags & AML_NAMED) || + (WalkState->OpInfo->Flags & AML_CREATE)) && + (Op->Asl.AmlOpcode != AML_EXTERNAL_OP)) + { + Flags |= ACPI_NS_PREFIX_MUST_EXIST; + } + /* * Enter the named type into the internal namespace. We enter the name * as we go downward in the parse tree. Any necessary subobjects that @@ -915,8 +926,20 @@ LdNamespace1Begin ( return_ACPI_STATUS (AE_OK); } } + else if (AE_NOT_FOUND) + { + /* + * One or more prefix NameSegs of the NamePath do not exist + * (all of them must exist). Attempt to continue compilation + * by setting the current scope to the root. + */ + Node = AcpiGbl_RootNode; + Status = AE_OK; + } else { + /* Flag all other errors as coming from the ACPICA core */ + AslCoreSubsystemError (Op, Status, "Failure from namespace lookup", FALSE); return_ACPI_STATUS (Status); @@ -1043,10 +1066,10 @@ LdNamespace2Begin ( if (Op->Asl.ParseOpcode == PARSEOP_ALIAS) { - /* Complete the alias node by getting and saving the target node */ - - /* First child is the alias target */ - + /* + * Complete the alias node by getting and saving the target node. + * First child is the alias target + */ Arg = Op->Asl.Child; /* Get the target pathname */ @@ -1070,18 +1093,34 @@ LdNamespace2Begin ( { if (Status == AE_NOT_FOUND) { - AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op, - Op->Asl.ExternalName); + /* Standalone NameSeg vs. NamePath */ + + if (strlen (Arg->Asl.ExternalName) == ACPI_NAME_SIZE) + { + AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op, + Arg->Asl.ExternalName); + } + else + { + AslError (ASL_ERROR, ASL_MSG_NAMEPATH_NOT_EXIST, Op, + Arg->Asl.ExternalName); + } +#if 0 +/* + * NOTE: Removed 10/2018 to enhance compiler error reporting. No + * regressions seen. + */ /* * The name was not found, go ahead and create it. * This prevents more errors later. */ Status = AcpiNsLookup (WalkState->ScopeInfo, Path, - ACPI_TYPE_ANY, - ACPI_IMODE_LOAD_PASS1, ACPI_NS_NO_UPSEARCH, - WalkState, &(Node)); - return (AE_OK); + ACPI_TYPE_ANY, ACPI_IMODE_LOAD_PASS1, + ACPI_NS_NO_UPSEARCH, WalkState, &Node); +#endif + return (Status); +/* Removed: return (AE_OK)*/ } AslCoreSubsystemError (Op, Status, diff --git a/src/acpica/source/compiler/aslmain.c b/src/acpica/source/compiler/aslmain.c index 4f24bb3e..70386f8a 100644 --- a/src/acpica/source/compiler/aslmain.c +++ b/src/acpica/source/compiler/aslmain.c @@ -329,7 +329,7 @@ AslSignalHandler ( default: - printf (ASL_PREFIX "Unknown interrupt signal (%u)\n", Sig); + printf (ASL_PREFIX "Unknown interrupt signal (%d)\n", Sig); break; } diff --git a/src/acpica/source/compiler/aslmessages.c b/src/acpica/source/compiler/aslmessages.c index 14e140b2..23297183 100644 --- a/src/acpica/source/compiler/aslmessages.c +++ b/src/acpica/source/compiler/aslmessages.c @@ -285,7 +285,7 @@ const char *AslCompilerMsgs [] = /* ASL_MSG_NON_ASCII */ "Invalid characters found in file", /* ASL_MSG_NON_ZERO */ "Operand evaluates to zero", /* ASL_MSG_NOT_EXIST */ "Object does not exist", -/* ASL_MSG_NOT_FOUND */ "Object not found or not accessible from scope", +/* ASL_MSG_NOT_FOUND */ "Object not found or not accessible from current scope", /* ASL_MSG_NOT_METHOD */ "Not a control method, cannot invoke", /* ASL_MSG_NOT_PARAMETER */ "Not a parameter, used as local only", /* ASL_MSG_NOT_REACHABLE */ "Object is not accessible from this scope", @@ -359,7 +359,9 @@ const char *AslCompilerMsgs [] = /* ASL_MSG_OEM_ID */ "Invalid OEM ID", /* ASL_MSG_UNLOAD */ "Unload is not supported by all operating systems", /* ASL_MSG_OFFSET */ "Unnecessary/redundant use of Offset operator", -/* ASL_MSG_LONG_SLEEP */ "Very long Sleep, greater than 1 second" +/* ASL_MSG_LONG_SLEEP */ "Very long Sleep, greater than 1 second", +/* ASL_MSG_PREFIX_NOT_EXIST */ "One or more prefix Scopes do not exist", +/* ASL_MSG_NAMEPATH_NOT_EXIST */ "One or more objects within the Pathname do not exist" }; /* Table compiler */ diff --git a/src/acpica/source/compiler/aslmessages.h b/src/acpica/source/compiler/aslmessages.h index 907744a2..c932aded 100644 --- a/src/acpica/source/compiler/aslmessages.h +++ b/src/acpica/source/compiler/aslmessages.h @@ -362,6 +362,8 @@ typedef enum ASL_MSG_UNLOAD, ASL_MSG_OFFSET, ASL_MSG_LONG_SLEEP, + ASL_MSG_PREFIX_NOT_EXIST, + ASL_MSG_NAMEPATH_NOT_EXIST, /* These messages are used by the Data Table compiler only */ diff --git a/src/acpica/source/compiler/aslpredef.c b/src/acpica/source/compiler/aslpredef.c index bc30fe91..ae806412 100644 --- a/src/acpica/source/compiler/aslpredef.c +++ b/src/acpica/source/compiler/aslpredef.c @@ -222,7 +222,7 @@ ApCheckForPredefinedMethod ( if (MethodInfo->NumArguments != 0) { - sprintf (AslGbl_MsgBuffer, "%s requires %u", Op->Asl.ExternalName, 0); + sprintf (AslGbl_MsgBuffer, "%s requires %d", Op->Asl.ExternalName, 0); AslError (ASL_WARNING, ASL_MSG_RESERVED_ARG_COUNT_HI, Op, AslGbl_MsgBuffer); diff --git a/src/acpica/source/compiler/aslxref.c b/src/acpica/source/compiler/aslxref.c index 5273ea82..8b213577 100644 --- a/src/acpica/source/compiler/aslxref.c +++ b/src/acpica/source/compiler/aslxref.c @@ -718,11 +718,34 @@ XfNamespaceLocateBegin ( } else { - /* Check for a fully qualified path */ + /* The NamePath contains multiple NameSegs */ - if (Path[0] == AML_ROOT_PREFIX) + if ((OpInfo->Flags & AML_CREATE) || + (OpInfo->ObjectType == ACPI_TYPE_LOCAL_ALIAS)) { - /* Gave full path, the object does not exist */ + /* + * The new name is the last parameter. For the + * CreateXXXXField and Alias operators + */ + NextOp = Op->Asl.Child; + while (!(NextOp->Asl.CompileFlags & OP_IS_NAME_DECLARATION)) + { + NextOp = NextOp->Asl.Next; + } + + AslError (ASL_ERROR, ASL_MSG_PREFIX_NOT_EXIST, NextOp, + NextOp->Asl.ExternalName); + } + else if (OpInfo->Flags & AML_NAMED) + { + /* The new name is the first parameter */ + + AslError (ASL_ERROR, ASL_MSG_PREFIX_NOT_EXIST, Op, + Op->Asl.ExternalName); + } + else if (Path[0] == AML_ROOT_PREFIX) + { + /* Full namepath from root, the object does not exist */ AslError (ASL_ERROR, ASL_MSG_NOT_EXIST, Op, Op->Asl.ExternalName); @@ -730,11 +753,20 @@ XfNamespaceLocateBegin ( else { /* - * We can't tell whether it doesn't exist or just - * can't be reached. + * Generic "not found" error. Cannot determine whether it + * doesn't exist or just can't be reached. However, we + * can differentiate between a NameSeg vs. NamePath. */ - AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op, - Op->Asl.ExternalName); + if (strlen (Op->Asl.ExternalName) == ACPI_NAME_SIZE) + { + AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op, + Op->Asl.ExternalName); + } + else + { + AslError (ASL_ERROR, ASL_MSG_NAMEPATH_NOT_EXIST, Op, + Op->Asl.ExternalName); + } } } diff --git a/src/acpica/source/compiler/dtio.c b/src/acpica/source/compiler/dtio.c index b15d3b97..bd189053 100644 --- a/src/acpica/source/compiler/dtio.c +++ b/src/acpica/source/compiler/dtio.c @@ -236,7 +236,7 @@ DtTrim ( /* Skip lines that start with a space */ - if (!strcmp (String, " ")) + if (*String == 0 || !strcmp (String, " ")) { ReturnString = UtLocalCacheCalloc (1); return (ReturnString); @@ -258,7 +258,7 @@ DtTrim ( while (End >= Start) { - if (*End == '\r' || *End == '\n') + if (*End == '\n') { End--; continue; @@ -522,6 +522,7 @@ DtGetNextLine ( UINT32 CurrentLineOffset; UINT32 i; int c; + int c1; memset (AslGbl_CurrentLineBuffer, 0, AslGbl_LineBufferSize); @@ -569,6 +570,29 @@ DtGetNextLine ( c = '\n'; State = DT_NORMAL_TEXT; } + else if (c == '\r') + { + c1 = getc (Handle); + if (c1 == '\n') + { + /* + * Skip the carriage return as if it didn't exist. This is + * onlt meant for input files in DOS format in unix. fopen in + * unix may not support "text mode" and leaves CRLF intact. + */ + c = '\n'; + } + else + { + /* This was not a CRLF. Only a CR */ + + ungetc(c1, Handle); + + DtFatal (ASL_MSG_COMPILER_INTERNAL, NULL, + "Carriage return without linefeed detected"); + return (ASL_EOF); + } + } switch (State) { diff --git a/src/acpica/source/compiler/dttable2.c b/src/acpica/source/compiler/dttable2.c index 3f970377..0b196a2f 100644 --- a/src/acpica/source/compiler/dttable2.c +++ b/src/acpica/source/compiler/dttable2.c @@ -1876,6 +1876,62 @@ DtCompileTcpa ( } +/****************************************************************************** + * + * FUNCTION: DtCompileTpm2Rev3 + * + * PARAMETERS: PFieldList - Current field list pointer + * + * RETURN: Status + * + * DESCRIPTION: Compile TPM2 revision 3 + * + *****************************************************************************/ +static ACPI_STATUS +DtCompileTpm2Rev3 ( + void **List) +{ + DT_FIELD **PFieldList = (DT_FIELD **) List; + DT_SUBTABLE *Subtable; + ACPI_TABLE_TPM23 *Tpm23Header; + DT_SUBTABLE *ParentTable; + ACPI_STATUS Status = AE_OK; + + + Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm23, + &Subtable); + + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + Tpm23Header = ACPI_CAST_PTR (ACPI_TABLE_TPM23, ParentTable->Buffer); + + /* Subtable type depends on the StartMethod */ + + switch (Tpm23Header->StartMethod) + { + case ACPI_TPM23_ACPI_START_METHOD: + + /* Subtable specific to to ARM_SMC */ + + Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm23a, + &Subtable); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + break; + + default: + break; + } + + return (Status); +} + + /****************************************************************************** * * FUNCTION: DtCompileTpm2 @@ -1897,8 +1953,18 @@ DtCompileTpm2 ( ACPI_TABLE_TPM2 *Tpm2Header; DT_SUBTABLE *ParentTable; ACPI_STATUS Status = AE_OK; + ACPI_TABLE_HEADER *Header; + ParentTable = DtPeekSubtable (); + + Header = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer); + + if (Header->Revision == 3) + { + return (DtCompileTpm2Rev3 (List)); + } + /* Compile the main table */ Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm2, diff --git a/src/acpica/source/compiler/prscan.c b/src/acpica/source/compiler/prscan.c index 580b47f0..325569ed 100644 --- a/src/acpica/source/compiler/prscan.c +++ b/src/acpica/source/compiler/prscan.c @@ -1259,7 +1259,6 @@ PrPopDirective ( AslGbl_DirectiveInfo[Info->Directive].Name, Info->Argument, AslGbl_IgnoringThisCodeBlock ? "TRUE" : "FALSE"); - ACPI_FREE (Info); return (AE_OK); } diff --git a/src/acpica/source/components/debugger/dbxface.c b/src/acpica/source/components/debugger/dbxface.c index c661b248..a0f3ed6b 100644 --- a/src/acpica/source/components/debugger/dbxface.c +++ b/src/acpica/source/components/debugger/dbxface.c @@ -174,6 +174,12 @@ AcpiDbMethodEnd ( ACPI_WALK_STATE *WalkState); #endif +#ifdef ACPI_DISASSEMBLER +static ACPI_PARSE_OBJECT * +AcpiDbGetDisplayOp ( + ACPI_WALK_STATE *WalkState, + ACPI_PARSE_OBJECT *Op); +#endif /******************************************************************************* * @@ -273,6 +279,74 @@ AcpiDbSignalBreakPoint ( } +#ifdef ACPI_DISASSEMBLER +/******************************************************************************* + * + * FUNCTION: AcpiDbGetDisplayOp + * + * PARAMETERS: WalkState - Current walk + * Op - Current executing op (from aml interpreter) + * + * RETURN: Opcode to display + * + * DESCRIPTION: Find the opcode to display during single stepping + * + ******************************************************************************/ + +static ACPI_PARSE_OBJECT * +AcpiDbGetDisplayOp ( + ACPI_WALK_STATE *WalkState, + ACPI_PARSE_OBJECT *Op) +{ + ACPI_PARSE_OBJECT *DisplayOp; + ACPI_PARSE_OBJECT *ParentOp; + + DisplayOp = Op; + ParentOp = Op->Common.Parent; + if (ParentOp) + { + if ((WalkState->ControlState) && + (WalkState->ControlState->Common.State == + ACPI_CONTROL_PREDICATE_EXECUTING)) + { + /* + * We are executing the predicate of an IF or WHILE statement + * Search upwards for the containing IF or WHILE so that the + * entire predicate can be displayed. + */ + while (ParentOp) + { + if ((ParentOp->Common.AmlOpcode == AML_IF_OP) || + (ParentOp->Common.AmlOpcode == AML_WHILE_OP)) + { + DisplayOp = ParentOp; + break; + } + ParentOp = ParentOp->Common.Parent; + } + } + else + { + while (ParentOp) + { + if ((ParentOp->Common.AmlOpcode == AML_IF_OP) || + (ParentOp->Common.AmlOpcode == AML_ELSE_OP) || + (ParentOp->Common.AmlOpcode == AML_SCOPE_OP) || + (ParentOp->Common.AmlOpcode == AML_METHOD_OP) || + (ParentOp->Common.AmlOpcode == AML_WHILE_OP)) + { + break; + } + DisplayOp = ParentOp; + ParentOp = ParentOp->Common.Parent; + } + } + } + return DisplayOp; +} +#endif + + /******************************************************************************* * * FUNCTION: AcpiDbSingleStep @@ -296,8 +370,6 @@ AcpiDbSingleStep ( ACPI_PARSE_OBJECT *Next; ACPI_STATUS Status = AE_OK; UINT32 OriginalDebugLevel; - ACPI_PARSE_OBJECT *DisplayOp; - ACPI_PARSE_OBJECT *ParentOp; UINT32 AmlOffset; @@ -393,53 +465,11 @@ AcpiDbSingleStep ( Next = Op->Common.Next; Op->Common.Next = NULL; - - DisplayOp = Op; - ParentOp = Op->Common.Parent; - if (ParentOp) - { - if ((WalkState->ControlState) && - (WalkState->ControlState->Common.State == - ACPI_CONTROL_PREDICATE_EXECUTING)) - { - /* - * We are executing the predicate of an IF or WHILE statement - * Search upwards for the containing IF or WHILE so that the - * entire predicate can be displayed. - */ - while (ParentOp) - { - if ((ParentOp->Common.AmlOpcode == AML_IF_OP) || - (ParentOp->Common.AmlOpcode == AML_WHILE_OP)) - { - DisplayOp = ParentOp; - break; - } - ParentOp = ParentOp->Common.Parent; - } - } - else - { - while (ParentOp) - { - if ((ParentOp->Common.AmlOpcode == AML_IF_OP) || - (ParentOp->Common.AmlOpcode == AML_ELSE_OP) || - (ParentOp->Common.AmlOpcode == AML_SCOPE_OP) || - (ParentOp->Common.AmlOpcode == AML_METHOD_OP) || - (ParentOp->Common.AmlOpcode == AML_WHILE_OP)) - { - break; - } - DisplayOp = ParentOp; - ParentOp = ParentOp->Common.Parent; - } - } - } - /* Now we can disassemble and display it */ #ifdef ACPI_DISASSEMBLER - AcpiDmDisassemble (WalkState, DisplayOp, ACPI_UINT32_MAX); + AcpiDmDisassemble (WalkState, AcpiDbGetDisplayOp (WalkState, Op), + ACPI_UINT32_MAX); #else /* * The AML Disassembler is not configured - at least we can diff --git a/src/acpica/source/components/dispatcher/dsopcode.c b/src/acpica/source/components/dispatcher/dsopcode.c index 038993c7..ca2cd470 100644 --- a/src/acpica/source/components/dispatcher/dsopcode.c +++ b/src/acpica/source/components/dispatcher/dsopcode.c @@ -586,6 +586,9 @@ AcpiDsEvalRegionOperands ( ObjDesc, ACPI_FORMAT_UINT64 (ObjDesc->Region.Address), ObjDesc->Region.Length)); + Status = AcpiUtAddAddressRange (ObjDesc->Region.SpaceId, + ObjDesc->Region.Address, ObjDesc->Region.Length, Node); + /* Now the address and length are valid for this opregion */ ObjDesc->Region.Flags |= AOPOBJ_DATA_VALID; diff --git a/src/acpica/source/components/dispatcher/dswload2.c b/src/acpica/source/components/dispatcher/dswload2.c index 9bc6ecfa..4b6e41d8 100644 --- a/src/acpica/source/components/dispatcher/dswload2.c +++ b/src/acpica/source/components/dispatcher/dswload2.c @@ -448,6 +448,15 @@ AcpiDsLoad2BeginOp ( } #endif + /* + * For name creation opcodes, the full namepath prefix must + * exist, except for the final (new) nameseg. + */ + if (WalkState->OpInfo->Flags & AML_NAMED) + { + Flags |= ACPI_NS_PREFIX_MUST_EXIST; + } + /* Add new entry or lookup existing entry */ Status = AcpiNsLookup (WalkState->ScopeInfo, BufferPtr, ObjectType, diff --git a/src/acpica/source/components/namespace/nsaccess.c b/src/acpica/source/components/namespace/nsaccess.c index af97c51f..11c652e0 100644 --- a/src/acpica/source/components/namespace/nsaccess.c +++ b/src/acpica/source/components/namespace/nsaccess.c @@ -421,6 +421,7 @@ AcpiNsLookup ( ACPI_OBJECT_TYPE ThisSearchType; UINT32 SearchParentFlag = ACPI_NS_SEARCH_PARENT; UINT32 LocalFlags; + ACPI_INTERPRETER_MODE LocalInterpreterMode; ACPI_FUNCTION_TRACE (NsLookup); @@ -670,6 +671,7 @@ AcpiNsLookup ( */ ThisSearchType = ACPI_TYPE_ANY; CurrentNode = ThisNode; + while (NumSegments && CurrentNode) { NumSegments--; @@ -704,6 +706,16 @@ AcpiNsLookup ( } } + /* Handle opcodes that create a new NameSeg via a full NamePath */ + + LocalInterpreterMode = InterpreterMode; + if ((Flags & ACPI_NS_PREFIX_MUST_EXIST) && (NumSegments > 0)) + { + /* Every element of the path must exist (except for the final NameSeg) */ + + LocalInterpreterMode = ACPI_IMODE_EXECUTE; + } + /* Extract one ACPI name from the front of the pathname */ ACPI_MOVE_32_TO_32 (&SimpleName, Path); @@ -711,11 +723,18 @@ AcpiNsLookup ( /* Try to find the single (4 character) ACPI name */ Status = AcpiNsSearchAndEnter (SimpleName, WalkState, CurrentNode, - InterpreterMode, ThisSearchType, LocalFlags, &ThisNode); + LocalInterpreterMode, ThisSearchType, LocalFlags, &ThisNode); if (ACPI_FAILURE (Status)) { if (Status == AE_NOT_FOUND) { +#if !defined ACPI_ASL_COMPILER /* Note: iASL reports this error by itself, not needed here */ + if (Flags & ACPI_NS_PREFIX_MUST_EXIST) + { + AcpiOsPrintf (ACPI_MSG_BIOS_ERROR + "Object does not exist: %4.4s\n", &SimpleName); + } +#endif /* Name not found in ACPI namespace */ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, diff --git a/src/acpica/source/components/parser/psloop.c b/src/acpica/source/components/parser/psloop.c index ef517b54..9625834c 100644 --- a/src/acpica/source/components/parser/psloop.c +++ b/src/acpica/source/components/parser/psloop.c @@ -298,7 +298,7 @@ AcpiPsGetArguments ( * future. Use of this option can cause problems with AML code that * depends upon in-order immediate execution of module-level code. */ - if (AcpiGbl_GroupModuleLevelCode && + if (!AcpiGbl_ExecuteTablesAsMethods && (WalkState->PassNumber <= ACPI_IMODE_LOAD_PASS2) && ((WalkState->ParseFlags & ACPI_PARSE_DISASSEMBLE) == 0)) { @@ -566,6 +566,7 @@ AcpiPsParseLoop ( ACPI_PARSE_OBJECT *Op = NULL; /* current op */ ACPI_PARSE_STATE *ParserState; UINT8 *AmlOpStart = NULL; + UINT8 OpcodeLength; ACPI_FUNCTION_TRACE_PTR (PsParseLoop, WalkState); @@ -654,7 +655,7 @@ AcpiPsParseLoop ( * status to AE_OK to proceed with the table load. */ if ((WalkState->ParseFlags & ACPI_PARSE_MODULE_LEVEL) && - Status == AE_ALREADY_EXISTS) + ((Status == AE_ALREADY_EXISTS) || (Status == AE_NOT_FOUND))) { Status = AE_OK; } @@ -686,9 +687,20 @@ AcpiPsParseLoop ( * the scope op because the parse failure indicates that * the device may not exist. */ - ACPI_ERROR ((AE_INFO, "Skip parsing opcode %s", - AcpiPsGetOpcodeName (WalkState->Opcode))); - WalkState->ParserState.Aml = WalkState->Aml + 1; + ACPI_INFO (("Skipping parse of AML opcode: %s (0x%4.4X)", + AcpiPsGetOpcodeName (WalkState->Opcode), WalkState->Opcode)); + + /* + * Determine the opcode length before skipping the opcode. + * An opcode can be 1 byte or 2 bytes in length. + */ + OpcodeLength = 1; + if ((WalkState->Opcode & 0xFF00) == AML_EXTENDED_OPCODE) + { + OpcodeLength = 2; + } + WalkState->ParserState.Aml = WalkState->Aml + OpcodeLength; + WalkState->ParserState.Aml = AcpiPsGetNextPackageEnd(&WalkState->ParserState); WalkState->Aml = WalkState->ParserState.Aml; diff --git a/src/acpica/source/components/parser/psobject.c b/src/acpica/source/components/parser/psobject.c index 8d6f81bd..ca7ab0ae 100644 --- a/src/acpica/source/components/parser/psobject.c +++ b/src/acpica/source/components/parser/psobject.c @@ -773,7 +773,7 @@ AcpiPsCompleteOp ( * because there could be correct AML beyond the parts that caused * the runtime error. */ - ACPI_ERROR ((AE_INFO, "Ignore error and continue table load")); + ACPI_INFO (("Ignoring error and continuing table load")); return_ACPI_STATUS (AE_OK); } return_ACPI_STATUS (Status); diff --git a/src/acpica/source/components/tables/tbxfload.c b/src/acpica/source/components/tables/tbxfload.c index 0119b684..a956806e 100644 --- a/src/acpica/source/components/tables/tbxfload.c +++ b/src/acpica/source/components/tables/tbxfload.c @@ -219,7 +219,7 @@ AcpiLoadTables ( "While loading namespace from ACPI tables")); } - if (AcpiGbl_ExecuteTablesAsMethods || !AcpiGbl_GroupModuleLevelCode) + if (AcpiGbl_ExecuteTablesAsMethods) { /* * If the module-level code support is enabled, initialize the objects diff --git a/src/acpica/source/include/acdisasm.h b/src/acpica/source/include/acdisasm.h index b774b20f..edd108d2 100644 --- a/src/acpica/source/include/acdisasm.h +++ b/src/acpica/source/include/acdisasm.h @@ -561,6 +561,8 @@ extern ACPI_DMTABLE_INFO AcpiDmTableInfoTcpaServer[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoTpm2[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoTpm2a[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoTpm211[]; +extern ACPI_DMTABLE_INFO AcpiDmTableInfoTpm23[]; +extern ACPI_DMTABLE_INFO AcpiDmTableInfoTpm23a[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoUefi[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoVrtc[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoVrtc0[]; diff --git a/src/acpica/source/include/acnamesp.h b/src/acpica/source/include/acnamesp.h index 1e3db8d1..7c2083d3 100644 --- a/src/acpica/source/include/acnamesp.h +++ b/src/acpica/source/include/acnamesp.h @@ -177,6 +177,7 @@ #define ACPI_NS_TEMPORARY 0x0040 #define ACPI_NS_OVERRIDE_IF_FOUND 0x0080 #define ACPI_NS_EARLY_INIT 0x0100 +#define ACPI_NS_PREFIX_MUST_EXIST 0x0200 /* Flags for AcpiNsWalkNamespace */ diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h index aaf284cb..27e9aa7f 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 0x20181003 +#define ACPI_CA_VERSION 0x20181031 #include "acconfig.h" #include "actypes.h" @@ -300,13 +300,6 @@ ACPI_INIT_GLOBAL (UINT8, AcpiGbl_CopyDsdtLocally, FALSE); */ ACPI_INIT_GLOBAL (UINT8, AcpiGbl_DoNotUseXsdt, FALSE); -/* - * Optionally support group module level code. - * NOTE, this is essentially obsolete and will be removed soon - * (01/2018). - */ -ACPI_INIT_GLOBAL (UINT8, AcpiGbl_GroupModuleLevelCode, FALSE); - /* * Optionally support module level code by parsing an entire table as * a method as it is loaded. Default is TRUE. diff --git a/src/acpica/source/include/actbinfo.h b/src/acpica/source/include/actbinfo.h index 347a3940..19eeeccb 100644 --- a/src/acpica/source/include/actbinfo.h +++ b/src/acpica/source/include/actbinfo.h @@ -194,6 +194,7 @@ #define ACPI_STAO_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_STAO,f) #define ACPI_TCPA_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_TCPA_HDR,f) #define ACPI_TPM2_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_TPM2,f) +#define ACPI_TPM23_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_TPM23,f) #define ACPI_UEFI_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_UEFI,f) #define ACPI_WAET_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_WAET,f) #define ACPI_WDAT_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_WDAT,f) @@ -337,6 +338,7 @@ #define ACPI_TCPA_SERVER_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_TCPA_SERVER,f) #define ACPI_TPM2A_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TPM2_TRAILER,f) #define ACPI_TPM211_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TPM2_ARM_SMC,f) +#define ACPI_TPM23A_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TPM23_TRAILER,f) #define ACPI_VRTC0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_VRTC_ENTRY,f) #define ACPI_WDAT0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_WDAT_ENTRY,f) diff --git a/src/acpica/source/include/actbl3.h b/src/acpica/source/include/actbl3.h index d4c15838..99b466c1 100644 --- a/src/acpica/source/include/actbl3.h +++ b/src/acpica/source/include/actbl3.h @@ -552,6 +552,34 @@ typedef struct acpi_table_tcpa_server * ******************************************************************************/ +/* Revision 3 */ + +typedef struct acpi_table_tpm23 +{ + ACPI_TABLE_HEADER Header; /* Common ACPI table header */ + UINT32 Reserved; + UINT64 ControlAddress; + UINT32 StartMethod; + +} ACPI_TABLE_TPM23; + +/* Value for StartMethod above */ + +#define ACPI_TPM23_ACPI_START_METHOD 2 + +/* + * Optional trailer for revision 3. If start method is 2, there is a 4 byte + * reserved area of all zeros. + */ +typedef struct acpi_tmp23_trailer +{ + UINT32 Reserved; + +} ACPI_TPM23_TRAILER; + + +/* Revision 4 */ + typedef struct acpi_table_tpm2 { ACPI_TABLE_HEADER Header; /* Common ACPI table header */