aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJung-uk Kim <jkim@FreeBSD.org>2017-08-31 17:21:06 +0000
committerJung-uk Kim <jkim@FreeBSD.org>2017-08-31 17:21:06 +0000
commit0810e26699e1b40b9384eca2137be6155de0a5ba (patch)
tree2f9f57dbc41ae321c10f66c7d7985e328edbdec8
parent834d4c5613e9c57c0b9fba46fa717fd7fb9d5891 (diff)
downloadsrc-vendor/acpica/20170831.tar.gz
src-vendor/acpica/20170831.zip
Import ACPICA 20170831.vendor/acpica/20170831
-rw-r--r--changes.txt49
-rw-r--r--generate/unix/acpidump/Makefile1
-rw-r--r--generate/unix/acpiexamples/Makefile1
-rw-r--r--generate/unix/acpiexec/Makefile1
-rw-r--r--generate/unix/iasl/Makefile1
-rw-r--r--source/common/dmtbinfo.c2
-rw-r--r--source/compiler/aslcompiler.h5
-rw-r--r--source/compiler/aslcompiler.l4
-rw-r--r--source/compiler/asldebug.c87
-rw-r--r--source/compiler/aslerror.c20
-rw-r--r--source/compiler/aslhelp.c2
-rw-r--r--source/compiler/aslmain.c8
-rw-r--r--source/compiler/aslmessages.c5
-rw-r--r--source/compiler/aslmessages.h1
-rw-r--r--source/compiler/aslresource.c8
-rw-r--r--source/compiler/aslrules.y3
-rw-r--r--source/compiler/asltree.c33
-rw-r--r--source/compiler/aslutils.c17
-rw-r--r--source/compiler/dtcompile.c2
-rw-r--r--source/compiler/dtcompiler.h4
-rw-r--r--source/compiler/dtfield.c8
-rw-r--r--source/compiler/dtparser.y17
-rw-r--r--source/compiler/dtutils.c32
-rw-r--r--source/compiler/prparser.y4
-rw-r--r--source/components/debugger/dbconvert.c4
-rw-r--r--source/components/disassembler/dmresrc.c14
-rw-r--r--source/components/dispatcher/dswexec.c2
-rw-r--r--source/components/events/evgpe.c6
-rw-r--r--source/components/executer/exconcat.c2
-rw-r--r--source/components/executer/exconvrt.c26
-rw-r--r--source/components/executer/exmisc.c2
-rw-r--r--source/components/executer/exresop.c2
-rw-r--r--source/components/hardware/hwgpe.c4
-rw-r--r--source/components/hardware/hwregs.c74
-rw-r--r--source/components/hardware/hwtimer.c10
-rw-r--r--source/components/hardware/hwxface.c130
-rw-r--r--source/components/namespace/nsconvert.c3
-rw-r--r--source/components/tables/tbxface.c9
-rw-r--r--source/components/utilities/utstrsuppt.c613
-rw-r--r--source/components/utilities/utstrtoul64.c472
-rw-r--r--source/include/acexcep.h12
-rw-r--r--source/include/achware.h4
-rw-r--r--source/include/acinterp.h5
-rw-r--r--source/include/acpixf.h2
-rw-r--r--source/include/actbl1.h46
-rw-r--r--source/include/actbl2.h1
-rw-r--r--source/include/acutils.h58
-rw-r--r--source/tools/acpidump/apdump.c3
-rw-r--r--source/tools/acpidump/apmain.c3
-rw-r--r--source/tools/acpiexec/aeinitfile.c3
-rw-r--r--source/tools/acpiexec/aemain.c5
-rw-r--r--source/tools/acpiexec/aetables.c8
-rw-r--r--source/tools/acpisrc/acpisrc.h1
-rw-r--r--source/tools/acpisrc/asfile.c67
-rw-r--r--source/tools/acpisrc/asmain.c24
55 files changed, 1427 insertions, 503 deletions
diff --git a/changes.txt b/changes.txt
index d0fe928c1acb..db25f7e5fb91 100644
--- a/changes.txt
+++ b/changes.txt
@@ -1,4 +1,53 @@
----------------------------------------
+31 August 2017. Summary of changes for version 20170831:
+
+
+1) ACPICA kernel-resident subsystem:
+
+Implemented internal support for full 64-bit addresses that appear in all
+Generic Address Structure (GAS) structures. Previously, only the lower 32
+bits were used. Affects the use of GAS structures in the FADT and other
+tables, as well as the GAS structures passed to the AcpiRead and
+AcpiWrite public external interfaces that are used by drivers. Lv Zheng.
+
+Added header support for the PDTT ACPI table (Processor Debug Trigger
+Table). Full support in the iASL Data Table Compiler and disassembler is
+forthcoming.
+
+
+2) iASL Compiler/Disassembler and Tools:
+
+iASL/Disassembler: Fixed a problem with the PPTT ACPI table (Processor
+Properties Topology Table) where a flag bit was specified in the wrong
+bit position ("Line Size Valid", bit 6).
+
+iASL: Implemented support for Octal integer constants as defined by the
+ASL language grammar, per the ACPI specification. Any integer constant
+that starts with a zero is an octal constant. For example,
+ Store (037777, Local0) /* Octal constant */
+ Store (0x3FFF, Local0) /* Hex equivalent */
+ Store (16383, Local0) /* Decimal equivalent */
+
+iASL: Improved overflow detection for 64-bit string conversions during
+compilation of integer constants. "Overflow" in this case means a string
+that represents an integer that is too large to fit into a 64-bit value.
+Any 64-bit constants within a 32-bit DSDT or SSDT are still truncated to
+the low-order 32 bits with a warning, as previously implemented. Several
+new exceptions are defined that indicate a 64-bit overflow, as well as
+the base (radix) that was used during the attempted conversion. Examples:
+ Local0 = 0xAAAABBBBCCCCDDDDEEEEFFFF // AE_HEX_OVERFLOW
+ Local0 = 01111222233334444555566667777 // AE_OCTAL_OVERFLOW
+ Local0 = 11112222333344445555666677778888 // AE_DECIMAL_OVERFLOW
+
+iASL: Added a warning for the case where a ResourceTemplate is declared
+with no ResourceDescriptor entries (coded as "ResourceTemplate(){}"). In
+this case, the resulting template is created with a single END_TAG
+descriptor, which is essentially useless.
+
+iASL: Expanded the -vw option (ignore specific warnings/remarks) to
+include compilation error codes as well.
+
+----------------------------------------
28 July 2017. Summary of changes for version 20170728:
diff --git a/generate/unix/acpidump/Makefile b/generate/unix/acpidump/Makefile
index 7e3723fea920..884708b8aa26 100644
--- a/generate/unix/acpidump/Makefile
+++ b/generate/unix/acpidump/Makefile
@@ -47,6 +47,7 @@ OBJECTS = \
$(OBJDIR)/utmath.o\
$(OBJDIR)/utnonansi.o\
$(OBJDIR)/utstring.o\
+ $(OBJDIR)/utstrsuppt.o\
$(OBJDIR)/utstrtoul64.o\
$(OBJDIR)/utxferror.o
diff --git a/generate/unix/acpiexamples/Makefile b/generate/unix/acpiexamples/Makefile
index 6aa2ba94e692..1689de1bd64e 100644
--- a/generate/unix/acpiexamples/Makefile
+++ b/generate/unix/acpiexamples/Makefile
@@ -157,6 +157,7 @@ OBJECTS = \
$(OBJDIR)/utresrc.o\
$(OBJDIR)/utstate.o\
$(OBJDIR)/utstring.o\
+ $(OBJDIR)/utstrsuppt.o\
$(OBJDIR)/utstrtoul64.o\
$(OBJDIR)/utxface.o\
$(OBJDIR)/utxferror.o\
diff --git a/generate/unix/acpiexec/Makefile b/generate/unix/acpiexec/Makefile
index fcb638b40ad3..681442c375e7 100644
--- a/generate/unix/acpiexec/Makefile
+++ b/generate/unix/acpiexec/Makefile
@@ -230,6 +230,7 @@ OBJECTS = \
$(OBJDIR)/utresrc.o\
$(OBJDIR)/utstate.o\
$(OBJDIR)/utstring.o\
+ $(OBJDIR)/utstrsuppt.o\
$(OBJDIR)/utstrtoul64.o\
$(OBJDIR)/uttrack.o\
$(OBJDIR)/utuuid.o\
diff --git a/generate/unix/iasl/Makefile b/generate/unix/iasl/Makefile
index b3025724cc95..02390ea1c943 100644
--- a/generate/unix/iasl/Makefile
+++ b/generate/unix/iasl/Makefile
@@ -231,6 +231,7 @@ OBJECTS = \
$(OBJDIR)/utresrc.o\
$(OBJDIR)/utstate.o\
$(OBJDIR)/utstrtoul64.o\
+ $(OBJDIR)/utstrsuppt.o\
$(OBJDIR)/utstring.o\
$(OBJDIR)/utuuid.o\
$(OBJDIR)/utxface.o\
diff --git a/source/common/dmtbinfo.c b/source/common/dmtbinfo.c
index 4b902b9647fb..5180b4db0741 100644
--- a/source/common/dmtbinfo.c
+++ b/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/source/compiler/aslcompiler.h b/source/compiler/aslcompiler.h
index fdf4dbf7de52..3b6a9c1dc1c2 100644
--- a/source/compiler/aslcompiler.h
+++ b/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/source/compiler/aslcompiler.l b/source/compiler/aslcompiler.l
index b49233be7f14..5fcfc1886770 100644
--- a/source/compiler/aslcompiler.l
+++ b/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/source/compiler/asldebug.c b/source/compiler/asldebug.c
index b0b386408498..684e222485bf 100644
--- a/source/compiler/asldebug.c
+++ b/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));
@@ -303,6 +308,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
*
* PARAMETERS: Op - Current parse op
diff --git a/source/compiler/aslerror.c b/source/compiler/aslerror.c
index ec91ca3e7d06..56b5cabb9476 100644
--- a/source/compiler/aslerror.c
+++ b/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/source/compiler/aslhelp.c b/source/compiler/aslhelp.c
index 18eab858c213..e1266dc864ef 100644
--- a/source/compiler/aslhelp.c
+++ b/source/compiler/aslhelp.c
@@ -204,7 +204,7 @@ Usage (
ACPI_OPTION ("-ve", "Report only errors (ignore warnings and remarks)");
ACPI_OPTION ("-vi", "Less verbose errors and warnings for use with IDEs");
ACPI_OPTION ("-vr", "Disable remarks");
- ACPI_OPTION ("-vw <messageid>", "Disable specific warning or remark");
+ ACPI_OPTION ("-vw <messageid>", "Ignore specific error, warning or remark");
ACPI_OPTION ("-vx <messageid>", "Expect a specific warning, remark, or error");
ACPI_OPTION ("-w <1|2|3>", "Set warning reporting level");
ACPI_OPTION ("-we", "Report warnings as errors");
diff --git a/source/compiler/aslmain.c b/source/compiler/aslmain.c
index 10251fb2a80f..e4ac4229eb8f 100644
--- a/source/compiler/aslmain.c
+++ b/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/source/compiler/aslmessages.c b/source/compiler/aslmessages.c
index b87d54991f7b..159f9d23f859 100644
--- a/source/compiler/aslmessages.c
+++ b/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/source/compiler/aslmessages.h b/source/compiler/aslmessages.h
index 68216e5c0756..d69c05a176c6 100644
--- a/source/compiler/aslmessages.h
+++ b/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/source/compiler/aslresource.c b/source/compiler/aslresource.c
index eb0c22a1b692..b052c1ed8bbc 100644
--- a/source/compiler/aslresource.c
+++ b/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/source/compiler/aslrules.y b/source/compiler/aslrules.y
index f26ea874b3ab..3b8e4839892e 100644
--- a/source/compiler/aslrules.y
+++ b/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/source/compiler/asltree.c b/source/compiler/asltree.c
index 8b709df72745..084bc4d59ac9 100644
--- a/source/compiler/asltree.c
+++ b/source/compiler/asltree.c
@@ -378,6 +378,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
*
* PARAMETERS: Op - An existing parse op
diff --git a/source/compiler/aslutils.c b/source/compiler/aslutils.c
index c5ff42c0156c..8b46d38bb532 100644
--- a/source/compiler/aslutils.c
+++ b/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/source/compiler/dtcompile.c b/source/compiler/dtcompile.c
index e74fed517315..5344562433c2 100644
--- a/source/compiler/dtcompile.c
+++ b/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/source/compiler/dtcompiler.h b/source/compiler/dtcompiler.h
index 1e81c5800c5c..90fad8896f8a 100644
--- a/source/compiler/dtcompiler.h
+++ b/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/source/compiler/dtfield.c b/source/compiler/dtfield.c
index 13e8b6388019..b06877a8f84a 100644
--- a/source/compiler/dtfield.c
+++ b/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/source/compiler/dtparser.y b/source/compiler/dtparser.y
index a2943cccec74..d5990fe45fe5 100644
--- a/source/compiler/dtparser.y
+++ b/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/source/compiler/dtutils.c b/source/compiler/dtutils.c
index 6edcf637c3fd..c6c89eaa7d20 100644
--- a/source/compiler/dtutils.c
+++ b/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/source/compiler/prparser.y b/source/compiler/prparser.y
index 2ad79e45964c..d24a5bbee04f 100644
--- a/source/compiler/prparser.y
+++ b/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/source/components/debugger/dbconvert.c b/source/components/debugger/dbconvert.c
index e02ddb40067c..e06bc02673e9 100644
--- a/source/components/debugger/dbconvert.c
+++ b/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/source/components/disassembler/dmresrc.c b/source/components/disassembler/dmresrc.c
index 3c24855f9771..c50c1c42d83c 100644
--- a/source/components/disassembler/dmresrc.c
+++ b/source/components/disassembler/dmresrc.c
@@ -540,6 +540,20 @@ AcpiDmIsResourceTemplate (
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
* a buffer of the exact required length (buffer length will be equal
diff --git a/source/components/dispatcher/dswexec.c b/source/components/dispatcher/dswexec.c
index dfdfeaa03660..bbb9436a666a 100644
--- a/source/components/dispatcher/dswexec.c
+++ b/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/source/components/events/evgpe.c b/source/components/events/evgpe.c
index 13b3e049d0f0..a00dc3786296 100644
--- a/source/components/events/evgpe.c
+++ b/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/source/components/executer/exconcat.c b/source/components/executer/exconcat.c
index e5f077dbd989..67d592cd5495 100644
--- a/source/components/executer/exconcat.c
+++ b/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/source/components/executer/exconvrt.c b/source/components/executer/exconvrt.c
index 8c0ae75c2a6d..8577a45e14ee 100644
--- a/source/components/executer/exconvrt.c
+++ b/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/source/components/executer/exmisc.c b/source/components/executer/exmisc.c
index dfa4421ac773..8e92f7a04f0f 100644
--- a/source/components/executer/exmisc.c
+++ b/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/source/components/executer/exresop.c b/source/components/executer/exresop.c
index 0cd216ceb255..e33608c2f712 100644
--- a/source/components/executer/exresop.c
+++ b/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/source/components/hardware/hwgpe.c b/source/components/hardware/hwgpe.c
index 56ccb78d243b..636639be03e6 100644
--- a/source/components/hardware/hwgpe.c
+++ b/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/source/components/hardware/hwregs.c b/source/components/hardware/hwregs.c
index b5b23831fe9d..cd8e774a97d7 100644
--- a/source/components/hardware/hwregs.c
+++ b/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/source/components/hardware/hwtimer.c b/source/components/hardware/hwtimer.c
index 174769d56348..358164ee8a31 100644
--- a/source/components/hardware/hwtimer.c
+++ b/source/components/hardware/hwtimer.c
@@ -215,6 +215,7 @@ AcpiGetTimer (
UINT32 *Ticks)
{
ACPI_STATUS Status;
+ UINT64 TimerValue;
ACPI_FUNCTION_TRACE (AcpiGetTimer);
@@ -232,7 +233,14 @@ AcpiGetTimer (
return_ACPI_STATUS (AE_SUPPORT);
}
- Status = AcpiHwRead (Ticks, &AcpiGbl_FADT.XPmTimerBlock);
+ Status = AcpiHwRead (&TimerValue, &AcpiGbl_FADT.XPmTimerBlock);
+ if (ACPI_SUCCESS (Status))
+ {
+ /* ACPI PM Timer is defined to be 32 bits (PM_TMR_LEN) */
+
+ *Ticks = (UINT32) TimerValue;
+ }
+
return_ACPI_STATUS (Status);
}
diff --git a/source/components/hardware/hwxface.c b/source/components/hardware/hwxface.c
index 3627a9715cb2..49a19e458cde 100644
--- a/source/components/hardware/hwxface.c
+++ b/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/source/components/namespace/nsconvert.c b/source/components/namespace/nsconvert.c
index daf8f475dd5e..bb825895b47d 100644
--- a/source/components/namespace/nsconvert.c
+++ b/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/source/components/tables/tbxface.c b/source/components/tables/tbxface.c
index d8cb6b18c4a4..6393bdace249 100644
--- a/source/components/tables/tbxface.c
+++ b/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/source/components/utilities/utstrsuppt.c b/source/components/utilities/utstrsuppt.c
new file mode 100644
index 000000000000..9197a57a5fbe
--- /dev/null
+++ b/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/source/components/utilities/utstrtoul64.c b/source/components/utilities/utstrtoul64.c
index d91e9084264c..34cef95b50af 100644
--- a/source/components/utilities/utstrtoul64.c
+++ b/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/source/include/acexcep.h b/source/include/acexcep.h
index 1405e41161fe..d808f275144f 100644
--- a/source/include/acexcep.h
+++ b/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/source/include/achware.h b/source/include/achware.h
index f33be8c4aad0..c3bf8f1523f9 100644
--- a/source/include/achware.h
+++ b/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/source/include/acinterp.h b/source/include/acinterp.h
index dd98f01cb9a6..d68058cced55 100644
--- a/source/include/acinterp.h
+++ b/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/source/include/acpixf.h b/source/include/acpixf.h
index 7a24391df2fb..7d6c18d69811 100644
--- a/source/include/acpixf.h
+++ b/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/source/include/actbl1.h b/source/include/actbl1.h
index da6b561a0a1a..537c33e7c3b9 100644
--- a/source/include/actbl1.h
+++ b/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 */
@@ -1602,6 +1603,42 @@ typedef struct 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)
* Version 1
*
@@ -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/source/include/actbl2.h b/source/include/actbl2.h
index 18cfdd465754..951d65531a33 100644
--- a/source/include/actbl2.h
+++ b/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/source/include/acutils.h b/source/include/acutils.h
index bca4a94cd74e..a3f0150b4660 100644
--- a/source/include/acutils.h
+++ b/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/source/tools/acpidump/apdump.c b/source/tools/acpidump/apdump.c
index abc5c4f784f0..cd83dcc4c591 100644
--- a/source/tools/acpidump/apdump.c
+++ b/source/tools/acpidump/apdump.c
@@ -434,8 +434,7 @@ ApDumpTableByAddress (
/* Convert argument to an integer physical address */
- Status = AcpiUtStrtoul64 (AsciiAddress, ACPI_STRTOUL_64BIT,
- &LongAddress);
+ Status = AcpiUtStrtoul64 (AsciiAddress, &LongAddress);
if (ACPI_FAILURE (Status))
{
fprintf (stderr, "%s: Could not convert to a physical address\n",
diff --git a/source/tools/acpidump/apmain.c b/source/tools/acpidump/apmain.c
index 6491fe9e51a2..99962797d702 100644
--- a/source/tools/acpidump/apmain.c
+++ b/source/tools/acpidump/apmain.c
@@ -343,8 +343,7 @@ ApDoOptions (
case 'r': /* Dump tables from specified RSDP */
- Status = AcpiUtStrtoul64 (AcpiGbl_Optarg, ACPI_STRTOUL_64BIT,
- &Gbl_RsdpBase);
+ Status = AcpiUtStrtoul64 (AcpiGbl_Optarg, &Gbl_RsdpBase);
if (ACPI_FAILURE (Status))
{
fprintf (stderr, "%s: Could not convert to a physical address\n",
diff --git a/source/tools/acpiexec/aeinitfile.c b/source/tools/acpiexec/aeinitfile.c
index 393e53877563..72ccc0f8242c 100644
--- a/source/tools/acpiexec/aeinitfile.c
+++ b/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,
diff --git a/source/tools/acpiexec/aemain.c b/source/tools/acpiexec/aemain.c
index 3ea512100da4..323e2bfa1700 100644
--- a/source/tools/acpiexec/aemain.c
+++ b/source/tools/acpiexec/aemain.c
@@ -598,11 +598,6 @@ main (
goto ErrorExit;
}
- /* ACPICA runtime configuration */
-
- AcpiGbl_MaxLoopIterations = 400;
-
-
/* Initialize the AML debugger */
Status = AcpiInitializeDebugger ();
diff --git a/source/tools/acpiexec/aetables.c b/source/tools/acpiexec/aetables.c
index 671b2a1d058b..8d2ea56eb372 100644
--- a/source/tools/acpiexec/aetables.c
+++ b/source/tools/acpiexec/aetables.c
@@ -598,6 +598,14 @@ AeInstallTables (
Status = AcpiInitializeTables (NULL, ACPI_MAX_INIT_TABLES, TRUE);
ACPI_CHECK_OK (AcpiInitializeTables, Status);
+ /*
+ * The following code is prepared to test the deferred table
+ * verification mechanism. When AcpiGbl_EnableTableValidation is set
+ * to FALSE by default, AcpiReallocateRootTable() sets it back to TRUE
+ * and triggers the deferred table verification mechanism accordingly.
+ */
+ (void) AcpiReallocateRootTable ();
+
if (AcpiGbl_LoadTestTables)
{
/* Test multiple table/UEFI support. First, get the headers */
diff --git a/source/tools/acpisrc/acpisrc.h b/source/tools/acpisrc/acpisrc.h
index 32d48b4c4b58..645d3d06c24e 100644
--- a/source/tools/acpisrc/acpisrc.h
+++ b/source/tools/acpisrc/acpisrc.h
@@ -230,6 +230,7 @@ extern BOOLEAN Gbl_IgnoreLoneLineFeeds;
extern BOOLEAN Gbl_HasLoneLineFeeds;
extern BOOLEAN Gbl_Cleanup;
extern BOOLEAN Gbl_IgnoreTranslationEscapes;
+extern BOOLEAN Gbl_CheckAscii;
extern void *Gbl_StructDefs;
#define PARAM_LIST(pl) pl
diff --git a/source/tools/acpisrc/asfile.c b/source/tools/acpisrc/asfile.c
index 05660b001527..b5308d38277a 100644
--- a/source/tools/acpisrc/asfile.c
+++ b/source/tools/acpisrc/asfile.c
@@ -167,6 +167,11 @@ AsDetectLoneLineFeeds (
char *Filename,
char *Buffer);
+static BOOLEAN
+AsCheckForNonPrintableChars (
+ char *FileBuffer,
+ UINT32 FileSize);
+
static ACPI_INLINE int
AsMaxInt (int a, int b)
{
@@ -636,6 +641,45 @@ AsConvertFile (
}
}
+/*******************************************************************************
+ *
+ * FUNCTION: AsCheckForNonPrintableChars
+ *
+ * PARAMETERS: FileBuffer - Buffer with contents of entire file
+ * FileSize - Size of the file and buffer
+ *
+ * RETURN: TRUE if there are no non-printable characters
+ *
+ * DESCRIPTION: Scan a file for any non-printable ASCII bytes.
+ *
+ ******************************************************************************/
+
+static BOOLEAN
+AsCheckForNonPrintableChars (
+ char *FileBuffer,
+ UINT32 FileSize)
+{
+ BOOLEAN Found = TRUE;
+ UINT8 Byte;
+ UINT32 i;
+
+
+ /* Scan entire file for any non-printable characters */
+
+ for (i = 0; i < FileSize; i++)
+ {
+ Byte = FileBuffer[i];
+ if (!isprint (Byte) && !isspace (Byte))
+ {
+ printf ( "Non-printable character (0x%2.2X) "
+ "at file offset: %8u (0x%X)\n", Byte, i, i);
+ Found = FALSE;
+ }
+ }
+
+ return (Found);
+}
+
/******************************************************************************
*
@@ -680,13 +724,20 @@ AsProcessOneFile (
}
strcat (Pathname, Filename);
-
if (AsGetFile (Pathname, &Gbl_FileBuffer, &Gbl_FileSize))
{
Status = -1;
goto Exit1;
}
+ /* Exit now if simply checking the file for printable ascii chars */
+
+ if (Gbl_CheckAscii)
+ {
+ Status = 0;
+ goto Exit2;
+ }
+
Gbl_HeaderSize = 0;
if (strstr (Filename, ".asl"))
{
@@ -873,6 +924,19 @@ AsGetFile (
Buffer [Size] = 0; /* Null terminate the buffer */
fclose (File);
+ /* This option checks the entire file for non-printable chars */
+
+ if (Gbl_CheckAscii)
+ {
+ if (AsCheckForNonPrintableChars (Buffer, Size))
+ {
+ printf ("File contains only printable ASCII characters\n");
+ }
+
+ free (Buffer);
+ return (0);
+ }
+
/* Check for unix contamination */
Gbl_HasLoneLineFeeds = AsDetectLoneLineFeeds (Filename, Buffer);
@@ -891,7 +955,6 @@ ErrorFree:
free (Buffer);
ErrorExit:
-
fclose (File);
return (-1);
}
diff --git a/source/tools/acpisrc/asmain.c b/source/tools/acpisrc/asmain.c
index 23816c387f88..a14af868a451 100644
--- a/source/tools/acpisrc/asmain.c
+++ b/source/tools/acpisrc/asmain.c
@@ -188,6 +188,7 @@ struct stat Gbl_StatBuf;
char *Gbl_FileBuffer;
UINT32 Gbl_FileSize;
UINT32 Gbl_FileType;
+BOOLEAN Gbl_CheckAscii = FALSE;
BOOLEAN Gbl_VerboseMode = FALSE;
BOOLEAN Gbl_QuietMode = FALSE;
BOOLEAN Gbl_BatchMode = FALSE;
@@ -201,7 +202,7 @@ BOOLEAN Gbl_Cleanup = FALSE;
BOOLEAN Gbl_IgnoreTranslationEscapes = FALSE;
#define AS_UTILITY_NAME "ACPI Source Code Conversion Utility"
-#define AS_SUPPORTED_OPTIONS "cdhilqsuv^y"
+#define AS_SUPPORTED_OPTIONS "acdhilqsuv^y"
/******************************************************************************
@@ -361,6 +362,7 @@ AsDisplayUsage (
ACPI_USAGE_HEADER ("acpisrc [-c|l|u] [-dsvy] <SourceDir> <DestinationDir>");
+ ACPI_OPTION ("-a <file>", "Check entire file for non-printable characters");
ACPI_OPTION ("-c", "Generate cleaned version of the source");
ACPI_OPTION ("-h", "Insert dual-license header into all modules");
ACPI_OPTION ("-i", "Cleanup macro indentation");
@@ -505,6 +507,11 @@ main (
Gbl_QuietMode = TRUE;
break;
+ case 'a':
+
+ Gbl_CheckAscii = TRUE;
+ break;
+
default:
AsDisplayUsage ();
@@ -520,6 +527,14 @@ main (
return (-1);
}
+ /* This option checks the entire file for printable ascii chars */
+
+ if (Gbl_CheckAscii)
+ {
+ AsProcessOneFile (NULL, NULL, NULL, 0, SourcePath, FILE_TYPE_SOURCE);
+ return (0);
+ }
+
TargetPath = argv[AcpiGbl_Optind+1];
if (!ConversionTable)
@@ -558,6 +573,13 @@ main (
}
else
{
+ if (Gbl_CheckAscii)
+ {
+ AsProcessOneFile (NULL, NULL, NULL, 0,
+ SourcePath, FILE_TYPE_SOURCE);
+ return (0);
+ }
+
/* Process a single file */
/* Differentiate between source and header files */