ACK: [PATCH] ACPICA: Update to version 20180810
Alex Hung
alex.hung at canonical.com
Fri Aug 10 20:02:38 UTC 2018
On 2018-08-10 09:49 AM, Colin King wrote:
> From: Colin Ian King <colin.king at canonical.com>
>
> changes in this release of ACPICA are detailed at the following
> link on the ACPICA developer mailing list:
>
> https://lists.acpica.org/pipermail/devel/2018-August/001819.html
>
> Signed-off-by: Colin Ian King <colin.king at canonical.com>
> ---
> src/acpica/Makefile.am | 1 +
> src/acpica/fwts_acpica.c | 3 +
> .../source/components/debugger/dbinput.c | 10 +-
> .../source/components/debugger/dbmethod.c | 7 +-
> .../source/components/debugger/dbxface.c | 10 +-
> .../source/components/dispatcher/dsfield.c | 26 ++++
> .../source/components/hardware/hwregs.c | 11 +-
> .../source/components/hardware/hwsleep.c | 19 ++-
> .../source/components/namespace/nsaccess.c | 16 ++
> src/acpica/source/components/parser/psloop.c | 41 ++++-
> src/acpica/source/components/tables/tbdata.c | 4 +-
> .../source/components/utilities/utdelete.c | 7 +-
> .../source/components/utilities/uterror.c | 6 +-
> .../source/components/utilities/utstrsuppt.c | 30 +++-
> .../source/components/utilities/utstrtoul64.c | 2 +-
> src/acpica/source/include/acconfig.h | 2 +-
> src/acpica/source/include/acexcep.h | 7 +
> src/acpica/source/include/aclocal.h | 1 +
> src/acpica/source/include/acnamesp.h | 17 +-
> src/acpica/source/include/acpixf.h | 2 +-
> src/acpica/source/include/acutils.h | 4 +
> src/acpica/source/tools/acpiexec/aecommon.h | 18 ++-
> src/acpica/source/tools/acpiexec/aeinitfile.c | 147 +++++++++++-------
> src/acpica/source/tools/acpiexec/aeregion.c | 8 +-
> 24 files changed, 301 insertions(+), 98 deletions(-)
>
> diff --git a/src/acpica/Makefile.am b/src/acpica/Makefile.am
> index 114c6a5f..73d10449 100644
> --- a/src/acpica/Makefile.am
> +++ b/src/acpica/Makefile.am
> @@ -26,6 +26,7 @@ AM_CPPFLAGS = \
> -D_LINUX -DNDEBUG -D_CONSOLE -DACPI_EXEC_APP \
> -I$(top_srcdir)/src/lib/include \
> -I$(srcdir)/source/include \
> + -I$(srcdir)/source/tools/acpiexec \
> `pkg-config --silence-errors --cflags json` \
> `pkg-config --silence-errors --cflags json-c` \
> -Wall -fno-strict-aliasing
> diff --git a/src/acpica/fwts_acpica.c b/src/acpica/fwts_acpica.c
> index d985e18a..1d7d1abb 100644
> --- a/src/acpica/fwts_acpica.c
> +++ b/src/acpica/fwts_acpica.c
> @@ -48,6 +48,7 @@
> #include "acinterp.h"
> #include "acapps.h"
> #include "amlresrc.h"
> +#include "aecommon.h"
>
> #define ACPI_MAX_INIT_TABLES (64) /* Number of ACPI tables */
>
> @@ -82,6 +83,8 @@ BOOLEAN AcpiGbl_AbortLoopOnTimeout = FALSE;
> BOOLEAN AcpiGbl_IgnoreErrors = FALSE;
> BOOLEAN AcpiGbl_VerboseHandlers = FALSE;
> UINT8 AcpiGbl_RegionFillValue = 0;
> +INIT_FILE_ENTRY *AcpiGbl_InitEntries = NULL;
> +UINT32 AcpiGbl_InitFileLineCount = 0;
>
> static ACPI_TABLE_DESC Tables[ACPI_MAX_INIT_TABLES]; /* ACPICA Table descriptors */
> static bool region_handler_called; /* Region handler tracking */
> diff --git a/src/acpica/source/components/debugger/dbinput.c b/src/acpica/source/components/debugger/dbinput.c
> index 75e7a37f..0daca95b 100644
> --- a/src/acpica/source/components/debugger/dbinput.c
> +++ b/src/acpica/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/src/acpica/source/components/debugger/dbmethod.c b/src/acpica/source/components/debugger/dbmethod.c
> index d6c6aa55..a030823c 100644
> --- a/src/acpica/source/components/debugger/dbmethod.c
> +++ b/src/acpica/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/src/acpica/source/components/debugger/dbxface.c b/src/acpica/source/components/debugger/dbxface.c
> index 0b964f69..c661b248 100644
> --- a/src/acpica/source/components/debugger/dbxface.c
> +++ b/src/acpica/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/src/acpica/source/components/dispatcher/dsfield.c b/src/acpica/source/components/dispatcher/dsfield.c
> index df770c1c..3db39fb8 100644
> --- a/src/acpica/source/components/dispatcher/dsfield.c
> +++ b/src/acpica/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/src/acpica/source/components/hardware/hwregs.c b/src/acpica/source/components/hardware/hwregs.c
> index c0deed33..ec106847 100644
> --- a/src/acpica/source/components/hardware/hwregs.c
> +++ b/src/acpica/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/src/acpica/source/components/hardware/hwsleep.c b/src/acpica/source/components/hardware/hwsleep.c
> index fe111872..7e435ace 100644
> --- a/src/acpica/source/components/hardware/hwsleep.c
> +++ b/src/acpica/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/src/acpica/source/components/namespace/nsaccess.c b/src/acpica/source/components/namespace/nsaccess.c
> index bf530d48..af97c51f 100644
> --- a/src/acpica/source/components/namespace/nsaccess.c
> +++ b/src/acpica/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/src/acpica/source/components/parser/psloop.c b/src/acpica/source/components/parser/psloop.c
> index fd6773c1..ef517b54 100644
> --- a/src/acpica/source/components/parser/psloop.c
> +++ b/src/acpica/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/src/acpica/source/components/tables/tbdata.c b/src/acpica/source/components/tables/tbdata.c
> index 61a2d340..7b44fc74 100644
> --- a/src/acpica/source/components/tables/tbdata.c
> +++ b/src/acpica/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/src/acpica/source/components/utilities/utdelete.c b/src/acpica/source/components/utilities/utdelete.c
> index 4565d8fa..da2e31ff 100644
> --- a/src/acpica/source/components/utilities/utdelete.c
> +++ b/src/acpica/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/src/acpica/source/components/utilities/uterror.c b/src/acpica/source/components/utilities/uterror.c
> index eca92f3b..67c22330 100644
> --- a/src/acpica/source/components/utilities/uterror.c
> +++ b/src/acpica/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/src/acpica/source/components/utilities/utstrsuppt.c b/src/acpica/source/components/utilities/utstrsuppt.c
> index 2e7232a3..b482da21 100644
> --- a/src/acpica/source/components/utilities/utstrsuppt.c
> +++ b/src/acpica/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/src/acpica/source/components/utilities/utstrtoul64.c b/src/acpica/source/components/utilities/utstrtoul64.c
> index 5bbf24fd..77190e10 100644
> --- a/src/acpica/source/components/utilities/utstrtoul64.c
> +++ b/src/acpica/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/src/acpica/source/include/acconfig.h b/src/acpica/source/include/acconfig.h
> index c5a67ca0..41f3dff0 100644
> --- a/src/acpica/source/include/acconfig.h
> +++ b/src/acpica/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/src/acpica/source/include/acexcep.h b/src/acpica/source/include/acexcep.h
> index 828f9fb9..ec2304c5 100644
> --- a/src/acpica/source/include/acexcep.h
> +++ b/src/acpica/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/src/acpica/source/include/aclocal.h b/src/acpica/source/include/aclocal.h
> index 58c09379..2e2bcd0d 100644
> --- a/src/acpica/source/include/aclocal.h
> +++ b/src/acpica/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/src/acpica/source/include/acnamesp.h b/src/acpica/source/include/acnamesp.h
> index 529fc6e7..1e3db8d1 100644
> --- a/src/acpica/source/include/acnamesp.h
> +++ b/src/acpica/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/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h
> index 110b375b..5097fcc1 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 0x20180629
> +#define ACPI_CA_VERSION 0x20180810
>
> #include "acconfig.h"
> #include "actypes.h"
> diff --git a/src/acpica/source/include/acutils.h b/src/acpica/source/include/acutils.h
> index 8dfce901..1f760884 100644
> --- a/src/acpica/source/include/acutils.h
> +++ b/src/acpica/source/include/acutils.h
> @@ -362,6 +362,10 @@ BOOLEAN
> AcpiUtDetectHexPrefix (
> char **String);
>
> +void
> +AcpiUtRemoveHexPrefix (
> + char **String);
> +
> BOOLEAN
> AcpiUtDetectOctalPrefix (
> char **String);
> diff --git a/src/acpica/source/tools/acpiexec/aecommon.h b/src/acpica/source/tools/acpiexec/aecommon.h
> index 233edc2b..8ada9021 100644
> --- a/src/acpica/source/tools/acpiexec/aecommon.h
> +++ b/src/acpica/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/src/acpica/source/tools/acpiexec/aeinitfile.c b/src/acpica/source/tools/acpiexec/aeinitfile.c
> index 804a2cbc..79b797e0 100644
> --- a/src/acpica/source/tools/acpiexec/aeinitfile.c
> +++ b/src/acpica/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,13 +236,18 @@ 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/src/acpica/source/tools/acpiexec/aeregion.c b/src/acpica/source/tools/acpiexec/aeregion.c
> index 56f93946..5bad8359 100644
> --- a/src/acpica/source/tools/acpiexec/aeregion.c
> +++ b/src/acpica/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");
>
Acked-by: Alex Hung <alex.hung at canonical.com>
More information about the fwts-devel
mailing list