summaryrefslogtreecommitdiff
path: root/source/components/utilities
diff options
context:
space:
mode:
Diffstat (limited to 'source/components/utilities')
-rw-r--r--source/components/utilities/utaddress.c9
-rw-r--r--source/components/utilities/uthex.c51
-rw-r--r--source/components/utilities/utnonansi.c432
-rw-r--r--source/components/utilities/utosi.c22
-rw-r--r--source/components/utilities/utstrtoul64.c390
-rw-r--r--source/components/utilities/utxfinit.c2
6 files changed, 458 insertions, 448 deletions
diff --git a/source/components/utilities/utaddress.c b/source/components/utilities/utaddress.c
index 4b36391e2482..2bf313fc74e4 100644
--- a/source/components/utilities/utaddress.c
+++ b/source/components/utilities/utaddress.c
@@ -82,7 +82,6 @@ AcpiUtAddAddressRange (
ACPI_NAMESPACE_NODE *RegionNode)
{
ACPI_ADDRESS_RANGE *RangeInfo;
- ACPI_STATUS Status;
ACPI_FUNCTION_TRACE (UtAddAddressRange);
@@ -106,13 +105,6 @@ AcpiUtAddAddressRange (
RangeInfo->EndAddress = (Address + Length - 1);
RangeInfo->RegionNode = RegionNode;
- Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
- if (ACPI_FAILURE (Status))
- {
- ACPI_FREE (RangeInfo);
- return_ACPI_STATUS (Status);
- }
-
RangeInfo->Next = AcpiGbl_AddressRangeList[SpaceId];
AcpiGbl_AddressRangeList[SpaceId] = RangeInfo;
@@ -122,7 +114,6 @@ AcpiUtAddAddressRange (
ACPI_FORMAT_UINT64 (Address),
ACPI_FORMAT_UINT64 (RangeInfo->EndAddress)));
- (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
return_ACPI_STATUS (AE_OK);
}
diff --git a/source/components/utilities/uthex.c b/source/components/utilities/uthex.c
index b93013b200fc..94f6a7f97871 100644
--- a/source/components/utilities/uthex.c
+++ b/source/components/utilities/uthex.c
@@ -82,9 +82,46 @@ AcpiUtHexToAsciiChar (
/*******************************************************************************
*
+ * FUNCTION: AcpiUtAsciiToHexByte
+ *
+ * PARAMETERS: TwoAsciiChars - Pointer to two ASCII characters
+ * ReturnByte - Where converted byte is returned
+ *
+ * RETURN: Status and converted hex byte
+ *
+ * DESCRIPTION: Perform ascii-to-hex translation, exactly two ASCII characters
+ * to a single converted byte value.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtAsciiToHexByte (
+ char *TwoAsciiChars,
+ UINT8 *ReturnByte)
+{
+
+ /* Both ASCII characters must be valid hex digits */
+
+ if (!isxdigit ((int) TwoAsciiChars[0]) ||
+ !isxdigit ((int) TwoAsciiChars[1]))
+ {
+ return (AE_BAD_HEX_CONSTANT);
+ }
+
+ *ReturnByte =
+ AcpiUtAsciiCharToHex (TwoAsciiChars[1]) |
+ (AcpiUtAsciiCharToHex (TwoAsciiChars[0]) << 4);
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
* FUNCTION: AcpiUtAsciiCharToHex
*
- * PARAMETERS: HexChar - Hex character in Ascii
+ * PARAMETERS: HexChar - Hex character in Ascii. Must be:
+ * 0-9 or A-F or a-f
*
* RETURN: The binary value of the ascii/hex character
*
@@ -97,15 +134,21 @@ AcpiUtAsciiCharToHex (
int HexChar)
{
- if (HexChar <= 0x39)
+ /* Values 0-9 */
+
+ if (HexChar <= '9')
{
- return ((UINT8) (HexChar - 0x30));
+ return ((UINT8) (HexChar - '0'));
}
- if (HexChar <= 0x46)
+ /* Upper case A-F */
+
+ if (HexChar <= 'F')
{
return ((UINT8) (HexChar - 0x37));
}
+ /* Lower case a-f */
+
return ((UINT8) (HexChar - 0x57));
}
diff --git a/source/components/utilities/utnonansi.c b/source/components/utilities/utnonansi.c
index 70fb33e64c0c..4cddcf190b50 100644
--- a/source/components/utilities/utnonansi.c
+++ b/source/components/utilities/utnonansi.c
@@ -48,10 +48,9 @@
#define _COMPONENT ACPI_UTILITIES
ACPI_MODULE_NAME ("utnonansi")
-
/*
- * Non-ANSI C library functions - strlwr, strupr, stricmp, and a 64-bit
- * version of strtoul.
+ * Non-ANSI C library functions - strlwr, strupr, stricmp, and "safe"
+ * string functions.
*/
/*******************************************************************************
@@ -238,430 +237,3 @@ AcpiUtSafeStrncat (
return (FALSE);
}
#endif
-
-
-/*******************************************************************************
- *
- * FUNCTION: AcpiUtStrtoul64
- *
- * PARAMETERS: String - Null terminated string
- * Base - Radix of the string: 16 or 10 or
- * ACPI_ANY_BASE
- * MaxIntegerByteWidth - Maximum allowable integer,in bytes:
- * 4 or 8 (32 or 64 bits)
- * RetInteger - Where the converted integer is
- * returned
- *
- * RETURN: Status and Converted value
- *
- * DESCRIPTION: Convert a string into an unsigned value. Performs either a
- * 32-bit or 64-bit conversion, depending on the input integer
- * size (often the current mode of the interpreter).
- *
- * NOTES: Negative numbers are not supported, as they are not supported
- * by ACPI.
- *
- * AcpiGbl_IntegerByteWidth 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.
- *
- * Does not support Octal strings, not needed at this time.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-AcpiUtStrtoul64 (
- char *String,
- UINT32 Base,
- UINT32 MaxIntegerByteWidth,
- UINT64 *RetInteger)
-{
- UINT32 ThisDigit = 0;
- UINT64 ReturnValue = 0;
- UINT64 Quotient;
- UINT64 Dividend;
- UINT8 ValidDigits = 0;
- UINT8 SignOf0x = 0;
- UINT8 Term = 0;
-
-
- ACPI_FUNCTION_TRACE_STR (UtStrtoul64, String);
-
-
- switch (Base)
- {
- case ACPI_ANY_BASE:
- case 10:
- case 16:
-
- break;
-
- default:
-
- /* Invalid Base */
-
- return_ACPI_STATUS (AE_BAD_PARAMETER);
- }
-
- if (!String)
- {
- goto ErrorExit;
- }
-
- /* Skip over any white space in the buffer */
-
- while ((*String) && (isspace ((int) *String) || *String == '\t'))
- {
- String++;
- }
-
- if (Base == ACPI_ANY_BASE)
- {
- /*
- * Base equal to ACPI_ANY_BASE means 'Either decimal or hex'.
- * We need to determine if it is decimal or hexadecimal.
- */
- if ((*String == '0') && (tolower ((int) *(String + 1)) == 'x'))
- {
- SignOf0x = 1;
- Base = 16;
-
- /* Skip over the leading '0x' */
- String += 2;
- }
- else
- {
- Base = 10;
- }
- }
-
- /* Any string left? Check that '0x' is not followed by white space. */
-
- if (!(*String) || isspace ((int) *String) || *String == '\t')
- {
- if (Base == ACPI_ANY_BASE)
- {
- goto ErrorExit;
- }
- else
- {
- goto AllDone;
- }
- }
-
- /*
- * Perform a 32-bit or 64-bit conversion, depending upon the input
- * byte width
- */
- Dividend = (MaxIntegerByteWidth <= ACPI_MAX32_BYTE_WIDTH) ?
- ACPI_UINT32_MAX : ACPI_UINT64_MAX;
-
- /* Main loop: convert the string to a 32- or 64-bit integer */
-
- while (*String)
- {
- if (isdigit ((int) *String))
- {
- /* Convert ASCII 0-9 to Decimal value */
-
- ThisDigit = ((UINT8) *String) - '0';
- }
- else if (Base == 10)
- {
- /* Digit is out of range; possible in ToInteger case only */
-
- Term = 1;
- }
- else
- {
- ThisDigit = (UINT8) toupper ((int) *String);
- if (isxdigit ((int) ThisDigit))
- {
- /* Convert ASCII Hex char to value */
-
- ThisDigit = ThisDigit - 'A' + 10;
- }
- else
- {
- Term = 1;
- }
- }
-
- if (Term)
- {
- if (Base == ACPI_ANY_BASE)
- {
- goto ErrorExit;
- }
- else
- {
- break;
- }
- }
- else if ((ValidDigits == 0) && (ThisDigit == 0) && !SignOf0x)
- {
- /* Skip zeros */
- String++;
- continue;
- }
-
- ValidDigits++;
-
- if (SignOf0x && ((ValidDigits > 16) ||
- ((ValidDigits > 8) && (MaxIntegerByteWidth <= ACPI_MAX32_BYTE_WIDTH))))
- {
- /*
- * This is ToInteger operation case.
- * No restrictions for string-to-integer conversion,
- * see ACPI spec.
- */
- goto ErrorExit;
- }
-
- /* Divide the digit into the correct position */
-
- (void) AcpiUtShortDivide (
- (Dividend - (UINT64) ThisDigit), Base, &Quotient, NULL);
-
- if (ReturnValue > Quotient)
- {
- if (Base == ACPI_ANY_BASE)
- {
- goto ErrorExit;
- }
- else
- {
- break;
- }
- }
-
- ReturnValue *= Base;
- ReturnValue += ThisDigit;
- String++;
- }
-
- /* All done, normal exit */
-
-AllDone:
-
- ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Converted value: %8.8X%8.8X\n",
- ACPI_FORMAT_UINT64 (ReturnValue)));
-
- *RetInteger = ReturnValue;
- return_ACPI_STATUS (AE_OK);
-
-
-ErrorExit:
-
- /* Base was set/validated above (10 or 16) */
-
- if (Base == 10)
- {
- return_ACPI_STATUS (AE_BAD_DECIMAL_CONSTANT);
- }
- else
- {
- return_ACPI_STATUS (AE_BAD_HEX_CONSTANT);
- }
-}
-
-
-#ifdef _OBSOLETE_FUNCTIONS
-/* Removed: 01/2016 */
-
-/*******************************************************************************
- *
- * FUNCTION: strtoul64
- *
- * PARAMETERS: String - Null terminated string
- * Terminater - Where a pointer to the terminating byte
- * is returned
- * Base - Radix of the string
- *
- * RETURN: Converted value
- *
- * DESCRIPTION: Convert a string into an unsigned value.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-strtoul64 (
- char *String,
- UINT32 Base,
- UINT64 *RetInteger)
-{
- UINT32 Index;
- UINT32 Sign;
- UINT64 ReturnValue = 0;
- ACPI_STATUS Status = AE_OK;
-
-
- *RetInteger = 0;
-
- switch (Base)
- {
- case 0:
- case 8:
- case 10:
- case 16:
-
- break;
-
- default:
- /*
- * The specified Base parameter is not in the domain of
- * this function:
- */
- return (AE_BAD_PARAMETER);
- }
-
- /* Skip over any white space in the buffer: */
-
- while (isspace ((int) *String) || *String == '\t')
- {
- ++String;
- }
-
- /*
- * The buffer may contain an optional plus or minus sign.
- * If it does, then skip over it but remember what is was:
- */
- if (*String == '-')
- {
- Sign = ACPI_SIGN_NEGATIVE;
- ++String;
- }
- else if (*String == '+')
- {
- ++String;
- Sign = ACPI_SIGN_POSITIVE;
- }
- else
- {
- Sign = ACPI_SIGN_POSITIVE;
- }
-
- /*
- * If the input parameter Base is zero, then we need to
- * determine if it is octal, decimal, or hexadecimal:
- */
- if (Base == 0)
- {
- if (*String == '0')
- {
- if (tolower ((int) *(++String)) == 'x')
- {
- Base = 16;
- ++String;
- }
- else
- {
- Base = 8;
- }
- }
- else
- {
- Base = 10;
- }
- }
-
- /*
- * For octal and hexadecimal bases, skip over the leading
- * 0 or 0x, if they are present.
- */
- if (Base == 8 && *String == '0')
- {
- String++;
- }
-
- if (Base == 16 &&
- *String == '0' &&
- tolower ((int) *(++String)) == 'x')
- {
- String++;
- }
-
- /* Main loop: convert the string to an unsigned long */
-
- while (*String)
- {
- if (isdigit ((int) *String))
- {
- Index = ((UINT8) *String) - '0';
- }
- else
- {
- Index = (UINT8) toupper ((int) *String);
- if (isupper ((int) Index))
- {
- Index = Index - 'A' + 10;
- }
- else
- {
- goto ErrorExit;
- }
- }
-
- if (Index >= Base)
- {
- goto ErrorExit;
- }
-
- /* Check to see if value is out of range: */
-
- if (ReturnValue > ((ACPI_UINT64_MAX - (UINT64) Index) /
- (UINT64) Base))
- {
- goto ErrorExit;
- }
- else
- {
- ReturnValue *= Base;
- ReturnValue += Index;
- }
-
- ++String;
- }
-
-
- /* If a minus sign was present, then "the conversion is negated": */
-
- if (Sign == ACPI_SIGN_NEGATIVE)
- {
- ReturnValue = (ACPI_UINT32_MAX - ReturnValue) + 1;
- }
-
- *RetInteger = ReturnValue;
- return (Status);
-
-
-ErrorExit:
- switch (Base)
- {
- case 8:
-
- Status = AE_BAD_OCTAL_CONSTANT;
- break;
-
- case 10:
-
- Status = AE_BAD_DECIMAL_CONSTANT;
- break;
-
- case 16:
-
- Status = AE_BAD_HEX_CONSTANT;
- break;
-
- default:
-
- /* Base validated above */
-
- break;
- }
-
- return (Status);
-}
-#endif
diff --git a/source/components/utilities/utosi.c b/source/components/utilities/utosi.c
index 674fe364d375..5193af52411b 100644
--- a/source/components/utilities/utosi.c
+++ b/source/components/utilities/utosi.c
@@ -442,11 +442,22 @@ AcpiUtGetInterface (
* PARAMETERS: WalkState - Current walk state
*
* RETURN: Status
+ * Integer: TRUE (0) if input string is matched
+ * FALSE (-1) if string is not matched
*
* DESCRIPTION: Implementation of the _OSI predefined control method. When
* an invocation of _OSI is encountered in the system AML,
* control is transferred to this function.
*
+ * (August 2016)
+ * Note: _OSI is now defined to return "Ones" to indicate a match, for
+ * compatibility with other ACPI implementations. On a 32-bit DSDT, Ones
+ * is 0xFFFFFFFF. On a 64-bit DSDT, Ones is 0xFFFFFFFFFFFFFFFF
+ * (ACPI_UINT64_MAX).
+ *
+ * This function always returns ACPI_UINT64_MAX for TRUE, and later code
+ * will truncate this to 32 bits if necessary.
+ *
******************************************************************************/
ACPI_STATUS
@@ -458,7 +469,7 @@ AcpiUtOsiImplementation (
ACPI_INTERFACE_INFO *InterfaceInfo;
ACPI_INTERFACE_HANDLER InterfaceHandler;
ACPI_STATUS Status;
- UINT32 ReturnValue;
+ UINT64 ReturnValue;
ACPI_FUNCTION_TRACE (UtOsiImplementation);
@@ -507,7 +518,7 @@ AcpiUtOsiImplementation (
AcpiGbl_OsiData = InterfaceInfo->Value;
}
- ReturnValue = ACPI_UINT32_MAX;
+ ReturnValue = ACPI_UINT64_MAX;
}
AcpiOsReleaseMutex (AcpiGbl_OsiMutex);
@@ -520,8 +531,11 @@ AcpiUtOsiImplementation (
InterfaceHandler = AcpiGbl_InterfaceHandler;
if (InterfaceHandler)
{
- ReturnValue = InterfaceHandler (
- StringDesc->String.Pointer, ReturnValue);
+ if (InterfaceHandler (
+ StringDesc->String.Pointer, (UINT32) ReturnValue))
+ {
+ ReturnValue = ACPI_UINT64_MAX;
+ }
}
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO,
diff --git a/source/components/utilities/utstrtoul64.c b/source/components/utilities/utstrtoul64.c
new file mode 100644
index 000000000000..96cf112a4796
--- /dev/null
+++ b/source/components/utilities/utstrtoul64.c
@@ -0,0 +1,390 @@
+/*******************************************************************************
+ *
+ * Module Name: utstrtoul64 - string to 64-bit integer support
+ *
+ ******************************************************************************/
+
+/*
+ * Copyright (C) 2000 - 2016, Intel Corp.
+ * All rights reserved.
+ *
+ * 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.
+ *
+ * Alternatively, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") version 2 as published by the Free
+ * Software Foundation.
+ *
+ * NO WARRANTY
+ * 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 MERCHANTIBILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 DAMAGES.
+ */
+
+#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)
+ *
+ *
+ * Explicit data type conversion: ToInteger() with string operand
+ * ---------------------------------------------------------------
+ *
+ * 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.
+ *
+ * 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)
+ *
+ * 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)
+ *
+ * 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)
+ *
+ ******************************************************************************/
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtStrtoul64
+ *
+ * PARAMETERS: String - Null terminated input string
+ * Flags - Conversion info, see below
+ * ReturnValue - Where the converted integer is
+ * returned
+ *
+ * RETURN: Status and Converted value
+ *
+ * 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).
+ *
+ * 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).
+ *
+ * NOTES:
+ * Negative numbers are not supported, as they are not supported by ACPI.
+ *
+ * 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.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtStrtoul64 (
+ char *String,
+ UINT32 Flags,
+ UINT64 *ReturnValue)
+{
+ ACPI_STATUS Status = AE_OK;
+ UINT32 Base;
+
+
+ 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 */
+
+ 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)
+ {
+ 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.
+ */
+ if ((*String == ACPI_ASCII_ZERO) &&
+ (tolower ((int) *(String + 1)) == 'x'))
+ {
+ 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)
+ {
+ Base = 16;
+ }
+
+ /* 3) Default fallback is to Base 10 */
+
+ else
+ {
+ Base = 10;
+ }
+
+ /* Skip all leading zeros */
+
+ while (*String == ACPI_ASCII_ZERO)
+ {
+ String++;
+ if (*String == 0)
+ {
+ return_ACPI_STATUS (AE_OK); /* Return value 0 */
+ }
+ }
+
+ /* Perform the base 16 or 10 conversion */
+
+ if (Base == 16)
+ {
+ *ReturnValue = AcpiUtStrtoulBase16 (String, Flags);
+ }
+ else
+ {
+ *ReturnValue = AcpiUtStrtoulBase10 (String, Flags);
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtStrtoulBase10
+ *
+ * PARAMETERS: String - Null terminated input string
+ * Flags - Conversion info
+ *
+ * RETURN: 64-bit converted integer
+ *
+ * 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.
+ *
+ ******************************************************************************/
+
+static UINT64
+AcpiUtStrtoulBase10 (
+ char *String,
+ UINT32 Flags)
+{
+ int AsciiDigit;
+ UINT64 NextValue;
+ UINT64 ReturnValue = 0;
+
+
+ /* Main loop: convert each ASCII byte in the input string */
+
+ while (*String)
+ {
+ AsciiDigit = *String;
+ if (!isdigit (AsciiDigit))
+ {
+ /* Not ASCII 0-9, terminate */
+
+ goto Exit;
+ }
+
+ /* Convert and insert (add) the decimal digit */
+
+ NextValue =
+ (ReturnValue * 10) + (AsciiDigit - ACPI_ASCII_ZERO);
+
+ /* Check for overflow (32 or 64 bit) - return current converted value */
+
+ if (((Flags & ACPI_STRTOUL_32BIT) && (NextValue > ACPI_UINT32_MAX)) ||
+ (NextValue < ReturnValue)) /* 64-bit overflow case */
+ {
+ goto Exit;
+ }
+
+ ReturnValue = NextValue;
+ String++;
+ }
+
+Exit:
+ return (ReturnValue);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtStrtoulBase16
+ *
+ * PARAMETERS: String - Null terminated input string
+ * Flags - conversion info
+ *
+ * RETURN: 64-bit converted integer
+ *
+ * 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.
+ *
+ ******************************************************************************/
+
+static UINT64
+AcpiUtStrtoulBase16 (
+ char *String,
+ UINT32 Flags)
+{
+ int AsciiDigit;
+ UINT32 ValidDigits = 1;
+ UINT64 ReturnValue = 0;
+
+
+ /* Main loop: convert each ASCII byte in the input string */
+
+ while (*String)
+ {
+ /* Check for overflow (32 or 64 bit) - return current converted value */
+
+ 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;
+ }
+
+ /* Convert and insert the hex digit */
+
+ ReturnValue =
+ (ReturnValue << 4) | AcpiUtAsciiCharToHex (AsciiDigit);
+
+ String++;
+ ValidDigits++;
+ }
+
+Exit:
+ return (ReturnValue);
+}
diff --git a/source/components/utilities/utxfinit.c b/source/components/utilities/utxfinit.c
index 7d7758815869..6b79e08f72ce 100644
--- a/source/components/utilities/utxfinit.c
+++ b/source/components/utilities/utxfinit.c
@@ -293,7 +293,7 @@ AcpiInitializeObjects (
* all of the tables have been loaded. It is a legacy option and is
* not compatible with other ACPI implementations. See AcpiNsLoadTable.
*/
- if (AcpiGbl_GroupModuleLevelCode)
+ if (!AcpiGbl_ParseTableAsTermList && AcpiGbl_GroupModuleLevelCode)
{
AcpiNsExecModuleCodeList ();