diff mbox series

ACPICA: Update to version 20170831

Message ID 20170831175104.31118-1-colin.king@canonical.com
State Accepted
Headers show
Series ACPICA: Update to version 20170831 | expand

Commit Message

Colin Ian King Aug. 31, 2017, 5:51 p.m. UTC
From: Colin Ian King <colin.king@canonical.com>

Changes in this release of ACPICA are detailed at the following
link on the ACPICA developer mailing list:

    https://lists.acpica.org/pipermail/devel/2017-August/001436.html

Signed-off-by: Colin Ian King <colin.king@canonical.com>
---
 src/acpica/Makefile.am                             |   1 +
 src/acpica/source/common/dmtbinfo.c                |   2 +-
 src/acpica/source/compiler/aslcompiler.h           |   5 +
 src/acpica/source/compiler/aslcompiler.l           |   4 +-
 src/acpica/source/compiler/asldebug.c              |  87 ++-
 src/acpica/source/compiler/aslerror.c              |  20 +-
 src/acpica/source/compiler/aslmain.c               |   8 +-
 src/acpica/source/compiler/aslmessages.c           |   5 +-
 src/acpica/source/compiler/aslmessages.h           |   1 +
 src/acpica/source/compiler/aslresource.c           |   8 +
 src/acpica/source/compiler/aslrules.y              |   3 +-
 src/acpica/source/compiler/asltree.c               |  33 ++
 src/acpica/source/compiler/aslutils.c              |  17 +-
 src/acpica/source/compiler/dtcompile.c             |   2 +
 src/acpica/source/compiler/dtcompiler.h            |   4 +
 src/acpica/source/compiler/dtfield.c               |   8 +-
 src/acpica/source/compiler/dtparser.y              |  17 +-
 src/acpica/source/compiler/dtutils.c               |  32 ++
 src/acpica/source/compiler/prparser.y              |   4 +-
 src/acpica/source/components/debugger/dbconvert.c  |   4 +-
 .../source/components/disassembler/dmresrc.c       |  14 +
 src/acpica/source/components/dispatcher/dswexec.c  |   2 +-
 src/acpica/source/components/events/evgpe.c        |   6 +-
 src/acpica/source/components/executer/exconcat.c   |   2 +-
 src/acpica/source/components/executer/exconvrt.c   |  26 +-
 src/acpica/source/components/executer/exmisc.c     |   2 +-
 src/acpica/source/components/executer/exresop.c    |   2 +-
 src/acpica/source/components/hardware/hwgpe.c      |   4 +-
 src/acpica/source/components/hardware/hwregs.c     |  74 +--
 src/acpica/source/components/hardware/hwxface.c    | 130 +----
 src/acpica/source/components/namespace/nsconvert.c |   3 +-
 src/acpica/source/components/tables/tbxface.c      |   9 +-
 .../source/components/utilities/utstrsuppt.c       | 613 +++++++++++++++++++++
 .../source/components/utilities/utstrtoul64.c      | 472 ++++++++--------
 src/acpica/source/include/acexcep.h                |  12 +-
 src/acpica/source/include/achware.h                |   4 +-
 src/acpica/source/include/acinterp.h               |   5 +-
 src/acpica/source/include/acpixf.h                 |   2 +-
 src/acpica/source/include/actbl1.h                 |  46 +-
 src/acpica/source/include/actbl2.h                 |   1 +
 src/acpica/source/include/acutils.h                |  58 +-
 src/acpica/source/tools/acpiexec/aeinitfile.c      |   3 +-
 42 files changed, 1266 insertions(+), 489 deletions(-)
 create mode 100644 src/acpica/source/components/utilities/utstrsuppt.c

Comments

Alex Hung Aug. 31, 2017, 6:52 p.m. UTC | #1
On 2017-08-31 10:51 AM, Colin King wrote:
> From: Colin Ian King<colin.king@canonical.com>
> 
> Changes in this release of ACPICA are detailed at the following
> link on the ACPICA developer mailing list:
> 
>      https://lists.acpica.org/pipermail/devel/2017-August/001436.html
> 
> Signed-off-by: Colin Ian King<colin.king@canonical.com>
> ---
>   src/acpica/Makefile.am                             |   1 +
>   src/acpica/source/common/dmtbinfo.c                |   2 +-
>   src/acpica/source/compiler/aslcompiler.h           |   5 +
>   src/acpica/source/compiler/aslcompiler.l           |   4 +-
>   src/acpica/source/compiler/asldebug.c              |  87 ++-
>   src/acpica/source/compiler/aslerror.c              |  20 +-
>   src/acpica/source/compiler/aslmain.c               |   8 +-
>   src/acpica/source/compiler/aslmessages.c           |   5 +-
>   src/acpica/source/compiler/aslmessages.h           |   1 +
>   src/acpica/source/compiler/aslresource.c           |   8 +
>   src/acpica/source/compiler/aslrules.y              |   3 +-
>   src/acpica/source/compiler/asltree.c               |  33 ++
>   src/acpica/source/compiler/aslutils.c              |  17 +-
>   src/acpica/source/compiler/dtcompile.c             |   2 +
>   src/acpica/source/compiler/dtcompiler.h            |   4 +
>   src/acpica/source/compiler/dtfield.c               |   8 +-
>   src/acpica/source/compiler/dtparser.y              |  17 +-
>   src/acpica/source/compiler/dtutils.c               |  32 ++
>   src/acpica/source/compiler/prparser.y              |   4 +-
>   src/acpica/source/components/debugger/dbconvert.c  |   4 +-
>   .../source/components/disassembler/dmresrc.c       |  14 +
>   src/acpica/source/components/dispatcher/dswexec.c  |   2 +-
>   src/acpica/source/components/events/evgpe.c        |   6 +-
>   src/acpica/source/components/executer/exconcat.c   |   2 +-
>   src/acpica/source/components/executer/exconvrt.c   |  26 +-
>   src/acpica/source/components/executer/exmisc.c     |   2 +-
>   src/acpica/source/components/executer/exresop.c    |   2 +-
>   src/acpica/source/components/hardware/hwgpe.c      |   4 +-
>   src/acpica/source/components/hardware/hwregs.c     |  74 +--
>   src/acpica/source/components/hardware/hwxface.c    | 130 +----
>   src/acpica/source/components/namespace/nsconvert.c |   3 +-
>   src/acpica/source/components/tables/tbxface.c      |   9 +-
>   .../source/components/utilities/utstrsuppt.c       | 613 +++++++++++++++++++++
>   .../source/components/utilities/utstrtoul64.c      | 472 ++++++++--------
>   src/acpica/source/include/acexcep.h                |  12 +-
>   src/acpica/source/include/achware.h                |   4 +-
>   src/acpica/source/include/acinterp.h               |   5 +-
>   src/acpica/source/include/acpixf.h                 |   2 +-
>   src/acpica/source/include/actbl1.h                 |  46 +-
>   src/acpica/source/include/actbl2.h                 |   1 +
>   src/acpica/source/include/acutils.h                |  58 +-
>   src/acpica/source/tools/acpiexec/aeinitfile.c      |   3 +-
>   42 files changed, 1266 insertions(+), 489 deletions(-)
>   create mode 100644 src/acpica/source/components/utilities/utstrsuppt.c


Acked-by: Alex Hung <alex.hung@canonical.com>
Ivan Hu Sept. 6, 2017, 8:11 a.m. UTC | #2
On 09/01/2017 01:51 AM, Colin King wrote:
> From: Colin Ian King <colin.king@canonical.com>
> 
> Changes in this release of ACPICA are detailed at the following
> link on the ACPICA developer mailing list:
> 
>      https://lists.acpica.org/pipermail/devel/2017-August/001436.html
> 
> Signed-off-by: Colin Ian King <colin.king@canonical.com>
> ---
>   src/acpica/Makefile.am                             |   1 +
>   src/acpica/source/common/dmtbinfo.c                |   2 +-
>   src/acpica/source/compiler/aslcompiler.h           |   5 +
>   src/acpica/source/compiler/aslcompiler.l           |   4 +-
>   src/acpica/source/compiler/asldebug.c              |  87 ++-
>   src/acpica/source/compiler/aslerror.c              |  20 +-
>   src/acpica/source/compiler/aslmain.c               |   8 +-
>   src/acpica/source/compiler/aslmessages.c           |   5 +-
>   src/acpica/source/compiler/aslmessages.h           |   1 +
>   src/acpica/source/compiler/aslresource.c           |   8 +
>   src/acpica/source/compiler/aslrules.y              |   3 +-
>   src/acpica/source/compiler/asltree.c               |  33 ++
>   src/acpica/source/compiler/aslutils.c              |  17 +-
>   src/acpica/source/compiler/dtcompile.c             |   2 +
>   src/acpica/source/compiler/dtcompiler.h            |   4 +
>   src/acpica/source/compiler/dtfield.c               |   8 +-
>   src/acpica/source/compiler/dtparser.y              |  17 +-
>   src/acpica/source/compiler/dtutils.c               |  32 ++
>   src/acpica/source/compiler/prparser.y              |   4 +-
>   src/acpica/source/components/debugger/dbconvert.c  |   4 +-
>   .../source/components/disassembler/dmresrc.c       |  14 +
>   src/acpica/source/components/dispatcher/dswexec.c  |   2 +-
>   src/acpica/source/components/events/evgpe.c        |   6 +-
>   src/acpica/source/components/executer/exconcat.c   |   2 +-
>   src/acpica/source/components/executer/exconvrt.c   |  26 +-
>   src/acpica/source/components/executer/exmisc.c     |   2 +-
>   src/acpica/source/components/executer/exresop.c    |   2 +-
>   src/acpica/source/components/hardware/hwgpe.c      |   4 +-
>   src/acpica/source/components/hardware/hwregs.c     |  74 +--
>   src/acpica/source/components/hardware/hwxface.c    | 130 +----
>   src/acpica/source/components/namespace/nsconvert.c |   3 +-
>   src/acpica/source/components/tables/tbxface.c      |   9 +-
>   .../source/components/utilities/utstrsuppt.c       | 613 +++++++++++++++++++++
>   .../source/components/utilities/utstrtoul64.c      | 472 ++++++++--------
>   src/acpica/source/include/acexcep.h                |  12 +-
>   src/acpica/source/include/achware.h                |   4 +-
>   src/acpica/source/include/acinterp.h               |   5 +-
>   src/acpica/source/include/acpixf.h                 |   2 +-
>   src/acpica/source/include/actbl1.h                 |  46 +-
>   src/acpica/source/include/actbl2.h                 |   1 +
>   src/acpica/source/include/acutils.h                |  58 +-
>   src/acpica/source/tools/acpiexec/aeinitfile.c      |   3 +-
>   42 files changed, 1266 insertions(+), 489 deletions(-)
>   create mode 100644 src/acpica/source/components/utilities/utstrsuppt.c
> 
> diff --git a/src/acpica/Makefile.am b/src/acpica/Makefile.am
> index 58b07494..64755b41 100644
> --- a/src/acpica/Makefile.am
> +++ b/src/acpica/Makefile.am
> @@ -261,6 +261,7 @@ libfwtsacpica_la_SOURCES =				\
>   	source/components/utilities/utexcep.c		\
>   	source/components/utilities/utpredef.c		\
>   	source/components/utilities/utstring.c		\
> +	source/components/utilities/utstrsuppt.c	\
>   	source/components/utilities/utownerid.c		\
>   	source/components/utilities/utxfinit.c		\
>   	source/components/utilities/uterror.c		\
> diff --git a/src/acpica/source/common/dmtbinfo.c b/src/acpica/source/common/dmtbinfo.c
> index 4b902b96..5180b4db 100644
> --- a/src/acpica/source/common/dmtbinfo.c
> +++ b/src/acpica/source/common/dmtbinfo.c
> @@ -2828,7 +2828,7 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoPptt1[] =
>       {ACPI_DMT_FLAG3,    ACPI_PPTT1_FLAG_OFFSET (Flags,0),           "Allocation Type valid", 0},
>       {ACPI_DMT_FLAG4,    ACPI_PPTT1_FLAG_OFFSET (Flags,0),           "Cache Type valid", 0},
>       {ACPI_DMT_FLAG5,    ACPI_PPTT1_FLAG_OFFSET (Flags,0),           "Write Policy valid", 0},
> -    {ACPI_DMT_FLAG5,    ACPI_PPTT1_FLAG_OFFSET (Flags,0),           "Line Size valid", 0},
> +    {ACPI_DMT_FLAG6,    ACPI_PPTT1_FLAG_OFFSET (Flags,0),           "Line Size valid", 0},
>       {ACPI_DMT_UINT32,   ACPI_PPTT1_OFFSET (NextLevelOfCache),       "Next Level of Cache", 0},
>       {ACPI_DMT_UINT32,   ACPI_PPTT1_OFFSET (Size),                   "Size", 0},
>       {ACPI_DMT_UINT32,   ACPI_PPTT1_OFFSET (NumberOfSets),           "Number of Sets", 0},
> diff --git a/src/acpica/source/compiler/aslcompiler.h b/src/acpica/source/compiler/aslcompiler.h
> index fdf4dbf7..3b6a9c1d 100644
> --- a/src/acpica/source/compiler/aslcompiler.h
> +++ b/src/acpica/source/compiler/aslcompiler.h
> @@ -890,6 +890,11 @@ void
>   TrSetOpCurrentFilename (
>       ACPI_PARSE_OBJECT       *Op);
>   
> +void
> +TrSetOpIntegerWidth (
> +    ACPI_PARSE_OBJECT       *TableSignature,
> +    ACPI_PARSE_OBJECT       *Revision);
> +
>   ACPI_PARSE_OBJECT *
>   TrLinkOpChildren (
>       ACPI_PARSE_OBJECT       *Op,
> diff --git a/src/acpica/source/compiler/aslcompiler.l b/src/acpica/source/compiler/aslcompiler.l
> index b49233be..5fcfc188 100644
> --- a/src/acpica/source/compiler/aslcompiler.l
> +++ b/src/acpica/source/compiler/aslcompiler.l
> @@ -195,6 +195,7 @@ count (int type);
>   
>   LeadNameChar                [A-Za-z_]
>   DigitChar                   [0-9]
> +OctalChar                   [0-7]
>   HexDigitChar                [A-Fa-f0-9]
>   RootChar                    [\\]
>   Nothing                     []
> @@ -278,8 +279,7 @@ NamePathTail                [.]{NameSeg}
>       /*
>        * Begin standard ASL grammar
>        */
> -0[xX]{HexDigitChar}+ |
> -{DigitChar}+                { AslCompilerlval.i = UtDoConstant ((char *) AslCompilertext);
> +[0-9][a-zA-Z0-9]*            { AslCompilerlval.i = UtDoConstant ((char *) AslCompilertext);
>                                   count (1); return (PARSEOP_INTEGER); }
>   
>   "Include"                   { count (1); return (PARSEOP_INCLUDE); }
> diff --git a/src/acpica/source/compiler/asldebug.c b/src/acpica/source/compiler/asldebug.c
> index b0b38640..684e2224 100644
> --- a/src/acpica/source/compiler/asldebug.c
> +++ b/src/acpica/source/compiler/asldebug.c
> @@ -165,6 +165,10 @@ UtDumpParseOpName (
>       UINT32                  Level,
>       UINT32                  DataLength);
>   
> +static char *
> +UtCreateEscapeSequences (
> +    char                    *InString);
> +
>   
>   /*******************************************************************************
>    *
> @@ -272,7 +276,6 @@ UtDumpStringOp (
>   
>   
>       String = Op->Asl.Value.String;
> -
>       if (Op->Asl.ParseOpcode != PARSEOP_STRING_LITERAL)
>       {
>           /*
> @@ -294,6 +297,8 @@ UtDumpStringOp (
>           return;
>       }
>   
> +    String = UtCreateEscapeSequences (String);
> +
>       /* Emit the ParseOp name, leaving room for the string */
>   
>       UtDumpParseOpName (Op, Level, strlen (String));
> @@ -301,6 +306,86 @@ UtDumpStringOp (
>   }
>   
>   
> +/*******************************************************************************
> + *
> + * FUNCTION:    UtCreateEscapeSequences
> + *
> + * PARAMETERS:  InString            - ASCII string to be expanded
> + *
> + * RETURN:      Expanded string
> + *
> + * DESCRIPTION: Expand all non-printable ASCII bytes (0-0x1F) to escape
> + *              sequences. For example, hex 14 becomes \x14
> + *
> + * NOTE:        Since this function is used for debug output only, it does
> + *              not attempt to translate into the "known" escape sequences
> + *              such as \a, \f, \t, etc.
> + *
> + ******************************************************************************/
> +
> +static char *
> +UtCreateEscapeSequences (
> +    char                    *InString)
> +{
> +    char                    *String = InString;
> +    char                    *OutString;
> +    char                    *OutStringPtr;
> +    UINT32                  InStringLength = 0;
> +    UINT32                  EscapeCount = 0;
> +
> +
> +    /*
> +     * Determine up front how many escapes are within the string.
> +     * Obtain the input string length while doing so.
> +     */
> +    while (*String)
> +    {
> +        if ((*String <= 0x1F) || (*String >= 0x7F))
> +        {
> +            EscapeCount++;
> +        }
> +
> +        InStringLength++;
> +        String++;
> +    }
> +
> +    if (!EscapeCount)
> +    {
> +        return (InString); /* No escapes, nothing to do */
> +    }
> +
> +    /* New string buffer, 3 extra chars per escape (4 total) */
> +
> +    OutString = UtLocalCalloc (InStringLength + (EscapeCount * 3));
> +    OutStringPtr = OutString;
> +
> +    /* Convert non-ascii or non-printable chars to escape sequences */
> +
> +    while (*InString)
> +    {
> +        if ((*InString <= 0x1F) || (*InString >= 0x7F))
> +        {
> +            /* Insert a \x hex escape sequence */
> +
> +            OutStringPtr[0] = '\\';
> +            OutStringPtr[1] = 'x';
> +            OutStringPtr[2] = AcpiUtHexToAsciiChar (*InString, 4);
> +            OutStringPtr[3] = AcpiUtHexToAsciiChar (*InString, 0);
> +            OutStringPtr += 4;
> +        }
> +        else /* Normal ASCII character */
> +        {
> +            *OutStringPtr = *InString;
> +            OutStringPtr++;
> +        }
> +
> +        InString++;
> +    }
> +
> +    return (OutString);
> +}
> +
> +
>   /*******************************************************************************
>    *
>    * FUNCTION:    UtDumpBasicOp
> diff --git a/src/acpica/source/compiler/aslerror.c b/src/acpica/source/compiler/aslerror.c
> index ec91ca3e..56b5cabb 100644
> --- a/src/acpica/source/compiler/aslerror.c
> +++ b/src/acpica/source/compiler/aslerror.c
> @@ -757,6 +757,11 @@ AslCommonError (
>       ASL_ERROR_MSG           *Enode;
>   
>   
> +    if (AslIsExceptionIgnored (Level, MessageId))
> +    {
> +        return;
> +    }
> +
>       Enode = UtLocalCalloc (sizeof (ASL_ERROR_MSG));
>   
>       if (ExtraMessage)
> @@ -949,9 +954,9 @@ AslDisableException (
>   
>       MessageId = (UINT32) strtoul (MessageIdString, NULL, 0);
>   
> -    if ((MessageId < 2000) || (MessageId > 5999))
> +    if ((MessageId < 2000) || (MessageId > 6999))
>       {
> -        printf ("\"%s\" is not a valid warning/remark ID\n",
> +        printf ("\"%s\" is not a valid warning/remark/error ID\n",
>               MessageIdString);
>           return (AE_BAD_PARAMETER);
>       }
> @@ -1050,8 +1055,9 @@ AslIsExceptionDisabled (
>   
>       case ASL_WARNING:
>       case ASL_REMARK:
> +    case ASL_ERROR:
>           /*
> -         * Ignore this warning/remark if it has been disabled by
> +         * Ignore this error/warning/remark if it has been disabled by
>            * the user (-vw option)
>            */
>           EncodedMessageId = AeBuildFullExceptionCode (Level, MessageId);
> @@ -1097,14 +1103,6 @@ AslError (
>       ACPI_PARSE_OBJECT       *Op,
>       char                    *ExtraMessage)
>   {
> -
> -    /* Check if user wants to ignore this exception */
> -
> -    if (AslIsExceptionIgnored (Level, MessageId))
> -    {
> -        return;
> -    }
> -
>       if (Op)
>       {
>           AslCommonError (Level, MessageId, Op->Asl.LineNumber,
> diff --git a/src/acpica/source/compiler/aslmain.c b/src/acpica/source/compiler/aslmain.c
> index 10251fb2..e4ac4229 100644
> --- a/src/acpica/source/compiler/aslmain.c
> +++ b/src/acpica/source/compiler/aslmain.c
> @@ -386,11 +386,11 @@ AslInitialize (
>   
>       AcpiGbl_DmOpt_Verbose = FALSE;
>   
> -    /* Default integer width is 64 bits */
> +    /* Default integer width is 32 bits */
>   
> -    AcpiGbl_IntegerBitWidth = 64;
> -    AcpiGbl_IntegerNybbleWidth = 16;
> -    AcpiGbl_IntegerByteWidth = 8;
> +    AcpiGbl_IntegerBitWidth = 32;
> +    AcpiGbl_IntegerNybbleWidth = 8;
> +    AcpiGbl_IntegerByteWidth = 4;
>   
>       for (i = 0; i < ASL_NUM_FILES; i++)
>       {
> diff --git a/src/acpica/source/compiler/aslmessages.c b/src/acpica/source/compiler/aslmessages.c
> index b87d5499..159f9d23 100644
> --- a/src/acpica/source/compiler/aslmessages.c
> +++ b/src/acpica/source/compiler/aslmessages.c
> @@ -238,7 +238,7 @@ const char                      *AslCompilerMsgs [] =
>   /*    ASL_MSG_HID_SUFFIX */                 "_HID suffix must be all hex digits",
>   /*    ASL_MSG_INCLUDE_FILE_OPEN */          "Could not open include file",
>   /*    ASL_MSG_INPUT_FILE_OPEN */            "Could not open input file",
> -/*    ASL_MSG_INTEGER_LENGTH */             "64-bit integer in 32-bit table, truncating (DSDT or SSDT version < 2)",
> +/*    ASL_MSG_INTEGER_LENGTH */             "Truncating 64-bit constant found in 32-bit table",
>   /*    ASL_MSG_INTEGER_OPTIMIZATION */       "Integer optimized to single-byte AML opcode",
>   /*    ASL_MSG_INTERRUPT_LIST */             "Too many interrupts (16 max)",
>   /*    ASL_MSG_INTERRUPT_NUMBER */           "Invalid interrupt number (must be 0-15)",
> @@ -349,7 +349,8 @@ const char                      *AslCompilerMsgs [] =
>   /*    ASL_MSG_ARG_NOT_USED */               "Method Argument is never used",
>   /*    ASL_MSG_CONSTANT_REQUIRED */          "Non-reducible expression",
>   /*    ASL_MSG_CROSS_TABLE_SCOPE */          "Illegal open scope on external object from within DSDT",
> -/*    ASL_MSG_EXCEPTION_NOT_RECEIVED */     "Expected remark, warning, or error did not occur. Message ID:"
> +/*    ASL_MSG_EXCEPTION_NOT_RECEIVED */     "Expected remark, warning, or error did not occur. Message ID:",
> +/*    ASL_MSG_NULL_RESOURCE_TEMPLATE */     "Empty Resource Template (END_TAG only)"
>   };
>   
>   /* Table compiler */
> diff --git a/src/acpica/source/compiler/aslmessages.h b/src/acpica/source/compiler/aslmessages.h
> index 68216e5c..d69c05a1 100644
> --- a/src/acpica/source/compiler/aslmessages.h
> +++ b/src/acpica/source/compiler/aslmessages.h
> @@ -352,6 +352,7 @@ typedef enum
>       ASL_MSG_CONSTANT_REQUIRED,
>       ASL_MSG_CROSS_TABLE_SCOPE,
>       ASL_MSG_EXCEPTION_NOT_RECEIVED,
> +    ASL_MSG_NULL_RESOURCE_TEMPLATE,
>   
>       /* These messages are used by the Data Table compiler only */
>   
> diff --git a/src/acpica/source/compiler/aslresource.c b/src/acpica/source/compiler/aslresource.c
> index eb0c22a1..b052c1ed 100644
> --- a/src/acpica/source/compiler/aslresource.c
> +++ b/src/acpica/source/compiler/aslresource.c
> @@ -1148,6 +1148,14 @@ RsDoResourceTemplate (
>   
>       DescriptorTypeOp = ASL_GET_PEER_NODE (BufferOp);
>   
> +    /* DEFAULT_ARG indicates null template - ResourceTemplate(){} */
> +
> +    if (DescriptorTypeOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
> +    {
> +        AslError (ASL_WARNING, ASL_MSG_NULL_RESOURCE_TEMPLATE,
> +            DescriptorTypeOp, DescriptorTypeOp->Asl.Value.String);
> +    }
> +
>       /*
>        * Process all resource descriptors in the list
>        * Note: It is assumed that the EndTag node has been automatically
> diff --git a/src/acpica/source/compiler/aslrules.y b/src/acpica/source/compiler/aslrules.y
> index f26ea874..3b8e4839 100644
> --- a/src/acpica/source/compiler/aslrules.y
> +++ b/src/acpica/source/compiler/aslrules.y
> @@ -199,7 +199,8 @@ DefinitionBlockTerm
>           String ','
>           String ','
>           DWordConst
> -        PARSEOP_CLOSE_PAREN         {TrSetOpEndLineNumber ($<n>3); COMMENT_CAPTURE_ON;}
> +        PARSEOP_CLOSE_PAREN         {TrSetOpIntegerWidth ($6,$8);
> +                                        TrSetOpEndLineNumber ($<n>3); COMMENT_CAPTURE_ON;}
>               '{' TermList '}'        {$$ = TrLinkOpChildren ($<n>3,7,
>                                           $4,$6,$8,$10,$12,$14,$18);}
>       ;
> diff --git a/src/acpica/source/compiler/asltree.c b/src/acpica/source/compiler/asltree.c
> index 8b709df7..084bc4d5 100644
> --- a/src/acpica/source/compiler/asltree.c
> +++ b/src/acpica/source/compiler/asltree.c
> @@ -376,6 +376,39 @@ TrSetOpCurrentFilename (
>   }
>   
>   
> +/*******************************************************************************
> + *
> + * FUNCTION:    TrSetOpIntegerWidth
> + *
> + * PARAMETERS:  Op                  - An existing parse op
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION:
> + *
> + ******************************************************************************/
> +
> +void
> +TrSetOpIntegerWidth (
> +    ACPI_PARSE_OBJECT       *TableSignatureOp,
> +    ACPI_PARSE_OBJECT       *RevisionOp)
> +{
> +
> +    /* TBD: Check table sig? (DSDT vs. SSDT) */
> +
> +    /* Handle command-line version override */
> +
> +    if (Gbl_RevisionOverride)
> +    {
> +        AcpiUtSetIntegerWidth (Gbl_RevisionOverride);
> +    }
> +    else
> +    {
> +        AcpiUtSetIntegerWidth ((UINT8) RevisionOp->Asl.Value.Integer);
> +    }
> +}
> +
> +
>   /*******************************************************************************
>    *
>    * FUNCTION:    TrSetOpEndLineNumber
> diff --git a/src/acpica/source/compiler/aslutils.c b/src/acpica/source/compiler/aslutils.c
> index c5ff42c0..8b46d38b 100644
> --- a/src/acpica/source/compiler/aslutils.c
> +++ b/src/acpica/source/compiler/aslutils.c
> @@ -1004,11 +1004,11 @@ UtAttachNamepathToOwner (
>    *
>    * FUNCTION:    UtDoConstant
>    *
> - * PARAMETERS:  String              - Hexadecimal or decimal string
> + * PARAMETERS:  String              - Hex/Decimal/Octal
>    *
>    * RETURN:      Converted Integer
>    *
> - * DESCRIPTION: Convert a string to an integer, with error checking.
> + * DESCRIPTION: Convert a string to an integer, with overflow/error checking.
>    *
>    ******************************************************************************/
>   
> @@ -1017,17 +1017,20 @@ UtDoConstant (
>       char                    *String)
>   {
>       ACPI_STATUS             Status;
> -    UINT64                  Converted;
> +    UINT64                  ConvertedInteger;
>       char                    ErrBuf[64];
>   
>   
> -    Status = AcpiUtStrtoul64 (String, ACPI_STRTOUL_64BIT, &Converted);
> +    Status = AcpiUtStrtoul64 (String, &ConvertedInteger);
>       if (ACPI_FAILURE (Status))
>       {
> -        sprintf (ErrBuf, "%s %s\n", "Conversion error:",
> +        sprintf (ErrBuf, "While creating 64-bit constant: %s\n",
>               AcpiFormatException (Status));
> -        AslCompilererror (ErrBuf);
> +
> +        AslCommonError (ASL_ERROR, ASL_MSG_SYNTAX, Gbl_CurrentLineNumber,
> +            Gbl_LogicalLineNumber, Gbl_CurrentLineOffset,
> +            Gbl_CurrentColumn, Gbl_Files[ASL_FILE_INPUT].Filename, ErrBuf);
>       }
>   
> -    return (Converted);
> +    return (ConvertedInteger);
>   }
> diff --git a/src/acpica/source/compiler/dtcompile.c b/src/acpica/source/compiler/dtcompile.c
> index e74fed51..53445624 100644
> --- a/src/acpica/source/compiler/dtcompile.c
> +++ b/src/acpica/source/compiler/dtcompile.c
> @@ -319,6 +319,8 @@ DtInitialize (
>           return (Status);
>       }
>   
> +    AcpiUtSetIntegerWidth (2); /* Set width to 64 bits */
> +
>       Gbl_FieldList = NULL;
>       Gbl_RootTable = NULL;
>       Gbl_SubtableStack = NULL;
> diff --git a/src/acpica/source/compiler/dtcompiler.h b/src/acpica/source/compiler/dtcompiler.h
> index 1e81c580..90fad889 100644
> --- a/src/acpica/source/compiler/dtcompiler.h
> +++ b/src/acpica/source/compiler/dtcompiler.h
> @@ -481,6 +481,10 @@ DtFatal (
>       DT_FIELD                *FieldObject,
>       char                    *ExtraMessage);
>   
> +UINT64
> +DtDoConstant (
> +    char                    *String);
> +
>   char*
>   DtGetFieldValue (
>       DT_FIELD                *Field);
> diff --git a/src/acpica/source/compiler/dtfield.c b/src/acpica/source/compiler/dtfield.c
> index 13e8b638..b06877a8 100644
> --- a/src/acpica/source/compiler/dtfield.c
> +++ b/src/acpica/source/compiler/dtfield.c
> @@ -628,15 +628,9 @@ DtCompileFlag (
>       UINT64                  Value = 0;
>       UINT32                  BitLength = 1;
>       UINT8                   BitPosition = 0;
> -    ACPI_STATUS             Status;
>   
>   
> -    Status = AcpiUtStrtoul64 (Field->Value,
> -        (ACPI_STRTOUL_64BIT | ACPI_STRTOUL_BASE16), &Value);
> -    if (ACPI_FAILURE (Status))
> -    {
> -        DtError (ASL_ERROR, ASL_MSG_INVALID_HEX_INTEGER, Field, NULL);
> -    }
> +    Value = AcpiUtImplicitStrtoul64 (Field->Value);
>   
>       switch (Info->Opcode)
>       {
> diff --git a/src/acpica/source/compiler/dtparser.y b/src/acpica/source/compiler/dtparser.y
> index a2943ccc..d5990fe4 100644
> --- a/src/acpica/source/compiler/dtparser.y
> +++ b/src/acpica/source/compiler/dtparser.y
> @@ -275,17 +275,24 @@ Expression
>   
>       | EXPOP_LABEL                                   { $$ = DtResolveLabel (DtParsertext);}
>   
> -      /* Default base for a non-prefixed integer is 16 */
> +      /*
> +       * All constants for the data table compiler are in hex, whether a (optional) 0x
> +       * prefix is present or not. For example, these two input strings are equivalent:
> +       *    1234
> +       *    0x1234
> +       */
>   
> -    | EXPOP_NUMBER                                  { AcpiUtStrtoul64 (DtParsertext, (ACPI_STRTOUL_BASE16 | ACPI_STRTOUL_64BIT), &$$);}
> +      /* Non-prefixed hex number */
> +
> +    | EXPOP_NUMBER                                  { $$ = DtDoConstant (DtParsertext);}
>   
>         /* Standard hex number (0x1234) */
>   
> -    | EXPOP_HEX_NUMBER                              { AcpiUtStrtoul64 (DtParsertext, (ACPI_STRTOUL_BASE16 | ACPI_STRTOUL_64BIT), &$$);}
> +    | EXPOP_HEX_NUMBER                              { $$ = DtDoConstant (DtParsertext);}
>   
> -      /* TBD: Decimal number with prefix (0d1234) - Not supported by strtoul64 at this time */
> +      /* Possible TBD: Decimal number with prefix (0d1234) - Not supported this time */
>   
> -    | EXPOP_DECIMAL_NUMBER                          { AcpiUtStrtoul64 (DtParsertext, ACPI_STRTOUL_64BIT, &$$);}
> +    | EXPOP_DECIMAL_NUMBER                          { $$ = DtDoConstant (DtParsertext);}
>       ;
>   %%
>   
> diff --git a/src/acpica/source/compiler/dtutils.c b/src/acpica/source/compiler/dtutils.c
> index 6edcf637..c6c89eaa 100644
> --- a/src/acpica/source/compiler/dtutils.c
> +++ b/src/acpica/source/compiler/dtutils.c
> @@ -303,6 +303,38 @@ DtFatal (
>   }
>   
>   
> +/*******************************************************************************
> + *
> + * FUNCTION:    DtDoConstant
> + *
> + * PARAMETERS:  String              - Only hex constants are supported,
> + *                                    regardless of whether the 0x prefix
> + *                                    is used
> + *
> + * RETURN:      Converted Integer
> + *
> + * DESCRIPTION: Convert a string to an integer, with overflow/error checking.
> + *
> + ******************************************************************************/
> +
> +UINT64
> +DtDoConstant (
> +    char                    *String)
> +{
> +    UINT64                  ConvertedInteger;
> +
> +
> +    /*
> +     * TBD: The ImplicitStrtoul64 function does not report overflow
> +     * conditions. The input string is simply truncated. If it is
> +     * desired to report overflow to the table compiler, this should
> +     * somehow be added here. Note: integers that are prefixed with 0x
> +     * or not are both hex integers.
> +     */
> +    ConvertedInteger = AcpiUtImplicitStrtoul64 (String);
> +    return (ConvertedInteger);
> +}
> +
>   /******************************************************************************
>    *
>    * FUNCTION:    DtGetFieldValue
> diff --git a/src/acpica/source/compiler/prparser.y b/src/acpica/source/compiler/prparser.y
> index 2ad79e45..d24a5bbe 100644
> --- a/src/acpica/source/compiler/prparser.y
> +++ b/src/acpica/source/compiler/prparser.y
> @@ -290,11 +290,11 @@ Expression
>   
>         /* Default base for a non-prefixed integer is 10 */
>   
> -    | EXPOP_NUMBER                                  { AcpiUtStrtoul64 (PrParsertext, ACPI_STRTOUL_64BIT, &$$);}
> +    | EXPOP_NUMBER                                  { AcpiUtStrtoul64 (PrParsertext, &$$);}
>   
>         /* Standard hex number (0x1234) */
>   
> -    | EXPOP_HEX_NUMBER                              { AcpiUtStrtoul64 (PrParsertext, (ACPI_STRTOUL_BASE16 | ACPI_STRTOUL_64BIT), &$$);}
> +    | EXPOP_HEX_NUMBER                              { AcpiUtStrtoul64 (PrParsertext, &$$);}
>       ;
>   %%
>   
> diff --git a/src/acpica/source/components/debugger/dbconvert.c b/src/acpica/source/components/debugger/dbconvert.c
> index e02ddb40..e06bc026 100644
> --- a/src/acpica/source/components/debugger/dbconvert.c
> +++ b/src/acpica/source/components/debugger/dbconvert.c
> @@ -429,9 +429,7 @@ AcpiDbConvertToObject (
>       default:
>   
>           Object->Type = ACPI_TYPE_INTEGER;
> -        Status = AcpiUtStrtoul64 (String,
> -            (AcpiGbl_IntegerByteWidth | ACPI_STRTOUL_BASE16),
> -            &Object->Integer.Value);
> +        Status = AcpiUtStrtoul64 (String, &Object->Integer.Value);
>           break;
>       }
>   
> diff --git a/src/acpica/source/components/disassembler/dmresrc.c b/src/acpica/source/components/disassembler/dmresrc.c
> index 3c24855f..c50c1c42 100644
> --- a/src/acpica/source/components/disassembler/dmresrc.c
> +++ b/src/acpica/source/components/disassembler/dmresrc.c
> @@ -539,6 +539,20 @@ AcpiDmIsResourceTemplate (
>       Aml = NextOp->Named.Data;
>       BufferLength = NextOp->Common.Value.Size;
>   
> +    /*
> +     * Any buffer smaller than one byte cannot possibly be a resource
> +     * template. Two bytes could possibly be a "NULL" resource template
> +     * with a lone end tag descriptor (as generated via
> +     * "ResourceTemplate(){}"), but this would be an extremely unusual
> +     * case, as the template would be essentially useless. The disassembler
> +     * therefore does not recognize any two-byte buffer as a resource
> +     * template.
> +     */
> +    if (BufferLength <= 2)
> +    {
> +        return (AE_TYPE);
> +    }
> +
>       /*
>        * Not a template if declared buffer length != actual length of the
>        * intialization byte list. Because the resource macros will create
> diff --git a/src/acpica/source/components/dispatcher/dswexec.c b/src/acpica/source/components/dispatcher/dswexec.c
> index dfdfeaa0..bbb9436a 100644
> --- a/src/acpica/source/components/dispatcher/dswexec.c
> +++ b/src/acpica/source/components/dispatcher/dswexec.c
> @@ -253,7 +253,7 @@ AcpiDsGetPredicateValue (
>        * object. Implicitly convert the argument if necessary.
>        */
>       Status = AcpiExConvertToInteger (ObjDesc, &LocalObjDesc,
> -        ACPI_STRTOUL_BASE16);
> +        ACPI_IMPLICIT_CONVERSION);
>       if (ACPI_FAILURE (Status))
>       {
>           goto Cleanup;
> diff --git a/src/acpica/source/components/events/evgpe.c b/src/acpica/source/components/events/evgpe.c
> index 13b3e049..a00dc378 100644
> --- a/src/acpica/source/components/events/evgpe.c
> +++ b/src/acpica/source/components/events/evgpe.c
> @@ -551,8 +551,8 @@ AcpiEvGpeDetect (
>       ACPI_GPE_HANDLER_INFO   *GpeHandlerInfo;
>       UINT32                  IntStatus = ACPI_INTERRUPT_NOT_HANDLED;
>       UINT8                   EnabledStatusByte;
> -    UINT32                  StatusReg;
> -    UINT32                  EnableReg;
> +    UINT64                  StatusReg;
> +    UINT64                  EnableReg;
>       ACPI_CPU_FLAGS          Flags;
>       UINT32                  i;
>       UINT32                  j;
> @@ -629,7 +629,7 @@ AcpiEvGpeDetect (
>                   "RunEnable=%02X, WakeEnable=%02X\n",
>                   GpeRegisterInfo->BaseGpeNumber,
>                   GpeRegisterInfo->BaseGpeNumber + (ACPI_GPE_REGISTER_WIDTH - 1),
> -                StatusReg, EnableReg,
> +                (UINT32) StatusReg, (UINT32) EnableReg,
>                   GpeRegisterInfo->EnableForRun,
>                   GpeRegisterInfo->EnableForWake));
>   
> diff --git a/src/acpica/source/components/executer/exconcat.c b/src/acpica/source/components/executer/exconcat.c
> index e5f077db..67d592cd 100644
> --- a/src/acpica/source/components/executer/exconcat.c
> +++ b/src/acpica/source/components/executer/exconcat.c
> @@ -274,7 +274,7 @@ AcpiExDoConcatenate (
>       case ACPI_TYPE_INTEGER:
>   
>           Status = AcpiExConvertToInteger (LocalOperand1, &TempOperand1,
> -            ACPI_STRTOUL_BASE16);
> +            ACPI_IMPLICIT_CONVERSION);
>           break;
>   
>       case ACPI_TYPE_BUFFER:
> diff --git a/src/acpica/source/components/executer/exconvrt.c b/src/acpica/source/components/executer/exconvrt.c
> index 8c0ae75c..8577a45e 100644
> --- a/src/acpica/source/components/executer/exconvrt.c
> +++ b/src/acpica/source/components/executer/exconvrt.c
> @@ -172,10 +172,10 @@ AcpiExConvertToAscii (
>    *
>    * FUNCTION:    AcpiExConvertToInteger
>    *
> - * PARAMETERS:  ObjDesc         - Object to be converted. Must be an
> - *                                Integer, Buffer, or String
> - *              ResultDesc      - Where the new Integer object is returned
> - *              Flags           - Used for string conversion
> + * PARAMETERS:  ObjDesc             - Object to be converted. Must be an
> + *                                    Integer, Buffer, or String
> + *              ResultDesc          - Where the new Integer object is returned
> + *              ImplicitConversion  - Used for string conversion
>    *
>    * RETURN:      Status
>    *
> @@ -187,14 +187,13 @@ ACPI_STATUS
>   AcpiExConvertToInteger (
>       ACPI_OPERAND_OBJECT     *ObjDesc,
>       ACPI_OPERAND_OBJECT     **ResultDesc,
> -    UINT32                  Flags)
> +    UINT32                  ImplicitConversion)
>   {
>       ACPI_OPERAND_OBJECT     *ReturnDesc;
>       UINT8                   *Pointer;
>       UINT64                  Result;
>       UINT32                  i;
>       UINT32                  Count;
> -    ACPI_STATUS             Status;
>   
>   
>       ACPI_FUNCTION_TRACE_PTR (ExConvertToInteger, ObjDesc);
> @@ -244,12 +243,17 @@ AcpiExConvertToInteger (
>            * hexadecimal as per the ACPI specification. The only exception (as
>            * of ACPI 3.0) is that the ToInteger() operator allows both decimal
>            * and hexadecimal strings (hex prefixed with "0x").
> +         *
> +         * Explicit conversion is used only by ToInteger.
> +         * All other string-to-integer conversions are implicit conversions.
>            */
> -        Status = AcpiUtStrtoul64 (ACPI_CAST_PTR (char, Pointer),
> -            (AcpiGbl_IntegerByteWidth | Flags), &Result);
> -        if (ACPI_FAILURE (Status))
> +        if (ImplicitConversion)
> +        {
> +            Result = AcpiUtImplicitStrtoul64 (ACPI_CAST_PTR (char, Pointer));
> +        }
> +        else
>           {
> -            return_ACPI_STATUS (Status);
> +            Result = AcpiUtExplicitStrtoul64 (ACPI_CAST_PTR (char, Pointer));
>           }
>           break;
>   
> @@ -792,7 +796,7 @@ AcpiExConvertToTargetType (
>                * a Buffer or a String to an Integer if necessary.
>                */
>               Status = AcpiExConvertToInteger (SourceDesc, ResultDesc,
> -                ACPI_STRTOUL_BASE16);
> +                ACPI_IMPLICIT_CONVERSION);
>               break;
>   
>           case ACPI_TYPE_STRING:
> diff --git a/src/acpica/source/components/executer/exmisc.c b/src/acpica/source/components/executer/exmisc.c
> index dfa4421a..8e92f7a0 100644
> --- a/src/acpica/source/components/executer/exmisc.c
> +++ b/src/acpica/source/components/executer/exmisc.c
> @@ -472,7 +472,7 @@ AcpiExDoLogicalOp (
>       case ACPI_TYPE_INTEGER:
>   
>           Status = AcpiExConvertToInteger (Operand1, &LocalOperand1,
> -            ACPI_STRTOUL_BASE16);
> +            ACPI_IMPLICIT_CONVERSION);
>           break;
>   
>       case ACPI_TYPE_STRING:
> diff --git a/src/acpica/source/components/executer/exresop.c b/src/acpica/source/components/executer/exresop.c
> index 0cd216ce..e33608c2 100644
> --- a/src/acpica/source/components/executer/exresop.c
> +++ b/src/acpica/source/components/executer/exresop.c
> @@ -541,7 +541,7 @@ AcpiExResolveOperands (
>                * Known as "Implicit Source Operand Conversion"
>                */
>               Status = AcpiExConvertToInteger (ObjDesc, StackPtr,
> -                ACPI_STRTOUL_BASE16);
> +                ACPI_IMPLICIT_CONVERSION);
>               if (ACPI_FAILURE (Status))
>               {
>                   if (Status == AE_TYPE)
> diff --git a/src/acpica/source/components/hardware/hwgpe.c b/src/acpica/source/components/hardware/hwgpe.c
> index 56ccb78d..636639be 100644
> --- a/src/acpica/source/components/hardware/hwgpe.c
> +++ b/src/acpica/source/components/hardware/hwgpe.c
> @@ -217,7 +217,7 @@ AcpiHwLowSetGpe (
>   {
>       ACPI_GPE_REGISTER_INFO  *GpeRegisterInfo;
>       ACPI_STATUS             Status = AE_OK;
> -    UINT32                  EnableMask;
> +    UINT64                  EnableMask;
>       UINT32                  RegisterBit;
>   
>   
> @@ -342,7 +342,7 @@ AcpiHwGetGpeStatus (
>       ACPI_GPE_EVENT_INFO     *GpeEventInfo,
>       ACPI_EVENT_STATUS       *EventStatus)
>   {
> -    UINT32                  InByte;
> +    UINT64                  InByte;
>       UINT32                  RegisterBit;
>       ACPI_GPE_REGISTER_INFO  *GpeRegisterInfo;
>       ACPI_EVENT_STATUS       LocalEventStatus = 0;
> diff --git a/src/acpica/source/components/hardware/hwregs.c b/src/acpica/source/components/hardware/hwregs.c
> index b5b23831..cd8e774a 100644
> --- a/src/acpica/source/components/hardware/hwregs.c
> +++ b/src/acpica/source/components/hardware/hwregs.c
> @@ -355,9 +355,8 @@ AcpiHwValidateRegister (
>    *
>    * RETURN:      Status
>    *
> - * DESCRIPTION: Read from either memory or IO space. This is a 32-bit max
> - *              version of AcpiRead, used internally since the overhead of
> - *              64-bit values is not needed.
> + * DESCRIPTION: Read from either memory or IO space. This is a 64-bit max
> + *              version of AcpiRead.
>    *
>    * LIMITATIONS: <These limitations also apply to AcpiHwWrite>
>    *      SpaceID must be SystemMemory or SystemIO.
> @@ -366,7 +365,7 @@ AcpiHwValidateRegister (
>   
>   ACPI_STATUS
>   AcpiHwRead (
> -    UINT32                  *Value,
> +    UINT64                  *Value,
>       ACPI_GENERIC_ADDRESS    *Reg)
>   {
>       UINT64                  Address;
> @@ -384,18 +383,18 @@ AcpiHwRead (
>   
>       /* Validate contents of the GAS register */
>   
> -    Status = AcpiHwValidateRegister (Reg, 32, &Address);
> +    Status = AcpiHwValidateRegister (Reg, 64, &Address);
>       if (ACPI_FAILURE (Status))
>       {
>           return (Status);
>       }
>   
>       /*
> -     * Initialize entire 32-bit return value to zero, convert AccessWidth
> +     * Initialize entire 64-bit return value to zero, convert AccessWidth
>        * into number of bits based
>        */
>       *Value = 0;
> -    AccessWidth = AcpiHwGetAccessBitWidth (Address, Reg, 32);
> +    AccessWidth = AcpiHwGetAccessBitWidth (Address, Reg, 64);
>       BitWidth = Reg->BitOffset + Reg->BitWidth;
>       BitOffset = Reg->BitOffset;
>   
> @@ -408,7 +407,7 @@ AcpiHwRead (
>       {
>           if (BitOffset >= AccessWidth)
>           {
> -            Value32 = 0;
> +            Value64 = 0;
>               BitOffset -= AccessWidth;
>           }
>           else
> @@ -418,31 +417,31 @@ AcpiHwRead (
>                   Status = AcpiOsReadMemory ((ACPI_PHYSICAL_ADDRESS)
>                       Address + Index * ACPI_DIV_8 (AccessWidth),
>                       &Value64, AccessWidth);
> -                Value32 = (UINT32) Value64;
>               }
>               else /* ACPI_ADR_SPACE_SYSTEM_IO, validated earlier */
>               {
>                   Status = AcpiHwReadPort ((ACPI_IO_ADDRESS)
>                       Address + Index * ACPI_DIV_8 (AccessWidth),
>                       &Value32, AccessWidth);
> +                Value64 = (UINT64) Value32;
>               }
>           }
>   
>           /*
>            * Use offset style bit writes because "Index * AccessWidth" is
> -         * ensured to be less than 32-bits by AcpiHwValidateRegister().
> +         * ensured to be less than 64-bits by AcpiHwValidateRegister().
>            */
>           ACPI_SET_BITS (Value, Index * AccessWidth,
> -            ACPI_MASK_BITS_ABOVE_32 (AccessWidth), Value32);
> +            ACPI_MASK_BITS_ABOVE_64 (AccessWidth), Value64);
>   
>           BitWidth -= BitWidth > AccessWidth ? AccessWidth : BitWidth;
>           Index++;
>       }
>   
>       ACPI_DEBUG_PRINT ((ACPI_DB_IO,
> -        "Read:  %8.8X width %2d from %8.8X%8.8X (%s)\n",
> -        *Value, AccessWidth, ACPI_FORMAT_UINT64 (Address),
> -        AcpiUtGetRegionName (Reg->SpaceId)));
> +        "Read:  %8.8X%8.8X width %2d from %8.8X%8.8X (%s)\n",
> +        ACPI_FORMAT_UINT64 (*Value), AccessWidth,
> +        ACPI_FORMAT_UINT64 (Address), AcpiUtGetRegionName (Reg->SpaceId)));
>   
>       return (Status);
>   }
> @@ -457,15 +456,14 @@ AcpiHwRead (
>    *
>    * RETURN:      Status
>    *
> - * DESCRIPTION: Write to either memory or IO space. This is a 32-bit max
> - *              version of AcpiWrite, used internally since the overhead of
> - *              64-bit values is not needed.
> + * DESCRIPTION: Write to either memory or IO space. This is a 64-bit max
> + *              version of AcpiWrite.
>    *
>    ******************************************************************************/
>   
>   ACPI_STATUS
>   AcpiHwWrite (
> -    UINT32                  Value,
> +    UINT64                  Value,
>       ACPI_GENERIC_ADDRESS    *Reg)
>   {
>       UINT64                  Address;
> @@ -473,7 +471,6 @@ AcpiHwWrite (
>       UINT32                  BitWidth;
>       UINT8                   BitOffset;
>       UINT64                  Value64;
> -    UINT32                  Value32;
>       UINT8                   Index;
>       ACPI_STATUS             Status;
>   
> @@ -483,7 +480,7 @@ AcpiHwWrite (
>   
>       /* Validate contents of the GAS register */
>   
> -    Status = AcpiHwValidateRegister (Reg, 32, &Address);
> +    Status = AcpiHwValidateRegister (Reg, 64, &Address);
>       if (ACPI_FAILURE (Status))
>       {
>           return (Status);
> @@ -491,7 +488,7 @@ AcpiHwWrite (
>   
>       /* Convert AccessWidth into number of bits based */
>   
> -    AccessWidth = AcpiHwGetAccessBitWidth (Address, Reg, 32);
> +    AccessWidth = AcpiHwGetAccessBitWidth (Address, Reg, 64);
>       BitWidth = Reg->BitOffset + Reg->BitWidth;
>       BitOffset = Reg->BitOffset;
>   
> @@ -504,10 +501,10 @@ AcpiHwWrite (
>       {
>           /*
>            * Use offset style bit reads because "Index * AccessWidth" is
> -         * ensured to be less than 32-bits by AcpiHwValidateRegister().
> +         * ensured to be less than 64-bits by AcpiHwValidateRegister().
>            */
> -        Value32 = ACPI_GET_BITS (&Value, Index * AccessWidth,
> -            ACPI_MASK_BITS_ABOVE_32 (AccessWidth));
> +        Value64 = ACPI_GET_BITS (&Value, Index * AccessWidth,
> +            ACPI_MASK_BITS_ABOVE_64 (AccessWidth));
>   
>           if (BitOffset >= AccessWidth)
>           {
> @@ -517,7 +514,6 @@ AcpiHwWrite (
>           {
>               if (Reg->SpaceId == ACPI_ADR_SPACE_SYSTEM_MEMORY)
>               {
> -                Value64 = (UINT64) Value32;
>                   Status = AcpiOsWriteMemory ((ACPI_PHYSICAL_ADDRESS)
>                       Address + Index * ACPI_DIV_8 (AccessWidth),
>                       Value64, AccessWidth);
> @@ -526,7 +522,7 @@ AcpiHwWrite (
>               {
>                   Status = AcpiHwWritePort ((ACPI_IO_ADDRESS)
>                       Address + Index * ACPI_DIV_8 (AccessWidth),
> -                    Value32, AccessWidth);
> +                    (UINT32) Value64, AccessWidth);
>               }
>           }
>   
> @@ -539,9 +535,9 @@ AcpiHwWrite (
>       }
>   
>       ACPI_DEBUG_PRINT ((ACPI_DB_IO,
> -        "Wrote: %8.8X width %2d   to %8.8X%8.8X (%s)\n",
> -        Value, AccessWidth, ACPI_FORMAT_UINT64 (Address),
> -        AcpiUtGetRegionName (Reg->SpaceId)));
> +        "Wrote: %8.8X%8.8X width %2d   to %8.8X%8.8X (%s)\n",
> +        ACPI_FORMAT_UINT64 (Value), AccessWidth,
> +        ACPI_FORMAT_UINT64 (Address), AcpiUtGetRegionName (Reg->SpaceId)));
>   
>       return (Status);
>   }
> @@ -688,6 +684,7 @@ AcpiHwRegisterRead (
>       UINT32                  *ReturnValue)
>   {
>       UINT32                  Value = 0;
> +    UINT64                  Value64;
>       ACPI_STATUS             Status;
>   
>   
> @@ -726,12 +723,14 @@ AcpiHwRegisterRead (
>   
>       case ACPI_REGISTER_PM2_CONTROL:          /* 8-bit access */
>   
> -        Status = AcpiHwRead (&Value, &AcpiGbl_FADT.XPm2ControlBlock);
> +        Status = AcpiHwRead (&Value64, &AcpiGbl_FADT.XPm2ControlBlock);
> +        Value = (UINT32) Value64;
>           break;
>   
>       case ACPI_REGISTER_PM_TIMER:             /* 32-bit access */
>   
> -        Status = AcpiHwRead (&Value, &AcpiGbl_FADT.XPmTimerBlock);
> +        Status = AcpiHwRead (&Value64, &AcpiGbl_FADT.XPmTimerBlock);
> +        Value = (UINT32) Value64;
>           break;
>   
>       case ACPI_REGISTER_SMI_COMMAND_BLOCK:    /* 8-bit access */
> @@ -749,7 +748,7 @@ AcpiHwRegisterRead (
>   
>       if (ACPI_SUCCESS (Status))
>       {
> -        *ReturnValue = Value;
> +        *ReturnValue = (UINT32) Value;
>       }
>   
>       return_ACPI_STATUS (Status);
> @@ -789,6 +788,7 @@ AcpiHwRegisterWrite (
>   {
>       ACPI_STATUS             Status;
>       UINT32                  ReadValue;
> +    UINT64                  ReadValue64;
>   
>   
>       ACPI_FUNCTION_TRACE (HwRegisterWrite);
> @@ -850,11 +850,12 @@ AcpiHwRegisterWrite (
>            * For control registers, all reserved bits must be preserved,
>            * as per the ACPI spec.
>            */
> -        Status = AcpiHwRead (&ReadValue, &AcpiGbl_FADT.XPm2ControlBlock);
> +        Status = AcpiHwRead (&ReadValue64, &AcpiGbl_FADT.XPm2ControlBlock);
>           if (ACPI_FAILURE (Status))
>           {
>               goto Exit;
>           }
> +        ReadValue = (UINT32) ReadValue64;
>   
>           /* Insert the bits to be preserved */
>   
> @@ -910,26 +911,29 @@ AcpiHwReadMultiple (
>   {
>       UINT32                  ValueA = 0;
>       UINT32                  ValueB = 0;
> +    UINT64                  Value64;
>       ACPI_STATUS             Status;
>   
>   
>       /* The first register is always required */
>   
> -    Status = AcpiHwRead (&ValueA, RegisterA);
> +    Status = AcpiHwRead (&Value64, RegisterA);
>       if (ACPI_FAILURE (Status))
>       {
>           return (Status);
>       }
> +    ValueA = (UINT32) Value64;
>   
>       /* Second register is optional */
>   
>       if (RegisterB->Address)
>       {
> -        Status = AcpiHwRead (&ValueB, RegisterB);
> +        Status = AcpiHwRead (&Value64, RegisterB);
>           if (ACPI_FAILURE (Status))
>           {
>               return (Status);
>           }
> +        ValueB = (UINT32) Value64;
>       }
>   
>       /*
> diff --git a/src/acpica/source/components/hardware/hwxface.c b/src/acpica/source/components/hardware/hwxface.c
> index 3627a971..49a19e45 100644
> --- a/src/acpica/source/components/hardware/hwxface.c
> +++ b/src/acpica/source/components/hardware/hwxface.c
> @@ -247,84 +247,14 @@ AcpiRead (
>       UINT64                  *ReturnValue,
>       ACPI_GENERIC_ADDRESS    *Reg)
>   {
> -    UINT32                  ValueLo;
> -    UINT32                  ValueHi;
> -    UINT32                  Width;
> -    UINT64                  Address;
>       ACPI_STATUS             Status;
>   
>   
>       ACPI_FUNCTION_NAME (AcpiRead);
>   
>   
> -    if (!ReturnValue)
> -    {
> -        return (AE_BAD_PARAMETER);
> -    }
> -
> -    /* Validate contents of the GAS register. Allow 64-bit transfers */
> -
> -    Status = AcpiHwValidateRegister (Reg, 64, &Address);
> -    if (ACPI_FAILURE (Status))
> -    {
> -        return (Status);
> -    }
> -
> -    /*
> -     * Two address spaces supported: Memory or I/O. PCI_Config is
> -     * not supported here because the GAS structure is insufficient
> -     */
> -    if (Reg->SpaceId == ACPI_ADR_SPACE_SYSTEM_MEMORY)
> -    {
> -        Status = AcpiOsReadMemory ((ACPI_PHYSICAL_ADDRESS)
> -            Address, ReturnValue, Reg->BitWidth);
> -        if (ACPI_FAILURE (Status))
> -        {
> -            return (Status);
> -        }
> -    }
> -    else /* ACPI_ADR_SPACE_SYSTEM_IO, validated earlier */
> -    {
> -        ValueLo = 0;
> -        ValueHi = 0;
> -
> -        Width = Reg->BitWidth;
> -        if (Width == 64)
> -        {
> -            Width = 32; /* Break into two 32-bit transfers */
> -        }
> -
> -        Status = AcpiHwReadPort ((ACPI_IO_ADDRESS)
> -            Address, &ValueLo, Width);
> -        if (ACPI_FAILURE (Status))
> -        {
> -            return (Status);
> -        }
> -
> -        if (Reg->BitWidth == 64)
> -        {
> -            /* Read the top 32 bits */
> -
> -            Status = AcpiHwReadPort ((ACPI_IO_ADDRESS)
> -                (Address + 4), &ValueHi, 32);
> -            if (ACPI_FAILURE (Status))
> -            {
> -                return (Status);
> -            }
> -        }
> -
> -        /* Set the return value only if status is AE_OK */
> -
> -        *ReturnValue = (ValueLo | ((UINT64) ValueHi << 32));
> -    }
> -
> -    ACPI_DEBUG_PRINT ((ACPI_DB_IO,
> -        "Read:  %8.8X%8.8X width %2d from %8.8X%8.8X (%s)\n",
> -        ACPI_FORMAT_UINT64 (*ReturnValue), Reg->BitWidth,
> -        ACPI_FORMAT_UINT64 (Address),
> -        AcpiUtGetRegionName (Reg->SpaceId)));
> -
> -    return (AE_OK);
> +    Status = AcpiHwRead (ReturnValue, Reg);
> +    return (Status);
>   }
>   
>   ACPI_EXPORT_SYMBOL (AcpiRead)
> @@ -348,67 +278,13 @@ AcpiWrite (
>       UINT64                  Value,
>       ACPI_GENERIC_ADDRESS    *Reg)
>   {
> -    UINT32                  Width;
> -    UINT64                  Address;
>       ACPI_STATUS             Status;
>   
>   
>       ACPI_FUNCTION_NAME (AcpiWrite);
>   
>   
> -    /* Validate contents of the GAS register. Allow 64-bit transfers */
> -
> -    Status = AcpiHwValidateRegister (Reg, 64, &Address);
> -    if (ACPI_FAILURE (Status))
> -    {
> -        return (Status);
> -    }
> -
> -    /*
> -     * Two address spaces supported: Memory or IO. PCI_Config is
> -     * not supported here because the GAS structure is insufficient
> -     */
> -    if (Reg->SpaceId == ACPI_ADR_SPACE_SYSTEM_MEMORY)
> -    {
> -        Status = AcpiOsWriteMemory ((ACPI_PHYSICAL_ADDRESS)
> -            Address, Value, Reg->BitWidth);
> -        if (ACPI_FAILURE (Status))
> -        {
> -            return (Status);
> -        }
> -    }
> -    else /* ACPI_ADR_SPACE_SYSTEM_IO, validated earlier */
> -    {
> -        Width = Reg->BitWidth;
> -        if (Width == 64)
> -        {
> -            Width = 32; /* Break into two 32-bit transfers */
> -        }
> -
> -        Status = AcpiHwWritePort ((ACPI_IO_ADDRESS)
> -            Address, ACPI_LODWORD (Value), Width);
> -        if (ACPI_FAILURE (Status))
> -        {
> -            return (Status);
> -        }
> -
> -        if (Reg->BitWidth == 64)
> -        {
> -            Status = AcpiHwWritePort ((ACPI_IO_ADDRESS)
> -                (Address + 4), ACPI_HIDWORD (Value), 32);
> -            if (ACPI_FAILURE (Status))
> -            {
> -                return (Status);
> -            }
> -        }
> -    }
> -
> -    ACPI_DEBUG_PRINT ((ACPI_DB_IO,
> -        "Wrote: %8.8X%8.8X width %2d   to %8.8X%8.8X (%s)\n",
> -        ACPI_FORMAT_UINT64 (Value), Reg->BitWidth,
> -        ACPI_FORMAT_UINT64 (Address),
> -        AcpiUtGetRegionName (Reg->SpaceId)));
> -
> +    Status = AcpiHwWrite (Value, Reg);
>       return (Status);
>   }
>   
> diff --git a/src/acpica/source/components/namespace/nsconvert.c b/src/acpica/source/components/namespace/nsconvert.c
> index daf8f475..bb825895 100644
> --- a/src/acpica/source/components/namespace/nsconvert.c
> +++ b/src/acpica/source/components/namespace/nsconvert.c
> @@ -191,8 +191,7 @@ AcpiNsConvertToInteger (
>   
>           /* String-to-Integer conversion */
>   
> -        Status = AcpiUtStrtoul64 (OriginalObject->String.Pointer,
> -            AcpiGbl_IntegerByteWidth, &Value);
> +        Status = AcpiUtStrtoul64 (OriginalObject->String.Pointer, &Value);
>           if (ACPI_FAILURE (Status))
>           {
>               return (Status);
> diff --git a/src/acpica/source/components/tables/tbxface.c b/src/acpica/source/components/tables/tbxface.c
> index d8cb6b18..6393bdac 100644
> --- a/src/acpica/source/components/tables/tbxface.c
> +++ b/src/acpica/source/components/tables/tbxface.c
> @@ -300,10 +300,13 @@ AcpiReallocateRootTable (
>   
>   
>       /*
> -     * Only reallocate the root table if the host provided a static buffer
> -     * for the table array in the call to AcpiInitializeTables.
> +     * If there are tables unverified, it is required to reallocate the
> +     * root table list to clean up invalid table entries. Otherwise only
> +     * reallocate the root table list if the host provided a static buffer
> +     * for the table array in the call to AcpiInitializeTables().
>        */
> -    if (AcpiGbl_RootTableList.Flags & ACPI_ROOT_ORIGIN_ALLOCATED)
> +    if ((AcpiGbl_RootTableList.Flags & ACPI_ROOT_ORIGIN_ALLOCATED) &&
> +        AcpiGbl_EnableTableValidation)
>       {
>           return_ACPI_STATUS (AE_SUPPORT);
>       }
> diff --git a/src/acpica/source/components/utilities/utstrsuppt.c b/src/acpica/source/components/utilities/utstrsuppt.c
> new file mode 100644
> index 00000000..9197a57a
> --- /dev/null
> +++ b/src/acpica/source/components/utilities/utstrsuppt.c
> @@ -0,0 +1,613 @@
> +/*******************************************************************************
> + *
> + * Module Name: utstrsuppt - Support functions for string-to-integer conversion
> + *
> + ******************************************************************************/
> +
> +/******************************************************************************
> + *
> + * 1. Copyright Notice
> + *
> + * Some or all of this work - Copyright (c) 1999 - 2017, Intel Corp.
> + * All rights reserved.
> + *
> + * 2. License
> + *
> + * 2.1. This is your license from Intel Corp. under its intellectual property
> + * rights. You may have additional license terms from the party that provided
> + * you this software, covering your right to use that party's intellectual
> + * property rights.
> + *
> + * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
> + * copy of the source code appearing in this file ("Covered Code") an
> + * irrevocable, perpetual, worldwide license under Intel's copyrights in the
> + * base code distributed originally by Intel ("Original Intel Code") to copy,
> + * make derivatives, distribute, use and display any portion of the Covered
> + * Code in any form, with the right to sublicense such rights; and
> + *
> + * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
> + * license (with the right to sublicense), under only those claims of Intel
> + * patents that are infringed by the Original Intel Code, to make, use, sell,
> + * offer to sell, and import the Covered Code and derivative works thereof
> + * solely to the minimum extent necessary to exercise the above copyright
> + * license, and in no event shall the patent license extend to any additions
> + * to or modifications of the Original Intel Code. No other license or right
> + * is granted directly or by implication, estoppel or otherwise;
> + *
> + * The above copyright and patent license is granted only if the following
> + * conditions are met:
> + *
> + * 3. Conditions
> + *
> + * 3.1. Redistribution of Source with Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification with rights to further distribute source must include
> + * the above Copyright Notice, the above License, this list of Conditions,
> + * and the following Disclaimer and Export Compliance provision. In addition,
> + * Licensee must cause all Covered Code to which Licensee contributes to
> + * contain a file documenting the changes Licensee made to create that Covered
> + * Code and the date of any change. Licensee must include in that file the
> + * documentation of any changes made by any predecessor Licensee. Licensee
> + * must include a prominent statement that the modification is derived,
> + * directly or indirectly, from Original Intel Code.
> + *
> + * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification without rights to further distribute source must
> + * include the following Disclaimer and Export Compliance provision in the
> + * documentation and/or other materials provided with distribution. In
> + * addition, Licensee may not authorize further sublicense of source of any
> + * portion of the Covered Code, and must include terms to the effect that the
> + * license from Licensee to its licensee is limited to the intellectual
> + * property embodied in the software Licensee provides to its licensee, and
> + * not to intellectual property embodied in modifications its licensee may
> + * make.
> + *
> + * 3.3. Redistribution of Executable. Redistribution in executable form of any
> + * substantial portion of the Covered Code or modification must reproduce the
> + * above Copyright Notice, and the following Disclaimer and Export Compliance
> + * provision in the documentation and/or other materials provided with the
> + * distribution.
> + *
> + * 3.4. Intel retains all right, title, and interest in and to the Original
> + * Intel Code.
> + *
> + * 3.5. Neither the name Intel nor any other trademark owned or controlled by
> + * Intel shall be used in advertising or otherwise to promote the sale, use or
> + * other dealings in products derived from or relating to the Covered Code
> + * without prior written authorization from Intel.
> + *
> + * 4. Disclaimer and Export Compliance
> + *
> + * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
> + * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
> + * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
> + * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
> + * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
> + * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
> + * PARTICULAR PURPOSE.
> + *
> + * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
> + * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
> + * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
> + * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
> + * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
> + * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
> + * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
> + * LIMITED REMEDY.
> + *
> + * 4.3. Licensee shall not export, either directly or indirectly, any of this
> + * software or system incorporating such software without first obtaining any
> + * required license or other approval from the U. S. Department of Commerce or
> + * any other agency or department of the United States Government. In the
> + * event Licensee exports any such software from the United States or
> + * re-exports any such software from a foreign destination, Licensee shall
> + * ensure that the distribution and export/re-export of the software is in
> + * compliance with all laws, regulations, orders, or other restrictions of the
> + * U.S. Export Administration Regulations. Licensee agrees that neither it nor
> + * any of its subsidiaries will export/re-export any technical data, process,
> + * software, or service, directly or indirectly, to any country for which the
> + * United States government or any agency thereof requires an export license,
> + * other governmental approval, or letter of assurance, without first obtaining
> + * such license, approval or letter.
> + *
> + *****************************************************************************
> + *
> + * Alternatively, you may choose to be licensed under the terms of the
> + * following license:
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + *    notice, this list of conditions, and the following disclaimer,
> + *    without modification.
> + * 2. Redistributions in binary form must reproduce at minimum a disclaimer
> + *    substantially similar to the "NO WARRANTY" disclaimer below
> + *    ("Disclaimer") and any redistribution must be conditioned upon
> + *    including a substantially similar Disclaimer requirement for further
> + *    binary redistribution.
> + * 3. Neither the names of the above-listed copyright holders nor the names
> + *    of any contributors may be used to endorse or promote products derived
> + *    from this software without specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
> + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
> + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
> + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
> + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + *
> + * Alternatively, you may choose to be licensed under the terms of the
> + * GNU General Public License ("GPL") version 2 as published by the Free
> + * Software Foundation.
> + *
> + *****************************************************************************/
> +
> +#include "acpi.h"
> +#include "accommon.h"
> +
> +#define _COMPONENT          ACPI_UTILITIES
> +        ACPI_MODULE_NAME    ("utstrsuppt")
> +
> +
> +/* Local prototypes */
> +
> +static ACPI_STATUS
> +AcpiUtInsertDigit (
> +    UINT64                  *AccumulatedValue,
> +    UINT32                  Base,
> +    int                     AsciiDigit);
> +
> +static ACPI_STATUS
> +AcpiUtStrtoulMultiply64 (
> +    UINT64                  Multiplicand,
> +    UINT64                  Multiplier,
> +    UINT64                  *OutProduct);
> +
> +static ACPI_STATUS
> +AcpiUtStrtoulAdd64 (
> +    UINT64                  Addend1,
> +    UINT64                  Addend2,
> +    UINT64                  *OutSum);
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiUtConvertOctalString
> + *
> + * PARAMETERS:  String                  - Null terminated input string
> + *              ReturnValuePtr          - Where the converted value is returned
> + *
> + * RETURN:      Status and 64-bit converted integer
> + *
> + * DESCRIPTION: Performs a base 8 conversion of the input string to an
> + *              integer value, either 32 or 64 bits.
> + *
> + * NOTE:        Maximum 64-bit unsigned octal value is 01777777777777777777777
> + *              Maximum 32-bit unsigned octal value is 037777777777
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AcpiUtConvertOctalString (
> +    char                    *String,
> +    UINT64                  *ReturnValuePtr)
> +{
> +    UINT64                  AccumulatedValue = 0;
> +    ACPI_STATUS             Status = AE_OK;
> +
> +
> +    /* Convert each ASCII byte in the input string */
> +
> +    while (*String)
> +    {
> +        /* Character must be ASCII 0-7, otherwise terminate with no error */
> +
> +        if (!(ACPI_IS_OCTAL_DIGIT (*String)))
> +        {
> +            break;
> +        }
> +
> +        /* Convert and insert this octal digit into the accumulator */
> +
> +        Status = AcpiUtInsertDigit (&AccumulatedValue, 8, *String);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            Status = AE_OCTAL_OVERFLOW;
> +            break;
> +        }
> +
> +        String++;
> +    }
> +
> +    /* Always return the value that has been accumulated */
> +
> +    *ReturnValuePtr = AccumulatedValue;
> +    return (Status);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiUtConvertDecimalString
> + *
> + * PARAMETERS:  String                  - Null terminated input string
> + *              ReturnValuePtr          - Where the converted value is returned
> + *
> + * RETURN:      Status and 64-bit converted integer
> + *
> + * DESCRIPTION: Performs a base 10 conversion of the input string to an
> + *              integer value, either 32 or 64 bits.
> + *
> + * NOTE:        Maximum 64-bit unsigned decimal value is 18446744073709551615
> + *              Maximum 32-bit unsigned decimal value is 4294967295
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AcpiUtConvertDecimalString (
> +    char                    *String,
> +    UINT64                  *ReturnValuePtr)
> +{
> +    UINT64                  AccumulatedValue = 0;
> +    ACPI_STATUS             Status = AE_OK;
> +
> +
> +    /* Convert each ASCII byte in the input string */
> +
> +    while (*String)
> +    {
> +        /* Character must be ASCII 0-9, otherwise terminate with no error */
> +
> +        if (!isdigit (*String))
> +        {
> +           break;
> +        }
> +
> +        /* Convert and insert this decimal digit into the accumulator */
> +
> +        Status = AcpiUtInsertDigit (&AccumulatedValue, 10, *String);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            Status = AE_DECIMAL_OVERFLOW;
> +            break;
> +        }
> +
> +        String++;
> +    }
> +
> +    /* Always return the value that has been accumulated */
> +
> +    *ReturnValuePtr = AccumulatedValue;
> +    return (Status);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiUtConvertHexString
> + *
> + * PARAMETERS:  String                  - Null terminated input string
> + *              ReturnValuePtr          - Where the converted value is returned
> + *
> + * RETURN:      Status and 64-bit converted integer
> + *
> + * DESCRIPTION: Performs a base 16 conversion of the input string to an
> + *              integer value, either 32 or 64 bits.
> + *
> + * NOTE:        Maximum 64-bit unsigned hex value is 0xFFFFFFFFFFFFFFFF
> + *              Maximum 32-bit unsigned hex value is 0xFFFFFFFF
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AcpiUtConvertHexString (
> +    char                    *String,
> +    UINT64                  *ReturnValuePtr)
> +{
> +    UINT64                  AccumulatedValue = 0;
> +    ACPI_STATUS             Status = AE_OK;
> +
> +
> +    /* Convert each ASCII byte in the input string */
> +
> +    while (*String)
> +    {
> +        /* Must be ASCII A-F, a-f, or 0-9, otherwise terminate with no error */
> +
> +        if (!isxdigit (*String))
> +        {
> +            break;
> +        }
> +
> +        /* Convert and insert this hex digit into the accumulator */
> +
> +        Status = AcpiUtInsertDigit (&AccumulatedValue, 16, *String);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            Status = AE_HEX_OVERFLOW;
> +            break;
> +        }
> +
> +        String++;
> +    }
> +
> +    /* Always return the value that has been accumulated */
> +
> +    *ReturnValuePtr = AccumulatedValue;
> +    return (Status);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiUtRemoveLeadingZeros
> + *
> + * PARAMETERS:  String                  - Pointer to input ASCII string
> + *
> + * RETURN:      Next character after any leading zeros. This character may be
> + *              used by the caller to detect end-of-string.
> + *
> + * DESCRIPTION: Remove any leading zeros in the input string. Return the
> + *              next character after the final ASCII zero to enable the caller
> + *              to check for the end of the string (NULL terminator).
> + *
> + ******************************************************************************/
> +
> +char
> +AcpiUtRemoveLeadingZeros (
> +    char                    **String)
> +{
> +
> +    while (**String == ACPI_ASCII_ZERO)
> +    {
> +        *String += 1;
> +    }
> +
> +    return (**String);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiUtRemoveWhitespace
> + *
> + * PARAMETERS:  String                  - Pointer to input ASCII string
> + *
> + * RETURN:      Next character after any whitespace. This character may be
> + *              used by the caller to detect end-of-string.
> + *
> + * DESCRIPTION: Remove any leading whitespace in the input string. Return the
> + *              next character after the final ASCII zero to enable the caller
> + *              to check for the end of the string (NULL terminator).
> + *
> + ******************************************************************************/
> +
> +char
> +AcpiUtRemoveWhitespace (
> +    char                    **String)
> +{
> +
> +    while (isspace ((UINT8) **String))
> +    {
> +        *String += 1;
> +    }
> +
> +    return (**String);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiUtDetectHexPrefix
> + *
> + * PARAMETERS:  String                  - Pointer to input ASCII string
> + *
> + * RETURN:      TRUE if a "0x" prefix was found at the start of the string
> + *
> + * DESCRIPTION: Detect and remove a hex "0x" prefix
> + *
> + ******************************************************************************/
> +
> +BOOLEAN
> +AcpiUtDetectHexPrefix (
> +    char                    **String)
> +{
> +
> +    if ((**String == ACPI_ASCII_ZERO) &&
> +        (tolower ((int) *(*String + 1)) == 'x'))
> +    {
> +        *String += 2;        /* Go past the leading 0x */
> +        return (TRUE);
> +    }
> +
> +    return (FALSE);     /* Not a hex string */
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiUtDetectOctalPrefix
> + *
> + * PARAMETERS:  String                  - Pointer to input ASCII string
> + *
> + * RETURN:      True if an octal "0" prefix was found at the start of the
> + *              string
> + *
> + * DESCRIPTION: Detect and remove an octal prefix (zero)
> + *
> + ******************************************************************************/
> +
> +BOOLEAN
> +AcpiUtDetectOctalPrefix (
> +    char                    **String)
> +{
> +
> +    if (**String == ACPI_ASCII_ZERO)
> +    {
> +        *String += 1;       /* Go past the leading 0 */
> +        return (TRUE);
> +    }
> +
> +    return (FALSE);     /* Not an octal string */
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiUtInsertDigit
> + *
> + * PARAMETERS:  AccumulatedValue        - Current value of the integer value
> + *                                        accumulator. The new value is
> + *                                        returned here.
> + *              Base                    - Radix, either 8/10/16
> + *              AsciiDigit              - ASCII single digit to be inserted
> + *
> + * RETURN:      Status and result of the convert/insert operation. The only
> + *              possible returned exception code is numeric overflow of
> + *              either the multiply or add conversion operations.
> + *
> + * DESCRIPTION: Generic conversion and insertion function for all bases:
> + *
> + *              1) Multiply the current accumulated/converted value by the
> + *              base in order to make room for the new character.
> + *
> + *              2) Convert the new character to binary and add it to the
> + *              current accumulated value.
> + *
> + *              Note: The only possible exception indicates an integer
> + *              overflow (AE_NUMERIC_OVERFLOW)
> + *
> + ******************************************************************************/
> +
> +static ACPI_STATUS
> +AcpiUtInsertDigit (
> +    UINT64                  *AccumulatedValue,
> +    UINT32                  Base,
> +    int                     AsciiDigit)
> +{
> +    ACPI_STATUS             Status;
> +    UINT64                  Product;
> +
> +
> +     /* Make room in the accumulated value for the incoming digit */
> +
> +    Status = AcpiUtStrtoulMultiply64 (*AccumulatedValue, Base, &Product);
> +    if (ACPI_FAILURE (Status))
> +    {
> +        return (Status);
> +    }
> +
> +    /* Add in the new digit, and store the sum to the accumulated value */
> +
> +    Status = AcpiUtStrtoulAdd64 (Product, AcpiUtAsciiCharToHex (AsciiDigit),
> +        AccumulatedValue);
> +
> +    return (Status);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiUtStrtoulMultiply64
> + *
> + * PARAMETERS:  Multiplicand            - Current accumulated converted integer
> + *              Multiplier              - Base/Radix
> + *              OutProduct              - Where the product is returned
> + *
> + * RETURN:      Status and 64-bit product
> + *
> + * DESCRIPTION: Multiply two 64-bit values, with checking for 64-bit overflow as
> + *              well as 32-bit overflow if necessary (if the current global
> + *              integer width is 32).
> + *
> + ******************************************************************************/
> +
> +static ACPI_STATUS
> +AcpiUtStrtoulMultiply64 (
> +    UINT64                  Multiplicand,
> +    UINT64                  Multiplier,
> +    UINT64                  *OutProduct)
> +{
> +    UINT64                  Product;
> +
> +
> +    /* Exit if either operand is zero */
> +
> +    *OutProduct = 0;
> +    if (!Multiplicand || !Multiplier)
> +    {
> +        return (AE_OK);
> +    }
> +
> +    /* Check for 64-bit overflow before the actual multiplication */
> +
> +    if (Multiplicand > (ACPI_UINT64_MAX / Multiplier))
> +    {
> +        return (AE_NUMERIC_OVERFLOW);
> +    }
> +
> +    Product = Multiplicand * Multiplier;
> +
> +    /* Check for 32-bit overflow if necessary */
> +
> +    if ((AcpiGbl_IntegerBitWidth == 32) && (Product > ACPI_UINT32_MAX))
> +    {
> +        return (AE_NUMERIC_OVERFLOW);
> +    }
> +
> +    *OutProduct = Product;
> +    return (AE_OK);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiUtStrtoulAdd64
> + *
> + * PARAMETERS:  Addend1                 - Current accumulated converted integer
> + *              Addend2                 - New hex value/char
> + *              OutSum                  - Where sum is returned (Accumulator)
> + *
> + * RETURN:      Status and 64-bit sum
> + *
> + * DESCRIPTION: Add two 64-bit values, with checking for 64-bit overflow as
> + *              well as 32-bit overflow if necessary (if the current global
> + *              integer width is 32).
> + *
> + ******************************************************************************/
> +
> +static ACPI_STATUS
> +AcpiUtStrtoulAdd64 (
> +    UINT64                  Addend1,
> +    UINT64                  Addend2,
> +    UINT64                  *OutSum)
> +{
> +    UINT64                  Sum;
> +
> +
> +    /* Check for 64-bit overflow before the actual addition */
> +
> +    if ((Addend1 > 0) && (Addend2 > (ACPI_UINT64_MAX - Addend1)))
> +    {
> +        return (AE_NUMERIC_OVERFLOW);
> +    }
> +
> +    Sum = Addend1 + Addend2;
> +
> +    /* Check for 32-bit overflow if necessary */
> +
> +    if ((AcpiGbl_IntegerBitWidth == 32) && (Sum > ACPI_UINT32_MAX))
> +    {
> +        return (AE_NUMERIC_OVERFLOW);
> +    }
> +
> +    *OutSum = Sum;
> +    return (AE_OK);
> +}
> diff --git a/src/acpica/source/components/utilities/utstrtoul64.c b/src/acpica/source/components/utilities/utstrtoul64.c
> index d91e9084..34cef95b 100644
> --- a/src/acpica/source/components/utilities/utstrtoul64.c
> +++ b/src/acpica/source/components/utilities/utstrtoul64.c
> @@ -1,6 +1,7 @@
>   /*******************************************************************************
>    *
> - * Module Name: utstrtoul64 - string to 64-bit integer support
> + * Module Name: utstrtoul64 - String-to-integer conversion support for both
> + *                            64-bit and 32-bit integers
>    *
>    ******************************************************************************/
>   
> @@ -152,84 +153,47 @@
>   #include "acpi.h"
>   #include "accommon.h"
>   
> -
> -/*******************************************************************************
> - *
> - * The functions in this module satisfy the need for 64-bit string-to-integer
> - * conversions on both 32-bit and 64-bit platforms.
> - *
> - ******************************************************************************/
> -
>   #define _COMPONENT          ACPI_UTILITIES
>           ACPI_MODULE_NAME    ("utstrtoul64")
>   
> -/* Local prototypes */
> -
> -static UINT64
> -AcpiUtStrtoulBase10 (
> -    char                    *String,
> -    UINT32                  Flags);
> -
> -static UINT64
> -AcpiUtStrtoulBase16 (
> -    char                    *String,
> -    UINT32                  Flags);
> -
>   
>   /*******************************************************************************
>    *
> - * String conversion rules as written in the ACPI specification. The error
> - * conditions and behavior are different depending on the type of conversion.
> - *
> - *
> - * Implicit data type conversion: string-to-integer
> - * --------------------------------------------------
> - *
> - * Base is always 16. This is the ACPI_STRTOUL_BASE16 case.
> - *
> - * Example:
> - *      Add ("BA98", Arg0, Local0)
> - *
> - * The integer is initialized to the value zero.
> - * The ASCII string is interpreted as a hexadecimal constant.
> - *
> - *  1)  A "0x" prefix is not allowed. However, ACPICA allows this for
> - *      compatibility with previous ACPICA. (NO ERROR)
> - *
> - *  2)  Terminates when the size of an integer is reached (32 or 64 bits).
> - *      (NO ERROR)
> - *
> - *  3)  The first non-hex character terminates the conversion without error.
> - *      (NO ERROR)
> - *
> - *  4)  Conversion of a null (zero-length) string to an integer is not
> - *      allowed. However, ACPICA allows this for compatibility with previous
> - *      ACPICA. This conversion returns the value 0. (NO ERROR)
> + * This module contains the top-level string to 64/32-bit unsigned integer
> + * conversion functions:
>    *
> + *  1) A standard strtoul() function that supports 64-bit integers, base
> + *     8/10/16, with integer overflow support. This is used mainly by the
> + *     iASL compiler, which implements tighter constraints on integer
> + *     constants than the runtime (interpreter) integer-to-string conversions.
> + *  2) Runtime "Explicit conversion" as defined in the ACPI specification.
> + *  3) Runtime "Implicit conversion" as defined in the ACPI specification.
>    *
> - * Explicit data type conversion:  ToInteger() with string operand
> - * ---------------------------------------------------------------
> + * Current users of this module:
>    *
> - * Base is either 10 (default) or 16 (with 0x prefix)
> - *
> - * Examples:
> - *      ToInteger ("1000")
> - *      ToInteger ("0xABCD")
> - *
> - *  1)  Can be (must be) either a decimal or hexadecimal numeric string.
> - *      A hex value must be prefixed by "0x" or it is interpreted as a decimal.
> + *  iASL        - Preprocessor (constants and math expressions)
> + *  iASL        - Main parser, conversion of constants to integers
> + *  iASL        - Data Table Compiler parser (constants and math expressions)
> + *  Interpreter - Implicit and explicit conversions, GPE method names
> + *  Interpreter - Repair code for return values from predefined names
> + *  Debugger    - Command line input string conversion
> + *  AcpiDump    - ACPI table physical addresses
> + *  AcpiExec    - Support for namespace overrides
>    *
> - *  2)  The value must not exceed the maximum of an integer value. ACPI spec
> - *      states the behavior is "unpredictable", so ACPICA matches the behavior
> - *      of the implicit conversion case.(NO ERROR)
> + * Notes concerning users of these interfaces:
>    *
> - *  3)  Behavior on the first non-hex character is not specified by the ACPI
> - *      spec, so ACPICA matches the behavior of the implicit conversion case
> - *      and terminates. (NO ERROR)
> + * AcpiGbl_IntegerByteWidth is used to set the 32/64 bit limit for explicit
> + * and implicit conversions. This global must be set to the proper width.
> + * For the core ACPICA code, the width depends on the DSDT version. For the
> + * AcpiUtStrtoul64 interface, all conversions are 64 bits. This interface is
> + * used primarily for iASL, where the default width is 64 bits for all parsers,
> + * but error checking is performed later to flag cases where a 64-bit constant
> + * is wrongly defined in a 32-bit DSDT/SSDT.
>    *
> - *  4)  A null (zero-length) string is illegal.
> - *      However, ACPICA allows this for compatibility with previous ACPICA.
> - *      This conversion returns the value 0. (NO ERROR)
> + * In ACPI, the only place where octal numbers are supported is within
> + * the ASL language itself. This is implemented via the main AcpiUtStrtoul64
> + * interface. According the ACPI specification, there is no ACPI runtime
> + * support (explicit/implicit) for octal string conversions.
>    *
>    ******************************************************************************/
>   
> @@ -238,261 +202,301 @@ AcpiUtStrtoulBase16 (
>    *
>    * FUNCTION:    AcpiUtStrtoul64
>    *
> - * PARAMETERS:  String                  - Null terminated input string
> - *              Flags                   - Conversion info, see below
> + * PARAMETERS:  String                  - Null terminated input string,
> + *                                        must be a valid pointer
>    *              ReturnValue             - Where the converted integer is
> - *                                        returned
> - *
> - * RETURN:      Status and Converted value
> + *                                        returned. Must be a valid pointer
>    *
> - * DESCRIPTION: Convert a string into an unsigned value. Performs either a
> - *              32-bit or 64-bit conversion, depending on the input integer
> - *              size in Flags (often the current mode of the interpreter).
> + * RETURN:      Status and converted integer. Returns an exception on a
> + *              64-bit numeric overflow
>    *
> - * Values for Flags:
> - *      ACPI_STRTOUL_32BIT      - Max integer value is 32 bits
> - *      ACPI_STRTOUL_64BIT      - Max integer value is 64 bits
> - *      ACPI_STRTOUL_BASE16     - Input string is hexadecimal. Default
> - *                                is 10/16 based on string prefix (0x).
> + * DESCRIPTION: Convert a string into an unsigned integer. Always performs a
> + *              full 64-bit conversion, regardless of the current global
> + *              integer width. Supports Decimal, Hex, and Octal strings.
>    *
> - * NOTES:
> - *   Negative numbers are not supported, as they are not supported by ACPI.
> + * Current users of this function:
>    *
> - *   Supports only base 16 or base 10 strings/values. Does not
> - *   support Octal strings, as these are not supported by ACPI.
> - *
> - * Current users of this support:
> - *
> - *  Interpreter - Implicit and explicit conversions, GPE method names
> - *  Debugger    - Command line input string conversion
> - *  iASL        - Main parser, conversion of constants to integers
> - *  iASL        - Data Table Compiler parser (constant math expressions)
> - *  iASL        - Preprocessor (constant math expressions)
> - *  AcpiDump    - Input table addresses
> - *  AcpiExec    - Testing of the AcpiUtStrtoul64 function
> - *
> - * Note concerning callers:
> - *   AcpiGbl_IntegerByteWidth can be used to set the 32/64 limit. If used,
> - *   this global should be set to the proper width. For the core ACPICA code,
> - *   this width depends on the DSDT version. For iASL, the default byte
> - *   width is always 8 for the parser, but error checking is performed later
> - *   to flag cases where a 64-bit constant is defined in a 32-bit DSDT/SSDT.
> + *  iASL        - Preprocessor (constants and math expressions)
> + *  iASL        - Main ASL parser, conversion of ASL constants to integers
> + *  iASL        - Data Table Compiler parser (constants and math expressions)
> + *  Interpreter - Repair code for return values from predefined names
> + *  AcpiDump    - ACPI table physical addresses
> + *  AcpiExec    - Support for namespace overrides
>    *
>    ******************************************************************************/
>   
>   ACPI_STATUS
>   AcpiUtStrtoul64 (
>       char                    *String,
> -    UINT32                  Flags,
>       UINT64                  *ReturnValue)
>   {
>       ACPI_STATUS             Status = AE_OK;
> -    UINT32                  Base;
> +    UINT8                   OriginalBitWidth;
> +    UINT32                  Base = 10;          /* Default is decimal */
>   
>   
>       ACPI_FUNCTION_TRACE_STR (UtStrtoul64, String);
>   
>   
> -    /* Parameter validation */
> -
> -    if (!String || !ReturnValue)
> -    {
> -        return_ACPI_STATUS (AE_BAD_PARAMETER);
> -    }
> -
>       *ReturnValue = 0;
>   
> -    /* Check for zero-length string, returns 0 */
> +    /* A NULL return string returns a value of zero */
>   
>       if (*String == 0)
>       {
>           return_ACPI_STATUS (AE_OK);
>       }
>   
> -    /* Skip over any white space at start of string */
> -
> -    while (isspace ((int) *String))
> -    {
> -        String++;
> -    }
> -
> -    /* End of string? return 0 */
> -
> -    if (*String == 0)
> +    if (!AcpiUtRemoveWhitespace (&String))
>       {
>           return_ACPI_STATUS (AE_OK);
>       }
>   
>       /*
> -     * 1) The "0x" prefix indicates base 16. Per the ACPI specification,
> -     * the "0x" prefix is only allowed for implicit (non-strict) conversions.
> -     * However, we always allow it for compatibility with older ACPICA.
> +     * 1) Check for a hex constant. A "0x" prefix indicates base 16.
>        */
> -    if ((*String == ACPI_ASCII_ZERO) &&
> -        (tolower ((int) *(String + 1)) == 'x'))
> +    if (AcpiUtDetectHexPrefix (&String))
>       {
> -        String += 2;    /* Go past the 0x */
> -        if (*String == 0)
> -        {
> -            return_ACPI_STATUS (AE_OK);     /* Return value 0 */
> -        }
> -
>           Base = 16;
>       }
>   
> -    /* 2) Force to base 16 (implicit conversion case) */
> -
> -    else if (Flags & ACPI_STRTOUL_BASE16)
> +    /*
> +     * 2) Check for an octal constant, defined to be a leading zero
> +     * followed by sequence of octal digits (0-7)
> +     */
> +    else if (AcpiUtDetectOctalPrefix (&String))
>       {
> -        Base = 16;
> +        Base = 8;
>       }
>   
> -    /* 3) Default fallback is to Base 10 */
> -
> -    else
> +    if (!AcpiUtRemoveLeadingZeros (&String))
>       {
> -        Base = 10;
> +        return_ACPI_STATUS (AE_OK);     /* Return value 0 */
>       }
>   
> -    /* Skip all leading zeros */
> +    /*
> +     * Force a full 64-bit conversion. The caller (usually iASL) must
> +     * check for a 32-bit overflow later as necessary (If current mode
> +     * is 32-bit, meaning a 32-bit DSDT).
> +     */
> +    OriginalBitWidth = AcpiGbl_IntegerBitWidth;
> +    AcpiGbl_IntegerBitWidth = 64;
>   
> -    while (*String == ACPI_ASCII_ZERO)
> +    /*
> +     * Perform the base 8, 10, or 16 conversion. A 64-bit numeric overflow
> +     * will return an exception (to allow iASL to flag the statement).
> +     */
> +    switch (Base)
>       {
> -        String++;
> -        if (*String == 0)
> -        {
> -            return_ACPI_STATUS (AE_OK);     /* Return value 0 */
> -        }
> +    case 8:
> +        Status = AcpiUtConvertOctalString (String, ReturnValue);
> +        break;
> +
> +    case 10:
> +        Status = AcpiUtConvertDecimalString (String, ReturnValue);
> +        break;
> +
> +    case 16:
> +    default:
> +        Status = AcpiUtConvertHexString (String, ReturnValue);
> +        break;
>       }
>   
> -    /* Perform the base 16 or 10 conversion */
> -
> -    if (Base == 16)
> -    {
> -        *ReturnValue = AcpiUtStrtoulBase16 (String, Flags);
> -    }
> -    else
> -    {
> -        *ReturnValue = AcpiUtStrtoulBase10 (String, Flags);
> -    }
> +    /* Only possible exception from above is a 64-bit overflow */
>   
> +    AcpiGbl_IntegerBitWidth = OriginalBitWidth;
>       return_ACPI_STATUS (Status);
>   }
>   
>   
>   /*******************************************************************************
>    *
> - * FUNCTION:    AcpiUtStrtoulBase10
> + * FUNCTION:    AcpiUtImplicitStrtoul64
> + *
> + * PARAMETERS:  String                  - Null terminated input string,
> + *                                        must be a valid pointer
> + *
> + * RETURN:      Converted integer
> + *
> + * DESCRIPTION: Perform a 64-bit conversion with restrictions placed upon
> + *              an "implicit conversion" by the ACPI specification. Used by
> + *              many ASL operators that require an integer operand, and support
> + *              an automatic (implicit) conversion from a string operand
> + *              to the final integer operand. The major restriction is that
> + *              only hex strings are supported.
> + *
> + * -----------------------------------------------------------------------------
> + *
> + * Base is always 16, either with or without the 0x prefix. Decimal and
> + * Octal strings are not supported, as per the ACPI specification.
> + *
> + * Examples (both are hex values):
> + *      Add ("BA98", Arg0, Local0)
> + *      Subtract ("0x12345678", Arg1, Local1)
> + *
> + * Conversion rules as extracted from the ACPI specification:
> + *
> + *  The converted integer is initialized to the value zero.
> + *  The ASCII string is always interpreted as a hexadecimal constant.
> + *
> + *  1)  According to the ACPI specification, a "0x" prefix is not allowed.
> + *      However, ACPICA allows this as an ACPI extension on general
> + *      principle. (NO ERROR)
> + *
> + *  2)  The conversion terminates when the size of an integer is reached
> + *      (32 or 64 bits). There are no numeric overflow conditions. (NO ERROR)
> + *
> + *  3)  The first non-hex character terminates the conversion and returns
> + *      the current accumulated value of the converted integer (NO ERROR).
>    *
> - * PARAMETERS:  String                  - Null terminated input string
> - *              Flags                   - Conversion info
> + *  4)  Conversion of a null (zero-length) string to an integer is
> + *      technically not allowed. However, ACPICA allows this as an ACPI
> + *      extension. The conversion returns the value 0. (NO ERROR)
>    *
> - * RETURN:      64-bit converted integer
> + * NOTE: There are no error conditions returned by this function. At
> + * the minimum, a value of zero is returned.
>    *
> - * DESCRIPTION: Performs a base 10 conversion of the input string to an
> - *              integer value, either 32 or 64 bits.
> - *              Note: String must be valid and non-null.
> + * Current users of this function:
> + *
> + *  Interpreter - All runtime implicit conversions, as per ACPI specification
> + *  iASL        - Data Table Compiler parser (constants and math expressions)
>    *
>    ******************************************************************************/
>   
> -static UINT64
> -AcpiUtStrtoulBase10 (
> -    char                    *String,
> -    UINT32                  Flags)
> +UINT64
> +AcpiUtImplicitStrtoul64 (
> +    char                    *String)
>   {
> -    int                     AsciiDigit;
> -    UINT64                  NextValue;
> -    UINT64                  ReturnValue = 0;
> +    UINT64                  ConvertedInteger = 0;
>   
>   
> -    /* Main loop: convert each ASCII byte in the input string */
> -
> -    while (*String)
> -    {
> -        AsciiDigit = *String;
> -        if (!isdigit (AsciiDigit))
> -        {
> -            /* Not ASCII 0-9, terminate */
> +    ACPI_FUNCTION_TRACE_STR (UtImplicitStrtoul64, String);
>   
> -            goto Exit;
> -        }
>   
> -        /* Convert and insert (add) the decimal digit */
> -
> -        AcpiUtShortMultiply (ReturnValue, 10, &NextValue);
> -        NextValue += (AsciiDigit - ACPI_ASCII_ZERO);
> -
> -        /* Check for overflow (32 or 64 bit) - return current converted value */
> +    if (!AcpiUtRemoveWhitespace (&String))
> +    {
> +        return_VALUE (0);
> +    }
>   
> -        if (((Flags & ACPI_STRTOUL_32BIT) && (NextValue > ACPI_UINT32_MAX)) ||
> -            (NextValue < ReturnValue)) /* 64-bit overflow case */
> -        {
> -            goto Exit;
> -        }
> +    /*
> +     * Per the ACPI specification, only hexadecimal is supported for
> +     * implicit conversions, and the "0x" prefix is "not allowed".
> +     * However, allow a "0x" prefix as an ACPI extension.
> +     */
> +    AcpiUtDetectHexPrefix (&String);
>   
> -        ReturnValue = NextValue;
> -        String++;
> +    if (!AcpiUtRemoveLeadingZeros (&String))
> +    {
> +        return_VALUE (0);
>       }
>   
> -Exit:
> -    return (ReturnValue);
> +    /*
> +     * Ignore overflow as per the ACPI specification. This is implemented by
> +     * ignoring the return status from the conversion function called below.
> +     * On overflow, the input string is simply truncated.
> +     */
> +    AcpiUtConvertHexString (String, &ConvertedInteger);
> +    return_VALUE (ConvertedInteger);
>   }
>   
>   
>   /*******************************************************************************
>    *
> - * FUNCTION:    AcpiUtStrtoulBase16
> + * FUNCTION:    AcpiUtExplicitStrtoul64
> + *
> + * PARAMETERS:  String                  - Null terminated input string,
> + *                                        must be a valid pointer
>    *
> - * PARAMETERS:  String                  - Null terminated input string
> - *              Flags                   - conversion info
> + * RETURN:      Converted integer
>    *
> - * RETURN:      64-bit converted integer
> + * DESCRIPTION: Perform a 64-bit conversion with the restrictions placed upon
> + *              an "explicit conversion" by the ACPI specification. The
> + *              main restriction is that only hex and decimal are supported.
>    *
> - * DESCRIPTION: Performs a base 16 conversion of the input string to an
> - *              integer value, either 32 or 64 bits.
> - *              Note: String must be valid and non-null.
> + * -----------------------------------------------------------------------------
> + *
> + * Base is either 10 (default) or 16 (with 0x prefix). Octal (base 8) strings
> + * are not supported, as per the ACPI specification.
> + *
> + * Examples:
> + *      ToInteger ("1000")      Decimal
> + *      ToInteger ("0xABCD")    Hex
> + *
> + * Conversion rules as extracted from the ACPI specification:
> + *
> + *  1)  The input string is either a decimal or hexadecimal numeric string.
> + *      A hex value must be prefixed by "0x" or it is interpreted as decimal.
> + *
> + *  2)  The value must not exceed the maximum of an integer value
> + *      (32 or 64 bits). The ACPI specification states the behavior is
> + *      "unpredictable", so ACPICA matches the behavior of the implicit
> + *      conversion case. There are no numeric overflow conditions. (NO ERROR)
> + *
> + *  3)  Behavior on the first non-hex character is not defined by the ACPI
> + *      specification (for the ToInteger operator), so ACPICA matches the
> + *      behavior of the implicit conversion case. It terminates the
> + *      conversion and returns the current accumulated value of the converted
> + *      integer. (NO ERROR)
> + *
> + *  4)  Conversion of a null (zero-length) string to an integer is
> + *      technically not allowed. However, ACPICA allows this as an ACPI
> + *      extension. The conversion returns the value 0. (NO ERROR)
> + *
> + * NOTE: There are no error conditions returned by this function. At the
> + * minimum, a value of zero is returned.
> + *
> + * Current users of this function:
> + *
> + *  Interpreter - Runtime ASL ToInteger operator, as per the ACPI specification
>    *
>    ******************************************************************************/
>   
> -static UINT64
> -AcpiUtStrtoulBase16 (
> -    char                    *String,
> -    UINT32                  Flags)
> +UINT64
> +AcpiUtExplicitStrtoul64 (
> +    char                    *String)
>   {
> -    int                     AsciiDigit;
> -    UINT32                  ValidDigits = 1;
> -    UINT64                  ReturnValue = 0;
> -
> +    UINT64                  ConvertedInteger = 0;
> +    UINT32                  Base = 10;          /* Default is decimal */
>   
> -    /* Main loop: convert each ASCII byte in the input string */
>   
> -    while (*String)
> -    {
> -        /* Check for overflow (32 or 64 bit) - return current converted value */
> +    ACPI_FUNCTION_TRACE_STR (UtExplicitStrtoul64, String);
>   
> -        if ((ValidDigits > 16) ||
> -            ((ValidDigits > 8) && (Flags & ACPI_STRTOUL_32BIT)))
> -        {
> -            goto Exit;
> -        }
>   
> -        AsciiDigit = *String;
> -        if (!isxdigit (AsciiDigit))
> -        {
> -            /* Not Hex ASCII A-F, a-f, or 0-9, terminate */
> -
> -            goto Exit;
> -        }
> +    if (!AcpiUtRemoveWhitespace (&String))
> +    {
> +        return_VALUE (0);
> +    }
>   
> -        /* Convert and insert the hex digit */
> +    /*
> +     * Only Hex and Decimal are supported, as per the ACPI specification.
> +     * A "0x" prefix indicates hex; otherwise decimal is assumed.
> +     */
> +    if (AcpiUtDetectHexPrefix (&String))
> +    {
> +        Base = 16;
> +    }
>   
> -        AcpiUtShortShiftLeft (ReturnValue, 4, &ReturnValue);
> -        ReturnValue |= AcpiUtAsciiCharToHex (AsciiDigit);
> +    if (!AcpiUtRemoveLeadingZeros (&String))
> +    {
> +        return_VALUE (0);
> +    }
>   
> -        String++;
> -        ValidDigits++;
> +    /*
> +     * Ignore overflow as per the ACPI specification. This is implemented by
> +     * ignoring the return status from the conversion functions called below.
> +     * On overflow, the input string is simply truncated.
> +     */
> +    switch (Base)
> +    {
> +    case 10:
> +    default:
> +        AcpiUtConvertDecimalString (String, &ConvertedInteger);
> +        break;
> +
> +    case 16:
> +        AcpiUtConvertHexString (String, &ConvertedInteger);
> +        break;
>       }
>   
> -Exit:
> -    return (ReturnValue);
> +    return_VALUE (ConvertedInteger);
>   }
> diff --git a/src/acpica/source/include/acexcep.h b/src/acpica/source/include/acexcep.h
> index 1405e411..d808f275 100644
> --- a/src/acpica/source/include/acexcep.h
> +++ b/src/acpica/source/include/acexcep.h
> @@ -237,8 +237,12 @@ typedef struct acpi_exception_info
>   #define AE_NOT_CONFIGURED               EXCEP_ENV (0x001C)
>   #define AE_ACCESS                       EXCEP_ENV (0x001D)
>   #define AE_IO_ERROR                     EXCEP_ENV (0x001E)
> +#define AE_NUMERIC_OVERFLOW             EXCEP_ENV (0x001F)
> +#define AE_HEX_OVERFLOW                 EXCEP_ENV (0x0020)
> +#define AE_DECIMAL_OVERFLOW             EXCEP_ENV (0x0021)
> +#define AE_OCTAL_OVERFLOW               EXCEP_ENV (0x0022)
>   
> -#define AE_CODE_ENV_MAX                 0x001E
> +#define AE_CODE_ENV_MAX                 0x0022
>   
>   
>   /*
> @@ -371,7 +375,11 @@ static const ACPI_EXCEPTION_INFO    AcpiGbl_ExceptionNames_Env[] =
>       EXCEP_TXT ("AE_OWNER_ID_LIMIT",             "There are no more Owner IDs available for ACPI tables or control methods"),
>       EXCEP_TXT ("AE_NOT_CONFIGURED",             "The interface is not part of the current subsystem configuration"),
>       EXCEP_TXT ("AE_ACCESS",                     "Permission denied for the requested operation"),
> -    EXCEP_TXT ("AE_IO_ERROR",                   "An I/O error occurred")
> +    EXCEP_TXT ("AE_IO_ERROR",                   "An I/O error occurred"),
> +    EXCEP_TXT ("AE_NUMERIC_OVERFLOW",           "Overflow during string-to-integer conversion"),
> +    EXCEP_TXT ("AE_HEX_OVERFLOW",               "Overflow during ASCII hex-to-binary conversion"),
> +    EXCEP_TXT ("AE_DECIMAL_OVERFLOW",           "Overflow during ASCII decimal-to-binary conversion"),
> +    EXCEP_TXT ("AE_OCTAL_OVERFLOW",             "Overflow during ASCII octal-to-binary conversion")
>   };
>   
>   static const ACPI_EXCEPTION_INFO    AcpiGbl_ExceptionNames_Pgm[] =
> diff --git a/src/acpica/source/include/achware.h b/src/acpica/source/include/achware.h
> index f33be8c4..c3bf8f15 100644
> --- a/src/acpica/source/include/achware.h
> +++ b/src/acpica/source/include/achware.h
> @@ -185,12 +185,12 @@ AcpiHwValidateRegister (
>   
>   ACPI_STATUS
>   AcpiHwRead (
> -    UINT32                  *Value,
> +    UINT64                  *Value,
>       ACPI_GENERIC_ADDRESS    *Reg);
>   
>   ACPI_STATUS
>   AcpiHwWrite (
> -    UINT32                  Value,
> +    UINT64                  Value,
>       ACPI_GENERIC_ADDRESS    *Reg);
>   
>   ACPI_BIT_REGISTER_INFO *
> diff --git a/src/acpica/source/include/acinterp.h b/src/acpica/source/include/acinterp.h
> index dd98f01c..d68058cc 100644
> --- a/src/acpica/source/include/acinterp.h
> +++ b/src/acpica/source/include/acinterp.h
> @@ -214,7 +214,7 @@ ACPI_STATUS
>   AcpiExConvertToInteger (
>       ACPI_OPERAND_OBJECT     *ObjDesc,
>       ACPI_OPERAND_OBJECT     **ResultDesc,
> -    UINT32                  Flags);
> +    UINT32                  ImplicitConversion);
>   
>   ACPI_STATUS
>   AcpiExConvertToBuffer (
> @@ -683,9 +683,6 @@ AcpiExStoreObjectToNode (
>       ACPI_WALK_STATE         *WalkState,
>       UINT8                   ImplicitConversion);
>   
> -#define ACPI_IMPLICIT_CONVERSION        TRUE
> -#define ACPI_NO_IMPLICIT_CONVERSION     FALSE
> -
>   
>   /*
>    * exstoren - resolve/store object
> diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h
> index 7a24391d..7d6c18d6 100644
> --- a/src/acpica/source/include/acpixf.h
> +++ b/src/acpica/source/include/acpixf.h
> @@ -154,7 +154,7 @@
>   
>   /* Current ACPICA subsystem version in YYYYMMDD format */
>   
> -#define ACPI_CA_VERSION                 0x20170728
> +#define ACPI_CA_VERSION                 0x20170831
>   
>   #include "acconfig.h"
>   #include "actypes.h"
> diff --git a/src/acpica/source/include/actbl1.h b/src/acpica/source/include/actbl1.h
> index da6b561a..537c33e7 100644
> --- a/src/acpica/source/include/actbl1.h
> +++ b/src/acpica/source/include/actbl1.h
> @@ -179,6 +179,7 @@
>   #define ACPI_SIG_HEST           "HEST"      /* Hardware Error Source Table */
>   #define ACPI_SIG_MADT           "APIC"      /* Multiple APIC Description Table */
>   #define ACPI_SIG_MSCT           "MSCT"      /* Maximum System Characteristics Table */
> +#define ACPI_SIG_PDTT           "PDTT"      /* Processor Debug Trigger Table */
>   #define ACPI_SIG_PPTT           "PPTT"      /* Processor Properties Topology Table */
>   #define ACPI_SIG_SBST           "SBST"      /* Smart Battery Specification Table */
>   #define ACPI_SIG_SLIT           "SLIT"      /* System Locality Distance Information Table */
> @@ -1600,6 +1601,42 @@ typedef struct acpi_nfit_flush_address
>   } ACPI_NFIT_FLUSH_ADDRESS;
>   
>   
> +/*******************************************************************************
> + *
> + * PDTT - Processor Debug Trigger Table (ACPI 6.2)
> + *        Version 0
> + *
> + ******************************************************************************/
> +
> +typedef struct acpi_table_pdtt
> +{
> +    ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
> +    UINT8                   TriggerCount;
> +    UINT8                   Reserved[3];
> +    UINT32                  ArrayOffset;
> +
> +} ACPI_TABLE_PDTT;
> +
> +
> +/*
> + * PDTT Communication Channel Identifier Structure.
> + * The number of these structures is defined by TriggerCount above,
> + * starting at ArrayOffset.
> + */
> +typedef struct acpi_pdtt_channel
> +{
> +    UINT16                  SubChannelId;
> +
> +} ACPI_PDTT_CHANNEL;
> +
> +
> +/* Mask and Flags for above */
> +
> +#define ACPI_PDTT_SUBCHANNEL_ID_MASK        0x00FF
> +#define ACPI_PDTT_RUNTIME_TRIGGER           (1<<8)
> +#define ACPI_PPTT_WAIT_COMPLETION           (1<<9)
> +
> +
>   /*******************************************************************************
>    *
>    * PPTT - Processor Properties Topology Table (ACPI 6.2)
> @@ -1626,7 +1663,8 @@ enum AcpiPpttType
>   
>   /* 0: Processor Hierarchy Node Structure */
>   
> -typedef struct acpi_pptt_processor {
> +typedef struct acpi_pptt_processor
> +{
>       ACPI_SUBTABLE_HEADER    Header;
>       UINT16                  Reserved;
>       UINT32                  Flags;
> @@ -1644,7 +1682,8 @@ typedef struct acpi_pptt_processor {
>   
>   /* 1: Cache Type Structure */
>   
> -typedef struct acpi_pptt_cache {
> +typedef struct acpi_pptt_cache
> +{
>       ACPI_SUBTABLE_HEADER    Header;
>       UINT16                  Reserved;
>       UINT32                  Flags;
> @@ -1676,7 +1715,8 @@ typedef struct acpi_pptt_cache {
>   
>   /* 2: ID Structure */
>   
> -typedef struct acpi_pptt_id {
> +typedef struct acpi_pptt_id
> +{
>       ACPI_SUBTABLE_HEADER    Header;
>       UINT16                  Reserved;
>       UINT32                  VendorId;
> diff --git a/src/acpica/source/include/actbl2.h b/src/acpica/source/include/actbl2.h
> index 18cfdd46..951d6553 100644
> --- a/src/acpica/source/include/actbl2.h
> +++ b/src/acpica/source/include/actbl2.h
> @@ -1030,6 +1030,7 @@ typedef struct acpi_iort_smmu_gsi
>       UINT32                  NSgIrptFlags;
>       UINT32                  NSgCfgIrpt;
>       UINT32                  NSgCfgIrptFlags;
> +
>   } ACPI_IORT_SMMU_GSI;
>   
>   
> diff --git a/src/acpica/source/include/acutils.h b/src/acpica/source/include/acutils.h
> index bca4a94c..a3f0150b 100644
> --- a/src/acpica/source/include/acutils.h
> +++ b/src/acpica/source/include/acutils.h
> @@ -250,6 +250,10 @@ extern const char                       *AcpiGbl_PtypDecode[];
>   #define ACPI_MSG_SUFFIX \
>       AcpiOsPrintf (" (%8.8X/%s-%u)\n", ACPI_CA_VERSION, ModuleName, LineNumber)
>   
> +/* Flags to indicate implicit or explicit string-to-integer conversion */
> +
> +#define ACPI_IMPLICIT_CONVERSION        TRUE
> +#define ACPI_NO_IMPLICIT_CONVERSION     FALSE
>   
>   /* Types for Resource descriptor entries */
>   
> @@ -330,19 +334,57 @@ AcpiUtStricmp (
>       char                    *String1,
>       char                    *String2);
>   
> +
> +/*
> + * utstrsuppt - string-to-integer conversion support functions
> + */
>   ACPI_STATUS
> -AcpiUtStrtoul64 (
> +AcpiUtConvertOctalString (
>       char                    *String,
> -    UINT32                  Flags,
> -    UINT64                  *RetInteger);
> +    UINT64                  *ReturnValue);
> +
> +ACPI_STATUS
> +AcpiUtConvertDecimalString (
> +    char                    *String,
> +    UINT64                  *ReturnValuePtr);
> +
> +ACPI_STATUS
> +AcpiUtConvertHexString (
> +    char                    *String,
> +    UINT64                  *ReturnValuePtr);
> +
> +char
> +AcpiUtRemoveWhitespace (
> +    char                    **String);
> +
> +char
> +AcpiUtRemoveLeadingZeros (
> +    char                    **String);
> +
> +BOOLEAN
> +AcpiUtDetectHexPrefix (
> +    char                    **String);
> +
> +BOOLEAN
> +AcpiUtDetectOctalPrefix (
> +    char                    **String);
> +
>   
>   /*
> - * Values for Flags above
> - * Note: LIMIT values correspond to AcpiGbl_IntegerByteWidth values (4/8)
> + * utstrtoul64 - string-to-integer conversion functions
>    */
> -#define ACPI_STRTOUL_32BIT          0x04    /* 4 bytes */
> -#define ACPI_STRTOUL_64BIT          0x08    /* 8 bytes */
> -#define ACPI_STRTOUL_BASE16         0x10    /* Default: Base10/16 */
> +ACPI_STATUS
> +AcpiUtStrtoul64 (
> +    char                    *String,
> +    UINT64                  *RetInteger);
> +
> +UINT64
> +AcpiUtExplicitStrtoul64 (
> +    char                    *String);
> +
> +UINT64
> +AcpiUtImplicitStrtoul64 (
> +    char                    *String);
>   
>   
>   /*
> diff --git a/src/acpica/source/tools/acpiexec/aeinitfile.c b/src/acpica/source/tools/acpiexec/aeinitfile.c
> index 393e5387..72ccc0f8 100644
> --- a/src/acpica/source/tools/acpiexec/aeinitfile.c
> +++ b/src/acpica/source/tools/acpiexec/aeinitfile.c
> @@ -311,8 +311,7 @@ AeDoOneOverride (
>   
>       /* Extract the 64-bit integer */
>   
> -    Status = AcpiUtStrtoul64 (ValueString,
> -        (ACPI_STRTOUL_BASE16 | ACPI_STRTOUL_64BIT), &Value);
> +    Status = AcpiUtStrtoul64 (ValueString, &Value);
>       if (ACPI_FAILURE (Status))
>       {
>           AcpiOsPrintf ("%s %s\n", ValueString,
> 


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

Patch

diff --git a/src/acpica/Makefile.am b/src/acpica/Makefile.am
index 58b07494..64755b41 100644
--- a/src/acpica/Makefile.am
+++ b/src/acpica/Makefile.am
@@ -261,6 +261,7 @@  libfwtsacpica_la_SOURCES =				\
 	source/components/utilities/utexcep.c		\
 	source/components/utilities/utpredef.c		\
 	source/components/utilities/utstring.c		\
+	source/components/utilities/utstrsuppt.c	\
 	source/components/utilities/utownerid.c		\
 	source/components/utilities/utxfinit.c		\
 	source/components/utilities/uterror.c		\
diff --git a/src/acpica/source/common/dmtbinfo.c b/src/acpica/source/common/dmtbinfo.c
index 4b902b96..5180b4db 100644
--- a/src/acpica/source/common/dmtbinfo.c
+++ b/src/acpica/source/common/dmtbinfo.c
@@ -2828,7 +2828,7 @@  ACPI_DMTABLE_INFO           AcpiDmTableInfoPptt1[] =
     {ACPI_DMT_FLAG3,    ACPI_PPTT1_FLAG_OFFSET (Flags,0),           "Allocation Type valid", 0},
     {ACPI_DMT_FLAG4,    ACPI_PPTT1_FLAG_OFFSET (Flags,0),           "Cache Type valid", 0},
     {ACPI_DMT_FLAG5,    ACPI_PPTT1_FLAG_OFFSET (Flags,0),           "Write Policy valid", 0},
-    {ACPI_DMT_FLAG5,    ACPI_PPTT1_FLAG_OFFSET (Flags,0),           "Line Size valid", 0},
+    {ACPI_DMT_FLAG6,    ACPI_PPTT1_FLAG_OFFSET (Flags,0),           "Line Size valid", 0},
     {ACPI_DMT_UINT32,   ACPI_PPTT1_OFFSET (NextLevelOfCache),       "Next Level of Cache", 0},
     {ACPI_DMT_UINT32,   ACPI_PPTT1_OFFSET (Size),                   "Size", 0},
     {ACPI_DMT_UINT32,   ACPI_PPTT1_OFFSET (NumberOfSets),           "Number of Sets", 0},
diff --git a/src/acpica/source/compiler/aslcompiler.h b/src/acpica/source/compiler/aslcompiler.h
index fdf4dbf7..3b6a9c1d 100644
--- a/src/acpica/source/compiler/aslcompiler.h
+++ b/src/acpica/source/compiler/aslcompiler.h
@@ -890,6 +890,11 @@  void
 TrSetOpCurrentFilename (
     ACPI_PARSE_OBJECT       *Op);
 
+void
+TrSetOpIntegerWidth (
+    ACPI_PARSE_OBJECT       *TableSignature,
+    ACPI_PARSE_OBJECT       *Revision);
+
 ACPI_PARSE_OBJECT *
 TrLinkOpChildren (
     ACPI_PARSE_OBJECT       *Op,
diff --git a/src/acpica/source/compiler/aslcompiler.l b/src/acpica/source/compiler/aslcompiler.l
index b49233be..5fcfc188 100644
--- a/src/acpica/source/compiler/aslcompiler.l
+++ b/src/acpica/source/compiler/aslcompiler.l
@@ -195,6 +195,7 @@  count (int type);
 
 LeadNameChar                [A-Za-z_]
 DigitChar                   [0-9]
+OctalChar                   [0-7]
 HexDigitChar                [A-Fa-f0-9]
 RootChar                    [\\]
 Nothing                     []
@@ -278,8 +279,7 @@  NamePathTail                [.]{NameSeg}
     /*
      * Begin standard ASL grammar
      */
-0[xX]{HexDigitChar}+ |
-{DigitChar}+                { AslCompilerlval.i = UtDoConstant ((char *) AslCompilertext);
+[0-9][a-zA-Z0-9]*            { AslCompilerlval.i = UtDoConstant ((char *) AslCompilertext);
                                 count (1); return (PARSEOP_INTEGER); }
 
 "Include"                   { count (1); return (PARSEOP_INCLUDE); }
diff --git a/src/acpica/source/compiler/asldebug.c b/src/acpica/source/compiler/asldebug.c
index b0b38640..684e2224 100644
--- a/src/acpica/source/compiler/asldebug.c
+++ b/src/acpica/source/compiler/asldebug.c
@@ -165,6 +165,10 @@  UtDumpParseOpName (
     UINT32                  Level,
     UINT32                  DataLength);
 
+static char *
+UtCreateEscapeSequences (
+    char                    *InString);
+
 
 /*******************************************************************************
  *
@@ -272,7 +276,6 @@  UtDumpStringOp (
 
 
     String = Op->Asl.Value.String;
-
     if (Op->Asl.ParseOpcode != PARSEOP_STRING_LITERAL)
     {
         /*
@@ -294,6 +297,8 @@  UtDumpStringOp (
         return;
     }
 
+    String = UtCreateEscapeSequences (String);
+
     /* Emit the ParseOp name, leaving room for the string */
 
     UtDumpParseOpName (Op, Level, strlen (String));
@@ -301,6 +306,86 @@  UtDumpStringOp (
 }
 
 
+/*******************************************************************************
+ *
+ * FUNCTION:    UtCreateEscapeSequences
+ *
+ * PARAMETERS:  InString            - ASCII string to be expanded
+ *
+ * RETURN:      Expanded string
+ *
+ * DESCRIPTION: Expand all non-printable ASCII bytes (0-0x1F) to escape
+ *              sequences. For example, hex 14 becomes \x14
+ *
+ * NOTE:        Since this function is used for debug output only, it does
+ *              not attempt to translate into the "known" escape sequences
+ *              such as \a, \f, \t, etc.
+ *
+ ******************************************************************************/
+
+static char *
+UtCreateEscapeSequences (
+    char                    *InString)
+{
+    char                    *String = InString;
+    char                    *OutString;
+    char                    *OutStringPtr;
+    UINT32                  InStringLength = 0;
+    UINT32                  EscapeCount = 0;
+
+
+    /*
+     * Determine up front how many escapes are within the string.
+     * Obtain the input string length while doing so.
+     */
+    while (*String)
+    {
+        if ((*String <= 0x1F) || (*String >= 0x7F))
+        {
+            EscapeCount++;
+        }
+
+        InStringLength++;
+        String++;
+    }
+
+    if (!EscapeCount)
+    {
+        return (InString); /* No escapes, nothing to do */
+    }
+
+    /* New string buffer, 3 extra chars per escape (4 total) */
+
+    OutString = UtLocalCalloc (InStringLength + (EscapeCount * 3));
+    OutStringPtr = OutString;
+
+    /* Convert non-ascii or non-printable chars to escape sequences */
+
+    while (*InString)
+    {
+        if ((*InString <= 0x1F) || (*InString >= 0x7F))
+        {
+            /* Insert a \x hex escape sequence */
+
+            OutStringPtr[0] = '\\';
+            OutStringPtr[1] = 'x';
+            OutStringPtr[2] = AcpiUtHexToAsciiChar (*InString, 4);
+            OutStringPtr[3] = AcpiUtHexToAsciiChar (*InString, 0);
+            OutStringPtr += 4;
+        }
+        else /* Normal ASCII character */
+        {
+            *OutStringPtr = *InString;
+            OutStringPtr++;
+        }
+
+        InString++;
+    }
+
+    return (OutString);
+}
+
+
 /*******************************************************************************
  *
  * FUNCTION:    UtDumpBasicOp
diff --git a/src/acpica/source/compiler/aslerror.c b/src/acpica/source/compiler/aslerror.c
index ec91ca3e..56b5cabb 100644
--- a/src/acpica/source/compiler/aslerror.c
+++ b/src/acpica/source/compiler/aslerror.c
@@ -757,6 +757,11 @@  AslCommonError (
     ASL_ERROR_MSG           *Enode;
 
 
+    if (AslIsExceptionIgnored (Level, MessageId))
+    {
+        return;
+    }
+
     Enode = UtLocalCalloc (sizeof (ASL_ERROR_MSG));
 
     if (ExtraMessage)
@@ -949,9 +954,9 @@  AslDisableException (
 
     MessageId = (UINT32) strtoul (MessageIdString, NULL, 0);
 
-    if ((MessageId < 2000) || (MessageId > 5999))
+    if ((MessageId < 2000) || (MessageId > 6999))
     {
-        printf ("\"%s\" is not a valid warning/remark ID\n",
+        printf ("\"%s\" is not a valid warning/remark/error ID\n",
             MessageIdString);
         return (AE_BAD_PARAMETER);
     }
@@ -1050,8 +1055,9 @@  AslIsExceptionDisabled (
 
     case ASL_WARNING:
     case ASL_REMARK:
+    case ASL_ERROR:
         /*
-         * Ignore this warning/remark if it has been disabled by
+         * Ignore this error/warning/remark if it has been disabled by
          * the user (-vw option)
          */
         EncodedMessageId = AeBuildFullExceptionCode (Level, MessageId);
@@ -1097,14 +1103,6 @@  AslError (
     ACPI_PARSE_OBJECT       *Op,
     char                    *ExtraMessage)
 {
-
-    /* Check if user wants to ignore this exception */
-
-    if (AslIsExceptionIgnored (Level, MessageId))
-    {
-        return;
-    }
-
     if (Op)
     {
         AslCommonError (Level, MessageId, Op->Asl.LineNumber,
diff --git a/src/acpica/source/compiler/aslmain.c b/src/acpica/source/compiler/aslmain.c
index 10251fb2..e4ac4229 100644
--- a/src/acpica/source/compiler/aslmain.c
+++ b/src/acpica/source/compiler/aslmain.c
@@ -386,11 +386,11 @@  AslInitialize (
 
     AcpiGbl_DmOpt_Verbose = FALSE;
 
-    /* Default integer width is 64 bits */
+    /* Default integer width is 32 bits */
 
-    AcpiGbl_IntegerBitWidth = 64;
-    AcpiGbl_IntegerNybbleWidth = 16;
-    AcpiGbl_IntegerByteWidth = 8;
+    AcpiGbl_IntegerBitWidth = 32;
+    AcpiGbl_IntegerNybbleWidth = 8;
+    AcpiGbl_IntegerByteWidth = 4;
 
     for (i = 0; i < ASL_NUM_FILES; i++)
     {
diff --git a/src/acpica/source/compiler/aslmessages.c b/src/acpica/source/compiler/aslmessages.c
index b87d5499..159f9d23 100644
--- a/src/acpica/source/compiler/aslmessages.c
+++ b/src/acpica/source/compiler/aslmessages.c
@@ -238,7 +238,7 @@  const char                      *AslCompilerMsgs [] =
 /*    ASL_MSG_HID_SUFFIX */                 "_HID suffix must be all hex digits",
 /*    ASL_MSG_INCLUDE_FILE_OPEN */          "Could not open include file",
 /*    ASL_MSG_INPUT_FILE_OPEN */            "Could not open input file",
-/*    ASL_MSG_INTEGER_LENGTH */             "64-bit integer in 32-bit table, truncating (DSDT or SSDT version < 2)",
+/*    ASL_MSG_INTEGER_LENGTH */             "Truncating 64-bit constant found in 32-bit table",
 /*    ASL_MSG_INTEGER_OPTIMIZATION */       "Integer optimized to single-byte AML opcode",
 /*    ASL_MSG_INTERRUPT_LIST */             "Too many interrupts (16 max)",
 /*    ASL_MSG_INTERRUPT_NUMBER */           "Invalid interrupt number (must be 0-15)",
@@ -349,7 +349,8 @@  const char                      *AslCompilerMsgs [] =
 /*    ASL_MSG_ARG_NOT_USED */               "Method Argument is never used",
 /*    ASL_MSG_CONSTANT_REQUIRED */          "Non-reducible expression",
 /*    ASL_MSG_CROSS_TABLE_SCOPE */          "Illegal open scope on external object from within DSDT",
-/*    ASL_MSG_EXCEPTION_NOT_RECEIVED */     "Expected remark, warning, or error did not occur. Message ID:"
+/*    ASL_MSG_EXCEPTION_NOT_RECEIVED */     "Expected remark, warning, or error did not occur. Message ID:",
+/*    ASL_MSG_NULL_RESOURCE_TEMPLATE */     "Empty Resource Template (END_TAG only)"
 };
 
 /* Table compiler */
diff --git a/src/acpica/source/compiler/aslmessages.h b/src/acpica/source/compiler/aslmessages.h
index 68216e5c..d69c05a1 100644
--- a/src/acpica/source/compiler/aslmessages.h
+++ b/src/acpica/source/compiler/aslmessages.h
@@ -352,6 +352,7 @@  typedef enum
     ASL_MSG_CONSTANT_REQUIRED,
     ASL_MSG_CROSS_TABLE_SCOPE,
     ASL_MSG_EXCEPTION_NOT_RECEIVED,
+    ASL_MSG_NULL_RESOURCE_TEMPLATE,
 
     /* These messages are used by the Data Table compiler only */
 
diff --git a/src/acpica/source/compiler/aslresource.c b/src/acpica/source/compiler/aslresource.c
index eb0c22a1..b052c1ed 100644
--- a/src/acpica/source/compiler/aslresource.c
+++ b/src/acpica/source/compiler/aslresource.c
@@ -1148,6 +1148,14 @@  RsDoResourceTemplate (
 
     DescriptorTypeOp = ASL_GET_PEER_NODE (BufferOp);
 
+    /* DEFAULT_ARG indicates null template - ResourceTemplate(){} */
+
+    if (DescriptorTypeOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
+    {
+        AslError (ASL_WARNING, ASL_MSG_NULL_RESOURCE_TEMPLATE,
+            DescriptorTypeOp, DescriptorTypeOp->Asl.Value.String);
+    }
+
     /*
      * Process all resource descriptors in the list
      * Note: It is assumed that the EndTag node has been automatically
diff --git a/src/acpica/source/compiler/aslrules.y b/src/acpica/source/compiler/aslrules.y
index f26ea874..3b8e4839 100644
--- a/src/acpica/source/compiler/aslrules.y
+++ b/src/acpica/source/compiler/aslrules.y
@@ -199,7 +199,8 @@  DefinitionBlockTerm
         String ','
         String ','
         DWordConst
-        PARSEOP_CLOSE_PAREN         {TrSetOpEndLineNumber ($<n>3); COMMENT_CAPTURE_ON;}
+        PARSEOP_CLOSE_PAREN         {TrSetOpIntegerWidth ($6,$8);
+                                        TrSetOpEndLineNumber ($<n>3); COMMENT_CAPTURE_ON;}
             '{' TermList '}'        {$$ = TrLinkOpChildren ($<n>3,7,
                                         $4,$6,$8,$10,$12,$14,$18);}
     ;
diff --git a/src/acpica/source/compiler/asltree.c b/src/acpica/source/compiler/asltree.c
index 8b709df7..084bc4d5 100644
--- a/src/acpica/source/compiler/asltree.c
+++ b/src/acpica/source/compiler/asltree.c
@@ -376,6 +376,39 @@  TrSetOpCurrentFilename (
 }
 
 
+/*******************************************************************************
+ *
+ * FUNCTION:    TrSetOpIntegerWidth
+ *
+ * PARAMETERS:  Op                  - An existing parse op
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION:
+ *
+ ******************************************************************************/
+
+void
+TrSetOpIntegerWidth (
+    ACPI_PARSE_OBJECT       *TableSignatureOp,
+    ACPI_PARSE_OBJECT       *RevisionOp)
+{
+
+    /* TBD: Check table sig? (DSDT vs. SSDT) */
+
+    /* Handle command-line version override */
+
+    if (Gbl_RevisionOverride)
+    {
+        AcpiUtSetIntegerWidth (Gbl_RevisionOverride);
+    }
+    else
+    {
+        AcpiUtSetIntegerWidth ((UINT8) RevisionOp->Asl.Value.Integer);
+    }
+}
+
+
 /*******************************************************************************
  *
  * FUNCTION:    TrSetOpEndLineNumber
diff --git a/src/acpica/source/compiler/aslutils.c b/src/acpica/source/compiler/aslutils.c
index c5ff42c0..8b46d38b 100644
--- a/src/acpica/source/compiler/aslutils.c
+++ b/src/acpica/source/compiler/aslutils.c
@@ -1004,11 +1004,11 @@  UtAttachNamepathToOwner (
  *
  * FUNCTION:    UtDoConstant
  *
- * PARAMETERS:  String              - Hexadecimal or decimal string
+ * PARAMETERS:  String              - Hex/Decimal/Octal
  *
  * RETURN:      Converted Integer
  *
- * DESCRIPTION: Convert a string to an integer, with error checking.
+ * DESCRIPTION: Convert a string to an integer, with overflow/error checking.
  *
  ******************************************************************************/
 
@@ -1017,17 +1017,20 @@  UtDoConstant (
     char                    *String)
 {
     ACPI_STATUS             Status;
-    UINT64                  Converted;
+    UINT64                  ConvertedInteger;
     char                    ErrBuf[64];
 
 
-    Status = AcpiUtStrtoul64 (String, ACPI_STRTOUL_64BIT, &Converted);
+    Status = AcpiUtStrtoul64 (String, &ConvertedInteger);
     if (ACPI_FAILURE (Status))
     {
-        sprintf (ErrBuf, "%s %s\n", "Conversion error:",
+        sprintf (ErrBuf, "While creating 64-bit constant: %s\n",
             AcpiFormatException (Status));
-        AslCompilererror (ErrBuf);
+
+        AslCommonError (ASL_ERROR, ASL_MSG_SYNTAX, Gbl_CurrentLineNumber,
+            Gbl_LogicalLineNumber, Gbl_CurrentLineOffset,
+            Gbl_CurrentColumn, Gbl_Files[ASL_FILE_INPUT].Filename, ErrBuf);
     }
 
-    return (Converted);
+    return (ConvertedInteger);
 }
diff --git a/src/acpica/source/compiler/dtcompile.c b/src/acpica/source/compiler/dtcompile.c
index e74fed51..53445624 100644
--- a/src/acpica/source/compiler/dtcompile.c
+++ b/src/acpica/source/compiler/dtcompile.c
@@ -319,6 +319,8 @@  DtInitialize (
         return (Status);
     }
 
+    AcpiUtSetIntegerWidth (2); /* Set width to 64 bits */
+
     Gbl_FieldList = NULL;
     Gbl_RootTable = NULL;
     Gbl_SubtableStack = NULL;
diff --git a/src/acpica/source/compiler/dtcompiler.h b/src/acpica/source/compiler/dtcompiler.h
index 1e81c580..90fad889 100644
--- a/src/acpica/source/compiler/dtcompiler.h
+++ b/src/acpica/source/compiler/dtcompiler.h
@@ -481,6 +481,10 @@  DtFatal (
     DT_FIELD                *FieldObject,
     char                    *ExtraMessage);
 
+UINT64
+DtDoConstant (
+    char                    *String);
+
 char*
 DtGetFieldValue (
     DT_FIELD                *Field);
diff --git a/src/acpica/source/compiler/dtfield.c b/src/acpica/source/compiler/dtfield.c
index 13e8b638..b06877a8 100644
--- a/src/acpica/source/compiler/dtfield.c
+++ b/src/acpica/source/compiler/dtfield.c
@@ -628,15 +628,9 @@  DtCompileFlag (
     UINT64                  Value = 0;
     UINT32                  BitLength = 1;
     UINT8                   BitPosition = 0;
-    ACPI_STATUS             Status;
 
 
-    Status = AcpiUtStrtoul64 (Field->Value,
-        (ACPI_STRTOUL_64BIT | ACPI_STRTOUL_BASE16), &Value);
-    if (ACPI_FAILURE (Status))
-    {
-        DtError (ASL_ERROR, ASL_MSG_INVALID_HEX_INTEGER, Field, NULL);
-    }
+    Value = AcpiUtImplicitStrtoul64 (Field->Value);
 
     switch (Info->Opcode)
     {
diff --git a/src/acpica/source/compiler/dtparser.y b/src/acpica/source/compiler/dtparser.y
index a2943ccc..d5990fe4 100644
--- a/src/acpica/source/compiler/dtparser.y
+++ b/src/acpica/source/compiler/dtparser.y
@@ -275,17 +275,24 @@  Expression
 
     | EXPOP_LABEL                                   { $$ = DtResolveLabel (DtParsertext);}
 
-      /* Default base for a non-prefixed integer is 16 */
+      /*
+       * All constants for the data table compiler are in hex, whether a (optional) 0x
+       * prefix is present or not. For example, these two input strings are equivalent:
+       *    1234
+       *    0x1234
+       */
 
-    | EXPOP_NUMBER                                  { AcpiUtStrtoul64 (DtParsertext, (ACPI_STRTOUL_BASE16 | ACPI_STRTOUL_64BIT), &$$);}
+      /* Non-prefixed hex number */
+
+    | EXPOP_NUMBER                                  { $$ = DtDoConstant (DtParsertext);}
 
       /* Standard hex number (0x1234) */
 
-    | EXPOP_HEX_NUMBER                              { AcpiUtStrtoul64 (DtParsertext, (ACPI_STRTOUL_BASE16 | ACPI_STRTOUL_64BIT), &$$);}
+    | EXPOP_HEX_NUMBER                              { $$ = DtDoConstant (DtParsertext);}
 
-      /* TBD: Decimal number with prefix (0d1234) - Not supported by strtoul64 at this time */
+      /* Possible TBD: Decimal number with prefix (0d1234) - Not supported this time */
 
-    | EXPOP_DECIMAL_NUMBER                          { AcpiUtStrtoul64 (DtParsertext, ACPI_STRTOUL_64BIT, &$$);}
+    | EXPOP_DECIMAL_NUMBER                          { $$ = DtDoConstant (DtParsertext);}
     ;
 %%
 
diff --git a/src/acpica/source/compiler/dtutils.c b/src/acpica/source/compiler/dtutils.c
index 6edcf637..c6c89eaa 100644
--- a/src/acpica/source/compiler/dtutils.c
+++ b/src/acpica/source/compiler/dtutils.c
@@ -303,6 +303,38 @@  DtFatal (
 }
 
 
+/*******************************************************************************
+ *
+ * FUNCTION:    DtDoConstant
+ *
+ * PARAMETERS:  String              - Only hex constants are supported,
+ *                                    regardless of whether the 0x prefix
+ *                                    is used
+ *
+ * RETURN:      Converted Integer
+ *
+ * DESCRIPTION: Convert a string to an integer, with overflow/error checking.
+ *
+ ******************************************************************************/
+
+UINT64
+DtDoConstant (
+    char                    *String)
+{
+    UINT64                  ConvertedInteger;
+
+
+    /*
+     * TBD: The ImplicitStrtoul64 function does not report overflow
+     * conditions. The input string is simply truncated. If it is
+     * desired to report overflow to the table compiler, this should
+     * somehow be added here. Note: integers that are prefixed with 0x
+     * or not are both hex integers.
+     */
+    ConvertedInteger = AcpiUtImplicitStrtoul64 (String);
+    return (ConvertedInteger);
+}
+
 /******************************************************************************
  *
  * FUNCTION:    DtGetFieldValue
diff --git a/src/acpica/source/compiler/prparser.y b/src/acpica/source/compiler/prparser.y
index 2ad79e45..d24a5bbe 100644
--- a/src/acpica/source/compiler/prparser.y
+++ b/src/acpica/source/compiler/prparser.y
@@ -290,11 +290,11 @@  Expression
 
       /* Default base for a non-prefixed integer is 10 */
 
-    | EXPOP_NUMBER                                  { AcpiUtStrtoul64 (PrParsertext, ACPI_STRTOUL_64BIT, &$$);}
+    | EXPOP_NUMBER                                  { AcpiUtStrtoul64 (PrParsertext, &$$);}
 
       /* Standard hex number (0x1234) */
 
-    | EXPOP_HEX_NUMBER                              { AcpiUtStrtoul64 (PrParsertext, (ACPI_STRTOUL_BASE16 | ACPI_STRTOUL_64BIT), &$$);}
+    | EXPOP_HEX_NUMBER                              { AcpiUtStrtoul64 (PrParsertext, &$$);}
     ;
 %%
 
diff --git a/src/acpica/source/components/debugger/dbconvert.c b/src/acpica/source/components/debugger/dbconvert.c
index e02ddb40..e06bc026 100644
--- a/src/acpica/source/components/debugger/dbconvert.c
+++ b/src/acpica/source/components/debugger/dbconvert.c
@@ -429,9 +429,7 @@  AcpiDbConvertToObject (
     default:
 
         Object->Type = ACPI_TYPE_INTEGER;
-        Status = AcpiUtStrtoul64 (String,
-            (AcpiGbl_IntegerByteWidth | ACPI_STRTOUL_BASE16),
-            &Object->Integer.Value);
+        Status = AcpiUtStrtoul64 (String, &Object->Integer.Value);
         break;
     }
 
diff --git a/src/acpica/source/components/disassembler/dmresrc.c b/src/acpica/source/components/disassembler/dmresrc.c
index 3c24855f..c50c1c42 100644
--- a/src/acpica/source/components/disassembler/dmresrc.c
+++ b/src/acpica/source/components/disassembler/dmresrc.c
@@ -539,6 +539,20 @@  AcpiDmIsResourceTemplate (
     Aml = NextOp->Named.Data;
     BufferLength = NextOp->Common.Value.Size;
 
+    /*
+     * Any buffer smaller than one byte cannot possibly be a resource
+     * template. Two bytes could possibly be a "NULL" resource template
+     * with a lone end tag descriptor (as generated via
+     * "ResourceTemplate(){}"), but this would be an extremely unusual
+     * case, as the template would be essentially useless. The disassembler
+     * therefore does not recognize any two-byte buffer as a resource
+     * template.
+     */
+    if (BufferLength <= 2)
+    {
+        return (AE_TYPE);
+    }
+
     /*
      * Not a template if declared buffer length != actual length of the
      * intialization byte list. Because the resource macros will create
diff --git a/src/acpica/source/components/dispatcher/dswexec.c b/src/acpica/source/components/dispatcher/dswexec.c
index dfdfeaa0..bbb9436a 100644
--- a/src/acpica/source/components/dispatcher/dswexec.c
+++ b/src/acpica/source/components/dispatcher/dswexec.c
@@ -253,7 +253,7 @@  AcpiDsGetPredicateValue (
      * object. Implicitly convert the argument if necessary.
      */
     Status = AcpiExConvertToInteger (ObjDesc, &LocalObjDesc,
-        ACPI_STRTOUL_BASE16);
+        ACPI_IMPLICIT_CONVERSION);
     if (ACPI_FAILURE (Status))
     {
         goto Cleanup;
diff --git a/src/acpica/source/components/events/evgpe.c b/src/acpica/source/components/events/evgpe.c
index 13b3e049..a00dc378 100644
--- a/src/acpica/source/components/events/evgpe.c
+++ b/src/acpica/source/components/events/evgpe.c
@@ -551,8 +551,8 @@  AcpiEvGpeDetect (
     ACPI_GPE_HANDLER_INFO   *GpeHandlerInfo;
     UINT32                  IntStatus = ACPI_INTERRUPT_NOT_HANDLED;
     UINT8                   EnabledStatusByte;
-    UINT32                  StatusReg;
-    UINT32                  EnableReg;
+    UINT64                  StatusReg;
+    UINT64                  EnableReg;
     ACPI_CPU_FLAGS          Flags;
     UINT32                  i;
     UINT32                  j;
@@ -629,7 +629,7 @@  AcpiEvGpeDetect (
                 "RunEnable=%02X, WakeEnable=%02X\n",
                 GpeRegisterInfo->BaseGpeNumber,
                 GpeRegisterInfo->BaseGpeNumber + (ACPI_GPE_REGISTER_WIDTH - 1),
-                StatusReg, EnableReg,
+                (UINT32) StatusReg, (UINT32) EnableReg,
                 GpeRegisterInfo->EnableForRun,
                 GpeRegisterInfo->EnableForWake));
 
diff --git a/src/acpica/source/components/executer/exconcat.c b/src/acpica/source/components/executer/exconcat.c
index e5f077db..67d592cd 100644
--- a/src/acpica/source/components/executer/exconcat.c
+++ b/src/acpica/source/components/executer/exconcat.c
@@ -274,7 +274,7 @@  AcpiExDoConcatenate (
     case ACPI_TYPE_INTEGER:
 
         Status = AcpiExConvertToInteger (LocalOperand1, &TempOperand1,
-            ACPI_STRTOUL_BASE16);
+            ACPI_IMPLICIT_CONVERSION);
         break;
 
     case ACPI_TYPE_BUFFER:
diff --git a/src/acpica/source/components/executer/exconvrt.c b/src/acpica/source/components/executer/exconvrt.c
index 8c0ae75c..8577a45e 100644
--- a/src/acpica/source/components/executer/exconvrt.c
+++ b/src/acpica/source/components/executer/exconvrt.c
@@ -172,10 +172,10 @@  AcpiExConvertToAscii (
  *
  * FUNCTION:    AcpiExConvertToInteger
  *
- * PARAMETERS:  ObjDesc         - Object to be converted. Must be an
- *                                Integer, Buffer, or String
- *              ResultDesc      - Where the new Integer object is returned
- *              Flags           - Used for string conversion
+ * PARAMETERS:  ObjDesc             - Object to be converted. Must be an
+ *                                    Integer, Buffer, or String
+ *              ResultDesc          - Where the new Integer object is returned
+ *              ImplicitConversion  - Used for string conversion
  *
  * RETURN:      Status
  *
@@ -187,14 +187,13 @@  ACPI_STATUS
 AcpiExConvertToInteger (
     ACPI_OPERAND_OBJECT     *ObjDesc,
     ACPI_OPERAND_OBJECT     **ResultDesc,
-    UINT32                  Flags)
+    UINT32                  ImplicitConversion)
 {
     ACPI_OPERAND_OBJECT     *ReturnDesc;
     UINT8                   *Pointer;
     UINT64                  Result;
     UINT32                  i;
     UINT32                  Count;
-    ACPI_STATUS             Status;
 
 
     ACPI_FUNCTION_TRACE_PTR (ExConvertToInteger, ObjDesc);
@@ -244,12 +243,17 @@  AcpiExConvertToInteger (
          * hexadecimal as per the ACPI specification. The only exception (as
          * of ACPI 3.0) is that the ToInteger() operator allows both decimal
          * and hexadecimal strings (hex prefixed with "0x").
+         *
+         * Explicit conversion is used only by ToInteger.
+         * All other string-to-integer conversions are implicit conversions.
          */
-        Status = AcpiUtStrtoul64 (ACPI_CAST_PTR (char, Pointer),
-            (AcpiGbl_IntegerByteWidth | Flags), &Result);
-        if (ACPI_FAILURE (Status))
+        if (ImplicitConversion)
+        {
+            Result = AcpiUtImplicitStrtoul64 (ACPI_CAST_PTR (char, Pointer));
+        }
+        else
         {
-            return_ACPI_STATUS (Status);
+            Result = AcpiUtExplicitStrtoul64 (ACPI_CAST_PTR (char, Pointer));
         }
         break;
 
@@ -792,7 +796,7 @@  AcpiExConvertToTargetType (
              * a Buffer or a String to an Integer if necessary.
              */
             Status = AcpiExConvertToInteger (SourceDesc, ResultDesc,
-                ACPI_STRTOUL_BASE16);
+                ACPI_IMPLICIT_CONVERSION);
             break;
 
         case ACPI_TYPE_STRING:
diff --git a/src/acpica/source/components/executer/exmisc.c b/src/acpica/source/components/executer/exmisc.c
index dfa4421a..8e92f7a0 100644
--- a/src/acpica/source/components/executer/exmisc.c
+++ b/src/acpica/source/components/executer/exmisc.c
@@ -472,7 +472,7 @@  AcpiExDoLogicalOp (
     case ACPI_TYPE_INTEGER:
 
         Status = AcpiExConvertToInteger (Operand1, &LocalOperand1,
-            ACPI_STRTOUL_BASE16);
+            ACPI_IMPLICIT_CONVERSION);
         break;
 
     case ACPI_TYPE_STRING:
diff --git a/src/acpica/source/components/executer/exresop.c b/src/acpica/source/components/executer/exresop.c
index 0cd216ce..e33608c2 100644
--- a/src/acpica/source/components/executer/exresop.c
+++ b/src/acpica/source/components/executer/exresop.c
@@ -541,7 +541,7 @@  AcpiExResolveOperands (
              * Known as "Implicit Source Operand Conversion"
              */
             Status = AcpiExConvertToInteger (ObjDesc, StackPtr,
-                ACPI_STRTOUL_BASE16);
+                ACPI_IMPLICIT_CONVERSION);
             if (ACPI_FAILURE (Status))
             {
                 if (Status == AE_TYPE)
diff --git a/src/acpica/source/components/hardware/hwgpe.c b/src/acpica/source/components/hardware/hwgpe.c
index 56ccb78d..636639be 100644
--- a/src/acpica/source/components/hardware/hwgpe.c
+++ b/src/acpica/source/components/hardware/hwgpe.c
@@ -217,7 +217,7 @@  AcpiHwLowSetGpe (
 {
     ACPI_GPE_REGISTER_INFO  *GpeRegisterInfo;
     ACPI_STATUS             Status = AE_OK;
-    UINT32                  EnableMask;
+    UINT64                  EnableMask;
     UINT32                  RegisterBit;
 
 
@@ -342,7 +342,7 @@  AcpiHwGetGpeStatus (
     ACPI_GPE_EVENT_INFO     *GpeEventInfo,
     ACPI_EVENT_STATUS       *EventStatus)
 {
-    UINT32                  InByte;
+    UINT64                  InByte;
     UINT32                  RegisterBit;
     ACPI_GPE_REGISTER_INFO  *GpeRegisterInfo;
     ACPI_EVENT_STATUS       LocalEventStatus = 0;
diff --git a/src/acpica/source/components/hardware/hwregs.c b/src/acpica/source/components/hardware/hwregs.c
index b5b23831..cd8e774a 100644
--- a/src/acpica/source/components/hardware/hwregs.c
+++ b/src/acpica/source/components/hardware/hwregs.c
@@ -355,9 +355,8 @@  AcpiHwValidateRegister (
  *
  * RETURN:      Status
  *
- * DESCRIPTION: Read from either memory or IO space. This is a 32-bit max
- *              version of AcpiRead, used internally since the overhead of
- *              64-bit values is not needed.
+ * DESCRIPTION: Read from either memory or IO space. This is a 64-bit max
+ *              version of AcpiRead.
  *
  * LIMITATIONS: <These limitations also apply to AcpiHwWrite>
  *      SpaceID must be SystemMemory or SystemIO.
@@ -366,7 +365,7 @@  AcpiHwValidateRegister (
 
 ACPI_STATUS
 AcpiHwRead (
-    UINT32                  *Value,
+    UINT64                  *Value,
     ACPI_GENERIC_ADDRESS    *Reg)
 {
     UINT64                  Address;
@@ -384,18 +383,18 @@  AcpiHwRead (
 
     /* Validate contents of the GAS register */
 
-    Status = AcpiHwValidateRegister (Reg, 32, &Address);
+    Status = AcpiHwValidateRegister (Reg, 64, &Address);
     if (ACPI_FAILURE (Status))
     {
         return (Status);
     }
 
     /*
-     * Initialize entire 32-bit return value to zero, convert AccessWidth
+     * Initialize entire 64-bit return value to zero, convert AccessWidth
      * into number of bits based
      */
     *Value = 0;
-    AccessWidth = AcpiHwGetAccessBitWidth (Address, Reg, 32);
+    AccessWidth = AcpiHwGetAccessBitWidth (Address, Reg, 64);
     BitWidth = Reg->BitOffset + Reg->BitWidth;
     BitOffset = Reg->BitOffset;
 
@@ -408,7 +407,7 @@  AcpiHwRead (
     {
         if (BitOffset >= AccessWidth)
         {
-            Value32 = 0;
+            Value64 = 0;
             BitOffset -= AccessWidth;
         }
         else
@@ -418,31 +417,31 @@  AcpiHwRead (
                 Status = AcpiOsReadMemory ((ACPI_PHYSICAL_ADDRESS)
                     Address + Index * ACPI_DIV_8 (AccessWidth),
                     &Value64, AccessWidth);
-                Value32 = (UINT32) Value64;
             }
             else /* ACPI_ADR_SPACE_SYSTEM_IO, validated earlier */
             {
                 Status = AcpiHwReadPort ((ACPI_IO_ADDRESS)
                     Address + Index * ACPI_DIV_8 (AccessWidth),
                     &Value32, AccessWidth);
+                Value64 = (UINT64) Value32;
             }
         }
 
         /*
          * Use offset style bit writes because "Index * AccessWidth" is
-         * ensured to be less than 32-bits by AcpiHwValidateRegister().
+         * ensured to be less than 64-bits by AcpiHwValidateRegister().
          */
         ACPI_SET_BITS (Value, Index * AccessWidth,
-            ACPI_MASK_BITS_ABOVE_32 (AccessWidth), Value32);
+            ACPI_MASK_BITS_ABOVE_64 (AccessWidth), Value64);
 
         BitWidth -= BitWidth > AccessWidth ? AccessWidth : BitWidth;
         Index++;
     }
 
     ACPI_DEBUG_PRINT ((ACPI_DB_IO,
-        "Read:  %8.8X width %2d from %8.8X%8.8X (%s)\n",
-        *Value, AccessWidth, ACPI_FORMAT_UINT64 (Address),
-        AcpiUtGetRegionName (Reg->SpaceId)));
+        "Read:  %8.8X%8.8X width %2d from %8.8X%8.8X (%s)\n",
+        ACPI_FORMAT_UINT64 (*Value), AccessWidth,
+        ACPI_FORMAT_UINT64 (Address), AcpiUtGetRegionName (Reg->SpaceId)));
 
     return (Status);
 }
@@ -457,15 +456,14 @@  AcpiHwRead (
  *
  * RETURN:      Status
  *
- * DESCRIPTION: Write to either memory or IO space. This is a 32-bit max
- *              version of AcpiWrite, used internally since the overhead of
- *              64-bit values is not needed.
+ * DESCRIPTION: Write to either memory or IO space. This is a 64-bit max
+ *              version of AcpiWrite.
  *
  ******************************************************************************/
 
 ACPI_STATUS
 AcpiHwWrite (
-    UINT32                  Value,
+    UINT64                  Value,
     ACPI_GENERIC_ADDRESS    *Reg)
 {
     UINT64                  Address;
@@ -473,7 +471,6 @@  AcpiHwWrite (
     UINT32                  BitWidth;
     UINT8                   BitOffset;
     UINT64                  Value64;
-    UINT32                  Value32;
     UINT8                   Index;
     ACPI_STATUS             Status;
 
@@ -483,7 +480,7 @@  AcpiHwWrite (
 
     /* Validate contents of the GAS register */
 
-    Status = AcpiHwValidateRegister (Reg, 32, &Address);
+    Status = AcpiHwValidateRegister (Reg, 64, &Address);
     if (ACPI_FAILURE (Status))
     {
         return (Status);
@@ -491,7 +488,7 @@  AcpiHwWrite (
 
     /* Convert AccessWidth into number of bits based */
 
-    AccessWidth = AcpiHwGetAccessBitWidth (Address, Reg, 32);
+    AccessWidth = AcpiHwGetAccessBitWidth (Address, Reg, 64);
     BitWidth = Reg->BitOffset + Reg->BitWidth;
     BitOffset = Reg->BitOffset;
 
@@ -504,10 +501,10 @@  AcpiHwWrite (
     {
         /*
          * Use offset style bit reads because "Index * AccessWidth" is
-         * ensured to be less than 32-bits by AcpiHwValidateRegister().
+         * ensured to be less than 64-bits by AcpiHwValidateRegister().
          */
-        Value32 = ACPI_GET_BITS (&Value, Index * AccessWidth,
-            ACPI_MASK_BITS_ABOVE_32 (AccessWidth));
+        Value64 = ACPI_GET_BITS (&Value, Index * AccessWidth,
+            ACPI_MASK_BITS_ABOVE_64 (AccessWidth));
 
         if (BitOffset >= AccessWidth)
         {
@@ -517,7 +514,6 @@  AcpiHwWrite (
         {
             if (Reg->SpaceId == ACPI_ADR_SPACE_SYSTEM_MEMORY)
             {
-                Value64 = (UINT64) Value32;
                 Status = AcpiOsWriteMemory ((ACPI_PHYSICAL_ADDRESS)
                     Address + Index * ACPI_DIV_8 (AccessWidth),
                     Value64, AccessWidth);
@@ -526,7 +522,7 @@  AcpiHwWrite (
             {
                 Status = AcpiHwWritePort ((ACPI_IO_ADDRESS)
                     Address + Index * ACPI_DIV_8 (AccessWidth),
-                    Value32, AccessWidth);
+                    (UINT32) Value64, AccessWidth);
             }
         }
 
@@ -539,9 +535,9 @@  AcpiHwWrite (
     }
 
     ACPI_DEBUG_PRINT ((ACPI_DB_IO,
-        "Wrote: %8.8X width %2d   to %8.8X%8.8X (%s)\n",
-        Value, AccessWidth, ACPI_FORMAT_UINT64 (Address),
-        AcpiUtGetRegionName (Reg->SpaceId)));
+        "Wrote: %8.8X%8.8X width %2d   to %8.8X%8.8X (%s)\n",
+        ACPI_FORMAT_UINT64 (Value), AccessWidth,
+        ACPI_FORMAT_UINT64 (Address), AcpiUtGetRegionName (Reg->SpaceId)));
 
     return (Status);
 }
@@ -688,6 +684,7 @@  AcpiHwRegisterRead (
     UINT32                  *ReturnValue)
 {
     UINT32                  Value = 0;
+    UINT64                  Value64;
     ACPI_STATUS             Status;
 
 
@@ -726,12 +723,14 @@  AcpiHwRegisterRead (
 
     case ACPI_REGISTER_PM2_CONTROL:          /* 8-bit access */
 
-        Status = AcpiHwRead (&Value, &AcpiGbl_FADT.XPm2ControlBlock);
+        Status = AcpiHwRead (&Value64, &AcpiGbl_FADT.XPm2ControlBlock);
+        Value = (UINT32) Value64;
         break;
 
     case ACPI_REGISTER_PM_TIMER:             /* 32-bit access */
 
-        Status = AcpiHwRead (&Value, &AcpiGbl_FADT.XPmTimerBlock);
+        Status = AcpiHwRead (&Value64, &AcpiGbl_FADT.XPmTimerBlock);
+        Value = (UINT32) Value64;
         break;
 
     case ACPI_REGISTER_SMI_COMMAND_BLOCK:    /* 8-bit access */
@@ -749,7 +748,7 @@  AcpiHwRegisterRead (
 
     if (ACPI_SUCCESS (Status))
     {
-        *ReturnValue = Value;
+        *ReturnValue = (UINT32) Value;
     }
 
     return_ACPI_STATUS (Status);
@@ -789,6 +788,7 @@  AcpiHwRegisterWrite (
 {
     ACPI_STATUS             Status;
     UINT32                  ReadValue;
+    UINT64                  ReadValue64;
 
 
     ACPI_FUNCTION_TRACE (HwRegisterWrite);
@@ -850,11 +850,12 @@  AcpiHwRegisterWrite (
          * For control registers, all reserved bits must be preserved,
          * as per the ACPI spec.
          */
-        Status = AcpiHwRead (&ReadValue, &AcpiGbl_FADT.XPm2ControlBlock);
+        Status = AcpiHwRead (&ReadValue64, &AcpiGbl_FADT.XPm2ControlBlock);
         if (ACPI_FAILURE (Status))
         {
             goto Exit;
         }
+        ReadValue = (UINT32) ReadValue64;
 
         /* Insert the bits to be preserved */
 
@@ -910,26 +911,29 @@  AcpiHwReadMultiple (
 {
     UINT32                  ValueA = 0;
     UINT32                  ValueB = 0;
+    UINT64                  Value64;
     ACPI_STATUS             Status;
 
 
     /* The first register is always required */
 
-    Status = AcpiHwRead (&ValueA, RegisterA);
+    Status = AcpiHwRead (&Value64, RegisterA);
     if (ACPI_FAILURE (Status))
     {
         return (Status);
     }
+    ValueA = (UINT32) Value64;
 
     /* Second register is optional */
 
     if (RegisterB->Address)
     {
-        Status = AcpiHwRead (&ValueB, RegisterB);
+        Status = AcpiHwRead (&Value64, RegisterB);
         if (ACPI_FAILURE (Status))
         {
             return (Status);
         }
+        ValueB = (UINT32) Value64;
     }
 
     /*
diff --git a/src/acpica/source/components/hardware/hwxface.c b/src/acpica/source/components/hardware/hwxface.c
index 3627a971..49a19e45 100644
--- a/src/acpica/source/components/hardware/hwxface.c
+++ b/src/acpica/source/components/hardware/hwxface.c
@@ -247,84 +247,14 @@  AcpiRead (
     UINT64                  *ReturnValue,
     ACPI_GENERIC_ADDRESS    *Reg)
 {
-    UINT32                  ValueLo;
-    UINT32                  ValueHi;
-    UINT32                  Width;
-    UINT64                  Address;
     ACPI_STATUS             Status;
 
 
     ACPI_FUNCTION_NAME (AcpiRead);
 
 
-    if (!ReturnValue)
-    {
-        return (AE_BAD_PARAMETER);
-    }
-
-    /* Validate contents of the GAS register. Allow 64-bit transfers */
-
-    Status = AcpiHwValidateRegister (Reg, 64, &Address);
-    if (ACPI_FAILURE (Status))
-    {
-        return (Status);
-    }
-
-    /*
-     * Two address spaces supported: Memory or I/O. PCI_Config is
-     * not supported here because the GAS structure is insufficient
-     */
-    if (Reg->SpaceId == ACPI_ADR_SPACE_SYSTEM_MEMORY)
-    {
-        Status = AcpiOsReadMemory ((ACPI_PHYSICAL_ADDRESS)
-            Address, ReturnValue, Reg->BitWidth);
-        if (ACPI_FAILURE (Status))
-        {
-            return (Status);
-        }
-    }
-    else /* ACPI_ADR_SPACE_SYSTEM_IO, validated earlier */
-    {
-        ValueLo = 0;
-        ValueHi = 0;
-
-        Width = Reg->BitWidth;
-        if (Width == 64)
-        {
-            Width = 32; /* Break into two 32-bit transfers */
-        }
-
-        Status = AcpiHwReadPort ((ACPI_IO_ADDRESS)
-            Address, &ValueLo, Width);
-        if (ACPI_FAILURE (Status))
-        {
-            return (Status);
-        }
-
-        if (Reg->BitWidth == 64)
-        {
-            /* Read the top 32 bits */
-
-            Status = AcpiHwReadPort ((ACPI_IO_ADDRESS)
-                (Address + 4), &ValueHi, 32);
-            if (ACPI_FAILURE (Status))
-            {
-                return (Status);
-            }
-        }
-
-        /* Set the return value only if status is AE_OK */
-
-        *ReturnValue = (ValueLo | ((UINT64) ValueHi << 32));
-    }
-
-    ACPI_DEBUG_PRINT ((ACPI_DB_IO,
-        "Read:  %8.8X%8.8X width %2d from %8.8X%8.8X (%s)\n",
-        ACPI_FORMAT_UINT64 (*ReturnValue), Reg->BitWidth,
-        ACPI_FORMAT_UINT64 (Address),
-        AcpiUtGetRegionName (Reg->SpaceId)));
-
-    return (AE_OK);
+    Status = AcpiHwRead (ReturnValue, Reg);
+    return (Status);
 }
 
 ACPI_EXPORT_SYMBOL (AcpiRead)
@@ -348,67 +278,13 @@  AcpiWrite (
     UINT64                  Value,
     ACPI_GENERIC_ADDRESS    *Reg)
 {
-    UINT32                  Width;
-    UINT64                  Address;
     ACPI_STATUS             Status;
 
 
     ACPI_FUNCTION_NAME (AcpiWrite);
 
 
-    /* Validate contents of the GAS register. Allow 64-bit transfers */
-
-    Status = AcpiHwValidateRegister (Reg, 64, &Address);
-    if (ACPI_FAILURE (Status))
-    {
-        return (Status);
-    }
-
-    /*
-     * Two address spaces supported: Memory or IO. PCI_Config is
-     * not supported here because the GAS structure is insufficient
-     */
-    if (Reg->SpaceId == ACPI_ADR_SPACE_SYSTEM_MEMORY)
-    {
-        Status = AcpiOsWriteMemory ((ACPI_PHYSICAL_ADDRESS)
-            Address, Value, Reg->BitWidth);
-        if (ACPI_FAILURE (Status))
-        {
-            return (Status);
-        }
-    }
-    else /* ACPI_ADR_SPACE_SYSTEM_IO, validated earlier */
-    {
-        Width = Reg->BitWidth;
-        if (Width == 64)
-        {
-            Width = 32; /* Break into two 32-bit transfers */
-        }
-
-        Status = AcpiHwWritePort ((ACPI_IO_ADDRESS)
-            Address, ACPI_LODWORD (Value), Width);
-        if (ACPI_FAILURE (Status))
-        {
-            return (Status);
-        }
-
-        if (Reg->BitWidth == 64)
-        {
-            Status = AcpiHwWritePort ((ACPI_IO_ADDRESS)
-                (Address + 4), ACPI_HIDWORD (Value), 32);
-            if (ACPI_FAILURE (Status))
-            {
-                return (Status);
-            }
-        }
-    }
-
-    ACPI_DEBUG_PRINT ((ACPI_DB_IO,
-        "Wrote: %8.8X%8.8X width %2d   to %8.8X%8.8X (%s)\n",
-        ACPI_FORMAT_UINT64 (Value), Reg->BitWidth,
-        ACPI_FORMAT_UINT64 (Address),
-        AcpiUtGetRegionName (Reg->SpaceId)));
-
+    Status = AcpiHwWrite (Value, Reg);
     return (Status);
 }
 
diff --git a/src/acpica/source/components/namespace/nsconvert.c b/src/acpica/source/components/namespace/nsconvert.c
index daf8f475..bb825895 100644
--- a/src/acpica/source/components/namespace/nsconvert.c
+++ b/src/acpica/source/components/namespace/nsconvert.c
@@ -191,8 +191,7 @@  AcpiNsConvertToInteger (
 
         /* String-to-Integer conversion */
 
-        Status = AcpiUtStrtoul64 (OriginalObject->String.Pointer,
-            AcpiGbl_IntegerByteWidth, &Value);
+        Status = AcpiUtStrtoul64 (OriginalObject->String.Pointer, &Value);
         if (ACPI_FAILURE (Status))
         {
             return (Status);
diff --git a/src/acpica/source/components/tables/tbxface.c b/src/acpica/source/components/tables/tbxface.c
index d8cb6b18..6393bdac 100644
--- a/src/acpica/source/components/tables/tbxface.c
+++ b/src/acpica/source/components/tables/tbxface.c
@@ -300,10 +300,13 @@  AcpiReallocateRootTable (
 
 
     /*
-     * Only reallocate the root table if the host provided a static buffer
-     * for the table array in the call to AcpiInitializeTables.
+     * If there are tables unverified, it is required to reallocate the
+     * root table list to clean up invalid table entries. Otherwise only
+     * reallocate the root table list if the host provided a static buffer
+     * for the table array in the call to AcpiInitializeTables().
      */
-    if (AcpiGbl_RootTableList.Flags & ACPI_ROOT_ORIGIN_ALLOCATED)
+    if ((AcpiGbl_RootTableList.Flags & ACPI_ROOT_ORIGIN_ALLOCATED) &&
+        AcpiGbl_EnableTableValidation)
     {
         return_ACPI_STATUS (AE_SUPPORT);
     }
diff --git a/src/acpica/source/components/utilities/utstrsuppt.c b/src/acpica/source/components/utilities/utstrsuppt.c
new file mode 100644
index 00000000..9197a57a
--- /dev/null
+++ b/src/acpica/source/components/utilities/utstrsuppt.c
@@ -0,0 +1,613 @@ 
+/*******************************************************************************
+ *
+ * Module Name: utstrsuppt - Support functions for string-to-integer conversion
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2017, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************
+ *
+ * Alternatively, you may choose to be licensed under the terms of the
+ * following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions, and the following disclaimer,
+ *    without modification.
+ * 2. Redistributions in binary form must reproduce at minimum a disclaimer
+ *    substantially similar to the "NO WARRANTY" disclaimer below
+ *    ("Disclaimer") and any redistribution must be conditioned upon
+ *    including a substantially similar Disclaimer requirement for further
+ *    binary redistribution.
+ * 3. Neither the names of the above-listed copyright holders nor the names
+ *    of any contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Alternatively, you may choose to be licensed under the terms of the
+ * GNU General Public License ("GPL") version 2 as published by the Free
+ * Software Foundation.
+ *
+ *****************************************************************************/
+
+#include "acpi.h"
+#include "accommon.h"
+
+#define _COMPONENT          ACPI_UTILITIES
+        ACPI_MODULE_NAME    ("utstrsuppt")
+
+
+/* Local prototypes */
+
+static ACPI_STATUS
+AcpiUtInsertDigit (
+    UINT64                  *AccumulatedValue,
+    UINT32                  Base,
+    int                     AsciiDigit);
+
+static ACPI_STATUS
+AcpiUtStrtoulMultiply64 (
+    UINT64                  Multiplicand,
+    UINT64                  Multiplier,
+    UINT64                  *OutProduct);
+
+static ACPI_STATUS
+AcpiUtStrtoulAdd64 (
+    UINT64                  Addend1,
+    UINT64                  Addend2,
+    UINT64                  *OutSum);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtConvertOctalString
+ *
+ * PARAMETERS:  String                  - Null terminated input string
+ *              ReturnValuePtr          - Where the converted value is returned
+ *
+ * RETURN:      Status and 64-bit converted integer
+ *
+ * DESCRIPTION: Performs a base 8 conversion of the input string to an
+ *              integer value, either 32 or 64 bits.
+ *
+ * NOTE:        Maximum 64-bit unsigned octal value is 01777777777777777777777
+ *              Maximum 32-bit unsigned octal value is 037777777777
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtConvertOctalString (
+    char                    *String,
+    UINT64                  *ReturnValuePtr)
+{
+    UINT64                  AccumulatedValue = 0;
+    ACPI_STATUS             Status = AE_OK;
+
+
+    /* Convert each ASCII byte in the input string */
+
+    while (*String)
+    {
+        /* Character must be ASCII 0-7, otherwise terminate with no error */
+
+        if (!(ACPI_IS_OCTAL_DIGIT (*String)))
+        {
+            break;
+        }
+
+        /* Convert and insert this octal digit into the accumulator */
+
+        Status = AcpiUtInsertDigit (&AccumulatedValue, 8, *String);
+        if (ACPI_FAILURE (Status))
+        {
+            Status = AE_OCTAL_OVERFLOW;
+            break;
+        }
+
+        String++;
+    }
+
+    /* Always return the value that has been accumulated */
+
+    *ReturnValuePtr = AccumulatedValue;
+    return (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtConvertDecimalString
+ *
+ * PARAMETERS:  String                  - Null terminated input string
+ *              ReturnValuePtr          - Where the converted value is returned
+ *
+ * RETURN:      Status and 64-bit converted integer
+ *
+ * DESCRIPTION: Performs a base 10 conversion of the input string to an
+ *              integer value, either 32 or 64 bits.
+ *
+ * NOTE:        Maximum 64-bit unsigned decimal value is 18446744073709551615
+ *              Maximum 32-bit unsigned decimal value is 4294967295
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtConvertDecimalString (
+    char                    *String,
+    UINT64                  *ReturnValuePtr)
+{
+    UINT64                  AccumulatedValue = 0;
+    ACPI_STATUS             Status = AE_OK;
+
+
+    /* Convert each ASCII byte in the input string */
+
+    while (*String)
+    {
+        /* Character must be ASCII 0-9, otherwise terminate with no error */
+
+        if (!isdigit (*String))
+        {
+           break;
+        }
+
+        /* Convert and insert this decimal digit into the accumulator */
+
+        Status = AcpiUtInsertDigit (&AccumulatedValue, 10, *String);
+        if (ACPI_FAILURE (Status))
+        {
+            Status = AE_DECIMAL_OVERFLOW;
+            break;
+        }
+
+        String++;
+    }
+
+    /* Always return the value that has been accumulated */
+
+    *ReturnValuePtr = AccumulatedValue;
+    return (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtConvertHexString
+ *
+ * PARAMETERS:  String                  - Null terminated input string
+ *              ReturnValuePtr          - Where the converted value is returned
+ *
+ * RETURN:      Status and 64-bit converted integer
+ *
+ * DESCRIPTION: Performs a base 16 conversion of the input string to an
+ *              integer value, either 32 or 64 bits.
+ *
+ * NOTE:        Maximum 64-bit unsigned hex value is 0xFFFFFFFFFFFFFFFF
+ *              Maximum 32-bit unsigned hex value is 0xFFFFFFFF
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtConvertHexString (
+    char                    *String,
+    UINT64                  *ReturnValuePtr)
+{
+    UINT64                  AccumulatedValue = 0;
+    ACPI_STATUS             Status = AE_OK;
+
+
+    /* Convert each ASCII byte in the input string */
+
+    while (*String)
+    {
+        /* Must be ASCII A-F, a-f, or 0-9, otherwise terminate with no error */
+
+        if (!isxdigit (*String))
+        {
+            break;
+        }
+
+        /* Convert and insert this hex digit into the accumulator */
+
+        Status = AcpiUtInsertDigit (&AccumulatedValue, 16, *String);
+        if (ACPI_FAILURE (Status))
+        {
+            Status = AE_HEX_OVERFLOW;
+            break;
+        }
+
+        String++;
+    }
+
+    /* Always return the value that has been accumulated */
+
+    *ReturnValuePtr = AccumulatedValue;
+    return (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtRemoveLeadingZeros
+ *
+ * PARAMETERS:  String                  - Pointer to input ASCII string
+ *
+ * RETURN:      Next character after any leading zeros. This character may be
+ *              used by the caller to detect end-of-string.
+ *
+ * DESCRIPTION: Remove any leading zeros in the input string. Return the
+ *              next character after the final ASCII zero to enable the caller
+ *              to check for the end of the string (NULL terminator).
+ *
+ ******************************************************************************/
+
+char
+AcpiUtRemoveLeadingZeros (
+    char                    **String)
+{
+
+    while (**String == ACPI_ASCII_ZERO)
+    {
+        *String += 1;
+    }
+
+    return (**String);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtRemoveWhitespace
+ *
+ * PARAMETERS:  String                  - Pointer to input ASCII string
+ *
+ * RETURN:      Next character after any whitespace. This character may be
+ *              used by the caller to detect end-of-string.
+ *
+ * DESCRIPTION: Remove any leading whitespace in the input string. Return the
+ *              next character after the final ASCII zero to enable the caller
+ *              to check for the end of the string (NULL terminator).
+ *
+ ******************************************************************************/
+
+char
+AcpiUtRemoveWhitespace (
+    char                    **String)
+{
+
+    while (isspace ((UINT8) **String))
+    {
+        *String += 1;
+    }
+
+    return (**String);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtDetectHexPrefix
+ *
+ * PARAMETERS:  String                  - Pointer to input ASCII string
+ *
+ * RETURN:      TRUE if a "0x" prefix was found at the start of the string
+ *
+ * DESCRIPTION: Detect and remove a hex "0x" prefix
+ *
+ ******************************************************************************/
+
+BOOLEAN
+AcpiUtDetectHexPrefix (
+    char                    **String)
+{
+
+    if ((**String == ACPI_ASCII_ZERO) &&
+        (tolower ((int) *(*String + 1)) == 'x'))
+    {
+        *String += 2;        /* Go past the leading 0x */
+        return (TRUE);
+    }
+
+    return (FALSE);     /* Not a hex string */
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtDetectOctalPrefix
+ *
+ * PARAMETERS:  String                  - Pointer to input ASCII string
+ *
+ * RETURN:      True if an octal "0" prefix was found at the start of the
+ *              string
+ *
+ * DESCRIPTION: Detect and remove an octal prefix (zero)
+ *
+ ******************************************************************************/
+
+BOOLEAN
+AcpiUtDetectOctalPrefix (
+    char                    **String)
+{
+
+    if (**String == ACPI_ASCII_ZERO)
+    {
+        *String += 1;       /* Go past the leading 0 */
+        return (TRUE);
+    }
+
+    return (FALSE);     /* Not an octal string */
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtInsertDigit
+ *
+ * PARAMETERS:  AccumulatedValue        - Current value of the integer value
+ *                                        accumulator. The new value is
+ *                                        returned here.
+ *              Base                    - Radix, either 8/10/16
+ *              AsciiDigit              - ASCII single digit to be inserted
+ *
+ * RETURN:      Status and result of the convert/insert operation. The only
+ *              possible returned exception code is numeric overflow of
+ *              either the multiply or add conversion operations.
+ *
+ * DESCRIPTION: Generic conversion and insertion function for all bases:
+ *
+ *              1) Multiply the current accumulated/converted value by the
+ *              base in order to make room for the new character.
+ *
+ *              2) Convert the new character to binary and add it to the
+ *              current accumulated value.
+ *
+ *              Note: The only possible exception indicates an integer
+ *              overflow (AE_NUMERIC_OVERFLOW)
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiUtInsertDigit (
+    UINT64                  *AccumulatedValue,
+    UINT32                  Base,
+    int                     AsciiDigit)
+{
+    ACPI_STATUS             Status;
+    UINT64                  Product;
+
+
+     /* Make room in the accumulated value for the incoming digit */
+
+    Status = AcpiUtStrtoulMultiply64 (*AccumulatedValue, Base, &Product);
+    if (ACPI_FAILURE (Status))
+    {
+        return (Status);
+    }
+
+    /* Add in the new digit, and store the sum to the accumulated value */
+
+    Status = AcpiUtStrtoulAdd64 (Product, AcpiUtAsciiCharToHex (AsciiDigit),
+        AccumulatedValue);
+
+    return (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtStrtoulMultiply64
+ *
+ * PARAMETERS:  Multiplicand            - Current accumulated converted integer
+ *              Multiplier              - Base/Radix
+ *              OutProduct              - Where the product is returned
+ *
+ * RETURN:      Status and 64-bit product
+ *
+ * DESCRIPTION: Multiply two 64-bit values, with checking for 64-bit overflow as
+ *              well as 32-bit overflow if necessary (if the current global
+ *              integer width is 32).
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiUtStrtoulMultiply64 (
+    UINT64                  Multiplicand,
+    UINT64                  Multiplier,
+    UINT64                  *OutProduct)
+{
+    UINT64                  Product;
+
+
+    /* Exit if either operand is zero */
+
+    *OutProduct = 0;
+    if (!Multiplicand || !Multiplier)
+    {
+        return (AE_OK);
+    }
+
+    /* Check for 64-bit overflow before the actual multiplication */
+
+    if (Multiplicand > (ACPI_UINT64_MAX / Multiplier))
+    {
+        return (AE_NUMERIC_OVERFLOW);
+    }
+
+    Product = Multiplicand * Multiplier;
+
+    /* Check for 32-bit overflow if necessary */
+
+    if ((AcpiGbl_IntegerBitWidth == 32) && (Product > ACPI_UINT32_MAX))
+    {
+        return (AE_NUMERIC_OVERFLOW);
+    }
+
+    *OutProduct = Product;
+    return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtStrtoulAdd64
+ *
+ * PARAMETERS:  Addend1                 - Current accumulated converted integer
+ *              Addend2                 - New hex value/char
+ *              OutSum                  - Where sum is returned (Accumulator)
+ *
+ * RETURN:      Status and 64-bit sum
+ *
+ * DESCRIPTION: Add two 64-bit values, with checking for 64-bit overflow as
+ *              well as 32-bit overflow if necessary (if the current global
+ *              integer width is 32).
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiUtStrtoulAdd64 (
+    UINT64                  Addend1,
+    UINT64                  Addend2,
+    UINT64                  *OutSum)
+{
+    UINT64                  Sum;
+
+
+    /* Check for 64-bit overflow before the actual addition */
+
+    if ((Addend1 > 0) && (Addend2 > (ACPI_UINT64_MAX - Addend1)))
+    {
+        return (AE_NUMERIC_OVERFLOW);
+    }
+
+    Sum = Addend1 + Addend2;
+
+    /* Check for 32-bit overflow if necessary */
+
+    if ((AcpiGbl_IntegerBitWidth == 32) && (Sum > ACPI_UINT32_MAX))
+    {
+        return (AE_NUMERIC_OVERFLOW);
+    }
+
+    *OutSum = Sum;
+    return (AE_OK);
+}
diff --git a/src/acpica/source/components/utilities/utstrtoul64.c b/src/acpica/source/components/utilities/utstrtoul64.c
index d91e9084..34cef95b 100644
--- a/src/acpica/source/components/utilities/utstrtoul64.c
+++ b/src/acpica/source/components/utilities/utstrtoul64.c
@@ -1,6 +1,7 @@ 
 /*******************************************************************************
  *
- * Module Name: utstrtoul64 - string to 64-bit integer support
+ * Module Name: utstrtoul64 - String-to-integer conversion support for both
+ *                            64-bit and 32-bit integers
  *
  ******************************************************************************/
 
@@ -152,84 +153,47 @@ 
 #include "acpi.h"
 #include "accommon.h"
 
-
-/*******************************************************************************
- *
- * The functions in this module satisfy the need for 64-bit string-to-integer
- * conversions on both 32-bit and 64-bit platforms.
- *
- ******************************************************************************/
-
 #define _COMPONENT          ACPI_UTILITIES
         ACPI_MODULE_NAME    ("utstrtoul64")
 
-/* Local prototypes */
-
-static UINT64
-AcpiUtStrtoulBase10 (
-    char                    *String,
-    UINT32                  Flags);
-
-static UINT64
-AcpiUtStrtoulBase16 (
-    char                    *String,
-    UINT32                  Flags);
-
 
 /*******************************************************************************
  *
- * String conversion rules as written in the ACPI specification. The error
- * conditions and behavior are different depending on the type of conversion.
- *
- *
- * Implicit data type conversion: string-to-integer
- * --------------------------------------------------
- *
- * Base is always 16. This is the ACPI_STRTOUL_BASE16 case.
- *
- * Example:
- *      Add ("BA98", Arg0, Local0)
- *
- * The integer is initialized to the value zero.
- * The ASCII string is interpreted as a hexadecimal constant.
- *
- *  1)  A "0x" prefix is not allowed. However, ACPICA allows this for
- *      compatibility with previous ACPICA. (NO ERROR)
- *
- *  2)  Terminates when the size of an integer is reached (32 or 64 bits).
- *      (NO ERROR)
- *
- *  3)  The first non-hex character terminates the conversion without error.
- *      (NO ERROR)
- *
- *  4)  Conversion of a null (zero-length) string to an integer is not
- *      allowed. However, ACPICA allows this for compatibility with previous
- *      ACPICA. This conversion returns the value 0. (NO ERROR)
+ * This module contains the top-level string to 64/32-bit unsigned integer
+ * conversion functions:
  *
+ *  1) A standard strtoul() function that supports 64-bit integers, base
+ *     8/10/16, with integer overflow support. This is used mainly by the
+ *     iASL compiler, which implements tighter constraints on integer
+ *     constants than the runtime (interpreter) integer-to-string conversions.
+ *  2) Runtime "Explicit conversion" as defined in the ACPI specification.
+ *  3) Runtime "Implicit conversion" as defined in the ACPI specification.
  *
- * Explicit data type conversion:  ToInteger() with string operand
- * ---------------------------------------------------------------
+ * Current users of this module:
  *
- * Base is either 10 (default) or 16 (with 0x prefix)
- *
- * Examples:
- *      ToInteger ("1000")
- *      ToInteger ("0xABCD")
- *
- *  1)  Can be (must be) either a decimal or hexadecimal numeric string.
- *      A hex value must be prefixed by "0x" or it is interpreted as a decimal.
+ *  iASL        - Preprocessor (constants and math expressions)
+ *  iASL        - Main parser, conversion of constants to integers
+ *  iASL        - Data Table Compiler parser (constants and math expressions)
+ *  Interpreter - Implicit and explicit conversions, GPE method names
+ *  Interpreter - Repair code for return values from predefined names
+ *  Debugger    - Command line input string conversion
+ *  AcpiDump    - ACPI table physical addresses
+ *  AcpiExec    - Support for namespace overrides
  *
- *  2)  The value must not exceed the maximum of an integer value. ACPI spec
- *      states the behavior is "unpredictable", so ACPICA matches the behavior
- *      of the implicit conversion case.(NO ERROR)
+ * Notes concerning users of these interfaces:
  *
- *  3)  Behavior on the first non-hex character is not specified by the ACPI
- *      spec, so ACPICA matches the behavior of the implicit conversion case
- *      and terminates. (NO ERROR)
+ * AcpiGbl_IntegerByteWidth is used to set the 32/64 bit limit for explicit
+ * and implicit conversions. This global must be set to the proper width.
+ * For the core ACPICA code, the width depends on the DSDT version. For the
+ * AcpiUtStrtoul64 interface, all conversions are 64 bits. This interface is
+ * used primarily for iASL, where the default width is 64 bits for all parsers,
+ * but error checking is performed later to flag cases where a 64-bit constant
+ * is wrongly defined in a 32-bit DSDT/SSDT.
  *
- *  4)  A null (zero-length) string is illegal.
- *      However, ACPICA allows this for compatibility with previous ACPICA.
- *      This conversion returns the value 0. (NO ERROR)
+ * In ACPI, the only place where octal numbers are supported is within
+ * the ASL language itself. This is implemented via the main AcpiUtStrtoul64
+ * interface. According the ACPI specification, there is no ACPI runtime
+ * support (explicit/implicit) for octal string conversions.
  *
  ******************************************************************************/
 
@@ -238,261 +202,301 @@  AcpiUtStrtoulBase16 (
  *
  * FUNCTION:    AcpiUtStrtoul64
  *
- * PARAMETERS:  String                  - Null terminated input string
- *              Flags                   - Conversion info, see below
+ * PARAMETERS:  String                  - Null terminated input string,
+ *                                        must be a valid pointer
  *              ReturnValue             - Where the converted integer is
- *                                        returned
- *
- * RETURN:      Status and Converted value
+ *                                        returned. Must be a valid pointer
  *
- * DESCRIPTION: Convert a string into an unsigned value. Performs either a
- *              32-bit or 64-bit conversion, depending on the input integer
- *              size in Flags (often the current mode of the interpreter).
+ * RETURN:      Status and converted integer. Returns an exception on a
+ *              64-bit numeric overflow
  *
- * Values for Flags:
- *      ACPI_STRTOUL_32BIT      - Max integer value is 32 bits
- *      ACPI_STRTOUL_64BIT      - Max integer value is 64 bits
- *      ACPI_STRTOUL_BASE16     - Input string is hexadecimal. Default
- *                                is 10/16 based on string prefix (0x).
+ * DESCRIPTION: Convert a string into an unsigned integer. Always performs a
+ *              full 64-bit conversion, regardless of the current global
+ *              integer width. Supports Decimal, Hex, and Octal strings.
  *
- * NOTES:
- *   Negative numbers are not supported, as they are not supported by ACPI.
+ * Current users of this function:
  *
- *   Supports only base 16 or base 10 strings/values. Does not
- *   support Octal strings, as these are not supported by ACPI.
- *
- * Current users of this support:
- *
- *  Interpreter - Implicit and explicit conversions, GPE method names
- *  Debugger    - Command line input string conversion
- *  iASL        - Main parser, conversion of constants to integers
- *  iASL        - Data Table Compiler parser (constant math expressions)
- *  iASL        - Preprocessor (constant math expressions)
- *  AcpiDump    - Input table addresses
- *  AcpiExec    - Testing of the AcpiUtStrtoul64 function
- *
- * Note concerning callers:
- *   AcpiGbl_IntegerByteWidth can be used to set the 32/64 limit. If used,
- *   this global should be set to the proper width. For the core ACPICA code,
- *   this width depends on the DSDT version. For iASL, the default byte
- *   width is always 8 for the parser, but error checking is performed later
- *   to flag cases where a 64-bit constant is defined in a 32-bit DSDT/SSDT.
+ *  iASL        - Preprocessor (constants and math expressions)
+ *  iASL        - Main ASL parser, conversion of ASL constants to integers
+ *  iASL        - Data Table Compiler parser (constants and math expressions)
+ *  Interpreter - Repair code for return values from predefined names
+ *  AcpiDump    - ACPI table physical addresses
+ *  AcpiExec    - Support for namespace overrides
  *
  ******************************************************************************/
 
 ACPI_STATUS
 AcpiUtStrtoul64 (
     char                    *String,
-    UINT32                  Flags,
     UINT64                  *ReturnValue)
 {
     ACPI_STATUS             Status = AE_OK;
-    UINT32                  Base;
+    UINT8                   OriginalBitWidth;
+    UINT32                  Base = 10;          /* Default is decimal */
 
 
     ACPI_FUNCTION_TRACE_STR (UtStrtoul64, String);
 
 
-    /* Parameter validation */
-
-    if (!String || !ReturnValue)
-    {
-        return_ACPI_STATUS (AE_BAD_PARAMETER);
-    }
-
     *ReturnValue = 0;
 
-    /* Check for zero-length string, returns 0 */
+    /* A NULL return string returns a value of zero */
 
     if (*String == 0)
     {
         return_ACPI_STATUS (AE_OK);
     }
 
-    /* Skip over any white space at start of string */
-
-    while (isspace ((int) *String))
-    {
-        String++;
-    }
-
-    /* End of string? return 0 */
-
-    if (*String == 0)
+    if (!AcpiUtRemoveWhitespace (&String))
     {
         return_ACPI_STATUS (AE_OK);
     }
 
     /*
-     * 1) The "0x" prefix indicates base 16. Per the ACPI specification,
-     * the "0x" prefix is only allowed for implicit (non-strict) conversions.
-     * However, we always allow it for compatibility with older ACPICA.
+     * 1) Check for a hex constant. A "0x" prefix indicates base 16.
      */
-    if ((*String == ACPI_ASCII_ZERO) &&
-        (tolower ((int) *(String + 1)) == 'x'))
+    if (AcpiUtDetectHexPrefix (&String))
     {
-        String += 2;    /* Go past the 0x */
-        if (*String == 0)
-        {
-            return_ACPI_STATUS (AE_OK);     /* Return value 0 */
-        }
-
         Base = 16;
     }
 
-    /* 2) Force to base 16 (implicit conversion case) */
-
-    else if (Flags & ACPI_STRTOUL_BASE16)
+    /*
+     * 2) Check for an octal constant, defined to be a leading zero
+     * followed by sequence of octal digits (0-7)
+     */
+    else if (AcpiUtDetectOctalPrefix (&String))
     {
-        Base = 16;
+        Base = 8;
     }
 
-    /* 3) Default fallback is to Base 10 */
-
-    else
+    if (!AcpiUtRemoveLeadingZeros (&String))
     {
-        Base = 10;
+        return_ACPI_STATUS (AE_OK);     /* Return value 0 */
     }
 
-    /* Skip all leading zeros */
+    /*
+     * Force a full 64-bit conversion. The caller (usually iASL) must
+     * check for a 32-bit overflow later as necessary (If current mode
+     * is 32-bit, meaning a 32-bit DSDT).
+     */
+    OriginalBitWidth = AcpiGbl_IntegerBitWidth;
+    AcpiGbl_IntegerBitWidth = 64;
 
-    while (*String == ACPI_ASCII_ZERO)
+    /*
+     * Perform the base 8, 10, or 16 conversion. A 64-bit numeric overflow
+     * will return an exception (to allow iASL to flag the statement).
+     */
+    switch (Base)
     {
-        String++;
-        if (*String == 0)
-        {
-            return_ACPI_STATUS (AE_OK);     /* Return value 0 */
-        }
+    case 8:
+        Status = AcpiUtConvertOctalString (String, ReturnValue);
+        break;
+
+    case 10:
+        Status = AcpiUtConvertDecimalString (String, ReturnValue);
+        break;
+
+    case 16:
+    default:
+        Status = AcpiUtConvertHexString (String, ReturnValue);
+        break;
     }
 
-    /* Perform the base 16 or 10 conversion */
-
-    if (Base == 16)
-    {
-        *ReturnValue = AcpiUtStrtoulBase16 (String, Flags);
-    }
-    else
-    {
-        *ReturnValue = AcpiUtStrtoulBase10 (String, Flags);
-    }
+    /* Only possible exception from above is a 64-bit overflow */
 
+    AcpiGbl_IntegerBitWidth = OriginalBitWidth;
     return_ACPI_STATUS (Status);
 }
 
 
 /*******************************************************************************
  *
- * FUNCTION:    AcpiUtStrtoulBase10
+ * FUNCTION:    AcpiUtImplicitStrtoul64
+ *
+ * PARAMETERS:  String                  - Null terminated input string,
+ *                                        must be a valid pointer
+ *
+ * RETURN:      Converted integer
+ *
+ * DESCRIPTION: Perform a 64-bit conversion with restrictions placed upon
+ *              an "implicit conversion" by the ACPI specification. Used by
+ *              many ASL operators that require an integer operand, and support
+ *              an automatic (implicit) conversion from a string operand
+ *              to the final integer operand. The major restriction is that
+ *              only hex strings are supported.
+ *
+ * -----------------------------------------------------------------------------
+ *
+ * Base is always 16, either with or without the 0x prefix. Decimal and
+ * Octal strings are not supported, as per the ACPI specification.
+ *
+ * Examples (both are hex values):
+ *      Add ("BA98", Arg0, Local0)
+ *      Subtract ("0x12345678", Arg1, Local1)
+ *
+ * Conversion rules as extracted from the ACPI specification:
+ *
+ *  The converted integer is initialized to the value zero.
+ *  The ASCII string is always interpreted as a hexadecimal constant.
+ *
+ *  1)  According to the ACPI specification, a "0x" prefix is not allowed.
+ *      However, ACPICA allows this as an ACPI extension on general
+ *      principle. (NO ERROR)
+ *
+ *  2)  The conversion terminates when the size of an integer is reached
+ *      (32 or 64 bits). There are no numeric overflow conditions. (NO ERROR)
+ *
+ *  3)  The first non-hex character terminates the conversion and returns
+ *      the current accumulated value of the converted integer (NO ERROR).
  *
- * PARAMETERS:  String                  - Null terminated input string
- *              Flags                   - Conversion info
+ *  4)  Conversion of a null (zero-length) string to an integer is
+ *      technically not allowed. However, ACPICA allows this as an ACPI
+ *      extension. The conversion returns the value 0. (NO ERROR)
  *
- * RETURN:      64-bit converted integer
+ * NOTE: There are no error conditions returned by this function. At
+ * the minimum, a value of zero is returned.
  *
- * DESCRIPTION: Performs a base 10 conversion of the input string to an
- *              integer value, either 32 or 64 bits.
- *              Note: String must be valid and non-null.
+ * Current users of this function:
+ *
+ *  Interpreter - All runtime implicit conversions, as per ACPI specification
+ *  iASL        - Data Table Compiler parser (constants and math expressions)
  *
  ******************************************************************************/
 
-static UINT64
-AcpiUtStrtoulBase10 (
-    char                    *String,
-    UINT32                  Flags)
+UINT64
+AcpiUtImplicitStrtoul64 (
+    char                    *String)
 {
-    int                     AsciiDigit;
-    UINT64                  NextValue;
-    UINT64                  ReturnValue = 0;
+    UINT64                  ConvertedInteger = 0;
 
 
-    /* Main loop: convert each ASCII byte in the input string */
-
-    while (*String)
-    {
-        AsciiDigit = *String;
-        if (!isdigit (AsciiDigit))
-        {
-            /* Not ASCII 0-9, terminate */
+    ACPI_FUNCTION_TRACE_STR (UtImplicitStrtoul64, String);
 
-            goto Exit;
-        }
 
-        /* Convert and insert (add) the decimal digit */
-
-        AcpiUtShortMultiply (ReturnValue, 10, &NextValue);
-        NextValue += (AsciiDigit - ACPI_ASCII_ZERO);
-
-        /* Check for overflow (32 or 64 bit) - return current converted value */
+    if (!AcpiUtRemoveWhitespace (&String))
+    {
+        return_VALUE (0);
+    }
 
-        if (((Flags & ACPI_STRTOUL_32BIT) && (NextValue > ACPI_UINT32_MAX)) ||
-            (NextValue < ReturnValue)) /* 64-bit overflow case */
-        {
-            goto Exit;
-        }
+    /*
+     * Per the ACPI specification, only hexadecimal is supported for
+     * implicit conversions, and the "0x" prefix is "not allowed".
+     * However, allow a "0x" prefix as an ACPI extension.
+     */
+    AcpiUtDetectHexPrefix (&String);
 
-        ReturnValue = NextValue;
-        String++;
+    if (!AcpiUtRemoveLeadingZeros (&String))
+    {
+        return_VALUE (0);
     }
 
-Exit:
-    return (ReturnValue);
+    /*
+     * Ignore overflow as per the ACPI specification. This is implemented by
+     * ignoring the return status from the conversion function called below.
+     * On overflow, the input string is simply truncated.
+     */
+    AcpiUtConvertHexString (String, &ConvertedInteger);
+    return_VALUE (ConvertedInteger);
 }
 
 
 /*******************************************************************************
  *
- * FUNCTION:    AcpiUtStrtoulBase16
+ * FUNCTION:    AcpiUtExplicitStrtoul64
+ *
+ * PARAMETERS:  String                  - Null terminated input string,
+ *                                        must be a valid pointer
  *
- * PARAMETERS:  String                  - Null terminated input string
- *              Flags                   - conversion info
+ * RETURN:      Converted integer
  *
- * RETURN:      64-bit converted integer
+ * DESCRIPTION: Perform a 64-bit conversion with the restrictions placed upon
+ *              an "explicit conversion" by the ACPI specification. The
+ *              main restriction is that only hex and decimal are supported.
  *
- * DESCRIPTION: Performs a base 16 conversion of the input string to an
- *              integer value, either 32 or 64 bits.
- *              Note: String must be valid and non-null.
+ * -----------------------------------------------------------------------------
+ *
+ * Base is either 10 (default) or 16 (with 0x prefix). Octal (base 8) strings
+ * are not supported, as per the ACPI specification.
+ *
+ * Examples:
+ *      ToInteger ("1000")      Decimal
+ *      ToInteger ("0xABCD")    Hex
+ *
+ * Conversion rules as extracted from the ACPI specification:
+ *
+ *  1)  The input string is either a decimal or hexadecimal numeric string.
+ *      A hex value must be prefixed by "0x" or it is interpreted as decimal.
+ *
+ *  2)  The value must not exceed the maximum of an integer value
+ *      (32 or 64 bits). The ACPI specification states the behavior is
+ *      "unpredictable", so ACPICA matches the behavior of the implicit
+ *      conversion case. There are no numeric overflow conditions. (NO ERROR)
+ *
+ *  3)  Behavior on the first non-hex character is not defined by the ACPI
+ *      specification (for the ToInteger operator), so ACPICA matches the
+ *      behavior of the implicit conversion case. It terminates the
+ *      conversion and returns the current accumulated value of the converted
+ *      integer. (NO ERROR)
+ *
+ *  4)  Conversion of a null (zero-length) string to an integer is
+ *      technically not allowed. However, ACPICA allows this as an ACPI
+ *      extension. The conversion returns the value 0. (NO ERROR)
+ *
+ * NOTE: There are no error conditions returned by this function. At the
+ * minimum, a value of zero is returned.
+ *
+ * Current users of this function:
+ *
+ *  Interpreter - Runtime ASL ToInteger operator, as per the ACPI specification
  *
  ******************************************************************************/
 
-static UINT64
-AcpiUtStrtoulBase16 (
-    char                    *String,
-    UINT32                  Flags)
+UINT64
+AcpiUtExplicitStrtoul64 (
+    char                    *String)
 {
-    int                     AsciiDigit;
-    UINT32                  ValidDigits = 1;
-    UINT64                  ReturnValue = 0;
-
+    UINT64                  ConvertedInteger = 0;
+    UINT32                  Base = 10;          /* Default is decimal */
 
-    /* Main loop: convert each ASCII byte in the input string */
 
-    while (*String)
-    {
-        /* Check for overflow (32 or 64 bit) - return current converted value */
+    ACPI_FUNCTION_TRACE_STR (UtExplicitStrtoul64, String);
 
-        if ((ValidDigits > 16) ||
-            ((ValidDigits > 8) && (Flags & ACPI_STRTOUL_32BIT)))
-        {
-            goto Exit;
-        }
 
-        AsciiDigit = *String;
-        if (!isxdigit (AsciiDigit))
-        {
-            /* Not Hex ASCII A-F, a-f, or 0-9, terminate */
-
-            goto Exit;
-        }
+    if (!AcpiUtRemoveWhitespace (&String))
+    {
+        return_VALUE (0);
+    }
 
-        /* Convert and insert the hex digit */
+    /*
+     * Only Hex and Decimal are supported, as per the ACPI specification.
+     * A "0x" prefix indicates hex; otherwise decimal is assumed.
+     */
+    if (AcpiUtDetectHexPrefix (&String))
+    {
+        Base = 16;
+    }
 
-        AcpiUtShortShiftLeft (ReturnValue, 4, &ReturnValue);
-        ReturnValue |= AcpiUtAsciiCharToHex (AsciiDigit);
+    if (!AcpiUtRemoveLeadingZeros (&String))
+    {
+        return_VALUE (0);
+    }
 
-        String++;
-        ValidDigits++;
+    /*
+     * Ignore overflow as per the ACPI specification. This is implemented by
+     * ignoring the return status from the conversion functions called below.
+     * On overflow, the input string is simply truncated.
+     */
+    switch (Base)
+    {
+    case 10:
+    default:
+        AcpiUtConvertDecimalString (String, &ConvertedInteger);
+        break;
+
+    case 16:
+        AcpiUtConvertHexString (String, &ConvertedInteger);
+        break;
     }
 
-Exit:
-    return (ReturnValue);
+    return_VALUE (ConvertedInteger);
 }
diff --git a/src/acpica/source/include/acexcep.h b/src/acpica/source/include/acexcep.h
index 1405e411..d808f275 100644
--- a/src/acpica/source/include/acexcep.h
+++ b/src/acpica/source/include/acexcep.h
@@ -237,8 +237,12 @@  typedef struct acpi_exception_info
 #define AE_NOT_CONFIGURED               EXCEP_ENV (0x001C)
 #define AE_ACCESS                       EXCEP_ENV (0x001D)
 #define AE_IO_ERROR                     EXCEP_ENV (0x001E)
+#define AE_NUMERIC_OVERFLOW             EXCEP_ENV (0x001F)
+#define AE_HEX_OVERFLOW                 EXCEP_ENV (0x0020)
+#define AE_DECIMAL_OVERFLOW             EXCEP_ENV (0x0021)
+#define AE_OCTAL_OVERFLOW               EXCEP_ENV (0x0022)
 
-#define AE_CODE_ENV_MAX                 0x001E
+#define AE_CODE_ENV_MAX                 0x0022
 
 
 /*
@@ -371,7 +375,11 @@  static const ACPI_EXCEPTION_INFO    AcpiGbl_ExceptionNames_Env[] =
     EXCEP_TXT ("AE_OWNER_ID_LIMIT",             "There are no more Owner IDs available for ACPI tables or control methods"),
     EXCEP_TXT ("AE_NOT_CONFIGURED",             "The interface is not part of the current subsystem configuration"),
     EXCEP_TXT ("AE_ACCESS",                     "Permission denied for the requested operation"),
-    EXCEP_TXT ("AE_IO_ERROR",                   "An I/O error occurred")
+    EXCEP_TXT ("AE_IO_ERROR",                   "An I/O error occurred"),
+    EXCEP_TXT ("AE_NUMERIC_OVERFLOW",           "Overflow during string-to-integer conversion"),
+    EXCEP_TXT ("AE_HEX_OVERFLOW",               "Overflow during ASCII hex-to-binary conversion"),
+    EXCEP_TXT ("AE_DECIMAL_OVERFLOW",           "Overflow during ASCII decimal-to-binary conversion"),
+    EXCEP_TXT ("AE_OCTAL_OVERFLOW",             "Overflow during ASCII octal-to-binary conversion")
 };
 
 static const ACPI_EXCEPTION_INFO    AcpiGbl_ExceptionNames_Pgm[] =
diff --git a/src/acpica/source/include/achware.h b/src/acpica/source/include/achware.h
index f33be8c4..c3bf8f15 100644
--- a/src/acpica/source/include/achware.h
+++ b/src/acpica/source/include/achware.h
@@ -185,12 +185,12 @@  AcpiHwValidateRegister (
 
 ACPI_STATUS
 AcpiHwRead (
-    UINT32                  *Value,
+    UINT64                  *Value,
     ACPI_GENERIC_ADDRESS    *Reg);
 
 ACPI_STATUS
 AcpiHwWrite (
-    UINT32                  Value,
+    UINT64                  Value,
     ACPI_GENERIC_ADDRESS    *Reg);
 
 ACPI_BIT_REGISTER_INFO *
diff --git a/src/acpica/source/include/acinterp.h b/src/acpica/source/include/acinterp.h
index dd98f01c..d68058cc 100644
--- a/src/acpica/source/include/acinterp.h
+++ b/src/acpica/source/include/acinterp.h
@@ -214,7 +214,7 @@  ACPI_STATUS
 AcpiExConvertToInteger (
     ACPI_OPERAND_OBJECT     *ObjDesc,
     ACPI_OPERAND_OBJECT     **ResultDesc,
-    UINT32                  Flags);
+    UINT32                  ImplicitConversion);
 
 ACPI_STATUS
 AcpiExConvertToBuffer (
@@ -683,9 +683,6 @@  AcpiExStoreObjectToNode (
     ACPI_WALK_STATE         *WalkState,
     UINT8                   ImplicitConversion);
 
-#define ACPI_IMPLICIT_CONVERSION        TRUE
-#define ACPI_NO_IMPLICIT_CONVERSION     FALSE
-
 
 /*
  * exstoren - resolve/store object
diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h
index 7a24391d..7d6c18d6 100644
--- a/src/acpica/source/include/acpixf.h
+++ b/src/acpica/source/include/acpixf.h
@@ -154,7 +154,7 @@ 
 
 /* Current ACPICA subsystem version in YYYYMMDD format */
 
-#define ACPI_CA_VERSION                 0x20170728
+#define ACPI_CA_VERSION                 0x20170831
 
 #include "acconfig.h"
 #include "actypes.h"
diff --git a/src/acpica/source/include/actbl1.h b/src/acpica/source/include/actbl1.h
index da6b561a..537c33e7 100644
--- a/src/acpica/source/include/actbl1.h
+++ b/src/acpica/source/include/actbl1.h
@@ -179,6 +179,7 @@ 
 #define ACPI_SIG_HEST           "HEST"      /* Hardware Error Source Table */
 #define ACPI_SIG_MADT           "APIC"      /* Multiple APIC Description Table */
 #define ACPI_SIG_MSCT           "MSCT"      /* Maximum System Characteristics Table */
+#define ACPI_SIG_PDTT           "PDTT"      /* Processor Debug Trigger Table */
 #define ACPI_SIG_PPTT           "PPTT"      /* Processor Properties Topology Table */
 #define ACPI_SIG_SBST           "SBST"      /* Smart Battery Specification Table */
 #define ACPI_SIG_SLIT           "SLIT"      /* System Locality Distance Information Table */
@@ -1600,6 +1601,42 @@  typedef struct acpi_nfit_flush_address
 } ACPI_NFIT_FLUSH_ADDRESS;
 
 
+/*******************************************************************************
+ *
+ * PDTT - Processor Debug Trigger Table (ACPI 6.2)
+ *        Version 0
+ *
+ ******************************************************************************/
+
+typedef struct acpi_table_pdtt
+{
+    ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
+    UINT8                   TriggerCount;
+    UINT8                   Reserved[3];
+    UINT32                  ArrayOffset;
+
+} ACPI_TABLE_PDTT;
+
+
+/*
+ * PDTT Communication Channel Identifier Structure.
+ * The number of these structures is defined by TriggerCount above,
+ * starting at ArrayOffset.
+ */
+typedef struct acpi_pdtt_channel
+{
+    UINT16                  SubChannelId;
+
+} ACPI_PDTT_CHANNEL;
+
+
+/* Mask and Flags for above */
+
+#define ACPI_PDTT_SUBCHANNEL_ID_MASK        0x00FF
+#define ACPI_PDTT_RUNTIME_TRIGGER           (1<<8)
+#define ACPI_PPTT_WAIT_COMPLETION           (1<<9)
+
+
 /*******************************************************************************
  *
  * PPTT - Processor Properties Topology Table (ACPI 6.2)
@@ -1626,7 +1663,8 @@  enum AcpiPpttType
 
 /* 0: Processor Hierarchy Node Structure */
 
-typedef struct acpi_pptt_processor {
+typedef struct acpi_pptt_processor
+{
     ACPI_SUBTABLE_HEADER    Header;
     UINT16                  Reserved;
     UINT32                  Flags;
@@ -1644,7 +1682,8 @@  typedef struct acpi_pptt_processor {
 
 /* 1: Cache Type Structure */
 
-typedef struct acpi_pptt_cache {
+typedef struct acpi_pptt_cache
+{
     ACPI_SUBTABLE_HEADER    Header;
     UINT16                  Reserved;
     UINT32                  Flags;
@@ -1676,7 +1715,8 @@  typedef struct acpi_pptt_cache {
 
 /* 2: ID Structure */
 
-typedef struct acpi_pptt_id {
+typedef struct acpi_pptt_id
+{
     ACPI_SUBTABLE_HEADER    Header;
     UINT16                  Reserved;
     UINT32                  VendorId;
diff --git a/src/acpica/source/include/actbl2.h b/src/acpica/source/include/actbl2.h
index 18cfdd46..951d6553 100644
--- a/src/acpica/source/include/actbl2.h
+++ b/src/acpica/source/include/actbl2.h
@@ -1030,6 +1030,7 @@  typedef struct acpi_iort_smmu_gsi
     UINT32                  NSgIrptFlags;
     UINT32                  NSgCfgIrpt;
     UINT32                  NSgCfgIrptFlags;
+
 } ACPI_IORT_SMMU_GSI;
 
 
diff --git a/src/acpica/source/include/acutils.h b/src/acpica/source/include/acutils.h
index bca4a94c..a3f0150b 100644
--- a/src/acpica/source/include/acutils.h
+++ b/src/acpica/source/include/acutils.h
@@ -250,6 +250,10 @@  extern const char                       *AcpiGbl_PtypDecode[];
 #define ACPI_MSG_SUFFIX \
     AcpiOsPrintf (" (%8.8X/%s-%u)\n", ACPI_CA_VERSION, ModuleName, LineNumber)
 
+/* Flags to indicate implicit or explicit string-to-integer conversion */
+
+#define ACPI_IMPLICIT_CONVERSION        TRUE
+#define ACPI_NO_IMPLICIT_CONVERSION     FALSE
 
 /* Types for Resource descriptor entries */
 
@@ -330,19 +334,57 @@  AcpiUtStricmp (
     char                    *String1,
     char                    *String2);
 
+
+/*
+ * utstrsuppt - string-to-integer conversion support functions
+ */
 ACPI_STATUS
-AcpiUtStrtoul64 (
+AcpiUtConvertOctalString (
     char                    *String,
-    UINT32                  Flags,
-    UINT64                  *RetInteger);
+    UINT64                  *ReturnValue);
+
+ACPI_STATUS
+AcpiUtConvertDecimalString (
+    char                    *String,
+    UINT64                  *ReturnValuePtr);
+
+ACPI_STATUS
+AcpiUtConvertHexString (
+    char                    *String,
+    UINT64                  *ReturnValuePtr);
+
+char
+AcpiUtRemoveWhitespace (
+    char                    **String);
+
+char
+AcpiUtRemoveLeadingZeros (
+    char                    **String);
+
+BOOLEAN
+AcpiUtDetectHexPrefix (
+    char                    **String);
+
+BOOLEAN
+AcpiUtDetectOctalPrefix (
+    char                    **String);
+
 
 /*
- * Values for Flags above
- * Note: LIMIT values correspond to AcpiGbl_IntegerByteWidth values (4/8)
+ * utstrtoul64 - string-to-integer conversion functions
  */
-#define ACPI_STRTOUL_32BIT          0x04    /* 4 bytes */
-#define ACPI_STRTOUL_64BIT          0x08    /* 8 bytes */
-#define ACPI_STRTOUL_BASE16         0x10    /* Default: Base10/16 */
+ACPI_STATUS
+AcpiUtStrtoul64 (
+    char                    *String,
+    UINT64                  *RetInteger);
+
+UINT64
+AcpiUtExplicitStrtoul64 (
+    char                    *String);
+
+UINT64
+AcpiUtImplicitStrtoul64 (
+    char                    *String);
 
 
 /*
diff --git a/src/acpica/source/tools/acpiexec/aeinitfile.c b/src/acpica/source/tools/acpiexec/aeinitfile.c
index 393e5387..72ccc0f8 100644
--- a/src/acpica/source/tools/acpiexec/aeinitfile.c
+++ b/src/acpica/source/tools/acpiexec/aeinitfile.c
@@ -311,8 +311,7 @@  AeDoOneOverride (
 
     /* Extract the 64-bit integer */
 
-    Status = AcpiUtStrtoul64 (ValueString,
-        (ACPI_STRTOUL_BASE16 | ACPI_STRTOUL_64BIT), &Value);
+    Status = AcpiUtStrtoul64 (ValueString, &Value);
     if (ACPI_FAILURE (Status))
     {
         AcpiOsPrintf ("%s %s\n", ValueString,