ACK: [PATCH] ACPICA: Update to version 20170831
ivanhu
ivan.hu at canonical.com
Wed Sep 6 08:11:25 UTC 2017
On 09/01/2017 01:51 AM, Colin King wrote:
> From: Colin Ian King <colin.king at canonical.com>
>
> Changes in this release of ACPICA are detailed at the following
> link on the ACPICA developer mailing list:
>
> https://lists.acpica.org/pipermail/devel/2017-August/001436.html
>
> Signed-off-by: Colin Ian King <colin.king at 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 at canonical.com>
More information about the fwts-devel
mailing list