diff mbox

ACPICA: update to version 20130725 (LP: #1205203)

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

Commit Message

Colin Ian King July 26, 2013, 6:39 a.m. UTC
From: Colin Ian King <colin.king@canonical.com>

Update ACPICA sources used by fwts to version 20130725. The complete
set of ACPICA changes are detailed here:

https://lists.acpica.org/pipermail/devel/2013-July/000547.html

I've regression tested the syntaxcheck, --disassemble-aml and method
tests with these changes against my database of ACPI tables and I observed
no regressions.

Signed-off-by: Colin Ian King <colin.king@canonical.com>
---
 src/acpica/source/common/dmextern.c               |  47 ++++--
 src/acpica/source/compiler/asloffset.c            | 172 ++++++++++++++++------
 src/acpica/source/compiler/asloperands.c          |   9 +-
 src/acpica/source/compiler/dttemplate.c           |  23 ++-
 src/acpica/source/components/executer/exoparg1.c  |  50 ++++++-
 src/acpica/source/components/namespace/nspredef.c |  15 +-
 src/acpica/source/components/namespace/nswalk.c   |  18 +--
 src/acpica/source/components/namespace/nsxfeval.c |  14 +-
 src/acpica/source/components/tables/tbfadt.c      |   4 +-
 src/acpica/source/components/tables/tbxfroot.c    |  10 +-
 src/acpica/source/components/utilities/utglobal.c |   1 -
 src/acpica/source/components/utilities/utosi.c    |  89 +++++++++--
 src/acpica/source/components/utilities/utxface.c  |  34 +++++
 src/acpica/source/include/acglobal.h              |   7 +-
 src/acpica/source/include/aclocal.h               |  17 +--
 src/acpica/source/include/acnamesp.h              |   4 +-
 src/acpica/source/include/acpixf.h                |  11 +-
 src/acpica/source/include/actables.h              |   4 +
 src/acpica/source/include/actypes.h               |  28 ++++
 src/acpica/source/include/acutils.h               |   4 +
 20 files changed, 426 insertions(+), 135 deletions(-)

Comments

Alex Hung July 29, 2013, 8:23 a.m. UTC | #1
On 07/26/2013 02:39 PM, Colin King wrote:
> From: Colin Ian King <colin.king@canonical.com>
>
> Update ACPICA sources used by fwts to version 20130725. The complete
> set of ACPICA changes are detailed here:
>
> https://lists.acpica.org/pipermail/devel/2013-July/000547.html
>
> I've regression tested the syntaxcheck, --disassemble-aml and method
> tests with these changes against my database of ACPI tables and I observed
> no regressions.
>
> Signed-off-by: Colin Ian King <colin.king@canonical.com>
> ---
>   src/acpica/source/common/dmextern.c               |  47 ++++--
>   src/acpica/source/compiler/asloffset.c            | 172 ++++++++++++++++------
>   src/acpica/source/compiler/asloperands.c          |   9 +-
>   src/acpica/source/compiler/dttemplate.c           |  23 ++-
>   src/acpica/source/components/executer/exoparg1.c  |  50 ++++++-
>   src/acpica/source/components/namespace/nspredef.c |  15 +-
>   src/acpica/source/components/namespace/nswalk.c   |  18 +--
>   src/acpica/source/components/namespace/nsxfeval.c |  14 +-
>   src/acpica/source/components/tables/tbfadt.c      |   4 +-
>   src/acpica/source/components/tables/tbxfroot.c    |  10 +-
>   src/acpica/source/components/utilities/utglobal.c |   1 -
>   src/acpica/source/components/utilities/utosi.c    |  89 +++++++++--
>   src/acpica/source/components/utilities/utxface.c  |  34 +++++
>   src/acpica/source/include/acglobal.h              |   7 +-
>   src/acpica/source/include/aclocal.h               |  17 +--
>   src/acpica/source/include/acnamesp.h              |   4 +-
>   src/acpica/source/include/acpixf.h                |  11 +-
>   src/acpica/source/include/actables.h              |   4 +
>   src/acpica/source/include/actypes.h               |  28 ++++
>   src/acpica/source/include/acutils.h               |   4 +
>   20 files changed, 426 insertions(+), 135 deletions(-)
>

Acked-by: Alex Hung <alex.hung@canonical.com>
Keng-Yu Lin July 29, 2013, 9:05 a.m. UTC | #2
On Fri, Jul 26, 2013 at 2:39 PM, Colin King <colin.king@canonical.com> wrote:
> From: Colin Ian King <colin.king@canonical.com>
>
> Update ACPICA sources used by fwts to version 20130725. The complete
> set of ACPICA changes are detailed here:
>
> https://lists.acpica.org/pipermail/devel/2013-July/000547.html
>
> I've regression tested the syntaxcheck, --disassemble-aml and method
> tests with these changes against my database of ACPI tables and I observed
> no regressions.
>
> Signed-off-by: Colin Ian King <colin.king@canonical.com>
> ---
>  src/acpica/source/common/dmextern.c               |  47 ++++--
>  src/acpica/source/compiler/asloffset.c            | 172 ++++++++++++++++------
>  src/acpica/source/compiler/asloperands.c          |   9 +-
>  src/acpica/source/compiler/dttemplate.c           |  23 ++-
>  src/acpica/source/components/executer/exoparg1.c  |  50 ++++++-
>  src/acpica/source/components/namespace/nspredef.c |  15 +-
>  src/acpica/source/components/namespace/nswalk.c   |  18 +--
>  src/acpica/source/components/namespace/nsxfeval.c |  14 +-
>  src/acpica/source/components/tables/tbfadt.c      |   4 +-
>  src/acpica/source/components/tables/tbxfroot.c    |  10 +-
>  src/acpica/source/components/utilities/utglobal.c |   1 -
>  src/acpica/source/components/utilities/utosi.c    |  89 +++++++++--
>  src/acpica/source/components/utilities/utxface.c  |  34 +++++
>  src/acpica/source/include/acglobal.h              |   7 +-
>  src/acpica/source/include/aclocal.h               |  17 +--
>  src/acpica/source/include/acnamesp.h              |   4 +-
>  src/acpica/source/include/acpixf.h                |  11 +-
>  src/acpica/source/include/actables.h              |   4 +
>  src/acpica/source/include/actypes.h               |  28 ++++
>  src/acpica/source/include/acutils.h               |   4 +
>  20 files changed, 426 insertions(+), 135 deletions(-)
>
> diff --git a/src/acpica/source/common/dmextern.c b/src/acpica/source/common/dmextern.c
> index 0cd094f..87aeddc 100644
> --- a/src/acpica/source/common/dmextern.c
> +++ b/src/acpica/source/common/dmextern.c
> @@ -791,34 +791,54 @@ AcpiDmEmitExternals (
>
>      AcpiDmUnresolvedWarning (1);
>
> +    /* Emit any unresolved method externals in a single text block */
> +
> +    NextExternal = AcpiGbl_ExternalList;
> +    while (NextExternal)
> +    {
> +        if ((NextExternal->Type == ACPI_TYPE_METHOD) &&
> +            (!NextExternal->Resolved))
> +        {
> +            AcpiOsPrintf ("    External (%s%s",
> +                NextExternal->Path,
> +                AcpiDmGetObjectTypeName (NextExternal->Type));
> +
> +            AcpiOsPrintf (")    // Warning: Unresolved Method, "
> +                "guessing %u arguments (may be incorrect, see warning above)\n",
> +                NextExternal->Value);
> +
> +            NextExternal->Emitted = TRUE;
> +        }
> +
> +        NextExternal = NextExternal->Next;
> +    }
> +
> +    AcpiOsPrintf ("\n");
> +
>      /*
>       * Walk the list of externals (unresolved references)
>       * found during the AML parsing
>       */
>      while (AcpiGbl_ExternalList)
>      {
> -        AcpiOsPrintf ("    External (%s%s",
> -            AcpiGbl_ExternalList->Path,
> -            AcpiDmGetObjectTypeName (AcpiGbl_ExternalList->Type));
> -
> -        if (AcpiGbl_ExternalList->Type == ACPI_TYPE_METHOD)
> +        if (!AcpiGbl_ExternalList->Emitted)
>          {
> -            if (AcpiGbl_ExternalList->Resolved)
> +            AcpiOsPrintf ("    External (%s%s",
> +                AcpiGbl_ExternalList->Path,
> +                AcpiDmGetObjectTypeName (AcpiGbl_ExternalList->Type));
> +
> +            /* For methods, add a comment with the number of arguments */
> +
> +            if (AcpiGbl_ExternalList->Type == ACPI_TYPE_METHOD)
>              {
>                  AcpiOsPrintf (")    // %u Arguments\n",
>                      AcpiGbl_ExternalList->Value);
>              }
>              else
>              {
> -                AcpiOsPrintf (")    // Warning: unresolved Method, "
> -                    "assuming %u arguments (may be incorrect, see warning above)\n",
> -                    AcpiGbl_ExternalList->Value);
> +                AcpiOsPrintf (")\n");
>              }
>          }
> -        else
> -        {
> -            AcpiOsPrintf (")\n");
> -        }
>
>          /* Free this external info block and move on to next external */
>
> @@ -1003,5 +1023,4 @@ AcpiDmUnresolvedWarning (
>                  (AcpiGbl_NumExternalMethods - AcpiGbl_ResolvedExternalMethods));
>          }
>      }
> -
>  }
> diff --git a/src/acpica/source/compiler/asloffset.c b/src/acpica/source/compiler/asloffset.c
> index 3c6551e..1c6911f 100644
> --- a/src/acpica/source/compiler/asloffset.c
> +++ b/src/acpica/source/compiler/asloffset.c
> @@ -129,10 +129,12 @@ static void
>  LsEmitOffsetTableEntry (
>      UINT32                  FileId,
>      ACPI_NAMESPACE_NODE     *Node,
> +    UINT32                  NamepathOffset,
>      UINT32                  Offset,
>      char                    *OpName,
>      UINT64                  Value,
> -    UINT8                   AmlOpcode);
> +    UINT8                   AmlOpcode,
> +    UINT16                  ParentOpcode);
>
>
>  /*******************************************************************************
> @@ -166,7 +168,8 @@ LsAmlOffsetWalk (
>      UINT32                  FileId = (UINT32) ACPI_TO_INTEGER (Context);
>      ACPI_NAMESPACE_NODE     *Node;
>      UINT32                  Length;
> -    UINT32                  OffsetOfOpcode;
> +    UINT32                  NamepathOffset;
> +    UINT32                  DataOffset;
>      ACPI_PARSE_OBJECT       *NextOp;
>
>
> @@ -191,8 +194,9 @@ LsAmlOffsetWalk (
>      if ((Node->Type == ACPI_TYPE_LOCAL_RESOURCE) &&
>          (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC))
>      {
> -        LsEmitOffsetTableEntry (FileId, Node, Gbl_CurrentAmlOffset,
> -            Op->Asl.ParseOpName, 0, Op->Asl.Extra);
> +        LsEmitOffsetTableEntry (FileId, Node, 0, Gbl_CurrentAmlOffset,
> +            Op->Asl.ParseOpName, 0, Op->Asl.Extra, AML_BUFFER_OP);
> +
>          Gbl_CurrentAmlOffset += Op->Asl.FinalAmlLength;
>          return (AE_OK);
>      }
> @@ -210,22 +214,25 @@ LsAmlOffsetWalk (
>          }
>
>          Length = Op->Asl.FinalAmlLength;
> +        NamepathOffset = Gbl_CurrentAmlOffset + Length;
>
>          /* Get to the NameSeg/NamePath Op (and length of the name) */
>
>          Op = Op->Asl.Child;
> -        OffsetOfOpcode = Length + Op->Asl.FinalAmlLength;
> +
> +        /* Get offset of last nameseg and the actual data */
> +
> +        NamepathOffset = Gbl_CurrentAmlOffset + Length +
> +            (Op->Asl.FinalAmlLength - ACPI_NAME_SIZE);
> +
> +        DataOffset = Gbl_CurrentAmlOffset + Length +
> +            Op->Asl.FinalAmlLength;
>
>          /* Get actual value associated with the name */
>
>          Op = Op->Asl.Next;
>          switch (Op->Asl.AmlOpcode)
>          {
> -        /*
> -         * We are only interested in integer constants that can be changed
> -         * at boot time. Note, the One/Ones/Zero opcodes are considered
> -         * non-changeable, so we ignore them here.
> -         */
>          case AML_BYTE_OP:
>          case AML_WORD_OP:
>          case AML_DWORD_OP:
> @@ -233,22 +240,32 @@ LsAmlOffsetWalk (
>
>              /* The +1 is to handle the integer size prefix (opcode) */
>
> -            LsEmitOffsetTableEntry (FileId, Node,
> -                (Gbl_CurrentAmlOffset + OffsetOfOpcode + 1),
> +            LsEmitOffsetTableEntry (FileId, Node, NamepathOffset, (DataOffset + 1),
>                  Op->Asl.ParseOpName, Op->Asl.Value.Integer,
> -                (UINT8) Op->Asl.AmlOpcode);
> +                (UINT8) Op->Asl.AmlOpcode, AML_NAME_OP);
> +            break;
> +
> +        case AML_ONE_OP:
> +        case AML_ONES_OP:
> +        case AML_ZERO_OP:
> +
> +            /* For these, offset will point to the opcode */
> +
> +            LsEmitOffsetTableEntry (FileId, Node, NamepathOffset, DataOffset,
> +                Op->Asl.ParseOpName, Op->Asl.Value.Integer,
> +                (UINT8) Op->Asl.AmlOpcode, AML_NAME_OP);
>              break;
>
>          case AML_PACKAGE_OP:
>          case AML_VAR_PACKAGE_OP:
>
> +            /* Get the package element count */
> +
>              NextOp = Op->Asl.Child;
>
> -            LsEmitOffsetTableEntry (FileId, Node,
> -                (Gbl_CurrentAmlOffset + OffsetOfOpcode),
> -                Op->Asl.ParseOpName,
> -                NextOp->Asl.Value.Integer,
> -                (UINT8) Op->Asl.AmlOpcode);
> +            LsEmitOffsetTableEntry (FileId, Node, NamepathOffset, DataOffset,
> +                Op->Asl.ParseOpName, NextOp->Asl.Value.Integer,
> +                (UINT8) Op->Asl.AmlOpcode, AML_NAME_OP);
>              break;
>
>           default:
> @@ -267,7 +284,14 @@ LsAmlOffsetWalk (
>          /* Get the name/namepath node */
>
>          NextOp = Op->Asl.Child;
> -        OffsetOfOpcode = Length + NextOp->Asl.FinalAmlLength + 1;
> +
> +        /* Get offset of last nameseg and the actual data */
> +
> +        NamepathOffset = Gbl_CurrentAmlOffset + Length +
> +            (NextOp->Asl.FinalAmlLength - ACPI_NAME_SIZE);
> +
> +        DataOffset = Gbl_CurrentAmlOffset + Length +
> +            (NextOp->Asl.FinalAmlLength + 1);
>
>          /* Get the SpaceId node, then the Offset (address) node */
>
> @@ -286,10 +310,9 @@ LsAmlOffsetWalk (
>          case AML_DWORD_OP:
>          case AML_QWORD_OP:
>
> -            LsEmitOffsetTableEntry (FileId, Node,
> -                (Gbl_CurrentAmlOffset + OffsetOfOpcode + 1),
> +            LsEmitOffsetTableEntry (FileId, Node, NamepathOffset, (DataOffset + 1),
>                  Op->Asl.ParseOpName, NextOp->Asl.Value.Integer,
> -                (UINT8) NextOp->Asl.AmlOpcode);
> +                (UINT8) NextOp->Asl.AmlOpcode, AML_REGION_OP);
>
>              Gbl_CurrentAmlOffset += Length;
>              return (AE_OK);
> @@ -309,15 +332,62 @@ LsAmlOffsetWalk (
>
>          NextOp = Op->Asl.Child;
>
> -        /* Point to the *last* nameseg in the namepath */
> +        /* Get offset of last nameseg and the actual data (flags byte) */
>
> -        OffsetOfOpcode = NextOp->Asl.FinalAmlLength - ACPI_NAME_SIZE;
> +        NamepathOffset = Gbl_CurrentAmlOffset + Length +
> +            (NextOp->Asl.FinalAmlLength - ACPI_NAME_SIZE);
>
> -        LsEmitOffsetTableEntry (FileId, Node,
> -            (Gbl_CurrentAmlOffset + OffsetOfOpcode + Length),
> -            Op->Asl.ParseOpName,
> -            *((UINT32 *) &NextOp->Asl.Value.Buffer[OffsetOfOpcode]),
> -            (UINT8) Op->Asl.AmlOpcode);
> +        DataOffset = Gbl_CurrentAmlOffset + Length +
> +            NextOp->Asl.FinalAmlLength;
> +
> +        /* Get the flags byte Op */
> +
> +        NextOp = NextOp->Asl.Next;
> +
> +        LsEmitOffsetTableEntry (FileId, Node, NamepathOffset, DataOffset,
> +            Op->Asl.ParseOpName, NextOp->Asl.Value.Integer,
> +            (UINT8) Op->Asl.AmlOpcode, AML_METHOD_OP);
> +        break;
> +
> +    case AML_PROCESSOR_OP:
> +
> +        /* Processor (Namepath, ProcessorId, Address, Length) */
> +
> +        Length = Op->Asl.FinalAmlLength;
> +        NextOp = Op->Asl.Child;     /* Get Namepath */
> +
> +        /* Get offset of last nameseg and the actual data (PBlock address) */
> +
> +        NamepathOffset = Gbl_CurrentAmlOffset + Length +
> +            (NextOp->Asl.FinalAmlLength - ACPI_NAME_SIZE);
> +
> +        DataOffset = Gbl_CurrentAmlOffset + Length +
> +            (NextOp->Asl.FinalAmlLength + 1);
> +
> +        NextOp = NextOp->Asl.Next;  /* Get ProcessorID (BYTE) */
> +        NextOp = NextOp->Asl.Next;  /* Get Address (DWORD) */
> +
> +        LsEmitOffsetTableEntry (FileId, Node, NamepathOffset, DataOffset,
> +            Op->Asl.ParseOpName, NextOp->Asl.Value.Integer,
> +            (UINT8) AML_DWORD_OP, AML_PROCESSOR_OP);
> +        break;
> +
> +    case AML_DEVICE_OP:
> +    case AML_SCOPE_OP:
> +    case AML_THERMAL_ZONE_OP:
> +
> +        /* Device/Scope/ThermalZone (Namepath) */
> +
> +        Length = Op->Asl.FinalAmlLength;
> +        NextOp = Op->Asl.Child;     /* Get Namepath */
> +
> +        /* Get offset of last nameseg */
> +
> +        NamepathOffset = Gbl_CurrentAmlOffset + Length +
> +            (NextOp->Asl.FinalAmlLength - ACPI_NAME_SIZE);
> +
> +        LsEmitOffsetTableEntry (FileId, Node, NamepathOffset, 0,
> +            Op->Asl.ParseOpName, 0, (UINT8) 0, Op->Asl.AmlOpcode);
>          break;
>
>      default:
> @@ -339,6 +409,7 @@ LsAmlOffsetWalk (
>   *              OpName          - Name of the AML opcode
>   *              Value           - Current value of the AML field
>   *              AmlOpcode       - Opcode associated with the field
> + *              ObjectType      - ACPI object type
>   *
>   * RETURN:      None
>   *
> @@ -350,10 +421,12 @@ static void
>  LsEmitOffsetTableEntry (
>      UINT32                  FileId,
>      ACPI_NAMESPACE_NODE     *Node,
> +    UINT32                  NamepathOffset,
>      UINT32                  Offset,
>      char                    *OpName,
>      UINT64                  Value,
> -    UINT8                   AmlOpcode)
> +    UINT8                   AmlOpcode,
> +    UINT16                  ParentOpcode)
>  {
>      ACPI_BUFFER             TargetPath;
>      ACPI_STATUS             Status;
> @@ -380,8 +453,9 @@ LsEmitOffsetTableEntry (
>       * Max Length for Integers is 8 bytes.
>       */
>      FlPrintFile (FileId,
> -        "    {%-29s 0x%8.8X, 0x%2.2X, 0x%8.8X%8.8X}, /* %s */\n",
> -        MsgBuffer, Offset, AmlOpcode, ACPI_FORMAT_UINT64 (Value), OpName);
> +        "    {%-29s 0x%4.4X, 0x%8.8X, 0x%2.2X, 0x%8.8X, 0x%8.8X%8.8X}, /* %s */\n",
> +        MsgBuffer, ParentOpcode, NamepathOffset, AmlOpcode,
> +        Offset, ACPI_FORMAT_UINT64 (Value), OpName);
>  }
>
>
> @@ -407,10 +481,12 @@ LsDoOffsetTableHeader (
>          "#define __AML_OFFSET_TABLE_H\n\n");
>
>      FlPrintFile (FileId, "typedef struct {\n"
> -        "    char                   *Pathname;\n"
> -        "    unsigned long          Offset;\n"
> -        "    unsigned char          Opcode;\n"
> -        "    unsigned long long     Value;\n"
> +        "    char                   *Pathname;      /* Full pathname (from root) to the object */\n"
> +        "    unsigned short         ParentOpcode;   /* AML opcode for the parent object */\n"
> +        "    unsigned long          NamesegOffset;  /* Offset of last nameseg in the parent namepath */\n"
> +        "    unsigned char          Opcode;         /* AML opcode for the data */\n"
> +        "    unsigned long          Offset;         /* Offset for the data */\n"
> +        "    unsigned long long     Value;          /* Original value of the data (as applicable) */\n"
>          "} AML_OFFSET_TABLE_ENTRY;\n\n");
>
>      FlPrintFile (FileId,
> @@ -418,29 +494,37 @@ LsDoOffsetTableHeader (
>
>      FlPrintFile (FileId,
>          "/*\n"
> -        " * Information about supported object types:\n"
> +        " * Information specific to the supported object types:\n"
>          " *\n"
>          " * Integers:\n"
> -        " *    Offset points to the actual integer data\n"
>          " *    Opcode is the integer prefix, indicates length of the data\n"
> +        " *        (One of: BYTE, WORD, DWORD, QWORD, ZERO, ONE, ONES)\n"
> +        " *    Offset points to the actual integer data\n"
>          " *    Value is the existing value in the AML\n"
>          " *\n"
>          " * Packages:\n"
> -        " *    Offset points to the package opcode\n"
>          " *    Opcode is the package or var_package opcode\n"
> -        " *    Value is the package element cound\n"
> +        " *    Offset points to the package opcode\n"
> +        " *    Value is the package element count\n"
>          " *\n"
>          " * Operation Regions:\n"
> -        " *    Offset points to the region address data\n"
>          " *    Opcode is the address integer prefix, indicates length of the data\n"
> +        " *    Offset points to the region address\n"
>          " *    Value is the existing address value in the AML\n"
>          " *\n"
>          " * Control Methods:\n"
> -        " *    Offset points to the first byte of the namepath\n"
> +        " *    Offset points to the method flags byte\n"
> +        " *    Value is the existing flags value in the AML\n"
> +        " *\n"
> +        " * Processors:\n"
> +        " *    Offset points to the first byte of the PBlock Address\n"
>          " *\n"
>          " * Resource Descriptors:\n"
> -        " *    Offset points to the start of the descriptor\n"
>          " *    Opcode is the descriptor type\n"
> +        " *    Offset points to the start of the descriptor\n"
> +        " *\n"
> +        " * Scopes/Devices/ThermalZones:\n"
> +        " *    Nameseg offset only\n"
>          " */\n");
>
>      FlPrintFile (FileId,
> @@ -455,6 +539,6 @@ LsDoOffsetTableFooter (
>  {
>
>      FlPrintFile (FileId,
> -        "    {0,0,0,0} /* Table terminator */\n};\n\n");
> +        "    {NULL,0,0,0,0,0} /* Table terminator */\n};\n\n");
>      Gbl_CurrentAmlOffset = 0;
>  }
> diff --git a/src/acpica/source/compiler/asloperands.c b/src/acpica/source/compiler/asloperands.c
> index a9f08d0..1a85a9f 100644
> --- a/src/acpica/source/compiler/asloperands.c
> +++ b/src/acpica/source/compiler/asloperands.c
> @@ -1043,12 +1043,15 @@ OpnDoDefinitionBlock (
>          Gbl_TableId = AcpiOsAllocate (Length + 1);
>          ACPI_STRCPY (Gbl_TableId, Child->Asl.Value.String);
>
> +        /*
> +         * Convert anything non-alphanumeric to an underscore. This
> +         * allows us to use the TableID to generate unique C symbols.
> +         */
>          for (i = 0; i < Length; i++)
>          {
> -            if (Gbl_TableId[i] == ' ')
> +            if (!isalnum ((int) Gbl_TableId[i]))
>              {
> -                Gbl_TableId[i] = 0;
> -                break;
> +                Gbl_TableId[i] = '_';
>              }
>          }
>      }
> diff --git a/src/acpica/source/compiler/dttemplate.c b/src/acpica/source/compiler/dttemplate.c
> index 53cc34c..bdcad38 100644
> --- a/src/acpica/source/compiler/dttemplate.c
> +++ b/src/acpica/source/compiler/dttemplate.c
> @@ -189,13 +189,21 @@ DtCreateTemplates (
>
>
>      AslInitializeGlobals ();
> -    AcpiUtStrupr (Signature);
>
> -    /* Create all known templates if requested */
> +    /* Default (no signature) is DSDT */
> +
> +    if (!Signature)
> +    {
> +        Signature = "DSDT";
> +        goto GetTemplate;
> +    }
>
> -    if (!ACPI_STRNCMP (Signature, "ALL", 3) ||
> +    AcpiUtStrupr (Signature);
> +    if (!ACPI_STRCMP (Signature, "ALL") ||
>          !ACPI_STRCMP (Signature, "*"))
>      {
> +        /* Create all available/known templates */
> +
>          Status = DtCreateAllTemplates ();
>          return (Status);
>      }
> @@ -208,7 +216,9 @@ DtCreateTemplates (
>       */
>      if (strlen (Signature) != ACPI_NAME_SIZE)
>      {
> -        fprintf (stderr, "%s, Invalid ACPI table signature\n", Signature);
> +        fprintf (stderr,
> +            "%s: Invalid ACPI table signature (length must be 4 characters)\n",
> +            Signature);
>          return (AE_ERROR);
>      }
>
> @@ -225,19 +235,20 @@ DtCreateTemplates (
>          Signature = "FACP";
>      }
>
> +GetTemplate:
>      TableData = AcpiDmGetTableData (Signature);
>      if (TableData)
>      {
>          if (!TableData->Template)
>          {
> -            fprintf (stderr, "%4.4s, No template available\n", Signature);
> +            fprintf (stderr, "%4.4s: No template available\n", Signature);
>              return (AE_ERROR);
>          }
>      }
>      else if (!AcpiUtIsSpecialTable (Signature))
>      {
>          fprintf (stderr,
> -            "%4.4s, Unrecognized ACPI table signature\n", Signature);
> +            "%4.4s: Unrecognized ACPI table signature\n", Signature);
>          return (AE_ERROR);
>      }
>
> diff --git a/src/acpica/source/components/executer/exoparg1.c b/src/acpica/source/components/executer/exoparg1.c
> index ee6ffc1..8bde71a 100644
> --- a/src/acpica/source/components/executer/exoparg1.c
> +++ b/src/acpica/source/components/executer/exoparg1.c
> @@ -1081,10 +1081,17 @@ AcpiExOpcode_1A_0T_1R (
>                       * add another reference to the referenced object, however.
>                       */
>                      ReturnDesc = *(Operand[0]->Reference.Where);
> -                    if (ReturnDesc)
> +                    if (!ReturnDesc)
>                      {
> -                        AcpiUtAddReference (ReturnDesc);
> +                        /*
> +                         * Element is NULL, do not allow the dereference.
> +                         * This provides compatibility with other ACPI
> +                         * implementations.
> +                         */
> +                        return_ACPI_STATUS (AE_AML_UNINITIALIZED_ELEMENT);
>                      }
> +
> +                    AcpiUtAddReference (ReturnDesc);
>                      break;
>
>                  default:
> @@ -1102,15 +1109,44 @@ AcpiExOpcode_1A_0T_1R (
>                  ReturnDesc = Operand[0]->Reference.Object;
>
>                  if (ACPI_GET_DESCRIPTOR_TYPE (ReturnDesc) ==
> -                        ACPI_DESC_TYPE_NAMED)
> +                    ACPI_DESC_TYPE_NAMED)
>                  {
>                      ReturnDesc = AcpiNsGetAttachedObject (
> -                                    (ACPI_NAMESPACE_NODE *) ReturnDesc);
> -                }
> +                        (ACPI_NAMESPACE_NODE *) ReturnDesc);
> +                    if (!ReturnDesc)
> +                    {
> +                        break;
> +                    }
>
> -                /* Add another reference to the object! */
> +                   /*
> +                    * June 2013:
> +                    * BufferFields/FieldUnits require additional resolution
> +                    */
> +                    switch (ReturnDesc->Common.Type)
> +                    {
> +                    case ACPI_TYPE_BUFFER_FIELD:
> +                    case ACPI_TYPE_LOCAL_REGION_FIELD:
> +                    case ACPI_TYPE_LOCAL_BANK_FIELD:
> +                    case ACPI_TYPE_LOCAL_INDEX_FIELD:
>
> -                AcpiUtAddReference (ReturnDesc);
> +                        Status = AcpiExReadDataFromField (WalkState,
> +                            ReturnDesc, &TempDesc);
> +                        if (ACPI_FAILURE (Status))
> +                        {
> +                            goto Cleanup;
> +                        }
> +
> +                        ReturnDesc = TempDesc;
> +                        break;
> +
> +                    default:
> +
> +                        /* Add another reference to the object */
> +
> +                        AcpiUtAddReference (ReturnDesc);
> +                        break;
> +                    }
> +                }
>                  break;
>
>              default:
> diff --git a/src/acpica/source/components/namespace/nspredef.c b/src/acpica/source/components/namespace/nspredef.c
> index e7bc55b..15ba35e 100644
> --- a/src/acpica/source/components/namespace/nspredef.c
> +++ b/src/acpica/source/components/namespace/nspredef.c
> @@ -237,11 +237,16 @@ AcpiNsCheckReturnValue (
>          goto Exit;
>      }
>
> +    /*
> +     *
> +     * 4) If there is no return value and it is optional, just return
> +     * AE_OK (_WAK).
> +     */
>      if (!(*ReturnObjectPtr))
>      {
> -        Status = AE_AML_NO_RETURN_VALUE;
>          goto Exit;
>      }
> +
>      /*
>       * For returned Package objects, check the type of all sub-objects.
>       * Note: Package may have been newly created by call above.
> @@ -370,7 +375,13 @@ TypeErrorExit:
>
>      AcpiUtGetExpectedReturnTypes (TypeBuffer, ExpectedBtypes);
>
> -    if (PackageIndex == ACPI_NOT_PACKAGE_ELEMENT)
> +    if (!ReturnObject)
> +    {
> +        ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
> +            "Expected return object of type %s",
> +            TypeBuffer));
> +    }
> +    else if (PackageIndex == ACPI_NOT_PACKAGE_ELEMENT)
>      {
>          ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
>              "Return type mismatch - found %s, expected %s",
> diff --git a/src/acpica/source/components/namespace/nswalk.c b/src/acpica/source/components/namespace/nswalk.c
> index 1084a02..20b1b32 100644
> --- a/src/acpica/source/components/namespace/nswalk.c
> +++ b/src/acpica/source/components/namespace/nswalk.c
> @@ -237,9 +237,9 @@ AcpiNsGetNextNodeTyped (
>   *              MaxDepth            - Depth to which search is to reach
>   *              Flags               - Whether to unlock the NS before invoking
>   *                                    the callback routine
> - *              PreOrderVisit       - Called during tree pre-order visit
> + *              DescendingCallback  - Called during tree descent
>   *                                    when an object of "Type" is found
> - *              PostOrderVisit      - Called during tree post-order visit
> + *              AscendingCallback   - Called during tree ascent
>   *                                    when an object of "Type" is found
>   *              Context             - Passed to user function(s) above
>   *              ReturnValue         - from the UserFunction if terminated
> @@ -267,8 +267,8 @@ AcpiNsWalkNamespace (
>      ACPI_HANDLE             StartNode,
>      UINT32                  MaxDepth,
>      UINT32                  Flags,
> -    ACPI_WALK_CALLBACK      PreOrderVisit,
> -    ACPI_WALK_CALLBACK      PostOrderVisit,
> +    ACPI_WALK_CALLBACK      DescendingCallback,
> +    ACPI_WALK_CALLBACK      AscendingCallback,
>      void                    *Context,
>      void                    **ReturnValue)
>  {
> @@ -346,22 +346,22 @@ AcpiNsWalkNamespace (
>              }
>
>              /*
> -             * Invoke the user function, either pre-order or post-order
> +             * Invoke the user function, either descending, ascending,
>               * or both.
>               */
>              if (!NodePreviouslyVisited)
>              {
> -                if (PreOrderVisit)
> +                if (DescendingCallback)
>                  {
> -                    Status = PreOrderVisit (ChildNode, Level,
> +                    Status = DescendingCallback (ChildNode, Level,
>                                  Context, ReturnValue);
>                  }
>              }
>              else
>              {
> -                if (PostOrderVisit)
> +                if (AscendingCallback)
>                  {
> -                    Status = PostOrderVisit (ChildNode, Level,
> +                    Status = AscendingCallback (ChildNode, Level,
>                                  Context, ReturnValue);
>                  }
>              }
> diff --git a/src/acpica/source/components/namespace/nsxfeval.c b/src/acpica/source/components/namespace/nsxfeval.c
> index 901a931..650b774 100644
> --- a/src/acpica/source/components/namespace/nsxfeval.c
> +++ b/src/acpica/source/components/namespace/nsxfeval.c
> @@ -646,9 +646,9 @@ AcpiNsResolveReferences (
>   * PARAMETERS:  Type                - ACPI_OBJECT_TYPE to search for
>   *              StartObject         - Handle in namespace where search begins
>   *              MaxDepth            - Depth to which search is to reach
> - *              PreOrderVisit       - Called during tree pre-order visit
> + *              DescendingCallback  - Called during tree descent
>   *                                    when an object of "Type" is found
> - *              PostOrderVisit      - Called during tree post-order visit
> + *              AscendingCallback   - Called during tree ascent
>   *                                    when an object of "Type" is found
>   *              Context             - Passed to user function(s) above
>   *              ReturnValue         - Location where return value of
> @@ -677,8 +677,8 @@ AcpiWalkNamespace (
>      ACPI_OBJECT_TYPE        Type,
>      ACPI_HANDLE             StartObject,
>      UINT32                  MaxDepth,
> -    ACPI_WALK_CALLBACK      PreOrderVisit,
> -    ACPI_WALK_CALLBACK      PostOrderVisit,
> +    ACPI_WALK_CALLBACK      DescendingCallback,
> +    ACPI_WALK_CALLBACK      AscendingCallback,
>      void                    *Context,
>      void                    **ReturnValue)
>  {
> @@ -692,7 +692,7 @@ AcpiWalkNamespace (
>
>      if ((Type > ACPI_TYPE_LOCAL_MAX) ||
>          (!MaxDepth)                  ||
> -        (!PreOrderVisit && !PostOrderVisit))
> +        (!DescendingCallback && !AscendingCallback))
>      {
>          return_ACPI_STATUS (AE_BAD_PARAMETER);
>      }
> @@ -727,8 +727,8 @@ AcpiWalkNamespace (
>      }
>
>      Status = AcpiNsWalkNamespace (Type, StartObject, MaxDepth,
> -                ACPI_NS_WALK_UNLOCK, PreOrderVisit,
> -                PostOrderVisit, Context, ReturnValue);
> +                ACPI_NS_WALK_UNLOCK, DescendingCallback,
> +                AscendingCallback, Context, ReturnValue);
>
>      (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
>
> diff --git a/src/acpica/source/components/tables/tbfadt.c b/src/acpica/source/components/tables/tbfadt.c
> index 7e00831..d90baba 100644
> --- a/src/acpica/source/components/tables/tbfadt.c
> +++ b/src/acpica/source/components/tables/tbfadt.c
> @@ -204,7 +204,7 @@ static ACPI_FADT_INFO     FadtInfoTable[] =
>          ACPI_FADT_OFFSET (PmTimerBlock),
>          ACPI_FADT_OFFSET (PmTimerLength),
>          ACPI_PM_TIMER_WIDTH,
> -        ACPI_FADT_REQUIRED},
> +        ACPI_FADT_SEPARATE_LENGTH},         /* ACPI 5.0A: Timer is optional */
>
>      {"Gpe0Block",
>          ACPI_FADT_OFFSET (XGpe0Block),
> @@ -678,7 +678,7 @@ AcpiTbValidateFadt (
>          if (FadtInfoTable[i].Type & ACPI_FADT_REQUIRED)
>          {
>              /*
> -             * Field is required (PM1aEvent, PM1aControl, PmTimer).
> +             * Field is required (PM1aEvent, PM1aControl).
>               * Both the address and length must be non-zero.
>               */
>              if (!Address64->Address || !Length)
> diff --git a/src/acpica/source/components/tables/tbxfroot.c b/src/acpica/source/components/tables/tbxfroot.c
> index 7e6a620..b9db205 100644
> --- a/src/acpica/source/components/tables/tbxfroot.c
> +++ b/src/acpica/source/components/tables/tbxfroot.c
> @@ -123,12 +123,6 @@
>  #define _COMPONENT          ACPI_TABLES
>          ACPI_MODULE_NAME    ("tbxfroot")
>
> -/* Local prototypes */
> -
> -static ACPI_STATUS
> -AcpiTbValidateRsdp (
> -    ACPI_TABLE_RSDP         *Rsdp);
> -
>
>  /*******************************************************************************
>   *
> @@ -142,7 +136,7 @@ AcpiTbValidateRsdp (
>   *
>   ******************************************************************************/
>
> -static ACPI_STATUS
> +ACPI_STATUS
>  AcpiTbValidateRsdp (
>      ACPI_TABLE_RSDP         *Rsdp)
>  {
> @@ -153,7 +147,7 @@ AcpiTbValidateRsdp (
>       * Note: Sometimes there exists more than one RSDP in memory; the valid
>       * RSDP has a valid checksum, all others have an invalid checksum.
>       */
> -    if (ACPI_STRNCMP ((char *) Rsdp, ACPI_SIG_RSDP,
> +    if (ACPI_STRNCMP ((char *) Rsdp->Signature, ACPI_SIG_RSDP,
>              sizeof (ACPI_SIG_RSDP)-1) != 0)
>      {
>          /* Nope, BAD Signature */
> diff --git a/src/acpica/source/components/utilities/utglobal.c b/src/acpica/source/components/utilities/utglobal.c
> index 330b86b..1ce7610 100644
> --- a/src/acpica/source/components/utilities/utglobal.c
> +++ b/src/acpica/source/components/utilities/utglobal.c
> @@ -391,7 +391,6 @@ AcpiUtInitGlobals (
>      AcpiGbl_TraceDbgLayer               = 0;
>      AcpiGbl_DebuggerConfiguration       = DEBUGGER_THREADING;
>      AcpiGbl_DbOutputFlags               = ACPI_DB_CONSOLE_OUTPUT;
> -    AcpiGbl_OsiData                     = 0;
>      AcpiGbl_OsiMutex                    = NULL;
>      AcpiGbl_RegMethodsExecuted          = FALSE;
>
> diff --git a/src/acpica/source/components/utilities/utosi.c b/src/acpica/source/components/utilities/utosi.c
> index cda1bfe..55a1d92 100644
> --- a/src/acpica/source/components/utilities/utosi.c
> +++ b/src/acpica/source/components/utilities/utosi.c
> @@ -153,21 +153,20 @@ static ACPI_INTERFACE_INFO    AcpiDefaultSupportedInterfaces[] =
>
>      /* Feature Group Strings */
>
> -    {"Extended Address Space Descriptor", NULL, 0, 0}
> +    {"Extended Address Space Descriptor", NULL, ACPI_OSI_FEATURE, 0},
>
>      /*
>       * All "optional" feature group strings (features that are implemented
> -     * by the host) should be dynamically added by the host via
> -     * AcpiInstallInterface and should not be manually added here.
> -     *
> -     * Examples of optional feature group strings:
> -     *
> -     * "Module Device"
> -     * "Processor Device"
> -     * "3.0 Thermal Model"
> -     * "3.0 _SCP Extensions"
> -     * "Processor Aggregator Device"
> +     * by the host) should be dynamically modified to VALID by the host via
> +     * AcpiInstallInterface or AcpiUpdateInterfaces. Such optional feature
> +     * group strings are set as INVALID by default here.
>       */
> +
> +    {"Module Device",               NULL, ACPI_OSI_OPTIONAL_FEATURE, 0},
> +    {"Processor Device",            NULL, ACPI_OSI_OPTIONAL_FEATURE, 0},
> +    {"3.0 Thermal Model",           NULL, ACPI_OSI_OPTIONAL_FEATURE, 0},
> +    {"3.0 _SCP Extensions",         NULL, ACPI_OSI_OPTIONAL_FEATURE, 0},
> +    {"Processor Aggregator Device", NULL, ACPI_OSI_OPTIONAL_FEATURE, 0}
>  };
>
>
> @@ -244,13 +243,26 @@ AcpiUtInterfaceTerminate (
>      {
>          AcpiGbl_SupportedInterfaces = NextInterface->Next;
>
> -        /* Only interfaces added at runtime can be freed */
> -
>          if (NextInterface->Flags & ACPI_OSI_DYNAMIC)
>          {
> +            /* Only interfaces added at runtime can be freed */
> +
>              ACPI_FREE (NextInterface->Name);
>              ACPI_FREE (NextInterface);
>          }
> +        else
> +        {
> +            /* Interface is in static list. Reset it to invalid or valid. */
> +
> +            if (NextInterface->Flags & ACPI_OSI_DEFAULT_INVALID)
> +            {
> +                NextInterface->Flags |= ACPI_OSI_INVALID;
> +            }
> +            else
> +            {
> +                NextInterface->Flags &= ~ACPI_OSI_INVALID;
> +            }
> +        }
>
>          NextInterface = AcpiGbl_SupportedInterfaces;
>      }
> @@ -379,6 +391,57 @@ AcpiUtRemoveInterface (
>
>  /*******************************************************************************
>   *
> + * FUNCTION:    AcpiUtUpdateInterfaces
> + *
> + * PARAMETERS:  Action              - Actions to be performed during the
> + *                                    update
> + *
> + * RETURN:      Status
> + *
> + * DESCRIPTION: Update _OSI interface strings, disabling or enabling OS vendor
> + *              strings or/and feature group strings.
> + *              Caller MUST hold AcpiGbl_OsiMutex
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AcpiUtUpdateInterfaces (
> +    UINT8                   Action)
> +{
> +    ACPI_INTERFACE_INFO     *NextInterface;
> +
> +
> +    NextInterface = AcpiGbl_SupportedInterfaces;
> +    while (NextInterface)
> +    {
> +        if (((NextInterface->Flags & ACPI_OSI_FEATURE) &&
> +             (Action & ACPI_FEATURE_STRINGS)) ||
> +            (!(NextInterface->Flags & ACPI_OSI_FEATURE) &&
> +             (Action & ACPI_VENDOR_STRINGS)))
> +        {
> +            if (Action & ACPI_DISABLE_INTERFACES)
> +            {
> +                /* Mark the interfaces as invalid */
> +
> +                NextInterface->Flags |= ACPI_OSI_INVALID;
> +            }
> +            else
> +            {
> +                /* Mark the interfaces as valid */
> +
> +                NextInterface->Flags &= ~ACPI_OSI_INVALID;
> +            }
> +        }
> +
> +        NextInterface = NextInterface->Next;
> +    }
> +
> +    return (AE_OK);
> +}
> +
> +
> +/*******************************************************************************
> + *
>   * FUNCTION:    AcpiUtGetInterface
>   *
>   * PARAMETERS:  InterfaceName       - The interface to find
> diff --git a/src/acpica/source/components/utilities/utxface.c b/src/acpica/source/components/utilities/utxface.c
> index f5e75ff..c1b3c46 100644
> --- a/src/acpica/source/components/utilities/utxface.c
> +++ b/src/acpica/source/components/utilities/utxface.c
> @@ -571,6 +571,40 @@ ACPI_EXPORT_SYMBOL (AcpiInstallInterfaceHandler)
>
>  /*****************************************************************************
>   *
> + * FUNCTION:    AcpiUpdateInterfaces
> + *
> + * PARAMETERS:  Action              - Actions to be performed during the
> + *                                    update
> + *
> + * RETURN:      Status
> + *
> + * DESCRIPTION: Update _OSI interface strings, disabling or enabling OS vendor
> + *              string or/and feature group strings.
> + *
> + ****************************************************************************/
> +
> +ACPI_STATUS
> +AcpiUpdateInterfaces (
> +    UINT8                   Action)
> +{
> +    ACPI_STATUS             Status;
> +
> +
> +    Status = AcpiOsAcquireMutex (AcpiGbl_OsiMutex, ACPI_WAIT_FOREVER);
> +    if (ACPI_FAILURE (Status))
> +    {
> +        return (Status);
> +    }
> +
> +    Status = AcpiUtUpdateInterfaces (Action);
> +
> +    AcpiOsReleaseMutex (AcpiGbl_OsiMutex);
> +    return (Status);
> +}
> +
> +
> +/*****************************************************************************
> + *
>   * FUNCTION:    AcpiCheckAddressRange
>   *
>   * PARAMETERS:  SpaceId             - Address space ID
> diff --git a/src/acpica/source/include/acglobal.h b/src/acpica/source/include/acglobal.h
> index 66abf13..9056b6d 100644
> --- a/src/acpica/source/include/acglobal.h
> +++ b/src/acpica/source/include/acglobal.h
> @@ -212,6 +212,12 @@ UINT8       ACPI_INIT_GLOBAL (AcpiGbl_DisableAutoRepair, FALSE);
>   */
>  UINT8       ACPI_INIT_GLOBAL (AcpiGbl_DisableSsdtTableLoad, FALSE);
>
> +/*
> + * We keep track of the latest version of Windows that has been requested by
> + * the BIOS.
> + */
> +UINT8       ACPI_INIT_GLOBAL (AcpiGbl_OsiData, 0);
> +
>
>  /* AcpiGbl_FADT is a local copy of the FADT, converted to a common format. */
>
> @@ -362,7 +368,6 @@ ACPI_EXTERN UINT8                       AcpiGbl_DebuggerConfiguration;
>  ACPI_EXTERN BOOLEAN                     AcpiGbl_StepToNextCall;
>  ACPI_EXTERN BOOLEAN                     AcpiGbl_AcpiHardwarePresent;
>  ACPI_EXTERN BOOLEAN                     AcpiGbl_EventsInitialized;
> -ACPI_EXTERN UINT8                       AcpiGbl_OsiData;
>  ACPI_EXTERN ACPI_INTERFACE_INFO        *AcpiGbl_SupportedInterfaces;
>  ACPI_EXTERN ACPI_ADDRESS_RANGE         *AcpiGbl_AddressRangeList[ACPI_ADDRESS_RANGE_MAX];
>
> diff --git a/src/acpica/source/include/aclocal.h b/src/acpica/source/include/aclocal.h
> index dbf5db6..e45b9f5 100644
> --- a/src/acpica/source/include/aclocal.h
> +++ b/src/acpica/source/include/aclocal.h
> @@ -1172,19 +1172,6 @@ typedef struct acpi_bit_register_info
>
>  /* Structs and definitions for _OSI support and I/O port validation */
>
> -#define ACPI_OSI_WIN_2000               0x01
> -#define ACPI_OSI_WIN_XP                 0x02
> -#define ACPI_OSI_WIN_XP_SP1             0x03
> -#define ACPI_OSI_WINSRV_2003            0x04
> -#define ACPI_OSI_WIN_XP_SP2             0x05
> -#define ACPI_OSI_WINSRV_2003_SP1        0x06
> -#define ACPI_OSI_WIN_VISTA              0x07
> -#define ACPI_OSI_WINSRV_2008            0x08
> -#define ACPI_OSI_WIN_VISTA_SP1          0x09
> -#define ACPI_OSI_WIN_VISTA_SP2          0x0A
> -#define ACPI_OSI_WIN_7                  0x0B
> -#define ACPI_OSI_WIN_8                  0x0C
> -
>  #define ACPI_ALWAYS_ILLEGAL             0x00
>
>  typedef struct acpi_interface_info
> @@ -1198,6 +1185,9 @@ typedef struct acpi_interface_info
>
>  #define ACPI_OSI_INVALID                0x01
>  #define ACPI_OSI_DYNAMIC                0x02
> +#define ACPI_OSI_FEATURE                0x04
> +#define ACPI_OSI_DEFAULT_INVALID        0x08
> +#define ACPI_OSI_OPTIONAL_FEATURE       (ACPI_OSI_FEATURE | ACPI_OSI_DEFAULT_INVALID | ACPI_OSI_INVALID)
>
>  typedef struct acpi_port_info
>  {
> @@ -1293,6 +1283,7 @@ typedef struct acpi_external_list
>      UINT8                       Type;
>      UINT8                       Flags;
>      BOOLEAN                     Resolved;
> +    BOOLEAN                     Emitted;
>
>  } ACPI_EXTERNAL_LIST;
>
> diff --git a/src/acpica/source/include/acnamesp.h b/src/acpica/source/include/acnamesp.h
> index 52e123c..74575ba 100644
> --- a/src/acpica/source/include/acnamesp.h
> +++ b/src/acpica/source/include/acnamesp.h
> @@ -189,8 +189,8 @@ AcpiNsWalkNamespace (
>      ACPI_HANDLE             StartObject,
>      UINT32                  MaxDepth,
>      UINT32                  Flags,
> -    ACPI_WALK_CALLBACK      PreOrderVisit,
> -    ACPI_WALK_CALLBACK      PostOrderVisit,
> +    ACPI_WALK_CALLBACK      DescendingCallback,
> +    ACPI_WALK_CALLBACK      AscendingCallback,
>      void                    *Context,
>      void                    **ReturnValue);
>
> diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h
> index 7042300..3971f57 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                 0x20130626
> +#define ACPI_CA_VERSION                 0x20130725
>
>  #include "acconfig.h"
>  #include "actypes.h"
> @@ -133,6 +133,7 @@ extern UINT32               AcpiCurrentGpeCount;
>  extern ACPI_TABLE_FADT      AcpiGbl_FADT;
>  extern BOOLEAN              AcpiGbl_SystemAwakeAndRunning;
>  extern BOOLEAN              AcpiGbl_ReducedHardware;        /* ACPI 5.0 */
> +extern UINT8                AcpiGbl_OsiData;
>
>  /* Runtime configuration of debug print levels */
>
> @@ -249,6 +250,10 @@ ACPI_STATUS
>  AcpiRemoveInterface (
>      ACPI_STRING             InterfaceName);
>
> +ACPI_STATUS
> +AcpiUpdateInterfaces (
> +    UINT8                   Action);
> +
>  UINT32
>  AcpiCheckAddressRange (
>      ACPI_ADR_SPACE_TYPE     SpaceId,
> @@ -340,8 +345,8 @@ AcpiWalkNamespace (
>      ACPI_OBJECT_TYPE        Type,
>      ACPI_HANDLE             StartObject,
>      UINT32                  MaxDepth,
> -    ACPI_WALK_CALLBACK      PreOrderVisit,
> -    ACPI_WALK_CALLBACK      PostOrderVisit,
> +    ACPI_WALK_CALLBACK      DescendingCallback,
> +    ACPI_WALK_CALLBACK      AscendingCallback,
>      void                    *Context,
>      void                    **ReturnValue);
>
> diff --git a/src/acpica/source/include/actables.h b/src/acpica/source/include/actables.h
> index dc1bb21..219f4c0 100644
> --- a/src/acpica/source/include/actables.h
> +++ b/src/acpica/source/include/actables.h
> @@ -124,6 +124,10 @@ AcpiAllocateRootTable (
>  /*
>   * tbxfroot - Root pointer utilities
>   */
> +ACPI_STATUS
> +AcpiTbValidateRsdp (
> +    ACPI_TABLE_RSDP         *Rsdp);
> +
>  UINT8 *
>  AcpiTbScanMemoryForRsdp (
>      UINT8                   *StartAddress,
> diff --git a/src/acpica/source/include/actypes.h b/src/acpica/source/include/actypes.h
> index 50d315b..efe1e91 100644
> --- a/src/acpica/source/include/actypes.h
> +++ b/src/acpica/source/include/actypes.h
> @@ -1316,4 +1316,32 @@ typedef struct acpi_memory_list
>  } ACPI_MEMORY_LIST;
>
>
> +/* Definitions of _OSI support */
> +
> +#define ACPI_VENDOR_STRINGS                 0x01
> +#define ACPI_FEATURE_STRINGS                0x02
> +#define ACPI_ENABLE_INTERFACES              0x00
> +#define ACPI_DISABLE_INTERFACES             0x04
> +
> +#define ACPI_DISABLE_ALL_VENDOR_STRINGS     (ACPI_DISABLE_INTERFACES | ACPI_VENDOR_STRINGS)
> +#define ACPI_DISABLE_ALL_FEATURE_STRINGS    (ACPI_DISABLE_INTERFACES | ACPI_FEATURE_STRINGS)
> +#define ACPI_DISABLE_ALL_STRINGS            (ACPI_DISABLE_INTERFACES | ACPI_VENDOR_STRINGS | ACPI_FEATURE_STRINGS)
> +#define ACPI_ENABLE_ALL_VENDOR_STRINGS      (ACPI_ENABLE_INTERFACES | ACPI_VENDOR_STRINGS)
> +#define ACPI_ENABLE_ALL_FEATURE_STRINGS     (ACPI_ENABLE_INTERFACES | ACPI_FEATURE_STRINGS)
> +#define ACPI_ENABLE_ALL_STRINGS             (ACPI_ENABLE_INTERFACES | ACPI_VENDOR_STRINGS | ACPI_FEATURE_STRINGS)
> +
> +#define ACPI_OSI_WIN_2000               0x01
> +#define ACPI_OSI_WIN_XP                 0x02
> +#define ACPI_OSI_WIN_XP_SP1             0x03
> +#define ACPI_OSI_WINSRV_2003            0x04
> +#define ACPI_OSI_WIN_XP_SP2             0x05
> +#define ACPI_OSI_WINSRV_2003_SP1        0x06
> +#define ACPI_OSI_WIN_VISTA              0x07
> +#define ACPI_OSI_WINSRV_2008            0x08
> +#define ACPI_OSI_WIN_VISTA_SP1          0x09
> +#define ACPI_OSI_WIN_VISTA_SP2          0x0A
> +#define ACPI_OSI_WIN_7                  0x0B
> +#define ACPI_OSI_WIN_8                  0x0C
> +
> +
>  #endif /* __ACTYPES_H__ */
> diff --git a/src/acpica/source/include/acutils.h b/src/acpica/source/include/acutils.h
> index 62442de..e6ae828 100644
> --- a/src/acpica/source/include/acutils.h
> +++ b/src/acpica/source/include/acutils.h
> @@ -742,6 +742,10 @@ ACPI_STATUS
>  AcpiUtRemoveInterface (
>      ACPI_STRING             InterfaceName);
>
> +ACPI_STATUS
> +AcpiUtUpdateInterfaces (
> +    UINT8                   Action);
> +
>  ACPI_INTERFACE_INFO *
>  AcpiUtGetInterface (
>      ACPI_STRING             InterfaceName);
> --
> 1.8.1.2
>

Acked-by: Keng-Yu Lin <kengyu@canonical.com>
diff mbox

Patch

diff --git a/src/acpica/source/common/dmextern.c b/src/acpica/source/common/dmextern.c
index 0cd094f..87aeddc 100644
--- a/src/acpica/source/common/dmextern.c
+++ b/src/acpica/source/common/dmextern.c
@@ -791,34 +791,54 @@  AcpiDmEmitExternals (
 
     AcpiDmUnresolvedWarning (1);
 
+    /* Emit any unresolved method externals in a single text block */
+
+    NextExternal = AcpiGbl_ExternalList;
+    while (NextExternal)
+    {
+        if ((NextExternal->Type == ACPI_TYPE_METHOD) &&
+            (!NextExternal->Resolved))
+        {
+            AcpiOsPrintf ("    External (%s%s",
+                NextExternal->Path,
+                AcpiDmGetObjectTypeName (NextExternal->Type));
+
+            AcpiOsPrintf (")    // Warning: Unresolved Method, "
+                "guessing %u arguments (may be incorrect, see warning above)\n",
+                NextExternal->Value);
+
+            NextExternal->Emitted = TRUE;
+        }
+
+        NextExternal = NextExternal->Next;
+    }
+
+    AcpiOsPrintf ("\n");
+
     /*
      * Walk the list of externals (unresolved references)
      * found during the AML parsing
      */
     while (AcpiGbl_ExternalList)
     {
-        AcpiOsPrintf ("    External (%s%s",
-            AcpiGbl_ExternalList->Path,
-            AcpiDmGetObjectTypeName (AcpiGbl_ExternalList->Type));
-
-        if (AcpiGbl_ExternalList->Type == ACPI_TYPE_METHOD)
+        if (!AcpiGbl_ExternalList->Emitted)
         {
-            if (AcpiGbl_ExternalList->Resolved)
+            AcpiOsPrintf ("    External (%s%s",
+                AcpiGbl_ExternalList->Path,
+                AcpiDmGetObjectTypeName (AcpiGbl_ExternalList->Type));
+
+            /* For methods, add a comment with the number of arguments */
+
+            if (AcpiGbl_ExternalList->Type == ACPI_TYPE_METHOD)
             {
                 AcpiOsPrintf (")    // %u Arguments\n",
                     AcpiGbl_ExternalList->Value);
             }
             else
             {
-                AcpiOsPrintf (")    // Warning: unresolved Method, "
-                    "assuming %u arguments (may be incorrect, see warning above)\n",
-                    AcpiGbl_ExternalList->Value);
+                AcpiOsPrintf (")\n");
             }
         }
-        else
-        {
-            AcpiOsPrintf (")\n");
-        }
 
         /* Free this external info block and move on to next external */
 
@@ -1003,5 +1023,4 @@  AcpiDmUnresolvedWarning (
                 (AcpiGbl_NumExternalMethods - AcpiGbl_ResolvedExternalMethods));
         }
     }
-
 }
diff --git a/src/acpica/source/compiler/asloffset.c b/src/acpica/source/compiler/asloffset.c
index 3c6551e..1c6911f 100644
--- a/src/acpica/source/compiler/asloffset.c
+++ b/src/acpica/source/compiler/asloffset.c
@@ -129,10 +129,12 @@  static void
 LsEmitOffsetTableEntry (
     UINT32                  FileId,
     ACPI_NAMESPACE_NODE     *Node,
+    UINT32                  NamepathOffset,
     UINT32                  Offset,
     char                    *OpName,
     UINT64                  Value,
-    UINT8                   AmlOpcode);
+    UINT8                   AmlOpcode,
+    UINT16                  ParentOpcode);
 
 
 /*******************************************************************************
@@ -166,7 +168,8 @@  LsAmlOffsetWalk (
     UINT32                  FileId = (UINT32) ACPI_TO_INTEGER (Context);
     ACPI_NAMESPACE_NODE     *Node;
     UINT32                  Length;
-    UINT32                  OffsetOfOpcode;
+    UINT32                  NamepathOffset;
+    UINT32                  DataOffset;
     ACPI_PARSE_OBJECT       *NextOp;
 
 
@@ -191,8 +194,9 @@  LsAmlOffsetWalk (
     if ((Node->Type == ACPI_TYPE_LOCAL_RESOURCE) &&
         (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC))
     {
-        LsEmitOffsetTableEntry (FileId, Node, Gbl_CurrentAmlOffset,
-            Op->Asl.ParseOpName, 0, Op->Asl.Extra);
+        LsEmitOffsetTableEntry (FileId, Node, 0, Gbl_CurrentAmlOffset,
+            Op->Asl.ParseOpName, 0, Op->Asl.Extra, AML_BUFFER_OP);
+
         Gbl_CurrentAmlOffset += Op->Asl.FinalAmlLength;
         return (AE_OK);
     }
@@ -210,22 +214,25 @@  LsAmlOffsetWalk (
         }
 
         Length = Op->Asl.FinalAmlLength;
+        NamepathOffset = Gbl_CurrentAmlOffset + Length;
 
         /* Get to the NameSeg/NamePath Op (and length of the name) */
 
         Op = Op->Asl.Child;
-        OffsetOfOpcode = Length + Op->Asl.FinalAmlLength;
+
+        /* Get offset of last nameseg and the actual data */
+
+        NamepathOffset = Gbl_CurrentAmlOffset + Length +
+            (Op->Asl.FinalAmlLength - ACPI_NAME_SIZE);
+
+        DataOffset = Gbl_CurrentAmlOffset + Length +
+            Op->Asl.FinalAmlLength;
 
         /* Get actual value associated with the name */
 
         Op = Op->Asl.Next;
         switch (Op->Asl.AmlOpcode)
         {
-        /*
-         * We are only interested in integer constants that can be changed
-         * at boot time. Note, the One/Ones/Zero opcodes are considered
-         * non-changeable, so we ignore them here.
-         */
         case AML_BYTE_OP:
         case AML_WORD_OP:
         case AML_DWORD_OP:
@@ -233,22 +240,32 @@  LsAmlOffsetWalk (
 
             /* The +1 is to handle the integer size prefix (opcode) */
 
-            LsEmitOffsetTableEntry (FileId, Node,
-                (Gbl_CurrentAmlOffset + OffsetOfOpcode + 1),
+            LsEmitOffsetTableEntry (FileId, Node, NamepathOffset, (DataOffset + 1),
                 Op->Asl.ParseOpName, Op->Asl.Value.Integer,
-                (UINT8) Op->Asl.AmlOpcode);
+                (UINT8) Op->Asl.AmlOpcode, AML_NAME_OP);
+            break;
+
+        case AML_ONE_OP:
+        case AML_ONES_OP:
+        case AML_ZERO_OP:
+
+            /* For these, offset will point to the opcode */
+
+            LsEmitOffsetTableEntry (FileId, Node, NamepathOffset, DataOffset,
+                Op->Asl.ParseOpName, Op->Asl.Value.Integer,
+                (UINT8) Op->Asl.AmlOpcode, AML_NAME_OP);
             break;
 
         case AML_PACKAGE_OP:
         case AML_VAR_PACKAGE_OP:
 
+            /* Get the package element count */
+
             NextOp = Op->Asl.Child;
 
-            LsEmitOffsetTableEntry (FileId, Node,
-                (Gbl_CurrentAmlOffset + OffsetOfOpcode),
-                Op->Asl.ParseOpName,
-                NextOp->Asl.Value.Integer,
-                (UINT8) Op->Asl.AmlOpcode);
+            LsEmitOffsetTableEntry (FileId, Node, NamepathOffset, DataOffset,
+                Op->Asl.ParseOpName, NextOp->Asl.Value.Integer,
+                (UINT8) Op->Asl.AmlOpcode, AML_NAME_OP);
             break;
 
          default:
@@ -267,7 +284,14 @@  LsAmlOffsetWalk (
         /* Get the name/namepath node */
 
         NextOp = Op->Asl.Child;
-        OffsetOfOpcode = Length + NextOp->Asl.FinalAmlLength + 1;
+
+        /* Get offset of last nameseg and the actual data */
+
+        NamepathOffset = Gbl_CurrentAmlOffset + Length +
+            (NextOp->Asl.FinalAmlLength - ACPI_NAME_SIZE);
+
+        DataOffset = Gbl_CurrentAmlOffset + Length +
+            (NextOp->Asl.FinalAmlLength + 1);
 
         /* Get the SpaceId node, then the Offset (address) node */
 
@@ -286,10 +310,9 @@  LsAmlOffsetWalk (
         case AML_DWORD_OP:
         case AML_QWORD_OP:
 
-            LsEmitOffsetTableEntry (FileId, Node,
-                (Gbl_CurrentAmlOffset + OffsetOfOpcode + 1),
+            LsEmitOffsetTableEntry (FileId, Node, NamepathOffset, (DataOffset + 1),
                 Op->Asl.ParseOpName, NextOp->Asl.Value.Integer,
-                (UINT8) NextOp->Asl.AmlOpcode);
+                (UINT8) NextOp->Asl.AmlOpcode, AML_REGION_OP);
 
             Gbl_CurrentAmlOffset += Length;
             return (AE_OK);
@@ -309,15 +332,62 @@  LsAmlOffsetWalk (
 
         NextOp = Op->Asl.Child;
 
-        /* Point to the *last* nameseg in the namepath */
+        /* Get offset of last nameseg and the actual data (flags byte) */
 
-        OffsetOfOpcode = NextOp->Asl.FinalAmlLength - ACPI_NAME_SIZE;
+        NamepathOffset = Gbl_CurrentAmlOffset + Length +
+            (NextOp->Asl.FinalAmlLength - ACPI_NAME_SIZE);
 
-        LsEmitOffsetTableEntry (FileId, Node,
-            (Gbl_CurrentAmlOffset + OffsetOfOpcode + Length),
-            Op->Asl.ParseOpName,
-            *((UINT32 *) &NextOp->Asl.Value.Buffer[OffsetOfOpcode]),
-            (UINT8) Op->Asl.AmlOpcode);
+        DataOffset = Gbl_CurrentAmlOffset + Length +
+            NextOp->Asl.FinalAmlLength;
+
+        /* Get the flags byte Op */
+
+        NextOp = NextOp->Asl.Next;
+
+        LsEmitOffsetTableEntry (FileId, Node, NamepathOffset, DataOffset,
+            Op->Asl.ParseOpName, NextOp->Asl.Value.Integer,
+            (UINT8) Op->Asl.AmlOpcode, AML_METHOD_OP);
+        break;
+
+    case AML_PROCESSOR_OP:
+
+        /* Processor (Namepath, ProcessorId, Address, Length) */
+
+        Length = Op->Asl.FinalAmlLength;
+        NextOp = Op->Asl.Child;     /* Get Namepath */
+
+        /* Get offset of last nameseg and the actual data (PBlock address) */
+
+        NamepathOffset = Gbl_CurrentAmlOffset + Length +
+            (NextOp->Asl.FinalAmlLength - ACPI_NAME_SIZE);
+
+        DataOffset = Gbl_CurrentAmlOffset + Length +
+            (NextOp->Asl.FinalAmlLength + 1);
+
+        NextOp = NextOp->Asl.Next;  /* Get ProcessorID (BYTE) */
+        NextOp = NextOp->Asl.Next;  /* Get Address (DWORD) */
+
+        LsEmitOffsetTableEntry (FileId, Node, NamepathOffset, DataOffset,
+            Op->Asl.ParseOpName, NextOp->Asl.Value.Integer,
+            (UINT8) AML_DWORD_OP, AML_PROCESSOR_OP);
+        break;
+
+    case AML_DEVICE_OP:
+    case AML_SCOPE_OP:
+    case AML_THERMAL_ZONE_OP:
+
+        /* Device/Scope/ThermalZone (Namepath) */
+
+        Length = Op->Asl.FinalAmlLength;
+        NextOp = Op->Asl.Child;     /* Get Namepath */
+
+        /* Get offset of last nameseg */
+
+        NamepathOffset = Gbl_CurrentAmlOffset + Length +
+            (NextOp->Asl.FinalAmlLength - ACPI_NAME_SIZE);
+
+        LsEmitOffsetTableEntry (FileId, Node, NamepathOffset, 0,
+            Op->Asl.ParseOpName, 0, (UINT8) 0, Op->Asl.AmlOpcode);
         break;
 
     default:
@@ -339,6 +409,7 @@  LsAmlOffsetWalk (
  *              OpName          - Name of the AML opcode
  *              Value           - Current value of the AML field
  *              AmlOpcode       - Opcode associated with the field
+ *              ObjectType      - ACPI object type
  *
  * RETURN:      None
  *
@@ -350,10 +421,12 @@  static void
 LsEmitOffsetTableEntry (
     UINT32                  FileId,
     ACPI_NAMESPACE_NODE     *Node,
+    UINT32                  NamepathOffset,
     UINT32                  Offset,
     char                    *OpName,
     UINT64                  Value,
-    UINT8                   AmlOpcode)
+    UINT8                   AmlOpcode,
+    UINT16                  ParentOpcode)
 {
     ACPI_BUFFER             TargetPath;
     ACPI_STATUS             Status;
@@ -380,8 +453,9 @@  LsEmitOffsetTableEntry (
      * Max Length for Integers is 8 bytes.
      */
     FlPrintFile (FileId,
-        "    {%-29s 0x%8.8X, 0x%2.2X, 0x%8.8X%8.8X}, /* %s */\n",
-        MsgBuffer, Offset, AmlOpcode, ACPI_FORMAT_UINT64 (Value), OpName);
+        "    {%-29s 0x%4.4X, 0x%8.8X, 0x%2.2X, 0x%8.8X, 0x%8.8X%8.8X}, /* %s */\n",
+        MsgBuffer, ParentOpcode, NamepathOffset, AmlOpcode,
+        Offset, ACPI_FORMAT_UINT64 (Value), OpName);
 }
 
 
@@ -407,10 +481,12 @@  LsDoOffsetTableHeader (
         "#define __AML_OFFSET_TABLE_H\n\n");
 
     FlPrintFile (FileId, "typedef struct {\n"
-        "    char                   *Pathname;\n"
-        "    unsigned long          Offset;\n"
-        "    unsigned char          Opcode;\n"
-        "    unsigned long long     Value;\n"
+        "    char                   *Pathname;      /* Full pathname (from root) to the object */\n"
+        "    unsigned short         ParentOpcode;   /* AML opcode for the parent object */\n"
+        "    unsigned long          NamesegOffset;  /* Offset of last nameseg in the parent namepath */\n"
+        "    unsigned char          Opcode;         /* AML opcode for the data */\n"
+        "    unsigned long          Offset;         /* Offset for the data */\n"
+        "    unsigned long long     Value;          /* Original value of the data (as applicable) */\n"
         "} AML_OFFSET_TABLE_ENTRY;\n\n");
 
     FlPrintFile (FileId,
@@ -418,29 +494,37 @@  LsDoOffsetTableHeader (
 
     FlPrintFile (FileId,
         "/*\n"
-        " * Information about supported object types:\n"
+        " * Information specific to the supported object types:\n"
         " *\n"
         " * Integers:\n"
-        " *    Offset points to the actual integer data\n"
         " *    Opcode is the integer prefix, indicates length of the data\n"
+        " *        (One of: BYTE, WORD, DWORD, QWORD, ZERO, ONE, ONES)\n"
+        " *    Offset points to the actual integer data\n"
         " *    Value is the existing value in the AML\n"
         " *\n"
         " * Packages:\n"
-        " *    Offset points to the package opcode\n"
         " *    Opcode is the package or var_package opcode\n"
-        " *    Value is the package element cound\n"
+        " *    Offset points to the package opcode\n"
+        " *    Value is the package element count\n"
         " *\n"
         " * Operation Regions:\n"
-        " *    Offset points to the region address data\n"
         " *    Opcode is the address integer prefix, indicates length of the data\n"
+        " *    Offset points to the region address\n"
         " *    Value is the existing address value in the AML\n"
         " *\n"
         " * Control Methods:\n"
-        " *    Offset points to the first byte of the namepath\n"
+        " *    Offset points to the method flags byte\n"
+        " *    Value is the existing flags value in the AML\n"
+        " *\n"
+        " * Processors:\n"
+        " *    Offset points to the first byte of the PBlock Address\n"
         " *\n"
         " * Resource Descriptors:\n"
-        " *    Offset points to the start of the descriptor\n"
         " *    Opcode is the descriptor type\n"
+        " *    Offset points to the start of the descriptor\n"
+        " *\n"
+        " * Scopes/Devices/ThermalZones:\n"
+        " *    Nameseg offset only\n"
         " */\n");
 
     FlPrintFile (FileId,
@@ -455,6 +539,6 @@  LsDoOffsetTableFooter (
 {
 
     FlPrintFile (FileId,
-        "    {0,0,0,0} /* Table terminator */\n};\n\n");
+        "    {NULL,0,0,0,0,0} /* Table terminator */\n};\n\n");
     Gbl_CurrentAmlOffset = 0;
 }
diff --git a/src/acpica/source/compiler/asloperands.c b/src/acpica/source/compiler/asloperands.c
index a9f08d0..1a85a9f 100644
--- a/src/acpica/source/compiler/asloperands.c
+++ b/src/acpica/source/compiler/asloperands.c
@@ -1043,12 +1043,15 @@  OpnDoDefinitionBlock (
         Gbl_TableId = AcpiOsAllocate (Length + 1);
         ACPI_STRCPY (Gbl_TableId, Child->Asl.Value.String);
 
+        /*
+         * Convert anything non-alphanumeric to an underscore. This
+         * allows us to use the TableID to generate unique C symbols.
+         */
         for (i = 0; i < Length; i++)
         {
-            if (Gbl_TableId[i] == ' ')
+            if (!isalnum ((int) Gbl_TableId[i]))
             {
-                Gbl_TableId[i] = 0;
-                break;
+                Gbl_TableId[i] = '_';
             }
         }
     }
diff --git a/src/acpica/source/compiler/dttemplate.c b/src/acpica/source/compiler/dttemplate.c
index 53cc34c..bdcad38 100644
--- a/src/acpica/source/compiler/dttemplate.c
+++ b/src/acpica/source/compiler/dttemplate.c
@@ -189,13 +189,21 @@  DtCreateTemplates (
 
 
     AslInitializeGlobals ();
-    AcpiUtStrupr (Signature);
 
-    /* Create all known templates if requested */
+    /* Default (no signature) is DSDT */
+
+    if (!Signature)
+    {
+        Signature = "DSDT";
+        goto GetTemplate;
+    }
 
-    if (!ACPI_STRNCMP (Signature, "ALL", 3) ||
+    AcpiUtStrupr (Signature);
+    if (!ACPI_STRCMP (Signature, "ALL") ||
         !ACPI_STRCMP (Signature, "*"))
     {
+        /* Create all available/known templates */
+
         Status = DtCreateAllTemplates ();
         return (Status);
     }
@@ -208,7 +216,9 @@  DtCreateTemplates (
      */
     if (strlen (Signature) != ACPI_NAME_SIZE)
     {
-        fprintf (stderr, "%s, Invalid ACPI table signature\n", Signature);
+        fprintf (stderr,
+            "%s: Invalid ACPI table signature (length must be 4 characters)\n",
+            Signature);
         return (AE_ERROR);
     }
 
@@ -225,19 +235,20 @@  DtCreateTemplates (
         Signature = "FACP";
     }
 
+GetTemplate:
     TableData = AcpiDmGetTableData (Signature);
     if (TableData)
     {
         if (!TableData->Template)
         {
-            fprintf (stderr, "%4.4s, No template available\n", Signature);
+            fprintf (stderr, "%4.4s: No template available\n", Signature);
             return (AE_ERROR);
         }
     }
     else if (!AcpiUtIsSpecialTable (Signature))
     {
         fprintf (stderr,
-            "%4.4s, Unrecognized ACPI table signature\n", Signature);
+            "%4.4s: Unrecognized ACPI table signature\n", Signature);
         return (AE_ERROR);
     }
 
diff --git a/src/acpica/source/components/executer/exoparg1.c b/src/acpica/source/components/executer/exoparg1.c
index ee6ffc1..8bde71a 100644
--- a/src/acpica/source/components/executer/exoparg1.c
+++ b/src/acpica/source/components/executer/exoparg1.c
@@ -1081,10 +1081,17 @@  AcpiExOpcode_1A_0T_1R (
                      * add another reference to the referenced object, however.
                      */
                     ReturnDesc = *(Operand[0]->Reference.Where);
-                    if (ReturnDesc)
+                    if (!ReturnDesc)
                     {
-                        AcpiUtAddReference (ReturnDesc);
+                        /*
+                         * Element is NULL, do not allow the dereference.
+                         * This provides compatibility with other ACPI
+                         * implementations.
+                         */
+                        return_ACPI_STATUS (AE_AML_UNINITIALIZED_ELEMENT);
                     }
+
+                    AcpiUtAddReference (ReturnDesc);
                     break;
 
                 default:
@@ -1102,15 +1109,44 @@  AcpiExOpcode_1A_0T_1R (
                 ReturnDesc = Operand[0]->Reference.Object;
 
                 if (ACPI_GET_DESCRIPTOR_TYPE (ReturnDesc) ==
-                        ACPI_DESC_TYPE_NAMED)
+                    ACPI_DESC_TYPE_NAMED)
                 {
                     ReturnDesc = AcpiNsGetAttachedObject (
-                                    (ACPI_NAMESPACE_NODE *) ReturnDesc);
-                }
+                        (ACPI_NAMESPACE_NODE *) ReturnDesc);
+                    if (!ReturnDesc)
+                    {
+                        break;
+                    }
 
-                /* Add another reference to the object! */
+                   /*
+                    * June 2013:
+                    * BufferFields/FieldUnits require additional resolution
+                    */
+                    switch (ReturnDesc->Common.Type)
+                    {
+                    case ACPI_TYPE_BUFFER_FIELD:
+                    case ACPI_TYPE_LOCAL_REGION_FIELD:
+                    case ACPI_TYPE_LOCAL_BANK_FIELD:
+                    case ACPI_TYPE_LOCAL_INDEX_FIELD:
 
-                AcpiUtAddReference (ReturnDesc);
+                        Status = AcpiExReadDataFromField (WalkState,
+                            ReturnDesc, &TempDesc);
+                        if (ACPI_FAILURE (Status))
+                        {
+                            goto Cleanup;
+                        }
+
+                        ReturnDesc = TempDesc;
+                        break;
+
+                    default:
+
+                        /* Add another reference to the object */
+
+                        AcpiUtAddReference (ReturnDesc);
+                        break;
+                    }
+                }
                 break;
 
             default:
diff --git a/src/acpica/source/components/namespace/nspredef.c b/src/acpica/source/components/namespace/nspredef.c
index e7bc55b..15ba35e 100644
--- a/src/acpica/source/components/namespace/nspredef.c
+++ b/src/acpica/source/components/namespace/nspredef.c
@@ -237,11 +237,16 @@  AcpiNsCheckReturnValue (
         goto Exit;
     }
 
+    /*
+     *
+     * 4) If there is no return value and it is optional, just return
+     * AE_OK (_WAK).
+     */
     if (!(*ReturnObjectPtr))
     {
-        Status = AE_AML_NO_RETURN_VALUE;
         goto Exit;
     }
+
     /*
      * For returned Package objects, check the type of all sub-objects.
      * Note: Package may have been newly created by call above.
@@ -370,7 +375,13 @@  TypeErrorExit:
 
     AcpiUtGetExpectedReturnTypes (TypeBuffer, ExpectedBtypes);
 
-    if (PackageIndex == ACPI_NOT_PACKAGE_ELEMENT)
+    if (!ReturnObject)
+    {
+        ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
+            "Expected return object of type %s",
+            TypeBuffer));
+    }
+    else if (PackageIndex == ACPI_NOT_PACKAGE_ELEMENT)
     {
         ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
             "Return type mismatch - found %s, expected %s",
diff --git a/src/acpica/source/components/namespace/nswalk.c b/src/acpica/source/components/namespace/nswalk.c
index 1084a02..20b1b32 100644
--- a/src/acpica/source/components/namespace/nswalk.c
+++ b/src/acpica/source/components/namespace/nswalk.c
@@ -237,9 +237,9 @@  AcpiNsGetNextNodeTyped (
  *              MaxDepth            - Depth to which search is to reach
  *              Flags               - Whether to unlock the NS before invoking
  *                                    the callback routine
- *              PreOrderVisit       - Called during tree pre-order visit
+ *              DescendingCallback  - Called during tree descent
  *                                    when an object of "Type" is found
- *              PostOrderVisit      - Called during tree post-order visit
+ *              AscendingCallback   - Called during tree ascent
  *                                    when an object of "Type" is found
  *              Context             - Passed to user function(s) above
  *              ReturnValue         - from the UserFunction if terminated
@@ -267,8 +267,8 @@  AcpiNsWalkNamespace (
     ACPI_HANDLE             StartNode,
     UINT32                  MaxDepth,
     UINT32                  Flags,
-    ACPI_WALK_CALLBACK      PreOrderVisit,
-    ACPI_WALK_CALLBACK      PostOrderVisit,
+    ACPI_WALK_CALLBACK      DescendingCallback,
+    ACPI_WALK_CALLBACK      AscendingCallback,
     void                    *Context,
     void                    **ReturnValue)
 {
@@ -346,22 +346,22 @@  AcpiNsWalkNamespace (
             }
 
             /*
-             * Invoke the user function, either pre-order or post-order
+             * Invoke the user function, either descending, ascending,
              * or both.
              */
             if (!NodePreviouslyVisited)
             {
-                if (PreOrderVisit)
+                if (DescendingCallback)
                 {
-                    Status = PreOrderVisit (ChildNode, Level,
+                    Status = DescendingCallback (ChildNode, Level,
                                 Context, ReturnValue);
                 }
             }
             else
             {
-                if (PostOrderVisit)
+                if (AscendingCallback)
                 {
-                    Status = PostOrderVisit (ChildNode, Level,
+                    Status = AscendingCallback (ChildNode, Level,
                                 Context, ReturnValue);
                 }
             }
diff --git a/src/acpica/source/components/namespace/nsxfeval.c b/src/acpica/source/components/namespace/nsxfeval.c
index 901a931..650b774 100644
--- a/src/acpica/source/components/namespace/nsxfeval.c
+++ b/src/acpica/source/components/namespace/nsxfeval.c
@@ -646,9 +646,9 @@  AcpiNsResolveReferences (
  * PARAMETERS:  Type                - ACPI_OBJECT_TYPE to search for
  *              StartObject         - Handle in namespace where search begins
  *              MaxDepth            - Depth to which search is to reach
- *              PreOrderVisit       - Called during tree pre-order visit
+ *              DescendingCallback  - Called during tree descent
  *                                    when an object of "Type" is found
- *              PostOrderVisit      - Called during tree post-order visit
+ *              AscendingCallback   - Called during tree ascent
  *                                    when an object of "Type" is found
  *              Context             - Passed to user function(s) above
  *              ReturnValue         - Location where return value of
@@ -677,8 +677,8 @@  AcpiWalkNamespace (
     ACPI_OBJECT_TYPE        Type,
     ACPI_HANDLE             StartObject,
     UINT32                  MaxDepth,
-    ACPI_WALK_CALLBACK      PreOrderVisit,
-    ACPI_WALK_CALLBACK      PostOrderVisit,
+    ACPI_WALK_CALLBACK      DescendingCallback,
+    ACPI_WALK_CALLBACK      AscendingCallback,
     void                    *Context,
     void                    **ReturnValue)
 {
@@ -692,7 +692,7 @@  AcpiWalkNamespace (
 
     if ((Type > ACPI_TYPE_LOCAL_MAX) ||
         (!MaxDepth)                  ||
-        (!PreOrderVisit && !PostOrderVisit))
+        (!DescendingCallback && !AscendingCallback))
     {
         return_ACPI_STATUS (AE_BAD_PARAMETER);
     }
@@ -727,8 +727,8 @@  AcpiWalkNamespace (
     }
 
     Status = AcpiNsWalkNamespace (Type, StartObject, MaxDepth,
-                ACPI_NS_WALK_UNLOCK, PreOrderVisit,
-                PostOrderVisit, Context, ReturnValue);
+                ACPI_NS_WALK_UNLOCK, DescendingCallback,
+                AscendingCallback, Context, ReturnValue);
 
     (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
 
diff --git a/src/acpica/source/components/tables/tbfadt.c b/src/acpica/source/components/tables/tbfadt.c
index 7e00831..d90baba 100644
--- a/src/acpica/source/components/tables/tbfadt.c
+++ b/src/acpica/source/components/tables/tbfadt.c
@@ -204,7 +204,7 @@  static ACPI_FADT_INFO     FadtInfoTable[] =
         ACPI_FADT_OFFSET (PmTimerBlock),
         ACPI_FADT_OFFSET (PmTimerLength),
         ACPI_PM_TIMER_WIDTH,
-        ACPI_FADT_REQUIRED},
+        ACPI_FADT_SEPARATE_LENGTH},         /* ACPI 5.0A: Timer is optional */
 
     {"Gpe0Block",
         ACPI_FADT_OFFSET (XGpe0Block),
@@ -678,7 +678,7 @@  AcpiTbValidateFadt (
         if (FadtInfoTable[i].Type & ACPI_FADT_REQUIRED)
         {
             /*
-             * Field is required (PM1aEvent, PM1aControl, PmTimer).
+             * Field is required (PM1aEvent, PM1aControl).
              * Both the address and length must be non-zero.
              */
             if (!Address64->Address || !Length)
diff --git a/src/acpica/source/components/tables/tbxfroot.c b/src/acpica/source/components/tables/tbxfroot.c
index 7e6a620..b9db205 100644
--- a/src/acpica/source/components/tables/tbxfroot.c
+++ b/src/acpica/source/components/tables/tbxfroot.c
@@ -123,12 +123,6 @@ 
 #define _COMPONENT          ACPI_TABLES
         ACPI_MODULE_NAME    ("tbxfroot")
 
-/* Local prototypes */
-
-static ACPI_STATUS
-AcpiTbValidateRsdp (
-    ACPI_TABLE_RSDP         *Rsdp);
-
 
 /*******************************************************************************
  *
@@ -142,7 +136,7 @@  AcpiTbValidateRsdp (
  *
  ******************************************************************************/
 
-static ACPI_STATUS
+ACPI_STATUS
 AcpiTbValidateRsdp (
     ACPI_TABLE_RSDP         *Rsdp)
 {
@@ -153,7 +147,7 @@  AcpiTbValidateRsdp (
      * Note: Sometimes there exists more than one RSDP in memory; the valid
      * RSDP has a valid checksum, all others have an invalid checksum.
      */
-    if (ACPI_STRNCMP ((char *) Rsdp, ACPI_SIG_RSDP,
+    if (ACPI_STRNCMP ((char *) Rsdp->Signature, ACPI_SIG_RSDP,
             sizeof (ACPI_SIG_RSDP)-1) != 0)
     {
         /* Nope, BAD Signature */
diff --git a/src/acpica/source/components/utilities/utglobal.c b/src/acpica/source/components/utilities/utglobal.c
index 330b86b..1ce7610 100644
--- a/src/acpica/source/components/utilities/utglobal.c
+++ b/src/acpica/source/components/utilities/utglobal.c
@@ -391,7 +391,6 @@  AcpiUtInitGlobals (
     AcpiGbl_TraceDbgLayer               = 0;
     AcpiGbl_DebuggerConfiguration       = DEBUGGER_THREADING;
     AcpiGbl_DbOutputFlags               = ACPI_DB_CONSOLE_OUTPUT;
-    AcpiGbl_OsiData                     = 0;
     AcpiGbl_OsiMutex                    = NULL;
     AcpiGbl_RegMethodsExecuted          = FALSE;
 
diff --git a/src/acpica/source/components/utilities/utosi.c b/src/acpica/source/components/utilities/utosi.c
index cda1bfe..55a1d92 100644
--- a/src/acpica/source/components/utilities/utosi.c
+++ b/src/acpica/source/components/utilities/utosi.c
@@ -153,21 +153,20 @@  static ACPI_INTERFACE_INFO    AcpiDefaultSupportedInterfaces[] =
 
     /* Feature Group Strings */
 
-    {"Extended Address Space Descriptor", NULL, 0, 0}
+    {"Extended Address Space Descriptor", NULL, ACPI_OSI_FEATURE, 0},
 
     /*
      * All "optional" feature group strings (features that are implemented
-     * by the host) should be dynamically added by the host via
-     * AcpiInstallInterface and should not be manually added here.
-     *
-     * Examples of optional feature group strings:
-     *
-     * "Module Device"
-     * "Processor Device"
-     * "3.0 Thermal Model"
-     * "3.0 _SCP Extensions"
-     * "Processor Aggregator Device"
+     * by the host) should be dynamically modified to VALID by the host via
+     * AcpiInstallInterface or AcpiUpdateInterfaces. Such optional feature
+     * group strings are set as INVALID by default here.
      */
+
+    {"Module Device",               NULL, ACPI_OSI_OPTIONAL_FEATURE, 0},
+    {"Processor Device",            NULL, ACPI_OSI_OPTIONAL_FEATURE, 0},
+    {"3.0 Thermal Model",           NULL, ACPI_OSI_OPTIONAL_FEATURE, 0},
+    {"3.0 _SCP Extensions",         NULL, ACPI_OSI_OPTIONAL_FEATURE, 0},
+    {"Processor Aggregator Device", NULL, ACPI_OSI_OPTIONAL_FEATURE, 0}
 };
 
 
@@ -244,13 +243,26 @@  AcpiUtInterfaceTerminate (
     {
         AcpiGbl_SupportedInterfaces = NextInterface->Next;
 
-        /* Only interfaces added at runtime can be freed */
-
         if (NextInterface->Flags & ACPI_OSI_DYNAMIC)
         {
+            /* Only interfaces added at runtime can be freed */
+
             ACPI_FREE (NextInterface->Name);
             ACPI_FREE (NextInterface);
         }
+        else
+        {
+            /* Interface is in static list. Reset it to invalid or valid. */
+
+            if (NextInterface->Flags & ACPI_OSI_DEFAULT_INVALID)
+            {
+                NextInterface->Flags |= ACPI_OSI_INVALID;
+            }
+            else
+            {
+                NextInterface->Flags &= ~ACPI_OSI_INVALID;
+            }
+        }
 
         NextInterface = AcpiGbl_SupportedInterfaces;
     }
@@ -379,6 +391,57 @@  AcpiUtRemoveInterface (
 
 /*******************************************************************************
  *
+ * FUNCTION:    AcpiUtUpdateInterfaces
+ *
+ * PARAMETERS:  Action              - Actions to be performed during the
+ *                                    update
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Update _OSI interface strings, disabling or enabling OS vendor
+ *              strings or/and feature group strings.
+ *              Caller MUST hold AcpiGbl_OsiMutex
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtUpdateInterfaces (
+    UINT8                   Action)
+{
+    ACPI_INTERFACE_INFO     *NextInterface;
+
+
+    NextInterface = AcpiGbl_SupportedInterfaces;
+    while (NextInterface)
+    {
+        if (((NextInterface->Flags & ACPI_OSI_FEATURE) &&
+             (Action & ACPI_FEATURE_STRINGS)) ||
+            (!(NextInterface->Flags & ACPI_OSI_FEATURE) &&
+             (Action & ACPI_VENDOR_STRINGS)))
+        {
+            if (Action & ACPI_DISABLE_INTERFACES)
+            {
+                /* Mark the interfaces as invalid */
+
+                NextInterface->Flags |= ACPI_OSI_INVALID;
+            }
+            else
+            {
+                /* Mark the interfaces as valid */
+
+                NextInterface->Flags &= ~ACPI_OSI_INVALID;
+            }
+        }
+
+        NextInterface = NextInterface->Next;
+    }
+
+    return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
  * FUNCTION:    AcpiUtGetInterface
  *
  * PARAMETERS:  InterfaceName       - The interface to find
diff --git a/src/acpica/source/components/utilities/utxface.c b/src/acpica/source/components/utilities/utxface.c
index f5e75ff..c1b3c46 100644
--- a/src/acpica/source/components/utilities/utxface.c
+++ b/src/acpica/source/components/utilities/utxface.c
@@ -571,6 +571,40 @@  ACPI_EXPORT_SYMBOL (AcpiInstallInterfaceHandler)
 
 /*****************************************************************************
  *
+ * FUNCTION:    AcpiUpdateInterfaces
+ *
+ * PARAMETERS:  Action              - Actions to be performed during the
+ *                                    update
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Update _OSI interface strings, disabling or enabling OS vendor
+ *              string or/and feature group strings.
+ *
+ ****************************************************************************/
+
+ACPI_STATUS
+AcpiUpdateInterfaces (
+    UINT8                   Action)
+{
+    ACPI_STATUS             Status;
+
+
+    Status = AcpiOsAcquireMutex (AcpiGbl_OsiMutex, ACPI_WAIT_FOREVER);
+    if (ACPI_FAILURE (Status))
+    {
+        return (Status);
+    }
+
+    Status = AcpiUtUpdateInterfaces (Action);
+
+    AcpiOsReleaseMutex (AcpiGbl_OsiMutex);
+    return (Status);
+}
+
+
+/*****************************************************************************
+ *
  * FUNCTION:    AcpiCheckAddressRange
  *
  * PARAMETERS:  SpaceId             - Address space ID
diff --git a/src/acpica/source/include/acglobal.h b/src/acpica/source/include/acglobal.h
index 66abf13..9056b6d 100644
--- a/src/acpica/source/include/acglobal.h
+++ b/src/acpica/source/include/acglobal.h
@@ -212,6 +212,12 @@  UINT8       ACPI_INIT_GLOBAL (AcpiGbl_DisableAutoRepair, FALSE);
  */
 UINT8       ACPI_INIT_GLOBAL (AcpiGbl_DisableSsdtTableLoad, FALSE);
 
+/*
+ * We keep track of the latest version of Windows that has been requested by
+ * the BIOS.
+ */
+UINT8       ACPI_INIT_GLOBAL (AcpiGbl_OsiData, 0);
+
 
 /* AcpiGbl_FADT is a local copy of the FADT, converted to a common format. */
 
@@ -362,7 +368,6 @@  ACPI_EXTERN UINT8                       AcpiGbl_DebuggerConfiguration;
 ACPI_EXTERN BOOLEAN                     AcpiGbl_StepToNextCall;
 ACPI_EXTERN BOOLEAN                     AcpiGbl_AcpiHardwarePresent;
 ACPI_EXTERN BOOLEAN                     AcpiGbl_EventsInitialized;
-ACPI_EXTERN UINT8                       AcpiGbl_OsiData;
 ACPI_EXTERN ACPI_INTERFACE_INFO        *AcpiGbl_SupportedInterfaces;
 ACPI_EXTERN ACPI_ADDRESS_RANGE         *AcpiGbl_AddressRangeList[ACPI_ADDRESS_RANGE_MAX];
 
diff --git a/src/acpica/source/include/aclocal.h b/src/acpica/source/include/aclocal.h
index dbf5db6..e45b9f5 100644
--- a/src/acpica/source/include/aclocal.h
+++ b/src/acpica/source/include/aclocal.h
@@ -1172,19 +1172,6 @@  typedef struct acpi_bit_register_info
 
 /* Structs and definitions for _OSI support and I/O port validation */
 
-#define ACPI_OSI_WIN_2000               0x01
-#define ACPI_OSI_WIN_XP                 0x02
-#define ACPI_OSI_WIN_XP_SP1             0x03
-#define ACPI_OSI_WINSRV_2003            0x04
-#define ACPI_OSI_WIN_XP_SP2             0x05
-#define ACPI_OSI_WINSRV_2003_SP1        0x06
-#define ACPI_OSI_WIN_VISTA              0x07
-#define ACPI_OSI_WINSRV_2008            0x08
-#define ACPI_OSI_WIN_VISTA_SP1          0x09
-#define ACPI_OSI_WIN_VISTA_SP2          0x0A
-#define ACPI_OSI_WIN_7                  0x0B
-#define ACPI_OSI_WIN_8                  0x0C
-
 #define ACPI_ALWAYS_ILLEGAL             0x00
 
 typedef struct acpi_interface_info
@@ -1198,6 +1185,9 @@  typedef struct acpi_interface_info
 
 #define ACPI_OSI_INVALID                0x01
 #define ACPI_OSI_DYNAMIC                0x02
+#define ACPI_OSI_FEATURE                0x04
+#define ACPI_OSI_DEFAULT_INVALID        0x08
+#define ACPI_OSI_OPTIONAL_FEATURE       (ACPI_OSI_FEATURE | ACPI_OSI_DEFAULT_INVALID | ACPI_OSI_INVALID)
 
 typedef struct acpi_port_info
 {
@@ -1293,6 +1283,7 @@  typedef struct acpi_external_list
     UINT8                       Type;
     UINT8                       Flags;
     BOOLEAN                     Resolved;
+    BOOLEAN                     Emitted;
 
 } ACPI_EXTERNAL_LIST;
 
diff --git a/src/acpica/source/include/acnamesp.h b/src/acpica/source/include/acnamesp.h
index 52e123c..74575ba 100644
--- a/src/acpica/source/include/acnamesp.h
+++ b/src/acpica/source/include/acnamesp.h
@@ -189,8 +189,8 @@  AcpiNsWalkNamespace (
     ACPI_HANDLE             StartObject,
     UINT32                  MaxDepth,
     UINT32                  Flags,
-    ACPI_WALK_CALLBACK      PreOrderVisit,
-    ACPI_WALK_CALLBACK      PostOrderVisit,
+    ACPI_WALK_CALLBACK      DescendingCallback,
+    ACPI_WALK_CALLBACK      AscendingCallback,
     void                    *Context,
     void                    **ReturnValue);
 
diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h
index 7042300..3971f57 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                 0x20130626
+#define ACPI_CA_VERSION                 0x20130725
 
 #include "acconfig.h"
 #include "actypes.h"
@@ -133,6 +133,7 @@  extern UINT32               AcpiCurrentGpeCount;
 extern ACPI_TABLE_FADT      AcpiGbl_FADT;
 extern BOOLEAN              AcpiGbl_SystemAwakeAndRunning;
 extern BOOLEAN              AcpiGbl_ReducedHardware;        /* ACPI 5.0 */
+extern UINT8                AcpiGbl_OsiData;
 
 /* Runtime configuration of debug print levels */
 
@@ -249,6 +250,10 @@  ACPI_STATUS
 AcpiRemoveInterface (
     ACPI_STRING             InterfaceName);
 
+ACPI_STATUS
+AcpiUpdateInterfaces (
+    UINT8                   Action);
+
 UINT32
 AcpiCheckAddressRange (
     ACPI_ADR_SPACE_TYPE     SpaceId,
@@ -340,8 +345,8 @@  AcpiWalkNamespace (
     ACPI_OBJECT_TYPE        Type,
     ACPI_HANDLE             StartObject,
     UINT32                  MaxDepth,
-    ACPI_WALK_CALLBACK      PreOrderVisit,
-    ACPI_WALK_CALLBACK      PostOrderVisit,
+    ACPI_WALK_CALLBACK      DescendingCallback,
+    ACPI_WALK_CALLBACK      AscendingCallback,
     void                    *Context,
     void                    **ReturnValue);
 
diff --git a/src/acpica/source/include/actables.h b/src/acpica/source/include/actables.h
index dc1bb21..219f4c0 100644
--- a/src/acpica/source/include/actables.h
+++ b/src/acpica/source/include/actables.h
@@ -124,6 +124,10 @@  AcpiAllocateRootTable (
 /*
  * tbxfroot - Root pointer utilities
  */
+ACPI_STATUS
+AcpiTbValidateRsdp (
+    ACPI_TABLE_RSDP         *Rsdp);
+
 UINT8 *
 AcpiTbScanMemoryForRsdp (
     UINT8                   *StartAddress,
diff --git a/src/acpica/source/include/actypes.h b/src/acpica/source/include/actypes.h
index 50d315b..efe1e91 100644
--- a/src/acpica/source/include/actypes.h
+++ b/src/acpica/source/include/actypes.h
@@ -1316,4 +1316,32 @@  typedef struct acpi_memory_list
 } ACPI_MEMORY_LIST;
 
 
+/* Definitions of _OSI support */
+
+#define ACPI_VENDOR_STRINGS                 0x01
+#define ACPI_FEATURE_STRINGS                0x02
+#define ACPI_ENABLE_INTERFACES              0x00
+#define ACPI_DISABLE_INTERFACES             0x04
+
+#define ACPI_DISABLE_ALL_VENDOR_STRINGS     (ACPI_DISABLE_INTERFACES | ACPI_VENDOR_STRINGS)
+#define ACPI_DISABLE_ALL_FEATURE_STRINGS    (ACPI_DISABLE_INTERFACES | ACPI_FEATURE_STRINGS)
+#define ACPI_DISABLE_ALL_STRINGS            (ACPI_DISABLE_INTERFACES | ACPI_VENDOR_STRINGS | ACPI_FEATURE_STRINGS)
+#define ACPI_ENABLE_ALL_VENDOR_STRINGS      (ACPI_ENABLE_INTERFACES | ACPI_VENDOR_STRINGS)
+#define ACPI_ENABLE_ALL_FEATURE_STRINGS     (ACPI_ENABLE_INTERFACES | ACPI_FEATURE_STRINGS)
+#define ACPI_ENABLE_ALL_STRINGS             (ACPI_ENABLE_INTERFACES | ACPI_VENDOR_STRINGS | ACPI_FEATURE_STRINGS)
+
+#define ACPI_OSI_WIN_2000               0x01
+#define ACPI_OSI_WIN_XP                 0x02
+#define ACPI_OSI_WIN_XP_SP1             0x03
+#define ACPI_OSI_WINSRV_2003            0x04
+#define ACPI_OSI_WIN_XP_SP2             0x05
+#define ACPI_OSI_WINSRV_2003_SP1        0x06
+#define ACPI_OSI_WIN_VISTA              0x07
+#define ACPI_OSI_WINSRV_2008            0x08
+#define ACPI_OSI_WIN_VISTA_SP1          0x09
+#define ACPI_OSI_WIN_VISTA_SP2          0x0A
+#define ACPI_OSI_WIN_7                  0x0B
+#define ACPI_OSI_WIN_8                  0x0C
+
+
 #endif /* __ACTYPES_H__ */
diff --git a/src/acpica/source/include/acutils.h b/src/acpica/source/include/acutils.h
index 62442de..e6ae828 100644
--- a/src/acpica/source/include/acutils.h
+++ b/src/acpica/source/include/acutils.h
@@ -742,6 +742,10 @@  ACPI_STATUS
 AcpiUtRemoveInterface (
     ACPI_STRING             InterfaceName);
 
+ACPI_STATUS
+AcpiUtUpdateInterfaces (
+    UINT8                   Action);
+
 ACPI_INTERFACE_INFO *
 AcpiUtGetInterface (
     ACPI_STRING             InterfaceName);