[PATCH 2/4] acpica: use latest ACPICA source
Keng-Yu Lin
kengyu at canonical.com
Mon Jul 23 05:39:14 UTC 2012
On Wed, Jul 18, 2012 at 7:52 AM, Colin King <colin.king at canonical.com> wrote:
> From: Colin Ian King <colin.king at canonical.com>
>
> Update to ACPICA version 20120711, commit
> b9058029d3bd6216f594a3b5e70b2f6cba1052ad to get the latest
> goodness.
>
> Signed-off-by: Colin Ian King <colin.king at canonical.com>
> ---
> src/acpica/Makefile.am | 2 +
> src/acpica/source/common/adfile.c | 19 +-
> src/acpica/source/common/adwalk.c | 30 +-
> src/acpica/source/common/dmextern.c | 36 +-
> src/acpica/source/common/dmrestag.c | 21 +-
> src/acpica/source/compiler/Makefile.am | 1 +
> src/acpica/source/compiler/aslcompile.c | 121 ++++---
> src/acpica/source/compiler/aslcompiler.h | 9 +-
> src/acpica/source/compiler/aslcompiler.l | 1 +
> src/acpica/source/compiler/aslcompiler.y | 4 +-
> src/acpica/source/compiler/aslerror.c | 23 +-
> src/acpica/source/compiler/aslfiles.c | 126 ++++++-
> src/acpica/source/compiler/asllookup.c | 2 +-
> src/acpica/source/compiler/aslmain.c | 66 ++--
> src/acpica/source/compiler/aslmap.c | 1 +
> src/acpica/source/compiler/aslmessages.h | 11 +-
> src/acpica/source/compiler/aslstartup.c | 2 +-
> src/acpica/source/compiler/aslsupport.l | 52 ++-
> src/acpica/source/compiler/aslutils.c | 90 ++---
> src/acpica/source/compiler/dtio.c | 45 ++-
> src/acpica/source/compiler/dttemplate.c | 2 +-
> src/acpica/source/compiler/prscan.c | 2 +-
> src/acpica/source/compiler/prutils.c | 15 +-
> src/acpica/source/components/debugger/dbcmds.c | 120 ++++---
> src/acpica/source/components/debugger/dbdisply.c | 15 +-
> src/acpica/source/components/debugger/dbexec.c | 6 +-
> src/acpica/source/components/debugger/dbfileio.c | 13 +
> src/acpica/source/components/debugger/dbinput.c | 4 +-
> src/acpica/source/components/debugger/dbstats.c | 28 +-
> src/acpica/source/components/debugger/dbutils.c | 4 +-
> .../source/components/disassembler/dmopcode.c | 213 ++++++++++++
> src/acpica/source/components/disassembler/dmwalk.c | 55 +++-
> src/acpica/source/components/dispatcher/dsfield.c | 88 ++++-
> src/acpica/source/components/dispatcher/dsopcode.c | 14 +-
> src/acpica/source/components/dispatcher/dswload.c | 14 +
> src/acpica/source/components/dispatcher/dswload2.c | 14 +
> src/acpica/source/components/events/evgpe.c | 15 +-
> src/acpica/source/components/events/evgpeutil.c | 19 ++
> src/acpica/source/components/events/evmisc.c | 183 ++++-------
> src/acpica/source/components/events/evxface.c | 344 ++++++++++----------
> src/acpica/source/components/events/evxfgpe.c | 86 ++++-
> src/acpica/source/components/executer/exconfig.c | 2 +-
> src/acpica/source/components/executer/exdump.c | 24 +-
> src/acpica/source/components/executer/exprep.c | 4 +-
> src/acpica/source/components/executer/exresolv.c | 2 +-
> src/acpica/source/components/executer/exstore.c | 6 +-
> src/acpica/source/components/executer/exutils.c | 2 +-
> src/acpica/source/components/hardware/hwsleep.c | 25 --
> src/acpica/source/components/hardware/hwxfsleep.c | 8 +
> src/acpica/source/components/namespace/nspredef.c | 2 +-
> src/acpica/source/components/parser/psxface.c | 4 +-
> src/acpica/source/components/resources/rscreate.c | 6 +-
> src/acpica/source/components/resources/rsutils.c | 2 +-
> src/acpica/source/components/tables/tbfadt.c | 64 ++--
> src/acpica/source/components/tables/tbinstal.c | 5 +-
> src/acpica/source/components/tables/tbutils.c | 17 +-
> src/acpica/source/components/tables/tbxface.c | 159 +--------
> src/acpica/source/components/tables/tbxfroot.c | 2 +-
> src/acpica/source/components/utilities/utdecode.c | 62 +---
> src/acpica/source/components/utilities/utdelete.c | 21 +-
> src/acpica/source/components/utilities/utglobal.c | 9 +-
> src/acpica/source/components/utilities/utmisc.c | 81 +----
> src/acpica/source/components/utilities/utobject.c | 6 +-
> src/acpica/source/components/utilities/utresrc.c | 4 +-
> src/acpica/source/components/utilities/uttrack.c | 6 +-
> src/acpica/source/components/utilities/utxferror.c | 81 +++++
> src/acpica/source/include/acdebug.h | 5 +-
> src/acpica/source/include/acdisasm.h | 8 +
> src/acpica/source/include/acexcep.h | 5 +-
> src/acpica/source/include/acglobal.h | 22 +-
> src/acpica/source/include/aclocal.h | 45 ++-
> src/acpica/source/include/acmacros.h | 4 +-
> src/acpica/source/include/acobject.h | 15 +-
> src/acpica/source/include/acoutput.h | 4 +
> src/acpica/source/include/acpiosxf.h | 2 +-
> src/acpica/source/include/acpixf.h | 36 +-
> src/acpica/source/include/acpredef.h | 6 +-
> src/acpica/source/include/actbl1.h | 2 +-
> src/acpica/source/include/actypes.h | 7 +-
> src/acpica/source/include/acutils.h | 6 +-
> src/acpica/source/include/platform/acenv.h | 5 +-
> .../source/os_specific/service_layers/osunixxf.c | 31 +-
> src/acpica/source/tools/acpiexec/aecommon.h | 1 +
> src/acpica/source/tools/acpiexec/aehandlers.c | 163 ++++++++--
> 84 files changed, 1846 insertions(+), 1041 deletions(-)
>
> diff --git a/src/acpica/Makefile.am b/src/acpica/Makefile.am
> index 3187432..e2213d5 100644
> --- a/src/acpica/Makefile.am
> +++ b/src/acpica/Makefile.am
> @@ -175,6 +175,7 @@ libfwtsacpica_la_SOURCES = \
> $(ACPICA_COMP)/tables/tbutils.c \
> $(ACPICA_COMP)/tables/tbxface.c \
> $(ACPICA_COMP)/tables/tbxfroot.c \
> + $(ACPICA_COMP)/tables/tbxfload.c \
> $(ACPICA_COMP)/utilities/utaddress.c \
> $(ACPICA_COMP)/utilities/utalloc.c \
> $(ACPICA_COMP)/utilities/utcache.c \
> @@ -197,6 +198,7 @@ libfwtsacpica_la_SOURCES = \
> $(ACPICA_COMP)/utilities/utxferror.c \
> $(ACPICA_COMP)/utilities/utxface.c \
> $(ACPICA_COMP)/utilities/utdecode.c \
> + $(ACPICA_COMP)/utilities/utexcep.c \
> $(ACPICA_SRC)/tools/acpiexec/aehandlers.c
>
> libfwtsacpica_la_LIBADD = \
> diff --git a/src/acpica/source/common/adfile.c b/src/acpica/source/common/adfile.c
> index f4e33e2..36c3176 100644
> --- a/src/acpica/source/common/adfile.c
> +++ b/src/acpica/source/common/adfile.c
> @@ -370,20 +370,24 @@ FlSplitInputPathname (
> return (AE_NO_MEMORY);
> }
>
> - Substring = strrchr (DirectoryPath, '\\');
> + /* Convert backslashes to slashes in the entire path */
> +
> + UtConvertBackslashes (DirectoryPath);
> +
> + /* Backup to last slash or colon */
> +
> + Substring = strrchr (DirectoryPath, '/');
> if (!Substring)
> {
> - Substring = strrchr (DirectoryPath, '/');
> - if (!Substring)
> - {
> - Substring = strrchr (DirectoryPath, ':');
> - }
> + Substring = strrchr (DirectoryPath, ':');
> }
>
> + /* Extract the simple filename */
> +
> if (!Substring)
> {
> + Filename = FlStrdup (DirectoryPath);
> DirectoryPath[0] = 0;
> - Filename = FlStrdup (InputPath);
> }
> else
> {
> @@ -398,7 +402,6 @@ FlSplitInputPathname (
>
> *OutDirectoryPath = DirectoryPath;
> *OutFilename = Filename;
> -
> return (AE_OK);
> }
>
> diff --git a/src/acpica/source/common/adwalk.c b/src/acpica/source/common/adwalk.c
> index eeb61d8..00d9bb6 100644
> --- a/src/acpica/source/common/adwalk.c
> +++ b/src/acpica/source/common/adwalk.c
> @@ -593,6 +593,7 @@ AcpiDmFindOrphanDescending (
>
> if ((OpInfo->Class != AML_CLASS_EXECUTE) &&
> (OpInfo->Class != AML_CLASS_CREATE) &&
> + (OpInfo->ObjectType != ACPI_TYPE_LOCAL_ALIAS) &&
> (ParentOp->Common.AmlOpcode != AML_INT_METHODCALL_OP) &&
> !Op->Common.Node)
> {
> @@ -815,13 +816,23 @@ AcpiDmXrefDescendingOp (
>
> if (OpInfo->Flags & AML_NAMED)
> {
> - if ((Op->Common.AmlOpcode == AML_ALIAS_OP) ||
> - (Op->Common.AmlOpcode == AML_SCOPE_OP))
> + /*
> + * Only these two operators (Alias, Scope) refer to an existing
> + * name, it is the first argument
> + */
> + if (Op->Common.AmlOpcode == AML_ALIAS_OP)
> + {
> + ObjectType = ACPI_TYPE_ANY;
> +
> + NextOp = Op->Common.Value.Arg;
> + NextOp = NextOp->Common.Value.Arg;
> + if (NextOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP)
> + {
> + Path = NextOp->Common.Value.String;
> + }
> + }
> + else if (Op->Common.AmlOpcode == AML_SCOPE_OP)
> {
> - /*
> - * Only these two operators refer to an existing name,
> - * first argument
> - */
> Path = (char *) Op->Named.Path;
> }
> }
> @@ -829,6 +840,8 @@ AcpiDmXrefDescendingOp (
> {
> /* Referenced Buffer Name is the first child */
>
> + ObjectType = ACPI_TYPE_BUFFER; /* Change from TYPE_BUFFER_FIELD */
> +
> NextOp = Op->Common.Value.Arg;
> if (NextOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP)
> {
> @@ -855,6 +868,11 @@ AcpiDmXrefDescendingOp (
> Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY,
> ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
> WalkState, &Node);
> + if (ACPI_SUCCESS (Status) && (Node->Flags & ANOBJ_IS_EXTERNAL))
> + {
> + Status = AE_NOT_FOUND;
> + }
> +
> if (ACPI_FAILURE (Status))
> {
> if (Status == AE_NOT_FOUND)
> diff --git a/src/acpica/source/common/dmextern.c b/src/acpica/source/common/dmextern.c
> index 8b8402e..622db8a 100644
> --- a/src/acpica/source/common/dmextern.c
> +++ b/src/acpica/source/common/dmextern.c
> @@ -293,8 +293,10 @@ AcpiDmNormalizeParentPrefix (
> */
> ACPI_STRCAT (Fullpath, ParentPath);
>
> - /* Add dot separator (don't need dot if parent fullpath is a single "\") */
> -
> + /*
> + * Add dot separator
> + * (don't need dot if parent fullpath is a single backslash)
> + */
> if (ParentPath[1])
> {
> ACPI_STRCAT (Fullpath, ".");
> @@ -526,12 +528,12 @@ AcpiDmAddToExternalList (
>
> NewExternal->InternalPath = Path;
>
> - /* Link the new descriptor into the global list, ordered by string length */
> + /* Link the new descriptor into the global list, alphabetically ordered */
>
> NextExternal = AcpiGbl_ExternalList;
> while (NextExternal)
> {
> - if (NewExternal->Length <= NextExternal->Length)
> + if (AcpiUtStricmp (NewExternal->Path, NextExternal->Path) < 0)
> {
> if (PrevExternal)
> {
> @@ -580,7 +582,7 @@ AcpiDmAddExternalsToNamespace (
> {
> ACPI_STATUS Status;
> ACPI_NAMESPACE_NODE *Node;
> - ACPI_OPERAND_OBJECT *MethodDesc;
> + ACPI_OPERAND_OBJECT *ObjDesc;
> ACPI_EXTERNAL_LIST *External = AcpiGbl_ExternalList;
>
>
> @@ -599,13 +601,29 @@ AcpiDmAddExternalsToNamespace (
> "while adding external to namespace [%s]",
> External->Path));
> }
> - else if (External->Type == ACPI_TYPE_METHOD)
> +
> + else switch (External->Type)
> {
> + case ACPI_TYPE_METHOD:
> +
> /* For methods, we need to save the argument count */
>
> - MethodDesc = AcpiUtCreateInternalObject (ACPI_TYPE_METHOD);
> - MethodDesc->Method.ParamCount = (UINT8) External->Value;
> - Node->Object = MethodDesc;
> + ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_METHOD);
> + ObjDesc->Method.ParamCount = (UINT8) External->Value;
> + Node->Object = ObjDesc;
> + break;
> +
> + case ACPI_TYPE_REGION:
> +
> + /* Regions require a region sub-object */
> +
> + ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_REGION);
> + ObjDesc->Region.Node = Node;
> + Node->Object = ObjDesc;
> + break;
> +
> + default:
> + break;
> }
>
> External = External->Next;
> diff --git a/src/acpica/source/common/dmrestag.c b/src/acpica/source/common/dmrestag.c
> index 1f0c5fb..9afaad3 100644
> --- a/src/acpica/source/common/dmrestag.c
> +++ b/src/acpica/source/common/dmrestag.c
> @@ -145,6 +145,7 @@ AcpiDmGetResourceTag (
>
> static char *
> AcpiGetTagPathname (
> + ACPI_PARSE_OBJECT *Op,
> ACPI_NAMESPACE_NODE *BufferNode,
> ACPI_NAMESPACE_NODE *ResourceNode,
> UINT32 BitIndex);
> @@ -515,7 +516,6 @@ AcpiDmCheckResourceReference (
> ACPI_NAMESPACE_NODE *BufferNode;
> ACPI_NAMESPACE_NODE *ResourceNode;
> const ACPI_OPCODE_INFO *OpInfo;
> - char *Pathname;
> UINT32 BitIndex;
>
>
> @@ -591,14 +591,7 @@ AcpiDmCheckResourceReference (
>
> /* Translate the Index to a resource tag pathname */
>
> - Pathname = AcpiGetTagPathname (BufferNode, ResourceNode, BitIndex);
> - if (Pathname)
> - {
> - /* Complete the conversion of the Index to a symbol */
> -
> - IndexOp->Common.AmlOpcode = AML_INT_NAMEPATH_OP;
> - IndexOp->Common.Value.String = Pathname;
> - }
> + AcpiGetTagPathname (IndexOp, BufferNode, ResourceNode, BitIndex);
> }
>
>
> @@ -669,6 +662,7 @@ AcpiDmGetResourceNode (
>
> static char *
> AcpiGetTagPathname (
> + ACPI_PARSE_OBJECT *IndexOp,
> ACPI_NAMESPACE_NODE *BufferNode,
> ACPI_NAMESPACE_NODE *ResourceNode,
> UINT32 BitIndex)
> @@ -761,6 +755,15 @@ AcpiGetTagPathname (
>
> AcpiNsInternalizeName (Pathname, &InternalPath);
> ACPI_FREE (Pathname);
> +
> + /* Update the Op with the symbol */
> +
> + AcpiPsInitOp (IndexOp, AML_INT_NAMEPATH_OP);
> + IndexOp->Common.Value.String = InternalPath;
> +
> + /* We will need the tag later. Cheat by putting it in the Node field */
> +
> + IndexOp->Common.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Tag);
> return (InternalPath);
> }
>
> diff --git a/src/acpica/source/compiler/Makefile.am b/src/acpica/source/compiler/Makefile.am
> index cee1f4f..b7a72c9 100644
> --- a/src/acpica/source/compiler/Makefile.am
> +++ b/src/acpica/source/compiler/Makefile.am
> @@ -183,6 +183,7 @@ libfwtsiasl_la_SOURCES = \
> $(ACPICA_COMMON)/adfile.c \
> $(ACPICA_COMMON)/adisasm.c \
> $(ACPICA_COMMON)/adwalk.c \
> + $(ACPICA_COMMON)/ahpredef.c \
> $(ACPICA_COMMON)/dmextern.c \
> $(ACPICA_COMMON)/dmrestag.c \
> $(ACPICA_COMMON)/dmtable.c \
> diff --git a/src/acpica/source/compiler/aslcompile.c b/src/acpica/source/compiler/aslcompile.c
> index 371a6e3..623bc3d 100644
> --- a/src/acpica/source/compiler/aslcompile.c
> +++ b/src/acpica/source/compiler/aslcompile.c
> @@ -131,14 +131,18 @@ CmFlushSourceCode (
>
> static void
> FlConsumeAnsiComment (
> - ASL_FILE_INFO *FileInfo,
> + FILE *Handle,
> ASL_FILE_STATUS *Status);
>
> static void
> FlConsumeNewComment (
> - ASL_FILE_INFO *FileInfo,
> + FILE *Handle,
> ASL_FILE_STATUS *Status);
>
> +static void
> +CmDumpAllEvents (
> + void);
> +
>
> /*******************************************************************************
> *
> @@ -325,7 +329,8 @@ CmFlushSourceCode (
> *
> * FUNCTION: FlConsume*
> *
> - * PARAMETERS: FileInfo - Points to an open input file
> + * PARAMETERS: Handle - Open input file
> + * Status - File current status struct
> *
> * RETURN: Number of lines consumed
> *
> @@ -335,14 +340,14 @@ CmFlushSourceCode (
>
> static void
> FlConsumeAnsiComment (
> - ASL_FILE_INFO *FileInfo,
> + FILE *Handle,
> ASL_FILE_STATUS *Status)
> {
> UINT8 Byte;
> BOOLEAN ClosingComment = FALSE;
>
>
> - while (fread (&Byte, 1, 1, FileInfo->Handle))
> + while (fread (&Byte, 1, 1, Handle))
> {
> /* Scan until comment close is found */
>
> @@ -379,13 +384,13 @@ FlConsumeAnsiComment (
>
> static void
> FlConsumeNewComment (
> - ASL_FILE_INFO *FileInfo,
> + FILE *Handle,
> ASL_FILE_STATUS *Status)
> {
> UINT8 Byte;
>
>
> - while (fread (&Byte, 1, 1, FileInfo->Handle))
> + while (fread (&Byte, 1, 1, Handle))
> {
> Status->Offset++;
>
> @@ -404,7 +409,9 @@ FlConsumeNewComment (
> *
> * FUNCTION: FlCheckForAscii
> *
> - * PARAMETERS: FileInfo - Points to an open input file
> + * PARAMETERS: Handle - Open input file
> + * Filename - Input filename
> + * DisplayErrors - TRUE if error messages desired
> *
> * RETURN: Status
> *
> @@ -419,7 +426,9 @@ FlConsumeNewComment (
>
> ACPI_STATUS
> FlCheckForAscii (
> - ASL_FILE_INFO *FileInfo)
> + FILE *Handle,
> + char *Filename,
> + BOOLEAN DisplayErrors)
> {
> UINT8 Byte;
> ACPI_SIZE BadBytes = 0;
> @@ -432,7 +441,7 @@ FlCheckForAscii (
>
> /* Read the entire file */
>
> - while (fread (&Byte, 1, 1, FileInfo->Handle))
> + while (fread (&Byte, 1, 1, Handle))
> {
> /* Ignore comment fields (allow non-ascii within) */
>
> @@ -442,12 +451,12 @@ FlCheckForAscii (
>
> if (Byte == '*')
> {
> - FlConsumeAnsiComment (FileInfo, &Status);
> + FlConsumeAnsiComment (Handle, &Status);
> }
>
> if (Byte == '/')
> {
> - FlConsumeNewComment (FileInfo, &Status);
> + FlConsumeNewComment (Handle, &Status);
> }
>
> /* Reset */
> @@ -463,7 +472,7 @@ FlCheckForAscii (
>
> if (!ACPI_IS_ASCII (Byte))
> {
> - if (BadBytes < 10)
> + if ((BadBytes < 10) && (DisplayErrors))
> {
> AcpiOsPrintf (
> "Non-ASCII character [0x%2.2X] found in line %u, file offset 0x%.2X\n",
> @@ -485,20 +494,24 @@ FlCheckForAscii (
>
> /* Seek back to the beginning of the source file */
>
> - fseek (FileInfo->Handle, 0, SEEK_SET);
> + fseek (Handle, 0, SEEK_SET);
>
> /* Were there any non-ASCII characters in the file? */
>
> if (BadBytes)
> {
> - AcpiOsPrintf (
> - "%u non-ASCII characters found in input source text, could be a binary file\n",
> - BadBytes);
> - AslError (ASL_ERROR, ASL_MSG_NON_ASCII, NULL, FileInfo->Filename);
> + if (DisplayErrors)
> + {
> + AcpiOsPrintf (
> + "%u non-ASCII characters found in input source text, could be a binary file\n",
> + BadBytes);
> + AslError (ASL_ERROR, ASL_MSG_NON_ASCII, NULL, Filename);
> + }
> +
> return (AE_BAD_CHARACTER);
> }
>
> - /* File is OK */
> + /* File is OK (100% ASCII) */
>
> return (AE_OK);
> }
> @@ -780,45 +793,65 @@ CmDoOutputFiles (
>
> /*******************************************************************************
> *
> - * FUNCTION: CmDumpEvent
> + * FUNCTION: CmDumpAllEvents
> *
> - * PARAMETERS: Event - A compiler event struct
> + * PARAMETERS: None
> *
> * RETURN: None.
> *
> - * DESCRIPTION: Dump a compiler event struct
> + * DESCRIPTION: Dump all compiler events
> *
> ******************************************************************************/
>
> static void
> -CmDumpEvent (
> - ASL_EVENT_INFO *Event)
> +CmDumpAllEvents (
> + void)
> {
> + ASL_EVENT_INFO *Event;
> UINT32 Delta;
> UINT32 USec;
> UINT32 MSec;
> + UINT32 i;
>
> - if (!Event->Valid)
> +
> + Event = AslGbl_Events;
> +
> + DbgPrint (ASL_DEBUG_OUTPUT, "\n\nElapsed time for major events\n\n");
> + if (Gbl_CompileTimesFlag)
> {
> - return;
> + printf ("\nElapsed time for major events\n\n");
> }
>
> - /* Delta will be in 100-nanosecond units */
> + for (i = 0; i < AslGbl_NextEvent; i++)
> + {
> + if (Event->Valid)
> + {
> + /* Delta will be in 100-nanosecond units */
>
> - Delta = (UINT32) (Event->EndTime - Event->StartTime);
> + Delta = (UINT32) (Event->EndTime - Event->StartTime);
>
> - USec = Delta / 10;
> - MSec = Delta / 10000;
> + USec = Delta / 10;
> + MSec = Delta / 10000;
>
> - /* Round milliseconds up */
> + /* Round milliseconds up */
>
> - if ((USec - (MSec * 1000)) >= 500)
> - {
> - MSec++;
> - }
> + if ((USec - (MSec * 1000)) >= 500)
> + {
> + MSec++;
> + }
>
> - DbgPrint (ASL_DEBUG_OUTPUT, "%8u usec %8u msec - %s\n",
> - USec, MSec, Event->EventName);
> + DbgPrint (ASL_DEBUG_OUTPUT, "%8u usec %8u msec - %s\n",
> + USec, MSec, Event->EventName);
> +
> + if (Gbl_CompileTimesFlag)
> + {
> + printf ("%8u usec %8u msec - %s\n",
> + USec, MSec, Event->EventName);
> + }
> + }
> +
> + Event++;
> + }
> }
>
>
> @@ -849,20 +882,12 @@ CmCleanupAndExit (
> AePrintErrorLog (ASL_FILE_STDOUT);
> }
>
> - DbgPrint (ASL_DEBUG_OUTPUT, "\n\nElapsed time for major events\n\n");
> - for (i = 0; i < AslGbl_NextEvent; i++)
> - {
> - CmDumpEvent (&AslGbl_Events[i]);
> - }
> + /* Emit compile times if enabled */
> +
> + CmDumpAllEvents ();
>
> if (Gbl_CompileTimesFlag)
> {
> - printf ("\nElapsed time for major events\n\n");
> - for (i = 0; i < AslGbl_NextEvent; i++)
> - {
> - CmDumpEvent (&AslGbl_Events[i]);
> - }
> -
> printf ("\nMiscellaneous compile statistics\n\n");
> printf ("%11u : %s\n", TotalParseNodes, "Parse nodes");
> printf ("%11u : %s\n", Gbl_NsLookupCount, "Namespace searches");
> diff --git a/src/acpica/source/compiler/aslcompiler.h b/src/acpica/source/compiler/aslcompiler.h
> index 29558fc..03303f5 100644
> --- a/src/acpica/source/compiler/aslcompiler.h
> +++ b/src/acpica/source/compiler/aslcompiler.h
> @@ -238,7 +238,9 @@ CmCleanupAndExit (
>
> ACPI_STATUS
> FlCheckForAscii (
> - ASL_FILE_INFO *FileInfo);
> + FILE *Handle,
> + char *Filename,
> + BOOLEAN DisplayErrors);
>
>
> /*
> @@ -680,6 +682,11 @@ void
> FlAddIncludeDirectory (
> char *Dir);
>
> +char *
> +FlMergePathnames (
> + char *PrefixDir,
> + char *FilePathname);
> +
> void
> FlOpenIncludeFile (
> ACPI_PARSE_OBJECT *Op);
> diff --git a/src/acpica/source/compiler/aslcompiler.l b/src/acpica/source/compiler/aslcompiler.l
> index f911072..98f9e7e 100644
> --- a/src/acpica/source/compiler/aslcompiler.l
> +++ b/src/acpica/source/compiler/aslcompiler.l
> @@ -595,6 +595,7 @@ NamePathTail [.]{NameSeg}
> "IPMI" { count (0); return (PARSEOP_REGIONSPACE_IPMI); }
> "GeneralPurposeIo" { count (0); return (PARSEOP_REGIONSPACE_GPIO); } /* ACPI 5.0 */
> "GenericSerialBus" { count (0); return (PARSEOP_REGIONSPACE_GSBUS); } /* ACPI 5.0 */
> +"PCC" { count (0); return (PARSEOP_REGIONSPACE_PCC); } /* ACPI 5.0 */
> "FFixedHW" { count (0); return (PARSEOP_REGIONSPACE_FFIXEDHW); }
>
> /* ResourceTypeKeyword: Resource Usage - Resource Descriptors */
> diff --git a/src/acpica/source/compiler/aslcompiler.y b/src/acpica/source/compiler/aslcompiler.y
> index 9aa8b51..9675b1d 100644
> --- a/src/acpica/source/compiler/aslcompiler.y
> +++ b/src/acpica/source/compiler/aslcompiler.y
> @@ -435,6 +435,7 @@ void * AslLocalAllocate (unsigned int Size);
> %token <i> PARSEOP_REGIONSPACE_IO
> %token <i> PARSEOP_REGIONSPACE_IPMI
> %token <i> PARSEOP_REGIONSPACE_MEM
> +%token <i> PARSEOP_REGIONSPACE_PCC
> %token <i> PARSEOP_REGIONSPACE_PCI
> %token <i> PARSEOP_REGIONSPACE_PCIBAR
> %token <i> PARSEOP_REGIONSPACE_SMBUS
> @@ -2271,7 +2272,7 @@ AddressKeyword
> ;
>
> AddressSpaceKeyword
> - : ByteConst {$$ = UtCheckIntegerRange ($1, 0x80, 0xFF);}
> + : ByteConst {$$ = UtCheckIntegerRange ($1, 0x0A, 0xFF);}
> | RegionSpaceKeyword {}
> ;
>
> @@ -2431,6 +2432,7 @@ RegionSpaceKeyword
> | PARSEOP_REGIONSPACE_IPMI {$$ = TrCreateLeafNode (PARSEOP_REGIONSPACE_IPMI);}
> | PARSEOP_REGIONSPACE_GPIO {$$ = TrCreateLeafNode (PARSEOP_REGIONSPACE_GPIO);}
> | PARSEOP_REGIONSPACE_GSBUS {$$ = TrCreateLeafNode (PARSEOP_REGIONSPACE_GSBUS);}
> + | PARSEOP_REGIONSPACE_PCC {$$ = TrCreateLeafNode (PARSEOP_REGIONSPACE_PCC);}
> | PARSEOP_REGIONSPACE_FFIXEDHW {$$ = TrCreateLeafNode (PARSEOP_REGIONSPACE_FFIXEDHW);}
> ;
>
> diff --git a/src/acpica/source/compiler/aslerror.c b/src/acpica/source/compiler/aslerror.c
> index c93a1a2..4d7c846 100644
> --- a/src/acpica/source/compiler/aslerror.c
> +++ b/src/acpica/source/compiler/aslerror.c
> @@ -387,12 +387,16 @@ AePrintException (
> }
> else
> {
> + /*
> + * Less verbose version of the error message, enabled via the
> + * -vi switch. The format is compatible with MS Visual Studio.
> + */
> fprintf (OutputFile, "%s", Enode->Filename);
>
> if (Enode->LineNumber)
> {
> - fprintf (OutputFile, "(%u) i:%6u : ",
> - Enode->LineNumber, Enode->LineNumber);
> + fprintf (OutputFile, "(%u) : ",
> + Enode->LineNumber);
> }
> }
> }
> @@ -407,9 +411,18 @@ AePrintException (
> {
> /* Decode the message ID */
>
> - fprintf (OutputFile, "%s %4.4d - ",
> - AslErrorLevel[Enode->Level],
> - Enode->MessageId + ((Enode->Level+1) * 1000));
> + if (Gbl_VerboseErrors)
> + {
> + fprintf (OutputFile, "%s %4.4d -",
> + AslErrorLevel[Enode->Level],
> + Enode->MessageId + ((Enode->Level+1) * 1000));
> + }
> + else /* IDE case */
> + {
> + fprintf (OutputFile, "%s %4.4d:",
> + AslErrorLevelIde[Enode->Level],
> + Enode->MessageId + ((Enode->Level+1) * 1000));
> + }
>
> MainMessage = AslMessages[Enode->MessageId];
> ExtraMessage = Enode->Message;
> diff --git a/src/acpica/source/compiler/aslfiles.c b/src/acpica/source/compiler/aslfiles.c
> index ef10668..a2512a6 100644
> --- a/src/acpica/source/compiler/aslfiles.c
> +++ b/src/acpica/source/compiler/aslfiles.c
> @@ -564,6 +564,107 @@ FlAddIncludeDirectory (
>
> /*******************************************************************************
> *
> + * FUNCTION: FlMergePathnames
> + *
> + * PARAMETERS: PrefixDir - Prefix directory pathname. Can be NULL or
> + * a zero length string.
> + * FilePathname - The include filename from the source ASL.
> + *
> + * RETURN: Merged pathname string
> + *
> + * DESCRIPTION: Merge two pathnames that (probably) have common elements, to
> + * arrive at a minimal length string. Merge can occur if the
> + * FilePathname is relative to the PrefixDir.
> + *
> + ******************************************************************************/
> +
> +char *
> +FlMergePathnames (
> + char *PrefixDir,
> + char *FilePathname)
> +{
> + char *CommonPath;
> + char *Pathname;
> + char *LastElement;
> +
> +
> + DbgPrint (ASL_PARSE_OUTPUT, "Include: Prefix path - \"%s\"\n"
> + "Include: FilePathname - \"%s\"\n",
> + PrefixDir, FilePathname);
> +
> + /*
> + * If there is no prefix directory or if the file pathname is absolute,
> + * just return the original file pathname
> + */
> + if (!PrefixDir || (!*PrefixDir) ||
> + (*FilePathname == '/') ||
> + (FilePathname[1] == ':'))
> + {
> + Pathname = ACPI_ALLOCATE (strlen (FilePathname) + 1);
> + strcpy (Pathname, FilePathname);
> + goto ConvertBackslashes;
> + }
> +
> + /* Need a local copy of the prefix directory path */
> +
> + CommonPath = ACPI_ALLOCATE (strlen (PrefixDir) + 1);
> + strcpy (CommonPath, PrefixDir);
> +
> + /*
> + * Walk forward through the file path, and simultaneously backward
> + * through the prefix directory path until there are no more
> + * relative references at the start of the file path.
> + */
> + while (*FilePathname && (!strncmp (FilePathname, "../", 3)))
> + {
> + /* Remove last element of the prefix directory path */
> +
> + LastElement = strrchr (CommonPath, '/');
> + if (!LastElement)
> + {
> + goto ConcatenatePaths;
> + }
> +
> + *LastElement = 0; /* Terminate CommonPath string */
> + FilePathname += 3; /* Point to next path element */
> + }
> +
> + /*
> + * Remove the last element of the prefix directory path (it is the same as
> + * the first element of the file pathname), and build the final merged
> + * pathname.
> + */
> + LastElement = strrchr (CommonPath, '/');
> + if (LastElement)
> + {
> + *LastElement = 0;
> + }
> +
> + /* Build the final merged pathname */
> +
> +ConcatenatePaths:
> + Pathname = ACPI_ALLOCATE_ZEROED (strlen (CommonPath) + strlen (FilePathname) + 2);
> + if (LastElement && *CommonPath)
> + {
> + strcpy (Pathname, CommonPath);
> + strcat (Pathname, "/");
> + }
> + strcat (Pathname, FilePathname);
> + ACPI_FREE (CommonPath);
> +
> + /* Convert all backslashes to normal slashes */
> +
> +ConvertBackslashes:
> + UtConvertBackslashes (Pathname);
> +
> + DbgPrint (ASL_PARSE_OUTPUT, "Include: Merged Pathname - \"%s\"\n",
> + Pathname);
> + return (Pathname);
> +}
> +
> +
> +/*******************************************************************************
> + *
> * FUNCTION: FlOpenIncludeWithPrefix
> *
> * PARAMETERS: PrefixDir - Prefix directory pathname. Can be a zero
> @@ -587,12 +688,9 @@ FlOpenIncludeWithPrefix (
>
> /* Build the full pathname to the file */
>
> - Pathname = ACPI_ALLOCATE (strlen (PrefixDir) + strlen (Filename) + 1);
> -
> - strcpy (Pathname, PrefixDir);
> - strcat (Pathname, Filename);
> + Pathname = FlMergePathnames (PrefixDir, Filename);
>
> - DbgPrint (ASL_PARSE_OUTPUT, "\nAttempt to open include file: path %s\n\n",
> + DbgPrint (ASL_PARSE_OUTPUT, "Include: Opening file - \"%s\"\n\n",
> Pathname);
>
> /* Attempt to open the file, push if successful */
> @@ -728,7 +826,7 @@ FlOpenInputFile (
>
> /* Open the input ASL file, text mode */
>
> - FlOpenFile (ASL_FILE_INPUT, InputFilename, "r");
> + FlOpenFile (ASL_FILE_INPUT, InputFilename, "rt");
> AslCompilerin = Gbl_Files[ASL_FILE_INPUT].Handle;
>
> return (AE_OK);
> @@ -812,7 +910,7 @@ FlOpenMiscOutputFiles (
>
> /* Open the hex file, text mode */
>
> - FlOpenFile (ASL_FILE_HEX_OUTPUT, Filename, "w+");
> + FlOpenFile (ASL_FILE_HEX_OUTPUT, Filename, "w+t");
>
> AslCompilerSignon (ASL_FILE_HEX_OUTPUT);
> AslCompilerFileHeader (ASL_FILE_HEX_OUTPUT);
> @@ -863,7 +961,7 @@ FlOpenMiscOutputFiles (
>
> /* Open the listing file, text mode */
>
> - FlOpenFile (ASL_FILE_LISTING_OUTPUT, Filename, "w+");
> + FlOpenFile (ASL_FILE_LISTING_OUTPUT, Filename, "w+t");
>
> AslCompilerSignon (ASL_FILE_LISTING_OUTPUT);
> AslCompilerFileHeader (ASL_FILE_LISTING_OUTPUT);
> @@ -881,7 +979,7 @@ FlOpenMiscOutputFiles (
> return (AE_ERROR);
> }
>
> - FlOpenFile (ASL_FILE_PREPROCESSOR, Filename, "w+b");
> + FlOpenFile (ASL_FILE_PREPROCESSOR, Filename, "w+t");
> }
>
> /* All done for data table compiler */
> @@ -926,7 +1024,7 @@ FlOpenMiscOutputFiles (
>
> /* Open the assembly code source file, text mode */
>
> - FlOpenFile (ASL_FILE_ASM_SOURCE_OUTPUT, Filename, "w+");
> + FlOpenFile (ASL_FILE_ASM_SOURCE_OUTPUT, Filename, "w+t");
>
> AslCompilerSignon (ASL_FILE_ASM_SOURCE_OUTPUT);
> AslCompilerFileHeader (ASL_FILE_ASM_SOURCE_OUTPUT);
> @@ -946,7 +1044,7 @@ FlOpenMiscOutputFiles (
>
> /* Open the C code source file, text mode */
>
> - FlOpenFile (ASL_FILE_C_SOURCE_OUTPUT, Filename, "w+");
> + FlOpenFile (ASL_FILE_C_SOURCE_OUTPUT, Filename, "w+t");
>
> FlPrintFile (ASL_FILE_C_SOURCE_OUTPUT, "/*\n");
> AslCompilerSignon (ASL_FILE_C_SOURCE_OUTPUT);
> @@ -967,7 +1065,7 @@ FlOpenMiscOutputFiles (
>
> /* Open the assembly include file, text mode */
>
> - FlOpenFile (ASL_FILE_ASM_INCLUDE_OUTPUT, Filename, "w+");
> + FlOpenFile (ASL_FILE_ASM_INCLUDE_OUTPUT, Filename, "w+t");
>
> AslCompilerSignon (ASL_FILE_ASM_INCLUDE_OUTPUT);
> AslCompilerFileHeader (ASL_FILE_ASM_INCLUDE_OUTPUT);
> @@ -987,7 +1085,7 @@ FlOpenMiscOutputFiles (
>
> /* Open the C include file, text mode */
>
> - FlOpenFile (ASL_FILE_C_INCLUDE_OUTPUT, Filename, "w+");
> + FlOpenFile (ASL_FILE_C_INCLUDE_OUTPUT, Filename, "w+t");
>
> FlPrintFile (ASL_FILE_C_INCLUDE_OUTPUT, "/*\n");
> AslCompilerSignon (ASL_FILE_C_INCLUDE_OUTPUT);
> @@ -1008,7 +1106,7 @@ FlOpenMiscOutputFiles (
>
> /* Open the namespace file, text mode */
>
> - FlOpenFile (ASL_FILE_NAMESPACE_OUTPUT, Filename, "w+");
> + FlOpenFile (ASL_FILE_NAMESPACE_OUTPUT, Filename, "w+t");
>
> AslCompilerSignon (ASL_FILE_NAMESPACE_OUTPUT);
> AslCompilerFileHeader (ASL_FILE_NAMESPACE_OUTPUT);
> diff --git a/src/acpica/source/compiler/asllookup.c b/src/acpica/source/compiler/asllookup.c
> index 0d92c91..8f8dc5d 100644
> --- a/src/acpica/source/compiler/asllookup.c
> +++ b/src/acpica/source/compiler/asllookup.c
> @@ -1170,7 +1170,7 @@ LkNamespaceLocateBegin (
>
> if (Message)
> {
> - sprintf (MsgBuffer, "Tag: %u bit%s, Field: %u bit%s",
> + sprintf (MsgBuffer, "Size mismatch, Tag: %u bit%s, Field: %u bit%s",
> TagBitLength, (TagBitLength > 1) ? "s" : "",
> FieldBitLength, (FieldBitLength > 1) ? "s" : "");
>
> diff --git a/src/acpica/source/compiler/aslmain.c b/src/acpica/source/compiler/aslmain.c
> index 285d765..efd5906 100644
> --- a/src/acpica/source/compiler/aslmain.c
> +++ b/src/acpica/source/compiler/aslmain.c
> @@ -135,7 +135,7 @@ Options (
> void);
>
> static void
> -HelpMessage (
> +FilenameHelp (
> void);
>
> static void
> @@ -168,7 +168,7 @@ AslDoResponseFile (
>
>
> #define ASL_TOKEN_SEPARATORS " \t\n"
> -#define ASL_SUPPORTED_OPTIONS "@:2b|c|d^D:e:fgh^i|I:l^mno|p:P^r:s|t|T:G^v|w|x:z"
> +#define ASL_SUPPORTED_OPTIONS "@:2b|c|d^D:e:fgh^i|I:l^mno|p:P^r:s|t|T:G^v^w|x:z"
>
>
> /*******************************************************************************
> @@ -191,6 +191,7 @@ Options (
> printf ("\nGlobal:\n");
> ACPI_OPTION ("-@ <file>", "Specify command file");
> ACPI_OPTION ("-I <dir>", "Specify additional include directory");
> + ACPI_OPTION ("-v", "Display compiler version");
>
> printf ("\nPreprocessor:\n");
> ACPI_OPTION ("-D <symbol>", "Define symbol for preprocessor use");
> @@ -242,27 +243,36 @@ Options (
> ACPI_OPTION ("-g", "Get ACPI tables and write to files (*.dat)");
>
> printf ("\nHelp:\n");
> - ACPI_OPTION ("-h", "Additional help and compiler debug options");
> + ACPI_OPTION ("-h", "This message");
> ACPI_OPTION ("-hc", "Display operators allowed in constant expressions");
> + ACPI_OPTION ("-hf", "Display help for output filename generation");
> ACPI_OPTION ("-hr", "Display ACPI reserved method names");
> ACPI_OPTION ("-ht", "Display currently supported ACPI table names");
> +
> + printf ("\nDebug Options:\n");
> + ACPI_OPTION ("-bf -bt", "Create debug file (full or parse tree only) (*.txt)");
> + ACPI_OPTION ("-f", "Ignore errors, force creation of AML output file(s)");
> + ACPI_OPTION ("-n", "Parse only, no output generation");
> + ACPI_OPTION ("-ot", "Display compile times and statistics");
> + ACPI_OPTION ("-x <level>", "Set debug level for trace output");
> + ACPI_OPTION ("-z", "Do not insert new compiler ID for DataTables");
> }
>
>
> /*******************************************************************************
> *
> - * FUNCTION: HelpMessage
> + * FUNCTION: FilenameHelp
> *
> * PARAMETERS: None
> *
> * RETURN: None
> *
> - * DESCRIPTION: Display help message
> + * DESCRIPTION: Display help message for output filename generation
> *
> ******************************************************************************/
>
> static void
> -HelpMessage (
> +FilenameHelp (
> void)
> {
>
> @@ -274,17 +284,6 @@ HelpMessage (
> printf (" 2) The prefix of the AMLFileName in the ASL Definition Block\n");
> printf (" 3) The prefix of the input filename\n");
> printf ("\n");
> -
> - Options ();
> -
> - printf ("\nCompiler/Disassembler Debug Options:\n");
> - ACPI_OPTION ("-bb -bp -bt", "Create compiler debug/trace file (*.txt)");
> - ACPI_OPTION ("", "Types: Parse/Tree/Both");
> - ACPI_OPTION ("-f", "Ignore errors, force creation of AML output file(s)");
> - ACPI_OPTION ("-n", "Parse only, no output generation");
> - ACPI_OPTION ("-ot", "Display compile times");
> - ACPI_OPTION ("-x <level>", "Set debug level for trace output");
> - ACPI_OPTION ("-z", "Do not insert new compiler ID for DataTables");
> }
>
>
> @@ -502,13 +501,7 @@ AslDoOptions (
> case 'b': /* Debug output options */
> switch (AcpiGbl_Optarg[0])
> {
> - case 'b':
> - AslCompilerdebug = 1; /* same as yydebug */
> - DtParserdebug = 1;
> - PrParserdebug = 1;
> - break;
> -
> - case 'p':
> + case 'f':
> AslCompilerdebug = 1; /* same as yydebug */
> DtParserdebug = 1;
> PrParserdebug = 1;
> @@ -602,13 +595,17 @@ AslDoOptions (
> switch (AcpiGbl_Optarg[0])
> {
> case '^':
> - HelpMessage ();
> + Usage ();
> exit (0);
>
> case 'c':
> UtDisplayConstantOpcodes ();
> exit (0);
>
> + case 'f':
> + FilenameHelp ();
> + exit (0);
> +
> case 'r':
> /* reserved names */
>
> @@ -827,9 +824,13 @@ AslDoOptions (
> break;
>
>
> - case 'v': /* Verbosity settings */
> + case 'v': /* Version and verbosity settings */
> switch (AcpiGbl_Optarg[0])
> {
> + case '^':
> + printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
> + exit (0);
> +
> case 'a':
> /* Disable All error/warning messages */
>
> @@ -837,9 +838,18 @@ AslDoOptions (
> break;
>
> case 'i':
> - /* Less verbose error messages */
> -
> + /*
> + * Support for integrated development environment(s).
> + *
> + * 1) No compiler signon
> + * 2) Send stderr messages to stdout
> + * 3) Less verbose error messages (single line only for each)
> + * 4) Error/warning messages are formatted appropriately to
> + * be recognized by MS Visual Studio
> + */
> Gbl_VerboseErrors = FALSE;
> + Gbl_DoSignon = FALSE;
> + Gbl_Files[ASL_FILE_STDERR].Handle = stdout;
> break;
>
> case 'o':
> diff --git a/src/acpica/source/compiler/aslmap.c b/src/acpica/source/compiler/aslmap.c
> index 498ca42..c276972 100644
> --- a/src/acpica/source/compiler/aslmap.c
> +++ b/src/acpica/source/compiler/aslmap.c
> @@ -439,6 +439,7 @@ const ASL_MAPPING_ENTRY AslKeywordMapping [] =
> /* REGIONSPACE_IO */ OP_TABLE_ENTRY (AML_RAW_DATA_BYTE, ACPI_ADR_SPACE_SYSTEM_IO, 0, 0),
> /* REGIONSPACE_IPMI */ OP_TABLE_ENTRY (AML_RAW_DATA_BYTE, ACPI_ADR_SPACE_IPMI, 0, 0),
> /* REGIONSPACE_MEM */ OP_TABLE_ENTRY (AML_RAW_DATA_BYTE, ACPI_ADR_SPACE_SYSTEM_MEMORY, 0, 0),
> +/* REGIONSPACE_PCC */ OP_TABLE_ENTRY (AML_RAW_DATA_BYTE, ACPI_ADR_SPACE_PLATFORM_COMM, 0, 0),
> /* REGIONSPACE_PCI */ OP_TABLE_ENTRY (AML_RAW_DATA_BYTE, ACPI_ADR_SPACE_PCI_CONFIG, 0, 0),
> /* REGIONSPACE_PCIBAR */ OP_TABLE_ENTRY (AML_RAW_DATA_BYTE, ACPI_ADR_SPACE_PCI_BAR_TARGET, 0, 0),
> /* REGIONSPACE_SMBUS */ OP_TABLE_ENTRY (AML_RAW_DATA_BYTE, ACPI_ADR_SPACE_SMBUS, 0, 0),
> diff --git a/src/acpica/source/compiler/aslmessages.h b/src/acpica/source/compiler/aslmessages.h
> index 4e5bb31..56951bc 100644
> --- a/src/acpica/source/compiler/aslmessages.h
> +++ b/src/acpica/source/compiler/aslmessages.h
> @@ -474,7 +474,7 @@ char *AslMessages [] = {
> };
>
>
> -char *AslErrorLevel [ASL_NUM_REPORT_LEVELS] = {
> +const char *AslErrorLevel [ASL_NUM_REPORT_LEVELS] = {
> "Warning ",
> "Warning ",
> "Warning ",
> @@ -483,6 +483,15 @@ char *AslErrorLevel [ASL_NUM_REPORT_LEVELS] = {
> "Optimize"
> };
>
> +const char *AslErrorLevelIde [ASL_NUM_REPORT_LEVELS] = {
> + "warning ",
> + "warning ",
> + "warning ",
> + "error ",
> + "remark ",
> + "optimize"
> +};
> +
> #define ASL_ERROR_LEVEL_LENGTH 8 /* Length of strings above */
>
> #endif /* ASL_EXCEPTIONS */
> diff --git a/src/acpica/source/compiler/aslstartup.c b/src/acpica/source/compiler/aslstartup.c
> index 49b25d9..2fbe0d3 100644
> --- a/src/acpica/source/compiler/aslstartup.c
> +++ b/src/acpica/source/compiler/aslstartup.c
> @@ -299,7 +299,7 @@ AslDetectSourceFileType (
>
> /* Check for 100% ASCII source file (comments are ignored) */
>
> - Status = FlCheckForAscii (Info);
> + Status = FlCheckForAscii (Info->Handle, Info->Filename, TRUE);
> if (ACPI_FAILURE (Status))
> {
> printf ("Non-ascii input file - %s\n", Info->Filename);
> diff --git a/src/acpica/source/compiler/aslsupport.l b/src/acpica/source/compiler/aslsupport.l
> index cdaf2b8..0ce5a20 100644
> --- a/src/acpica/source/compiler/aslsupport.l
> +++ b/src/acpica/source/compiler/aslsupport.l
> @@ -164,19 +164,23 @@ static void
> AslDoLineDirective (
> void)
> {
> - char c;
> + int c;
> char *Token;
> UINT32 LineNumber;
> char *Filename;
> + UINT32 i;
>
>
> /* Eat the entire line that contains the #line directive */
>
> - while ((c = (char) input()) != '\n' && c != EOF)
> + Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
> +
> + while ((c = input()) != '\n' && c != EOF)
> {
> - AslInsertLineBuffer (c);
> + *Gbl_LineBufPtr = c;
> + Gbl_LineBufPtr++;
> }
> - AslInsertLineBuffer (0);
> + *Gbl_LineBufPtr = 0;
>
> /* First argument is the actual line number */
>
> @@ -186,10 +190,23 @@ AslDoLineDirective (
> goto ResetAndExit;
> }
>
> - /* Convert line number. Subtract one to handle _this_ line */
> + /* First argument is the line number */
>
> LineNumber = (UINT32) UtDoConstant (Token);
> - FlSetLineNumber (LineNumber - 1);
> +
> + /* Emit the appropriate number of newlines */
> +
> + Gbl_CurrentColumn = 0;
> + if (LineNumber > Gbl_CurrentLineNumber)
> + {
> + for (i = 0; i < (LineNumber - Gbl_CurrentLineNumber); i++)
> + {
> + FlWriteFile (ASL_FILE_SOURCE_OUTPUT, "\n", 1);
> + Gbl_CurrentColumn++;
> + }
> + }
> +
> + FlSetLineNumber (LineNumber);
>
> /* Second argument is the optional filename (in double quotes) */
>
> @@ -204,7 +221,12 @@ AslDoLineDirective (
> /* Third argument is not supported at this time */
>
> ResetAndExit:
> - AslResetCurrentLineBuffer ();
> +
> + /* Reset globals for a new line */
> +
> + Gbl_CurrentLineOffset += Gbl_CurrentColumn;
> + Gbl_CurrentColumn = 0;
> + Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
> }
>
>
> @@ -480,8 +502,8 @@ static char
> AslDoComment (
> void)
> {
> - char c;
> - char c1 = 0;
> + int c;
> + int c1 = 0;
>
>
> AslInsertLineBuffer ('/');
> @@ -491,7 +513,7 @@ loop:
>
> /* Eat chars until end-of-comment */
>
> - while ((c = (char) input()) != '*' && c != EOF)
> + while ((c = input()) != '*' && c != EOF)
> {
> AslInsertLineBuffer (c);
> c1 = c;
> @@ -518,7 +540,7 @@ loop:
>
> AslInsertLineBuffer (c);
>
> - if ((c1 = (char) input()) != '/' && c1 != EOF)
> + if ((c1 = input()) != '/' && c1 != EOF)
> {
> unput(c1);
> goto loop;
> @@ -561,13 +583,13 @@ static char
> AslDoCommentType2 (
> void)
> {
> - char c;
> + int c;
>
>
> AslInsertLineBuffer ('/');
> AslInsertLineBuffer ('/');
>
> - while ((c = (char) input()) != '\n' && c != EOF)
> + while ((c = input()) != '\n' && c != EOF)
> {
> AslInsertLineBuffer (c);
> }
> @@ -603,7 +625,7 @@ AslDoStringLiteral (
> char *StringBuffer = MsgBuffer;
> char *EndBuffer = MsgBuffer + ASL_MSG_BUFFER_SIZE;
> char *CleanString;
> - char StringChar;
> + int StringChar;
> UINT32 State = ASL_NORMAL_CHAR;
> UINT32 i = 0;
> UINT8 Digit;
> @@ -616,7 +638,7 @@ AslDoStringLiteral (
> * source line buffer.
> */
> AslInsertLineBuffer ('\"');
> - while ((StringChar = (char) input()) != EOF)
> + while ((StringChar = input()) != EOF)
> {
> AslInsertLineBuffer (StringChar);
>
> diff --git a/src/acpica/source/compiler/aslutils.c b/src/acpica/source/compiler/aslutils.c
> index 8a7dbba..de7ea0d 100644
> --- a/src/acpica/source/compiler/aslutils.c
> +++ b/src/acpica/source/compiler/aslutils.c
> @@ -211,7 +211,7 @@ UtDisplaySupportedTables (
>
> /*******************************************************************************
> *
> - * FUNCTION: AcpiPsDisplayConstantOpcodes
> + * FUNCTION: UtDisplayConstantOpcodes
> *
> * PARAMETERS: None
> *
> @@ -244,11 +244,11 @@ UtDisplayConstantOpcodes (
> *
> * FUNCTION: UtLocalCalloc
> *
> - * PARAMETERS: Size - Bytes to be allocated
> + * PARAMETERS: Size - Bytes to be allocated
> *
> - * RETURN: Pointer to the allocated memory. Guaranteed to be valid.
> + * RETURN: Pointer to the allocated memory. Guaranteed to be valid.
> *
> - * DESCRIPTION: Allocate zero-initialized memory. Aborts the compile on an
> + * DESCRIPTION: Allocate zero-initialized memory. Aborts the compile on an
> * allocation failure, on the assumption that nothing more can be
> * accomplished.
> *
> @@ -283,9 +283,9 @@ UtLocalCalloc (
> *
> * FUNCTION: UtBeginEvent
> *
> - * PARAMETERS: Name - Ascii name of this event
> + * PARAMETERS: Name - Ascii name of this event
> *
> - * RETURN: Event - Event number (integer index)
> + * RETURN: Event number (integer index)
> *
> * DESCRIPTION: Saves the current time with this event
> *
> @@ -316,7 +316,7 @@ UtBeginEvent (
> *
> * FUNCTION: UtEndEvent
> *
> - * PARAMETERS: Event - Event number (integer index)
> + * PARAMETERS: Event - Event number (integer index)
> *
> * RETURN: None
> *
> @@ -326,7 +326,7 @@ UtBeginEvent (
>
> void
> UtEndEvent (
> - UINT8 Event)
> + UINT8 Event)
> {
>
> if (Event >= ASL_NUM_EVENTS)
> @@ -344,7 +344,7 @@ UtEndEvent (
> *
> * FUNCTION: UtHexCharToValue
> *
> - * PARAMETERS: HexChar - Hex character in Ascii
> + * PARAMETERS: HexChar - Hex character in Ascii
> *
> * RETURN: The binary value of the hex character
> *
> @@ -375,12 +375,13 @@ UtHexCharToValue (
> *
> * FUNCTION: UtConvertByteToHex
> *
> - * PARAMETERS: RawByte - Binary data
> - * Buffer - Pointer to where the hex bytes will be stored
> + * PARAMETERS: RawByte - Binary data
> + * Buffer - Pointer to where the hex bytes will be
> + * stored
> *
> * RETURN: Ascii hex byte is stored in Buffer.
> *
> - * DESCRIPTION: Perform hex-to-ascii translation. The return data is prefixed
> + * DESCRIPTION: Perform hex-to-ascii translation. The return data is prefixed
> * with "0x"
> *
> ******************************************************************************/
> @@ -403,12 +404,13 @@ UtConvertByteToHex (
> *
> * FUNCTION: UtConvertByteToAsmHex
> *
> - * PARAMETERS: RawByte - Binary data
> - * Buffer - Pointer to where the hex bytes will be stored
> + * PARAMETERS: RawByte - Binary data
> + * Buffer - Pointer to where the hex bytes will be
> + * stored
> *
> * RETURN: Ascii hex byte is stored in Buffer.
> *
> - * DESCRIPTION: Perform hex-to-ascii translation. The return data is prefixed
> + * DESCRIPTION: Perform hex-to-ascii translation. The return data is prefixed
> * with "0x"
> *
> ******************************************************************************/
> @@ -430,13 +432,13 @@ UtConvertByteToAsmHex (
> *
> * FUNCTION: DbgPrint
> *
> - * PARAMETERS: Type - Type of output
> - * Fmt - Printf format string
> - * ... - variable printf list
> + * PARAMETERS: Type - Type of output
> + * Fmt - Printf format string
> + * ... - variable printf list
> *
> * RETURN: None
> *
> - * DESCRIPTION: Conditional print statement. Prints to stderr only if the
> + * DESCRIPTION: Conditional print statement. Prints to stderr only if the
> * debug flag is set.
> *
> ******************************************************************************/
> @@ -510,7 +512,7 @@ UtPrintFormattedName (
> *
> * FUNCTION: UtSetParseOpName
> *
> - * PARAMETERS: Op
> + * PARAMETERS: Op - Parse op to be named.
> *
> * RETURN: None
> *
> @@ -532,7 +534,7 @@ UtSetParseOpName (
> *
> * FUNCTION: UtDisplaySummary
> *
> - * PARAMETERS: FileID - ID of outpout file
> + * PARAMETERS: FileID - ID of outpout file
> *
> * RETURN: None
> *
> @@ -643,11 +645,11 @@ UtDisplaySummary (
>
> /*******************************************************************************
> *
> - * FUNCTION: UtDisplaySummary
> + * FUNCTION: UtCheckIntegerRange
> *
> - * PARAMETERS: Op - Integer parse node
> - * LowValue - Smallest allowed value
> - * HighValue - Largest allowed value
> + * PARAMETERS: Op - Integer parse node
> + * LowValue - Smallest allowed value
> + * HighValue - Largest allowed value
> *
> * RETURN: Op if OK, otherwise NULL
> *
> @@ -698,11 +700,11 @@ UtCheckIntegerRange (
> *
> * FUNCTION: UtGetStringBuffer
> *
> - * PARAMETERS: Length - Size of buffer requested
> + * PARAMETERS: Length - Size of buffer requested
> *
> - * RETURN: Pointer to the buffer. Aborts on allocation failure
> + * RETURN: Pointer to the buffer. Aborts on allocation failure
> *
> - * DESCRIPTION: Allocate a string buffer. Bypass the local
> + * DESCRIPTION: Allocate a string buffer. Bypass the local
> * dynamic memory manager for performance reasons (This has a
> * major impact on the speed of the compiler.)
> *
> @@ -733,8 +735,8 @@ UtGetStringBuffer (
> *
> * FUNCTION: UtInternalizeName
> *
> - * PARAMETERS: ExternalName - Name to convert
> - * ConvertedName - Where the converted name is returned
> + * PARAMETERS: ExternalName - Name to convert
> + * ConvertedName - Where the converted name is returned
> *
> * RETURN: Status
> *
> @@ -786,8 +788,8 @@ UtInternalizeName (
> *
> * FUNCTION: UtPadNameWithUnderscores
> *
> - * PARAMETERS: NameSeg - Input nameseg
> - * PaddedNameSeg - Output padded nameseg
> + * PARAMETERS: NameSeg - Input nameseg
> + * PaddedNameSeg - Output padded nameseg
> *
> * RETURN: Padded nameseg.
> *
> @@ -824,8 +826,8 @@ UtPadNameWithUnderscores (
> *
> * FUNCTION: UtAttachNameseg
> *
> - * PARAMETERS: Op - Parent parse node
> - * Name - Full ExternalName
> + * PARAMETERS: Op - Parent parse node
> + * Name - Full ExternalName
> *
> * RETURN: None; Sets the NameSeg field in parent node
> *
> @@ -881,12 +883,12 @@ UtAttachNameseg (
> *
> * FUNCTION: UtAttachNamepathToOwner
> *
> - * PARAMETERS: Op - Parent parse node
> - * NameOp - Node that contains the name
> + * PARAMETERS: Op - Parent parse node
> + * NameOp - Node that contains the name
> *
> * RETURN: Sets the ExternalName and Namepath in the parent node
> *
> - * DESCRIPTION: Store the name in two forms in the parent node: The original
> + * DESCRIPTION: Store the name in two forms in the parent node: The original
> * (external) name, and the internalized name that is used within
> * the ACPI namespace manager.
> *
> @@ -926,11 +928,11 @@ UtAttachNamepathToOwner (
> *
> * FUNCTION: UtDoConstant
> *
> - * PARAMETERS: String - Hex, Octal, or Decimal string
> + * PARAMETERS: String - Hex, Octal, or Decimal string
> *
> * RETURN: Converted Integer
> *
> - * DESCRIPTION: Convert a string to an integer. With error checking.
> + * DESCRIPTION: Convert a string to an integer, with error checking.
> *
> ******************************************************************************/
>
> @@ -961,10 +963,10 @@ UtDoConstant (
> *
> * FUNCTION: UtStrtoul64
> *
> - * PARAMETERS: String - Null terminated string
> - * Terminater - Where a pointer to the terminating byte is
> - * returned
> - * Base - Radix of the string
> + * PARAMETERS: String - Null terminated string
> + * Terminater - Where a pointer to the terminating byte
> + * is returned
> + * Base - Radix of the string
> *
> * RETURN: Converted value
> *
> @@ -1144,5 +1146,3 @@ ErrorExit:
>
> return (Status);
> }
> -
> -
> diff --git a/src/acpica/source/compiler/dtio.c b/src/acpica/source/compiler/dtio.c
> index 91d4aba..7a68e84 100644
> --- a/src/acpica/source/compiler/dtio.c
> +++ b/src/acpica/source/compiler/dtio.c
> @@ -161,6 +161,7 @@ DtDumpBuffer (
> #define DT_SLASH_SLASH_COMMENT 4
> #define DT_END_COMMENT 5
> #define DT_MERGE_LINES 6
> +#define DT_ESCAPE_SEQUENCE 7
>
> static UINT32 Gbl_NextLineOffset;
>
> @@ -498,7 +499,6 @@ DtGetNextLine (
> {
> case DT_START_QUOTED_STRING:
> case DT_SLASH_ASTERISK_COMMENT:
> - case DT_SLASH_SLASH_COMMENT:
>
> AcpiOsPrintf ("**** EOF within comment/string %u\n", State);
> break;
> @@ -507,7 +507,22 @@ DtGetNextLine (
> break;
> }
>
> - return (ASL_EOF);
> + /* Standalone EOF is OK */
> +
> + if (i == 0)
> + {
> + return (ASL_EOF);
> + }
> +
> + /*
> + * Received an EOF in the middle of a line. Terminate the
> + * line with a newline. The next call to this function will
> + * return a standalone EOF. Thus, the upper parsing software
> + * never has to deal with an EOF within a valid line (or
> + * the last line does not get tossed on the floor.)
> + */
> + c = '\n';
> + State = DT_NORMAL_TEXT;
> }
>
> switch (State)
> @@ -576,12 +591,36 @@ DtGetNextLine (
> Gbl_CurrentLineBuffer[i] = c;
> i++;
>
> - if (c == '"')
> + switch (c)
> {
> + case '"':
> State = DT_NORMAL_TEXT;
> + break;
> +
> + case '\\':
> + State = DT_ESCAPE_SEQUENCE;
> + break;
> +
> + case '\n':
> + AcpiOsPrintf ("ERROR at line %u: Unterminated quoted string\n",
> + Gbl_CurrentLineNumber++);
> + State = DT_NORMAL_TEXT;
> + break;
> +
> + default: /* Get next character */
> + break;
> }
> break;
>
> + case DT_ESCAPE_SEQUENCE:
> +
> + /* Just copy the escaped character. TBD: sufficient for table compiler? */
> +
> + Gbl_CurrentLineBuffer[i] = c;
> + i++;
> + State = DT_START_QUOTED_STRING;
> + break;
> +
> case DT_START_COMMENT:
>
> /* Open comment if this character is an asterisk or slash */
> diff --git a/src/acpica/source/compiler/dttemplate.c b/src/acpica/source/compiler/dttemplate.c
> index ed5f79b..1d92b78 100644
> --- a/src/acpica/source/compiler/dttemplate.c
> +++ b/src/acpica/source/compiler/dttemplate.c
> @@ -298,7 +298,7 @@ DtCreateAllTemplates (
> }
>
> /*
> - * Create the "special ACPI tables:
> + * Create the special ACPI tables:
> * 1) DSDT/SSDT are AML tables, not data tables
> * 2) FACS and RSDP have non-standard headers
> */
> diff --git a/src/acpica/source/compiler/prscan.c b/src/acpica/source/compiler/prscan.c
> index e98e186..687af45 100644
> --- a/src/acpica/source/compiler/prscan.c
> +++ b/src/acpica/source/compiler/prscan.c
> @@ -726,7 +726,7 @@ PrDoDirective (
> }
>
> DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
> - "Start #include file %s\n", Gbl_CurrentLineNumber,
> + "Start #include file \"%s\"\n", Gbl_CurrentLineNumber,
> Token, Gbl_CurrentLineNumber);
>
> PrOpenIncludeFile (Token);
> diff --git a/src/acpica/source/compiler/prutils.c b/src/acpica/source/compiler/prutils.c
> index a5fb46a..64dc9e8 100644
> --- a/src/acpica/source/compiler/prutils.c
> +++ b/src/acpica/source/compiler/prutils.c
> @@ -318,13 +318,11 @@ PrOpenIncludeFile (
> ASL_INCLUDE_DIR *NextDir;
>
>
> - /*
> - * start the actual include file on the next line
> - */
> + /* Start the actual include file on the next line */
> +
> Gbl_CurrentLineOffset++;
>
> /* Attempt to open the include file */
> -
> /* If the file specifies an absolute path, just open it */
>
> if ((Filename[0] == '/') ||
> @@ -402,13 +400,10 @@ PrOpenIncludeWithPrefix (
>
> /* Build the full pathname to the file */
>
> - Pathname = ACPI_ALLOCATE (strlen (PrefixDir) + strlen (Filename) + 1);
> + Pathname = FlMergePathnames (PrefixDir, Filename);
>
> - strcpy (Pathname, PrefixDir);
> - strcat (Pathname, Filename);
> -
> - DbgPrint (ASL_PARSE_OUTPUT, "\n" PR_PREFIX_ID
> - "Opening include file: path %s\n",
> + DbgPrint (ASL_PARSE_OUTPUT, PR_PREFIX_ID
> + "Include: Opening file - \"%s\"\n",
> Gbl_CurrentLineNumber, Pathname);
>
> /* Attempt to open the file, push if successful */
> diff --git a/src/acpica/source/components/debugger/dbcmds.c b/src/acpica/source/components/debugger/dbcmds.c
> index 4c34a79..27aa4cd 100644
> --- a/src/acpica/source/components/debugger/dbcmds.c
> +++ b/src/acpica/source/components/debugger/dbcmds.c
> @@ -326,12 +326,53 @@ AcpiDbDisplayTableInfo (
> ACPI_STATUS Status;
>
>
> + /* Header */
> +
> + AcpiOsPrintf ("Idx ID Status Type Sig Address Len Header\n");
> +
> /* Walk the entire root table list */
>
> for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; i++)
> {
> TableDesc = &AcpiGbl_RootTableList.Tables[i];
> - AcpiOsPrintf ("%u ", i);
> +
> + /* Index and Table ID */
> +
> + AcpiOsPrintf ("%3u %.2u ", i, TableDesc->OwnerId);
> +
> + /* Decode the table flags */
> +
> + if (!(TableDesc->Flags & ACPI_TABLE_IS_LOADED))
> + {
> + AcpiOsPrintf ("NotLoaded ");
> + }
> + else
> + {
> + AcpiOsPrintf (" Loaded ");
> + }
> +
> + switch (TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK)
> + {
> + case ACPI_TABLE_ORIGIN_UNKNOWN:
> + AcpiOsPrintf ("Unknown ");
> + break;
> +
> + case ACPI_TABLE_ORIGIN_MAPPED:
> + AcpiOsPrintf ("Mapped ");
> + break;
> +
> + case ACPI_TABLE_ORIGIN_ALLOCATED:
> + AcpiOsPrintf ("Allocated ");
> + break;
> +
> + case ACPI_TABLE_ORIGIN_OVERRIDE:
> + AcpiOsPrintf ("Override ");
> + break;
> +
> + default:
> + AcpiOsPrintf ("INVALID ");
> + break;
> + }
>
> /* Make sure that the table is mapped */
>
> @@ -362,55 +403,45 @@ AcpiDbDisplayTableInfo (
> *
> * FUNCTION: AcpiDbUnloadAcpiTable
> *
> - * PARAMETERS: TableArg - Name of the table to be unloaded
> - * InstanceArg - Which instance of the table to unload (if
> - * there are multiple tables of the same type)
> + * PARAMETERS: ObjectName - Namespace pathname for an object that
> + * is owned by the table to be unloaded
> *
> - * RETURN: Nonde
> + * RETURN: None
> *
> - * DESCRIPTION: Unload an ACPI table.
> - * Instance is not implemented
> + * DESCRIPTION: Unload an ACPI table, via any namespace node that is owned
> + * by the table.
> *
> ******************************************************************************/
>
> void
> AcpiDbUnloadAcpiTable (
> - char *TableArg,
> - char *InstanceArg)
> + char *ObjectName)
> {
> -/* TBD: Need to reimplement for new data structures */
> -
> -#if 0
> - UINT32 i;
> + ACPI_NAMESPACE_NODE *Node;
> ACPI_STATUS Status;
>
>
> - /* Search all tables for the target type */
> + /* Translate name to an Named object */
>
> - for (i = 0; i < (ACPI_TABLE_ID_MAX+1); i++)
> + Node = AcpiDbConvertToNode (ObjectName);
> + if (!Node)
> {
> - if (!ACPI_STRNCMP (TableArg, AcpiGbl_TableData[i].Signature,
> - AcpiGbl_TableData[i].SigLength))
> - {
> - /* Found the table, unload it */
> -
> - Status = AcpiUnloadTable (i);
> - if (ACPI_SUCCESS (Status))
> - {
> - AcpiOsPrintf ("[%s] unloaded and uninstalled\n", TableArg);
> - }
> - else
> - {
> - AcpiOsPrintf ("%s, while unloading [%s]\n",
> - AcpiFormatException (Status), TableArg);
> - }
> -
> - return;
> - }
> + AcpiOsPrintf ("Could not find [%s] in namespace\n",
> + ObjectName);
> + return;
> }
>
> - AcpiOsPrintf ("Unknown table type [%s]\n", TableArg);
> -#endif
> + Status = AcpiUnloadParentTable (ACPI_CAST_PTR (ACPI_HANDLE, Node));
> + if (ACPI_SUCCESS (Status))
> + {
> + AcpiOsPrintf ("Parent of [%s] (%p) unloaded and uninstalled\n",
> + ObjectName, Node);
> + }
> + else
> + {
> + AcpiOsPrintf ("%s, while unloading parent table of [%s]\n",
> + AcpiFormatException (Status), ObjectName);
> + }
> }
>
>
> @@ -445,25 +476,20 @@ AcpiDbSendNotify (
> return;
> }
>
> - /* Decode Named object type */
> + /* Dispatch the notify if legal */
>
> - switch (Node->Type)
> + if (AcpiEvIsNotifyObject (Node))
> {
> - case ACPI_TYPE_DEVICE:
> - case ACPI_TYPE_THERMAL:
> -
> - /* Send the notify */
> -
> Status = AcpiEvQueueNotifyRequest (Node, Value);
> if (ACPI_FAILURE (Status))
> {
> AcpiOsPrintf ("Could not queue notify\n");
> }
> - break;
> -
> - default:
> - AcpiOsPrintf ("Named object is not a device or a thermal object\n");
> - break;
> + }
> + else
> + {
> + AcpiOsPrintf ("Named object [%4.4s] Type %s, must be Device/Thermal/Processor type\n",
> + AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type));
> }
> }
>
> diff --git a/src/acpica/source/components/debugger/dbdisply.c b/src/acpica/source/components/debugger/dbdisply.c
> index d8b3aa9..2e91c88 100644
> --- a/src/acpica/source/components/debugger/dbdisply.c
> +++ b/src/acpica/source/components/debugger/dbdisply.c
> @@ -179,8 +179,8 @@ typedef struct acpi_handler_info
>
> static ACPI_HANDLER_INFO AcpiGbl_HandlerList[] =
> {
> - {&AcpiGbl_SystemNotify.Handler, "System Notifications"},
> - {&AcpiGbl_DeviceNotify.Handler, "Device Notifications"},
> + {&AcpiGbl_GlobalNotify[0].Handler, "System Notifications"},
> + {&AcpiGbl_GlobalNotify[1].Handler, "Device Notifications"},
> {&AcpiGbl_TableHandler, "ACPI Table Events"},
> {&AcpiGbl_ExceptionHandler, "Control Method Exceptions"},
> {&AcpiGbl_InterfaceHandler, "OSI Invocations"}
> @@ -864,10 +864,12 @@ AcpiDbDisplayGpes (
> ACPI_GPE_EVENT_INFO *GpeEventInfo;
> ACPI_GPE_REGISTER_INFO *GpeRegisterInfo;
> char *GpeType;
> + ACPI_GPE_NOTIFY_INFO *Notify;
> UINT32 GpeIndex;
> UINT32 Block = 0;
> UINT32 i;
> UINT32 j;
> + UINT32 Count;
> char Buffer[80];
> ACPI_BUFFER RetBuf;
> ACPI_STATUS Status;
> @@ -988,7 +990,14 @@ AcpiDbDisplayGpes (
> AcpiOsPrintf ("Handler");
> break;
> case ACPI_GPE_DISPATCH_NOTIFY:
> - AcpiOsPrintf ("Notify");
> + Count = 0;
> + Notify = GpeEventInfo->Dispatch.NotifyList;
> + while (Notify)
> + {
> + Count++;
> + Notify = Notify->Next;
> + }
> + AcpiOsPrintf ("Implicit Notify on %u devices", Count);
> break;
> default:
> AcpiOsPrintf ("UNKNOWN: %X",
> diff --git a/src/acpica/source/components/debugger/dbexec.c b/src/acpica/source/components/debugger/dbexec.c
> index eb85998..174f77a 100644
> --- a/src/acpica/source/components/debugger/dbexec.c
> +++ b/src/acpica/source/components/debugger/dbexec.c
> @@ -944,8 +944,8 @@ AcpiDbMethodThread (
>
> if (Info->InitArgs)
> {
> - AcpiDbUInt32ToHexString (Info->NumCreated, Info->IndexOfThreadStr);
> - AcpiDbUInt32ToHexString ((UINT32) AcpiOsGetThreadId (), Info->IdOfThreadStr);
> + AcpiDbUint32ToHexString (Info->NumCreated, Info->IndexOfThreadStr);
> + AcpiDbUint32ToHexString ((UINT32) AcpiOsGetThreadId (), Info->IdOfThreadStr);
> }
>
> if (Info->Threads && (Info->NumCreated < Info->NumThreads))
> @@ -1135,7 +1135,7 @@ AcpiDbCreateExecutionThreads (
> AcpiGbl_DbMethodInfo.ArgTypes[1] = ACPI_TYPE_INTEGER;
> AcpiGbl_DbMethodInfo.ArgTypes[2] = ACPI_TYPE_INTEGER;
>
> - AcpiDbUInt32ToHexString (NumThreads, AcpiGbl_DbMethodInfo.NumThreadsStr);
> + AcpiDbUint32ToHexString (NumThreads, AcpiGbl_DbMethodInfo.NumThreadsStr);
>
> AcpiDbExecuteSetup (&AcpiGbl_DbMethodInfo);
>
> diff --git a/src/acpica/source/components/debugger/dbfileio.c b/src/acpica/source/components/debugger/dbfileio.c
> index 495d609..8e36c87 100644
> --- a/src/acpica/source/components/debugger/dbfileio.c
> +++ b/src/acpica/source/components/debugger/dbfileio.c
> @@ -123,6 +123,10 @@
> #include "actables.h"
> #endif
>
> +#ifdef ACPI_ASL_COMPILER
> +#include "aslcompiler.h"
> +#endif
> +
> #if (defined ACPI_DEBUGGER || defined ACPI_DISASSEMBLER)
>
> #define _COMPONENT ACPI_CA_DEBUGGER
> @@ -381,6 +385,15 @@ AcpiDbReadTable (
> AcpiOsPrintf (
> "TableHeader length [0x%X] greater than the input file size [0x%X]\n",
> TableHeader.Length, FileSize);
> +
> +#ifdef ACPI_ASL_COMPILER
> + Status = FlCheckForAscii (fp, NULL, FALSE);
> + if (ACPI_SUCCESS (Status))
> + {
> + AcpiOsPrintf ("File appears to be ASCII only, must be binary\n",
> + TableHeader.Length, FileSize);
> + }
> +#endif
> return (AE_BAD_HEADER);
> }
>
> diff --git a/src/acpica/source/components/debugger/dbinput.c b/src/acpica/source/components/debugger/dbinput.c
> index 3e61bdb..1b2ee1d 100644
> --- a/src/acpica/source/components/debugger/dbinput.c
> +++ b/src/acpica/source/components/debugger/dbinput.c
> @@ -322,7 +322,7 @@ AcpiDbDisplayHelp (
> AcpiOsPrintf (" Stack Display CPU stack usage\n");
> AcpiOsPrintf (" Tables Info about current ACPI table(s)\n");
> AcpiOsPrintf (" Tables Display info about loaded ACPI tables\n");
> - AcpiOsPrintf (" Unload <TableSig> [Instance] Unload an ACPI table\n");
> + AcpiOsPrintf (" Unload <Namepath> Unload an ACPI table via namespace object\n");
> AcpiOsPrintf (" ! <CommandNumber> Execute command from history buffer\n");
> AcpiOsPrintf (" !! Execute last command again\n");
>
> @@ -966,7 +966,7 @@ AcpiDbCommandDispatch (
> break;
>
> case CMD_UNLOAD:
> - AcpiDbUnloadAcpiTable (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
> + AcpiDbUnloadAcpiTable (AcpiGbl_DbArgs[1]);
> break;
>
> case CMD_EXIT:
> diff --git a/src/acpica/source/components/debugger/dbstats.c b/src/acpica/source/components/debugger/dbstats.c
> index 8a6e713..e309668 100644
> --- a/src/acpica/source/components/debugger/dbstats.c
> +++ b/src/acpica/source/components/debugger/dbstats.c
> @@ -299,8 +299,8 @@ AcpiDbEnumerateObject (
>
> case ACPI_TYPE_DEVICE:
>
> - AcpiDbEnumerateObject (ObjDesc->Device.SystemNotify);
> - AcpiDbEnumerateObject (ObjDesc->Device.DeviceNotify);
> + AcpiDbEnumerateObject (ObjDesc->Device.NotifyList[0]);
> + AcpiDbEnumerateObject (ObjDesc->Device.NotifyList[1]);
> AcpiDbEnumerateObject (ObjDesc->Device.Handler);
> break;
>
> @@ -320,21 +320,21 @@ AcpiDbEnumerateObject (
>
> case ACPI_TYPE_POWER:
>
> - AcpiDbEnumerateObject (ObjDesc->PowerResource.SystemNotify);
> - AcpiDbEnumerateObject (ObjDesc->PowerResource.DeviceNotify);
> + AcpiDbEnumerateObject (ObjDesc->PowerResource.NotifyList[0]);
> + AcpiDbEnumerateObject (ObjDesc->PowerResource.NotifyList[1]);
> break;
>
> case ACPI_TYPE_PROCESSOR:
>
> - AcpiDbEnumerateObject (ObjDesc->Processor.SystemNotify);
> - AcpiDbEnumerateObject (ObjDesc->Processor.DeviceNotify);
> + AcpiDbEnumerateObject (ObjDesc->Processor.NotifyList[0]);
> + AcpiDbEnumerateObject (ObjDesc->Processor.NotifyList[1]);
> AcpiDbEnumerateObject (ObjDesc->Processor.Handler);
> break;
>
> case ACPI_TYPE_THERMAL:
>
> - AcpiDbEnumerateObject (ObjDesc->ThermalZone.SystemNotify);
> - AcpiDbEnumerateObject (ObjDesc->ThermalZone.DeviceNotify);
> + AcpiDbEnumerateObject (ObjDesc->ThermalZone.NotifyList[0]);
> + AcpiDbEnumerateObject (ObjDesc->ThermalZone.NotifyList[1]);
> AcpiDbEnumerateObject (ObjDesc->ThermalZone.Handler);
> break;
>
> @@ -594,6 +594,18 @@ AcpiDbDisplayStatistics (
> AcpiOsPrintf ("NamespaceNode %3d\n", sizeof (ACPI_NAMESPACE_NODE));
> AcpiOsPrintf ("AcpiObject %3d\n", sizeof (ACPI_OBJECT));
>
> + AcpiOsPrintf ("\n");
> +
> + AcpiOsPrintf ("Generic State %3d\n", sizeof (ACPI_GENERIC_STATE));
> + AcpiOsPrintf ("Common State %3d\n", sizeof (ACPI_COMMON_STATE));
> + AcpiOsPrintf ("Control State %3d\n", sizeof (ACPI_CONTROL_STATE));
> + AcpiOsPrintf ("Update State %3d\n", sizeof (ACPI_UPDATE_STATE));
> + AcpiOsPrintf ("Scope State %3d\n", sizeof (ACPI_SCOPE_STATE));
> + AcpiOsPrintf ("Parse Scope %3d\n", sizeof (ACPI_PSCOPE_STATE));
> + AcpiOsPrintf ("Package State %3d\n", sizeof (ACPI_PKG_STATE));
> + AcpiOsPrintf ("Thread State %3d\n", sizeof (ACPI_THREAD_STATE));
> + AcpiOsPrintf ("Result Values %3d\n", sizeof (ACPI_RESULT_VALUES));
> + AcpiOsPrintf ("Notify Info %3d\n", sizeof (ACPI_NOTIFY_INFO));
> break;
>
>
> diff --git a/src/acpica/source/components/debugger/dbutils.c b/src/acpica/source/components/debugger/dbutils.c
> index fd318d9..f913c64 100644
> --- a/src/acpica/source/components/debugger/dbutils.c
> +++ b/src/acpica/source/components/debugger/dbutils.c
> @@ -432,7 +432,7 @@ AcpiDbLocalNsLookup (
>
> /*******************************************************************************
> *
> - * FUNCTION: AcpiDbUInt32ToHexString
> + * FUNCTION: AcpiDbUint32ToHexString
> *
> * PARAMETERS: Value - The value to be converted to string
> * Buffer - Buffer for result (not less than 11 bytes)
> @@ -447,7 +447,7 @@ AcpiDbLocalNsLookup (
> ******************************************************************************/
>
> void
> -AcpiDbUInt32ToHexString (
> +AcpiDbUint32ToHexString (
> UINT32 Value,
> char *Buffer)
> {
> diff --git a/src/acpica/source/components/disassembler/dmopcode.c b/src/acpica/source/components/disassembler/dmopcode.c
> index ed457ed..252b1b8 100644
> --- a/src/acpica/source/components/disassembler/dmopcode.c
> +++ b/src/acpica/source/components/disassembler/dmopcode.c
> @@ -118,6 +118,7 @@
> #include "acparser.h"
> #include "amlcode.h"
> #include "acdisasm.h"
> +#include "acnamesp.h"
>
> #ifdef ACPI_DISASSEMBLER
>
> @@ -133,6 +134,218 @@ AcpiDmMatchKeyword (
>
> /*******************************************************************************
> *
> + * FUNCTION: AcpiDmPredefinedDescription
> + *
> + * PARAMETERS: Op - Name() parse object
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Emit a description comment for a predefined ACPI name.
> + * Used for iASL compiler only.
> + *
> + ******************************************************************************/
> +
> +void
> +AcpiDmPredefinedDescription (
> + ACPI_PARSE_OBJECT *Op)
> +{
> +#ifdef ACPI_ASL_COMPILER
> + const AH_PREDEFINED_NAME *Info;
> + char *NameString;
> + int LastCharIsDigit;
> + int LastCharsAreHex;
> +
> +
> + if (!Op)
> + {
> + return;
> + }
> +
> + /* Ensure that the comment field is emitted only once */
> +
> + if (Op->Common.DisasmFlags & ACPI_PARSEOP_PREDEF_CHECKED)
> + {
> + return;
> + }
> + Op->Common.DisasmFlags |= ACPI_PARSEOP_PREDEF_CHECKED;
> +
> + /* Predefined name must start with an underscore */
> +
> + NameString = ACPI_CAST_PTR (char, &Op->Named.Name);
> + if (NameString[0] != '_')
> + {
> + return;
> + }
> +
> + /*
> + * Check for the special ACPI names:
> + * _ACd, _ALd, _EJd, _Exx, _Lxx, _Qxx, _Wxx, _T_a
> + * (where d=decimal_digit, x=hex_digit, a=anything)
> + *
> + * Convert these to the generic name for table lookup.
> + * Note: NameString is guaranteed to be upper case here.
> + */
> + LastCharIsDigit =
> + (ACPI_IS_DIGIT (NameString[3])); /* d */
> + LastCharsAreHex =
> + (ACPI_IS_XDIGIT (NameString[2]) && /* xx */
> + ACPI_IS_XDIGIT (NameString[3]));
> +
> + switch (NameString[1])
> + {
> + case 'A':
> + if ((NameString[2] == 'C') && (LastCharIsDigit))
> + {
> + NameString = "_ACx";
> + }
> + else if ((NameString[2] == 'L') && (LastCharIsDigit))
> + {
> + NameString = "_ALx";
> + }
> + break;
> +
> + case 'E':
> + if ((NameString[2] == 'J') && (LastCharIsDigit))
> + {
> + NameString = "_EJx";
> + }
> + else if (LastCharsAreHex)
> + {
> + NameString = "_Exx";
> + }
> + break;
> +
> + case 'L':
> + if (LastCharsAreHex)
> + {
> + NameString = "_Lxx";
> + }
> + break;
> +
> + case 'Q':
> + if (LastCharsAreHex)
> + {
> + NameString = "_Qxx";
> + }
> + break;
> +
> + case 'T':
> + if (NameString[2] == '_')
> + {
> + NameString = "_T_x";
> + }
> + break;
> +
> + case 'W':
> + if (LastCharsAreHex)
> + {
> + NameString = "_Wxx";
> + }
> + break;
> +
> + default:
> + break;
> + }
> +
> + /* Match the name in the info table */
> +
> + for (Info = AslPredefinedInfo; Info->Name; Info++)
> + {
> + if (ACPI_COMPARE_NAME (NameString, Info->Name))
> + {
> + AcpiOsPrintf (" // %4.4s: %s",
> + NameString, ACPI_CAST_PTR (char, Info->Description));
> + return;
> + }
> + }
> +
> +#endif
> + return;
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiDmFieldPredefinedDescription
> + *
> + * PARAMETERS: Op - Parse object
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Emit a description comment for a resource descriptor tag
> + * (which is a predefined ACPI name.) Used for iASL compiler only.
> + *
> + ******************************************************************************/
> +
> +void
> +AcpiDmFieldPredefinedDescription (
> + ACPI_PARSE_OBJECT *Op)
> +{
> +#ifdef ACPI_ASL_COMPILER
> + ACPI_PARSE_OBJECT *IndexOp;
> + char *Tag;
> + const ACPI_OPCODE_INFO *OpInfo;
> + const AH_PREDEFINED_NAME *Info;
> +
> +
> + if (!Op)
> + {
> + return;
> + }
> +
> + /* Ensure that the comment field is emitted only once */
> +
> + if (Op->Common.DisasmFlags & ACPI_PARSEOP_PREDEF_CHECKED)
> + {
> + return;
> + }
> + Op->Common.DisasmFlags |= ACPI_PARSEOP_PREDEF_CHECKED;
> +
> + /*
> + * Op must be one of the Create* operators: CreateField, CreateBitField,
> + * CreateByteField, CreateWordField, CreateDwordField, CreateQwordField
> + */
> + OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
> + if (!(OpInfo->Flags & AML_CREATE))
> + {
> + return;
> + }
> +
> + /* Second argument is the Index argument */
> +
> + IndexOp = Op->Common.Value.Arg;
> + IndexOp = IndexOp->Common.Next;
> +
> + /* Index argument must be a namepath */
> +
> + if (IndexOp->Common.AmlOpcode != AML_INT_NAMEPATH_OP)
> + {
> + return;
> + }
> +
> + /* Major cheat: We previously put the Tag ptr in the Node field */
> +
> + Tag = ACPI_CAST_PTR (char, IndexOp->Common.Node);
> +
> + /* Match the name in the info table */
> +
> + for (Info = AslPredefinedInfo; Info->Name; Info++)
> + {
> + if (ACPI_COMPARE_NAME (Tag, Info->Name))
> + {
> + AcpiOsPrintf (" // %4.4s: %s", Tag,
> + ACPI_CAST_PTR (char, Info->Description));
> + return;
> + }
> + }
> +
> +#endif
> + return;
> +}
> +
> +
> +/*******************************************************************************
> + *
> * FUNCTION: AcpiDmMethodFlags
> *
> * PARAMETERS: Op - Method Object to be examined
> diff --git a/src/acpica/source/components/disassembler/dmwalk.c b/src/acpica/source/components/disassembler/dmwalk.c
> index 2bec308..dd655d8 100644
> --- a/src/acpica/source/components/disassembler/dmwalk.c
> +++ b/src/acpica/source/components/disassembler/dmwalk.c
> @@ -525,7 +525,7 @@ AcpiDmDescendingOp (
> * keep track of the current column.
> */
> Info->Count++;
> - if (Info->Count /*+Info->LastLevel*/ > 10)
> + if (Info->Count /* +Info->LastLevel */ > 10)
> {
> Info->Count = 0;
> AcpiOsPrintf ("\n");
> @@ -605,6 +605,10 @@ AcpiDmDescendingOp (
>
> AcpiDmMethodFlags (Op);
> AcpiOsPrintf (")");
> +
> + /* Emit description comment for Method() with a predefined ACPI name */
> +
> + AcpiDmPredefinedDescription (Op);
> break;
>
>
> @@ -675,7 +679,8 @@ AcpiDmDescendingOp (
>
> default:
>
> - AcpiOsPrintf ("*** Unhandled named opcode %X\n", Op->Common.AmlOpcode);
> + AcpiOsPrintf ("*** Unhandled named opcode %X\n",
> + Op->Common.AmlOpcode);
> break;
> }
> }
> @@ -716,7 +721,8 @@ AcpiDmDescendingOp (
> NextOp = NextOp->Common.Next;
>
> Info->Flags = ACPI_PARSEOP_PARAMLIST;
> - AcpiDmWalkParseTree (NextOp, AcpiDmDescendingOp, AcpiDmAscendingOp, Info);
> + AcpiDmWalkParseTree (NextOp, AcpiDmDescendingOp,
> + AcpiDmAscendingOp, Info);
> Info->Flags = 0;
> Info->Level = Level;
>
> @@ -758,12 +764,18 @@ AcpiDmDescendingOp (
> if (Op->Common.DisasmOpcode == ACPI_DASM_RESOURCE)
> {
> /*
> - * We have a resource list. Don't need to output
> - * the buffer size Op. Open up a new block
> + * We have a resource list. Don't need to output
> + * the buffer size Op. Open up a new block
> */
> NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
> NextOp = NextOp->Common.Next;
> - AcpiOsPrintf (")\n");
> + AcpiOsPrintf (")");
> +
> + /* Emit description comment for Name() with a predefined ACPI name */
> +
> + AcpiDmPredefinedDescription (Op->Asl.Parent);
> +
> + AcpiOsPrintf ("\n");
> AcpiDmIndent (Info->Level);
> AcpiOsPrintf ("{\n");
> return (AE_OK);
> @@ -791,7 +803,7 @@ AcpiDmDescendingOp (
>
> case AML_PACKAGE_OP:
>
> - /* The next op is the size or predicate parameter */
> + /* The next op is the size parameter */
>
> NextOp = AcpiPsGetDepthNext (NULL, Op);
> if (NextOp)
> @@ -844,6 +856,7 @@ AcpiDmAscendingOp (
> void *Context)
> {
> ACPI_OP_WALK_INFO *Info = Context;
> + ACPI_PARSE_OBJECT *ParentOp;
>
>
> if (Op->Common.DisasmFlags & ACPI_PARSEOP_IGNORE)
> @@ -869,6 +882,19 @@ AcpiDmAscendingOp (
>
> AcpiOsPrintf (")");
>
> + if (Op->Common.AmlOpcode == AML_NAME_OP)
> + {
> + /* Emit description comment for Name() with a predefined ACPI name */
> +
> + AcpiDmPredefinedDescription (Op);
> + }
> + else
> + {
> + /* For Create* operators, attempt to emit resource tag description */
> +
> + AcpiDmFieldPredefinedDescription (Op);
> + }
> +
> /* Could be a nested operator, check if comma required */
>
> if (!AcpiDmCommaIfListMember (Op))
> @@ -983,7 +1009,20 @@ AcpiDmAscendingOp (
> */
> if (Op->Common.Next)
> {
> - AcpiOsPrintf (")\n");
> + AcpiOsPrintf (")");
> +
> + /* Emit description comment for Name() with a predefined ACPI name */
> +
> + ParentOp = Op->Common.Parent;
> + if (ParentOp)
> + {
> + ParentOp = ParentOp->Common.Parent;
> + if (ParentOp && ParentOp->Asl.AmlOpcode == AML_NAME_OP)
> + {
> + AcpiDmPredefinedDescription (ParentOp);
> + }
> + }
> + AcpiOsPrintf ("\n");
> AcpiDmIndent (Level - 1);
> AcpiOsPrintf ("{\n");
> }
> diff --git a/src/acpica/source/components/dispatcher/dsfield.c b/src/acpica/source/components/dispatcher/dsfield.c
> index 526d478..3047c5f 100644
> --- a/src/acpica/source/components/dispatcher/dsfield.c
> +++ b/src/acpica/source/components/dispatcher/dsfield.c
> @@ -129,6 +129,18 @@
>
> /* Local prototypes */
>
> +#ifdef ACPI_ASL_COMPILER
> +#include "acdisasm.h"
> +
> +static ACPI_STATUS
> +AcpiDsCreateExternalRegion (
> + ACPI_STATUS LookupStatus,
> + ACPI_PARSE_OBJECT *Op,
> + char *Path,
> + ACPI_WALK_STATE *WalkState,
> + ACPI_NAMESPACE_NODE **Node);
> +#endif
> +
> static ACPI_STATUS
> AcpiDsGetFieldNames (
> ACPI_CREATE_FIELD_INFO *Info,
> @@ -136,6 +148,69 @@ AcpiDsGetFieldNames (
> ACPI_PARSE_OBJECT *Arg);
>
>
> +#ifdef ACPI_ASL_COMPILER
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiDsCreateExternalRegion (iASL Disassembler only)
> + *
> + * PARAMETERS: LookupStatus - Status from NsLookup operation
> + * Op - Op containing the Field definition and args
> + * Path - Pathname of the region
> + * ` WalkState - Current method state
> + * Node - Where the new region node is returned
> + *
> + * RETURN: Status
> + *
> + * DESCRIPTION: Add region to the external list if NOT_FOUND. Create a new
> + * region node/object.
> + *
> + ******************************************************************************/
> +
> +static ACPI_STATUS
> +AcpiDsCreateExternalRegion (
> + ACPI_STATUS LookupStatus,
> + ACPI_PARSE_OBJECT *Op,
> + char *Path,
> + ACPI_WALK_STATE *WalkState,
> + ACPI_NAMESPACE_NODE **Node)
> +{
> + ACPI_STATUS Status;
> + ACPI_OPERAND_OBJECT *ObjDesc;
> +
> +
> + if (LookupStatus != AE_NOT_FOUND)
> + {
> + return (LookupStatus);
> + }
> +
> + /*
> + * Table disassembly:
> + * OperationRegion not found. Generate an External for it, and
> + * insert the name into the namespace.
> + */
> + AcpiDmAddToExternalList (Op, Path, ACPI_TYPE_REGION, 0);
> + Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_REGION,
> + ACPI_IMODE_LOAD_PASS1, ACPI_NS_SEARCH_PARENT, WalkState, Node);
> + if (ACPI_FAILURE (Status))
> + {
> + return (Status);
> + }
> +
> + /* Must create and install a region object for the new node */
> +
> + ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_REGION);
> + if (!ObjDesc)
> + {
> + return (AE_NO_MEMORY);
> + }
> +
> + ObjDesc->Region.Node = *Node;
> + Status = AcpiNsAttachObject (*Node, ObjDesc, ACPI_TYPE_REGION);
> + return (Status);
> +}
> +#endif
> +
> +
> /*******************************************************************************
> *
> * FUNCTION: AcpiDsCreateBufferField
> @@ -149,8 +224,8 @@ AcpiDsGetFieldNames (
> * CreateBitFieldOp,
> * CreateByteFieldOp,
> * CreateWordFieldOp,
> - * CreateDWordFieldOp,
> - * CreateQWordFieldOp,
> + * CreateDwordFieldOp,
> + * CreateQwordFieldOp,
> * CreateFieldOp (all of which define a field in a buffer)
> *
> ******************************************************************************/
> @@ -510,11 +585,16 @@ AcpiDsCreateField (
> /* First arg is the name of the parent OpRegion (must already exist) */
>
> Arg = Op->Common.Value.Arg;
> +
> if (!RegionNode)
> {
> Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.Name,
> ACPI_TYPE_REGION, ACPI_IMODE_EXECUTE,
> ACPI_NS_SEARCH_PARENT, WalkState, &RegionNode);
> +#ifdef ACPI_ASL_COMPILER
> + Status = AcpiDsCreateExternalRegion (Status, Arg,
> + Arg->Common.Value.Name, WalkState, &RegionNode);
> +#endif
> if (ACPI_FAILURE (Status))
> {
> ACPI_ERROR_NAMESPACE (Arg->Common.Value.Name, Status);
> @@ -700,6 +780,10 @@ AcpiDsCreateBankField (
> Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.Name,
> ACPI_TYPE_REGION, ACPI_IMODE_EXECUTE,
> ACPI_NS_SEARCH_PARENT, WalkState, &RegionNode);
> +#ifdef ACPI_ASL_COMPILER
> + Status = AcpiDsCreateExternalRegion (Status, Arg,
> + Arg->Common.Value.Name, WalkState, &RegionNode);
> +#endif
> if (ACPI_FAILURE (Status))
> {
> ACPI_ERROR_NAMESPACE (Arg->Common.Value.Name, Status);
> diff --git a/src/acpica/source/components/dispatcher/dsopcode.c b/src/acpica/source/components/dispatcher/dsopcode.c
> index 5da09bd..d6ddbfa 100644
> --- a/src/acpica/source/components/dispatcher/dsopcode.c
> +++ b/src/acpica/source/components/dispatcher/dsopcode.c
> @@ -595,18 +595,18 @@ AcpiDsEvalTableRegionOperands (
>
>
> /*
> - * This is where we evaluate the SignatureString and OemIDString
> - * and OemTableIDString of the DataTableRegion declaration
> + * This is where we evaluate the Signature string, OemId string,
> + * and OemTableId string of the Data Table Region declaration
> */
> Node = Op->Common.Node;
>
> - /* NextOp points to SignatureString op */
> + /* NextOp points to Signature string op */
>
> NextOp = Op->Common.Value.Arg;
>
> /*
> - * Evaluate/create the SignatureString and OemIDString
> - * and OemTableIDString operands
> + * Evaluate/create the Signature string, OemId string,
> + * and OemTableId string operands
> */
> Status = AcpiDsCreateOperands (WalkState, NextOp);
> if (ACPI_FAILURE (Status))
> @@ -615,8 +615,8 @@ AcpiDsEvalTableRegionOperands (
> }
>
> /*
> - * Resolve the SignatureString and OemIDString
> - * and OemTableIDString operands
> + * Resolve the Signature string, OemId string,
> + * and OemTableId string operands
> */
> Status = AcpiExResolveOperands (Op->Common.AmlOpcode,
> ACPI_WALK_OPERANDS, WalkState);
> diff --git a/src/acpica/source/components/dispatcher/dswload.c b/src/acpica/source/components/dispatcher/dswload.c
> index 1f689d6..7a4a84f 100644
> --- a/src/acpica/source/components/dispatcher/dswload.c
> +++ b/src/acpica/source/components/dispatcher/dswload.c
> @@ -313,6 +313,20 @@ AcpiDsLoad1BeginOp (
> WalkState->ScopeInfo->Common.Value = ACPI_TYPE_ANY;
> break;
>
> + case ACPI_TYPE_METHOD:
> +
> + /*
> + * Allow scope change to root during execution of module-level
> + * code. Root is typed METHOD during this time.
> + */
> + if ((Node == AcpiGbl_RootNode) &&
> + (WalkState->ParseFlags & ACPI_PARSE_MODULE_LEVEL))
> + {
> + break;
> + }
> +
> + /*lint -fallthrough */
> +
> default:
>
> /* All other types are an error */
> diff --git a/src/acpica/source/components/dispatcher/dswload2.c b/src/acpica/source/components/dispatcher/dswload2.c
> index 85a86ec..139ff95 100644
> --- a/src/acpica/source/components/dispatcher/dswload2.c
> +++ b/src/acpica/source/components/dispatcher/dswload2.c
> @@ -315,6 +315,20 @@ AcpiDsLoad2BeginOp (
> WalkState->ScopeInfo->Common.Value = ACPI_TYPE_ANY;
> break;
>
> + case ACPI_TYPE_METHOD:
> +
> + /*
> + * Allow scope change to root during execution of module-level
> + * code. Root is typed METHOD during this time.
> + */
> + if ((Node == AcpiGbl_RootNode) &&
> + (WalkState->ParseFlags & ACPI_PARSE_MODULE_LEVEL))
> + {
> + break;
> + }
> +
> + /*lint -fallthrough */
> +
> default:
>
> /* All other types are an error */
> diff --git a/src/acpica/source/components/events/evgpe.c b/src/acpica/source/components/events/evgpe.c
> index de32275..bb72a6e 100644
> --- a/src/acpica/source/components/events/evgpe.c
> +++ b/src/acpica/source/components/events/evgpe.c
> @@ -590,6 +590,7 @@ AcpiEvAsynchExecuteGpeMethod (
> ACPI_STATUS Status;
> ACPI_GPE_EVENT_INFO *LocalGpeEventInfo;
> ACPI_EVALUATE_INFO *Info;
> + ACPI_GPE_NOTIFY_INFO *Notify;
>
>
> ACPI_FUNCTION_TRACE (EvAsynchExecuteGpeMethod);
> @@ -645,10 +646,18 @@ AcpiEvAsynchExecuteGpeMethod (
> * completes. The notify handlers are NOT invoked synchronously
> * from this thread -- because handlers may in turn run other
> * control methods.
> + *
> + * June 2012: Expand implicit notify mechanism to support
> + * notifies on multiple device objects.
> */
> - Status = AcpiEvQueueNotifyRequest (
> - LocalGpeEventInfo->Dispatch.DeviceNode,
> - ACPI_NOTIFY_DEVICE_WAKE);
> + Notify = LocalGpeEventInfo->Dispatch.NotifyList;
> + while (ACPI_SUCCESS (Status) && Notify)
> + {
> + Status = AcpiEvQueueNotifyRequest (Notify->DeviceNode,
> + ACPI_NOTIFY_DEVICE_WAKE);
> +
> + Notify = Notify->Next;
> + }
> break;
>
> case ACPI_GPE_DISPATCH_METHOD:
> diff --git a/src/acpica/source/components/events/evgpeutil.c b/src/acpica/source/components/events/evgpeutil.c
> index a5ad320..38c7928 100644
> --- a/src/acpica/source/components/events/evgpeutil.c
> +++ b/src/acpica/source/components/events/evgpeutil.c
> @@ -463,6 +463,8 @@ AcpiEvDeleteGpeHandlers (
> void *Context)
> {
> ACPI_GPE_EVENT_INFO *GpeEventInfo;
> + ACPI_GPE_NOTIFY_INFO *Notify;
> + ACPI_GPE_NOTIFY_INFO *Next;
> UINT32 i;
> UINT32 j;
>
> @@ -484,10 +486,27 @@ AcpiEvDeleteGpeHandlers (
> if ((GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) ==
> ACPI_GPE_DISPATCH_HANDLER)
> {
> + /* Delete an installed handler block */
> +
> ACPI_FREE (GpeEventInfo->Dispatch.Handler);
> GpeEventInfo->Dispatch.Handler = NULL;
> GpeEventInfo->Flags &= ~ACPI_GPE_DISPATCH_MASK;
> }
> + else if ((GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) ==
> + ACPI_GPE_DISPATCH_NOTIFY)
> + {
> + /* Delete the implicit notification device list */
> +
> + Notify = GpeEventInfo->Dispatch.NotifyList;
> + while (Notify)
> + {
> + Next = Notify->Next;
> + ACPI_FREE (Notify);
> + Notify = Next;
> + }
> + GpeEventInfo->Dispatch.NotifyList = NULL;
> + GpeEventInfo->Flags &= ~ACPI_GPE_DISPATCH_MASK;
> + }
> }
> }
>
> diff --git a/src/acpica/source/components/events/evmisc.c b/src/acpica/source/components/events/evmisc.c
> index 7369daa..ae3cecd 100644
> --- a/src/acpica/source/components/events/evmisc.c
> +++ b/src/acpica/source/components/events/evmisc.c
> @@ -183,107 +183,82 @@ AcpiEvQueueNotifyRequest (
> UINT32 NotifyValue)
> {
> ACPI_OPERAND_OBJECT *ObjDesc;
> - ACPI_OPERAND_OBJECT *HandlerObj = NULL;
> - ACPI_GENERIC_STATE *NotifyInfo;
> + ACPI_OPERAND_OBJECT *HandlerListHead = NULL;
> + ACPI_GENERIC_STATE *Info;
> + UINT8 HandlerListId = 0;
> ACPI_STATUS Status = AE_OK;
>
>
> ACPI_FUNCTION_NAME (EvQueueNotifyRequest);
>
>
> - /*
> - * For value 0x03 (Ejection Request), may need to run a device method.
> - * For value 0x02 (Device Wake), if _PRW exists, may need to run
> - * the _PS0 method.
> - * For value 0x80 (Status Change) on the power button or sleep button,
> - * initiate soft-off or sleep operation.
> - *
> - * For all cases, simply dispatch the notify to the handler.
> - */
> - ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
> - "Dispatching Notify on [%4.4s] (%s) Value 0x%2.2X (%s) Node %p\n",
> - AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type),
> - NotifyValue, AcpiUtGetNotifyName (NotifyValue), Node));
> + /* Are Notifies allowed on this object? */
>
> - /* Get the notify object attached to the NS Node */
> -
> - ObjDesc = AcpiNsGetAttachedObject (Node);
> - if (ObjDesc)
> + if (!AcpiEvIsNotifyObject (Node))
> {
> - /* We have the notify object, Get the correct handler */
> -
> - switch (Node->Type)
> - {
> - /* Notify is allowed only on these types */
> + return (AE_TYPE);
> + }
>
> - case ACPI_TYPE_DEVICE:
> - case ACPI_TYPE_THERMAL:
> - case ACPI_TYPE_PROCESSOR:
> + /* Get the correct notify list type (System or Device) */
>
> - if (NotifyValue <= ACPI_MAX_SYS_NOTIFY)
> - {
> - HandlerObj = ObjDesc->CommonNotify.SystemNotify;
> - }
> - else
> - {
> - HandlerObj = ObjDesc->CommonNotify.DeviceNotify;
> - }
> - break;
> + if (NotifyValue <= ACPI_MAX_SYS_NOTIFY)
> + {
> + HandlerListId = ACPI_SYSTEM_HANDLER_LIST;
> + }
> + else
> + {
> + HandlerListId = ACPI_DEVICE_HANDLER_LIST;
> + }
>
> - default:
> + /* Get the notify object attached to the namespace Node */
>
> - /* All other types are not supported */
> + ObjDesc = AcpiNsGetAttachedObject (Node);
> + if (ObjDesc)
> + {
> + /* We have an attached object, Get the correct handler list */
>
> - return (AE_TYPE);
> - }
> + HandlerListHead = ObjDesc->CommonNotify.NotifyList[HandlerListId];
> }
>
> /*
> - * If there is a handler to run, schedule the dispatcher.
> - * Check for:
> - * 1) Global system notify handler
> - * 2) Global device notify handler
> - * 3) Per-device notify handler
> + * If there is no notify handler (Global or Local)
> + * for this object, just ignore the notify
> */
> - if ((AcpiGbl_SystemNotify.Handler &&
> - (NotifyValue <= ACPI_MAX_SYS_NOTIFY)) ||
> - (AcpiGbl_DeviceNotify.Handler &&
> - (NotifyValue > ACPI_MAX_SYS_NOTIFY)) ||
> - HandlerObj)
> + if (!AcpiGbl_GlobalNotify[HandlerListId].Handler && !HandlerListHead)
> {
> - NotifyInfo = AcpiUtCreateGenericState ();
> - if (!NotifyInfo)
> - {
> - return (AE_NO_MEMORY);
> - }
> + ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
> + "No notify handler for Notify, ignoring (%4.4s, %X) node %p\n",
> + AcpiUtGetNodeName (Node), NotifyValue, Node));
>
> - if (!HandlerObj)
> - {
> - ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
> - "Executing system notify handler for Notify (%4.4s, %X) "
> - "node %p\n",
> - AcpiUtGetNodeName (Node), NotifyValue, Node));
> - }
> + return (AE_OK);
> + }
>
> - NotifyInfo->Common.DescriptorType = ACPI_DESC_TYPE_STATE_NOTIFY;
> - NotifyInfo->Notify.Node = Node;
> - NotifyInfo->Notify.Value = (UINT16) NotifyValue;
> - NotifyInfo->Notify.HandlerObj = HandlerObj;
> + /* Setup notify info and schedule the notify dispatcher */
>
> - Status = AcpiOsExecute (
> - OSL_NOTIFY_HANDLER, AcpiEvNotifyDispatch, NotifyInfo);
> - if (ACPI_FAILURE (Status))
> - {
> - AcpiUtDeleteGenericState (NotifyInfo);
> - }
> - }
> - else
> + Info = AcpiUtCreateGenericState ();
> + if (!Info)
> {
> - /* There is no notify handler (per-device or system) for this device */
> + return (AE_NO_MEMORY);
> + }
>
> - ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
> - "No notify handler for Notify (%4.4s, %X) node %p\n",
> - AcpiUtGetNodeName (Node), NotifyValue, Node));
> + Info->Common.DescriptorType = ACPI_DESC_TYPE_STATE_NOTIFY;
> +
> + Info->Notify.Node = Node;
> + Info->Notify.Value = (UINT16) NotifyValue;
> + Info->Notify.HandlerListId = HandlerListId;
> + Info->Notify.HandlerListHead = HandlerListHead;
> + Info->Notify.Global = &AcpiGbl_GlobalNotify[HandlerListId];
> +
> + ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
> + "Dispatching Notify on [%4.4s] (%s) Value 0x%2.2X (%s) Node %p\n",
> + AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type),
> + NotifyValue, AcpiUtGetNotifyName (NotifyValue), Node));
> +
> + Status = AcpiOsExecute (OSL_NOTIFY_HANDLER, AcpiEvNotifyDispatch,
> + Info);
> + if (ACPI_FAILURE (Status))
> + {
> + AcpiUtDeleteGenericState (Info);
> }
>
> return (Status);
> @@ -307,61 +282,37 @@ static void ACPI_SYSTEM_XFACE
> AcpiEvNotifyDispatch (
> void *Context)
> {
> - ACPI_GENERIC_STATE *NotifyInfo = (ACPI_GENERIC_STATE *) Context;
> - ACPI_NOTIFY_HANDLER GlobalHandler = NULL;
> - void *GlobalContext = NULL;
> + ACPI_GENERIC_STATE *Info = (ACPI_GENERIC_STATE *) Context;
> ACPI_OPERAND_OBJECT *HandlerObj;
>
>
> ACPI_FUNCTION_ENTRY ();
>
>
> - /*
> - * We will invoke a global notify handler if installed. This is done
> - * _before_ we invoke the per-device handler attached to the device.
> - */
> - if (NotifyInfo->Notify.Value <= ACPI_MAX_SYS_NOTIFY)
> - {
> - /* Global system notification handler */
> + /* Invoke a global notify handler if installed */
>
> - if (AcpiGbl_SystemNotify.Handler)
> - {
> - GlobalHandler = AcpiGbl_SystemNotify.Handler;
> - GlobalContext = AcpiGbl_SystemNotify.Context;
> - }
> - }
> - else
> + if (Info->Notify.Global->Handler)
> {
> - /* Global driver notification handler */
> -
> - if (AcpiGbl_DeviceNotify.Handler)
> - {
> - GlobalHandler = AcpiGbl_DeviceNotify.Handler;
> - GlobalContext = AcpiGbl_DeviceNotify.Context;
> - }
> + Info->Notify.Global->Handler (Info->Notify.Node,
> + Info->Notify.Value,
> + Info->Notify.Global->Context);
> }
>
> - /* Invoke the system handler first, if present */
> + /* Now invoke the local notify handler(s) if any are installed */
>
> - if (GlobalHandler)
> + HandlerObj = Info->Notify.HandlerListHead;
> + while (HandlerObj)
> {
> - GlobalHandler (NotifyInfo->Notify.Node, NotifyInfo->Notify.Value,
> - GlobalContext);
> - }
> -
> - /* Now invoke the per-device handler, if present */
> -
> - HandlerObj = NotifyInfo->Notify.HandlerObj;
> - if (HandlerObj)
> - {
> - HandlerObj->Notify.Handler (NotifyInfo->Notify.Node,
> - NotifyInfo->Notify.Value,
> + HandlerObj->Notify.Handler (Info->Notify.Node,
> + Info->Notify.Value,
> HandlerObj->Notify.Context);
> +
> + HandlerObj = HandlerObj->Notify.Next[Info->Notify.HandlerListId];
> }
>
> /* All done with the info object */
>
> - AcpiUtDeleteGenericState (NotifyInfo);
> + AcpiUtDeleteGenericState (Info);
> }
>
>
> diff --git a/src/acpica/source/components/events/evxface.c b/src/acpica/source/components/events/evxface.c
> index a6aea09..b0c5ce3 100644
> --- a/src/acpica/source/components/events/evxface.c
> +++ b/src/acpica/source/components/events/evxface.c
> @@ -132,15 +132,21 @@
> *
> * PARAMETERS: Device - The device for which notifies will be handled
> * HandlerType - The type of handler:
> - * ACPI_SYSTEM_NOTIFY: SystemHandler (00-7f)
> - * ACPI_DEVICE_NOTIFY: DriverHandler (80-ff)
> - * ACPI_ALL_NOTIFY: both system and device
> + * ACPI_SYSTEM_NOTIFY: System Handler (00-7F)
> + * ACPI_DEVICE_NOTIFY: Device Handler (80-FF)
> + * ACPI_ALL_NOTIFY: Both System and Device
> * Handler - Address of the handler
> * Context - Value passed to the handler on each GPE
> *
> * RETURN: Status
> *
> - * DESCRIPTION: Install a handler for notifies on an ACPI device
> + * DESCRIPTION: Install a handler for notifications on an ACPI Device,
> + * ThermalZone, or Processor object.
> + *
> + * NOTES: The Root namespace object may have only one handler for each
> + * type of notify (System/Device). Device/Thermal/Processor objects
> + * may have one device notify handler, and multiple system notify
> + * handlers.
> *
> ******************************************************************************/
>
> @@ -151,10 +157,11 @@ AcpiInstallNotifyHandler (
> ACPI_NOTIFY_HANDLER Handler,
> void *Context)
> {
> + ACPI_NAMESPACE_NODE *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Device);
> ACPI_OPERAND_OBJECT *ObjDesc;
> - ACPI_OPERAND_OBJECT *NotifyObj;
> - ACPI_NAMESPACE_NODE *Node;
> + ACPI_OPERAND_OBJECT *HandlerObj;
> ACPI_STATUS Status;
> + UINT32 i;
>
>
> ACPI_FUNCTION_TRACE (AcpiInstallNotifyHandler);
> @@ -162,8 +169,7 @@ AcpiInstallNotifyHandler (
>
> /* Parameter validation */
>
> - if ((!Device) ||
> - (!Handler) ||
> + if ((!Device) || (!Handler) || (!HandlerType) ||
> (HandlerType > ACPI_MAX_NOTIFY_HANDLER_TYPE))
> {
> return_ACPI_STATUS (AE_BAD_PARAMETER);
> @@ -175,135 +181,124 @@ AcpiInstallNotifyHandler (
> return_ACPI_STATUS (Status);
> }
>
> - /* Convert and validate the device handle */
> -
> - Node = AcpiNsValidateHandle (Device);
> - if (!Node)
> - {
> - Status = AE_BAD_PARAMETER;
> - goto UnlockAndExit;
> - }
> -
> /*
> * Root Object:
> * Registering a notify handler on the root object indicates that the
> * caller wishes to receive notifications for all objects. Note that
> - * only one <external> global handler can be regsitered (per notify type).
> + * only one global handler can be registered per notify type.
> + * Ensure that a handler is not already installed.
> */
> if (Device == ACPI_ROOT_OBJECT)
> {
> - /* Make sure the handler is not already installed */
> -
> - if (((HandlerType & ACPI_SYSTEM_NOTIFY) &&
> - AcpiGbl_SystemNotify.Handler) ||
> - ((HandlerType & ACPI_DEVICE_NOTIFY) &&
> - AcpiGbl_DeviceNotify.Handler))
> - {
> - Status = AE_ALREADY_EXISTS;
> - goto UnlockAndExit;
> - }
> -
> - if (HandlerType & ACPI_SYSTEM_NOTIFY)
> - {
> - AcpiGbl_SystemNotify.Node = Node;
> - AcpiGbl_SystemNotify.Handler = Handler;
> - AcpiGbl_SystemNotify.Context = Context;
> - }
> -
> - if (HandlerType & ACPI_DEVICE_NOTIFY)
> + for (i = 0; i < ACPI_NUM_NOTIFY_TYPES; i++)
> {
> - AcpiGbl_DeviceNotify.Node = Node;
> - AcpiGbl_DeviceNotify.Handler = Handler;
> - AcpiGbl_DeviceNotify.Context = Context;
> + if (HandlerType & (i+1))
> + {
> + if (AcpiGbl_GlobalNotify[i].Handler)
> + {
> + Status = AE_ALREADY_EXISTS;
> + goto UnlockAndExit;
> + }
> +
> + AcpiGbl_GlobalNotify[i].Handler = Handler;
> + AcpiGbl_GlobalNotify[i].Context = Context;
> + }
> }
>
> - /* Global notify handler installed */
> + goto UnlockAndExit; /* Global notify handler installed, all done */
> }
>
> /*
> * All Other Objects:
> - * Caller will only receive notifications specific to the target object.
> - * Note that only certain object types can receive notifications.
> + * Caller will only receive notifications specific to the target
> + * object. Note that only certain object types are allowed to
> + * receive notifications.
> */
> - else
> +
> + /* Are Notifies allowed on this object? */
> +
> + if (!AcpiEvIsNotifyObject (Node))
> + {
> + Status = AE_TYPE;
> + goto UnlockAndExit;
> + }
> +
> + /* Check for an existing internal object, might not exist */
> +
> + ObjDesc = AcpiNsGetAttachedObject (Node);
> + if (!ObjDesc)
> {
> - /* Notifies allowed on this object? */
> + /* Create a new object */
>
> - if (!AcpiEvIsNotifyObject (Node))
> + ObjDesc = AcpiUtCreateInternalObject (Node->Type);
> + if (!ObjDesc)
> {
> - Status = AE_TYPE;
> + Status = AE_NO_MEMORY;
> goto UnlockAndExit;
> }
>
> - /* Check for an existing internal object */
> + /* Attach new object to the Node, remove local reference */
>
> - ObjDesc = AcpiNsGetAttachedObject (Node);
> - if (ObjDesc)
> + Status = AcpiNsAttachObject (Device, ObjDesc, Node->Type);
> + AcpiUtRemoveReference (ObjDesc);
> + if (ACPI_FAILURE (Status))
> {
> - /* Object exists - make sure there's no handler */
> -
> - if (((HandlerType & ACPI_SYSTEM_NOTIFY) &&
> - ObjDesc->CommonNotify.SystemNotify) ||
> - ((HandlerType & ACPI_DEVICE_NOTIFY) &&
> - ObjDesc->CommonNotify.DeviceNotify))
> - {
> - Status = AE_ALREADY_EXISTS;
> - goto UnlockAndExit;
> - }
> + goto UnlockAndExit;
> }
> - else
> - {
> - /* Create a new object */
> -
> - ObjDesc = AcpiUtCreateInternalObject (Node->Type);
> - if (!ObjDesc)
> - {
> - Status = AE_NO_MEMORY;
> - goto UnlockAndExit;
> - }
> -
> - /* Attach new object to the Node */
> -
> - Status = AcpiNsAttachObject (Device, ObjDesc, Node->Type);
> + }
>
> - /* Remove local reference to the object */
> + /* Ensure that the handler is not already installed in the lists */
>
> - AcpiUtRemoveReference (ObjDesc);
> - if (ACPI_FAILURE (Status))
> + for (i = 0; i < ACPI_NUM_NOTIFY_TYPES; i++)
> + {
> + if (HandlerType & (i+1))
> + {
> + HandlerObj = ObjDesc->CommonNotify.NotifyList[i];
> + while (HandlerObj)
> {
> - goto UnlockAndExit;
> + if (HandlerObj->Notify.Handler == Handler)
> + {
> + Status = AE_ALREADY_EXISTS;
> + goto UnlockAndExit;
> + }
> +
> + HandlerObj = HandlerObj->Notify.Next[i];
> }
> }
> + }
>
> - /* Install the handler */
> + /* Create and populate a new notify handler object */
>
> - NotifyObj = AcpiUtCreateInternalObject (ACPI_TYPE_LOCAL_NOTIFY);
> - if (!NotifyObj)
> - {
> - Status = AE_NO_MEMORY;
> - goto UnlockAndExit;
> - }
> + HandlerObj = AcpiUtCreateInternalObject (ACPI_TYPE_LOCAL_NOTIFY);
> + if (!HandlerObj)
> + {
> + Status = AE_NO_MEMORY;
> + goto UnlockAndExit;
> + }
>
> - NotifyObj->Notify.Node = Node;
> - NotifyObj->Notify.Handler = Handler;
> - NotifyObj->Notify.Context = Context;
> + HandlerObj->Notify.Node = Node;
> + HandlerObj->Notify.HandlerType = HandlerType;
> + HandlerObj->Notify.Handler = Handler;
> + HandlerObj->Notify.Context = Context;
>
> - if (HandlerType & ACPI_SYSTEM_NOTIFY)
> - {
> - ObjDesc->CommonNotify.SystemNotify = NotifyObj;
> - }
> + /* Install the handler at the list head(s) */
>
> - if (HandlerType & ACPI_DEVICE_NOTIFY)
> + for (i = 0; i < ACPI_NUM_NOTIFY_TYPES; i++)
> + {
> + if (HandlerType & (i+1))
> {
> - ObjDesc->CommonNotify.DeviceNotify = NotifyObj;
> + HandlerObj->Notify.Next[i] =
> + ObjDesc->CommonNotify.NotifyList[i];
> +
> + ObjDesc->CommonNotify.NotifyList[i] = HandlerObj;
> }
> + }
>
> - if (HandlerType == ACPI_ALL_NOTIFY)
> - {
> - /* Extra ref if installed in both */
> + /* Add an extra reference if handler was installed in both lists */
>
> - AcpiUtAddReference (NotifyObj);
> - }
> + if (HandlerType == ACPI_ALL_NOTIFY)
> + {
> + AcpiUtAddReference (HandlerObj);
> }
>
>
> @@ -319,11 +314,11 @@ ACPI_EXPORT_SYMBOL (AcpiInstallNotifyHandler)
> *
> * FUNCTION: AcpiRemoveNotifyHandler
> *
> - * PARAMETERS: Device - The device for which notifies will be handled
> + * PARAMETERS: Device - The device for which the handler is installed
> * HandlerType - The type of handler:
> - * ACPI_SYSTEM_NOTIFY: SystemHandler (00-7f)
> - * ACPI_DEVICE_NOTIFY: DriverHandler (80-ff)
> - * ACPI_ALL_NOTIFY: both system and device
> + * ACPI_SYSTEM_NOTIFY: System Handler (00-7F)
> + * ACPI_DEVICE_NOTIFY: Device Handler (80-FF)
> + * ACPI_ALL_NOTIFY: Both System and Device
> * Handler - Address of the handler
> *
> * RETURN: Status
> @@ -338,10 +333,12 @@ AcpiRemoveNotifyHandler (
> UINT32 HandlerType,
> ACPI_NOTIFY_HANDLER Handler)
> {
> - ACPI_OPERAND_OBJECT *NotifyObj;
> + ACPI_NAMESPACE_NODE *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Device);
> ACPI_OPERAND_OBJECT *ObjDesc;
> - ACPI_NAMESPACE_NODE *Node;
> + ACPI_OPERAND_OBJECT *HandlerObj;
> + ACPI_OPERAND_OBJECT *PreviousHandlerObj;
> ACPI_STATUS Status;
> + UINT32 i;
>
>
> ACPI_FUNCTION_TRACE (AcpiRemoveNotifyHandler);
> @@ -349,122 +346,103 @@ AcpiRemoveNotifyHandler (
>
> /* Parameter validation */
>
> - if ((!Device) ||
> - (!Handler) ||
> + if ((!Device) || (!Handler) || (!HandlerType) ||
> (HandlerType > ACPI_MAX_NOTIFY_HANDLER_TYPE))
> {
> return_ACPI_STATUS (AE_BAD_PARAMETER);
> }
>
> + /* Make sure all deferred notify tasks are completed */
> +
> + AcpiOsWaitEventsComplete ();
> +
> Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
> if (ACPI_FAILURE (Status))
> {
> return_ACPI_STATUS (Status);
> }
>
> - /* Convert and validate the device handle */
> -
> - Node = AcpiNsValidateHandle (Device);
> - if (!Node)
> - {
> - Status = AE_BAD_PARAMETER;
> - goto UnlockAndExit;
> - }
> -
> - /* Root Object */
> + /* Root Object. Global handlers are removed here */
>
> if (Device == ACPI_ROOT_OBJECT)
> {
> - ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
> - "Removing notify handler for namespace root object\n"));
> -
> - if (((HandlerType & ACPI_SYSTEM_NOTIFY) &&
> - !AcpiGbl_SystemNotify.Handler) ||
> - ((HandlerType & ACPI_DEVICE_NOTIFY) &&
> - !AcpiGbl_DeviceNotify.Handler))
> - {
> - Status = AE_NOT_EXIST;
> - goto UnlockAndExit;
> - }
> -
> - if (HandlerType & ACPI_SYSTEM_NOTIFY)
> + for (i = 0; i < ACPI_NUM_NOTIFY_TYPES; i++)
> {
> - AcpiGbl_SystemNotify.Node = NULL;
> - AcpiGbl_SystemNotify.Handler = NULL;
> - AcpiGbl_SystemNotify.Context = NULL;
> + if (HandlerType & (i+1))
> + {
> + if (!AcpiGbl_GlobalNotify[i].Handler ||
> + (AcpiGbl_GlobalNotify[i].Handler != Handler))
> + {
> + Status = AE_NOT_EXIST;
> + goto UnlockAndExit;
> + }
> +
> + ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
> + "Removing global notify handler\n"));
> +
> + AcpiGbl_GlobalNotify[i].Handler = NULL;
> + AcpiGbl_GlobalNotify[i].Context = NULL;
> + }
> }
>
> - if (HandlerType & ACPI_DEVICE_NOTIFY)
> - {
> - AcpiGbl_DeviceNotify.Node = NULL;
> - AcpiGbl_DeviceNotify.Handler = NULL;
> - AcpiGbl_DeviceNotify.Context = NULL;
> - }
> + goto UnlockAndExit;
> }
>
> - /* All Other Objects */
> + /* All other objects: Are Notifies allowed on this object? */
>
> - else
> + if (!AcpiEvIsNotifyObject (Node))
> {
> - /* Notifies allowed on this object? */
> + Status = AE_TYPE;
> + goto UnlockAndExit;
> + }
>
> - if (!AcpiEvIsNotifyObject (Node))
> - {
> - Status = AE_TYPE;
> - goto UnlockAndExit;
> - }
> + /* Must have an existing internal object */
> +
> + ObjDesc = AcpiNsGetAttachedObject (Node);
> + if (!ObjDesc)
> + {
> + Status = AE_NOT_EXIST;
> + goto UnlockAndExit;
> + }
>
> - /* Check for an existing internal object */
> + /* Internal object exists. Find the handler and remove it */
>
> - ObjDesc = AcpiNsGetAttachedObject (Node);
> - if (!ObjDesc)
> + for (i = 0; i < ACPI_NUM_NOTIFY_TYPES; i++)
> + {
> + if (HandlerType & (i+1))
> {
> - Status = AE_NOT_EXIST;
> - goto UnlockAndExit;
> - }
> + HandlerObj = ObjDesc->CommonNotify.NotifyList[i];
> + PreviousHandlerObj = NULL;
>
> - /* Object exists - make sure there's an existing handler */
> + /* Attempt to find the handler in the handler list */
>
> - if (HandlerType & ACPI_SYSTEM_NOTIFY)
> - {
> - NotifyObj = ObjDesc->CommonNotify.SystemNotify;
> - if (!NotifyObj)
> + while (HandlerObj &&
> + (HandlerObj->Notify.Handler != Handler))
> {
> - Status = AE_NOT_EXIST;
> - goto UnlockAndExit;
> + PreviousHandlerObj = HandlerObj;
> + HandlerObj = HandlerObj->Notify.Next[i];
> }
>
> - if (NotifyObj->Notify.Handler != Handler)
> + if (!HandlerObj)
> {
> - Status = AE_BAD_PARAMETER;
> + Status = AE_NOT_EXIST;
> goto UnlockAndExit;
> }
>
> - /* Remove the handler */
> + /* Remove the handler object from the list */
>
> - ObjDesc->CommonNotify.SystemNotify = NULL;
> - AcpiUtRemoveReference (NotifyObj);
> - }
> -
> - if (HandlerType & ACPI_DEVICE_NOTIFY)
> - {
> - NotifyObj = ObjDesc->CommonNotify.DeviceNotify;
> - if (!NotifyObj)
> + if (PreviousHandlerObj) /* Handler is not at the list head */
> {
> - Status = AE_NOT_EXIST;
> - goto UnlockAndExit;
> + PreviousHandlerObj->Notify.Next[i] =
> + HandlerObj->Notify.Next[i];
> }
> -
> - if (NotifyObj->Notify.Handler != Handler)
> + else /* Handler is at the list head */
> {
> - Status = AE_BAD_PARAMETER;
> - goto UnlockAndExit;
> + ObjDesc->CommonNotify.NotifyList[i] =
> + HandlerObj->Notify.Next[i];
> }
>
> - /* Remove the handler */
> -
> - ObjDesc->CommonNotify.DeviceNotify = NULL;
> - AcpiUtRemoveReference (NotifyObj);
> + AcpiUtRemoveReference (HandlerObj);
> }
> }
>
> @@ -894,6 +872,10 @@ AcpiRemoveGpeHandler (
> return_ACPI_STATUS (AE_BAD_PARAMETER);
> }
>
> + /* Make sure all deferred GPE tasks are completed */
> +
> + AcpiOsWaitEventsComplete ();
> +
> Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
> if (ACPI_FAILURE (Status))
> {
> diff --git a/src/acpica/source/components/events/evxfgpe.c b/src/acpica/source/components/events/evxfgpe.c
> index 7018513..29e1d68 100644
> --- a/src/acpica/source/components/events/evxfgpe.c
> +++ b/src/acpica/source/components/events/evxfgpe.c
> @@ -155,7 +155,7 @@ AcpiUpdateAllGpes (
> ACPI_STATUS Status;
>
>
> - ACPI_FUNCTION_TRACE (AcpiUpdateGpes);
> + ACPI_FUNCTION_TRACE (AcpiUpdateAllGpes);
>
>
> Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
> @@ -367,9 +367,11 @@ AcpiSetupGpeForWake (
> ACPI_HANDLE GpeDevice,
> UINT32 GpeNumber)
> {
> - ACPI_STATUS Status = AE_BAD_PARAMETER;
> + ACPI_STATUS Status;
> ACPI_GPE_EVENT_INFO *GpeEventInfo;
> ACPI_NAMESPACE_NODE *DeviceNode;
> + ACPI_GPE_NOTIFY_INFO *Notify;
> + ACPI_GPE_NOTIFY_INFO *NewNotify;
> ACPI_CPU_FLAGS Flags;
>
>
> @@ -405,32 +407,88 @@ AcpiSetupGpeForWake (
> return_ACPI_STATUS (AE_BAD_PARAMETER);
> }
>
> + /*
> + * Allocate a new notify object up front, in case it is needed.
> + * Memory allocation while holding a spinlock is a big no-no
> + * on some hosts.
> + */
> + NewNotify = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_GPE_NOTIFY_INFO));
> + if (!NewNotify)
> + {
> + return_ACPI_STATUS (AE_NO_MEMORY);
> + }
> +
> Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
>
> /* Ensure that we have a valid GPE number */
>
> GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber);
> - if (GpeEventInfo)
> + if (!GpeEventInfo)
> + {
> + Status = AE_BAD_PARAMETER;
> + goto UnlockAndExit;
> + }
> +
> + /*
> + * If there is no method or handler for this GPE, then the
> + * WakeDevice will be notified whenever this GPE fires. This is
> + * known as an "implicit notify". Note: The GPE is assumed to be
> + * level-triggered (for windows compatibility).
> + */
> + if ((GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) ==
> + ACPI_GPE_DISPATCH_NONE)
> {
> /*
> - * If there is no method or handler for this GPE, then the
> - * WakeDevice will be notified whenever this GPE fires (aka
> - * "implicit notify") Note: The GPE is assumed to be
> - * level-triggered (for windows compatibility).
> + * This is the first device for implicit notify on this GPE.
> + * Just set the flags here, and enter the NOTIFY block below.
> */
> - if ((GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) ==
> - ACPI_GPE_DISPATCH_NONE)
> + GpeEventInfo->Flags =
> + (ACPI_GPE_DISPATCH_NOTIFY | ACPI_GPE_LEVEL_TRIGGERED);
> + }
> +
> + /*
> + * If we already have an implicit notify on this GPE, add
> + * this device to the notify list.
> + */
> + if ((GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) ==
> + ACPI_GPE_DISPATCH_NOTIFY)
> + {
> + /* Ensure that the device is not already in the list */
> +
> + Notify = GpeEventInfo->Dispatch.NotifyList;
> + while (Notify)
> {
> - GpeEventInfo->Flags =
> - (ACPI_GPE_DISPATCH_NOTIFY | ACPI_GPE_LEVEL_TRIGGERED);
> - GpeEventInfo->Dispatch.DeviceNode = DeviceNode;
> + if (Notify->DeviceNode == DeviceNode)
> + {
> + Status = AE_ALREADY_EXISTS;
> + goto UnlockAndExit;
> + }
> + Notify = Notify->Next;
> }
>
> - GpeEventInfo->Flags |= ACPI_GPE_CAN_WAKE;
> - Status = AE_OK;
> + /* Add this device to the notify list for this GPE */
> +
> + NewNotify->DeviceNode = DeviceNode;
> + NewNotify->Next = GpeEventInfo->Dispatch.NotifyList;
> + GpeEventInfo->Dispatch.NotifyList = NewNotify;
> + NewNotify = NULL;
> }
>
> + /* Mark the GPE as a possible wake event */
> +
> + GpeEventInfo->Flags |= ACPI_GPE_CAN_WAKE;
> + Status = AE_OK;
> +
> +
> +UnlockAndExit:
> AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
> +
> + /* Delete the notify object if it was not used above */
> +
> + if (NewNotify)
> + {
> + ACPI_FREE (NewNotify);
> + }
> return_ACPI_STATUS (Status);
> }
>
> diff --git a/src/acpica/source/components/executer/exconfig.c b/src/acpica/source/components/executer/exconfig.c
> index 69361d5..55cef28 100644
> --- a/src/acpica/source/components/executer/exconfig.c
> +++ b/src/acpica/source/components/executer/exconfig.c
> @@ -252,7 +252,7 @@ AcpiExLoadTableOp (
> ACPI_FUNCTION_TRACE (ExLoadTableOp);
>
>
> - /* Validate lengths for the SignatureString, OEMIDString, OEMTableID */
> + /* Validate lengths for the Signature, OemId, and OemTableId strings */
>
> if ((Operand[0]->String.Length > ACPI_NAME_SIZE) ||
> (Operand[1]->String.Length > ACPI_OEM_ID_SIZE) ||
> diff --git a/src/acpica/source/components/executer/exdump.c b/src/acpica/source/components/executer/exdump.c
> index 5aab606..b525333 100644
> --- a/src/acpica/source/components/executer/exdump.c
> +++ b/src/acpica/source/components/executer/exdump.c
> @@ -203,8 +203,8 @@ static ACPI_EXDUMP_INFO AcpiExDumpDevice[4] =
> {
> {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpDevice), NULL},
> {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Device.Handler), "Handler"},
> - {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Device.SystemNotify), "System Notify"},
> - {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Device.DeviceNotify), "Device Notify"}
> + {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Device.NotifyList[0]), "System Notify"},
> + {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Device.NotifyList[1]), "Device Notify"}
> };
>
> static ACPI_EXDUMP_INFO AcpiExDumpEvent[2] =
> @@ -251,8 +251,8 @@ static ACPI_EXDUMP_INFO AcpiExDumpPower[5] =
> {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpPower), NULL},
> {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (PowerResource.SystemLevel), "System Level"},
> {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (PowerResource.ResourceOrder), "Resource Order"},
> - {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (PowerResource.SystemNotify), "System Notify"},
> - {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (PowerResource.DeviceNotify), "Device Notify"}
> + {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (PowerResource.NotifyList[0]), "System Notify"},
> + {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (PowerResource.NotifyList[1]), "Device Notify"}
> };
>
> static ACPI_EXDUMP_INFO AcpiExDumpProcessor[7] =
> @@ -261,16 +261,16 @@ static ACPI_EXDUMP_INFO AcpiExDumpProcessor[7] =
> {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Processor.ProcId), "Processor ID"},
> {ACPI_EXD_UINT8 , ACPI_EXD_OFFSET (Processor.Length), "Length"},
> {ACPI_EXD_ADDRESS, ACPI_EXD_OFFSET (Processor.Address), "Address"},
> - {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Processor.SystemNotify), "System Notify"},
> - {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Processor.DeviceNotify), "Device Notify"},
> + {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Processor.NotifyList[0]), "System Notify"},
> + {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Processor.NotifyList[1]), "Device Notify"},
> {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Processor.Handler), "Handler"}
> };
>
> static ACPI_EXDUMP_INFO AcpiExDumpThermal[4] =
> {
> {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpThermal), NULL},
> - {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (ThermalZone.SystemNotify), "System Notify"},
> - {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (ThermalZone.DeviceNotify), "Device Notify"},
> + {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (ThermalZone.NotifyList[0]), "System Notify"},
> + {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (ThermalZone.NotifyList[1]), "Device Notify"},
> {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (ThermalZone.Handler), "Handler"}
> };
>
> @@ -330,11 +330,15 @@ static ACPI_EXDUMP_INFO AcpiExDumpAddressHandler[6] =
> {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (AddressSpace.Context), "Context"}
> };
>
> -static ACPI_EXDUMP_INFO AcpiExDumpNotify[3] =
> +static ACPI_EXDUMP_INFO AcpiExDumpNotify[7] =
> {
> {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpNotify), NULL},
> {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Notify.Node), "Node"},
> - {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Notify.Context), "Context"}
> + {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (Notify.HandlerType), "Handler Type"},
> + {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Notify.Handler), "Handler"},
> + {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Notify.Context), "Context"},
> + {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Notify.Next[0]), "Next System Notify"},
> + {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Notify.Next[1]), "Next Device Notify"}
> };
>
>
> diff --git a/src/acpica/source/components/executer/exprep.c b/src/acpica/source/components/executer/exprep.c
> index 0b65ab9..9b05f9d 100644
> --- a/src/acpica/source/components/executer/exprep.c
> +++ b/src/acpica/source/components/executer/exprep.c
> @@ -490,8 +490,8 @@ AcpiExPrepCommonFieldObject (
> *
> * RETURN: Status
> *
> - * DESCRIPTION: Construct an ACPI_OPERAND_OBJECT of type DefField and
> - * connect it to the parent Node.
> + * DESCRIPTION: Construct an object of type ACPI_OPERAND_OBJECT with a
> + * subtype of DefField and connect it to the parent Node.
> *
> ******************************************************************************/
>
> diff --git a/src/acpica/source/components/executer/exresolv.c b/src/acpica/source/components/executer/exresolv.c
> index 8d3893b..4b9e9b3 100644
> --- a/src/acpica/source/components/executer/exresolv.c
> +++ b/src/acpica/source/components/executer/exresolv.c
> @@ -237,7 +237,7 @@ AcpiExResolveObjectToValue (
>
> StackDesc = *StackPtr;
>
> - /* This is an ACPI_OPERAND_OBJECT */
> + /* This is an object of type ACPI_OPERAND_OBJECT */
>
> switch (StackDesc->Common.Type)
> {
> diff --git a/src/acpica/source/components/executer/exstore.c b/src/acpica/source/components/executer/exstore.c
> index 8bea79b..36fccf8 100644
> --- a/src/acpica/source/components/executer/exstore.c
> +++ b/src/acpica/source/components/executer/exstore.c
> @@ -140,15 +140,15 @@ AcpiExStoreObjectToIndex (
> * FUNCTION: AcpiExStore
> *
> * PARAMETERS: *SourceDesc - Value to be stored
> - * *DestDesc - Where to store it. Must be an NS node
> - * or an ACPI_OPERAND_OBJECT of type
> + * *DestDesc - Where to store it. Must be an NS node
> + * or ACPI_OPERAND_OBJECT of type
> * Reference;
> * WalkState - Current walk state
> *
> * RETURN: Status
> *
> * DESCRIPTION: Store the value described by SourceDesc into the location
> - * described by DestDesc. Called by various interpreter
> + * described by DestDesc. Called by various interpreter
> * functions to store the result of an operation into
> * the destination operand -- not just simply the actual "Store"
> * ASL operator.
> diff --git a/src/acpica/source/components/executer/exutils.c b/src/acpica/source/components/executer/exutils.c
> index 3ebcbe5..28a18ad 100644
> --- a/src/acpica/source/components/executer/exutils.c
> +++ b/src/acpica/source/components/executer/exutils.c
> @@ -193,7 +193,7 @@ AcpiExEnterInterpreter (
> *
> * DESCRIPTION: Reacquire the interpreter execution region from within the
> * interpreter code. Failure to enter the interpreter region is a
> - * fatal system error. Used in conjuction with
> + * fatal system error. Used in conjunction with
> * RelinquishInterpreter
> *
> ******************************************************************************/
> diff --git a/src/acpica/source/components/hardware/hwsleep.c b/src/acpica/source/components/hardware/hwsleep.c
> index 6fd9d66..a2e4c43 100644
> --- a/src/acpica/source/components/hardware/hwsleep.c
> +++ b/src/acpica/source/components/hardware/hwsleep.c
> @@ -171,20 +171,6 @@ AcpiHwLegacySleep (
> return_ACPI_STATUS (Status);
> }
>
> - if (SleepState != ACPI_STATE_S5)
> - {
> - /*
> - * Disable BM arbitration. This feature is contained within an
> - * optional register (PM2 Control), so ignore a BAD_ADDRESS
> - * exception.
> - */
> - Status = AcpiWriteBitRegister (ACPI_BITREG_ARB_DISABLE, 1);
> - if (ACPI_FAILURE (Status) && (Status != AE_BAD_ADDRESS))
> - {
> - return_ACPI_STATUS (Status);
> - }
> - }
> -
> /*
> * 1) Disable/Clear all GPEs
> * 2) Enable all wakeup GPEs
> @@ -452,17 +438,6 @@ AcpiHwLegacyWake (
> AcpiGbl_FixedEventInfo[ACPI_EVENT_POWER_BUTTON].StatusRegisterId,
> ACPI_CLEAR_STATUS);
>
> - /*
> - * Enable BM arbitration. This feature is contained within an
> - * optional register (PM2 Control), so ignore a BAD_ADDRESS
> - * exception.
> - */
> - Status = AcpiWriteBitRegister (ACPI_BITREG_ARB_DISABLE, 0);
> - if (ACPI_FAILURE (Status) && (Status != AE_BAD_ADDRESS))
> - {
> - return_ACPI_STATUS (Status);
> - }
> -
> AcpiHwExecuteSleepMethod (METHOD_PATHNAME__SST, ACPI_SST_WORKING);
> return_ACPI_STATUS (Status);
> }
> diff --git a/src/acpica/source/components/hardware/hwxfsleep.c b/src/acpica/source/components/hardware/hwxfsleep.c
> index 631b81e..dfb7112 100644
> --- a/src/acpica/source/components/hardware/hwxfsleep.c
> +++ b/src/acpica/source/components/hardware/hwxfsleep.c
> @@ -173,6 +173,14 @@ AcpiSetFirmwareWakingVector (
> ACPI_FUNCTION_TRACE (AcpiSetFirmwareWakingVector);
>
>
> + /*
> + * According to the ACPI specification 2.0c and later, the 64-bit
> + * waking vector should be cleared and the 32-bit waking vector should
> + * be used, unless we want the wake-up code to be called by the BIOS in
> + * Protected Mode. Some systems (for example HP dv5-1004nr) are known
> + * to fail to resume if the 64-bit vector is used.
> + */
> +
> /* Set the 32-bit vector */
>
> AcpiGbl_FACS->FirmwareWakingVector = PhysicalAddress;
> diff --git a/src/acpica/source/components/namespace/nspredef.c b/src/acpica/source/components/namespace/nspredef.c
> index e6c7cf6..8bc2591 100644
> --- a/src/acpica/source/components/namespace/nspredef.c
> +++ b/src/acpica/source/components/namespace/nspredef.c
> @@ -753,7 +753,7 @@ AcpiNsCheckPackage (
> {
> /* Create the new outer package and populate it */
>
> - Status = AcpiNsWrapWithPackage (Data, *Elements, ReturnObjectPtr);
> + Status = AcpiNsWrapWithPackage (Data, ReturnObject, ReturnObjectPtr);
> if (ACPI_FAILURE (Status))
> {
> return (Status);
> diff --git a/src/acpica/source/components/parser/psxface.c b/src/acpica/source/components/parser/psxface.c
> index 11c5fc2..5da1b6a 100644
> --- a/src/acpica/source/components/parser/psxface.c
> +++ b/src/acpica/source/components/parser/psxface.c
> @@ -420,8 +420,8 @@ AcpiPsExecuteMethod (
> }
>
> /*
> - * Start method evaluation with an implicit return of zero. This is done
> - * for Windows compatibility.
> + * Start method evaluation with an implicit return of zero.
> + * This is done for Windows compatibility.
> */
> if (AcpiGbl_EnableInterpreterSlack)
> {
> diff --git a/src/acpica/source/components/resources/rscreate.c b/src/acpica/source/components/resources/rscreate.c
> index d75ceb6..6aaf4bb 100644
> --- a/src/acpica/source/components/resources/rscreate.c
> +++ b/src/acpica/source/components/resources/rscreate.c
> @@ -281,8 +281,8 @@ AcpiRsCreateResourceList (
> *
> * FUNCTION: AcpiRsCreatePciRoutingTable
> *
> - * PARAMETERS: PackageObject - Pointer to an ACPI_OPERAND_OBJECT
> - * package
> + * PARAMETERS: PackageObject - Pointer to a package containing one
> + * of more ACPI_OPERAND_OBJECTs
> * OutputBuffer - Pointer to the user's buffer
> *
> * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code.
> @@ -290,7 +290,7 @@ AcpiRsCreateResourceList (
> * AE_BUFFER_OVERFLOW and OutputBuffer->Length will point
> * to the size buffer needed.
> *
> - * DESCRIPTION: Takes the ACPI_OPERAND_OBJECT package and creates a
> + * DESCRIPTION: Takes the ACPI_OPERAND_OBJECT package and creates a
> * linked list of PCI interrupt descriptions
> *
> * NOTE: It is the caller's responsibility to ensure that the start of the
> diff --git a/src/acpica/source/components/resources/rsutils.c b/src/acpica/source/components/resources/rsutils.c
> index ce3143c..a45b3d6 100644
> --- a/src/acpica/source/components/resources/rsutils.c
> +++ b/src/acpica/source/components/resources/rsutils.c
> @@ -253,7 +253,7 @@ AcpiRsMoveData (
>
> /*
> * 16-, 32-, and 64-bit cases must use the move macros that perform
> - * endian conversion and/or accomodate hardware that cannot perform
> + * endian conversion and/or accommodate hardware that cannot perform
> * misaligned memory transfers
> */
> case ACPI_RSC_MOVE16:
> diff --git a/src/acpica/source/components/tables/tbfadt.c b/src/acpica/source/components/tables/tbfadt.c
> index fa43dbb..2c51511 100644
> --- a/src/acpica/source/components/tables/tbfadt.c
> +++ b/src/acpica/source/components/tables/tbfadt.c
> @@ -124,12 +124,13 @@
>
> /* Local prototypes */
>
> -static ACPI_INLINE void
> +static void
> AcpiTbInitGenericAddress (
> ACPI_GENERIC_ADDRESS *GenericAddress,
> UINT8 SpaceId,
> UINT8 ByteWidth,
> - UINT64 Address);
> + UINT64 Address,
> + char *RegisterName);
>
> static void
> AcpiTbConvertFadt (
> @@ -263,7 +264,7 @@ static ACPI_FADT_PM_INFO FadtPmInfoTable[] =
> *
> * PARAMETERS: GenericAddress - GAS struct to be initialized
> * SpaceId - ACPI Space ID for this register
> - * ByteWidth - Width of this register, in bytes
> + * ByteWidth - Width of this register
> * Address - Address of the register
> *
> * RETURN: None
> @@ -274,13 +275,30 @@ static ACPI_FADT_PM_INFO FadtPmInfoTable[] =
> *
> ******************************************************************************/
>
> -static ACPI_INLINE void
> +static void
> AcpiTbInitGenericAddress (
> ACPI_GENERIC_ADDRESS *GenericAddress,
> UINT8 SpaceId,
> UINT8 ByteWidth,
> - UINT64 Address)
> + UINT64 Address,
> + char *RegisterName)
> {
> + UINT8 BitWidth;
> +
> +
> + /* Bit width field in the GAS is only one byte long, 255 max */
> +
> + BitWidth = (UINT8) (ByteWidth * 8);
> +
> + if (ByteWidth > 31) /* (31*8)=248 */
> + {
> + ACPI_ERROR ((AE_INFO,
> + "%s - 32-bit FADT register is too long (%u bytes, %u bits) "
> + "to convert to GAS struct - 255 bits max, truncating",
> + RegisterName, ByteWidth, (ByteWidth * 8)));
> +
> + BitWidth = 255;
> + }
>
> /*
> * The 64-bit Address field is non-aligned in the byte packed
> @@ -291,7 +309,7 @@ AcpiTbInitGenericAddress (
> /* All other fields are byte-wide */
>
> GenericAddress->SpaceId = SpaceId;
> - GenericAddress->BitWidth = (UINT8) ACPI_MUL_8 (ByteWidth);
> + GenericAddress->BitWidth = BitWidth;
> GenericAddress->BitOffset = 0;
> GenericAddress->AccessWidth = 0; /* Access width ANY */
> }
> @@ -392,7 +410,7 @@ AcpiTbCreateLocalFadt (
> */
> if (Length > sizeof (ACPI_TABLE_FADT))
> {
> - ACPI_WARNING ((AE_INFO,
> + ACPI_BIOS_WARNING ((AE_INFO,
> "FADT (revision %u) is longer than ACPI 5.0 version, "
> "truncating length %u to %u",
> Table->Revision, Length, (UINT32) sizeof (ACPI_TABLE_FADT)));
> @@ -540,8 +558,9 @@ AcpiTbConvertFadt (
> if (Address64->Address && Address32 &&
> (Address64->Address != (UINT64) Address32))
> {
> - ACPI_ERROR ((AE_INFO,
> - "32/64X address mismatch in %s: 0x%8.8X/0x%8.8X%8.8X, using 32",
> + ACPI_BIOS_ERROR ((AE_INFO,
> + "32/64X address mismatch in FADT/%s: "
> + "0x%8.8X/0x%8.8X%8.8X, using 32",
> FadtInfoTable[i].Name, Address32,
> ACPI_FORMAT_UINT64 (Address64->Address)));
> }
> @@ -556,7 +575,7 @@ AcpiTbConvertFadt (
> */
> AcpiTbInitGenericAddress (Address64, ACPI_ADR_SPACE_SYSTEM_IO,
> *ACPI_ADD_PTR (UINT8, &AcpiGbl_FADT, FadtInfoTable[i].Length),
> - (UINT64) Address32);
> + (UINT64) Address32, FadtInfoTable[i].Name);
> }
> }
> }
> @@ -600,7 +619,7 @@ AcpiTbValidateFadt (
> if (AcpiGbl_FADT.Facs &&
> (AcpiGbl_FADT.XFacs != (UINT64) AcpiGbl_FADT.Facs))
> {
> - ACPI_WARNING ((AE_INFO,
> + ACPI_BIOS_WARNING ((AE_INFO,
> "32/64X FACS address mismatch in FADT - "
> "0x%8.8X/0x%8.8X%8.8X, using 32",
> AcpiGbl_FADT.Facs, ACPI_FORMAT_UINT64 (AcpiGbl_FADT.XFacs)));
> @@ -611,7 +630,7 @@ AcpiTbValidateFadt (
> if (AcpiGbl_FADT.Dsdt &&
> (AcpiGbl_FADT.XDsdt != (UINT64) AcpiGbl_FADT.Dsdt))
> {
> - ACPI_WARNING ((AE_INFO,
> + ACPI_BIOS_WARNING ((AE_INFO,
> "32/64X DSDT address mismatch in FADT - "
> "0x%8.8X/0x%8.8X%8.8X, using 32",
> AcpiGbl_FADT.Dsdt, ACPI_FORMAT_UINT64 (AcpiGbl_FADT.XDsdt)));
> @@ -647,8 +666,8 @@ AcpiTbValidateFadt (
> if (Address64->Address &&
> (Address64->BitWidth != ACPI_MUL_8 (Length)))
> {
> - ACPI_WARNING ((AE_INFO,
> - "32/64X length mismatch in %s: %u/%u",
> + ACPI_BIOS_WARNING ((AE_INFO,
> + "32/64X length mismatch in FADT/%s: %u/%u",
> Name, ACPI_MUL_8 (Length), Address64->BitWidth));
> }
>
> @@ -660,9 +679,9 @@ AcpiTbValidateFadt (
> */
> if (!Address64->Address || !Length)
> {
> - ACPI_ERROR ((AE_INFO,
> - "Required field %s has zero address and/or length:"
> - " 0x%8.8X%8.8X/0x%X",
> + ACPI_BIOS_ERROR ((AE_INFO,
> + "Required FADT field %s has zero address and/or length: "
> + "0x%8.8X%8.8X/0x%X",
> Name, ACPI_FORMAT_UINT64 (Address64->Address), Length));
> }
> }
> @@ -676,8 +695,8 @@ AcpiTbValidateFadt (
> if ((Address64->Address && !Length) ||
> (!Address64->Address && Length))
> {
> - ACPI_WARNING ((AE_INFO,
> - "Optional field %s has zero address or length: "
> + ACPI_BIOS_WARNING ((AE_INFO,
> + "Optional FADT field %s has zero address or length: "
> "0x%8.8X%8.8X/0x%X",
> Name, ACPI_FORMAT_UINT64 (Address64->Address), Length));
> }
> @@ -728,8 +747,8 @@ AcpiTbSetupFadtRegisters (
> (FadtInfoTable[i].DefaultLength > 0) &&
> (FadtInfoTable[i].DefaultLength != Target64->BitWidth))
> {
> - ACPI_WARNING ((AE_INFO,
> - "Invalid length for %s: %u, using default %u",
> + ACPI_BIOS_WARNING ((AE_INFO,
> + "Invalid length for FADT/%s: %u, using default %u",
> FadtInfoTable[i].Name, Target64->BitWidth,
> FadtInfoTable[i].DefaultLength));
>
> @@ -772,7 +791,8 @@ AcpiTbSetupFadtRegisters (
> AcpiTbInitGenericAddress (FadtPmInfoTable[i].Target,
> Source64->SpaceId, Pm1RegisterByteWidth,
> Source64->Address +
> - (FadtPmInfoTable[i].RegisterNum * Pm1RegisterByteWidth));
> + (FadtPmInfoTable[i].RegisterNum * Pm1RegisterByteWidth),
> + "PmRegisters");
> }
> }
> }
> diff --git a/src/acpica/source/components/tables/tbinstal.c b/src/acpica/source/components/tables/tbinstal.c
> index 00fd2a2..5e112dc 100644
> --- a/src/acpica/source/components/tables/tbinstal.c
> +++ b/src/acpica/source/components/tables/tbinstal.c
> @@ -229,8 +229,9 @@ AcpiTbAddTable (
> (!ACPI_COMPARE_NAME (TableDesc->Pointer->Signature, ACPI_SIG_SSDT)) &&
> (ACPI_STRNCMP (TableDesc->Pointer->Signature, "OEM", 3)))
> {
> - ACPI_ERROR ((AE_INFO,
> - "Table has invalid signature [%4.4s] (0x%8.8X), must be SSDT or OEMx",
> + ACPI_BIOS_ERROR ((AE_INFO,
> + "Table has invalid signature [%4.4s] (0x%8.8X), "
> + "must be SSDT or OEMx",
> AcpiUtValidAcpiName (*(UINT32 *) TableDesc->Pointer->Signature) ?
> TableDesc->Pointer->Signature : "????",
> *(UINT32 *) TableDesc->Pointer->Signature));
> diff --git a/src/acpica/source/components/tables/tbutils.c b/src/acpica/source/components/tables/tbutils.c
> index 4ad777c..4f0b75d 100644
> --- a/src/acpica/source/components/tables/tbutils.c
> +++ b/src/acpica/source/components/tables/tbutils.c
> @@ -359,8 +359,9 @@ AcpiTbVerifyChecksum (
>
> if (Checksum)
> {
> - ACPI_WARNING ((AE_INFO,
> - "Incorrect checksum in table [%4.4s] - 0x%2.2X, should be 0x%2.2X",
> + ACPI_BIOS_WARNING ((AE_INFO,
> + "Incorrect checksum in table [%4.4s] - 0x%2.2X, "
> + "should be 0x%2.2X",
> Table->Signature, Table->Checksum,
> (UINT8) (Table->Checksum - Checksum)));
>
> @@ -428,8 +429,9 @@ AcpiTbCheckDsdtHeader (
> if (AcpiGbl_OriginalDsdtHeader.Length != AcpiGbl_DSDT->Length ||
> AcpiGbl_OriginalDsdtHeader.Checksum != AcpiGbl_DSDT->Checksum)
> {
> - ACPI_ERROR ((AE_INFO,
> - "The DSDT has been corrupted or replaced - old, new headers below"));
> + ACPI_BIOS_ERROR ((AE_INFO,
> + "The DSDT has been corrupted or replaced - "
> + "old, new headers below"));
> AcpiTbPrintTableHeader (0, &AcpiGbl_OriginalDsdtHeader);
> AcpiTbPrintTableHeader (0, AcpiGbl_DSDT);
>
> @@ -537,7 +539,7 @@ AcpiTbInstallTable (
> if (Signature &&
> !ACPI_COMPARE_NAME (Table->Signature, Signature))
> {
> - ACPI_ERROR ((AE_INFO,
> + ACPI_BIOS_ERROR ((AE_INFO,
> "Invalid signature 0x%X for ACPI table, expected [%s]",
> *ACPI_CAST_PTR (UINT32, Table->Signature), Signature));
> goto UnmapAndExit;
> @@ -656,7 +658,7 @@ AcpiTbGetRootTableEntry (
> {
> /* Will truncate 64-bit address to 32 bits, issue warning */
>
> - ACPI_WARNING ((AE_INFO,
> + ACPI_BIOS_WARNING ((AE_INFO,
> "64-bit Physical Address in XSDT is too large (0x%8.8X%8.8X),"
> " truncating",
> ACPI_FORMAT_UINT64 (Address64)));
> @@ -758,7 +760,8 @@ AcpiTbParseRootTable (
>
> if (Length < sizeof (ACPI_TABLE_HEADER))
> {
> - ACPI_ERROR ((AE_INFO, "Invalid length 0x%X in RSDT/XSDT", Length));
> + ACPI_BIOS_ERROR ((AE_INFO,
> + "Invalid table length 0x%X in RSDT/XSDT", Length));
> return_ACPI_STATUS (AE_INVALID_TABLE_LENGTH);
> }
>
> diff --git a/src/acpica/source/components/tables/tbxface.c b/src/acpica/source/components/tables/tbxface.c
> index 860dc2e..b91cce1 100644
> --- a/src/acpica/source/components/tables/tbxface.c
> +++ b/src/acpica/source/components/tables/tbxface.c
> @@ -1,7 +1,6 @@
> /******************************************************************************
> *
> - * Module Name: tbxface - Public interfaces to the ACPI subsystem
> - * ACPI table oriented interfaces
> + * Module Name: tbxface - ACPI table oriented external interfaces
> *
> *****************************************************************************/
>
> @@ -118,18 +117,11 @@
>
> #include "acpi.h"
> #include "accommon.h"
> -#include "acnamesp.h"
> #include "actables.h"
>
> #define _COMPONENT ACPI_TABLES
> ACPI_MODULE_NAME ("tbxface")
>
> -/* Local prototypes */
> -
> -static ACPI_STATUS
> -AcpiTbLoadNamespace (
> - void);
> -
>
> /*******************************************************************************
> *
> @@ -530,155 +522,6 @@ ACPI_EXPORT_SYMBOL (AcpiGetTableByIndex)
>
> /*******************************************************************************
> *
> - * FUNCTION: AcpiTbLoadNamespace
> - *
> - * PARAMETERS: None
> - *
> - * RETURN: Status
> - *
> - * DESCRIPTION: Load the namespace from the DSDT and all SSDTs/PSDTs found in
> - * the RSDT/XSDT.
> - *
> - ******************************************************************************/
> -
> -static ACPI_STATUS
> -AcpiTbLoadNamespace (
> - void)
> -{
> - ACPI_STATUS Status;
> - UINT32 i;
> - ACPI_TABLE_HEADER *NewDsdt;
> -
> -
> - ACPI_FUNCTION_TRACE (TbLoadNamespace);
> -
> -
> - (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
> -
> - /*
> - * Load the namespace. The DSDT is required, but any SSDT and
> - * PSDT tables are optional. Verify the DSDT.
> - */
> - if (!AcpiGbl_RootTableList.CurrentTableCount ||
> - !ACPI_COMPARE_NAME (
> - &(AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT].Signature),
> - ACPI_SIG_DSDT) ||
> - ACPI_FAILURE (AcpiTbVerifyTable (
> - &AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT])))
> - {
> - Status = AE_NO_ACPI_TABLES;
> - goto UnlockAndExit;
> - }
> -
> - /*
> - * Save the DSDT pointer for simple access. This is the mapped memory
> - * address. We must take care here because the address of the .Tables
> - * array can change dynamically as tables are loaded at run-time. Note:
> - * .Pointer field is not validated until after call to AcpiTbVerifyTable.
> - */
> - AcpiGbl_DSDT = AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT].Pointer;
> -
> - /*
> - * Optionally copy the entire DSDT to local memory (instead of simply
> - * mapping it.) There are some BIOSs that corrupt or replace the original
> - * DSDT, creating the need for this option. Default is FALSE, do not copy
> - * the DSDT.
> - */
> - if (AcpiGbl_CopyDsdtLocally)
> - {
> - NewDsdt = AcpiTbCopyDsdt (ACPI_TABLE_INDEX_DSDT);
> - if (NewDsdt)
> - {
> - AcpiGbl_DSDT = NewDsdt;
> - }
> - }
> -
> - /*
> - * Save the original DSDT header for detection of table corruption
> - * and/or replacement of the DSDT from outside the OS.
> - */
> - ACPI_MEMCPY (&AcpiGbl_OriginalDsdtHeader, AcpiGbl_DSDT,
> - sizeof (ACPI_TABLE_HEADER));
> -
> - (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
> -
> - /* Load and parse tables */
> -
> - Status = AcpiNsLoadTable (ACPI_TABLE_INDEX_DSDT, AcpiGbl_RootNode);
> - if (ACPI_FAILURE (Status))
> - {
> - return_ACPI_STATUS (Status);
> - }
> -
> - /* Load any SSDT or PSDT tables. Note: Loop leaves tables locked */
> -
> - (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
> - for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; ++i)
> - {
> - if ((!ACPI_COMPARE_NAME (&(AcpiGbl_RootTableList.Tables[i].Signature),
> - ACPI_SIG_SSDT) &&
> - !ACPI_COMPARE_NAME (&(AcpiGbl_RootTableList.Tables[i].Signature),
> - ACPI_SIG_PSDT)) ||
> - ACPI_FAILURE (AcpiTbVerifyTable (
> - &AcpiGbl_RootTableList.Tables[i])))
> - {
> - continue;
> - }
> -
> - /* Ignore errors while loading tables, get as many as possible */
> -
> - (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
> - (void) AcpiNsLoadTable (i, AcpiGbl_RootNode);
> - (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
> - }
> -
> - ACPI_DEBUG_PRINT ((ACPI_DB_INIT, "ACPI Tables successfully acquired\n"));
> -
> -UnlockAndExit:
> - (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
> - return_ACPI_STATUS (Status);
> -}
> -
> -
> -/*******************************************************************************
> - *
> - * FUNCTION: AcpiLoadTables
> - *
> - * PARAMETERS: None
> - *
> - * RETURN: Status
> - *
> - * DESCRIPTION: Load the ACPI tables from the RSDT/XSDT
> - *
> - ******************************************************************************/
> -
> -ACPI_STATUS
> -AcpiLoadTables (
> - void)
> -{
> - ACPI_STATUS Status;
> -
> -
> - ACPI_FUNCTION_TRACE (AcpiLoadTables);
> -
> -
> - /* Load the namespace from the tables */
> -
> - Status = AcpiTbLoadNamespace ();
> - if (ACPI_FAILURE (Status))
> - {
> - ACPI_EXCEPTION ((AE_INFO, Status,
> - "While loading namespace from ACPI tables"));
> - }
> -
> - return_ACPI_STATUS (Status);
> -}
> -
> -ACPI_EXPORT_SYMBOL (AcpiLoadTables)
> -
> -
> -/*******************************************************************************
> - *
> * FUNCTION: AcpiInstallTableHandler
> *
> * PARAMETERS: Handler - Table event handler
> diff --git a/src/acpica/source/components/tables/tbxfroot.c b/src/acpica/source/components/tables/tbxfroot.c
> index e85c1fd..d00db5f 100644
> --- a/src/acpica/source/components/tables/tbxfroot.c
> +++ b/src/acpica/source/components/tables/tbxfroot.c
> @@ -306,7 +306,7 @@ AcpiFindRootPointer (
>
> /* A valid RSDP was not found */
>
> - ACPI_ERROR ((AE_INFO, "A valid RSDP was not found"));
> + ACPI_BIOS_ERROR ((AE_INFO, "A valid RSDP was not found"));
> return_ACPI_STATUS (AE_NOT_FOUND);
> }
>
> diff --git a/src/acpica/source/components/utilities/utdecode.c b/src/acpica/source/components/utilities/utdecode.c
> index b36aa45..a88c581 100644
> --- a/src/acpica/source/components/utilities/utdecode.c
> +++ b/src/acpica/source/components/utilities/utdecode.c
> @@ -123,47 +123,6 @@
> ACPI_MODULE_NAME ("utdecode")
>
>
> -/*******************************************************************************
> - *
> - * FUNCTION: AcpiFormatException
> - *
> - * PARAMETERS: Status - The ACPI_STATUS code to be formatted
> - *
> - * RETURN: A string containing the exception text. A valid pointer is
> - * always returned.
> - *
> - * DESCRIPTION: This function translates an ACPI exception into an ASCII string
> - * It is here instead of utxface.c so it is always present.
> - *
> - ******************************************************************************/
> -
> -const char *
> -AcpiFormatException (
> - ACPI_STATUS Status)
> -{
> - const char *Exception = NULL;
> -
> -
> - ACPI_FUNCTION_ENTRY ();
> -
> -
> - Exception = AcpiUtValidateException (Status);
> - if (!Exception)
> - {
> - /* Exception code was not recognized */
> -
> - ACPI_ERROR ((AE_INFO,
> - "Unknown exception code: 0x%8.8X", Status));
> -
> - Exception = "UNKNOWN_STATUS_CODE";
> - }
> -
> - return (ACPI_CAST_PTR (const char, Exception));
> -}
> -
> -ACPI_EXPORT_SYMBOL (AcpiFormatException)
> -
> -
> /*
> * Properties of the ACPI Object Types, both internal and external.
> * The table is indexed by values of ACPI_OBJECT_TYPE
> @@ -252,16 +211,17 @@ AcpiUtHexToAsciiChar (
>
> const char *AcpiGbl_RegionTypes[ACPI_NUM_PREDEFINED_REGIONS] =
> {
> - "SystemMemory",
> - "SystemIO",
> - "PCI_Config",
> - "EmbeddedControl",
> - "SMBus",
> - "SystemCMOS",
> - "PCIBARTarget",
> - "IPMI",
> - "GeneralPurposeIo",
> - "GenericSerialBus"
> + "SystemMemory", /* 0x00 */
> + "SystemIO", /* 0x01 */
> + "PCI_Config", /* 0x02 */
> + "EmbeddedControl", /* 0x03 */
> + "SMBus", /* 0x04 */
> + "SystemCMOS", /* 0x05 */
> + "PCIBARTarget", /* 0x06 */
> + "IPMI", /* 0x07 */
> + "GeneralPurposeIo", /* 0x08 */
> + "GenericSerialBus", /* 0x09 */
> + "PCC" /* 0x0A */
> };
>
>
> diff --git a/src/acpica/source/components/utilities/utdelete.c b/src/acpica/source/components/utilities/utdelete.c
> index 3130e6d..b64a585 100644
> --- a/src/acpica/source/components/utilities/utdelete.c
> +++ b/src/acpica/source/components/utilities/utdelete.c
> @@ -239,7 +239,7 @@ AcpiUtDeleteInternalObj (
> case ACPI_TYPE_PROCESSOR:
> case ACPI_TYPE_THERMAL:
>
> - /* Walk the notify handler list for this object */
> + /* Walk the address handler list for this object */
>
> HandlerDesc = Object->CommonNotify.Handler;
> while (HandlerDesc)
> @@ -595,6 +595,7 @@ AcpiUtUpdateObjectReference (
> ACPI_STATUS Status = AE_OK;
> ACPI_GENERIC_STATE *StateList = NULL;
> ACPI_OPERAND_OBJECT *NextObject = NULL;
> + ACPI_OPERAND_OBJECT *PrevObject;
> ACPI_GENERIC_STATE *State;
> UINT32 i;
>
> @@ -624,10 +625,20 @@ AcpiUtUpdateObjectReference (
> case ACPI_TYPE_POWER:
> case ACPI_TYPE_THERMAL:
>
> - /* Update the notify objects for these types (if present) */
> -
> - AcpiUtUpdateRefCount (Object->CommonNotify.SystemNotify, Action);
> - AcpiUtUpdateRefCount (Object->CommonNotify.DeviceNotify, Action);
> + /*
> + * Update the notify objects for these types (if present)
> + * Two lists, system and device notify handlers.
> + */
> + for (i = 0; i < ACPI_NUM_NOTIFY_TYPES; i++)
> + {
> + PrevObject = Object->CommonNotify.NotifyList[i];
> + while (PrevObject)
> + {
> + NextObject = PrevObject->Notify.Next[i];
> + AcpiUtUpdateRefCount (PrevObject, Action);
> + PrevObject = NextObject;
> + }
> + }
> break;
>
> case ACPI_TYPE_PACKAGE:
> diff --git a/src/acpica/source/components/utilities/utglobal.c b/src/acpica/source/components/utilities/utglobal.c
> index 8ebbaec..98b1e48 100644
> --- a/src/acpica/source/components/utilities/utglobal.c
> +++ b/src/acpica/source/components/utilities/utglobal.c
> @@ -283,8 +283,9 @@ ACPI_FIXED_EVENT_INFO AcpiGbl_FixedEventInfo[ACPI_NUM_FIXED_EVENTS] =
> *
> * RETURN: Status
> *
> - * DESCRIPTION: Init ACPICA globals. All globals that require specific
> - * initialization should be initialized here!
> + * DESCRIPTION: Initialize ACPICA globals. All globals that require specific
> + * initialization should be initialized here. This allows for
> + * a warm restart.
> *
> ******************************************************************************/
>
> @@ -359,8 +360,8 @@ AcpiUtInitGlobals (
>
> /* Global handlers */
>
> - AcpiGbl_SystemNotify.Handler = NULL;
> - AcpiGbl_DeviceNotify.Handler = NULL;
> + AcpiGbl_GlobalNotify[0].Handler = NULL;
> + AcpiGbl_GlobalNotify[1].Handler = NULL;
> AcpiGbl_ExceptionHandler = NULL;
> AcpiGbl_InitHandler = NULL;
> AcpiGbl_TableHandler = NULL;
> diff --git a/src/acpica/source/components/utilities/utmisc.c b/src/acpica/source/components/utilities/utmisc.c
> index 44dd533..7318f68 100644
> --- a/src/acpica/source/components/utilities/utmisc.c
> +++ b/src/acpica/source/components/utilities/utmisc.c
> @@ -125,84 +125,41 @@
> ACPI_MODULE_NAME ("utmisc")
>
>
> +#if defined ACPI_ASL_COMPILER || defined ACPI_EXEC_APP
> /*******************************************************************************
> *
> - * FUNCTION: AcpiUtValidateException
> + * FUNCTION: UtConvertBackslashes
> *
> - * PARAMETERS: Status - The ACPI_STATUS code to be formatted
> + * PARAMETERS: Pathname - File pathname string to be converted
> *
> - * RETURN: A string containing the exception text. NULL if exception is
> - * not valid.
> + * RETURN: Modifies the input Pathname
> *
> - * DESCRIPTION: This function validates and translates an ACPI exception into
> - * an ASCII string.
> + * DESCRIPTION: Convert all backslashes (0x5C) to forward slashes (0x2F) within
> + * the entire input file pathname string.
> *
> ******************************************************************************/
>
> -const char *
> -AcpiUtValidateException (
> - ACPI_STATUS Status)
> +void
> +UtConvertBackslashes (
> + char *Pathname)
> {
> - UINT32 SubStatus;
> - const char *Exception = NULL;
> -
> -
> - ACPI_FUNCTION_ENTRY ();
> -
>
> - /*
> - * Status is composed of two parts, a "type" and an actual code
> - */
> - SubStatus = (Status & ~AE_CODE_MASK);
> -
> - switch (Status & AE_CODE_MASK)
> + if (!Pathname)
> {
> - case AE_CODE_ENVIRONMENTAL:
> -
> - if (SubStatus <= AE_CODE_ENV_MAX)
> - {
> - Exception = AcpiGbl_ExceptionNames_Env [SubStatus];
> - }
> - break;
> -
> - case AE_CODE_PROGRAMMER:
> -
> - if (SubStatus <= AE_CODE_PGM_MAX)
> - {
> - Exception = AcpiGbl_ExceptionNames_Pgm [SubStatus];
> - }
> - break;
> -
> - case AE_CODE_ACPI_TABLES:
> -
> - if (SubStatus <= AE_CODE_TBL_MAX)
> - {
> - Exception = AcpiGbl_ExceptionNames_Tbl [SubStatus];
> - }
> - break;
> -
> - case AE_CODE_AML:
> -
> - if (SubStatus <= AE_CODE_AML_MAX)
> - {
> - Exception = AcpiGbl_ExceptionNames_Aml [SubStatus];
> - }
> - break;
> -
> - case AE_CODE_CONTROL:
> + return;
> + }
>
> - if (SubStatus <= AE_CODE_CTRL_MAX)
> + while (*Pathname)
> + {
> + if (*Pathname == '\\')
> {
> - Exception = AcpiGbl_ExceptionNames_Ctrl [SubStatus];
> + *Pathname = '/';
> }
> - break;
>
> - default:
> - break;
> + Pathname++;
> }
> -
> - return (ACPI_CAST_PTR (const char, Exception));
> }
> +#endif
>
>
> /*******************************************************************************
> @@ -1367,5 +1324,3 @@ AcpiUtWalkPackageTree (
>
> return_ACPI_STATUS (AE_AML_INTERNAL);
> }
> -
> -
> diff --git a/src/acpica/source/components/utilities/utobject.c b/src/acpica/source/components/utilities/utobject.c
> index ade2980..4914159 100644
> --- a/src/acpica/source/components/utilities/utobject.c
> +++ b/src/acpica/source/components/utilities/utobject.c
> @@ -438,7 +438,7 @@ AcpiUtCreateStringObject (
> *
> * RETURN: TRUE if object is valid, FALSE otherwise
> *
> - * DESCRIPTION: Validate a pointer to be an ACPI_OPERAND_OBJECT
> + * DESCRIPTION: Validate a pointer to be of type ACPI_OPERAND_OBJECT
> *
> ******************************************************************************/
>
> @@ -464,7 +464,7 @@ AcpiUtValidInternalObject (
> {
> case ACPI_DESC_TYPE_OPERAND:
>
> - /* The object appears to be a valid ACPI_OPERAND_OBJECT */
> + /* The object appears to be a valid ACPI_OPERAND_OBJECT */
>
> return (TRUE);
>
> @@ -545,7 +545,7 @@ AcpiUtDeleteObjectDesc (
> ACPI_FUNCTION_TRACE_PTR (UtDeleteObjectDesc, Object);
>
>
> - /* Object must be an ACPI_OPERAND_OBJECT */
> + /* Object must be of type ACPI_OPERAND_OBJECT */
>
> if (ACPI_GET_DESCRIPTOR_TYPE (Object) != ACPI_DESC_TYPE_OPERAND)
> {
> diff --git a/src/acpica/source/components/utilities/utresrc.c b/src/acpica/source/components/utilities/utresrc.c
> index 69df740..3835b47 100644
> --- a/src/acpica/source/components/utilities/utresrc.c
> +++ b/src/acpica/source/components/utilities/utresrc.c
> @@ -1,6 +1,6 @@
> /*******************************************************************************
> *
> - * Module Name: utresrc - Resource managment utilities
> + * Module Name: utresrc - Resource management utilities
> *
> ******************************************************************************/
>
> @@ -129,7 +129,7 @@
>
> /*
> * Strings used to decode resource descriptors.
> - * Used by both the disasssembler and the debugger resource dump routines
> + * Used by both the disassembler and the debugger resource dump routines
> */
> const char *AcpiGbl_BmDecode[] =
> {
> diff --git a/src/acpica/source/components/utilities/uttrack.c b/src/acpica/source/components/utilities/uttrack.c
> index 7f2311a..3d73fc5 100644
> --- a/src/acpica/source/components/utilities/uttrack.c
> +++ b/src/acpica/source/components/utilities/uttrack.c
> @@ -705,21 +705,21 @@ AcpiUtDumpAllocations (
> switch (ACPI_GET_DESCRIPTOR_TYPE (Descriptor))
> {
> case ACPI_DESC_TYPE_OPERAND:
> - if (Element->Size == sizeof (ACPI_DESC_TYPE_OPERAND))
> + if (Element->Size == sizeof (ACPI_OPERAND_OBJECT))
> {
> DescriptorType = ACPI_DESC_TYPE_OPERAND;
> }
> break;
>
> case ACPI_DESC_TYPE_PARSER:
> - if (Element->Size == sizeof (ACPI_DESC_TYPE_PARSER))
> + if (Element->Size == sizeof (ACPI_PARSE_OBJECT))
> {
> DescriptorType = ACPI_DESC_TYPE_PARSER;
> }
> break;
>
> case ACPI_DESC_TYPE_NAMED:
> - if (Element->Size == sizeof (ACPI_DESC_TYPE_NAMED))
> + if (Element->Size == sizeof (ACPI_NAMESPACE_NODE))
> {
> DescriptorType = ACPI_DESC_TYPE_NAMED;
> }
> diff --git a/src/acpica/source/components/utilities/utxferror.c b/src/acpica/source/components/utilities/utxferror.c
> index 8a98a89..c0961a2 100644
> --- a/src/acpica/source/components/utilities/utxferror.c
> +++ b/src/acpica/source/components/utilities/utxferror.c
> @@ -159,6 +159,9 @@ extern FILE *AcpiGbl_OutputFile;
> #define ACPI_MSG_WARNING "ACPI Warning: "
> #define ACPI_MSG_INFO "ACPI: "
>
> +#define ACPI_MSG_BIOS_ERROR "ACPI Firmware Error: "
> +#define ACPI_MSG_BIOS_WARNING "ACPI Firmware Warning: "
> +
> /*
> * Common message suffix
> */
> @@ -324,6 +327,84 @@ AcpiInfo (
> ACPI_EXPORT_SYMBOL (AcpiInfo)
>
>
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiBiosError
> + *
> + * PARAMETERS: ModuleName - Caller's module name (for error output)
> + * LineNumber - Caller's line number (for error output)
> + * Format - Printf format string + additional args
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Print "ACPI Firmware Error" message with module/line/version
> + * info
> + *
> + ******************************************************************************/
> +
> +void ACPI_INTERNAL_VAR_XFACE
> +AcpiBiosError (
> + const char *ModuleName,
> + UINT32 LineNumber,
> + const char *Format,
> + ...)
> +{
> + va_list ArgList;
> +
> +
> + ACPI_MSG_REDIRECT_BEGIN;
> + AcpiOsPrintf (ACPI_MSG_BIOS_ERROR);
> +
> + va_start (ArgList, Format);
> + AcpiOsVprintf (Format, ArgList);
> + ACPI_MSG_SUFFIX;
> + va_end (ArgList);
> +
> + ACPI_MSG_REDIRECT_END;
> +}
> +
> +ACPI_EXPORT_SYMBOL (AcpiBiosError)
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiBiosWarning
> + *
> + * PARAMETERS: ModuleName - Caller's module name (for error output)
> + * LineNumber - Caller's line number (for error output)
> + * Format - Printf format string + additional args
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Print "ACPI Firmware Warning" message with module/line/version
> + * info
> + *
> + ******************************************************************************/
> +
> +void ACPI_INTERNAL_VAR_XFACE
> +AcpiBiosWarning (
> + const char *ModuleName,
> + UINT32 LineNumber,
> + const char *Format,
> + ...)
> +{
> + va_list ArgList;
> +
> +
> + ACPI_MSG_REDIRECT_BEGIN;
> + AcpiOsPrintf (ACPI_MSG_BIOS_WARNING);
> +
> + va_start (ArgList, Format);
> + AcpiOsVprintf (Format, ArgList);
> + ACPI_MSG_SUFFIX;
> + va_end (ArgList);
> +
> + ACPI_MSG_REDIRECT_END;
> +}
> +
> +ACPI_EXPORT_SYMBOL (AcpiBiosWarning)
> +
> +
> /*
> * The remainder of this module contains internal error functions that may
> * be configured out.
> diff --git a/src/acpica/source/include/acdebug.h b/src/acpica/source/include/acdebug.h
> index 4a9ecf0..45cfb26 100644
> --- a/src/acpica/source/include/acdebug.h
> +++ b/src/acpica/source/include/acdebug.h
> @@ -184,8 +184,7 @@ AcpiDbDisplayTemplate (
>
> void
> AcpiDbUnloadAcpiTable (
> - char *TableArg,
> - char *InstanceArg);
> + char *Name);
>
> void
> AcpiDbSendNotify (
> @@ -477,7 +476,7 @@ AcpiDbLocalNsLookup (
> char *Name);
>
> void
> -AcpiDbUInt32ToHexString (
> +AcpiDbUint32ToHexString (
> UINT32 Value,
> char *Buffer);
>
> diff --git a/src/acpica/source/include/acdisasm.h b/src/acpica/source/include/acdisasm.h
> index 9e8f2e3..056e8ea 100644
> --- a/src/acpica/source/include/acdisasm.h
> +++ b/src/acpica/source/include/acdisasm.h
> @@ -591,6 +591,14 @@ AcpiDmMethodFlags (
> ACPI_PARSE_OBJECT *Op);
>
> void
> +AcpiDmPredefinedDescription (
> + ACPI_PARSE_OBJECT *Op);
> +
> +void
> +AcpiDmFieldPredefinedDescription (
> + ACPI_PARSE_OBJECT *Op);
> +
> +void
> AcpiDmFieldFlags (
> ACPI_PARSE_OBJECT *Op);
>
> diff --git a/src/acpica/source/include/acexcep.h b/src/acpica/source/include/acexcep.h
> index 7129954..ccc6f71 100644
> --- a/src/acpica/source/include/acexcep.h
> +++ b/src/acpica/source/include/acexcep.h
> @@ -125,6 +125,7 @@
> #define AE_CODE_ACPI_TABLES 0x2000
> #define AE_CODE_AML 0x3000
> #define AE_CODE_CONTROL 0x4000
> +#define AE_CODE_MAX 0x4000
> #define AE_CODE_MASK 0xF000
>
>
> @@ -260,7 +261,7 @@
>
> /* Exception strings for AcpiFormatException */
>
> -#ifdef DEFINE_ACPI_GLOBALS
> +#ifdef ACPI_DEFINE_EXCEPTION_TABLE
>
> /*
> * String versions of the exception codes above
> @@ -379,6 +380,6 @@ char const *AcpiGbl_ExceptionNames_Ctrl[] =
> "AE_CTRL_PARSE_PENDING"
> };
>
> -#endif /* ACPI GLOBALS */
> +#endif /* EXCEPTION_TABLE */
>
> #endif /* __ACEXCEP_H__ */
> diff --git a/src/acpica/source/include/acglobal.h b/src/acpica/source/include/acglobal.h
> index b27ee3a..b96b658 100644
> --- a/src/acpica/source/include/acglobal.h
> +++ b/src/acpica/source/include/acglobal.h
> @@ -326,8 +326,7 @@ ACPI_EXTERN ACPI_CACHE_T *AcpiGbl_OperandCache;
>
> /* Global handlers */
>
> -ACPI_EXTERN ACPI_OBJECT_NOTIFY_HANDLER AcpiGbl_DeviceNotify;
> -ACPI_EXTERN ACPI_OBJECT_NOTIFY_HANDLER AcpiGbl_SystemNotify;
> +ACPI_EXTERN ACPI_GLOBAL_NOTIFY_HANDLER AcpiGbl_GlobalNotify[2];
> ACPI_EXTERN ACPI_EXCEPTION_HANDLER AcpiGbl_ExceptionHandler;
> ACPI_EXTERN ACPI_INIT_HANDLER AcpiGbl_InitHandler;
> ACPI_EXTERN ACPI_TABLE_HANDLER AcpiGbl_TableHandler;
> @@ -360,17 +359,8 @@ ACPI_EXTERN UINT8 AcpiGbl_OsiData;
> ACPI_EXTERN ACPI_INTERFACE_INFO *AcpiGbl_SupportedInterfaces;
> ACPI_EXTERN ACPI_ADDRESS_RANGE *AcpiGbl_AddressRangeList[ACPI_ADDRESS_RANGE_MAX];
>
> -
> #ifndef DEFINE_ACPI_GLOBALS
>
> -/* Exception codes */
> -
> -extern char const *AcpiGbl_ExceptionNames_Env[];
> -extern char const *AcpiGbl_ExceptionNames_Pgm[];
> -extern char const *AcpiGbl_ExceptionNames_Tbl[];
> -extern char const *AcpiGbl_ExceptionNames_Aml[];
> -extern char const *AcpiGbl_ExceptionNames_Ctrl[];
> -
> /* Other miscellaneous */
>
> extern BOOLEAN AcpiGbl_Shutdown;
> @@ -552,4 +542,14 @@ ACPI_EXTERN UINT32 AcpiGbl_SizeOfAcpiObjects;
>
> #endif /* ACPI_DEBUGGER */
>
> +
> +/*****************************************************************************
> + *
> + * Info/help support
> + *
> + ****************************************************************************/
> +
> +extern const AH_PREDEFINED_NAME AslPredefinedInfo[];
> +
> +
> #endif /* __ACGLOBAL_H__ */
> diff --git a/src/acpica/source/include/aclocal.h b/src/acpica/source/include/aclocal.h
> index f9065af..00d933e 100644
> --- a/src/acpica/source/include/aclocal.h
> +++ b/src/acpica/source/include/aclocal.h
> @@ -534,6 +534,15 @@ typedef struct acpi_gpe_handler_info
>
> } ACPI_GPE_HANDLER_INFO;
>
> +/* Notify info for implicit notify, multiple device objects */
> +
> +typedef struct acpi_gpe_notify_info
> +{
> + ACPI_NAMESPACE_NODE *DeviceNode; /* Device to be notified */
> + struct acpi_gpe_notify_info *Next;
> +
> +} ACPI_GPE_NOTIFY_INFO;
> +
> /*
> * GPE dispatch info. At any time, the GPE can have at most one type
> * of dispatch - Method, Handler, or Implicit Notify.
> @@ -541,8 +550,8 @@ typedef struct acpi_gpe_handler_info
> typedef union acpi_gpe_dispatch_info
> {
> ACPI_NAMESPACE_NODE *MethodNode; /* Method node for this GPE level */
> - struct acpi_gpe_handler_info *Handler; /* Installed GPE handler */
> - ACPI_NAMESPACE_NODE *DeviceNode; /* Parent _PRW device for implicit notify */
> + ACPI_GPE_HANDLER_INFO *Handler; /* Installed GPE handler */
> + ACPI_GPE_NOTIFY_INFO *NotifyList; /* List of _PRW devices for implicit notifies */
>
> } ACPI_GPE_DISPATCH_INFO;
>
> @@ -552,7 +561,7 @@ typedef union acpi_gpe_dispatch_info
> */
> typedef struct acpi_gpe_event_info
> {
> - union acpi_gpe_dispatch_info Dispatch; /* Either Method or Handler */
> + union acpi_gpe_dispatch_info Dispatch; /* Either Method, Handler, or NotifyList */
> struct acpi_gpe_register_info *RegisterInfo; /* Backpointer to register info */
> UINT8 Flags; /* Misc info about this GPE */
> UINT8 GpeNumber; /* This GPE */
> @@ -788,6 +797,15 @@ ACPI_STATUS (*ACPI_PARSE_UPWARDS) (
> struct acpi_walk_state *WalkState);
>
>
> +/* Global handlers for AML Notifies */
> +
> +typedef struct acpi_global_notify_handler
> +{
> + ACPI_NOTIFY_HANDLER Handler;
> + void *Context;
> +
> +} ACPI_GLOBAL_NOTIFY_HANDLER;
> +
> /*
> * Notify info - used to pass info to the deferred notify
> * handler/dispatcher.
> @@ -795,8 +813,10 @@ ACPI_STATUS (*ACPI_PARSE_UPWARDS) (
> typedef struct acpi_notify_info
> {
> ACPI_STATE_COMMON
> + UINT8 HandlerListId;
> ACPI_NAMESPACE_NODE *Node;
> - union acpi_operand_object *HandlerObj;
> + union acpi_operand_object *HandlerListHead;
> + ACPI_GLOBAL_NOTIFY_HANDLER *Global;
>
> } ACPI_NOTIFY_INFO;
>
> @@ -1021,6 +1041,7 @@ typedef struct acpi_parse_state
> #define ACPI_PARSEOP_IGNORE 0x01
> #define ACPI_PARSEOP_PARAMLIST 0x02
> #define ACPI_PARSEOP_EMPTY_TERMLIST 0x04
> +#define ACPI_PARSEOP_PREDEF_CHECKED 0x08
> #define ACPI_PARSEOP_SPECIAL 0x10
>
>
> @@ -1372,4 +1393,20 @@ typedef struct acpi_debug_mem_block
> #define ACPI_NUM_MEM_LISTS 2
>
>
> +/*****************************************************************************
> + *
> + * Info/help support
> + *
> + ****************************************************************************/
> +
> +typedef struct ah_predefined_name
> +{
> + char *Name;
> + char *Description;
> +#ifndef ACPI_ASL_COMPILER
> + char *Action;
> +#endif
> +
> +} AH_PREDEFINED_NAME;
> +
> #endif /* __ACLOCAL_H__ */
> diff --git a/src/acpica/source/include/acmacros.h b/src/acpica/source/include/acmacros.h
> index 5451d84..3cf0ac0 100644
> --- a/src/acpica/source/include/acmacros.h
> +++ b/src/acpica/source/include/acmacros.h
> @@ -346,8 +346,8 @@
> #define ACPI_INSERT_BITS(Target, Mask, Source) Target = ((Target & (~(Mask))) | (Source & Mask))
>
> /*
> - * An ACPI_NAMESPACE_NODE can appear in some contexts
> - * where a pointer to an ACPI_OPERAND_OBJECT can also
> + * An object of type ACPI_NAMESPACE_NODE can appear in some contexts
> + * where a pointer to an object of type ACPI_OPERAND_OBJECT can also
> * appear. This macro is used to distinguish them.
> *
> * The "Descriptor" field is the first field in both structures.
> diff --git a/src/acpica/source/include/acobject.h b/src/acpica/source/include/acobject.h
> index 009232a..9014d4f 100644
> --- a/src/acpica/source/include/acobject.h
> +++ b/src/acpica/source/include/acobject.h
> @@ -166,7 +166,7 @@
>
> #define AOPOBJ_AML_CONSTANT 0x01 /* Integer is an AML constant */
> #define AOPOBJ_STATIC_POINTER 0x02 /* Data is part of an ACPI table, don't delete */
> -#define AOPOBJ_DATA_VALID 0x04 /* Object is intialized and data is valid */
> +#define AOPOBJ_DATA_VALID 0x04 /* Object is initialized and data is valid */
> #define AOPOBJ_OBJECT_INITIALIZED 0x08 /* Region is initialized, _REG was run */
> #define AOPOBJ_SETUP_COMPLETE 0x10 /* Region setup is complete */
> #define AOPOBJ_INVALID 0x20 /* Host OS won't allow a Region address */
> @@ -195,8 +195,8 @@ typedef struct acpi_object_integer
>
>
> /*
> - * Note: The String and Buffer object must be identical through the Pointer
> - * and length elements. There is code that depends on this.
> + * Note: The String and Buffer object must be identical through the
> + * pointer and length elements. There is code that depends on this.
> *
> * Fields common to both Strings and Buffers
> */
> @@ -318,8 +318,7 @@ typedef struct acpi_object_method
> * Common fields for objects that support ASL notifications
> */
> #define ACPI_COMMON_NOTIFY_INFO \
> - union acpi_operand_object *SystemNotify; /* Handler for system notifies */\
> - union acpi_operand_object *DeviceNotify; /* Handler for driver notifies */\
> + union acpi_operand_object *NotifyList[2]; /* Handlers for system/device notifies */\
> union acpi_operand_object *Handler; /* Handler for Address space */
>
>
> @@ -461,8 +460,10 @@ typedef struct acpi_object_notify_handler
> {
> ACPI_OBJECT_COMMON_HEADER
> ACPI_NAMESPACE_NODE *Node; /* Parent device */
> - ACPI_NOTIFY_HANDLER Handler;
> + UINT32 HandlerType; /* Type: Device/System/Both */
> + ACPI_NOTIFY_HANDLER Handler; /* Handler address */
> void *Context;
> + union acpi_operand_object *Next[2]; /* Device and System handler lists */
>
> } ACPI_OBJECT_NOTIFY_HANDLER;
>
> @@ -476,7 +477,7 @@ typedef struct acpi_object_addr_handler
> ACPI_NAMESPACE_NODE *Node; /* Parent device */
> void *Context;
> ACPI_ADR_SPACE_SETUP Setup;
> - union acpi_operand_object *RegionList; /* regions using this handler */
> + union acpi_operand_object *RegionList; /* Regions using this handler */
> union acpi_operand_object *Next;
>
> } ACPI_OBJECT_ADDR_HANDLER;
> diff --git a/src/acpica/source/include/acoutput.h b/src/acpica/source/include/acoutput.h
> index 12f7851..cbdbd8f 100644
> --- a/src/acpica/source/include/acoutput.h
> +++ b/src/acpica/source/include/acoutput.h
> @@ -289,6 +289,8 @@
> #define ACPI_WARNING(plist) AcpiWarning plist
> #define ACPI_EXCEPTION(plist) AcpiException plist
> #define ACPI_ERROR(plist) AcpiError plist
> +#define ACPI_BIOS_WARNING(plist) AcpiBiosWarning plist
> +#define ACPI_BIOS_ERROR(plist) AcpiBiosError plist
> #define ACPI_DEBUG_OBJECT(obj,l,i) AcpiExDoDebugObject(obj,l,i)
>
> #else
> @@ -299,6 +301,8 @@
> #define ACPI_WARNING(plist)
> #define ACPI_EXCEPTION(plist)
> #define ACPI_ERROR(plist)
> +#define ACPI_BIOS_WARNING(plist)
> +#define ACPI_BIOS_ERROR(plist)
> #define ACPI_DEBUG_OBJECT(obj,l,i)
>
> #endif /* ACPI_NO_ERROR_MESSAGES */
> diff --git a/src/acpica/source/include/acpiosxf.h b/src/acpica/source/include/acpiosxf.h
> index d6d205f..48d8aa4 100644
> --- a/src/acpica/source/include/acpiosxf.h
> +++ b/src/acpica/source/include/acpiosxf.h
> @@ -348,7 +348,7 @@ AcpiOsExecute (
>
> void
> AcpiOsWaitEventsComplete (
> - void *Context);
> + void);
>
> void
> AcpiOsSleep (
> diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h
> index 2d4a5f8..036d817 100644
> --- a/src/acpica/source/include/acpixf.h
> +++ b/src/acpica/source/include/acpixf.h
> @@ -120,7 +120,7 @@
>
> /* Current ACPICA subsystem version in YYYYMMDD format */
>
> -#define ACPI_CA_VERSION 0x20120320
> +#define ACPI_CA_VERSION 0x20120711
>
> #include "acconfig.h"
> #include "actypes.h"
> @@ -273,6 +273,22 @@ AcpiFree (
>
>
> /*
> + * ACPI table load/unload interfaces
> + */
> +ACPI_STATUS
> +AcpiLoadTable (
> + ACPI_TABLE_HEADER *Table);
> +
> +ACPI_STATUS
> +AcpiUnloadParentTable (
> + ACPI_HANDLE Object);
> +
> +ACPI_STATUS
> +AcpiLoadTables (
> + void);
> +
> +
> +/*
> * ACPI table manipulation interfaces
> */
> ACPI_STATUS
> @@ -284,10 +300,6 @@ AcpiFindRootPointer (
> ACPI_SIZE *RsdpAddress);
>
> ACPI_STATUS
> -AcpiLoadTables (
> - void);
> -
> -ACPI_STATUS
> AcpiGetTableHeader (
> ACPI_STRING Signature,
> UINT32 Instance,
> @@ -829,6 +841,20 @@ AcpiInfo (
> const char *Format,
> ...) ACPI_PRINTF_LIKE(3);
>
> +void ACPI_INTERNAL_VAR_XFACE
> +AcpiBiosError (
> + const char *ModuleName,
> + UINT32 LineNumber,
> + const char *Format,
> + ...) ACPI_PRINTF_LIKE(3);
> +
> +void ACPI_INTERNAL_VAR_XFACE
> +AcpiBiosWarning (
> + const char *ModuleName,
> + UINT32 LineNumber,
> + const char *Format,
> + ...) ACPI_PRINTF_LIKE(3);
> +
>
> /*
> * Debug output
> diff --git a/src/acpica/source/include/acpredef.h b/src/acpica/source/include/acpredef.h
> index 82a1cb3..8da4836 100644
> --- a/src/acpica/source/include/acpredef.h
> +++ b/src/acpica/source/include/acpredef.h
> @@ -584,14 +584,14 @@ static const ACPI_PREDEFINED_INFO PredefinedNames[] =
> {{"_TMP", 0, ACPI_RTYPE_INTEGER}},
> {{"_TPC", 0, ACPI_RTYPE_INTEGER}},
> {{"_TPT", 1, 0}},
> - {{"_TRT", 0, ACPI_RTYPE_PACKAGE}}, /* Variable-length (Pkgs) each 2Ref/6Int */
> + {{"_TRT", 0, ACPI_RTYPE_PACKAGE}}, /* Variable-length (Pkgs) each 2 Ref/6 Int */
> {{{ACPI_PTYPE2, ACPI_RTYPE_REFERENCE, 2, ACPI_RTYPE_INTEGER}, 6, 0}},
>
> - {{"_TSD", 0, ACPI_RTYPE_PACKAGE}}, /* Variable-length (Pkgs) each 5Int with count */
> + {{"_TSD", 0, ACPI_RTYPE_PACKAGE}}, /* Variable-length (Pkgs) each 5 Int with count */
> {{{ACPI_PTYPE2_COUNT,ACPI_RTYPE_INTEGER, 5,0}, 0,0}},
>
> {{"_TSP", 0, ACPI_RTYPE_INTEGER}},
> - {{"_TSS", 0, ACPI_RTYPE_PACKAGE}}, /* Variable-length (Pkgs) each 5Int */
> + {{"_TSS", 0, ACPI_RTYPE_PACKAGE}}, /* Variable-length (Pkgs) each 5 Int */
> {{{ACPI_PTYPE2, ACPI_RTYPE_INTEGER, 5,0}, 0,0}},
>
> {{"_TST", 0, ACPI_RTYPE_INTEGER}},
> diff --git a/src/acpica/source/include/actbl1.h b/src/acpica/source/include/actbl1.h
> index 6e6edcc..c046b05 100644
> --- a/src/acpica/source/include/actbl1.h
> +++ b/src/acpica/source/include/actbl1.h
> @@ -202,7 +202,7 @@ typedef struct acpi_table_bert
> {
> ACPI_TABLE_HEADER Header; /* Common ACPI table header */
> UINT32 RegionLength; /* Length of the boot error region */
> - UINT64 Address; /* Physical addresss of the error region */
> + UINT64 Address; /* Physical address of the error region */
>
> } ACPI_TABLE_BERT;
>
> diff --git a/src/acpica/source/include/actypes.h b/src/acpica/source/include/actypes.h
> index ff90c38..5d01e32 100644
> --- a/src/acpica/source/include/actypes.h
> +++ b/src/acpica/source/include/actypes.h
> @@ -780,10 +780,14 @@ typedef UINT32 ACPI_EVENT_STATUS;
> #define ACPI_DEVICE_NOTIFY 0x2
> #define ACPI_ALL_NOTIFY (ACPI_SYSTEM_NOTIFY | ACPI_DEVICE_NOTIFY)
> #define ACPI_MAX_NOTIFY_HANDLER_TYPE 0x3
> +#define ACPI_NUM_NOTIFY_TYPES 2
>
> #define ACPI_MAX_SYS_NOTIFY 0x7F
> #define ACPI_MAX_DEVICE_SPECIFIC_NOTIFY 0xBF
>
> +#define ACPI_SYSTEM_HANDLER_LIST 0 /* Used as index, must be SYSTEM_NOTIFY -1 */
> +#define ACPI_DEVICE_HANDLER_LIST 1 /* Used as index, must be DEVICE_NOTIFY -1 */
> +
>
> /* Address Space (Operation Region) Types */
>
> @@ -799,8 +803,9 @@ typedef UINT8 ACPI_ADR_SPACE_TYPE;
> #define ACPI_ADR_SPACE_IPMI (ACPI_ADR_SPACE_TYPE) 7
> #define ACPI_ADR_SPACE_GPIO (ACPI_ADR_SPACE_TYPE) 8
> #define ACPI_ADR_SPACE_GSBUS (ACPI_ADR_SPACE_TYPE) 9
> +#define ACPI_ADR_SPACE_PLATFORM_COMM (ACPI_ADR_SPACE_TYPE) 10
>
> -#define ACPI_NUM_PREDEFINED_REGIONS 10
> +#define ACPI_NUM_PREDEFINED_REGIONS 11
>
> /*
> * Special Address Spaces
> diff --git a/src/acpica/source/include/acutils.h b/src/acpica/source/include/acutils.h
> index 5c21320..50b5b99 100644
> --- a/src/acpica/source/include/acutils.h
> +++ b/src/acpica/source/include/acutils.h
> @@ -501,7 +501,7 @@ AcpiUtDumpBuffer (
> UINT8 *Buffer,
> UINT32 Count,
> UINT32 Display,
> - UINT32 componentId);
> + UINT32 ComponentId);
>
> void
> AcpiUtDumpBuffer2 (
> @@ -775,6 +775,10 @@ AcpiUtShortDivide (
> /*
> * utmisc
> */
> +void
> +UtConvertBackslashes (
> + char *Pathname);
> +
> const char *
> AcpiUtValidateException (
> ACPI_STATUS Status);
> diff --git a/src/acpica/source/include/platform/acenv.h b/src/acpica/source/include/platform/acenv.h
> index 342615f..1f3596a 100644
> --- a/src/acpica/source/include/platform/acenv.h
> +++ b/src/acpica/source/include/platform/acenv.h
> @@ -180,9 +180,9 @@
> #endif
>
> #ifdef ACPI_HELP_APP
> -#define ACPI_DEBUG_OUTPUT
> #define ACPI_APPLICATION
> #define ACPI_SINGLE_THREADED
> +#define ACPI_NO_ERROR_MESSAGES
> #endif
>
> /* Linkable ACPICA library */
> @@ -252,6 +252,9 @@
> #elif defined(_AED_EFI)
> #include "acefi.h"
>
> +#elif defined(__HAIKU__)
> +#include "achaiku.h"
> +
> #else
>
> /* Unknown environment */
> diff --git a/src/acpica/source/os_specific/service_layers/osunixxf.c b/src/acpica/source/os_specific/service_layers/osunixxf.c
> index d5e3af9..840328b 100644
> --- a/src/acpica/source/os_specific/service_layers/osunixxf.c
> +++ b/src/acpica/source/os_specific/service_layers/osunixxf.c
> @@ -425,7 +425,7 @@ AcpiOsGetLine (
> UINT32 BufferLength,
> UINT32 *BytesRead)
> {
> - UINT8 Temp;
> + int Temp;
> UINT32 i;
>
>
> @@ -436,13 +436,17 @@ AcpiOsGetLine (
> return (AE_BUFFER_OVERFLOW);
> }
>
> - scanf ("%1c", &Temp);
> + if ((Temp = getchar ()) == EOF)
> + {
> + return (AE_ERROR);
> + }
> +
> if (!Temp || Temp == '\n')
> {
> break;
> }
>
> - Buffer [i] = Temp;
> + Buffer [i] = (char) Temp;
> }
>
> /* Null terminate the buffer */
> @@ -1313,3 +1317,24 @@ AcpiOsExecute (
> }
>
> #endif /* ACPI_SINGLE_THREADED */
> +
> +
> +/******************************************************************************
> + *
> + * FUNCTION: AcpiOsWaitEventsComplete
> + *
> + * PARAMETERS: None
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Wait for all asynchronous events to complete. This
> + * implementation does nothing.
> + *
> + *****************************************************************************/
> +
> +void
> +AcpiOsWaitEventsComplete (
> + void)
> +{
> + return;
> +}
> diff --git a/src/acpica/source/tools/acpiexec/aecommon.h b/src/acpica/source/tools/acpiexec/aecommon.h
> index 01615b1..0f5f789 100644
> --- a/src/acpica/source/tools/acpiexec/aecommon.h
> +++ b/src/acpica/source/tools/acpiexec/aecommon.h
> @@ -140,6 +140,7 @@ extern BOOLEAN AcpiGbl_IgnoreErrors;
> extern UINT8 AcpiGbl_RegionFillValue;
> extern UINT8 AcpiGbl_UseHwReducedFadt;
> extern BOOLEAN AcpiGbl_DisplayRegionAccess;
> +extern BOOLEAN AcpiGbl_DoInterfaceTests;
>
> /* Check for unexpected exceptions */
>
> diff --git a/src/acpica/source/tools/acpiexec/aehandlers.c b/src/acpica/source/tools/acpiexec/aehandlers.c
> index ccf6966..ba7e5a1 100644
> --- a/src/acpica/source/tools/acpiexec/aehandlers.c
> +++ b/src/acpica/source/tools/acpiexec/aehandlers.c
> @@ -121,12 +121,24 @@
> /* Local prototypes */
>
> static void
> -AeNotifyHandler (
> +AeNotifyHandler1 (
> ACPI_HANDLE Device,
> UINT32 Value,
> void *Context);
>
> static void
> +AeNotifyHandler2 (
> + ACPI_HANDLE Device,
> + UINT32 Value,
> + void *Context);
> +
> +static void
> +AeCommonNotifyHandler (
> + ACPI_HANDLE Device,
> + UINT32 Value,
> + UINT32 HandlerId);
> +
> +static void
> AeDeviceNotifyHandler (
> ACPI_HANDLE Device,
> UINT32 Value,
> @@ -258,24 +270,51 @@ AeCtrlCHandler (
>
> /******************************************************************************
> *
> - * FUNCTION: AeNotifyHandler
> + * FUNCTION: AeNotifyHandler(s)
> *
> * PARAMETERS: Standard notify handler parameters
> *
> * RETURN: Status
> *
> - * DESCRIPTION: System notify handler for AcpiExec utility. Used by the ASL
> + * DESCRIPTION: Notify handlers for AcpiExec utility. Used by the ASL
> * test suite(s) to communicate errors and other information to
> - * this utility via the Notify() operator.
> + * this utility via the Notify() operator. Tests notify handling
> + * and multiple notify handler support.
> *
> *****************************************************************************/
>
> static void
> -AeNotifyHandler (
> - ACPI_HANDLE Device,
> - UINT32 Value,
> - void *Context)
> +AeNotifyHandler1 (
> + ACPI_HANDLE Device,
> + UINT32 Value,
> + void *Context)
> +{
> + AeCommonNotifyHandler (Device, Value, 1);
> +}
> +
> +static void
> +AeNotifyHandler2 (
> + ACPI_HANDLE Device,
> + UINT32 Value,
> + void *Context)
> {
> + AeCommonNotifyHandler (Device, Value, 2);
> +}
> +
> +static void
> +AeCommonNotifyHandler (
> + ACPI_HANDLE Device,
> + UINT32 Value,
> + UINT32 HandlerId)
> +{
> + char *Type;
> +
> +
> + Type = "Device";
> + if (Value <= ACPI_MAX_SYS_NOTIFY)
> + {
> + Type = "System";
> + }
>
> switch (Value)
> {
> @@ -309,12 +348,13 @@ AeNotifyHandler (
> #endif
>
> default:
> - printf ("[AcpiExec] Received a System Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
> - AcpiUtGetNodeName (Device), Device, Value,
> + printf ("[AcpiExec] Handler %u: Received a %s Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
> + HandlerId, Type, AcpiUtGetNodeName (Device), Device, Value,
> AcpiUtGetNotifyName (Value));
> if (AcpiGbl_DebugFile)
> {
> - AcpiOsPrintf ("[AcpiExec] Received a system notify, Value 0x%2.2X\n", Value);
> + AcpiOsPrintf ("[AcpiExec] Handler %u: Received a %s notify, Value 0x%2.2X\n",
> + HandlerId, Type, Value);
> }
>
> (void) AcpiEvaluateObject (Device, "_NOT", NULL, NULL);
> @@ -325,6 +365,39 @@ AeNotifyHandler (
>
> /******************************************************************************
> *
> + * FUNCTION: AeSystemNotifyHandler
> + *
> + * PARAMETERS: Standard notify handler parameters
> + *
> + * RETURN: Status
> + *
> + * DESCRIPTION: System notify handler for AcpiExec utility. Used by the ASL
> + * test suite(s) to communicate errors and other information to
> + * this utility via the Notify() operator.
> + *
> + *****************************************************************************/
> +
> +static void
> +AeSystemNotifyHandler (
> + ACPI_HANDLE Device,
> + UINT32 Value,
> + void *Context)
> +{
> +
> + printf ("[AcpiExec] Global: Received a System Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
> + AcpiUtGetNodeName (Device), Device, Value,
> + AcpiUtGetNotifyName (Value));
> + if (AcpiGbl_DebugFile)
> + {
> + AcpiOsPrintf ("[AcpiExec] Global: Received a System Notify, Value 0x%2.2X\n", Value);
> + }
> +
> + (void) AcpiEvaluateObject (Device, "_NOT", NULL, NULL);
> +}
> +
> +
> +/******************************************************************************
> + *
> * FUNCTION: AeDeviceNotifyHandler
> *
> * PARAMETERS: Standard notify handler parameters
> @@ -344,12 +417,12 @@ AeDeviceNotifyHandler (
> void *Context)
> {
>
> - printf ("[AcpiExec] Received a Device Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
> + printf ("[AcpiExec] Global: Received a Device Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
> AcpiUtGetNodeName (Device), Device, Value,
> AcpiUtGetNotifyName (Value));
> if (AcpiGbl_DebugFile)
> {
> - AcpiOsPrintf ("[AcpiExec] Received a device notify, Value 0x%2.2X\n", Value);
> + AcpiOsPrintf ("[AcpiExec] Global: Received a Device Notify, Value 0x%2.2X\n", Value);
> }
>
> (void) AcpiEvaluateObject (Device, "_NOT", NULL, NULL);
> @@ -759,18 +832,18 @@ AeInstallEarlyHandlers (
> AcpiFormatException (Status));
> }
>
> - /* Install global notify handler */
> + /* Install global notify handlers */
>
> Status = AcpiInstallNotifyHandler (ACPI_ROOT_OBJECT, ACPI_SYSTEM_NOTIFY,
> - AeNotifyHandler, NULL);
> + AeSystemNotifyHandler, NULL);
> if (ACPI_FAILURE (Status))
> {
> - printf ("Could not install a global notify handler, %s\n",
> + printf ("Could not install a global system notify handler, %s\n",
> AcpiFormatException (Status));
> }
>
> Status = AcpiInstallNotifyHandler (ACPI_ROOT_OBJECT, ACPI_DEVICE_NOTIFY,
> - AeDeviceNotifyHandler, NULL);
> + AeDeviceNotifyHandler, NULL);
> if (ACPI_FAILURE (Status))
> {
> printf ("Could not install a global notify handler, %s\n",
> @@ -781,7 +854,7 @@ AeInstallEarlyHandlers (
> if (ACPI_SUCCESS (Status))
> {
> Status = AcpiInstallNotifyHandler (Handle, ACPI_SYSTEM_NOTIFY,
> - AeNotifyHandler, NULL);
> + AeNotifyHandler1, NULL);
> if (ACPI_FAILURE (Status))
> {
> printf ("Could not install a notify handler, %s\n",
> @@ -789,7 +862,7 @@ AeInstallEarlyHandlers (
> }
>
> Status = AcpiRemoveNotifyHandler (Handle, ACPI_SYSTEM_NOTIFY,
> - AeNotifyHandler);
> + AeNotifyHandler1);
> if (ACPI_FAILURE (Status))
> {
> printf ("Could not remove a notify handler, %s\n",
> @@ -797,20 +870,35 @@ AeInstallEarlyHandlers (
> }
>
> Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> - AeNotifyHandler, NULL);
> + AeNotifyHandler1, NULL);
> AE_CHECK_OK (AcpiInstallNotifyHandler, Status);
>
> Status = AcpiRemoveNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> - AeNotifyHandler);
> + AeNotifyHandler1);
> AE_CHECK_OK (AcpiRemoveNotifyHandler, Status);
>
> +#if 0
> Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> - AeNotifyHandler, NULL);
> + AeNotifyHandler1, NULL);
> if (ACPI_FAILURE (Status))
> {
> printf ("Could not install a notify handler, %s\n",
> AcpiFormatException (Status));
> }
> +#endif
> +
> + /* Install two handlers for _SB_ */
> +
> + Status = AcpiInstallNotifyHandler (Handle, ACPI_SYSTEM_NOTIFY,
> + AeNotifyHandler1, ACPI_CAST_PTR (void, 0x01234567));
> +
> + Status = AcpiInstallNotifyHandler (Handle, ACPI_SYSTEM_NOTIFY,
> + AeNotifyHandler2, ACPI_CAST_PTR (void, 0x89ABCDEF));
> +
> + /* Attempt duplicate handler installation, should fail */
> +
> + Status = AcpiInstallNotifyHandler (Handle, ACPI_SYSTEM_NOTIFY,
> + AeNotifyHandler1, ACPI_CAST_PTR (void, 0x77777777));
>
> Status = AcpiAttachData (Handle, AeAttachedDataHandler, Handle);
> AE_CHECK_OK (AcpiAttachData, Status);
> @@ -827,6 +915,37 @@ AeInstallEarlyHandlers (
> }
>
>
> + Status = AcpiGetHandle (NULL, "\\_TZ.TZ1", &Handle);
> + if (ACPI_SUCCESS (Status))
> + {
> + Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> + AeNotifyHandler1, ACPI_CAST_PTR (void, 0x01234567));
> +
> + Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> + AeNotifyHandler2, ACPI_CAST_PTR (void, 0x89ABCDEF));
> +
> + Status = AcpiRemoveNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> + AeNotifyHandler1);
> + Status = AcpiRemoveNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> + AeNotifyHandler2);
> +
> + Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> + AeNotifyHandler2, ACPI_CAST_PTR (void, 0x89ABCDEF));
> +
> + Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> + AeNotifyHandler1, ACPI_CAST_PTR (void, 0x01234567));
> + }
> +
> + Status = AcpiGetHandle (NULL, "\\_PR.CPU0", &Handle);
> + if (ACPI_SUCCESS (Status))
> + {
> + Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> + AeNotifyHandler1, ACPI_CAST_PTR (void, 0x01234567));
> +
> + Status = AcpiInstallNotifyHandler (Handle, ACPI_SYSTEM_NOTIFY,
> + AeNotifyHandler2, ACPI_CAST_PTR (void, 0x89ABCDEF));
> + }
> +
> /*
> * Install handlers that will override the default handlers for some of
> * the space IDs.
> --
> 1.7.10.4
>
Acked-by: Keng-Yu Lin <kengyu at canonical.com>
More information about the fwts-devel
mailing list