aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJung-uk Kim <jkim@FreeBSD.org>2018-08-10 16:34:24 +0000
committerJung-uk Kim <jkim@FreeBSD.org>2018-08-10 16:34:24 +0000
commitc6014c64fcfd099d0087da3509e8a623d2c30209 (patch)
treec22d0c3f38051befce50bdd7580336199d2aa061
parentd776ccceca14a93812a2f15904c3b09af20ec866 (diff)
downloadsrc-c6014c64fcfd099d0087da3509e8a623d2c30209.tar.gz
src-c6014c64fcfd099d0087da3509e8a623d2c30209.zip
Import ACPICA 20180810.vendor/acpica/20180810
Notes
Notes: svn path=/vendor-sys/acpica/dist/; revision=337581 svn path=/vendor-sys/acpica/20180810/; revision=337582; tag=vendor/acpica/20180810
-rw-r--r--changes.txt47
-rw-r--r--source/components/debugger/dbinput.c10
-rw-r--r--source/components/debugger/dbmethod.c7
-rw-r--r--source/components/debugger/dbxface.c10
-rw-r--r--source/components/dispatcher/dsfield.c26
-rw-r--r--source/components/hardware/hwregs.c11
-rw-r--r--source/components/hardware/hwsleep.c19
-rw-r--r--source/components/namespace/nsaccess.c16
-rw-r--r--source/components/parser/psloop.c41
-rw-r--r--source/components/tables/tbdata.c4
-rw-r--r--source/components/utilities/utdelete.c7
-rw-r--r--source/components/utilities/uterror.c6
-rw-r--r--source/components/utilities/utstrsuppt.c30
-rw-r--r--source/components/utilities/utstrtoul64.c2
-rw-r--r--source/include/acconfig.h2
-rw-r--r--source/include/acexcep.h7
-rw-r--r--source/include/aclocal.h1
-rw-r--r--source/include/acnamesp.h17
-rw-r--r--source/include/acpixf.h2
-rw-r--r--source/include/acutils.h4
-rw-r--r--source/tools/acpiexec/aecommon.h18
-rw-r--r--source/tools/acpiexec/aeinitfile.c147
-rw-r--r--source/tools/acpiexec/aemain.c11
-rw-r--r--source/tools/acpiexec/aeregion.c8
24 files changed, 349 insertions, 104 deletions
diff --git a/changes.txt b/changes.txt
index b529ab61277a..d2a76e90a82c 100644
--- a/changes.txt
+++ b/changes.txt
@@ -1,4 +1,51 @@
----------------------------------------
+10 August 2018. Summary of changes for version 20180810:
+
+
+1) ACPICA kernel-resident subsystem:
+
+Initial ACPI table loading: Attempt to continue loading ACPI tables
+regardless of malformed AML. Since migrating table initialization to the
+new module-level code support, the AML interpreter rejected tables upon
+any ACPI error encountered during table load. This is a problem because
+non-serious ACPI errors during table load do not necessarily mean that
+the entire definition block (DSDT or SSDT) is invalid. This change
+improves the table loading by ignoring some types of errors that can be
+generated by incorrect AML. This can range from object type errors, scope
+errors, and index errors.
+
+Suspend/Resume support: Update to stop unconditionally clearing ACPI IRQs
+during suspend/resume. The status of ACPI events is no longer cleared
+when entering the ACPI S5 system state (power off) which caused some
+systems to power up immediately after turning off power in certain
+situations. This was a functional regression. It was fixed by clearing
+the status of all ACPI events again when entering S5 (for system-wide
+suspend or hibernation the clearing of the status of all events is not
+desirable, as it might cause the kernel to miss wakeup events sometimes).
+Rafael Wysocki.
+
+
+2) iASL Compiler/Disassembler and Tools:
+
+AcpiExec: Enhanced the -fi option (Namespace initialization file). Field
+elements listed in the initialization file were previously initialized
+after the table load and before executing module-level code blocks.
+Recent changes in the module-level code support means that the table load
+becomes a large control method execution. If fields are used within
+module-level code and we are executing with the -fi option, the
+initialization values were used to initialize the namespace object(s)
+only after the table was finished loading. This change Provides an early
+initialization of objects specified in the initialization file so that
+field unit values are populated during the table load (not after the
+load).
+
+AcpiExec: Fixed a small memory leak regression that could result in
+warnings during exit of the utility. These warnings were similar to
+these:
+ 0002D690 Length 0x0006 nsnames-0502 [Not a Descriptor - too small]
+ 0002CD70 Length 0x002C utcache-0453 [Operand] Integer RefCount 0x0001
+
+----------------------------------------
29 June 2018. Summary of changes for version 20180629:
diff --git a/source/components/debugger/dbinput.c b/source/components/debugger/dbinput.c
index 75e7a37f5385..0daca95b7e65 100644
--- a/source/components/debugger/dbinput.c
+++ b/source/components/debugger/dbinput.c
@@ -969,7 +969,11 @@ AcpiDbCommandDispatch (
case CMD_DISASSEMBLE:
case CMD_DISASM:
+#ifdef ACPI_DISASSEMBLER
(void) AcpiDbDisassembleMethod (AcpiGbl_DbArgs[1]);
+#else
+ AcpiOsPrintf ("The AML Disassembler is not configured/present\n");
+#endif
break;
case CMD_DUMP:
@@ -1083,7 +1087,11 @@ AcpiDbCommandDispatch (
case CMD_LIST:
- AcpiDbDisassembleAml (AcpiGbl_DbArgs[1], Op);
+#ifdef ACPI_DISASSEMBLER
+ AcpiDbDisassembleAml (AcpiGbl_DbArgs[1], Op);;
+#else
+ AcpiOsPrintf ("The AML Disassembler is not configured/present\n");
+#endif
break;
case CMD_LOCKS:
diff --git a/source/components/debugger/dbmethod.c b/source/components/debugger/dbmethod.c
index d6c6aa55bf6a..a030823c2ac7 100644
--- a/source/components/debugger/dbmethod.c
+++ b/source/components/debugger/dbmethod.c
@@ -393,6 +393,7 @@ Cleanup:
}
+#ifdef ACPI_DISASSEMBLER
/*******************************************************************************
*
* FUNCTION: AcpiDbDisassembleAml
@@ -426,9 +427,7 @@ AcpiDbDisassembleAml (
NumStatements = strtoul (Statements, NULL, 0);
}
-#ifdef ACPI_DISASSEMBLER
AcpiDmDisassemble (NULL, Op, NumStatements);
-#endif
}
@@ -511,8 +510,6 @@ AcpiDbDisassembleMethod (
WalkState->ParseFlags |= ACPI_PARSE_DISASSEMBLE;
Status = AcpiPsParseAml (WalkState);
-
-#ifdef ACPI_DISASSEMBLER
(void) AcpiDmParseDeferredOps (Op);
/* Now we can disassemble the method */
@@ -520,7 +517,6 @@ AcpiDbDisassembleMethod (
AcpiGbl_DmOpt_Verbose = FALSE;
AcpiDmDisassemble (NULL, Op, 0);
AcpiGbl_DmOpt_Verbose = TRUE;
-#endif
AcpiPsDeleteParseTree (Op);
@@ -531,6 +527,7 @@ AcpiDbDisassembleMethod (
AcpiUtReleaseOwnerId (&ObjDesc->Method.OwnerId);
return (AE_OK);
}
+#endif
/*******************************************************************************
diff --git a/source/components/debugger/dbxface.c b/source/components/debugger/dbxface.c
index 0b964f69ff5f..c661b248b75e 100644
--- a/source/components/debugger/dbxface.c
+++ b/source/components/debugger/dbxface.c
@@ -154,6 +154,7 @@
#include "amlcode.h"
#include "acdebug.h"
#include "acinterp.h"
+#include "acparser.h"
#define _COMPONENT ACPI_CA_DEBUGGER
@@ -435,10 +436,17 @@ AcpiDbSingleStep (
}
}
- /* Now we can display it */
+ /* Now we can disassemble and display it */
#ifdef ACPI_DISASSEMBLER
AcpiDmDisassemble (WalkState, DisplayOp, ACPI_UINT32_MAX);
+#else
+ /*
+ * The AML Disassembler is not configured - at least we can
+ * display the opcode value and name
+ */
+ AcpiOsPrintf ("AML Opcode: %4.4X %s\n", Op->Common.AmlOpcode,
+ AcpiPsGetOpcodeName (Op->Common.AmlOpcode));
#endif
if ((Op->Common.AmlOpcode == AML_IF_OP) ||
diff --git a/source/components/dispatcher/dsfield.c b/source/components/dispatcher/dsfield.c
index df770c1c07b3..3db39fb8b25d 100644
--- a/source/components/dispatcher/dsfield.c
+++ b/source/components/dispatcher/dsfield.c
@@ -157,6 +157,10 @@
#include "acnamesp.h"
#include "acparser.h"
+#ifdef ACPI_EXEC_APP
+#include "aecommon.h"
+#endif
+
#define _COMPONENT ACPI_DISPATCHER
ACPI_MODULE_NAME ("dsfield")
@@ -430,6 +434,13 @@ AcpiDsGetFieldNames (
UINT64 Position;
ACPI_PARSE_OBJECT *Child;
+#ifdef ACPI_EXEC_APP
+ UINT64 Value = 0;
+ ACPI_OPERAND_OBJECT *ResultDesc;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ char *NamePath;
+#endif
+
ACPI_FUNCTION_TRACE_PTR (DsGetFieldNames, Info);
@@ -564,6 +575,18 @@ AcpiDsGetFieldNames (
{
return_ACPI_STATUS (Status);
}
+#ifdef ACPI_EXEC_APP
+ NamePath = AcpiNsGetExternalPathname (Info->FieldNode);
+ ObjDesc = AcpiUtCreateIntegerObject (Value);
+ if (ACPI_SUCCESS (AeLookupInitFileEntry (NamePath, &Value)))
+ {
+ AcpiExWriteDataToField (ObjDesc,
+ AcpiNsGetAttachedObject (Info->FieldNode),
+ &ResultDesc);
+ }
+ AcpiUtRemoveReference (ObjDesc);
+ ACPI_FREE (NamePath);
+#endif
}
}
@@ -756,6 +779,9 @@ AcpiDsInitFieldObjects (
Flags |= ACPI_NS_TEMPORARY;
}
+#ifdef ACPI_EXEC_APP
+ Flags |= ACPI_NS_OVERRIDE_IF_FOUND;
+#endif
/*
* Walk the list of entries in the FieldList
* Note: FieldList can be of zero length. In this case, Arg will be NULL.
diff --git a/source/components/hardware/hwregs.c b/source/components/hardware/hwregs.c
index c0deed339797..ec106847ba3a 100644
--- a/source/components/hardware/hwregs.c
+++ b/source/components/hardware/hwregs.c
@@ -724,13 +724,20 @@ AcpiHwRegisterRead (
case ACPI_REGISTER_PM2_CONTROL: /* 8-bit access */
Status = AcpiHwRead (&Value64, &AcpiGbl_FADT.XPm2ControlBlock);
- Value = (UINT32) Value64;
+ if (ACPI_SUCCESS (Status))
+ {
+ Value = (UINT32) Value64;
+ }
break;
case ACPI_REGISTER_PM_TIMER: /* 32-bit access */
Status = AcpiHwRead (&Value64, &AcpiGbl_FADT.XPmTimerBlock);
- Value = (UINT32) Value64;
+ if (ACPI_SUCCESS (Status))
+ {
+ Value = (UINT32) Value64;
+ }
+
break;
case ACPI_REGISTER_SMI_COMMAND_BLOCK: /* 8-bit access */
diff --git a/source/components/hardware/hwsleep.c b/source/components/hardware/hwsleep.c
index fe111872cec0..7e435acecba0 100644
--- a/source/components/hardware/hwsleep.c
+++ b/source/components/hardware/hwsleep.c
@@ -198,17 +198,28 @@ AcpiHwLegacySleep (
return_ACPI_STATUS (Status);
}
- /*
- * 1) Disable all GPEs
- * 2) Enable all wakeup GPEs
- */
+ /* Disable all GPEs */
+
Status = AcpiHwDisableAllGpes ();
if (ACPI_FAILURE (Status))
{
return_ACPI_STATUS (Status);
}
+ /*
+ * If the target sleep state is S5, clear all GPEs and fixed events too
+ */
+ if (SleepState == ACPI_STATE_S5)
+ {
+ Status = AcpiHwClearAcpiStatus();
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
AcpiGbl_SystemAwakeAndRunning = FALSE;
+ /* Enable all wakeup GPEs */
+
Status = AcpiHwEnableAllWakeupGpes ();
if (ACPI_FAILURE (Status))
{
diff --git a/source/components/namespace/nsaccess.c b/source/components/namespace/nsaccess.c
index bf530d483025..af97c51feff5 100644
--- a/source/components/namespace/nsaccess.c
+++ b/source/components/namespace/nsaccess.c
@@ -724,6 +724,15 @@ AcpiNsLookup (
CurrentNode));
}
+#ifdef ACPI_EXEC_APP
+ if ((Status == AE_ALREADY_EXISTS) &&
+ (ThisNode->Flags & ANOBJ_NODE_EARLY_INIT))
+ {
+ ThisNode->Flags &= ~ANOBJ_NODE_EARLY_INIT;
+ Status = AE_OK;
+ }
+#endif
+
#ifdef ACPI_ASL_COMPILER
/*
* If this ACPI name already exists within the namespace as an
@@ -845,6 +854,13 @@ AcpiNsLookup (
}
}
+#ifdef ACPI_EXEC_APP
+ if (Flags & ACPI_NS_EARLY_INIT)
+ {
+ ThisNode->Flags |= ANOBJ_NODE_EARLY_INIT;
+ }
+#endif
+
*ReturnNode = ThisNode;
return_ACPI_STATUS (AE_OK);
}
diff --git a/source/components/parser/psloop.c b/source/components/parser/psloop.c
index fd6773c149c3..ef517b54d0bf 100644
--- a/source/components/parser/psloop.c
+++ b/source/components/parser/psloop.c
@@ -164,6 +164,7 @@
#include "acdispat.h"
#include "amlcode.h"
#include "acconvert.h"
+#include "acnamesp.h"
#define _COMPONENT ACPI_PARSER
ACPI_MODULE_NAME ("psloop")
@@ -645,6 +646,18 @@ AcpiPsParseLoop (
Status = AcpiPsCreateOp (WalkState, AmlOpStart, &Op);
if (ACPI_FAILURE (Status))
{
+ /*
+ * ACPI_PARSE_MODULE_LEVEL means that we are loading a table by
+ * executing it as a control method. However, if we encounter
+ * an error while loading the table, we need to keep trying to
+ * load the table rather than aborting the table load. Set the
+ * status to AE_OK to proceed with the table load.
+ */
+ if ((WalkState->ParseFlags & ACPI_PARSE_MODULE_LEVEL) &&
+ Status == AE_ALREADY_EXISTS)
+ {
+ Status = AE_OK;
+ }
if (Status == AE_CTRL_PARSE_CONTINUE)
{
continue;
@@ -665,18 +678,20 @@ AcpiPsParseLoop (
{
return_ACPI_STATUS (Status);
}
- if (WalkState->Opcode == AML_SCOPE_OP)
+ if (AcpiNsOpensScope (
+ AcpiPsGetOpcodeInfo (WalkState->Opcode)->ObjectType))
{
/*
- * If the scope op fails to parse, skip the body of the
- * scope op because the parse failure indicates that the
- * device may not exist.
+ * If the scope/device op fails to parse, skip the body of
+ * the scope op because the parse failure indicates that
+ * the device may not exist.
*/
+ ACPI_ERROR ((AE_INFO, "Skip parsing opcode %s",
+ AcpiPsGetOpcodeName (WalkState->Opcode)));
WalkState->ParserState.Aml = WalkState->Aml + 1;
WalkState->ParserState.Aml =
AcpiPsGetNextPackageEnd(&WalkState->ParserState);
WalkState->Aml = WalkState->ParserState.Aml;
- ACPI_ERROR ((AE_INFO, "Skipping Scope block"));
}
continue;
@@ -834,6 +849,22 @@ AcpiPsParseLoop (
{
Status = AE_OK;
}
+ else if ((WalkState->ParseFlags & ACPI_PARSE_MODULE_LEVEL) &&
+ (ACPI_AML_EXCEPTION(Status) || Status == AE_ALREADY_EXISTS ||
+ Status == AE_NOT_FOUND))
+ {
+ /*
+ * ACPI_PARSE_MODULE_LEVEL flag means that we are currently
+ * loading a table by executing it as a control method.
+ * However, if we encounter an error while loading the table,
+ * we need to keep trying to load the table rather than
+ * aborting the table load (setting the status to AE_OK
+ * continues the table load). If we get a failure at this
+ * point, it means that the dispatcher got an error while
+ * trying to execute the Op.
+ */
+ Status = AE_OK;
+ }
}
Status = AcpiPsCompleteOp (WalkState, &Op, Status);
diff --git a/source/components/tables/tbdata.c b/source/components/tables/tbdata.c
index 61a2d340d56d..7b44fc74eb23 100644
--- a/source/components/tables/tbdata.c
+++ b/source/components/tables/tbdata.c
@@ -711,9 +711,9 @@ AcpiTbVerifyTempTable (
{
if (Status != AE_CTRL_TERMINATE)
{
- ACPI_EXCEPTION ((AE_INFO, AE_NO_MEMORY,
+ ACPI_EXCEPTION ((AE_INFO, Status,
"%4.4s 0x%8.8X%8.8X"
- " Table is duplicated",
+ " Table is already loaded",
AcpiUtValidNameseg (TableDesc->Signature.Ascii) ?
TableDesc->Signature.Ascii : "????",
ACPI_FORMAT_UINT64 (TableDesc->Address)));
diff --git a/source/components/utilities/utdelete.c b/source/components/utilities/utdelete.c
index 4565d8fa5ae3..da2e31ff9fd5 100644
--- a/source/components/utilities/utdelete.c
+++ b/source/components/utilities/utdelete.c
@@ -520,6 +520,7 @@ AcpiUtUpdateRefCount (
UINT16 OriginalCount;
UINT16 NewCount = 0;
ACPI_CPU_FLAGS LockFlags;
+ char *Message;
ACPI_FUNCTION_NAME (UtUpdateRefCount);
@@ -560,6 +561,7 @@ AcpiUtUpdateRefCount (
"Obj %p Type %.2X [%s] Refs %.2X [Incremented]\n",
Object, Object->Common.Type,
AcpiUtGetObjectTypeName (Object), NewCount));
+ Message = "Incremement";
break;
case REF_DECREMENT:
@@ -591,6 +593,7 @@ AcpiUtUpdateRefCount (
{
AcpiUtDeleteInternalObj (Object);
}
+ Message = "Decrement";
break;
default:
@@ -608,8 +611,8 @@ AcpiUtUpdateRefCount (
if (NewCount > ACPI_MAX_REFERENCE_COUNT)
{
ACPI_WARNING ((AE_INFO,
- "Large Reference Count (0x%X) in object %p, Type=0x%.2X",
- NewCount, Object, Object->Common.Type));
+ "Large Reference Count (0x%X) in object %p, Type=0x%.2X Operation=%s",
+ NewCount, Object, Object->Common.Type, Message));
}
}
diff --git a/source/components/utilities/uterror.c b/source/components/utilities/uterror.c
index eca92f3b1b5c..67c22330f069 100644
--- a/source/components/utilities/uterror.c
+++ b/source/components/utilities/uterror.c
@@ -352,19 +352,19 @@ AcpiUtPrefixedNamespaceError (
{
case AE_ALREADY_EXISTS:
- AcpiOsPrintf ("\n" ACPI_MSG_BIOS_ERROR);
+ AcpiOsPrintf (ACPI_MSG_BIOS_ERROR);
Message = "Failure creating";
break;
case AE_NOT_FOUND:
- AcpiOsPrintf ("\n" ACPI_MSG_BIOS_ERROR);
+ AcpiOsPrintf (ACPI_MSG_BIOS_ERROR);
Message = "Could not resolve";
break;
default:
- AcpiOsPrintf ("\n" ACPI_MSG_ERROR);
+ AcpiOsPrintf (ACPI_MSG_ERROR);
Message = "Failure resolving";
break;
}
diff --git a/source/components/utilities/utstrsuppt.c b/source/components/utilities/utstrsuppt.c
index 2e7232a3b05f..b482da21db5e 100644
--- a/source/components/utilities/utstrsuppt.c
+++ b/source/components/utilities/utstrsuppt.c
@@ -419,15 +419,39 @@ BOOLEAN
AcpiUtDetectHexPrefix (
char **String)
{
+ char *InitialPosition = *String;
+ AcpiUtRemoveHexPrefix (String);
+ if (*String != InitialPosition)
+ {
+ return (TRUE); /* String is past leading 0x */
+ }
+
+ return (FALSE); /* Not a hex string */
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtRemoveHexPrefix
+ *
+ * PARAMETERS: String - Pointer to input ASCII string
+ *
+ * RETURN: none
+ *
+ * DESCRIPTION: Remove a hex "0x" prefix
+ *
+ ******************************************************************************/
+
+void
+AcpiUtRemoveHexPrefix (
+ char **String)
+{
if ((**String == ACPI_ASCII_ZERO) &&
(tolower ((int) *(*String + 1)) == 'x'))
{
*String += 2; /* Go past the leading 0x */
- return (TRUE);
}
-
- return (FALSE); /* Not a hex string */
}
diff --git a/source/components/utilities/utstrtoul64.c b/source/components/utilities/utstrtoul64.c
index 5bbf24fd8014..77190e107991 100644
--- a/source/components/utilities/utstrtoul64.c
+++ b/source/components/utilities/utstrtoul64.c
@@ -383,7 +383,7 @@ AcpiUtImplicitStrtoul64 (
* implicit conversions, and the "0x" prefix is "not allowed".
* However, allow a "0x" prefix as an ACPI extension.
*/
- AcpiUtDetectHexPrefix (&String);
+ AcpiUtRemoveHexPrefix (&String);
if (!AcpiUtRemoveLeadingZeros (&String))
{
diff --git a/source/include/acconfig.h b/source/include/acconfig.h
index c5a67ca04755..41f3dff0822b 100644
--- a/source/include/acconfig.h
+++ b/source/include/acconfig.h
@@ -233,7 +233,7 @@
/* Maximum object reference count (detects object deletion issues) */
-#define ACPI_MAX_REFERENCE_COUNT 0x800
+#define ACPI_MAX_REFERENCE_COUNT 0x4000
/* Default page size for use in mapping memory for operation regions */
diff --git a/source/include/acexcep.h b/source/include/acexcep.h
index 828f9fb9485c..ec2304c550dd 100644
--- a/source/include/acexcep.h
+++ b/source/include/acexcep.h
@@ -204,6 +204,13 @@ typedef struct acpi_exception_info
#define AE_OK (ACPI_STATUS) 0x0000
+#define ACPI_ENV_EXCEPTION(Status) (Status & AE_CODE_ENVIRONMENTAL)
+#define ACPI_AML_EXCEPTION(Status) (Status & AE_CODE_AML)
+#define ACPI_PROG_EXCEPTION(Status) (Status & AE_CODE_PROGRAMMER)
+#define ACPI_TABLE_EXCEPTION(Status) (Status & AE_CODE_ACPI_TABLES)
+#define ACPI_CNTL_EXCEPTION(Status) (Status & AE_CODE_CONTROL)
+
+
/*
* Environmental exceptions
*/
diff --git a/source/include/aclocal.h b/source/include/aclocal.h
index 58c09379ccdc..2e2bcd0d23f5 100644
--- a/source/include/aclocal.h
+++ b/source/include/aclocal.h
@@ -327,6 +327,7 @@ typedef struct acpi_namespace_node
#define ANOBJ_SUBTREE_HAS_INI 0x10 /* Used to optimize device initialization */
#define ANOBJ_EVALUATED 0x20 /* Set on first evaluation of node */
#define ANOBJ_ALLOCATED_BUFFER 0x40 /* Method AML buffer is dynamic (InstallMethod) */
+#define ANOBJ_NODE_EARLY_INIT 0x80 /* AcpiExec only: Node was create via init file (-fi) */
#define ANOBJ_IS_EXTERNAL 0x08 /* iASL only: This object created via External() */
#define ANOBJ_METHOD_NO_RETVAL 0x10 /* iASL only: Method has no return value */
diff --git a/source/include/acnamesp.h b/source/include/acnamesp.h
index 529fc6e78a36..1e3db8d1cadd 100644
--- a/source/include/acnamesp.h
+++ b/source/include/acnamesp.h
@@ -168,14 +168,15 @@
/* Flags for AcpiNsLookup, AcpiNsSearchAndEnter */
#define ACPI_NS_NO_UPSEARCH 0
-#define ACPI_NS_SEARCH_PARENT 0x01
-#define ACPI_NS_DONT_OPEN_SCOPE 0x02
-#define ACPI_NS_NO_PEER_SEARCH 0x04
-#define ACPI_NS_ERROR_IF_FOUND 0x08
-#define ACPI_NS_PREFIX_IS_SCOPE 0x10
-#define ACPI_NS_EXTERNAL 0x20
-#define ACPI_NS_TEMPORARY 0x40
-#define ACPI_NS_OVERRIDE_IF_FOUND 0x80
+#define ACPI_NS_SEARCH_PARENT 0x0001
+#define ACPI_NS_DONT_OPEN_SCOPE 0x0002
+#define ACPI_NS_NO_PEER_SEARCH 0x0004
+#define ACPI_NS_ERROR_IF_FOUND 0x0008
+#define ACPI_NS_PREFIX_IS_SCOPE 0x0010
+#define ACPI_NS_EXTERNAL 0x0020
+#define ACPI_NS_TEMPORARY 0x0040
+#define ACPI_NS_OVERRIDE_IF_FOUND 0x0080
+#define ACPI_NS_EARLY_INIT 0x0100
/* Flags for AcpiNsWalkNamespace */
diff --git a/source/include/acpixf.h b/source/include/acpixf.h
index 110b375b464d..5097fcc1b732 100644
--- a/source/include/acpixf.h
+++ b/source/include/acpixf.h
@@ -154,7 +154,7 @@
/* Current ACPICA subsystem version in YYYYMMDD format */
-#define ACPI_CA_VERSION 0x20180629
+#define ACPI_CA_VERSION 0x20180810
#include "acconfig.h"
#include "actypes.h"
diff --git a/source/include/acutils.h b/source/include/acutils.h
index 8dfce9016940..1f7608843b00 100644
--- a/source/include/acutils.h
+++ b/source/include/acutils.h
@@ -362,6 +362,10 @@ BOOLEAN
AcpiUtDetectHexPrefix (
char **String);
+void
+AcpiUtRemoveHexPrefix (
+ char **String);
+
BOOLEAN
AcpiUtDetectOctalPrefix (
char **String);
diff --git a/source/tools/acpiexec/aecommon.h b/source/tools/acpiexec/aecommon.h
index 233edc2b4877..8ada9021f67e 100644
--- a/source/tools/acpiexec/aecommon.h
+++ b/source/tools/acpiexec/aecommon.h
@@ -189,11 +189,22 @@ typedef struct ae_debug_regions
} AE_DEBUG_REGIONS;
+/*
+ * Init file entry
+ */
+typedef struct init_file_entry
+{
+ char *Name;
+ UINT64 Value;
+} INIT_FILE_ENTRY;
+
extern BOOLEAN AcpiGbl_UseLocalFaultHandler;
extern BOOLEAN AcpiGbl_VerboseHandlers;
extern BOOLEAN AcpiGbl_IgnoreErrors;
extern BOOLEAN AcpiGbl_AbortLoopOnTimeout;
extern UINT8 AcpiGbl_RegionFillValue;
+extern INIT_FILE_ENTRY *AcpiGbl_InitEntries;
+extern UINT32 AcpiGbl_InitFileLineCount;
extern UINT8 AcpiGbl_UseHwReducedFadt;
extern BOOLEAN AcpiGbl_DisplayRegionAccess;
extern BOOLEAN AcpiGbl_DoInterfaceTests;
@@ -331,13 +342,18 @@ AeOpenInitializationFile (
char *Filename);
void
-AeDoObjectOverrides (
+AeProcessInitFile (
void);
ACPI_STATUS
AeSetupConfiguration (
void *RegionAddr);
+ACPI_STATUS
+AeLookupInitFileEntry (
+ char *Pathname,
+ UINT64 *Value);
+
/* aeexec */
void
diff --git a/source/tools/acpiexec/aeinitfile.c b/source/tools/acpiexec/aeinitfile.c
index 804a2cbcd6c9..79b797e094bc 100644
--- a/source/tools/acpiexec/aeinitfile.c
+++ b/source/tools/acpiexec/aeinitfile.c
@@ -159,10 +159,8 @@
/* Local prototypes */
static void
-AeDoOneOverride (
- char *Pathname,
- char *ValueString,
- ACPI_OPERAND_OBJECT *ObjDesc,
+AeEnterInitFileEntry (
+ INIT_FILE_ENTRY InitEntry,
ACPI_WALK_STATE *WalkState);
@@ -206,13 +204,15 @@ AeOpenInitializationFile (
/******************************************************************************
*
- * FUNCTION: AeDoObjectOverrides
+ * FUNCTION: AeProcessInitFile
*
* PARAMETERS: None
*
* RETURN: None
*
- * DESCRIPTION: Read the initialization file and perform all overrides
+ * DESCRIPTION: Read the initialization file and perform all namespace
+ * initializations. AcpiGbl_InitEntries will be used for region
+ * field initialization.
*
* NOTE: The format of the file is multiple lines, each of format:
* <ACPI-pathname> <Integer Value>
@@ -220,12 +220,13 @@ AeOpenInitializationFile (
*****************************************************************************/
void
-AeDoObjectOverrides (
+AeProcessInitFile(
void)
{
- ACPI_OPERAND_OBJECT *ObjDesc;
ACPI_WALK_STATE *WalkState;
int i;
+ UINT64 idx;
+ ACPI_STATUS Status;
if (!InitFile)
@@ -235,14 +236,19 @@ AeDoObjectOverrides (
/* Create needed objects to be reused for each init entry */
- ObjDesc = AcpiUtCreateIntegerObject (0);
WalkState = AcpiDsCreateWalkState (0, NULL, NULL, NULL);
NameBuffer[0] = '\\';
- /* Read the entire file line-by-line */
-
while (fgets (LineBuffer, AE_FILE_BUFFER_SIZE, InitFile) != NULL)
{
+ ++AcpiGbl_InitFileLineCount;
+ }
+ rewind (InitFile);
+
+ AcpiGbl_InitEntries =
+ AcpiOsAllocate (sizeof (INIT_FILE_ENTRY) * AcpiGbl_InitFileLineCount);
+ for (idx = 0; fgets (LineBuffer, AE_FILE_BUFFER_SIZE, InitFile); ++idx)
+ {
if (sscanf (LineBuffer, "%s %s\n",
&NameBuffer[1], ValueBuffer) != 2)
{
@@ -257,7 +263,20 @@ AeDoObjectOverrides (
i = 1;
}
- AeDoOneOverride (&NameBuffer[i], ValueBuffer, ObjDesc, WalkState);
+ AcpiGbl_InitEntries[idx].Name =
+ AcpiOsAllocateZeroed (strnlen (NameBuffer + i, AE_FILE_BUFFER_SIZE) + 1);
+
+ strcpy (AcpiGbl_InitEntries[idx].Name, NameBuffer + i);
+
+ Status = AcpiUtStrtoul64 (ValueBuffer, &AcpiGbl_InitEntries[idx].Value);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("%s %s\n", ValueBuffer,
+ AcpiFormatException (Status));
+ goto CleanupAndExit;
+ }
+
+ AeEnterInitFileEntry (AcpiGbl_InitEntries[idx], WalkState);
}
/* Cleanup */
@@ -265,77 +284,97 @@ AeDoObjectOverrides (
CleanupAndExit:
fclose (InitFile);
AcpiDsDeleteWalkState (WalkState);
- AcpiUtRemoveReference (ObjDesc);
}
/******************************************************************************
*
- * FUNCTION: AeDoOneOverride
+ * FUNCTION: AeInitFileEntry
*
- * PARAMETERS: Pathname - AML namepath
- * ValueString - New integer value to be stored
- * ObjDesc - Descriptor with integer override value
+ * PARAMETERS: InitEntry - Entry of the init file
* WalkState - Used for the Store operation
*
* RETURN: None
*
- * DESCRIPTION: Perform an override for a single namespace object
+ * DESCRIPTION: Perform initialization of a single namespace object
+ *
+ * Note: namespace of objects are limited to integers and region
+ * fields units of 8 bytes at this time.
*
*****************************************************************************/
static void
-AeDoOneOverride (
- char *Pathname,
- char *ValueString,
- ACPI_OPERAND_OBJECT *ObjDesc,
+AeEnterInitFileEntry (
+ INIT_FILE_ENTRY InitEntry,
ACPI_WALK_STATE *WalkState)
{
- ACPI_HANDLE Handle;
+ char *Pathname = InitEntry.Name;
+ UINT64 Value = InitEntry.Value;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_NAMESPACE_NODE *NewNode;
ACPI_STATUS Status;
- UINT64 Value;
-
- AcpiOsPrintf ("Value Override: %s, ", Pathname);
- /*
- * Get the namespace node associated with the override
- * pathname from the init file.
- */
- Status = AcpiGetHandle (NULL, Pathname, &Handle);
+ AcpiOsPrintf ("Initializing namespace element: %s\n", Pathname);
+ Status = AcpiNsLookup (NULL, Pathname, ACPI_TYPE_INTEGER,
+ ACPI_IMODE_LOAD_PASS2, ACPI_NS_ERROR_IF_FOUND | ACPI_NS_NO_UPSEARCH |
+ ACPI_NS_EARLY_INIT, NULL, &NewNode);
if (ACPI_FAILURE (Status))
{
- AcpiOsPrintf ("%s\n", AcpiFormatException (Status));
+ ACPI_EXCEPTION ((AE_INFO, Status,
+ "While creating name from namespace initialization file: %s",
+ Pathname));
return;
}
- /* Extract the 64-bit integer */
+ ObjDesc = AcpiUtCreateIntegerObject (Value);
- Status = AcpiUtStrtoul64 (ValueString, &Value);
- if (ACPI_FAILURE (Status))
- {
- AcpiOsPrintf ("%s %s\n", ValueString,
- AcpiFormatException (Status));
- return;
- }
+ AcpiOsPrintf ("New value: 0x%8.8X%8.8X\n",
+ ACPI_FORMAT_UINT64 (Value));
- ObjDesc->Integer.Value = Value;
+ /* Store pointer to value descriptor in the Node */
- /*
- * At the point this function is called, the namespace is fully
- * built and initialized. We can simply store the new object to
- * the target node.
- */
- AcpiExEnterInterpreter ();
- Status = AcpiExStore (ObjDesc, Handle, WalkState);
- AcpiExExitInterpreter ();
+ Status = AcpiNsAttachObject (NewNode, ObjDesc,
+ ACPI_TYPE_INTEGER);
- if (ACPI_FAILURE (Status))
+ /* Remove local reference to the object */
+
+ AcpiUtRemoveReference (ObjDesc);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AeLookupInitFileEntry
+ *
+ * PARAMETERS: Pathname - AML namepath in external format
+ * ValueString - value of the namepath if it exitst
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Search the init file for a particular name and its value.
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+AeLookupInitFileEntry (
+ char *Pathname,
+ UINT64 *Value)
+{
+ UINT32 i;
+
+ if (!AcpiGbl_InitEntries)
{
- AcpiOsPrintf ("%s\n", AcpiFormatException (Status));
- return;
+ return AE_NOT_FOUND;
}
- AcpiOsPrintf ("New value: 0x%8.8X%8.8X\n",
- ACPI_FORMAT_UINT64 (Value));
+ for (i = 0; i < AcpiGbl_InitFileLineCount; ++i)
+ {
+ if (!strcmp(AcpiGbl_InitEntries[i].Name, Pathname))
+ {
+ *Value = AcpiGbl_InitEntries[i].Value;
+ return AE_OK;
+ }
+ }
+ return AE_NOT_FOUND;
}
diff --git a/source/tools/acpiexec/aemain.c b/source/tools/acpiexec/aemain.c
index 2db2cef5d8ed..b1781b565861 100644
--- a/source/tools/acpiexec/aemain.c
+++ b/source/tools/acpiexec/aemain.c
@@ -199,6 +199,8 @@ BOOLEAN AcpiGbl_LoadTestTables = FALSE;
BOOLEAN AcpiGbl_AeLoadOnly = FALSE;
static UINT8 AcpiGbl_ExecutionMode = AE_MODE_COMMAND_LOOP;
static char BatchBuffer[AE_BUFFER_SIZE]; /* Batch command buffer */
+INIT_FILE_ENTRY *AcpiGbl_InitEntries = NULL;
+UINT32 AcpiGbl_InitFileLineCount = 0;
#define ACPIEXEC_NAME "AML Execution/Debug Utility"
#define AE_SUPPORTED_OPTIONS "?b:d:e:f^ghlm^rt^v^:x:"
@@ -677,6 +679,8 @@ main (
signal (SIGSEGV, AeSignalHandler);
}
+ AeProcessInitFile();
+
/* The remaining arguments are filenames for ACPI tables */
if (!argv[AcpiGbl_Optind])
@@ -785,12 +789,6 @@ main (
*/
AeInstallLateHandlers ();
- /*
- * This call implements the "initialization file" option for AcpiExec.
- * This is the precise point that we want to perform the overrides.
- */
- AeDoObjectOverrides ();
-
/* Finish the ACPICA initialization */
Status = AcpiInitializeObjects (InitFlags);
@@ -848,5 +846,6 @@ NormalExit:
ErrorExit:
(void) AcpiTerminate ();
AcDeleteTableList (ListHead);
+ AcpiOsFree (AcpiGbl_InitEntries);
return (ExitCode);
}
diff --git a/source/tools/acpiexec/aeregion.c b/source/tools/acpiexec/aeregion.c
index 56f939463c1e..5bad83591e65 100644
--- a/source/tools/acpiexec/aeregion.c
+++ b/source/tools/acpiexec/aeregion.c
@@ -234,9 +234,9 @@ AeRegionHandler (
SpaceId = RegionObject->Region.SpaceId;
ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
- "Operation Region request on %s at 0x%X\n",
+ "Operation Region request on %s at 0x%X, BitWidth 0x%X, RegionLength 0x%X\n",
AcpiUtGetRegionName (RegionObject->Region.SpaceId),
- (UINT32) Address));
+ (UINT32) Address, BitWidth, (UINT32) Length));
/*
* Region support can be disabled with the -do option.
@@ -410,7 +410,7 @@ AeRegionHandler (
if (AcpiGbl_DisplayRegionAccess)
{
AcpiOsPrintf ("AcpiExec: %s "
- "%s: Attr %X Addr %.4X BaseAddr %.4X Len %.2X Width %X BufLen %X",
+ "%s: Attr %X Addr %.4X BaseAddr %.4X Length %.2X BitWidth %X BufLen %X",
AcpiUtGetRegionName (SpaceId),
(Function & ACPI_IO_MASK) ? "Write" : "Read ",
(UINT32) (Function >> 16),
@@ -424,7 +424,7 @@ AeRegionHandler (
Status = AcpiBufferToResource (MyContext->Connection,
MyContext->Length, &Resource);
- AcpiOsPrintf (" [AccLen %.2X Conn %p]",
+ AcpiOsPrintf (" [AccessLength %.2X Connnection %p]",
MyContext->AccessLength, MyContext->Connection);
}
AcpiOsPrintf ("\n");