Message ID | 20201008164510.198150-2-colin.king@canonical.com |
---|---|
State | Accepted |
Headers | show |
Series | ACPICA: Update to version 20201008 | expand |
On 2020-10-08 10:45 a.m., Colin King wrote: > From: Colin Ian King <colin.king@canonical.com> > > Changes in this release of ACPICA are detailed at the following > link on the ACPICA developer mailing list: > > https://lists.acpica.org/hyperkitty/list/devel@acpica.org/thread/JTW2JORTHXTV7NG5FE2C4WD3OL35NZS2/ > > Signed-off-by: Colin Ian King <colin.king@canonical.com> > --- > src/acpica/source/common/ahpredef.c | 5 + > src/acpica/source/common/ahuuids.c | 8 +- > src/acpica/source/common/dmtbinfo1.c | 2 +- > src/acpica/source/compiler/aslcompiler.l | 6 +- > src/acpica/source/compiler/aslload.c | 9 +- > src/acpica/source/compiler/aslmessages.c | 3 + > src/acpica/source/compiler/aslmessages.h | 3 + > src/acpica/source/compiler/aslparseop.c | 26 +++ > src/acpica/source/compiler/aslprepkg.c | 17 +- > src/acpica/source/compiler/aslutils.c | 8 +- > src/acpica/source/compiler/aslxref.c | 11 +- > .../source/components/debugger/dbexec.c | 42 +++- > .../source/components/debugger/dbinput.c | 12 +- > .../source/components/debugger/dbmethod.c | 183 +++++++++++++++--- > .../source/components/disassembler/dmbuffer.c | 4 + > .../source/components/disassembler/dmcstyle.c | 2 +- > .../source/components/events/evrgnini.c | 11 +- > .../source/components/executer/exregion.c | 70 +++++-- > .../source/components/namespace/nsalloc.c | 2 +- > .../source/components/namespace/nsarguments.c | 4 +- > .../source/components/namespace/nsxfobj.c | 3 +- > src/acpica/source/components/parser/psparse.c | 4 +- > .../source/components/utilities/utpredef.c | 4 +- > .../source/components/utilities/utstrsuppt.c | 30 ++- > src/acpica/source/include/acconfig.h | 2 +- > src/acpica/source/include/acdebug.h | 6 + > src/acpica/source/include/acexcep.h | 4 +- > src/acpica/source/include/acpixf.h | 2 +- > src/acpica/source/include/acpredef.h | 23 ++- > src/acpica/source/include/actbl1.h | 16 +- > src/acpica/source/include/actypes.h | 16 +- > src/acpica/source/include/acuuid.h | 8 +- > src/acpica/source/include/platform/aclinux.h | 3 +- > 33 files changed, 442 insertions(+), 107 deletions(-) > > diff --git a/src/acpica/source/common/ahpredef.c b/src/acpica/source/common/ahpredef.c > index be1b37ab..182a83ad 100644 > --- a/src/acpica/source/common/ahpredef.c > +++ b/src/acpica/source/common/ahpredef.c > @@ -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"), > diff --git a/src/acpica/source/common/ahuuids.c b/src/acpica/source/common/ahuuids.c > index 64d45e3f..3c14b10e 100644 > --- a/src/acpica/source/common/ahuuids.c > +++ b/src/acpica/source/common/ahuuids.c > @@ -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} > }; > > diff --git a/src/acpica/source/common/dmtbinfo1.c b/src/acpica/source/common/dmtbinfo1.c > index 9661f495..750e29d5 100644 > --- a/src/acpica/source/common/dmtbinfo1.c > +++ b/src/acpica/source/common/dmtbinfo1.c > @@ -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}, > diff --git a/src/acpica/source/compiler/aslcompiler.l b/src/acpica/source/compiler/aslcompiler.l > index 4016faed..8e448fb7 100644 > --- a/src/acpica/source/compiler/aslcompiler.l > +++ b/src/acpica/source/compiler/aslcompiler.l > @@ -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); > diff --git a/src/acpica/source/compiler/aslload.c b/src/acpica/source/compiler/aslload.c > index 454fa8f5..c9fae99a 100644 > --- a/src/acpica/source/compiler/aslload.c > +++ b/src/acpica/source/compiler/aslload.c > @@ -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); > diff --git a/src/acpica/source/compiler/aslmessages.c b/src/acpica/source/compiler/aslmessages.c > index eb344940..320ad2ae 100644 > --- a/src/acpica/source/compiler/aslmessages.c > +++ b/src/acpica/source/compiler/aslmessages.c > @@ -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 */ > diff --git a/src/acpica/source/compiler/aslmessages.h b/src/acpica/source/compiler/aslmessages.h > index 9a7215c6..8a2b5c6c 100644 > --- a/src/acpica/source/compiler/aslmessages.h > +++ b/src/acpica/source/compiler/aslmessages.h > @@ -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 */ > diff --git a/src/acpica/source/compiler/aslparseop.c b/src/acpica/source/compiler/aslparseop.c > index 46875413..51ef9b8c 100644 > --- a/src/acpica/source/compiler/aslparseop.c > +++ b/src/acpica/source/compiler/aslparseop.c > @@ -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; > > diff --git a/src/acpica/source/compiler/aslprepkg.c b/src/acpica/source/compiler/aslprepkg.c > index f3042cae..35b947c8 100644 > --- a/src/acpica/source/compiler/aslprepkg.c > +++ b/src/acpica/source/compiler/aslprepkg.c > @@ -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); > diff --git a/src/acpica/source/compiler/aslutils.c b/src/acpica/source/compiler/aslutils.c > index 42ef2c0b..16fad627 100644 > --- a/src/acpica/source/compiler/aslutils.c > +++ b/src/acpica/source/compiler/aslutils.c > @@ -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, > diff --git a/src/acpica/source/compiler/aslxref.c b/src/acpica/source/compiler/aslxref.c > index 9306af20..163799a8 100644 > --- a/src/acpica/source/compiler/aslxref.c > +++ b/src/acpica/source/compiler/aslxref.c > @@ -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 */ > diff --git a/src/acpica/source/components/debugger/dbexec.c b/src/acpica/source/components/debugger/dbexec.c > index f4b024e2..5fd05f5a 100644 > --- a/src/acpica/source/components/debugger/dbexec.c > +++ b/src/acpica/source/components/debugger/dbexec.c > @@ -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 */ > > diff --git a/src/acpica/source/components/debugger/dbinput.c b/src/acpica/source/components/debugger/dbinput.c > index 378e3db1..0cc97310 100644 > --- a/src/acpica/source/components/debugger/dbinput.c > +++ b/src/acpica/source/components/debugger/dbinput.c > @@ -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 > diff --git a/src/acpica/source/components/debugger/dbmethod.c b/src/acpica/source/components/debugger/dbmethod.c > index a7b6911a..d259a3ef 100644 > --- a/src/acpica/source/components/debugger/dbmethod.c > +++ b/src/acpica/source/components/debugger/dbmethod.c > @@ -170,6 +170,10 @@ AcpiDbWalkForExecute ( > void *Context, > void **ReturnValue); > > +static ACPI_STATUS > +AcpiDbEvaluateObject ( > + ACPI_NAMESPACE_NODE *Node); > + > > /******************************************************************************* > * > @@ -542,46 +546,29 @@ 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; > - > - > - Predefined = AcpiUtMatchPredefinedMethod (Node->Name.Ascii); > - if (!Predefined) > - { > - return (AE_OK); > - } > + ACPI_BUFFER ReturnObj; > + ACPI_STATUS Status; > > - 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); > +} > diff --git a/src/acpica/source/components/disassembler/dmbuffer.c b/src/acpica/source/components/disassembler/dmbuffer.c > index 47279a2c..810f727f 100644 > --- a/src/acpica/source/components/disassembler/dmbuffer.c > +++ b/src/acpica/source/components/disassembler/dmbuffer.c > @@ -494,6 +494,10 @@ AcpiDmUuid ( > { > AcpiOsPrintf (" /* %s */", Description); > } > + else > + { > + AcpiOsPrintf (" /* Unknown UUID */"); > + } > } > > > diff --git a/src/acpica/source/components/disassembler/dmcstyle.c b/src/acpica/source/components/disassembler/dmcstyle.c > index 4fcc5e6d..c8541aaf 100644 > --- a/src/acpica/source/components/disassembler/dmcstyle.c > +++ b/src/acpica/source/components/disassembler/dmcstyle.c > @@ -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) > { > diff --git a/src/acpica/source/components/events/evrgnini.c b/src/acpica/source/components/events/evrgnini.c > index 54f91a36..a58765e3 100644 > --- a/src/acpica/source/components/events/evrgnini.c > +++ b/src/acpica/source/components/events/evrgnini.c > @@ -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; > diff --git a/src/acpica/source/components/executer/exregion.c b/src/acpica/source/components/executer/exregion.c > index 920aa1e3..0985e7a5 100644 > --- a/src/acpica/source/components/executer/exregion.c > +++ b/src/acpica/source/components/executer/exregion.c > @@ -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; > + } > + > + if (Address < Mm->PhysicalAddress) > + { > + continue; > + } > + > + if ((UINT64) Address + Length > (UINT64) Mm->PhysicalAddress + Mm->Length) > + { > + continue; > + } > + > + MemInfo->CurMm = Mm; > + goto access; > + } > > - AcpiOsUnmapMemory (MemInfo->MappedLogicalAddress, > - MemInfo->MappedLength); > + /* 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", > diff --git a/src/acpica/source/components/namespace/nsalloc.c b/src/acpica/source/components/namespace/nsalloc.c > index 6610c7f3..e7564871 100644 > --- a/src/acpica/source/components/namespace/nsalloc.c > +++ b/src/acpica/source/components/namespace/nsalloc.c > @@ -481,7 +481,7 @@ AcpiNsDeleteChildren ( > NodeToDelete = NextNode; > NextNode = NextNode->Peer; > AcpiNsDeleteNode (NodeToDelete); > - }; > + } > > /* Clear the parent's child pointer */ > > diff --git a/src/acpica/source/components/namespace/nsarguments.c b/src/acpica/source/components/namespace/nsarguments.c > index 2e2828dd..1a2d1099 100644 > --- a/src/acpica/source/components/namespace/nsarguments.c > +++ b/src/acpica/source/components/namespace/nsarguments.c > @@ -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 - " > diff --git a/src/acpica/source/components/namespace/nsxfobj.c b/src/acpica/source/components/namespace/nsxfobj.c > index 68e64033..de793323 100644 > --- a/src/acpica/source/components/namespace/nsxfobj.c > +++ b/src/acpica/source/components/namespace/nsxfobj.c > @@ -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 > * > ******************************************************************************/ > > diff --git a/src/acpica/source/components/parser/psparse.c b/src/acpica/source/components/parser/psparse.c > index 729c929e..d935ebc2 100644 > --- a/src/acpica/source/components/parser/psparse.c > +++ b/src/acpica/source/components/parser/psparse.c > @@ -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; > diff --git a/src/acpica/source/components/utilities/utpredef.c b/src/acpica/source/components/utilities/utpredef.c > index 05708ab5..d6d98d0f 100644 > --- a/src/acpica/source/components/utilities/utpredef.c > +++ b/src/acpica/source/components/utilities/utpredef.c > @@ -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); > diff --git a/src/acpica/source/components/utilities/utstrsuppt.c b/src/acpica/source/components/utilities/utstrsuppt.c > index f0805ccf..153b56e8 100644 > --- a/src/acpica/source/components/utilities/utstrsuppt.c > +++ b/src/acpica/source/components/utilities/utstrsuppt.c > @@ -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; > } > > diff --git a/src/acpica/source/include/acconfig.h b/src/acpica/source/include/acconfig.h > index 2c50ddc4..d717aa52 100644 > --- a/src/acpica/source/include/acconfig.h > +++ b/src/acpica/source/include/acconfig.h > @@ -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 > diff --git a/src/acpica/source/include/acdebug.h b/src/acpica/source/include/acdebug.h > index 5012d35d..41f87320 100644 > --- a/src/acpica/source/include/acdebug.h > +++ b/src/acpica/source/include/acdebug.h > @@ -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 > diff --git a/src/acpica/source/include/acexcep.h b/src/acpica/source/include/acexcep.h > index 90b369a1..11c81398 100644 > --- a/src/acpica/source/include/acexcep.h > +++ b/src/acpica/source/include/acexcep.h > @@ -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} > diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h > index c1b55401..a16b6830 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 0x20200717 > +#define ACPI_CA_VERSION 0x20200925 > > #include "acconfig.h" > #include "actypes.h" > diff --git a/src/acpica/source/include/acpredef.h b/src/acpica/source/include/acpredef.h > index 924d7b90..2564fa55 100644 > --- a/src/acpica/source/include/acpredef.h > +++ b/src/acpica/source/include/acpredef.h > @@ -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. */ > > diff --git a/src/acpica/source/include/actbl1.h b/src/acpica/source/include/actbl1.h > index 1f0d5c2f..47e5f059 100644 > --- a/src/acpica/source/include/actbl1.h > +++ b/src/acpica/source/include/actbl1.h > @@ -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 */ > > diff --git a/src/acpica/source/include/actypes.h b/src/acpica/source/include/actypes.h > index 0ec14a36..48388c21 100644 > --- a/src/acpica/source/include/actypes.h > +++ b/src/acpica/source/include/actypes.h > @@ -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; > > diff --git a/src/acpica/source/include/acuuid.h b/src/acpica/source/include/acuuid.h > index b856219c..468244a6 100644 > --- a/src/acpica/source/include/acuuid.h > +++ b/src/acpica/source/include/acuuid.h > @@ -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__ */ > diff --git a/src/acpica/source/include/platform/aclinux.h b/src/acpica/source/include/platform/aclinux.h > index aee2e85a..ff859c49 100644 > --- a/src/acpica/source/include/platform/aclinux.h > +++ b/src/acpica/source/include/platform/aclinux.h > @@ -324,7 +324,8 @@ > > #if defined(__ia64__) || (defined(__x86_64__) && !defined(__ILP32__)) ||\ > defined(__aarch64__) || defined(__PPC64__) ||\ > - defined(__s390x__) || (defined(__riscv) && (__INTPTR_WIDTH__ == 64)) > + defined(__s390x__) ||\ > + (defined(__riscv) && (defined(__LP64__) || defined(_LP64))) > #define ACPI_MACHINE_WIDTH 64 > #define COMPILER_DEPENDENT_INT64 long > #define COMPILER_DEPENDENT_UINT64 unsigned long > Acked-by: Alex Hung <alex.hung@canonical.com>
On 10/9/20 12:45 AM, Colin King wrote: > From: Colin Ian King <colin.king@canonical.com> > > Changes in this release of ACPICA are detailed at the following > link on the ACPICA developer mailing list: > > https://lists.acpica.org/hyperkitty/list/devel@acpica.org/thread/JTW2JORTHXTV7NG5FE2C4WD3OL35NZS2/ > > Signed-off-by: Colin Ian King <colin.king@canonical.com> > --- > src/acpica/source/common/ahpredef.c | 5 + > src/acpica/source/common/ahuuids.c | 8 +- > src/acpica/source/common/dmtbinfo1.c | 2 +- > src/acpica/source/compiler/aslcompiler.l | 6 +- > src/acpica/source/compiler/aslload.c | 9 +- > src/acpica/source/compiler/aslmessages.c | 3 + > src/acpica/source/compiler/aslmessages.h | 3 + > src/acpica/source/compiler/aslparseop.c | 26 +++ > src/acpica/source/compiler/aslprepkg.c | 17 +- > src/acpica/source/compiler/aslutils.c | 8 +- > src/acpica/source/compiler/aslxref.c | 11 +- > .../source/components/debugger/dbexec.c | 42 +++- > .../source/components/debugger/dbinput.c | 12 +- > .../source/components/debugger/dbmethod.c | 183 +++++++++++++++--- > .../source/components/disassembler/dmbuffer.c | 4 + > .../source/components/disassembler/dmcstyle.c | 2 +- > .../source/components/events/evrgnini.c | 11 +- > .../source/components/executer/exregion.c | 70 +++++-- > .../source/components/namespace/nsalloc.c | 2 +- > .../source/components/namespace/nsarguments.c | 4 +- > .../source/components/namespace/nsxfobj.c | 3 +- > src/acpica/source/components/parser/psparse.c | 4 +- > .../source/components/utilities/utpredef.c | 4 +- > .../source/components/utilities/utstrsuppt.c | 30 ++- > src/acpica/source/include/acconfig.h | 2 +- > src/acpica/source/include/acdebug.h | 6 + > src/acpica/source/include/acexcep.h | 4 +- > src/acpica/source/include/acpixf.h | 2 +- > src/acpica/source/include/acpredef.h | 23 ++- > src/acpica/source/include/actbl1.h | 16 +- > src/acpica/source/include/actypes.h | 16 +- > src/acpica/source/include/acuuid.h | 8 +- > src/acpica/source/include/platform/aclinux.h | 3 +- > 33 files changed, 442 insertions(+), 107 deletions(-) > > diff --git a/src/acpica/source/common/ahpredef.c b/src/acpica/source/common/ahpredef.c > index be1b37ab..182a83ad 100644 > --- a/src/acpica/source/common/ahpredef.c > +++ b/src/acpica/source/common/ahpredef.c > @@ -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"), > diff --git a/src/acpica/source/common/ahuuids.c b/src/acpica/source/common/ahuuids.c > index 64d45e3f..3c14b10e 100644 > --- a/src/acpica/source/common/ahuuids.c > +++ b/src/acpica/source/common/ahuuids.c > @@ -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} > }; > > diff --git a/src/acpica/source/common/dmtbinfo1.c b/src/acpica/source/common/dmtbinfo1.c > index 9661f495..750e29d5 100644 > --- a/src/acpica/source/common/dmtbinfo1.c > +++ b/src/acpica/source/common/dmtbinfo1.c > @@ -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}, > diff --git a/src/acpica/source/compiler/aslcompiler.l b/src/acpica/source/compiler/aslcompiler.l > index 4016faed..8e448fb7 100644 > --- a/src/acpica/source/compiler/aslcompiler.l > +++ b/src/acpica/source/compiler/aslcompiler.l > @@ -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); > diff --git a/src/acpica/source/compiler/aslload.c b/src/acpica/source/compiler/aslload.c > index 454fa8f5..c9fae99a 100644 > --- a/src/acpica/source/compiler/aslload.c > +++ b/src/acpica/source/compiler/aslload.c > @@ -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); > diff --git a/src/acpica/source/compiler/aslmessages.c b/src/acpica/source/compiler/aslmessages.c > index eb344940..320ad2ae 100644 > --- a/src/acpica/source/compiler/aslmessages.c > +++ b/src/acpica/source/compiler/aslmessages.c > @@ -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 */ > diff --git a/src/acpica/source/compiler/aslmessages.h b/src/acpica/source/compiler/aslmessages.h > index 9a7215c6..8a2b5c6c 100644 > --- a/src/acpica/source/compiler/aslmessages.h > +++ b/src/acpica/source/compiler/aslmessages.h > @@ -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 */ > diff --git a/src/acpica/source/compiler/aslparseop.c b/src/acpica/source/compiler/aslparseop.c > index 46875413..51ef9b8c 100644 > --- a/src/acpica/source/compiler/aslparseop.c > +++ b/src/acpica/source/compiler/aslparseop.c > @@ -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; > > diff --git a/src/acpica/source/compiler/aslprepkg.c b/src/acpica/source/compiler/aslprepkg.c > index f3042cae..35b947c8 100644 > --- a/src/acpica/source/compiler/aslprepkg.c > +++ b/src/acpica/source/compiler/aslprepkg.c > @@ -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); > diff --git a/src/acpica/source/compiler/aslutils.c b/src/acpica/source/compiler/aslutils.c > index 42ef2c0b..16fad627 100644 > --- a/src/acpica/source/compiler/aslutils.c > +++ b/src/acpica/source/compiler/aslutils.c > @@ -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, > diff --git a/src/acpica/source/compiler/aslxref.c b/src/acpica/source/compiler/aslxref.c > index 9306af20..163799a8 100644 > --- a/src/acpica/source/compiler/aslxref.c > +++ b/src/acpica/source/compiler/aslxref.c > @@ -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 */ > diff --git a/src/acpica/source/components/debugger/dbexec.c b/src/acpica/source/components/debugger/dbexec.c > index f4b024e2..5fd05f5a 100644 > --- a/src/acpica/source/components/debugger/dbexec.c > +++ b/src/acpica/source/components/debugger/dbexec.c > @@ -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 */ > > diff --git a/src/acpica/source/components/debugger/dbinput.c b/src/acpica/source/components/debugger/dbinput.c > index 378e3db1..0cc97310 100644 > --- a/src/acpica/source/components/debugger/dbinput.c > +++ b/src/acpica/source/components/debugger/dbinput.c > @@ -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 > diff --git a/src/acpica/source/components/debugger/dbmethod.c b/src/acpica/source/components/debugger/dbmethod.c > index a7b6911a..d259a3ef 100644 > --- a/src/acpica/source/components/debugger/dbmethod.c > +++ b/src/acpica/source/components/debugger/dbmethod.c > @@ -170,6 +170,10 @@ AcpiDbWalkForExecute ( > void *Context, > void **ReturnValue); > > +static ACPI_STATUS > +AcpiDbEvaluateObject ( > + ACPI_NAMESPACE_NODE *Node); > + > > /******************************************************************************* > * > @@ -542,46 +546,29 @@ 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; > - > - > - Predefined = AcpiUtMatchPredefinedMethod (Node->Name.Ascii); > - if (!Predefined) > - { > - return (AE_OK); > - } > + ACPI_BUFFER ReturnObj; > + ACPI_STATUS Status; > > - 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); > +} > diff --git a/src/acpica/source/components/disassembler/dmbuffer.c b/src/acpica/source/components/disassembler/dmbuffer.c > index 47279a2c..810f727f 100644 > --- a/src/acpica/source/components/disassembler/dmbuffer.c > +++ b/src/acpica/source/components/disassembler/dmbuffer.c > @@ -494,6 +494,10 @@ AcpiDmUuid ( > { > AcpiOsPrintf (" /* %s */", Description); > } > + else > + { > + AcpiOsPrintf (" /* Unknown UUID */"); > + } > } > > > diff --git a/src/acpica/source/components/disassembler/dmcstyle.c b/src/acpica/source/components/disassembler/dmcstyle.c > index 4fcc5e6d..c8541aaf 100644 > --- a/src/acpica/source/components/disassembler/dmcstyle.c > +++ b/src/acpica/source/components/disassembler/dmcstyle.c > @@ -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) > { > diff --git a/src/acpica/source/components/events/evrgnini.c b/src/acpica/source/components/events/evrgnini.c > index 54f91a36..a58765e3 100644 > --- a/src/acpica/source/components/events/evrgnini.c > +++ b/src/acpica/source/components/events/evrgnini.c > @@ -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; > diff --git a/src/acpica/source/components/executer/exregion.c b/src/acpica/source/components/executer/exregion.c > index 920aa1e3..0985e7a5 100644 > --- a/src/acpica/source/components/executer/exregion.c > +++ b/src/acpica/source/components/executer/exregion.c > @@ -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; > + } > + > + if (Address < Mm->PhysicalAddress) > + { > + continue; > + } > + > + if ((UINT64) Address + Length > (UINT64) Mm->PhysicalAddress + Mm->Length) > + { > + continue; > + } > + > + MemInfo->CurMm = Mm; > + goto access; > + } > > - AcpiOsUnmapMemory (MemInfo->MappedLogicalAddress, > - MemInfo->MappedLength); > + /* 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", > diff --git a/src/acpica/source/components/namespace/nsalloc.c b/src/acpica/source/components/namespace/nsalloc.c > index 6610c7f3..e7564871 100644 > --- a/src/acpica/source/components/namespace/nsalloc.c > +++ b/src/acpica/source/components/namespace/nsalloc.c > @@ -481,7 +481,7 @@ AcpiNsDeleteChildren ( > NodeToDelete = NextNode; > NextNode = NextNode->Peer; > AcpiNsDeleteNode (NodeToDelete); > - }; > + } > > /* Clear the parent's child pointer */ > > diff --git a/src/acpica/source/components/namespace/nsarguments.c b/src/acpica/source/components/namespace/nsarguments.c > index 2e2828dd..1a2d1099 100644 > --- a/src/acpica/source/components/namespace/nsarguments.c > +++ b/src/acpica/source/components/namespace/nsarguments.c > @@ -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 - " > diff --git a/src/acpica/source/components/namespace/nsxfobj.c b/src/acpica/source/components/namespace/nsxfobj.c > index 68e64033..de793323 100644 > --- a/src/acpica/source/components/namespace/nsxfobj.c > +++ b/src/acpica/source/components/namespace/nsxfobj.c > @@ -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 > * > ******************************************************************************/ > > diff --git a/src/acpica/source/components/parser/psparse.c b/src/acpica/source/components/parser/psparse.c > index 729c929e..d935ebc2 100644 > --- a/src/acpica/source/components/parser/psparse.c > +++ b/src/acpica/source/components/parser/psparse.c > @@ -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; > diff --git a/src/acpica/source/components/utilities/utpredef.c b/src/acpica/source/components/utilities/utpredef.c > index 05708ab5..d6d98d0f 100644 > --- a/src/acpica/source/components/utilities/utpredef.c > +++ b/src/acpica/source/components/utilities/utpredef.c > @@ -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); > diff --git a/src/acpica/source/components/utilities/utstrsuppt.c b/src/acpica/source/components/utilities/utstrsuppt.c > index f0805ccf..153b56e8 100644 > --- a/src/acpica/source/components/utilities/utstrsuppt.c > +++ b/src/acpica/source/components/utilities/utstrsuppt.c > @@ -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; > } > > diff --git a/src/acpica/source/include/acconfig.h b/src/acpica/source/include/acconfig.h > index 2c50ddc4..d717aa52 100644 > --- a/src/acpica/source/include/acconfig.h > +++ b/src/acpica/source/include/acconfig.h > @@ -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 > diff --git a/src/acpica/source/include/acdebug.h b/src/acpica/source/include/acdebug.h > index 5012d35d..41f87320 100644 > --- a/src/acpica/source/include/acdebug.h > +++ b/src/acpica/source/include/acdebug.h > @@ -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 > diff --git a/src/acpica/source/include/acexcep.h b/src/acpica/source/include/acexcep.h > index 90b369a1..11c81398 100644 > --- a/src/acpica/source/include/acexcep.h > +++ b/src/acpica/source/include/acexcep.h > @@ -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} > diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h > index c1b55401..a16b6830 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 0x20200717 > +#define ACPI_CA_VERSION 0x20200925 > > #include "acconfig.h" > #include "actypes.h" > diff --git a/src/acpica/source/include/acpredef.h b/src/acpica/source/include/acpredef.h > index 924d7b90..2564fa55 100644 > --- a/src/acpica/source/include/acpredef.h > +++ b/src/acpica/source/include/acpredef.h > @@ -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. */ > > diff --git a/src/acpica/source/include/actbl1.h b/src/acpica/source/include/actbl1.h > index 1f0d5c2f..47e5f059 100644 > --- a/src/acpica/source/include/actbl1.h > +++ b/src/acpica/source/include/actbl1.h > @@ -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 */ > > diff --git a/src/acpica/source/include/actypes.h b/src/acpica/source/include/actypes.h > index 0ec14a36..48388c21 100644 > --- a/src/acpica/source/include/actypes.h > +++ b/src/acpica/source/include/actypes.h > @@ -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; > > diff --git a/src/acpica/source/include/acuuid.h b/src/acpica/source/include/acuuid.h > index b856219c..468244a6 100644 > --- a/src/acpica/source/include/acuuid.h > +++ b/src/acpica/source/include/acuuid.h > @@ -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__ */ > diff --git a/src/acpica/source/include/platform/aclinux.h b/src/acpica/source/include/platform/aclinux.h > index aee2e85a..ff859c49 100644 > --- a/src/acpica/source/include/platform/aclinux.h > +++ b/src/acpica/source/include/platform/aclinux.h > @@ -324,7 +324,8 @@ > > #if defined(__ia64__) || (defined(__x86_64__) && !defined(__ILP32__)) ||\ > defined(__aarch64__) || defined(__PPC64__) ||\ > - defined(__s390x__) || (defined(__riscv) && (__INTPTR_WIDTH__ == 64)) > + defined(__s390x__) ||\ > + (defined(__riscv) && (defined(__LP64__) || defined(_LP64))) > #define ACPI_MACHINE_WIDTH 64 > #define COMPILER_DEPENDENT_INT64 long > #define COMPILER_DEPENDENT_UINT64 unsigned long > Acked-by: Ivan Hu <ivan.hu@canonical.com>
diff --git a/src/acpica/source/common/ahpredef.c b/src/acpica/source/common/ahpredef.c index be1b37ab..182a83ad 100644 --- a/src/acpica/source/common/ahpredef.c +++ b/src/acpica/source/common/ahpredef.c @@ -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"), diff --git a/src/acpica/source/common/ahuuids.c b/src/acpica/source/common/ahuuids.c index 64d45e3f..3c14b10e 100644 --- a/src/acpica/source/common/ahuuids.c +++ b/src/acpica/source/common/ahuuids.c @@ -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} }; diff --git a/src/acpica/source/common/dmtbinfo1.c b/src/acpica/source/common/dmtbinfo1.c index 9661f495..750e29d5 100644 --- a/src/acpica/source/common/dmtbinfo1.c +++ b/src/acpica/source/common/dmtbinfo1.c @@ -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}, diff --git a/src/acpica/source/compiler/aslcompiler.l b/src/acpica/source/compiler/aslcompiler.l index 4016faed..8e448fb7 100644 --- a/src/acpica/source/compiler/aslcompiler.l +++ b/src/acpica/source/compiler/aslcompiler.l @@ -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); diff --git a/src/acpica/source/compiler/aslload.c b/src/acpica/source/compiler/aslload.c index 454fa8f5..c9fae99a 100644 --- a/src/acpica/source/compiler/aslload.c +++ b/src/acpica/source/compiler/aslload.c @@ -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); diff --git a/src/acpica/source/compiler/aslmessages.c b/src/acpica/source/compiler/aslmessages.c index eb344940..320ad2ae 100644 --- a/src/acpica/source/compiler/aslmessages.c +++ b/src/acpica/source/compiler/aslmessages.c @@ -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 */ diff --git a/src/acpica/source/compiler/aslmessages.h b/src/acpica/source/compiler/aslmessages.h index 9a7215c6..8a2b5c6c 100644 --- a/src/acpica/source/compiler/aslmessages.h +++ b/src/acpica/source/compiler/aslmessages.h @@ -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 */ diff --git a/src/acpica/source/compiler/aslparseop.c b/src/acpica/source/compiler/aslparseop.c index 46875413..51ef9b8c 100644 --- a/src/acpica/source/compiler/aslparseop.c +++ b/src/acpica/source/compiler/aslparseop.c @@ -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; diff --git a/src/acpica/source/compiler/aslprepkg.c b/src/acpica/source/compiler/aslprepkg.c index f3042cae..35b947c8 100644 --- a/src/acpica/source/compiler/aslprepkg.c +++ b/src/acpica/source/compiler/aslprepkg.c @@ -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); diff --git a/src/acpica/source/compiler/aslutils.c b/src/acpica/source/compiler/aslutils.c index 42ef2c0b..16fad627 100644 --- a/src/acpica/source/compiler/aslutils.c +++ b/src/acpica/source/compiler/aslutils.c @@ -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, diff --git a/src/acpica/source/compiler/aslxref.c b/src/acpica/source/compiler/aslxref.c index 9306af20..163799a8 100644 --- a/src/acpica/source/compiler/aslxref.c +++ b/src/acpica/source/compiler/aslxref.c @@ -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 */ diff --git a/src/acpica/source/components/debugger/dbexec.c b/src/acpica/source/components/debugger/dbexec.c index f4b024e2..5fd05f5a 100644 --- a/src/acpica/source/components/debugger/dbexec.c +++ b/src/acpica/source/components/debugger/dbexec.c @@ -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 */ diff --git a/src/acpica/source/components/debugger/dbinput.c b/src/acpica/source/components/debugger/dbinput.c index 378e3db1..0cc97310 100644 --- a/src/acpica/source/components/debugger/dbinput.c +++ b/src/acpica/source/components/debugger/dbinput.c @@ -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 diff --git a/src/acpica/source/components/debugger/dbmethod.c b/src/acpica/source/components/debugger/dbmethod.c index a7b6911a..d259a3ef 100644 --- a/src/acpica/source/components/debugger/dbmethod.c +++ b/src/acpica/source/components/debugger/dbmethod.c @@ -170,6 +170,10 @@ AcpiDbWalkForExecute ( void *Context, void **ReturnValue); +static ACPI_STATUS +AcpiDbEvaluateObject ( + ACPI_NAMESPACE_NODE *Node); + /******************************************************************************* * @@ -542,46 +546,29 @@ 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; - - - Predefined = AcpiUtMatchPredefinedMethod (Node->Name.Ascii); - if (!Predefined) - { - return (AE_OK); - } + ACPI_BUFFER ReturnObj; + ACPI_STATUS Status; - 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); +} diff --git a/src/acpica/source/components/disassembler/dmbuffer.c b/src/acpica/source/components/disassembler/dmbuffer.c index 47279a2c..810f727f 100644 --- a/src/acpica/source/components/disassembler/dmbuffer.c +++ b/src/acpica/source/components/disassembler/dmbuffer.c @@ -494,6 +494,10 @@ AcpiDmUuid ( { AcpiOsPrintf (" /* %s */", Description); } + else + { + AcpiOsPrintf (" /* Unknown UUID */"); + } } diff --git a/src/acpica/source/components/disassembler/dmcstyle.c b/src/acpica/source/components/disassembler/dmcstyle.c index 4fcc5e6d..c8541aaf 100644 --- a/src/acpica/source/components/disassembler/dmcstyle.c +++ b/src/acpica/source/components/disassembler/dmcstyle.c @@ -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) { diff --git a/src/acpica/source/components/events/evrgnini.c b/src/acpica/source/components/events/evrgnini.c index 54f91a36..a58765e3 100644 --- a/src/acpica/source/components/events/evrgnini.c +++ b/src/acpica/source/components/events/evrgnini.c @@ -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; diff --git a/src/acpica/source/components/executer/exregion.c b/src/acpica/source/components/executer/exregion.c index 920aa1e3..0985e7a5 100644 --- a/src/acpica/source/components/executer/exregion.c +++ b/src/acpica/source/components/executer/exregion.c @@ -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; + } + + if (Address < Mm->PhysicalAddress) + { + continue; + } + + if ((UINT64) Address + Length > (UINT64) Mm->PhysicalAddress + Mm->Length) + { + continue; + } + + MemInfo->CurMm = Mm; + goto access; + } - AcpiOsUnmapMemory (MemInfo->MappedLogicalAddress, - MemInfo->MappedLength); + /* 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", diff --git a/src/acpica/source/components/namespace/nsalloc.c b/src/acpica/source/components/namespace/nsalloc.c index 6610c7f3..e7564871 100644 --- a/src/acpica/source/components/namespace/nsalloc.c +++ b/src/acpica/source/components/namespace/nsalloc.c @@ -481,7 +481,7 @@ AcpiNsDeleteChildren ( NodeToDelete = NextNode; NextNode = NextNode->Peer; AcpiNsDeleteNode (NodeToDelete); - }; + } /* Clear the parent's child pointer */ diff --git a/src/acpica/source/components/namespace/nsarguments.c b/src/acpica/source/components/namespace/nsarguments.c index 2e2828dd..1a2d1099 100644 --- a/src/acpica/source/components/namespace/nsarguments.c +++ b/src/acpica/source/components/namespace/nsarguments.c @@ -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 - " diff --git a/src/acpica/source/components/namespace/nsxfobj.c b/src/acpica/source/components/namespace/nsxfobj.c index 68e64033..de793323 100644 --- a/src/acpica/source/components/namespace/nsxfobj.c +++ b/src/acpica/source/components/namespace/nsxfobj.c @@ -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 * ******************************************************************************/ diff --git a/src/acpica/source/components/parser/psparse.c b/src/acpica/source/components/parser/psparse.c index 729c929e..d935ebc2 100644 --- a/src/acpica/source/components/parser/psparse.c +++ b/src/acpica/source/components/parser/psparse.c @@ -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; diff --git a/src/acpica/source/components/utilities/utpredef.c b/src/acpica/source/components/utilities/utpredef.c index 05708ab5..d6d98d0f 100644 --- a/src/acpica/source/components/utilities/utpredef.c +++ b/src/acpica/source/components/utilities/utpredef.c @@ -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); diff --git a/src/acpica/source/components/utilities/utstrsuppt.c b/src/acpica/source/components/utilities/utstrsuppt.c index f0805ccf..153b56e8 100644 --- a/src/acpica/source/components/utilities/utstrsuppt.c +++ b/src/acpica/source/components/utilities/utstrsuppt.c @@ -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; } diff --git a/src/acpica/source/include/acconfig.h b/src/acpica/source/include/acconfig.h index 2c50ddc4..d717aa52 100644 --- a/src/acpica/source/include/acconfig.h +++ b/src/acpica/source/include/acconfig.h @@ -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 diff --git a/src/acpica/source/include/acdebug.h b/src/acpica/source/include/acdebug.h index 5012d35d..41f87320 100644 --- a/src/acpica/source/include/acdebug.h +++ b/src/acpica/source/include/acdebug.h @@ -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 diff --git a/src/acpica/source/include/acexcep.h b/src/acpica/source/include/acexcep.h index 90b369a1..11c81398 100644 --- a/src/acpica/source/include/acexcep.h +++ b/src/acpica/source/include/acexcep.h @@ -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} diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h index c1b55401..a16b6830 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 0x20200717 +#define ACPI_CA_VERSION 0x20200925 #include "acconfig.h" #include "actypes.h" diff --git a/src/acpica/source/include/acpredef.h b/src/acpica/source/include/acpredef.h index 924d7b90..2564fa55 100644 --- a/src/acpica/source/include/acpredef.h +++ b/src/acpica/source/include/acpredef.h @@ -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. */ diff --git a/src/acpica/source/include/actbl1.h b/src/acpica/source/include/actbl1.h index 1f0d5c2f..47e5f059 100644 --- a/src/acpica/source/include/actbl1.h +++ b/src/acpica/source/include/actbl1.h @@ -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 */ diff --git a/src/acpica/source/include/actypes.h b/src/acpica/source/include/actypes.h index 0ec14a36..48388c21 100644 --- a/src/acpica/source/include/actypes.h +++ b/src/acpica/source/include/actypes.h @@ -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; diff --git a/src/acpica/source/include/acuuid.h b/src/acpica/source/include/acuuid.h index b856219c..468244a6 100644 --- a/src/acpica/source/include/acuuid.h +++ b/src/acpica/source/include/acuuid.h @@ -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__ */ diff --git a/src/acpica/source/include/platform/aclinux.h b/src/acpica/source/include/platform/aclinux.h index aee2e85a..ff859c49 100644 --- a/src/acpica/source/include/platform/aclinux.h +++ b/src/acpica/source/include/platform/aclinux.h @@ -324,7 +324,8 @@ #if defined(__ia64__) || (defined(__x86_64__) && !defined(__ILP32__)) ||\ defined(__aarch64__) || defined(__PPC64__) ||\ - defined(__s390x__) || (defined(__riscv) && (__INTPTR_WIDTH__ == 64)) + defined(__s390x__) ||\ + (defined(__riscv) && (defined(__LP64__) || defined(_LP64))) #define ACPI_MACHINE_WIDTH 64 #define COMPILER_DEPENDENT_INT64 long #define COMPILER_DEPENDENT_UINT64 unsigned long