diff mbox

ACPICA: update to version 20131115

Message ID 1384787908-15837-1-git-send-email-colin.king@canonical.com
State Accepted
Headers show

Commit Message

Colin Ian King Nov. 18, 2013, 3:18 p.m. UTC
From: Colin Ian King <colin.king@canonical.com>

This set of ACPICA fixes includes the following fixes:

https://lists.acpica.org/pipermail/devel/2013-November/thread.html

I've run this through my database of ACPI tables on the method,
syntaxcheck and WMI tests and compared these with previous version
and we have no regressions.   Also checked in Coverity Scan.

Signed-off-by: Colin Ian King <colin.king@canonical.com>
---
 src/acpica/source/common/adfile.c                  |   9 +-
 src/acpica/source/common/adwalk.c                  |  19 ++--
 src/acpica/source/components/debugger/dbcmds.c     |   8 +-
 src/acpica/source/components/namespace/nsalloc.c   |  19 +++-
 src/acpica/source/components/namespace/nsutils.c   |  18 +--
 src/acpica/source/components/resources/rscalc.c    |   6 +-
 src/acpica/source/components/resources/rscreate.c  |  35 +++---
 src/acpica/source/components/resources/rsutils.c   |   2 +-
 src/acpica/source/components/utilities/utdebug.c   |  34 +++++-
 src/acpica/source/components/utilities/utxface.c   |   1 +
 src/acpica/source/components/utilities/utxfinit.c  |   1 +
 src/acpica/source/include/acconfig.h               |   2 +
 src/acpica/source/include/acpixf.h                 |   2 +-
 src/acpica/source/include/acresrc.h                |   5 +-
 src/acpica/source/include/platform/aclinux.h       | 122 +++++++++++++--------
 .../source/os_specific/service_layers/osunixxf.c   |   2 +-
 src/acpica/source/tools/acpiexec/aehandlers.c      |  44 +++++++-
 17 files changed, 221 insertions(+), 108 deletions(-)

Comments

Alex Hung Nov. 27, 2013, 2:53 a.m. UTC | #1
On 11/18/2013 11:18 PM, Colin King wrote:
> From: Colin Ian King <colin.king@canonical.com>
>
> This set of ACPICA fixes includes the following fixes:
>
> https://lists.acpica.org/pipermail/devel/2013-November/thread.html
>
> I've run this through my database of ACPI tables on the method,
> syntaxcheck and WMI tests and compared these with previous version
> and we have no regressions.   Also checked in Coverity Scan.
>
> Signed-off-by: Colin Ian King <colin.king@canonical.com>
> ---
>   src/acpica/source/common/adfile.c                  |   9 +-
>   src/acpica/source/common/adwalk.c                  |  19 ++--
>   src/acpica/source/components/debugger/dbcmds.c     |   8 +-
>   src/acpica/source/components/namespace/nsalloc.c   |  19 +++-
>   src/acpica/source/components/namespace/nsutils.c   |  18 +--
>   src/acpica/source/components/resources/rscalc.c    |   6 +-
>   src/acpica/source/components/resources/rscreate.c  |  35 +++---
>   src/acpica/source/components/resources/rsutils.c   |   2 +-
>   src/acpica/source/components/utilities/utdebug.c   |  34 +++++-
>   src/acpica/source/components/utilities/utxface.c   |   1 +
>   src/acpica/source/components/utilities/utxfinit.c  |   1 +
>   src/acpica/source/include/acconfig.h               |   2 +
>   src/acpica/source/include/acpixf.h                 |   2 +-
>   src/acpica/source/include/acresrc.h                |   5 +-
>   src/acpica/source/include/platform/aclinux.h       | 122 +++++++++++++--------
>   .../source/os_specific/service_layers/osunixxf.c   |   2 +-
>   src/acpica/source/tools/acpiexec/aehandlers.c      |  44 +++++++-
>   17 files changed, 221 insertions(+), 108 deletions(-)
>
> diff --git a/src/acpica/source/common/adfile.c b/src/acpica/source/common/adfile.c
> index 57cb580..d598ac8 100644
> --- a/src/acpica/source/common/adfile.c
> +++ b/src/acpica/source/common/adfile.c
> @@ -401,7 +401,7 @@ FlSplitInputPathname (
>
>       if (!Filename)
>       {
> -        ACPI_FREE(DirectoryPath);
> +        ACPI_FREE (DirectoryPath);
>           return (AE_NO_MEMORY);
>       }
>
> @@ -410,10 +410,9 @@ FlSplitInputPathname (
>       if (OutFilename)
>       {
>           *OutFilename = Filename;
> +        return (AE_OK);
>       }
> -    else
> -    {
> -        ACPI_FREE(Filename);
> -    }
> +
> +    ACPI_FREE (Filename);
>       return (AE_OK);
>   }
> diff --git a/src/acpica/source/common/adwalk.c b/src/acpica/source/common/adwalk.c
> index 76ef5df..2d380f4 100644
> --- a/src/acpica/source/common/adwalk.c
> +++ b/src/acpica/source/common/adwalk.c
> @@ -892,17 +892,18 @@ AcpiDmXrefDescendingOp (
>       {
>           if (Status == AE_NOT_FOUND)
>           {
> -            AcpiDmAddToExternalList (Op, Path, (UINT8) ObjectType, 0);
> -
>               /*
> -             * We could install this into the namespace, but we catch duplicate
> -             * externals when they are added to the list.
> +             * Add this symbol as an external declaration, except if the
> +             * parent is a CondRefOf operator. For this operator, we do not
> +             * need an external, nor do we want one, since this can cause
> +             * disassembly problems if the symbol is actually a control
> +             * method.
>                */
> -#if 0
> -            Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY,
> -                       ACPI_IMODE_LOAD_PASS1, ACPI_NS_DONT_OPEN_SCOPE,
> -                       WalkState, &Node);
> -#endif
> +            if (!(Op->Asl.Parent &&
> +                (Op->Asl.Parent->Asl.AmlOpcode == AML_COND_REF_OF_OP)))
> +            {
> +                AcpiDmAddToExternalList (Op, Path, (UINT8) ObjectType, 0);
> +            }
>           }
>       }
>
> diff --git a/src/acpica/source/components/debugger/dbcmds.c b/src/acpica/source/components/debugger/dbcmds.c
> index aa3f89b..bed0f55 100644
> --- a/src/acpica/source/components/debugger/dbcmds.c
> +++ b/src/acpica/source/components/debugger/dbcmds.c
> @@ -902,7 +902,7 @@ AcpiDmTestResourceConversion (
>
>       /* Convert internal resource list to external AML resource template */
>
> -    Status = AcpiRsCreateAmlResources (ResourceBuffer.Pointer, &NewAml);
> +    Status = AcpiRsCreateAmlResources (&ResourceBuffer, &NewAml);
>       if (ACPI_FAILURE (Status))
>       {
>           AcpiOsPrintf ("AcpiRsCreateAmlResources failed: %s\n",
> @@ -914,8 +914,8 @@ AcpiDmTestResourceConversion (
>
>       OriginalAml = ReturnBuffer.Pointer;
>
> -    AcpiDmCompareAmlResources (
> -        OriginalAml->Buffer.Pointer, (ACPI_RSDESC_SIZE) OriginalAml->Buffer.Length,
> +    AcpiDmCompareAmlResources (OriginalAml->Buffer.Pointer,
> +        (ACPI_RSDESC_SIZE) OriginalAml->Buffer.Length,
>           NewAml.Pointer, (ACPI_RSDESC_SIZE) NewAml.Length);
>
>       /* Cleanup and exit */
> @@ -1114,7 +1114,7 @@ GetCrs:
>           }
>
>   EndCrs:
> -        ACPI_FREE_BUFFER (ReturnBuffer);
> +        ACPI_FREE (ReturnBuffer.Pointer);
>       }
>
>
> diff --git a/src/acpica/source/components/namespace/nsalloc.c b/src/acpica/source/components/namespace/nsalloc.c
> index cbb644f..8efa313 100644
> --- a/src/acpica/source/components/namespace/nsalloc.c
> +++ b/src/acpica/source/components/namespace/nsalloc.c
> @@ -193,6 +193,7 @@ AcpiNsDeleteNode (
>       ACPI_NAMESPACE_NODE     *Node)
>   {
>       ACPI_OPERAND_OBJECT     *ObjDesc;
> +    ACPI_OPERAND_OBJECT     *NextDesc;
>
>
>       ACPI_FUNCTION_NAME (NsDeleteNode);
> @@ -203,12 +204,13 @@ AcpiNsDeleteNode (
>       AcpiNsDetachObject (Node);
>
>       /*
> -     * Delete an attached data object if present (an object that was created
> -     * and attached via AcpiAttachData). Note: After any normal object is
> -     * detached above, the only possible remaining object is a data object.
> +     * Delete an attached data object list if present (objects that were
> +     * attached via AcpiAttachData). Note: After any normal object is
> +     * detached above, the only possible remaining object(s) are data
> +     * objects, in a linked list.
>        */
>       ObjDesc = Node->Object;
> -    if (ObjDesc &&
> +    while (ObjDesc &&
>           (ObjDesc->Common.Type == ACPI_TYPE_LOCAL_DATA))
>       {
>           /* Invoke the attached data deletion handler if present */
> @@ -218,7 +220,16 @@ AcpiNsDeleteNode (
>               ObjDesc->Data.Handler (Node, ObjDesc->Data.Pointer);
>           }
>
> +        NextDesc = ObjDesc->Common.NextObject;
>           AcpiUtRemoveReference (ObjDesc);
> +        ObjDesc = NextDesc;
> +    }
> +
> +    /* Special case for the statically allocated root node */
> +
> +    if (Node == AcpiGbl_RootNode)
> +    {
> +        return;
>       }
>
>       /* Now we can delete the node */
> diff --git a/src/acpica/source/components/namespace/nsutils.c b/src/acpica/source/components/namespace/nsutils.c
> index 1f5e188..f51fbf3 100644
> --- a/src/acpica/source/components/namespace/nsutils.c
> +++ b/src/acpica/source/components/namespace/nsutils.c
> @@ -765,27 +765,29 @@ void
>   AcpiNsTerminate (
>       void)
>   {
> -    ACPI_OPERAND_OBJECT     *ObjDesc;
> +    ACPI_STATUS             Status;
>
>
>       ACPI_FUNCTION_TRACE (NsTerminate);
>
>
>       /*
> -     * 1) Free the entire namespace -- all nodes and objects
> -     *
> -     * Delete all object descriptors attached to namepsace nodes
> +     * Free the entire namespace -- all nodes and all objects
> +     * attached to the nodes
>        */
>       AcpiNsDeleteNamespaceSubtree (AcpiGbl_RootNode);
>
> -    /* Detach any objects attached to the root */
> +    /* Delete any objects attached to the root node */
>
> -    ObjDesc = AcpiNsGetAttachedObject (AcpiGbl_RootNode);
> -    if (ObjDesc)
> +    Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
> +    if (ACPI_FAILURE (Status))
>       {
> -        AcpiNsDetachObject (AcpiGbl_RootNode);
> +        return_VOID;
>       }
>
> +    AcpiNsDeleteNode (AcpiGbl_RootNode);
> +    (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
> +
>       ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Namespace freed\n"));
>       return_VOID;
>   }
> diff --git a/src/acpica/source/components/resources/rscalc.c b/src/acpica/source/components/resources/rscalc.c
> index f8eced5..dd0df81 100644
> --- a/src/acpica/source/components/resources/rscalc.c
> +++ b/src/acpica/source/components/resources/rscalc.c
> @@ -269,6 +269,7 @@ AcpiRsStreamOptionLength (
>    * FUNCTION:    AcpiRsGetAmlLength
>    *
>    * PARAMETERS:  Resource            - Pointer to the resource linked list
> + *              ResourceListSize    - Size of the resource linked list
>    *              SizeNeeded          - Where the required size is returned
>    *
>    * RETURN:      Status
> @@ -282,9 +283,11 @@ AcpiRsStreamOptionLength (
>   ACPI_STATUS
>   AcpiRsGetAmlLength (
>       ACPI_RESOURCE           *Resource,
> +    ACPI_SIZE               ResourceListSize,
>       ACPI_SIZE               *SizeNeeded)
>   {
>       ACPI_SIZE               AmlSizeNeeded = 0;
> +    ACPI_RESOURCE           *ResourceEnd;
>       ACPI_RS_LENGTH          TotalSize;
>
>
> @@ -293,7 +296,8 @@ AcpiRsGetAmlLength (
>
>       /* Traverse entire list of internal resource descriptors */
>
> -    while (Resource)
> +    ResourceEnd = ACPI_ADD_PTR (ACPI_RESOURCE, Resource, ResourceListSize);
> +    while (Resource < ResourceEnd)
>       {
>           /* Validate the descriptor type */
>
> diff --git a/src/acpica/source/components/resources/rscreate.c b/src/acpica/source/components/resources/rscreate.c
> index 0e58aee..c73147a 100644
> --- a/src/acpica/source/components/resources/rscreate.c
> +++ b/src/acpica/source/components/resources/rscreate.c
> @@ -507,23 +507,22 @@ AcpiRsCreatePciRoutingTable (
>    *
>    * FUNCTION:    AcpiRsCreateAmlResources
>    *
> - * PARAMETERS:  LinkedListBuffer        - Pointer to the resource linked list
> - *              OutputBuffer            - Pointer to the user's buffer
> + * PARAMETERS:  ResourceList            - Pointer to the resource list buffer
> + *              OutputBuffer            - Where the AML buffer is returned
>    *
>    * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code.
>    *              If the OutputBuffer is too small, the error will be
>    *              AE_BUFFER_OVERFLOW and OutputBuffer->Length will point
>    *              to the size buffer needed.
>    *
> - * DESCRIPTION: Takes the linked list of device resources and
> - *              creates a bytestream to be used as input for the
> - *              _SRS control method.
> + * DESCRIPTION: Converts a list of device resources to an AML bytestream
> + *              to be used as input for the _SRS control method.
>    *
>    ******************************************************************************/
>
>   ACPI_STATUS
>   AcpiRsCreateAmlResources (
> -    ACPI_RESOURCE           *LinkedListBuffer,
> +    ACPI_BUFFER             *ResourceList,
>       ACPI_BUFFER             *OutputBuffer)
>   {
>       ACPI_STATUS             Status;
> @@ -533,17 +532,15 @@ AcpiRsCreateAmlResources (
>       ACPI_FUNCTION_TRACE (RsCreateAmlResources);
>
>
> -    ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "LinkedListBuffer = %p\n",
> -        LinkedListBuffer));
> +    /* Params already validated, no need to re-validate here */
>
> -    /*
> -     * Params already validated, so we don't re-validate here
> -     *
> -     * Pass the LinkedListBuffer into a module that calculates
> -     * the buffer size needed for the byte stream.
> -     */
> -    Status = AcpiRsGetAmlLength (LinkedListBuffer,
> -                &AmlSizeNeeded);
> +    ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "ResourceList Buffer = %p\n",
> +        ResourceList->Pointer));
> +
> +    /* Get the buffer size needed for the AML byte stream */
> +
> +    Status = AcpiRsGetAmlLength (ResourceList->Pointer,
> +                ResourceList->Length, &AmlSizeNeeded);
>
>       ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "AmlSizeNeeded=%X, %s\n",
>           (UINT32) AmlSizeNeeded, AcpiFormatException (Status)));
> @@ -562,14 +559,14 @@ AcpiRsCreateAmlResources (
>
>       /* Do the conversion */
>
> -    Status = AcpiRsConvertResourcesToAml (LinkedListBuffer, AmlSizeNeeded,
> -                    OutputBuffer->Pointer);
> +    Status = AcpiRsConvertResourcesToAml (ResourceList->Pointer,
> +                AmlSizeNeeded, OutputBuffer->Pointer);
>       if (ACPI_FAILURE (Status))
>       {
>           return_ACPI_STATUS (Status);
>       }
>
>       ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "OutputBuffer %p Length %X\n",
> -            OutputBuffer->Pointer, (UINT32) OutputBuffer->Length));
> +        OutputBuffer->Pointer, (UINT32) OutputBuffer->Length));
>       return_ACPI_STATUS (AE_OK);
>   }
> diff --git a/src/acpica/source/components/resources/rsutils.c b/src/acpica/source/components/resources/rsutils.c
> index bdc5ccf..ec692e2 100644
> --- a/src/acpica/source/components/resources/rsutils.c
> +++ b/src/acpica/source/components/resources/rsutils.c
> @@ -899,7 +899,7 @@ AcpiRsSetSrsMethodData (
>        * Convert the linked list into a byte stream
>        */
>       Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
> -    Status = AcpiRsCreateAmlResources (InBuffer->Pointer, &Buffer);
> +    Status = AcpiRsCreateAmlResources (InBuffer, &Buffer);
>       if (ACPI_FAILURE (Status))
>       {
>           goto Cleanup;
> diff --git a/src/acpica/source/components/utilities/utdebug.c b/src/acpica/source/components/utilities/utdebug.c
> index af904ac..0a57f76 100644
> --- a/src/acpica/source/components/utilities/utdebug.c
> +++ b/src/acpica/source/components/utilities/utdebug.c
> @@ -283,6 +283,7 @@ AcpiDebugPrint (
>           }
>
>           AcpiGbl_PrevThreadId = ThreadId;
> +        AcpiGbl_NestingLevel = 0;
>       }
>
>       /*
> @@ -291,13 +292,22 @@ AcpiDebugPrint (
>        */
>       AcpiOsPrintf ("%9s-%04ld ", ModuleName, LineNumber);
>
> +#ifdef ACPI_EXEC_APP
> +    /*
> +     * For AcpiExec only, emit the thread ID and nesting level.
> +     * Note: nesting level is really only useful during a single-thread
> +     * execution. Otherwise, multiple threads will keep resetting the
> +     * level.
> +     */
>       if (ACPI_LV_THREADS & AcpiDbgLevel)
>       {
>           AcpiOsPrintf ("[%u] ", (UINT32) ThreadId);
>       }
>
> -    AcpiOsPrintf ("[%02ld] %-22.22s: ",
> -        AcpiGbl_NestingLevel, AcpiUtTrimFunctionName (FunctionName));
> +    AcpiOsPrintf ("[%02ld] ", AcpiGbl_NestingLevel);
> +#endif
> +
> +    AcpiOsPrintf ("%-22.22s: ", AcpiUtTrimFunctionName (FunctionName));
>
>       va_start (args, Format);
>       AcpiOsVprintf (Format, args);
> @@ -547,7 +557,10 @@ AcpiUtExit (
>               "%s\n", AcpiGbl_FnExitStr);
>       }
>
> -    AcpiGbl_NestingLevel--;
> +    if (AcpiGbl_NestingLevel)
> +    {
> +        AcpiGbl_NestingLevel--;
> +    }
>   }
>
>   ACPI_EXPORT_SYMBOL (AcpiUtExit)
> @@ -599,7 +612,10 @@ AcpiUtStatusExit (
>           }
>       }
>
> -    AcpiGbl_NestingLevel--;
> +    if (AcpiGbl_NestingLevel)
> +    {
> +        AcpiGbl_NestingLevel--;
> +    }
>   }
>
>   ACPI_EXPORT_SYMBOL (AcpiUtStatusExit)
> @@ -641,7 +657,10 @@ AcpiUtValueExit (
>               ACPI_FORMAT_UINT64 (Value));
>       }
>
> -    AcpiGbl_NestingLevel--;
> +    if (AcpiGbl_NestingLevel)
> +    {
> +        AcpiGbl_NestingLevel--;
> +    }
>   }
>
>   ACPI_EXPORT_SYMBOL (AcpiUtValueExit)
> @@ -682,7 +701,10 @@ AcpiUtPtrExit (
>               "%s %p\n", AcpiGbl_FnExitStr, Ptr);
>       }
>
> -    AcpiGbl_NestingLevel--;
> +    if (AcpiGbl_NestingLevel)
> +    {
> +        AcpiGbl_NestingLevel--;
> +    }
>   }
>
>   #endif
> diff --git a/src/acpica/source/components/utilities/utxface.c b/src/acpica/source/components/utilities/utxface.c
> index 3b69560..51ab251 100644
> --- a/src/acpica/source/components/utilities/utxface.c
> +++ b/src/acpica/source/components/utilities/utxface.c
> @@ -115,6 +115,7 @@
>
>
>   #define __UTXFACE_C__
> +#define EXPORT_ACPI_INTERFACES
>
>   #include "acpi.h"
>   #include "accommon.h"
> diff --git a/src/acpica/source/components/utilities/utxfinit.c b/src/acpica/source/components/utilities/utxfinit.c
> index d69adbc..9ee0309 100644
> --- a/src/acpica/source/components/utilities/utxfinit.c
> +++ b/src/acpica/source/components/utilities/utxfinit.c
> @@ -115,6 +115,7 @@
>
>
>   #define __UTXFINIT_C__
> +#define EXPORT_ACPI_INTERFACES
>
>   #include "acpi.h"
>   #include "accommon.h"
> diff --git a/src/acpica/source/include/acconfig.h b/src/acpica/source/include/acconfig.h
> index b9bdab6..d1a3dce 100644
> --- a/src/acpica/source/include/acconfig.h
> +++ b/src/acpica/source/include/acconfig.h
> @@ -156,7 +156,9 @@
>    * Should the subsystem abort the loading of an ACPI table if the
>    * table checksum is incorrect?
>    */
> +#ifndef ACPI_CHECKSUM_ABORT
>   #define ACPI_CHECKSUM_ABORT             FALSE
> +#endif
>
>   /*
>    * Generate a version of ACPICA that only supports "reduced hardware"
> diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h
> index cbcf400..ea0ff78 100644
> --- a/src/acpica/source/include/acpixf.h
> +++ b/src/acpica/source/include/acpixf.h
> @@ -119,7 +119,7 @@
>
>   /* Current ACPICA subsystem version in YYYYMMDD format */
>
> -#define ACPI_CA_VERSION                 0x20130927
> +#define ACPI_CA_VERSION                 0x20131115
>
>   #include "acconfig.h"
>   #include "actypes.h"
> diff --git a/src/acpica/source/include/acresrc.h b/src/acpica/source/include/acresrc.h
> index 0c51c15..12e4451 100644
> --- a/src/acpica/source/include/acresrc.h
> +++ b/src/acpica/source/include/acresrc.h
> @@ -270,7 +270,7 @@ AcpiRsCreateResourceList (
>
>   ACPI_STATUS
>   AcpiRsCreateAmlResources (
> -    ACPI_RESOURCE           *LinkedListBuffer,
> +    ACPI_BUFFER             *ResourceList,
>       ACPI_BUFFER             *OutputBuffer);
>
>   ACPI_STATUS
> @@ -324,7 +324,8 @@ AcpiRsGetListLength (
>
>   ACPI_STATUS
>   AcpiRsGetAmlLength (
> -    ACPI_RESOURCE           *LinkedListBuffer,
> +    ACPI_RESOURCE           *ResourceList,
> +    ACPI_SIZE               ResourceListSize,
>       ACPI_SIZE               *SizeNeeded);
>
>   ACPI_STATUS
> diff --git a/src/acpica/source/include/platform/aclinux.h b/src/acpica/source/include/platform/aclinux.h
> index 15c1748..e806e59 100644
> --- a/src/acpica/source/include/platform/aclinux.h
> +++ b/src/acpica/source/include/platform/aclinux.h
> @@ -130,11 +130,13 @@
>   #include <linux/ctype.h>
>   #include <linux/sched.h>
>   #include <linux/atomic.h>
> -#include <asm/div64.h>
> -#include <asm/acpi.h>
> +#include <linux/math64.h>
>   #include <linux/slab.h>
>   #include <linux/spinlock_types.h>
> -#include <asm/current.h>
> +#ifdef EXPORT_ACPI_INTERFACES
> +#include <linux/export.h>
> +#endif
> +#include <asm/acpi.h>
>
>   /* Host-dependent types and defines for in-kernel ACPICA */
>
> @@ -157,7 +159,7 @@
>   /* Host-dependent types and defines for user-space ACPICA */
>
>   #define ACPI_FLUSH_CPU_CACHE()
> -#define ACPI_CAST_PTHREAD_T(pthread) ((ACPI_THREAD_ID) (pthread))
> +#define ACPI_CAST_PTHREAD_T(Pthread) ((ACPI_THREAD_ID) (Pthread))
>
>   #if defined(__ia64__) || defined(__x86_64__) || defined(__aarch64__)
>   #define ACPI_MACHINE_WIDTH          64
> @@ -182,24 +184,31 @@
>
>
>   #ifdef __KERNEL__
> +
> +/*
> + * FIXME: Inclusion of actypes.h
> + * Linux kernel need this before defining inline OSL interfaces as
> + * actypes.h need to be included to find ACPICA type definitions.
> + * Since from ACPICA's perspective, the actypes.h should be included after
> + * acenv.h (aclinux.h), this leads to a inclusion mis-ordering issue.
> + */
>   #include <acpi/actypes.h>
>
> +/*
> + * Overrides for in-kernel ACPICA
> + */
>   ACPI_STATUS __init AcpiOsInitialize (
>       void);
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsInitialize
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsInitialize
>
> -ACPI_STATUS __exit AcpiOsTerminate (
> +ACPI_STATUS AcpiOsTerminate (
>       void);
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsTerminate
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsTerminate
>
>   /*
>    * Memory allocation/deallocation
>    */
>
> -/* Use native linux version of acpi_os_allocate_zeroed */
> -
> -#define USE_NATIVE_ALLOCATE_ZEROED
> -
>   /*
>    * The irqs_disabled() check is for resume from RAM.
>    * Interrupts are off during resume, just like they are for boot.
> @@ -212,7 +221,9 @@ AcpiOsAllocate (
>   {
>       return kmalloc (Size, irqs_disabled () ? GFP_ATOMIC : GFP_KERNEL);
>   }
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsAllocate
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsAllocate
> +
> +/* Use native linux version of AcpiOsAllocateZeroed */
>
>   static inline void *
>   AcpiOsAllocateZeroed (
> @@ -220,7 +231,8 @@ AcpiOsAllocateZeroed (
>   {
>       return kzalloc (Size, irqs_disabled () ? GFP_ATOMIC : GFP_KERNEL);
>   }
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsAllocateZeroed
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsAllocateZeroed
> +#define USE_NATIVE_ALLOCATE_ZEROED
>
>   static inline void
>   AcpiOsFree (
> @@ -228,7 +240,7 @@ AcpiOsFree (
>   {
>       kfree (Memory);
>   }
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsFree
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsFree
>
>   static inline void *
>   AcpiOsAcquireObject (
> @@ -237,20 +249,18 @@ AcpiOsAcquireObject (
>       return kmem_cache_zalloc (Cache,
>           irqs_disabled () ? GFP_ATOMIC : GFP_KERNEL);
>   }
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsAcquireObject
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsAcquireObject
>
> -/*
> - * Overrides for in-kernel ACPICA
> - */
>   static inline ACPI_THREAD_ID
>   AcpiOsGetThreadId (
>       void)
>   {
>       return (ACPI_THREAD_ID) (unsigned long) current;
>   }
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsGetThreadId
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetThreadId
>
>   #ifndef CONFIG_PREEMPT
> +
>   /*
>    * Used within ACPICA to show where it is safe to preempt execution
>    * when CONFIG_PREEMPT=n
> @@ -260,6 +270,7 @@ AcpiOsGetThreadId (
>           if (!irqs_disabled()) \
>               cond_resched(); \
>       } while (0)
> +
>   #endif
>
>   /*
> @@ -270,47 +281,66 @@ AcpiOsGetThreadId (
>    * prevents lockdep from reporting false positives for ACPICA locks.
>    */
>   #define AcpiOsCreateLock(__Handle) \
> -({ \
> -    spinlock_t *Lock = ACPI_ALLOCATE(sizeof(*Lock)); \
> -    if (Lock) { \
> -        *(__Handle) = Lock; \
> -        spin_lock_init(*(__Handle)); \
> -    } \
> -    Lock ? AE_OK : AE_NO_MEMORY; \
> -})
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsCreateLock
> +    ({ \
> +        spinlock_t *Lock = ACPI_ALLOCATE(sizeof(*Lock)); \
> +        if (Lock) { \
> +            *(__Handle) = Lock; \
> +            spin_lock_init(*(__Handle)); \
> +        } \
> +        Lock ? AE_OK : AE_NO_MEMORY; \
> +    })
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsCreateLock
>
>   void __iomem *
>   AcpiOsMapMemory (
>       ACPI_PHYSICAL_ADDRESS   Where,
>       ACPI_SIZE               Length);
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsMapMemory
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsMapMemory
>
>   void
>   AcpiOsUnmapMemory (
>       void __iomem            *LogicalAddress,
>       ACPI_SIZE               Size);
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsUnmapMemory
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsUnmapMemory
> +
> +/*
> + * OSL interfaces used by debugger/disassembler
> + */
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsReadable
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsWritable
> +
> +/*
> + * OSL interfaces used by utilities
> + */
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsRedirectOutput
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetLine
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetTableByName
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetTableByIndex
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetTableByAddress
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsOpenDirectory
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetNextFilename
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsCloseDirectory
>
> -/* OSL interfaces used by debugger/disassembler */
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsReadable
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsWritable
> +/*
> + * OSL interfaces added by Linux
> + */
> +void
> +EarlyAcpiOsUnmapMemory (
> +    void __iomem            *Virt,
> +    ACPI_SIZE               Size);
>
> -/* OSL interfaces used by utilities */
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsRedirectOutput
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsGetLine
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsGetTableByName
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsGetTableByIndex
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsGetTableByAddress
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsOpenDirectory
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsGetNextFilename
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsCloseDirectory
> +void
> +AcpiOsGpeCount (
> +    UINT32                  GpeNumber);
>
> -/* OSL interfaces added by Linux */
> +void
> +AcpiOsFixedEventCount (
> +    UINT32                  FixedEventNumber);
>
> -#ifdef EXPORT_ACPI_INTERFACES
> -#include <linux/export.h>
> -#endif
> +ACPI_STATUS
> +AcpiOsHotplugExecute (
> +    ACPI_OSD_EXEC_CALLBACK  Function,
> +    void                    *Context);
>
>   #endif /* __KERNEL__ */
>
> diff --git a/src/acpica/source/os_specific/service_layers/osunixxf.c b/src/acpica/source/os_specific/service_layers/osunixxf.c
> index 7aa4168..ad003c1 100644
> --- a/src/acpica/source/os_specific/service_layers/osunixxf.c
> +++ b/src/acpica/source/os_specific/service_layers/osunixxf.c
> @@ -163,7 +163,7 @@ typedef void* (*PTHREAD_CALLBACK) (void *);
>   /* Terminal support for AcpiExec only */
>
>   #ifdef ACPI_EXEC_APP
> -#include <termio.h>
> +#include <termios.h>
>
>   struct termios              OriginalTermAttributes;
>
> diff --git a/src/acpica/source/tools/acpiexec/aehandlers.c b/src/acpica/source/tools/acpiexec/aehandlers.c
> index f0cc8ba..294abea 100644
> --- a/src/acpica/source/tools/acpiexec/aehandlers.c
> +++ b/src/acpica/source/tools/acpiexec/aehandlers.c
> @@ -170,6 +170,11 @@ AeAttachedDataHandler (
>       ACPI_HANDLE             Object,
>       void                    *Data);
>
> +static void
> +AeAttachedDataHandler2 (
> +    ACPI_HANDLE             Object,
> +    void                    *Data);
> +
>   static UINT32
>   AeInterfaceHandler (
>       ACPI_STRING             InterfaceName,
> @@ -677,7 +682,29 @@ AeAttachedDataHandler (
>       ACPI_NAMESPACE_NODE     *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Data);
>
>
> -    AcpiOsPrintf ("Received an attached data deletion on %4.4s\n",
> +    AcpiOsPrintf ("Received an attached data deletion (1) on %4.4s\n",
> +        Node->Name.Ascii);
> +}
> +
> +
> +/******************************************************************************
> + *
> + * FUNCTION:    AeAttachedDataHandler2
> + *
> + * DESCRIPTION: Handler for deletion of nodes with attached data (attached via
> + *              AcpiAttachData)
> + *
> + *****************************************************************************/
> +
> +static void
> +AeAttachedDataHandler2 (
> +    ACPI_HANDLE             Object,
> +    void                    *Data)
> +{
> +    ACPI_NAMESPACE_NODE     *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Data);
> +
> +
> +    AcpiOsPrintf ("Received an attached data deletion (2) on %4.4s\n",
>           Node->Name.Ascii);
>   }
>
> @@ -1094,8 +1121,23 @@ AeInstallEarlyHandlers (
>           Status = AcpiDetachData (Handle, AeAttachedDataHandler);
>           AE_CHECK_OK (AcpiDetachData, Status);
>
> +        /* Test attach data at the root object */
> +
> +        Status = AcpiAttachData (ACPI_ROOT_OBJECT, AeAttachedDataHandler,
> +            AcpiGbl_RootNode);
> +        AE_CHECK_OK (AcpiAttachData, Status);
> +
> +        Status = AcpiAttachData (ACPI_ROOT_OBJECT, AeAttachedDataHandler2,
> +            AcpiGbl_RootNode);
> +        AE_CHECK_OK (AcpiAttachData, Status);
> +
> +        /* Test support for multiple attaches */
> +
>           Status = AcpiAttachData (Handle, AeAttachedDataHandler, Handle);
>           AE_CHECK_OK (AcpiAttachData, Status);
> +
> +        Status = AcpiAttachData (Handle, AeAttachedDataHandler2, Handle);
> +        AE_CHECK_OK (AcpiAttachData, Status);
>       }
>       else
>       {
>

Acked-by: Alex Hung <alex.hung@canonical.com>
Ivan Hu Nov. 29, 2013, 3:58 a.m. UTC | #2
On 11/18/2013 11:18 PM, Colin King wrote:
> From: Colin Ian King <colin.king@canonical.com>
>
> This set of ACPICA fixes includes the following fixes:
>
> https://lists.acpica.org/pipermail/devel/2013-November/thread.html
>
> I've run this through my database of ACPI tables on the method,
> syntaxcheck and WMI tests and compared these with previous version
> and we have no regressions.   Also checked in Coverity Scan.
>
> Signed-off-by: Colin Ian King <colin.king@canonical.com>
> ---
>   src/acpica/source/common/adfile.c                  |   9 +-
>   src/acpica/source/common/adwalk.c                  |  19 ++--
>   src/acpica/source/components/debugger/dbcmds.c     |   8 +-
>   src/acpica/source/components/namespace/nsalloc.c   |  19 +++-
>   src/acpica/source/components/namespace/nsutils.c   |  18 +--
>   src/acpica/source/components/resources/rscalc.c    |   6 +-
>   src/acpica/source/components/resources/rscreate.c  |  35 +++---
>   src/acpica/source/components/resources/rsutils.c   |   2 +-
>   src/acpica/source/components/utilities/utdebug.c   |  34 +++++-
>   src/acpica/source/components/utilities/utxface.c   |   1 +
>   src/acpica/source/components/utilities/utxfinit.c  |   1 +
>   src/acpica/source/include/acconfig.h               |   2 +
>   src/acpica/source/include/acpixf.h                 |   2 +-
>   src/acpica/source/include/acresrc.h                |   5 +-
>   src/acpica/source/include/platform/aclinux.h       | 122 +++++++++++++--------
>   .../source/os_specific/service_layers/osunixxf.c   |   2 +-
>   src/acpica/source/tools/acpiexec/aehandlers.c      |  44 +++++++-
>   17 files changed, 221 insertions(+), 108 deletions(-)
>
> diff --git a/src/acpica/source/common/adfile.c b/src/acpica/source/common/adfile.c
> index 57cb580..d598ac8 100644
> --- a/src/acpica/source/common/adfile.c
> +++ b/src/acpica/source/common/adfile.c
> @@ -401,7 +401,7 @@ FlSplitInputPathname (
>
>       if (!Filename)
>       {
> -        ACPI_FREE(DirectoryPath);
> +        ACPI_FREE (DirectoryPath);
>           return (AE_NO_MEMORY);
>       }
>
> @@ -410,10 +410,9 @@ FlSplitInputPathname (
>       if (OutFilename)
>       {
>           *OutFilename = Filename;
> +        return (AE_OK);
>       }
> -    else
> -    {
> -        ACPI_FREE(Filename);
> -    }
> +
> +    ACPI_FREE (Filename);
>       return (AE_OK);
>   }
> diff --git a/src/acpica/source/common/adwalk.c b/src/acpica/source/common/adwalk.c
> index 76ef5df..2d380f4 100644
> --- a/src/acpica/source/common/adwalk.c
> +++ b/src/acpica/source/common/adwalk.c
> @@ -892,17 +892,18 @@ AcpiDmXrefDescendingOp (
>       {
>           if (Status == AE_NOT_FOUND)
>           {
> -            AcpiDmAddToExternalList (Op, Path, (UINT8) ObjectType, 0);
> -
>               /*
> -             * We could install this into the namespace, but we catch duplicate
> -             * externals when they are added to the list.
> +             * Add this symbol as an external declaration, except if the
> +             * parent is a CondRefOf operator. For this operator, we do not
> +             * need an external, nor do we want one, since this can cause
> +             * disassembly problems if the symbol is actually a control
> +             * method.
>                */
> -#if 0
> -            Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY,
> -                       ACPI_IMODE_LOAD_PASS1, ACPI_NS_DONT_OPEN_SCOPE,
> -                       WalkState, &Node);
> -#endif
> +            if (!(Op->Asl.Parent &&
> +                (Op->Asl.Parent->Asl.AmlOpcode == AML_COND_REF_OF_OP)))
> +            {
> +                AcpiDmAddToExternalList (Op, Path, (UINT8) ObjectType, 0);
> +            }
>           }
>       }
>
> diff --git a/src/acpica/source/components/debugger/dbcmds.c b/src/acpica/source/components/debugger/dbcmds.c
> index aa3f89b..bed0f55 100644
> --- a/src/acpica/source/components/debugger/dbcmds.c
> +++ b/src/acpica/source/components/debugger/dbcmds.c
> @@ -902,7 +902,7 @@ AcpiDmTestResourceConversion (
>
>       /* Convert internal resource list to external AML resource template */
>
> -    Status = AcpiRsCreateAmlResources (ResourceBuffer.Pointer, &NewAml);
> +    Status = AcpiRsCreateAmlResources (&ResourceBuffer, &NewAml);
>       if (ACPI_FAILURE (Status))
>       {
>           AcpiOsPrintf ("AcpiRsCreateAmlResources failed: %s\n",
> @@ -914,8 +914,8 @@ AcpiDmTestResourceConversion (
>
>       OriginalAml = ReturnBuffer.Pointer;
>
> -    AcpiDmCompareAmlResources (
> -        OriginalAml->Buffer.Pointer, (ACPI_RSDESC_SIZE) OriginalAml->Buffer.Length,
> +    AcpiDmCompareAmlResources (OriginalAml->Buffer.Pointer,
> +        (ACPI_RSDESC_SIZE) OriginalAml->Buffer.Length,
>           NewAml.Pointer, (ACPI_RSDESC_SIZE) NewAml.Length);
>
>       /* Cleanup and exit */
> @@ -1114,7 +1114,7 @@ GetCrs:
>           }
>
>   EndCrs:
> -        ACPI_FREE_BUFFER (ReturnBuffer);
> +        ACPI_FREE (ReturnBuffer.Pointer);
>       }
>
>
> diff --git a/src/acpica/source/components/namespace/nsalloc.c b/src/acpica/source/components/namespace/nsalloc.c
> index cbb644f..8efa313 100644
> --- a/src/acpica/source/components/namespace/nsalloc.c
> +++ b/src/acpica/source/components/namespace/nsalloc.c
> @@ -193,6 +193,7 @@ AcpiNsDeleteNode (
>       ACPI_NAMESPACE_NODE     *Node)
>   {
>       ACPI_OPERAND_OBJECT     *ObjDesc;
> +    ACPI_OPERAND_OBJECT     *NextDesc;
>
>
>       ACPI_FUNCTION_NAME (NsDeleteNode);
> @@ -203,12 +204,13 @@ AcpiNsDeleteNode (
>       AcpiNsDetachObject (Node);
>
>       /*
> -     * Delete an attached data object if present (an object that was created
> -     * and attached via AcpiAttachData). Note: After any normal object is
> -     * detached above, the only possible remaining object is a data object.
> +     * Delete an attached data object list if present (objects that were
> +     * attached via AcpiAttachData). Note: After any normal object is
> +     * detached above, the only possible remaining object(s) are data
> +     * objects, in a linked list.
>        */
>       ObjDesc = Node->Object;
> -    if (ObjDesc &&
> +    while (ObjDesc &&
>           (ObjDesc->Common.Type == ACPI_TYPE_LOCAL_DATA))
>       {
>           /* Invoke the attached data deletion handler if present */
> @@ -218,7 +220,16 @@ AcpiNsDeleteNode (
>               ObjDesc->Data.Handler (Node, ObjDesc->Data.Pointer);
>           }
>
> +        NextDesc = ObjDesc->Common.NextObject;
>           AcpiUtRemoveReference (ObjDesc);
> +        ObjDesc = NextDesc;
> +    }
> +
> +    /* Special case for the statically allocated root node */
> +
> +    if (Node == AcpiGbl_RootNode)
> +    {
> +        return;
>       }
>
>       /* Now we can delete the node */
> diff --git a/src/acpica/source/components/namespace/nsutils.c b/src/acpica/source/components/namespace/nsutils.c
> index 1f5e188..f51fbf3 100644
> --- a/src/acpica/source/components/namespace/nsutils.c
> +++ b/src/acpica/source/components/namespace/nsutils.c
> @@ -765,27 +765,29 @@ void
>   AcpiNsTerminate (
>       void)
>   {
> -    ACPI_OPERAND_OBJECT     *ObjDesc;
> +    ACPI_STATUS             Status;
>
>
>       ACPI_FUNCTION_TRACE (NsTerminate);
>
>
>       /*
> -     * 1) Free the entire namespace -- all nodes and objects
> -     *
> -     * Delete all object descriptors attached to namepsace nodes
> +     * Free the entire namespace -- all nodes and all objects
> +     * attached to the nodes
>        */
>       AcpiNsDeleteNamespaceSubtree (AcpiGbl_RootNode);
>
> -    /* Detach any objects attached to the root */
> +    /* Delete any objects attached to the root node */
>
> -    ObjDesc = AcpiNsGetAttachedObject (AcpiGbl_RootNode);
> -    if (ObjDesc)
> +    Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
> +    if (ACPI_FAILURE (Status))
>       {
> -        AcpiNsDetachObject (AcpiGbl_RootNode);
> +        return_VOID;
>       }
>
> +    AcpiNsDeleteNode (AcpiGbl_RootNode);
> +    (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
> +
>       ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Namespace freed\n"));
>       return_VOID;
>   }
> diff --git a/src/acpica/source/components/resources/rscalc.c b/src/acpica/source/components/resources/rscalc.c
> index f8eced5..dd0df81 100644
> --- a/src/acpica/source/components/resources/rscalc.c
> +++ b/src/acpica/source/components/resources/rscalc.c
> @@ -269,6 +269,7 @@ AcpiRsStreamOptionLength (
>    * FUNCTION:    AcpiRsGetAmlLength
>    *
>    * PARAMETERS:  Resource            - Pointer to the resource linked list
> + *              ResourceListSize    - Size of the resource linked list
>    *              SizeNeeded          - Where the required size is returned
>    *
>    * RETURN:      Status
> @@ -282,9 +283,11 @@ AcpiRsStreamOptionLength (
>   ACPI_STATUS
>   AcpiRsGetAmlLength (
>       ACPI_RESOURCE           *Resource,
> +    ACPI_SIZE               ResourceListSize,
>       ACPI_SIZE               *SizeNeeded)
>   {
>       ACPI_SIZE               AmlSizeNeeded = 0;
> +    ACPI_RESOURCE           *ResourceEnd;
>       ACPI_RS_LENGTH          TotalSize;
>
>
> @@ -293,7 +296,8 @@ AcpiRsGetAmlLength (
>
>       /* Traverse entire list of internal resource descriptors */
>
> -    while (Resource)
> +    ResourceEnd = ACPI_ADD_PTR (ACPI_RESOURCE, Resource, ResourceListSize);
> +    while (Resource < ResourceEnd)
>       {
>           /* Validate the descriptor type */
>
> diff --git a/src/acpica/source/components/resources/rscreate.c b/src/acpica/source/components/resources/rscreate.c
> index 0e58aee..c73147a 100644
> --- a/src/acpica/source/components/resources/rscreate.c
> +++ b/src/acpica/source/components/resources/rscreate.c
> @@ -507,23 +507,22 @@ AcpiRsCreatePciRoutingTable (
>    *
>    * FUNCTION:    AcpiRsCreateAmlResources
>    *
> - * PARAMETERS:  LinkedListBuffer        - Pointer to the resource linked list
> - *              OutputBuffer            - Pointer to the user's buffer
> + * PARAMETERS:  ResourceList            - Pointer to the resource list buffer
> + *              OutputBuffer            - Where the AML buffer is returned
>    *
>    * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code.
>    *              If the OutputBuffer is too small, the error will be
>    *              AE_BUFFER_OVERFLOW and OutputBuffer->Length will point
>    *              to the size buffer needed.
>    *
> - * DESCRIPTION: Takes the linked list of device resources and
> - *              creates a bytestream to be used as input for the
> - *              _SRS control method.
> + * DESCRIPTION: Converts a list of device resources to an AML bytestream
> + *              to be used as input for the _SRS control method.
>    *
>    ******************************************************************************/
>
>   ACPI_STATUS
>   AcpiRsCreateAmlResources (
> -    ACPI_RESOURCE           *LinkedListBuffer,
> +    ACPI_BUFFER             *ResourceList,
>       ACPI_BUFFER             *OutputBuffer)
>   {
>       ACPI_STATUS             Status;
> @@ -533,17 +532,15 @@ AcpiRsCreateAmlResources (
>       ACPI_FUNCTION_TRACE (RsCreateAmlResources);
>
>
> -    ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "LinkedListBuffer = %p\n",
> -        LinkedListBuffer));
> +    /* Params already validated, no need to re-validate here */
>
> -    /*
> -     * Params already validated, so we don't re-validate here
> -     *
> -     * Pass the LinkedListBuffer into a module that calculates
> -     * the buffer size needed for the byte stream.
> -     */
> -    Status = AcpiRsGetAmlLength (LinkedListBuffer,
> -                &AmlSizeNeeded);
> +    ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "ResourceList Buffer = %p\n",
> +        ResourceList->Pointer));
> +
> +    /* Get the buffer size needed for the AML byte stream */
> +
> +    Status = AcpiRsGetAmlLength (ResourceList->Pointer,
> +                ResourceList->Length, &AmlSizeNeeded);
>
>       ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "AmlSizeNeeded=%X, %s\n",
>           (UINT32) AmlSizeNeeded, AcpiFormatException (Status)));
> @@ -562,14 +559,14 @@ AcpiRsCreateAmlResources (
>
>       /* Do the conversion */
>
> -    Status = AcpiRsConvertResourcesToAml (LinkedListBuffer, AmlSizeNeeded,
> -                    OutputBuffer->Pointer);
> +    Status = AcpiRsConvertResourcesToAml (ResourceList->Pointer,
> +                AmlSizeNeeded, OutputBuffer->Pointer);
>       if (ACPI_FAILURE (Status))
>       {
>           return_ACPI_STATUS (Status);
>       }
>
>       ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "OutputBuffer %p Length %X\n",
> -            OutputBuffer->Pointer, (UINT32) OutputBuffer->Length));
> +        OutputBuffer->Pointer, (UINT32) OutputBuffer->Length));
>       return_ACPI_STATUS (AE_OK);
>   }
> diff --git a/src/acpica/source/components/resources/rsutils.c b/src/acpica/source/components/resources/rsutils.c
> index bdc5ccf..ec692e2 100644
> --- a/src/acpica/source/components/resources/rsutils.c
> +++ b/src/acpica/source/components/resources/rsutils.c
> @@ -899,7 +899,7 @@ AcpiRsSetSrsMethodData (
>        * Convert the linked list into a byte stream
>        */
>       Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
> -    Status = AcpiRsCreateAmlResources (InBuffer->Pointer, &Buffer);
> +    Status = AcpiRsCreateAmlResources (InBuffer, &Buffer);
>       if (ACPI_FAILURE (Status))
>       {
>           goto Cleanup;
> diff --git a/src/acpica/source/components/utilities/utdebug.c b/src/acpica/source/components/utilities/utdebug.c
> index af904ac..0a57f76 100644
> --- a/src/acpica/source/components/utilities/utdebug.c
> +++ b/src/acpica/source/components/utilities/utdebug.c
> @@ -283,6 +283,7 @@ AcpiDebugPrint (
>           }
>
>           AcpiGbl_PrevThreadId = ThreadId;
> +        AcpiGbl_NestingLevel = 0;
>       }
>
>       /*
> @@ -291,13 +292,22 @@ AcpiDebugPrint (
>        */
>       AcpiOsPrintf ("%9s-%04ld ", ModuleName, LineNumber);
>
> +#ifdef ACPI_EXEC_APP
> +    /*
> +     * For AcpiExec only, emit the thread ID and nesting level.
> +     * Note: nesting level is really only useful during a single-thread
> +     * execution. Otherwise, multiple threads will keep resetting the
> +     * level.
> +     */
>       if (ACPI_LV_THREADS & AcpiDbgLevel)
>       {
>           AcpiOsPrintf ("[%u] ", (UINT32) ThreadId);
>       }
>
> -    AcpiOsPrintf ("[%02ld] %-22.22s: ",
> -        AcpiGbl_NestingLevel, AcpiUtTrimFunctionName (FunctionName));
> +    AcpiOsPrintf ("[%02ld] ", AcpiGbl_NestingLevel);
> +#endif
> +
> +    AcpiOsPrintf ("%-22.22s: ", AcpiUtTrimFunctionName (FunctionName));
>
>       va_start (args, Format);
>       AcpiOsVprintf (Format, args);
> @@ -547,7 +557,10 @@ AcpiUtExit (
>               "%s\n", AcpiGbl_FnExitStr);
>       }
>
> -    AcpiGbl_NestingLevel--;
> +    if (AcpiGbl_NestingLevel)
> +    {
> +        AcpiGbl_NestingLevel--;
> +    }
>   }
>
>   ACPI_EXPORT_SYMBOL (AcpiUtExit)
> @@ -599,7 +612,10 @@ AcpiUtStatusExit (
>           }
>       }
>
> -    AcpiGbl_NestingLevel--;
> +    if (AcpiGbl_NestingLevel)
> +    {
> +        AcpiGbl_NestingLevel--;
> +    }
>   }
>
>   ACPI_EXPORT_SYMBOL (AcpiUtStatusExit)
> @@ -641,7 +657,10 @@ AcpiUtValueExit (
>               ACPI_FORMAT_UINT64 (Value));
>       }
>
> -    AcpiGbl_NestingLevel--;
> +    if (AcpiGbl_NestingLevel)
> +    {
> +        AcpiGbl_NestingLevel--;
> +    }
>   }
>
>   ACPI_EXPORT_SYMBOL (AcpiUtValueExit)
> @@ -682,7 +701,10 @@ AcpiUtPtrExit (
>               "%s %p\n", AcpiGbl_FnExitStr, Ptr);
>       }
>
> -    AcpiGbl_NestingLevel--;
> +    if (AcpiGbl_NestingLevel)
> +    {
> +        AcpiGbl_NestingLevel--;
> +    }
>   }
>
>   #endif
> diff --git a/src/acpica/source/components/utilities/utxface.c b/src/acpica/source/components/utilities/utxface.c
> index 3b69560..51ab251 100644
> --- a/src/acpica/source/components/utilities/utxface.c
> +++ b/src/acpica/source/components/utilities/utxface.c
> @@ -115,6 +115,7 @@
>
>
>   #define __UTXFACE_C__
> +#define EXPORT_ACPI_INTERFACES
>
>   #include "acpi.h"
>   #include "accommon.h"
> diff --git a/src/acpica/source/components/utilities/utxfinit.c b/src/acpica/source/components/utilities/utxfinit.c
> index d69adbc..9ee0309 100644
> --- a/src/acpica/source/components/utilities/utxfinit.c
> +++ b/src/acpica/source/components/utilities/utxfinit.c
> @@ -115,6 +115,7 @@
>
>
>   #define __UTXFINIT_C__
> +#define EXPORT_ACPI_INTERFACES
>
>   #include "acpi.h"
>   #include "accommon.h"
> diff --git a/src/acpica/source/include/acconfig.h b/src/acpica/source/include/acconfig.h
> index b9bdab6..d1a3dce 100644
> --- a/src/acpica/source/include/acconfig.h
> +++ b/src/acpica/source/include/acconfig.h
> @@ -156,7 +156,9 @@
>    * Should the subsystem abort the loading of an ACPI table if the
>    * table checksum is incorrect?
>    */
> +#ifndef ACPI_CHECKSUM_ABORT
>   #define ACPI_CHECKSUM_ABORT             FALSE
> +#endif
>
>   /*
>    * Generate a version of ACPICA that only supports "reduced hardware"
> diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h
> index cbcf400..ea0ff78 100644
> --- a/src/acpica/source/include/acpixf.h
> +++ b/src/acpica/source/include/acpixf.h
> @@ -119,7 +119,7 @@
>
>   /* Current ACPICA subsystem version in YYYYMMDD format */
>
> -#define ACPI_CA_VERSION                 0x20130927
> +#define ACPI_CA_VERSION                 0x20131115
>
>   #include "acconfig.h"
>   #include "actypes.h"
> diff --git a/src/acpica/source/include/acresrc.h b/src/acpica/source/include/acresrc.h
> index 0c51c15..12e4451 100644
> --- a/src/acpica/source/include/acresrc.h
> +++ b/src/acpica/source/include/acresrc.h
> @@ -270,7 +270,7 @@ AcpiRsCreateResourceList (
>
>   ACPI_STATUS
>   AcpiRsCreateAmlResources (
> -    ACPI_RESOURCE           *LinkedListBuffer,
> +    ACPI_BUFFER             *ResourceList,
>       ACPI_BUFFER             *OutputBuffer);
>
>   ACPI_STATUS
> @@ -324,7 +324,8 @@ AcpiRsGetListLength (
>
>   ACPI_STATUS
>   AcpiRsGetAmlLength (
> -    ACPI_RESOURCE           *LinkedListBuffer,
> +    ACPI_RESOURCE           *ResourceList,
> +    ACPI_SIZE               ResourceListSize,
>       ACPI_SIZE               *SizeNeeded);
>
>   ACPI_STATUS
> diff --git a/src/acpica/source/include/platform/aclinux.h b/src/acpica/source/include/platform/aclinux.h
> index 15c1748..e806e59 100644
> --- a/src/acpica/source/include/platform/aclinux.h
> +++ b/src/acpica/source/include/platform/aclinux.h
> @@ -130,11 +130,13 @@
>   #include <linux/ctype.h>
>   #include <linux/sched.h>
>   #include <linux/atomic.h>
> -#include <asm/div64.h>
> -#include <asm/acpi.h>
> +#include <linux/math64.h>
>   #include <linux/slab.h>
>   #include <linux/spinlock_types.h>
> -#include <asm/current.h>
> +#ifdef EXPORT_ACPI_INTERFACES
> +#include <linux/export.h>
> +#endif
> +#include <asm/acpi.h>
>
>   /* Host-dependent types and defines for in-kernel ACPICA */
>
> @@ -157,7 +159,7 @@
>   /* Host-dependent types and defines for user-space ACPICA */
>
>   #define ACPI_FLUSH_CPU_CACHE()
> -#define ACPI_CAST_PTHREAD_T(pthread) ((ACPI_THREAD_ID) (pthread))
> +#define ACPI_CAST_PTHREAD_T(Pthread) ((ACPI_THREAD_ID) (Pthread))
>
>   #if defined(__ia64__) || defined(__x86_64__) || defined(__aarch64__)
>   #define ACPI_MACHINE_WIDTH          64
> @@ -182,24 +184,31 @@
>
>
>   #ifdef __KERNEL__
> +
> +/*
> + * FIXME: Inclusion of actypes.h
> + * Linux kernel need this before defining inline OSL interfaces as
> + * actypes.h need to be included to find ACPICA type definitions.
> + * Since from ACPICA's perspective, the actypes.h should be included after
> + * acenv.h (aclinux.h), this leads to a inclusion mis-ordering issue.
> + */
>   #include <acpi/actypes.h>
>
> +/*
> + * Overrides for in-kernel ACPICA
> + */
>   ACPI_STATUS __init AcpiOsInitialize (
>       void);
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsInitialize
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsInitialize
>
> -ACPI_STATUS __exit AcpiOsTerminate (
> +ACPI_STATUS AcpiOsTerminate (
>       void);
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsTerminate
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsTerminate
>
>   /*
>    * Memory allocation/deallocation
>    */
>
> -/* Use native linux version of acpi_os_allocate_zeroed */
> -
> -#define USE_NATIVE_ALLOCATE_ZEROED
> -
>   /*
>    * The irqs_disabled() check is for resume from RAM.
>    * Interrupts are off during resume, just like they are for boot.
> @@ -212,7 +221,9 @@ AcpiOsAllocate (
>   {
>       return kmalloc (Size, irqs_disabled () ? GFP_ATOMIC : GFP_KERNEL);
>   }
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsAllocate
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsAllocate
> +
> +/* Use native linux version of AcpiOsAllocateZeroed */
>
>   static inline void *
>   AcpiOsAllocateZeroed (
> @@ -220,7 +231,8 @@ AcpiOsAllocateZeroed (
>   {
>       return kzalloc (Size, irqs_disabled () ? GFP_ATOMIC : GFP_KERNEL);
>   }
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsAllocateZeroed
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsAllocateZeroed
> +#define USE_NATIVE_ALLOCATE_ZEROED
>
>   static inline void
>   AcpiOsFree (
> @@ -228,7 +240,7 @@ AcpiOsFree (
>   {
>       kfree (Memory);
>   }
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsFree
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsFree
>
>   static inline void *
>   AcpiOsAcquireObject (
> @@ -237,20 +249,18 @@ AcpiOsAcquireObject (
>       return kmem_cache_zalloc (Cache,
>           irqs_disabled () ? GFP_ATOMIC : GFP_KERNEL);
>   }
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsAcquireObject
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsAcquireObject
>
> -/*
> - * Overrides for in-kernel ACPICA
> - */
>   static inline ACPI_THREAD_ID
>   AcpiOsGetThreadId (
>       void)
>   {
>       return (ACPI_THREAD_ID) (unsigned long) current;
>   }
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsGetThreadId
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetThreadId
>
>   #ifndef CONFIG_PREEMPT
> +
>   /*
>    * Used within ACPICA to show where it is safe to preempt execution
>    * when CONFIG_PREEMPT=n
> @@ -260,6 +270,7 @@ AcpiOsGetThreadId (
>           if (!irqs_disabled()) \
>               cond_resched(); \
>       } while (0)
> +
>   #endif
>
>   /*
> @@ -270,47 +281,66 @@ AcpiOsGetThreadId (
>    * prevents lockdep from reporting false positives for ACPICA locks.
>    */
>   #define AcpiOsCreateLock(__Handle) \
> -({ \
> -    spinlock_t *Lock = ACPI_ALLOCATE(sizeof(*Lock)); \
> -    if (Lock) { \
> -        *(__Handle) = Lock; \
> -        spin_lock_init(*(__Handle)); \
> -    } \
> -    Lock ? AE_OK : AE_NO_MEMORY; \
> -})
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsCreateLock
> +    ({ \
> +        spinlock_t *Lock = ACPI_ALLOCATE(sizeof(*Lock)); \
> +        if (Lock) { \
> +            *(__Handle) = Lock; \
> +            spin_lock_init(*(__Handle)); \
> +        } \
> +        Lock ? AE_OK : AE_NO_MEMORY; \
> +    })
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsCreateLock
>
>   void __iomem *
>   AcpiOsMapMemory (
>       ACPI_PHYSICAL_ADDRESS   Where,
>       ACPI_SIZE               Length);
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsMapMemory
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsMapMemory
>
>   void
>   AcpiOsUnmapMemory (
>       void __iomem            *LogicalAddress,
>       ACPI_SIZE               Size);
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsUnmapMemory
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsUnmapMemory
> +
> +/*
> + * OSL interfaces used by debugger/disassembler
> + */
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsReadable
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsWritable
> +
> +/*
> + * OSL interfaces used by utilities
> + */
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsRedirectOutput
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetLine
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetTableByName
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetTableByIndex
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetTableByAddress
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsOpenDirectory
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetNextFilename
> +#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsCloseDirectory
>
> -/* OSL interfaces used by debugger/disassembler */
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsReadable
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsWritable
> +/*
> + * OSL interfaces added by Linux
> + */
> +void
> +EarlyAcpiOsUnmapMemory (
> +    void __iomem            *Virt,
> +    ACPI_SIZE               Size);
>
> -/* OSL interfaces used by utilities */
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsRedirectOutput
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsGetLine
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsGetTableByName
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsGetTableByIndex
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsGetTableByAddress
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsOpenDirectory
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsGetNextFilename
> -#define ACPI_USE_NATIVE_DECLARED_AcpiOsCloseDirectory
> +void
> +AcpiOsGpeCount (
> +    UINT32                  GpeNumber);
>
> -/* OSL interfaces added by Linux */
> +void
> +AcpiOsFixedEventCount (
> +    UINT32                  FixedEventNumber);
>
> -#ifdef EXPORT_ACPI_INTERFACES
> -#include <linux/export.h>
> -#endif
> +ACPI_STATUS
> +AcpiOsHotplugExecute (
> +    ACPI_OSD_EXEC_CALLBACK  Function,
> +    void                    *Context);
>
>   #endif /* __KERNEL__ */
>
> diff --git a/src/acpica/source/os_specific/service_layers/osunixxf.c b/src/acpica/source/os_specific/service_layers/osunixxf.c
> index 7aa4168..ad003c1 100644
> --- a/src/acpica/source/os_specific/service_layers/osunixxf.c
> +++ b/src/acpica/source/os_specific/service_layers/osunixxf.c
> @@ -163,7 +163,7 @@ typedef void* (*PTHREAD_CALLBACK) (void *);
>   /* Terminal support for AcpiExec only */
>
>   #ifdef ACPI_EXEC_APP
> -#include <termio.h>
> +#include <termios.h>
>
>   struct termios              OriginalTermAttributes;
>
> diff --git a/src/acpica/source/tools/acpiexec/aehandlers.c b/src/acpica/source/tools/acpiexec/aehandlers.c
> index f0cc8ba..294abea 100644
> --- a/src/acpica/source/tools/acpiexec/aehandlers.c
> +++ b/src/acpica/source/tools/acpiexec/aehandlers.c
> @@ -170,6 +170,11 @@ AeAttachedDataHandler (
>       ACPI_HANDLE             Object,
>       void                    *Data);
>
> +static void
> +AeAttachedDataHandler2 (
> +    ACPI_HANDLE             Object,
> +    void                    *Data);
> +
>   static UINT32
>   AeInterfaceHandler (
>       ACPI_STRING             InterfaceName,
> @@ -677,7 +682,29 @@ AeAttachedDataHandler (
>       ACPI_NAMESPACE_NODE     *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Data);
>
>
> -    AcpiOsPrintf ("Received an attached data deletion on %4.4s\n",
> +    AcpiOsPrintf ("Received an attached data deletion (1) on %4.4s\n",
> +        Node->Name.Ascii);
> +}
> +
> +
> +/******************************************************************************
> + *
> + * FUNCTION:    AeAttachedDataHandler2
> + *
> + * DESCRIPTION: Handler for deletion of nodes with attached data (attached via
> + *              AcpiAttachData)
> + *
> + *****************************************************************************/
> +
> +static void
> +AeAttachedDataHandler2 (
> +    ACPI_HANDLE             Object,
> +    void                    *Data)
> +{
> +    ACPI_NAMESPACE_NODE     *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Data);
> +
> +
> +    AcpiOsPrintf ("Received an attached data deletion (2) on %4.4s\n",
>           Node->Name.Ascii);
>   }
>
> @@ -1094,8 +1121,23 @@ AeInstallEarlyHandlers (
>           Status = AcpiDetachData (Handle, AeAttachedDataHandler);
>           AE_CHECK_OK (AcpiDetachData, Status);
>
> +        /* Test attach data at the root object */
> +
> +        Status = AcpiAttachData (ACPI_ROOT_OBJECT, AeAttachedDataHandler,
> +            AcpiGbl_RootNode);
> +        AE_CHECK_OK (AcpiAttachData, Status);
> +
> +        Status = AcpiAttachData (ACPI_ROOT_OBJECT, AeAttachedDataHandler2,
> +            AcpiGbl_RootNode);
> +        AE_CHECK_OK (AcpiAttachData, Status);
> +
> +        /* Test support for multiple attaches */
> +
>           Status = AcpiAttachData (Handle, AeAttachedDataHandler, Handle);
>           AE_CHECK_OK (AcpiAttachData, Status);
> +
> +        Status = AcpiAttachData (Handle, AeAttachedDataHandler2, Handle);
> +        AE_CHECK_OK (AcpiAttachData, Status);
>       }
>       else
>       {
>


Acked-by: Ivan Hu <ivan.hu@canonical.com>
diff mbox

Patch

diff --git a/src/acpica/source/common/adfile.c b/src/acpica/source/common/adfile.c
index 57cb580..d598ac8 100644
--- a/src/acpica/source/common/adfile.c
+++ b/src/acpica/source/common/adfile.c
@@ -401,7 +401,7 @@  FlSplitInputPathname (
 
     if (!Filename)
     {
-        ACPI_FREE(DirectoryPath);
+        ACPI_FREE (DirectoryPath);
         return (AE_NO_MEMORY);
     }
 
@@ -410,10 +410,9 @@  FlSplitInputPathname (
     if (OutFilename)
     {
         *OutFilename = Filename;
+        return (AE_OK);
     }
-    else
-    {
-        ACPI_FREE(Filename);
-    }
+
+    ACPI_FREE (Filename);
     return (AE_OK);
 }
diff --git a/src/acpica/source/common/adwalk.c b/src/acpica/source/common/adwalk.c
index 76ef5df..2d380f4 100644
--- a/src/acpica/source/common/adwalk.c
+++ b/src/acpica/source/common/adwalk.c
@@ -892,17 +892,18 @@  AcpiDmXrefDescendingOp (
     {
         if (Status == AE_NOT_FOUND)
         {
-            AcpiDmAddToExternalList (Op, Path, (UINT8) ObjectType, 0);
-
             /*
-             * We could install this into the namespace, but we catch duplicate
-             * externals when they are added to the list.
+             * Add this symbol as an external declaration, except if the
+             * parent is a CondRefOf operator. For this operator, we do not
+             * need an external, nor do we want one, since this can cause
+             * disassembly problems if the symbol is actually a control
+             * method.
              */
-#if 0
-            Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY,
-                       ACPI_IMODE_LOAD_PASS1, ACPI_NS_DONT_OPEN_SCOPE,
-                       WalkState, &Node);
-#endif
+            if (!(Op->Asl.Parent &&
+                (Op->Asl.Parent->Asl.AmlOpcode == AML_COND_REF_OF_OP)))
+            {
+                AcpiDmAddToExternalList (Op, Path, (UINT8) ObjectType, 0);
+            }
         }
     }
 
diff --git a/src/acpica/source/components/debugger/dbcmds.c b/src/acpica/source/components/debugger/dbcmds.c
index aa3f89b..bed0f55 100644
--- a/src/acpica/source/components/debugger/dbcmds.c
+++ b/src/acpica/source/components/debugger/dbcmds.c
@@ -902,7 +902,7 @@  AcpiDmTestResourceConversion (
 
     /* Convert internal resource list to external AML resource template */
 
-    Status = AcpiRsCreateAmlResources (ResourceBuffer.Pointer, &NewAml);
+    Status = AcpiRsCreateAmlResources (&ResourceBuffer, &NewAml);
     if (ACPI_FAILURE (Status))
     {
         AcpiOsPrintf ("AcpiRsCreateAmlResources failed: %s\n",
@@ -914,8 +914,8 @@  AcpiDmTestResourceConversion (
 
     OriginalAml = ReturnBuffer.Pointer;
 
-    AcpiDmCompareAmlResources (
-        OriginalAml->Buffer.Pointer, (ACPI_RSDESC_SIZE) OriginalAml->Buffer.Length,
+    AcpiDmCompareAmlResources (OriginalAml->Buffer.Pointer,
+        (ACPI_RSDESC_SIZE) OriginalAml->Buffer.Length,
         NewAml.Pointer, (ACPI_RSDESC_SIZE) NewAml.Length);
 
     /* Cleanup and exit */
@@ -1114,7 +1114,7 @@  GetCrs:
         }
 
 EndCrs:
-        ACPI_FREE_BUFFER (ReturnBuffer);
+        ACPI_FREE (ReturnBuffer.Pointer);
     }
 
 
diff --git a/src/acpica/source/components/namespace/nsalloc.c b/src/acpica/source/components/namespace/nsalloc.c
index cbb644f..8efa313 100644
--- a/src/acpica/source/components/namespace/nsalloc.c
+++ b/src/acpica/source/components/namespace/nsalloc.c
@@ -193,6 +193,7 @@  AcpiNsDeleteNode (
     ACPI_NAMESPACE_NODE     *Node)
 {
     ACPI_OPERAND_OBJECT     *ObjDesc;
+    ACPI_OPERAND_OBJECT     *NextDesc;
 
 
     ACPI_FUNCTION_NAME (NsDeleteNode);
@@ -203,12 +204,13 @@  AcpiNsDeleteNode (
     AcpiNsDetachObject (Node);
 
     /*
-     * Delete an attached data object if present (an object that was created
-     * and attached via AcpiAttachData). Note: After any normal object is
-     * detached above, the only possible remaining object is a data object.
+     * Delete an attached data object list if present (objects that were
+     * attached via AcpiAttachData). Note: After any normal object is
+     * detached above, the only possible remaining object(s) are data
+     * objects, in a linked list.
      */
     ObjDesc = Node->Object;
-    if (ObjDesc &&
+    while (ObjDesc &&
         (ObjDesc->Common.Type == ACPI_TYPE_LOCAL_DATA))
     {
         /* Invoke the attached data deletion handler if present */
@@ -218,7 +220,16 @@  AcpiNsDeleteNode (
             ObjDesc->Data.Handler (Node, ObjDesc->Data.Pointer);
         }
 
+        NextDesc = ObjDesc->Common.NextObject;
         AcpiUtRemoveReference (ObjDesc);
+        ObjDesc = NextDesc;
+    }
+
+    /* Special case for the statically allocated root node */
+
+    if (Node == AcpiGbl_RootNode)
+    {
+        return;
     }
 
     /* Now we can delete the node */
diff --git a/src/acpica/source/components/namespace/nsutils.c b/src/acpica/source/components/namespace/nsutils.c
index 1f5e188..f51fbf3 100644
--- a/src/acpica/source/components/namespace/nsutils.c
+++ b/src/acpica/source/components/namespace/nsutils.c
@@ -765,27 +765,29 @@  void
 AcpiNsTerminate (
     void)
 {
-    ACPI_OPERAND_OBJECT     *ObjDesc;
+    ACPI_STATUS             Status;
 
 
     ACPI_FUNCTION_TRACE (NsTerminate);
 
 
     /*
-     * 1) Free the entire namespace -- all nodes and objects
-     *
-     * Delete all object descriptors attached to namepsace nodes
+     * Free the entire namespace -- all nodes and all objects
+     * attached to the nodes
      */
     AcpiNsDeleteNamespaceSubtree (AcpiGbl_RootNode);
 
-    /* Detach any objects attached to the root */
+    /* Delete any objects attached to the root node */
 
-    ObjDesc = AcpiNsGetAttachedObject (AcpiGbl_RootNode);
-    if (ObjDesc)
+    Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
+    if (ACPI_FAILURE (Status))
     {
-        AcpiNsDetachObject (AcpiGbl_RootNode);
+        return_VOID;
     }
 
+    AcpiNsDeleteNode (AcpiGbl_RootNode);
+    (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
+
     ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Namespace freed\n"));
     return_VOID;
 }
diff --git a/src/acpica/source/components/resources/rscalc.c b/src/acpica/source/components/resources/rscalc.c
index f8eced5..dd0df81 100644
--- a/src/acpica/source/components/resources/rscalc.c
+++ b/src/acpica/source/components/resources/rscalc.c
@@ -269,6 +269,7 @@  AcpiRsStreamOptionLength (
  * FUNCTION:    AcpiRsGetAmlLength
  *
  * PARAMETERS:  Resource            - Pointer to the resource linked list
+ *              ResourceListSize    - Size of the resource linked list
  *              SizeNeeded          - Where the required size is returned
  *
  * RETURN:      Status
@@ -282,9 +283,11 @@  AcpiRsStreamOptionLength (
 ACPI_STATUS
 AcpiRsGetAmlLength (
     ACPI_RESOURCE           *Resource,
+    ACPI_SIZE               ResourceListSize,
     ACPI_SIZE               *SizeNeeded)
 {
     ACPI_SIZE               AmlSizeNeeded = 0;
+    ACPI_RESOURCE           *ResourceEnd;
     ACPI_RS_LENGTH          TotalSize;
 
 
@@ -293,7 +296,8 @@  AcpiRsGetAmlLength (
 
     /* Traverse entire list of internal resource descriptors */
 
-    while (Resource)
+    ResourceEnd = ACPI_ADD_PTR (ACPI_RESOURCE, Resource, ResourceListSize);
+    while (Resource < ResourceEnd)
     {
         /* Validate the descriptor type */
 
diff --git a/src/acpica/source/components/resources/rscreate.c b/src/acpica/source/components/resources/rscreate.c
index 0e58aee..c73147a 100644
--- a/src/acpica/source/components/resources/rscreate.c
+++ b/src/acpica/source/components/resources/rscreate.c
@@ -507,23 +507,22 @@  AcpiRsCreatePciRoutingTable (
  *
  * FUNCTION:    AcpiRsCreateAmlResources
  *
- * PARAMETERS:  LinkedListBuffer        - Pointer to the resource linked list
- *              OutputBuffer            - Pointer to the user's buffer
+ * PARAMETERS:  ResourceList            - Pointer to the resource list buffer
+ *              OutputBuffer            - Where the AML buffer is returned
  *
  * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code.
  *              If the OutputBuffer is too small, the error will be
  *              AE_BUFFER_OVERFLOW and OutputBuffer->Length will point
  *              to the size buffer needed.
  *
- * DESCRIPTION: Takes the linked list of device resources and
- *              creates a bytestream to be used as input for the
- *              _SRS control method.
+ * DESCRIPTION: Converts a list of device resources to an AML bytestream
+ *              to be used as input for the _SRS control method.
  *
  ******************************************************************************/
 
 ACPI_STATUS
 AcpiRsCreateAmlResources (
-    ACPI_RESOURCE           *LinkedListBuffer,
+    ACPI_BUFFER             *ResourceList,
     ACPI_BUFFER             *OutputBuffer)
 {
     ACPI_STATUS             Status;
@@ -533,17 +532,15 @@  AcpiRsCreateAmlResources (
     ACPI_FUNCTION_TRACE (RsCreateAmlResources);
 
 
-    ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "LinkedListBuffer = %p\n",
-        LinkedListBuffer));
+    /* Params already validated, no need to re-validate here */
 
-    /*
-     * Params already validated, so we don't re-validate here
-     *
-     * Pass the LinkedListBuffer into a module that calculates
-     * the buffer size needed for the byte stream.
-     */
-    Status = AcpiRsGetAmlLength (LinkedListBuffer,
-                &AmlSizeNeeded);
+    ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "ResourceList Buffer = %p\n",
+        ResourceList->Pointer));
+
+    /* Get the buffer size needed for the AML byte stream */
+
+    Status = AcpiRsGetAmlLength (ResourceList->Pointer,
+                ResourceList->Length, &AmlSizeNeeded);
 
     ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "AmlSizeNeeded=%X, %s\n",
         (UINT32) AmlSizeNeeded, AcpiFormatException (Status)));
@@ -562,14 +559,14 @@  AcpiRsCreateAmlResources (
 
     /* Do the conversion */
 
-    Status = AcpiRsConvertResourcesToAml (LinkedListBuffer, AmlSizeNeeded,
-                    OutputBuffer->Pointer);
+    Status = AcpiRsConvertResourcesToAml (ResourceList->Pointer,
+                AmlSizeNeeded, OutputBuffer->Pointer);
     if (ACPI_FAILURE (Status))
     {
         return_ACPI_STATUS (Status);
     }
 
     ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "OutputBuffer %p Length %X\n",
-            OutputBuffer->Pointer, (UINT32) OutputBuffer->Length));
+        OutputBuffer->Pointer, (UINT32) OutputBuffer->Length));
     return_ACPI_STATUS (AE_OK);
 }
diff --git a/src/acpica/source/components/resources/rsutils.c b/src/acpica/source/components/resources/rsutils.c
index bdc5ccf..ec692e2 100644
--- a/src/acpica/source/components/resources/rsutils.c
+++ b/src/acpica/source/components/resources/rsutils.c
@@ -899,7 +899,7 @@  AcpiRsSetSrsMethodData (
      * Convert the linked list into a byte stream
      */
     Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
-    Status = AcpiRsCreateAmlResources (InBuffer->Pointer, &Buffer);
+    Status = AcpiRsCreateAmlResources (InBuffer, &Buffer);
     if (ACPI_FAILURE (Status))
     {
         goto Cleanup;
diff --git a/src/acpica/source/components/utilities/utdebug.c b/src/acpica/source/components/utilities/utdebug.c
index af904ac..0a57f76 100644
--- a/src/acpica/source/components/utilities/utdebug.c
+++ b/src/acpica/source/components/utilities/utdebug.c
@@ -283,6 +283,7 @@  AcpiDebugPrint (
         }
 
         AcpiGbl_PrevThreadId = ThreadId;
+        AcpiGbl_NestingLevel = 0;
     }
 
     /*
@@ -291,13 +292,22 @@  AcpiDebugPrint (
      */
     AcpiOsPrintf ("%9s-%04ld ", ModuleName, LineNumber);
 
+#ifdef ACPI_EXEC_APP
+    /*
+     * For AcpiExec only, emit the thread ID and nesting level.
+     * Note: nesting level is really only useful during a single-thread
+     * execution. Otherwise, multiple threads will keep resetting the
+     * level.
+     */
     if (ACPI_LV_THREADS & AcpiDbgLevel)
     {
         AcpiOsPrintf ("[%u] ", (UINT32) ThreadId);
     }
 
-    AcpiOsPrintf ("[%02ld] %-22.22s: ",
-        AcpiGbl_NestingLevel, AcpiUtTrimFunctionName (FunctionName));
+    AcpiOsPrintf ("[%02ld] ", AcpiGbl_NestingLevel);
+#endif
+
+    AcpiOsPrintf ("%-22.22s: ", AcpiUtTrimFunctionName (FunctionName));
 
     va_start (args, Format);
     AcpiOsVprintf (Format, args);
@@ -547,7 +557,10 @@  AcpiUtExit (
             "%s\n", AcpiGbl_FnExitStr);
     }
 
-    AcpiGbl_NestingLevel--;
+    if (AcpiGbl_NestingLevel)
+    {
+        AcpiGbl_NestingLevel--;
+    }
 }
 
 ACPI_EXPORT_SYMBOL (AcpiUtExit)
@@ -599,7 +612,10 @@  AcpiUtStatusExit (
         }
     }
 
-    AcpiGbl_NestingLevel--;
+    if (AcpiGbl_NestingLevel)
+    {
+        AcpiGbl_NestingLevel--;
+    }
 }
 
 ACPI_EXPORT_SYMBOL (AcpiUtStatusExit)
@@ -641,7 +657,10 @@  AcpiUtValueExit (
             ACPI_FORMAT_UINT64 (Value));
     }
 
-    AcpiGbl_NestingLevel--;
+    if (AcpiGbl_NestingLevel)
+    {
+        AcpiGbl_NestingLevel--;
+    }
 }
 
 ACPI_EXPORT_SYMBOL (AcpiUtValueExit)
@@ -682,7 +701,10 @@  AcpiUtPtrExit (
             "%s %p\n", AcpiGbl_FnExitStr, Ptr);
     }
 
-    AcpiGbl_NestingLevel--;
+    if (AcpiGbl_NestingLevel)
+    {
+        AcpiGbl_NestingLevel--;
+    }
 }
 
 #endif
diff --git a/src/acpica/source/components/utilities/utxface.c b/src/acpica/source/components/utilities/utxface.c
index 3b69560..51ab251 100644
--- a/src/acpica/source/components/utilities/utxface.c
+++ b/src/acpica/source/components/utilities/utxface.c
@@ -115,6 +115,7 @@ 
 
 
 #define __UTXFACE_C__
+#define EXPORT_ACPI_INTERFACES
 
 #include "acpi.h"
 #include "accommon.h"
diff --git a/src/acpica/source/components/utilities/utxfinit.c b/src/acpica/source/components/utilities/utxfinit.c
index d69adbc..9ee0309 100644
--- a/src/acpica/source/components/utilities/utxfinit.c
+++ b/src/acpica/source/components/utilities/utxfinit.c
@@ -115,6 +115,7 @@ 
 
 
 #define __UTXFINIT_C__
+#define EXPORT_ACPI_INTERFACES
 
 #include "acpi.h"
 #include "accommon.h"
diff --git a/src/acpica/source/include/acconfig.h b/src/acpica/source/include/acconfig.h
index b9bdab6..d1a3dce 100644
--- a/src/acpica/source/include/acconfig.h
+++ b/src/acpica/source/include/acconfig.h
@@ -156,7 +156,9 @@ 
  * Should the subsystem abort the loading of an ACPI table if the
  * table checksum is incorrect?
  */
+#ifndef ACPI_CHECKSUM_ABORT
 #define ACPI_CHECKSUM_ABORT             FALSE
+#endif
 
 /*
  * Generate a version of ACPICA that only supports "reduced hardware"
diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h
index cbcf400..ea0ff78 100644
--- a/src/acpica/source/include/acpixf.h
+++ b/src/acpica/source/include/acpixf.h
@@ -119,7 +119,7 @@ 
 
 /* Current ACPICA subsystem version in YYYYMMDD format */
 
-#define ACPI_CA_VERSION                 0x20130927
+#define ACPI_CA_VERSION                 0x20131115
 
 #include "acconfig.h"
 #include "actypes.h"
diff --git a/src/acpica/source/include/acresrc.h b/src/acpica/source/include/acresrc.h
index 0c51c15..12e4451 100644
--- a/src/acpica/source/include/acresrc.h
+++ b/src/acpica/source/include/acresrc.h
@@ -270,7 +270,7 @@  AcpiRsCreateResourceList (
 
 ACPI_STATUS
 AcpiRsCreateAmlResources (
-    ACPI_RESOURCE           *LinkedListBuffer,
+    ACPI_BUFFER             *ResourceList,
     ACPI_BUFFER             *OutputBuffer);
 
 ACPI_STATUS
@@ -324,7 +324,8 @@  AcpiRsGetListLength (
 
 ACPI_STATUS
 AcpiRsGetAmlLength (
-    ACPI_RESOURCE           *LinkedListBuffer,
+    ACPI_RESOURCE           *ResourceList,
+    ACPI_SIZE               ResourceListSize,
     ACPI_SIZE               *SizeNeeded);
 
 ACPI_STATUS
diff --git a/src/acpica/source/include/platform/aclinux.h b/src/acpica/source/include/platform/aclinux.h
index 15c1748..e806e59 100644
--- a/src/acpica/source/include/platform/aclinux.h
+++ b/src/acpica/source/include/platform/aclinux.h
@@ -130,11 +130,13 @@ 
 #include <linux/ctype.h>
 #include <linux/sched.h>
 #include <linux/atomic.h>
-#include <asm/div64.h>
-#include <asm/acpi.h>
+#include <linux/math64.h>
 #include <linux/slab.h>
 #include <linux/spinlock_types.h>
-#include <asm/current.h>
+#ifdef EXPORT_ACPI_INTERFACES
+#include <linux/export.h>
+#endif
+#include <asm/acpi.h>
 
 /* Host-dependent types and defines for in-kernel ACPICA */
 
@@ -157,7 +159,7 @@ 
 /* Host-dependent types and defines for user-space ACPICA */
 
 #define ACPI_FLUSH_CPU_CACHE()
-#define ACPI_CAST_PTHREAD_T(pthread) ((ACPI_THREAD_ID) (pthread))
+#define ACPI_CAST_PTHREAD_T(Pthread) ((ACPI_THREAD_ID) (Pthread))
 
 #if defined(__ia64__) || defined(__x86_64__) || defined(__aarch64__)
 #define ACPI_MACHINE_WIDTH          64
@@ -182,24 +184,31 @@ 
 
 
 #ifdef __KERNEL__
+
+/*
+ * FIXME: Inclusion of actypes.h
+ * Linux kernel need this before defining inline OSL interfaces as
+ * actypes.h need to be included to find ACPICA type definitions.
+ * Since from ACPICA's perspective, the actypes.h should be included after
+ * acenv.h (aclinux.h), this leads to a inclusion mis-ordering issue.
+ */
 #include <acpi/actypes.h>
 
+/*
+ * Overrides for in-kernel ACPICA
+ */
 ACPI_STATUS __init AcpiOsInitialize (
     void);
-#define ACPI_USE_NATIVE_DECLARED_AcpiOsInitialize
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsInitialize
 
-ACPI_STATUS __exit AcpiOsTerminate (
+ACPI_STATUS AcpiOsTerminate (
     void);
-#define ACPI_USE_NATIVE_DECLARED_AcpiOsTerminate
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsTerminate
 
 /*
  * Memory allocation/deallocation
  */
 
-/* Use native linux version of acpi_os_allocate_zeroed */
-
-#define USE_NATIVE_ALLOCATE_ZEROED
-
 /*
  * The irqs_disabled() check is for resume from RAM.
  * Interrupts are off during resume, just like they are for boot.
@@ -212,7 +221,9 @@  AcpiOsAllocate (
 {
     return kmalloc (Size, irqs_disabled () ? GFP_ATOMIC : GFP_KERNEL);
 }
-#define ACPI_USE_NATIVE_DECLARED_AcpiOsAllocate
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsAllocate
+
+/* Use native linux version of AcpiOsAllocateZeroed */
 
 static inline void *
 AcpiOsAllocateZeroed (
@@ -220,7 +231,8 @@  AcpiOsAllocateZeroed (
 {
     return kzalloc (Size, irqs_disabled () ? GFP_ATOMIC : GFP_KERNEL);
 }
-#define ACPI_USE_NATIVE_DECLARED_AcpiOsAllocateZeroed
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsAllocateZeroed
+#define USE_NATIVE_ALLOCATE_ZEROED
 
 static inline void
 AcpiOsFree (
@@ -228,7 +240,7 @@  AcpiOsFree (
 {
     kfree (Memory);
 }
-#define ACPI_USE_NATIVE_DECLARED_AcpiOsFree
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsFree
 
 static inline void *
 AcpiOsAcquireObject (
@@ -237,20 +249,18 @@  AcpiOsAcquireObject (
     return kmem_cache_zalloc (Cache,
         irqs_disabled () ? GFP_ATOMIC : GFP_KERNEL);
 }
-#define ACPI_USE_NATIVE_DECLARED_AcpiOsAcquireObject
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsAcquireObject
 
-/*
- * Overrides for in-kernel ACPICA
- */
 static inline ACPI_THREAD_ID
 AcpiOsGetThreadId (
     void)
 {
     return (ACPI_THREAD_ID) (unsigned long) current;
 }
-#define ACPI_USE_NATIVE_DECLARED_AcpiOsGetThreadId
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetThreadId
 
 #ifndef CONFIG_PREEMPT
+
 /*
  * Used within ACPICA to show where it is safe to preempt execution
  * when CONFIG_PREEMPT=n
@@ -260,6 +270,7 @@  AcpiOsGetThreadId (
         if (!irqs_disabled()) \
             cond_resched(); \
     } while (0)
+
 #endif
 
 /*
@@ -270,47 +281,66 @@  AcpiOsGetThreadId (
  * prevents lockdep from reporting false positives for ACPICA locks.
  */
 #define AcpiOsCreateLock(__Handle) \
-({ \
-    spinlock_t *Lock = ACPI_ALLOCATE(sizeof(*Lock)); \
-    if (Lock) { \
-        *(__Handle) = Lock; \
-        spin_lock_init(*(__Handle)); \
-    } \
-    Lock ? AE_OK : AE_NO_MEMORY; \
-})
-#define ACPI_USE_NATIVE_DECLARED_AcpiOsCreateLock
+    ({ \
+        spinlock_t *Lock = ACPI_ALLOCATE(sizeof(*Lock)); \
+        if (Lock) { \
+            *(__Handle) = Lock; \
+            spin_lock_init(*(__Handle)); \
+        } \
+        Lock ? AE_OK : AE_NO_MEMORY; \
+    })
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsCreateLock
 
 void __iomem *
 AcpiOsMapMemory (
     ACPI_PHYSICAL_ADDRESS   Where,
     ACPI_SIZE               Length);
-#define ACPI_USE_NATIVE_DECLARED_AcpiOsMapMemory
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsMapMemory
 
 void
 AcpiOsUnmapMemory (
     void __iomem            *LogicalAddress,
     ACPI_SIZE               Size);
-#define ACPI_USE_NATIVE_DECLARED_AcpiOsUnmapMemory
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsUnmapMemory
+
+/*
+ * OSL interfaces used by debugger/disassembler
+ */
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsReadable
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsWritable
+
+/*
+ * OSL interfaces used by utilities
+ */
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsRedirectOutput
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetLine
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetTableByName
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetTableByIndex
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetTableByAddress
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsOpenDirectory
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetNextFilename
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsCloseDirectory
 
-/* OSL interfaces used by debugger/disassembler */
-#define ACPI_USE_NATIVE_DECLARED_AcpiOsReadable
-#define ACPI_USE_NATIVE_DECLARED_AcpiOsWritable
+/*
+ * OSL interfaces added by Linux
+ */
+void
+EarlyAcpiOsUnmapMemory (
+    void __iomem            *Virt,
+    ACPI_SIZE               Size);
 
-/* OSL interfaces used by utilities */
-#define ACPI_USE_NATIVE_DECLARED_AcpiOsRedirectOutput
-#define ACPI_USE_NATIVE_DECLARED_AcpiOsGetLine
-#define ACPI_USE_NATIVE_DECLARED_AcpiOsGetTableByName
-#define ACPI_USE_NATIVE_DECLARED_AcpiOsGetTableByIndex
-#define ACPI_USE_NATIVE_DECLARED_AcpiOsGetTableByAddress
-#define ACPI_USE_NATIVE_DECLARED_AcpiOsOpenDirectory
-#define ACPI_USE_NATIVE_DECLARED_AcpiOsGetNextFilename
-#define ACPI_USE_NATIVE_DECLARED_AcpiOsCloseDirectory
+void
+AcpiOsGpeCount (
+    UINT32                  GpeNumber);
 
-/* OSL interfaces added by Linux */
+void
+AcpiOsFixedEventCount (
+    UINT32                  FixedEventNumber);
 
-#ifdef EXPORT_ACPI_INTERFACES
-#include <linux/export.h>
-#endif
+ACPI_STATUS
+AcpiOsHotplugExecute (
+    ACPI_OSD_EXEC_CALLBACK  Function,
+    void                    *Context);
 
 #endif /* __KERNEL__ */
 
diff --git a/src/acpica/source/os_specific/service_layers/osunixxf.c b/src/acpica/source/os_specific/service_layers/osunixxf.c
index 7aa4168..ad003c1 100644
--- a/src/acpica/source/os_specific/service_layers/osunixxf.c
+++ b/src/acpica/source/os_specific/service_layers/osunixxf.c
@@ -163,7 +163,7 @@  typedef void* (*PTHREAD_CALLBACK) (void *);
 /* Terminal support for AcpiExec only */
 
 #ifdef ACPI_EXEC_APP
-#include <termio.h>
+#include <termios.h>
 
 struct termios              OriginalTermAttributes;
 
diff --git a/src/acpica/source/tools/acpiexec/aehandlers.c b/src/acpica/source/tools/acpiexec/aehandlers.c
index f0cc8ba..294abea 100644
--- a/src/acpica/source/tools/acpiexec/aehandlers.c
+++ b/src/acpica/source/tools/acpiexec/aehandlers.c
@@ -170,6 +170,11 @@  AeAttachedDataHandler (
     ACPI_HANDLE             Object,
     void                    *Data);
 
+static void
+AeAttachedDataHandler2 (
+    ACPI_HANDLE             Object,
+    void                    *Data);
+
 static UINT32
 AeInterfaceHandler (
     ACPI_STRING             InterfaceName,
@@ -677,7 +682,29 @@  AeAttachedDataHandler (
     ACPI_NAMESPACE_NODE     *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Data);
 
 
-    AcpiOsPrintf ("Received an attached data deletion on %4.4s\n",
+    AcpiOsPrintf ("Received an attached data deletion (1) on %4.4s\n",
+        Node->Name.Ascii);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION:    AeAttachedDataHandler2
+ *
+ * DESCRIPTION: Handler for deletion of nodes with attached data (attached via
+ *              AcpiAttachData)
+ *
+ *****************************************************************************/
+
+static void
+AeAttachedDataHandler2 (
+    ACPI_HANDLE             Object,
+    void                    *Data)
+{
+    ACPI_NAMESPACE_NODE     *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Data);
+
+
+    AcpiOsPrintf ("Received an attached data deletion (2) on %4.4s\n",
         Node->Name.Ascii);
 }
 
@@ -1094,8 +1121,23 @@  AeInstallEarlyHandlers (
         Status = AcpiDetachData (Handle, AeAttachedDataHandler);
         AE_CHECK_OK (AcpiDetachData, Status);
 
+        /* Test attach data at the root object */
+
+        Status = AcpiAttachData (ACPI_ROOT_OBJECT, AeAttachedDataHandler,
+            AcpiGbl_RootNode);
+        AE_CHECK_OK (AcpiAttachData, Status);
+
+        Status = AcpiAttachData (ACPI_ROOT_OBJECT, AeAttachedDataHandler2,
+            AcpiGbl_RootNode);
+        AE_CHECK_OK (AcpiAttachData, Status);
+
+        /* Test support for multiple attaches */
+
         Status = AcpiAttachData (Handle, AeAttachedDataHandler, Handle);
         AE_CHECK_OK (AcpiAttachData, Status);
+
+        Status = AcpiAttachData (Handle, AeAttachedDataHandler2, Handle);
+        AE_CHECK_OK (AcpiAttachData, Status);
     }
     else
     {