MFV: r366539

Merge ACPICA 20200925.
This commit is contained in:
Jung-uk Kim 2020-10-09 05:27:02 +00:00
commit f15e9afb1f
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=366562
33 changed files with 516 additions and 108 deletions

View File

@ -1,6 +1,80 @@
----------------------------------------
25 September 2020. Summary of changes for version 20200925:
This release is available at https://acpica.org/downloads
1) ACPICA kernel-resident subsystem:
Preserve memory opregion mappings. The ACPICA's strategy with respect to
the handling of memory mappings associated with memory operation regions
is to avoid mapping the entire region at once which may be problematic at
least in principle (for example, it may lead to conflicts with
overlapping mappings having different attributes created by drivers). It
may also be wasteful, because memory opregions on some systems take up
vastchunks of address space while the fields in those regions actually
accessed by AML are sparsely distributed.
For this reason, a one-page "window" is mapped for a given opregion on
the first memory access through it and if that "window" does not cover an
address range accessed through that opregion subsequently, it is unmapped
and a new "window" is mapped to replace it. Next, if the new "window" is
not sufficient to access memory through the opregion in question in the
future, it will be replaced with yet another "window" and so on. That
may lead to a suboptimal sequence of memory mapping and unmapping
operations, for example if two fields in one opregion separated from each
other by a sufficiently wide chunk of unused address space are accessed
in an alternating pattern.
Added support for 64 bit risc-v compilation. Useful for acpica tools and
incorporating ACPICA into the Firmware Test Suite. Colin Ian King
<colin.king@canonical.com>.
Added support for SMBus predefined names (from SMBus Control Method
Interface Specification, Version 1.0, December 10, 1999. New predefined
names:
_SBA
_SBI
_SBR
_SBT
_SBW
AML Disassembler: Added a new command, "All <NameSeg". This command will
evaluate all objects in the current namespace whose NameString contains
the input NameSeg as the last element of the NameString. Useful for
debugging.
2) iASL Compiler/Disassembler and ACPICA tools:
iASL: fixed a crash that occurred when predefined objects return packages
with lengths that exceed the initializer list.
iASL: added more detail to external resolution error message when
compiling multiple definition blocks.
iASL: improve alias analysis by saving object type. If the alias is a
method type, the parameter count is also recorded.
AcpiExec: Increase the default loop timeout value. Was 1 second, is now
10 seconds. Prevents unnecessary timeouts when executing control methods
from the command line.
AcpiHelp/disassembler: Added a bunch of "known" UUIDs to the internal
list. Includes:
Memory Device
Generic Buttons Device
NVDIMM Root Device
Control Method Battery
Device Graphs for _DSD method
Hierarchical Data Extension
....ARM CoreSight Graph
----------------------------------------
17 July 2020. Summary of changes for version 20200717:
This release is available at https://acpica.org/downloads
@ -94,7 +168,7 @@ would need to be updated to match the same behavior as the acpiexec
utility and since acpiexec can already dump the entire namespace (via the
'namespace' command), we no longer have the need to maintain acpinames.
In order to dump the contents of the ACPI namepsace using acpiexec,
In order to dump the contents of the ACPI namespace using acpiexec,
execute the following command from the command line:
acpiexec -b "n" [aml files]
@ -17606,7 +17680,7 @@ bypass the "implicit conversion" mechanism of the Store operator.)
The ACPI 2.0 semantics for the SizeOf operator are fully
implemented. The change is that performing a SizeOf on a
reference object causes an automatic dereference of the object to
tha actual value before the size is evaluated. This behavior was
the actual value before the size is evaluated. This behavior was
undefined in ACPI 1.0.
The ACPI 2.0 semantics for the Extended IRQ resource descriptor

View File

@ -393,6 +393,11 @@ const AH_PREDEFINED_NAME AslPredefinedInfo[] =
AH_PREDEF ("_S3W", "S3 Device Wake State", "Returns the lowest D-state for this device that can wake the system from S3"),
AH_PREDEF ("_S4W", "S4 Device Wake State", "Returns the lowest D-state for this device that can wake the system from S4"),
AH_PREDEF ("_SB_", "System Bus", "Predefined scope for device and bus objects"),
AH_PREDEF ("_SBA", "SM Bus Alert information", "Returns info on an SMBus alert"),
AH_PREDEF ("_SBI", "SM Bus General information", "Returns info on an SMBus segment"),
AH_PREDEF ("_SBR", "SM Bus Data read", "Reads Byte, Word, or Block data from an SMBus segment"),
AH_PREDEF ("_SBT", "SM Bus Data transfer", "Performs data transfer to/from an SMBus segment. Implements ProcessCall protocol"),
AH_PREDEF ("_SBW", "SM Bus Data write", "Writes Byte, Word, or Block data to an SMBus segment"),
AH_PREDEF ("_SBS", "Smart Battery Subsystem", "Returns the subsystem configuration"),
AH_PREDEF ("_SCP", "Set Cooling Policy", "Sets the cooling policy (active or passive)"),
AH_PREDEF ("_SDD", "Set Device Data", "Sets data for a SATA device"),

View File

@ -171,6 +171,10 @@ const AH_UUID Gbl_AcpiUuids[] =
{"PCI Host Bridge Device", UUID_PCI_HOST_BRIDGE},
{"HID I2C Device", UUID_I2C_DEVICE},
{"Power Button Device", UUID_POWER_BUTTON},
{"Memory Device", UUID_MEMORY_DEVICE},
{"Generic Buttons Device", UUID_GENERIC_BUTTONS_DEVICE},
{"NVDIMM Root Device", UUID_NVDIMM_ROOT_DEVICE},
{"Control Method Battery", UUID_CONTROL_METHOD_BATTERY},
{"[Interfaces]", NULL},
{"Device Labeling Interface", UUID_DEVICE_LABELING},
@ -196,7 +200,9 @@ const AH_UUID Gbl_AcpiUuids[] =
{"Battery Thermal Limit", UUID_BATTERY_THERMAL_LIMIT},
{"Thermal Extensions", UUID_THERMAL_EXTENSIONS},
{"Device Properties for _DSD", UUID_DEVICE_PROPERTIES},
{"Device Graphs for _DSD", UUID_DEVICE_GRAPHS},
{"Hierarchical Data Extension", UUID_HIERARCHICAL_DATA_EXTENSION},
{"ARM Coresight Graph", UUID_CORESIGHT_GRAPH},
{NULL, NULL}
};

View File

@ -1121,7 +1121,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoHmat0[] =
{ACPI_DMT_UINT16, ACPI_HMAT0_OFFSET (Flags), "Flags (decoded below)", 0},
{ACPI_DMT_FLAG0, ACPI_HMAT0_FLAG_OFFSET (Flags,0), "Processor Proximity Domain Valid", 0},
{ACPI_DMT_UINT16, ACPI_HMAT0_OFFSET (Reserved1), "Reserved1", 0},
{ACPI_DMT_UINT32, ACPI_HMAT0_OFFSET (ProcessorPD), "Processor Proximity Domain", 0},
{ACPI_DMT_UINT32, ACPI_HMAT0_OFFSET (InitiatorPD), "Attached Initiator Proximity Domain", 0},
{ACPI_DMT_UINT32, ACPI_HMAT0_OFFSET (MemoryPD), "Memory Proximity Domain", 0},
{ACPI_DMT_UINT32, ACPI_HMAT0_OFFSET (Reserved2), "Reserved2", 0},
{ACPI_DMT_UINT64, ACPI_HMAT0_OFFSET (Reserved3), "Reserved3", 0},

View File

@ -279,8 +279,8 @@ NamePathTail [.]{NameSeg}
/*
* Begin standard ASL grammar
*/
[0-9][a-zA-Z0-9]* { AslCompilerlval.i = UtDoConstant ((char *) AslCompilertext);
count (1); return (PARSEOP_INTEGER); }
[0-9][a-zA-Z0-9]* { count (1); AslCompilerlval.i = UtDoConstant ((char *) AslCompilertext);
return (PARSEOP_INTEGER); }
"Include" { count (1); return (PARSEOP_INCLUDE); }
"External" { count (1); return (PARSEOP_EXTERNAL); }
@ -841,7 +841,6 @@ NamePathTail [.]{NameSeg}
* the required length.
*/
strcpy (s, "____");
AcpiUtStrupr (AslCompilertext);
}
memcpy (s, AslCompilertext, strlen (AslCompilertext));
AslCompilerlval.s = s;
@ -851,7 +850,6 @@ NamePathTail [.]{NameSeg}
{NameString} { char *s;
count (0);
s=UtLocalCacheCalloc (strlen (AslCompilertext)+1);
AcpiUtStrupr (AslCompilertext);
strcpy (s, AslCompilertext);
AslCompilerlval.s = s;
DbgPrint (ASL_PARSE_OUTPUT, "NameString: %s\n", s);

View File

@ -1404,9 +1404,16 @@ LdNamespace2Begin (
return (AE_OK);
}
/* Save the target node within the alias node */
/* Save the target node within the alias node as well as type information */
Node->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode);
Node->Type = TargetNode->Type;
if (Node->Type == ACPI_TYPE_METHOD)
{
/* Save the parameter count for methods */
Node->Value = TargetNode->Value;
}
}
return (AE_OK);

View File

@ -381,6 +381,9 @@ const char *AslCompilerMsgs [] =
/* ASL_MSG_DUPLICATE_EXTERN_MISMATCH */ "Type mismatch between multiple external declarations detected",
/* ASL_MSG_DUPLICATE_EXTERN_FOUND_HERE */"Duplicate external declaration:",
/* ASL_MSG_CONDREF_NEEDS_EXTERNAL_DECL */"CondRefOf parameter requires External() declaration",
/* ASL_MSG_EXTERNAL_FOUND_HERE */ "External declaration below ",
/* ASL_MSG_LOWER_CASE_NAMESEG */ "At least one lower case letter found in NameSeg, ASL is case insensitive - converting to upper case",
/* ASL_MSG_LOWER_CASE_NAMEPATH */ "At least one lower case letter found in NamePath, ASL is case insensitive - converting to upper case",
};
/* Table compiler */

View File

@ -383,6 +383,9 @@ typedef enum
ASL_MSG_DUPLICATE_EXTERN_MISMATCH,
ASL_MSG_DUPLICATE_EXTERN_FOUND_HERE,
ASL_MSG_CONDREF_NEEDS_EXTERNAL_DECL,
ASL_MSG_EXTERNAL_FOUND_HERE,
ASL_MSG_LOWER_CASE_NAMESEG,
ASL_MSG_LOWER_CASE_NAMEPATH,
/* These messages are used by the Data Table compiler only */

View File

@ -388,6 +388,8 @@ TrCreateValuedLeafOp (
UINT64 Value)
{
ACPI_PARSE_OBJECT *Op;
UINT32 i;
char *StringPtr = NULL;
Op = TrAllocateOp (ParseOpcode);
@ -408,11 +410,35 @@ TrCreateValuedLeafOp (
case PARSEOP_NAMESEG:
/* Check for mixed case (or all lower case). Issue a remark in this case */
for (i = 0; i < ACPI_NAMESEG_SIZE; i++)
{
if (islower (Op->Asl.Value.Name[i]))
{
AcpiUtStrupr (&Op->Asl.Value.Name[i]);
AslError (ASL_REMARK, ASL_MSG_LOWER_CASE_NAMESEG, Op, Op->Asl.Value.Name);
break;
}
}
DbgPrint (ASL_PARSE_OUTPUT, "NAMESEG->%s", Op->Asl.Value.String);
break;
case PARSEOP_NAMESTRING:
/* Check for mixed case (or all lower case). Issue a remark in this case */
StringPtr = Op->Asl.Value.Name;
for (i = 0; *StringPtr; i++)
{
if (islower (*StringPtr))
{
AcpiUtStrupr (&Op->Asl.Value.Name[i]);
AslError (ASL_REMARK, ASL_MSG_LOWER_CASE_NAMEPATH, Op, Op->Asl.Value.Name);
break;
}
StringPtr++;
}
DbgPrint (ASL_PARSE_OUTPUT, "NAMESTRING->%s", Op->Asl.Value.String);
break;

View File

@ -318,6 +318,17 @@ ApCheckPackage (
*/
for (i = 0; i < Count; i++)
{
if (!Op)
{
/*
* If we get to this point, it means that the package length
* is larger than the initializer list. Stop processing the
* package and return because we have run out of package
* elements to analyze.
*/
return;
}
ApCheckObjectType (Predefined->Info.Name, Op,
Package->RetInfo.ObjectType1, i);
Op = Op->Asl.Next;
@ -917,7 +928,7 @@ ApPackageTooSmall (
UINT32 ExpectedCount)
{
sprintf (AslGbl_MsgBuffer, "%s: length %u, required minimum is %u",
sprintf (AslGbl_MsgBuffer, "%4.4s: length %u, required minimum is %u",
PredefinedName, Count, ExpectedCount);
AslError (ASL_ERROR, ASL_MSG_RESERVED_PACKAGE_LENGTH, Op, AslGbl_MsgBuffer);
@ -946,7 +957,7 @@ ApZeroLengthPackage (
ACPI_PARSE_OBJECT *Op)
{
sprintf (AslGbl_MsgBuffer, "%s: length is zero", PredefinedName);
sprintf (AslGbl_MsgBuffer, "%4.4s: length is zero", PredefinedName);
AslError (ASL_ERROR, ASL_MSG_RESERVED_PACKAGE_LENGTH, Op, AslGbl_MsgBuffer);
}
@ -975,7 +986,7 @@ ApPackageTooLarge (
UINT32 ExpectedCount)
{
sprintf (AslGbl_MsgBuffer, "%s: length is %u, only %u required",
sprintf (AslGbl_MsgBuffer, "%4.4s: length is %u, only %u required",
PredefinedName, Count, ExpectedCount);
AslError (ASL_REMARK, ASL_MSG_RESERVED_PACKAGE_LENGTH, Op, AslGbl_MsgBuffer);

View File

@ -1074,14 +1074,16 @@ UtDoConstant (
{
ACPI_STATUS Status;
UINT64 ConvertedInteger;
char ErrBuf[64];
char ErrBuf[128];
const ACPI_EXCEPTION_INFO *ExceptionInfo;
Status = AcpiUtStrtoul64 (String, &ConvertedInteger);
if (ACPI_FAILURE (Status))
{
sprintf (ErrBuf, "While creating 64-bit constant: %s\n",
AcpiFormatException (Status));
ExceptionInfo = AcpiUtValidateException ((ACPI_STATUS) Status);
sprintf (ErrBuf, " %s while converting to 64-bit integer",
ExceptionInfo->Description);
AslCommonError (ASL_ERROR, ASL_MSG_SYNTAX, AslGbl_CurrentLineNumber,
AslGbl_LogicalLineNumber, AslGbl_CurrentLineOffset,

View File

@ -433,6 +433,7 @@ XfNamespaceLocateBegin (
UINT32 i;
ACPI_NAMESPACE_NODE *DeclarationParentMethod;
ACPI_PARSE_OBJECT *ReferenceParentMethod;
char *ExternalPath;
ACPI_FUNCTION_TRACE_PTR (XfNamespaceLocateBegin, Op);
@ -1263,7 +1264,15 @@ XfNamespaceLocateBegin (
Op->Asl.Parent->Asl.ParseOpcode != PARSEOP_CONDREFOF &&
!XfRefIsGuardedByIfCondRefOf (Node, Op))
{
AslError (ASL_ERROR, ASL_MSG_UNDEFINED_EXTERNAL, Op, NULL);
ExternalPath = AcpiNsGetNormalizedPathname (Node, TRUE);
sprintf (AslGbl_MsgBuffer, "full path of external object: %s",
ExternalPath);
AslDualParseOpError (ASL_ERROR, ASL_MSG_UNDEFINED_EXTERNAL, Op, NULL,
ASL_MSG_EXTERNAL_FOUND_HERE, Node->Op, AslGbl_MsgBuffer);
if (ExternalPath)
{
ACPI_FREE (ExternalPath);
}
}
/* 5) Check for a connection object */

View File

@ -252,7 +252,8 @@ AcpiDbDeleteObjects (
*
* RETURN: Status
*
* DESCRIPTION: Execute a control method.
* DESCRIPTION: Execute a control method. Used to evaluate objects via the
* "EXECUTE" or "EVALUATE" commands.
*
******************************************************************************/
@ -504,11 +505,12 @@ AcpiDbExecutionWalk (
Status = AcpiEvaluateObject (Node, NULL, NULL, &ReturnObj);
AcpiGbl_MethodExecuting = FALSE;
AcpiOsPrintf ("Evaluation of [%4.4s] returned %s\n",
AcpiUtGetNodeName (Node),
AcpiFormatException (Status));
AcpiGbl_MethodExecuting = FALSE;
return (AE_OK);
}
@ -525,7 +527,8 @@ AcpiDbExecutionWalk (
* RETURN: None
*
* DESCRIPTION: Execute a control method. Name is relative to the current
* scope.
* scope. Function used for the "EXECUTE", "EVALUATE", and
* "ALL" commands
*
******************************************************************************/
@ -569,6 +572,12 @@ AcpiDbExecute (
return;
}
if ((Flags & EX_ALL) && (strlen (Name) > 4))
{
AcpiOsPrintf ("Input name (%s) must be a 4-char NameSeg\n", Name);
return;
}
NameString = ACPI_ALLOCATE (strlen (Name) + 1);
if (!NameString)
{
@ -588,13 +597,27 @@ AcpiDbExecute (
return;
}
AcpiGbl_DbMethodInfo.Name = NameString;
AcpiGbl_DbMethodInfo.Args = Args;
AcpiGbl_DbMethodInfo.Types = Types;
AcpiGbl_DbMethodInfo.Flags = Flags;
/* Command (ALL <nameseg>) to execute all methods of a particular name */
ReturnObj.Pointer = NULL;
ReturnObj.Length = ACPI_ALLOCATE_BUFFER;
else if (Flags & EX_ALL)
{
AcpiGbl_DbMethodInfo.Name = NameString;
ReturnObj.Pointer = NULL;
ReturnObj.Length = ACPI_ALLOCATE_BUFFER;
AcpiDbEvaluateAll (NameString);
ACPI_FREE (NameString);
return;
}
else
{
AcpiGbl_DbMethodInfo.Name = NameString;
AcpiGbl_DbMethodInfo.Args = Args;
AcpiGbl_DbMethodInfo.Types = Types;
AcpiGbl_DbMethodInfo.Flags = Flags;
ReturnObj.Pointer = NULL;
ReturnObj.Length = ACPI_ALLOCATE_BUFFER;
}
Status = AcpiDbExecuteSetup (&AcpiGbl_DbMethodInfo);
if (ACPI_FAILURE (Status))
@ -655,6 +678,7 @@ AcpiDbExecute (
(UINT32) ReturnObj.Length);
AcpiDbDumpExternalObject (ReturnObj.Pointer, 1);
AcpiOsPrintf ("\n");
/* Dump a _PLD buffer if present */

View File

@ -195,6 +195,7 @@ enum AcpiExDebuggerCommands
{
CMD_NOT_FOUND = 0,
CMD_NULL,
CMD_ALL,
CMD_ALLOCATIONS,
CMD_ARGS,
CMD_ARGUMENTS,
@ -275,6 +276,7 @@ static const ACPI_DB_COMMAND_INFO AcpiGbl_DbCommands[] =
{
{"<NOT FOUND>", 0},
{"<NULL>", 0},
{"ALL", 1},
{"ALLOCATIONS", 0},
{"ARGS", 0},
{"ARGUMENTS", 0},
@ -377,6 +379,7 @@ static const ACPI_DB_COMMAND_HELP AcpiGbl_DbCommandHelp[] =
{1, " Type <Object>", "Display object type\n"},
{0, "\nControl Method Execution:", "\n"},
{1, " All <NameSeg>", "Evaluate all objects named NameSeg\n"},
{1, " Evaluate <Namepath> [Arguments]", "Evaluate object or control method\n"},
{1, " Execute <Namepath> [Arguments]", "Synonym for Evaluate\n"},
#ifdef ACPI_APPLICATION
@ -599,7 +602,7 @@ AcpiDbDisplayHelp (
}
else
{
/* Display help for all commands that match the subtring */
/* Display help for all commands that match the substring */
AcpiDbDisplayCommandInfo (Command, TRUE);
}
@ -947,6 +950,13 @@ AcpiDbCommandDispatch (
}
break;
case CMD_ALL:
AcpiOsPrintf ("Executing all objects with NameSeg: %s\n", AcpiGbl_DbArgs[1]);
AcpiDbExecute (AcpiGbl_DbArgs[1],
&AcpiGbl_DbArgs[2], &AcpiGbl_DbArgTypes[2], EX_NO_SINGLE_STEP | EX_ALL);
break;
case CMD_ALLOCATIONS:
#ifdef ACPI_DBG_TRACK_ALLOCATIONS

View File

@ -170,6 +170,10 @@ AcpiDbWalkForExecute (
void *Context,
void **ReturnValue);
static ACPI_STATUS
AcpiDbEvaluateObject (
ACPI_NAMESPACE_NODE *Node);
/*******************************************************************************
*
@ -542,47 +546,30 @@ AcpiDbDisassembleMethod (
/*******************************************************************************
*
* FUNCTION: AcpiDbWalkForExecute
* FUNCTION: AcpiDbEvaluateObject
*
* PARAMETERS: Callback from WalkNamespace
* PARAMETERS: Node - Namespace node for the object
*
* RETURN: Status
*
* DESCRIPTION: Batch execution module. Currently only executes predefined
* ACPI names.
* DESCRIPTION: Main execution function for the Evaluate/Execute/All debugger
* commands.
*
******************************************************************************/
static ACPI_STATUS
AcpiDbWalkForExecute (
ACPI_HANDLE ObjHandle,
UINT32 NestingLevel,
void *Context,
void **ReturnValue)
AcpiDbEvaluateObject (
ACPI_NAMESPACE_NODE *Node)
{
ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
ACPI_DB_EXECUTE_WALK *Info = (ACPI_DB_EXECUTE_WALK *) Context;
ACPI_BUFFER ReturnObj;
ACPI_STATUS Status;
char *Pathname;
UINT32 i;
ACPI_DEVICE_INFO *ObjInfo;
ACPI_OBJECT_LIST ParamObjects;
ACPI_OBJECT Params[ACPI_METHOD_NUM_ARGS];
const ACPI_PREDEFINED_INFO *Predefined;
ACPI_BUFFER ReturnObj;
ACPI_STATUS Status;
Predefined = AcpiUtMatchPredefinedMethod (Node->Name.Ascii);
if (!Predefined)
{
return (AE_OK);
}
if (Node->Type == ACPI_TYPE_LOCAL_SCOPE)
{
return (AE_OK);
}
Pathname = AcpiNsGetExternalPathname (Node);
if (!Pathname)
{
@ -591,7 +578,7 @@ AcpiDbWalkForExecute (
/* Get the object info for number of method parameters */
Status = AcpiGetObjectInfo (ObjHandle, &ObjInfo);
Status = AcpiGetObjectInfo (Node, &ObjInfo);
if (ACPI_FAILURE (Status))
{
ACPI_FREE (Pathname);
@ -624,13 +611,70 @@ AcpiDbWalkForExecute (
AcpiGbl_MethodExecuting = TRUE;
Status = AcpiEvaluateObject (Node, NULL, &ParamObjects, &ReturnObj);
AcpiGbl_MethodExecuting = FALSE;
AcpiOsPrintf ("%-32s returned %s\n", Pathname, AcpiFormatException (Status));
AcpiGbl_MethodExecuting = FALSE;
if (ReturnObj.Length)
{
AcpiOsPrintf ("Evaluation of %s returned object %p, "
"external buffer length %X\n",
Pathname, ReturnObj.Pointer, (UINT32) ReturnObj.Length);
AcpiDbDumpExternalObject (ReturnObj.Pointer, 1);
AcpiOsPrintf ("\n");
}
ACPI_FREE (Pathname);
/* Ignore status from method execution */
return (AE_OK);
/* Update count, check if we have executed enough methods */
}
/*******************************************************************************
*
* FUNCTION: AcpiDbWalkForExecute
*
* PARAMETERS: Callback from WalkNamespace
*
* RETURN: Status
*
* DESCRIPTION: Batch execution function. Evaluates all "predefined" objects --
* the nameseg begins with an underscore.
*
******************************************************************************/
static ACPI_STATUS
AcpiDbWalkForExecute (
ACPI_HANDLE ObjHandle,
UINT32 NestingLevel,
void *Context,
void **ReturnValue)
{
ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
ACPI_DB_EXECUTE_WALK *Info = (ACPI_DB_EXECUTE_WALK *) Context;
ACPI_STATUS Status;
const ACPI_PREDEFINED_INFO *Predefined;
Predefined = AcpiUtMatchPredefinedMethod (Node->Name.Ascii);
if (!Predefined)
{
return (AE_OK);
}
if (Node->Type == ACPI_TYPE_LOCAL_SCOPE)
{
return (AE_OK);
}
AcpiDbEvaluateObject (Node);
/* Ignore status from object evaluation */
Status = AE_OK;
/* Update count, check if we have executed enough methods */
@ -645,6 +689,56 @@ AcpiDbWalkForExecute (
}
/*******************************************************************************
*
* FUNCTION: AcpiDbWalkForExecuteAll
*
* PARAMETERS: Callback from WalkNamespace
*
* RETURN: Status
*
* DESCRIPTION: Batch execution function. Evaluates all objects whose path ends
* with the nameseg "Info->NameSeg". Used for the "ALL" command.
*
******************************************************************************/
static ACPI_STATUS
AcpiDbWalkForExecuteAll (
ACPI_HANDLE ObjHandle,
UINT32 NestingLevel,
void *Context,
void **ReturnValue)
{
ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
ACPI_DB_EXECUTE_WALK *Info = (ACPI_DB_EXECUTE_WALK *) Context;
ACPI_STATUS Status;
if (!ACPI_COMPARE_NAMESEG (Node->Name.Ascii, Info->NameSeg))
{
return (AE_OK);
}
if (Node->Type == ACPI_TYPE_LOCAL_SCOPE)
{
return (AE_OK);
}
/* Now evaluate the input object (node) */
AcpiDbEvaluateObject (Node);
/* Ignore status from method execution */
Status = AE_OK;
/* Update count of executed methods/objects */
Info->Count++;
return (Status);
}
/*******************************************************************************
*
* FUNCTION: AcpiDbEvaluatePredefinedNames
@ -675,3 +769,38 @@ AcpiDbEvaluatePredefinedNames (
AcpiOsPrintf ("Evaluated %u predefined names in the namespace\n", Info.Count);
}
/*******************************************************************************
*
* FUNCTION: AcpiDbEvaluateAll
*
* PARAMETERS: NoneAcpiGbl_DbMethodInfo
*
* RETURN: None
*
* DESCRIPTION: Namespace batch execution. Implements the "ALL" command.
* Execute all namepaths whose final nameseg matches the
* input nameseg.
*
******************************************************************************/
void
AcpiDbEvaluateAll (
char *NameSeg)
{
ACPI_DB_EXECUTE_WALK Info;
Info.Count = 0;
Info.MaxCount = ACPI_UINT32_MAX;
ACPI_COPY_NAMESEG (Info.NameSeg, NameSeg);
Info.NameSeg[ACPI_NAMESEG_SIZE] = 0;
/* Search all nodes in namespace */
(void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
AcpiDbWalkForExecuteAll, NULL, (void *) &Info, NULL);
AcpiOsPrintf ("Evaluated %u names in the namespace\n", Info.Count);
}

View File

@ -494,6 +494,10 @@ AcpiDmUuid (
{
AcpiOsPrintf (" /* %s */", Description);
}
else
{
AcpiOsPrintf (" /* Unknown UUID */");
}
}

View File

@ -744,7 +744,7 @@ AcpiDmIsOptimizationIgnored (
* Only a small subset of ASL/AML operators can be optimized.
* Can only optimize/fold if there is no target (or targets)
* specified for the operator. And of course, the operator
* is surrrounded by a Store() operator.
* is surrounded by a Store() operator.
*/
switch (StoreArgument->Common.AmlOpcode)
{

View File

@ -183,6 +183,7 @@ AcpiEvSystemMemoryRegionSetup (
{
ACPI_OPERAND_OBJECT *RegionDesc = (ACPI_OPERAND_OBJECT *) Handle;
ACPI_MEM_SPACE_CONTEXT *LocalRegionContext;
ACPI_MEM_MAPPING *Mm;
ACPI_FUNCTION_TRACE (EvSystemMemoryRegionSetup);
@ -194,12 +195,14 @@ AcpiEvSystemMemoryRegionSetup (
{
LocalRegionContext = (ACPI_MEM_SPACE_CONTEXT *) *RegionContext;
/* Delete a cached mapping if present */
/* Delete memory mappings if present */
if (LocalRegionContext->MappedLength)
while (LocalRegionContext->FirstMm)
{
AcpiOsUnmapMemory (LocalRegionContext->MappedLogicalAddress,
LocalRegionContext->MappedLength);
Mm = LocalRegionContext->FirstMm;
LocalRegionContext->FirstMm = Mm->NextMm;
AcpiOsUnmapMemory(Mm->LogicalAddress, Mm->Length);
ACPI_FREE(Mm);
}
ACPI_FREE (LocalRegionContext);
*RegionContext = NULL;

View File

@ -188,6 +188,7 @@ AcpiExSystemMemorySpaceHandler (
ACPI_STATUS Status = AE_OK;
void *LogicalAddrPtr = NULL;
ACPI_MEM_SPACE_CONTEXT *MemInfo = RegionContext;
ACPI_MEM_MAPPING *Mm = MemInfo->CurMm;
UINT32 Length;
ACPI_SIZE MapLength;
ACPI_SIZE PageBoundaryMapLength;
@ -247,21 +248,46 @@ AcpiExSystemMemorySpaceHandler (
* Is 1) Address below the current mapping? OR
* 2) Address beyond the current mapping?
*/
if ((Address < MemInfo->MappedPhysicalAddress) ||
(((UINT64) Address + Length) >
((UINT64)
MemInfo->MappedPhysicalAddress + MemInfo->MappedLength)))
if (!Mm || (Address < Mm->PhysicalAddress) ||
((UINT64) Address + Length > (UINT64) Mm->PhysicalAddress + Mm->Length))
{
/*
* The request cannot be resolved by the current memory mapping;
* Delete the existing mapping and create a new one.
* The request cannot be resolved by the current memory mapping.
*
* Look for an existing saved mapping covering the address range
* at hand. If found, save it as the current one and carry out
* the access.
*/
if (MemInfo->MappedLength)
for (Mm = MemInfo->FirstMm; Mm; Mm = Mm->NextMm)
{
/* Valid mapping, delete it */
if (Mm == MemInfo->CurMm)
{
continue;
}
AcpiOsUnmapMemory (MemInfo->MappedLogicalAddress,
MemInfo->MappedLength);
if (Address < Mm->PhysicalAddress)
{
continue;
}
if ((UINT64) Address + Length > (UINT64) Mm->PhysicalAddress + Mm->Length)
{
continue;
}
MemInfo->CurMm = Mm;
goto access;
}
/* Create a new mappings list entry */
Mm = ACPI_ALLOCATE_ZEROED(sizeof(*Mm));
if (!Mm)
{
ACPI_ERROR((AE_INFO,
"Unable to save memory mapping at 0x%8.8X%8.8X, size %u",
ACPI_FORMAT_UINT64(Address), Length));
return_ACPI_STATUS(AE_NO_MEMORY);
}
/*
@ -297,28 +323,38 @@ AcpiExSystemMemorySpaceHandler (
/* Create a new mapping starting at the address given */
MemInfo->MappedLogicalAddress = AcpiOsMapMemory (Address, MapLength);
if (!MemInfo->MappedLogicalAddress)
LogicalAddrPtr = AcpiOsMapMemory(Address, MapLength);
if (!LogicalAddrPtr)
{
ACPI_ERROR ((AE_INFO,
"Could not map memory at 0x%8.8X%8.8X, size %u",
ACPI_FORMAT_UINT64 (Address), (UINT32) MapLength));
MemInfo->MappedLength = 0;
ACPI_FREE(Mm);
return_ACPI_STATUS (AE_NO_MEMORY);
}
/* Save the physical address and mapping size */
MemInfo->MappedPhysicalAddress = Address;
MemInfo->MappedLength = MapLength;
Mm->LogicalAddress = LogicalAddrPtr;
Mm->PhysicalAddress = Address;
Mm->Length = MapLength;
/*
* Add the new entry to the mappigs list and save it as the
* current mapping.
*/
Mm->NextMm = MemInfo->FirstMm;
MemInfo->FirstMm = Mm;
MemInfo->CurMm = Mm;
}
access:
/*
* Generate a logical pointer corresponding to the address we want to
* access
*/
LogicalAddrPtr = MemInfo->MappedLogicalAddress +
((UINT64) Address - (UINT64) MemInfo->MappedPhysicalAddress);
LogicalAddrPtr = Mm->LogicalAddress +
((UINT64) Address - (UINT64) Mm->PhysicalAddress);
ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
"System-Memory (width %u) R/W %u Address=%8.8X%8.8X\n",

View File

@ -481,7 +481,7 @@ AcpiNsDeleteChildren (
NodeToDelete = NextNode;
NextNode = NextNode->Peer;
AcpiNsDeleteNode (NodeToDelete);
};
}
/* Clear the parent's child pointer */

View File

@ -205,7 +205,9 @@ AcpiNsCheckArgumentTypes (
ArgType = METHOD_GET_NEXT_TYPE (ArgTypeList);
UserArgType = Info->Parameters[i]->Common.Type;
if (UserArgType != ArgType)
/* No typechecking for ACPI_TYPE_ANY */
if ((UserArgType != ArgType) && (ArgType != ACPI_TYPE_ANY))
{
ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, ACPI_WARN_ALWAYS,
"Argument #%u type mismatch - "

View File

@ -169,7 +169,8 @@
*
* RETURN: Status
*
* DESCRIPTION: This routine returns the type associatd with a particular handle
* DESCRIPTION: This routine returns the type associated with a particular
* handle
*
******************************************************************************/

View File

@ -662,8 +662,8 @@ AcpiPsParseAml (
}
/*
* If the transfer to the new method method call worked
*, a new walk state was created -- get it
* If the transfer to the new method method call worked,
* a new walk state was created -- get it
*/
WalkState = AcpiDsGetCurrentWalkState (Thread);
continue;

View File

@ -317,7 +317,7 @@ AcpiUtGetArgumentTypes (
static const char *UtExternalTypeNames[] = /* Indexed by ACPI_TYPE_* */
{
", UNSUPPORTED-TYPE",
", Type_ANY",
", Integer",
", String",
", Buffer",
@ -499,7 +499,7 @@ AcpiUtGetArgumentTypes (
{
ThisArgumentType = METHOD_GET_NEXT_TYPE (ArgumentTypes);
if (!ThisArgumentType || (ThisArgumentType > METHOD_MAX_ARG_TYPE))
if (ThisArgumentType > METHOD_MAX_ARG_TYPE)
{
printf ("**** Invalid argument type (%u) "
"in predefined info structure\n", ThisArgumentType);

View File

@ -207,10 +207,16 @@ AcpiUtConvertOctalString (
while (*String)
{
/* Character must be ASCII 0-7, otherwise terminate with no error */
/*
* Character must be ASCII 0-7, otherwise:
* 1) Runtime: terminate with no error, per the ACPI spec
* 2) Compiler: return an error
*/
if (!(ACPI_IS_OCTAL_DIGIT (*String)))
{
#ifdef ACPI_ASL_COMPILER
Status = AE_BAD_OCTAL_CONSTANT;
#endif
break;
}
@ -263,10 +269,16 @@ AcpiUtConvertDecimalString (
while (*String)
{
/* Character must be ASCII 0-9, otherwise terminate with no error */
/*
* Character must be ASCII 0-9, otherwise:
* 1) Runtime: terminate with no error, per the ACPI spec
* 2) Compiler: return an error
*/
if (!isdigit (*String))
{
#ifdef ACPI_ASL_COMPILER
Status = AE_BAD_DECIMAL_CONSTANT;
#endif
break;
}
@ -319,10 +331,16 @@ AcpiUtConvertHexString (
while (*String)
{
/* Must be ASCII A-F, a-f, or 0-9, otherwise terminate with no error */
/*
* Character must be ASCII A-F, a-f, or 0-9, otherwise:
* 1) Runtime: terminate with no error, per the ACPI spec
* 2) Compiler: return an error
*/
if (!isxdigit (*String))
{
#ifdef ACPI_ASL_COMPILER
Status = AE_BAD_HEX_CONSTANT;
#endif
break;
}

View File

@ -266,7 +266,7 @@
*
*****************************************************************************/
/* Method info (in WALK_STATE), containing local variables and argumetns */
/* Method info (in WALK_STATE), containing local variables and arguments */
#define ACPI_METHOD_NUM_LOCALS 8
#define ACPI_METHOD_MAX_LOCAL 7

View File

@ -187,6 +187,7 @@ typedef struct acpi_db_execute_walk
{
UINT32 Count;
UINT32 MaxCount;
char NameSeg[ACPI_NAMESEG_SIZE + 1];
} ACPI_DB_EXECUTE_WALK;
@ -195,6 +196,7 @@ typedef struct acpi_db_execute_walk
#define EX_NO_SINGLE_STEP 1
#define EX_SINGLE_STEP 2
#define EX_ALL 4
/*
@ -345,6 +347,10 @@ void
AcpiDbEvaluatePredefinedNames (
void);
void
AcpiDbEvaluateAll (
char *NameSeg);
/*
* dbnames - namespace commands

View File

@ -184,12 +184,12 @@ typedef struct acpi_exception_info
{
char *Name;
#ifdef ACPI_HELP_APP
#if defined (ACPI_HELP_APP) || defined (ACPI_ASL_COMPILER)
char *Description;
#endif
} ACPI_EXCEPTION_INFO;
#ifdef ACPI_HELP_APP
#if defined (ACPI_HELP_APP) || defined (ACPI_ASL_COMPILER)
#define EXCEP_TXT(Name,Description) {Name, Description}
#else
#define EXCEP_TXT(Name,Description) {Name}

View File

@ -154,7 +154,7 @@
/* Current ACPICA subsystem version in YYYYMMDD format */
#define ACPI_CA_VERSION 0x20200717
#define ACPI_CA_VERSION 0x20200925
#include <contrib/dev/acpica/include/acconfig.h>
#include <contrib/dev/acpica/include/actypes.h>

View File

@ -246,7 +246,7 @@ enum AcpiReturnPackageTypes
/* Support macros for users of the predefined info table */
#define METHOD_PREDEF_ARGS_MAX 4
#define METHOD_PREDEF_ARGS_MAX 5
#define METHOD_ARG_BIT_WIDTH 3
#define METHOD_ARG_MASK 0x0007
#define ARG_COUNT_IS_MINIMUM 0x8000
@ -262,6 +262,7 @@ enum AcpiReturnPackageTypes
#define METHOD_2ARGS(a1,a2) (2 | (a1 << 3) | (a2 << 6))
#define METHOD_3ARGS(a1,a2,a3) (3 | (a1 << 3) | (a2 << 6) | (a3 << 9))
#define METHOD_4ARGS(a1,a2,a3,a4) (4 | (a1 << 3) | (a2 << 6) | (a3 << 9) | (a4 << 12))
#define METHOD_5ARGS(a1,a2,a3,a4,a5) (5 | (a1 << 3) | (a2 << 6) | (a3 << 9) | (a4 << 12) | (a5 << 15))
#define METHOD_RETURNS(type) (type)
#define METHOD_NO_RETURN_VALUE 0
@ -1023,9 +1024,29 @@ const ACPI_PREDEFINED_INFO AcpiGbl_PredefinedMethods[] =
{{"_S4W", METHOD_0ARGS,
METHOD_RETURNS (ACPI_RTYPE_INTEGER)}},
{{"_SBA", METHOD_0ARGS,
METHOD_RETURNS (ACPI_RTYPE_PACKAGE)}}, /* Fixed-length (4 Int) */
PACKAGE_INFO (ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 4,0,0,0),
{{"_SBI", METHOD_0ARGS,
METHOD_RETURNS (ACPI_RTYPE_PACKAGE)}}, /* Fixed-length (1 Int, 1 Buf) */
PACKAGE_INFO (ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 1, ACPI_RTYPE_BUFFER,1,0),
{{"_SBR", METHOD_3ARGS (ACPI_TYPE_INTEGER, ACPI_TYPE_INTEGER, ACPI_TYPE_INTEGER),
METHOD_RETURNS (ACPI_RTYPE_PACKAGE)}}, /* Fixed-length (2 Int) */
PACKAGE_INFO (ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 2, ACPI_RTYPE_BUFFER | ACPI_RTYPE_INTEGER, 1,0),
{{"_SBS", METHOD_0ARGS,
METHOD_RETURNS (ACPI_RTYPE_INTEGER)}},
{{"_SBT", METHOD_4ARGS (ACPI_TYPE_INTEGER, ACPI_TYPE_INTEGER, ACPI_TYPE_INTEGER, ACPI_TYPE_ANY),
METHOD_RETURNS (ACPI_RTYPE_PACKAGE)}}, /* Fixed-length (2 Int, 1 Buf | Int) */
PACKAGE_INFO (ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 2, ACPI_RTYPE_BUFFER | ACPI_RTYPE_INTEGER, 1,0),
{{"_SBW", METHOD_5ARGS (ACPI_TYPE_INTEGER, ACPI_TYPE_INTEGER, ACPI_TYPE_INTEGER, ACPI_TYPE_INTEGER, ACPI_TYPE_ANY),
METHOD_RETURNS (ACPI_RTYPE_PACKAGE)}},
PACKAGE_INFO (ACPI_PTYPE1_FIXED, ACPI_RTYPE_BUFFER | ACPI_RTYPE_INTEGER, 1, 0,0,0),
{{"_SCP", METHOD_1ARGS (ACPI_TYPE_INTEGER) | ARG_COUNT_IS_MINIMUM,
METHOD_NO_RETURN_VALUE}}, /* Acpi 1.0 allowed 1 integer arg. Acpi 3.0 expanded to 3 args. Allow both. */

View File

@ -1767,8 +1767,7 @@ typedef struct acpi_hest_ia_deferred_check
/*******************************************************************************
*
* HMAT - Heterogeneous Memory Attributes Table (ACPI 6.2)
* Version 1
* HMAT - Heterogeneous Memory Attributes Table (ACPI 6.3)
*
******************************************************************************/
@ -1810,7 +1809,7 @@ typedef struct acpi_hmat_proximity_domain
ACPI_HMAT_STRUCTURE Header;
UINT16 Flags;
UINT16 Reserved1;
UINT32 ProcessorPD; /* Processor proximity domain */
UINT32 InitiatorPD; /* Attached Initiator proximity domain */
UINT32 MemoryPD; /* Memory proximity domain */
UINT32 Reserved2;
UINT64 Reserved3;
@ -1820,9 +1819,7 @@ typedef struct acpi_hmat_proximity_domain
/* Masks for Flags field above */
#define ACPI_HMAT_PROCESSOR_PD_VALID (1) /* 1: ProcessorPD field is valid */
#define ACPI_HMAT_MEMORY_PD_VALID (1<<1) /* 1: MemoryPD field is valid */
#define ACPI_HMAT_RESERVATION_HINT (1<<2) /* 1: Reservation hint */
#define ACPI_HMAT_INITIATOR_PD_VALID (1) /* 1: InitiatorPD field is valid */
/* 1: System locality latency and bandwidth information */
@ -1847,10 +1844,9 @@ typedef struct acpi_hmat_locality
/* Values for Memory Hierarchy flag */
#define ACPI_HMAT_MEMORY 0
#define ACPI_HMAT_LAST_LEVEL_CACHE 1
#define ACPI_HMAT_1ST_LEVEL_CACHE 2
#define ACPI_HMAT_2ND_LEVEL_CACHE 3
#define ACPI_HMAT_3RD_LEVEL_CACHE 4
#define ACPI_HMAT_1ST_LEVEL_CACHE 1
#define ACPI_HMAT_2ND_LEVEL_CACHE 2
#define ACPI_HMAT_3RD_LEVEL_CACHE 3
/* Values for DataType field above */

View File

@ -977,7 +977,7 @@ typedef UINT8 ACPI_ADR_SPACE_TYPE;
*
* Note: A Data Table region is a special type of operation region
* that has its own AML opcode. However, internally, the AML
* interpreter simply creates an operation region with an an address
* interpreter simply creates an operation region with an address
* space type of ACPI_ADR_SPACE_DATA_TABLE.
*/
#define ACPI_ADR_SPACE_DATA_TABLE (ACPI_ADR_SPACE_TYPE) 0x7E /* Internal to ACPICA only */
@ -1440,13 +1440,21 @@ typedef struct acpi_pci_id
} ACPI_PCI_ID;
typedef struct acpi_mem_mapping
{
ACPI_PHYSICAL_ADDRESS PhysicalAddress;
UINT8 *LogicalAddress;
ACPI_SIZE Length;
struct acpi_mem_mapping *NextMm;
} ACPI_MEM_MAPPING;
typedef struct acpi_mem_space_context
{
UINT32 Length;
ACPI_PHYSICAL_ADDRESS Address;
ACPI_PHYSICAL_ADDRESS MappedPhysicalAddress;
UINT8 *MappedLogicalAddress;
ACPI_SIZE MappedLength;
ACPI_MEM_MAPPING *CurMm;
ACPI_MEM_MAPPING *FirstMm;
} ACPI_MEM_SPACE_CONTEXT;

View File

@ -169,6 +169,10 @@
#define UUID_PCI_HOST_BRIDGE "33db4d5b-1ff7-401c-9657-7441c03dd766"
#define UUID_I2C_DEVICE "3cdff6f7-4267-4555-ad05-b30a3d8938de"
#define UUID_POWER_BUTTON "dfbcf3c5-e7a5-44e6-9c1f-29c76f6e059c"
#define UUID_MEMORY_DEVICE "03b19910-f473-11dd-87af-0800200c9a66"
#define UUID_GENERIC_BUTTONS_DEVICE "fa6bd625-9ce8-470d-a2c7-b3ca36c4282e"
#define UUID_NVDIMM_ROOT_DEVICE "2f10e7a4-9e91-11e4-89d3-123b93f75cba"
#define UUID_CONTROL_METHOD_BATTERY "f18fc78b-0f15-4978-b793-53f833a1d35b"
/* Interfaces */
@ -198,6 +202,8 @@
#define UUID_BATTERY_THERMAL_LIMIT "4c2067e3-887d-475c-9720-4af1d3ed602e"
#define UUID_THERMAL_EXTENSIONS "14d399cd-7a27-4b18-8fb4-7cb7b9f4e500"
#define UUID_DEVICE_PROPERTIES "daffd814-6eba-4d8c-8a91-bc9bbf4aa301"
#define UUID_DEVICE_GRAPHS "ab02a46b-74c7-45a2-bd68-f7d344ef2153"
#define UUID_HIERARCHICAL_DATA_EXTENSION "dbb8e3e6-5886-4ba6-8795-1319f52a966b"
#define UUID_CORESIGHT_GRAPH "3ecbc8b6-1d0e-4fb3-8107-e627f805c6cd"
#endif /* __ACUUID_H__ */