MFV: r339981

Merge ACPICA 20181031.
This commit is contained in:
Jung-uk Kim 2018-11-02 22:50:13 +00:00
commit 4a38ee6de7
26 changed files with 493 additions and 108 deletions

View File

@ -1,3 +1,53 @@
----------------------------------------
31 October 2018. Summary of changes for version 20181031:
This release is available at https://acpica.org/downloads
An Operation Region regression was fixed by properly adding address
ranges to a global list during initialization. This allows OS to
accurately check for overlapping regions between native devices (such as
PCI) and Operation regions as well as checking for region conflicts
between two Operation Regions.
Added support for the 2-byte extended opcodes in the code/feature that
attempts to continue parsing during the table load phase. Skip parsing
Device declarations (and other extended opcodes) when an error occurs
during parsing. Previously, only single-byte opcodes were supported.
Cleanup: Simplified the module-level code support by eliminating a
useless global variable (AcpiGbl_GroupModuleLeveCode).
2) iASL Compiler/Disassembler and Tools:
iASL/Preprocessor: Fixed a regression where an incorrect use of ACPI_FREE
could cause a fault in the preprocessor. This was an inadvertent side-
effect from moving more allocations/frees to the local cache/memory
mechanism.
iASL: Enhanced error detection by validating that all NameSeg elements
within a NamePatch actually exist. The previous behavior was spotty at
best, and such errors could be improperly ignored at compiler time (never
at runtime, however. There are two new error messages, as shown in the
examples below:
dsdt.asl 33: CreateByteField (TTTT.BXXX, 1, CBF1)
Error 6161 - ^ One or more objects within
the Pathname do not exist (TTTT.BXXX)
dsdt.asl 34: CreateByteField (BUF1, UUUU.INT1, BBBB.CBF1)
Error 6160 - One or more prefix Scopes do not exist ^
(BBBB.CBF1)
iASL: Disassembler/table-compiler: Added support for the static data
table TPM2 revision 3 (an older version of TPM2). The support has been
added for the compiler and the disassembler.
Fixed compilation of DOS format data table file on Unix/Linux systems.
iASL now properly detects line continuations (\) for DOS format data
table definition language files on when executing on Unix/Linux.
----------------------------------------
03 October 2018. Summary of changes for version 20181003:

View File

@ -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;

View File

@ -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},

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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,

View File

@ -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;
}

View File

@ -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 */

View File

@ -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 */

View File

@ -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);

View File

@ -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);
}
}
}

View File

@ -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)
{

View File

@ -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,

View File

@ -1259,7 +1259,6 @@ PrPopDirective (
AslGbl_DirectiveInfo[Info->Directive].Name,
Info->Argument, AslGbl_IgnoringThisCodeBlock ? "TRUE" : "FALSE");
ACPI_FREE (Info);
return (AE_OK);
}

View File

@ -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

View File

@ -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;

View File

@ -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,

View File

@ -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,

View File

@ -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;

View File

@ -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);

View File

@ -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

View File

@ -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[];

View File

@ -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 */

View File

@ -154,7 +154,7 @@
/* Current ACPICA subsystem version in YYYYMMDD format */
#define ACPI_CA_VERSION 0x20181003
#define ACPI_CA_VERSION 0x20181031
#include <contrib/dev/acpica/include/acconfig.h>
#include <contrib/dev/acpica/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.

View File

@ -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)

View File

@ -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 */