Erik Schmauss | 9585763 | 2018-03-14 16:13:07 -0700 | [diff] [blame] | 1 | // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 2 | /******************************************************************************* |
| 3 | * |
Bob Moore | 72a2935 | 2017-09-20 10:00:43 +0800 | [diff] [blame] | 4 | * Module Name: utstrtoul64 - String-to-integer conversion support for both |
| 5 | * 64-bit and 32-bit integers |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 6 | * |
| 7 | ******************************************************************************/ |
| 8 | |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 9 | #include <acpi/acpi.h> |
| 10 | #include "accommon.h" |
| 11 | |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 12 | #define _COMPONENT ACPI_UTILITIES |
| 13 | ACPI_MODULE_NAME("utstrtoul64") |
| 14 | |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 15 | /******************************************************************************* |
| 16 | * |
Bob Moore | 72a2935 | 2017-09-20 10:00:43 +0800 | [diff] [blame] | 17 | * This module contains the top-level string to 64/32-bit unsigned integer |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 18 | * conversion functions: |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 19 | * |
Bob Moore | 72a2935 | 2017-09-20 10:00:43 +0800 | [diff] [blame] | 20 | * 1) A standard strtoul() function that supports 64-bit integers, base |
| 21 | * 8/10/16, with integer overflow support. This is used mainly by the |
| 22 | * iASL compiler, which implements tighter constraints on integer |
| 23 | * constants than the runtime (interpreter) integer-to-string conversions. |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 24 | * 2) Runtime "Explicit conversion" as defined in the ACPI specification. |
| 25 | * 3) Runtime "Implicit conversion" as defined in the ACPI specification. |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 26 | * |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 27 | * Current users of this module: |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 28 | * |
Bob Moore | 72a2935 | 2017-09-20 10:00:43 +0800 | [diff] [blame] | 29 | * iASL - Preprocessor (constants and math expressions) |
| 30 | * iASL - Main parser, conversion of constants to integers |
| 31 | * iASL - Data Table Compiler parser (constants and math expressions) |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 32 | * interpreter - Implicit and explicit conversions, GPE method names |
Bob Moore | c2e56e5 | 2017-09-20 10:00:49 +0800 | [diff] [blame] | 33 | * interpreter - Repair code for return values from predefined names |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 34 | * debugger - Command line input string conversion |
Bob Moore | c2e56e5 | 2017-09-20 10:00:49 +0800 | [diff] [blame] | 35 | * acpi_dump - ACPI table physical addresses |
| 36 | * acpi_exec - Support for namespace overrides |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 37 | * |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 38 | * Notes concerning users of these interfaces: |
| 39 | * |
Bob Moore | c2e56e5 | 2017-09-20 10:00:49 +0800 | [diff] [blame] | 40 | * acpi_gbl_integer_byte_width is used to set the 32/64 bit limit for explicit |
| 41 | * and implicit conversions. This global must be set to the proper width. |
| 42 | * For the core ACPICA code, the width depends on the DSDT version. For the |
| 43 | * acpi_ut_strtoul64 interface, all conversions are 64 bits. This interface is |
| 44 | * used primarily for iASL, where the default width is 64 bits for all parsers, |
| 45 | * but error checking is performed later to flag cases where a 64-bit constant |
| 46 | * is wrongly defined in a 32-bit DSDT/SSDT. |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 47 | * |
Bob Moore | c2e56e5 | 2017-09-20 10:00:49 +0800 | [diff] [blame] | 48 | * In ACPI, the only place where octal numbers are supported is within |
| 49 | * the ASL language itself. This is implemented via the main acpi_ut_strtoul64 |
| 50 | * interface. According the ACPI specification, there is no ACPI runtime |
| 51 | * support (explicit/implicit) for octal string conversions. |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 52 | * |
| 53 | ******************************************************************************/ |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 54 | /******************************************************************************* |
| 55 | * |
| 56 | * FUNCTION: acpi_ut_strtoul64 |
| 57 | * |
Bob Moore | 72a2935 | 2017-09-20 10:00:43 +0800 | [diff] [blame] | 58 | * PARAMETERS: string - Null terminated input string, |
| 59 | * must be a valid pointer |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 60 | * return_value - Where the converted integer is |
| 61 | * returned. Must be a valid pointer |
| 62 | * |
Bob Moore | c2e56e5 | 2017-09-20 10:00:49 +0800 | [diff] [blame] | 63 | * RETURN: Status and converted integer. Returns an exception on a |
| 64 | * 64-bit numeric overflow |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 65 | * |
Bob Moore | c2e56e5 | 2017-09-20 10:00:49 +0800 | [diff] [blame] | 66 | * DESCRIPTION: Convert a string into an unsigned integer. Always performs a |
| 67 | * full 64-bit conversion, regardless of the current global |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 68 | * integer width. Supports Decimal, Hex, and Octal strings. |
| 69 | * |
| 70 | * Current users of this function: |
| 71 | * |
Bob Moore | 72a2935 | 2017-09-20 10:00:43 +0800 | [diff] [blame] | 72 | * iASL - Preprocessor (constants and math expressions) |
| 73 | * iASL - Main ASL parser, conversion of ASL constants to integers |
| 74 | * iASL - Data Table Compiler parser (constants and math expressions) |
Bob Moore | c2e56e5 | 2017-09-20 10:00:49 +0800 | [diff] [blame] | 75 | * interpreter - Repair code for return values from predefined names |
| 76 | * acpi_dump - ACPI table physical addresses |
| 77 | * acpi_exec - Support for namespace overrides |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 78 | * |
| 79 | ******************************************************************************/ |
| 80 | acpi_status acpi_ut_strtoul64(char *string, u64 *return_value) |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 81 | { |
| 82 | acpi_status status = AE_OK; |
Bob Moore | c2e56e5 | 2017-09-20 10:00:49 +0800 | [diff] [blame] | 83 | u8 original_bit_width; |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 84 | u32 base = 10; /* Default is decimal */ |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 85 | |
| 86 | ACPI_FUNCTION_TRACE_STR(ut_strtoul64, string); |
| 87 | |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 88 | *return_value = 0; |
| 89 | |
Bob Moore | 72a2935 | 2017-09-20 10:00:43 +0800 | [diff] [blame] | 90 | /* A NULL return string returns a value of zero */ |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 91 | |
| 92 | if (*string == 0) { |
| 93 | return_ACPI_STATUS(AE_OK); |
| 94 | } |
| 95 | |
Bob Moore | c2e56e5 | 2017-09-20 10:00:49 +0800 | [diff] [blame] | 96 | if (!acpi_ut_remove_whitespace(&string)) { |
| 97 | return_ACPI_STATUS(AE_OK); |
| 98 | } |
| 99 | |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 100 | /* |
Bob Moore | 72a2935 | 2017-09-20 10:00:43 +0800 | [diff] [blame] | 101 | * 1) Check for a hex constant. A "0x" prefix indicates base 16. |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 102 | */ |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 103 | if (acpi_ut_detect_hex_prefix(&string)) { |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 104 | base = 16; |
| 105 | } |
| 106 | |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 107 | /* |
| 108 | * 2) Check for an octal constant, defined to be a leading zero |
Bob Moore | 72a2935 | 2017-09-20 10:00:43 +0800 | [diff] [blame] | 109 | * followed by sequence of octal digits (0-7) |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 110 | */ |
| 111 | else if (acpi_ut_detect_octal_prefix(&string)) { |
| 112 | base = 8; |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 113 | } |
| 114 | |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 115 | if (!acpi_ut_remove_leading_zeros(&string)) { |
| 116 | return_ACPI_STATUS(AE_OK); /* Return value 0 */ |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 117 | } |
| 118 | |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 119 | /* |
Bob Moore | c2e56e5 | 2017-09-20 10:00:49 +0800 | [diff] [blame] | 120 | * Force a full 64-bit conversion. The caller (usually iASL) must |
| 121 | * check for a 32-bit overflow later as necessary (If current mode |
| 122 | * is 32-bit, meaning a 32-bit DSDT). |
| 123 | */ |
| 124 | original_bit_width = acpi_gbl_integer_bit_width; |
| 125 | acpi_gbl_integer_bit_width = 64; |
| 126 | |
| 127 | /* |
| 128 | * Perform the base 8, 10, or 16 conversion. A 64-bit numeric overflow |
| 129 | * will return an exception (to allow iASL to flag the statement). |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 130 | */ |
| 131 | switch (base) { |
| 132 | case 8: |
| 133 | status = acpi_ut_convert_octal_string(string, return_value); |
| 134 | break; |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 135 | |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 136 | case 10: |
| 137 | status = acpi_ut_convert_decimal_string(string, return_value); |
| 138 | break; |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 139 | |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 140 | case 16: |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 141 | default: |
Bob Moore | 72a2935 | 2017-09-20 10:00:43 +0800 | [diff] [blame] | 142 | status = acpi_ut_convert_hex_string(string, return_value); |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 143 | break; |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 144 | } |
| 145 | |
Bob Moore | c2e56e5 | 2017-09-20 10:00:49 +0800 | [diff] [blame] | 146 | /* Only possible exception from above is a 64-bit overflow */ |
| 147 | |
| 148 | acpi_gbl_integer_bit_width = original_bit_width; |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 149 | return_ACPI_STATUS(status); |
| 150 | } |
| 151 | |
| 152 | /******************************************************************************* |
| 153 | * |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 154 | * FUNCTION: acpi_ut_implicit_strtoul64 |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 155 | * |
Bob Moore | 72a2935 | 2017-09-20 10:00:43 +0800 | [diff] [blame] | 156 | * PARAMETERS: string - Null terminated input string, |
| 157 | * must be a valid pointer |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 158 | * |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 159 | * RETURN: Converted integer |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 160 | * |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 161 | * DESCRIPTION: Perform a 64-bit conversion with restrictions placed upon |
| 162 | * an "implicit conversion" by the ACPI specification. Used by |
| 163 | * many ASL operators that require an integer operand, and support |
| 164 | * an automatic (implicit) conversion from a string operand |
Bob Moore | 72a2935 | 2017-09-20 10:00:43 +0800 | [diff] [blame] | 165 | * to the final integer operand. The major restriction is that |
| 166 | * only hex strings are supported. |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 167 | * |
| 168 | * ----------------------------------------------------------------------------- |
| 169 | * |
Bob Moore | 72a2935 | 2017-09-20 10:00:43 +0800 | [diff] [blame] | 170 | * Base is always 16, either with or without the 0x prefix. Decimal and |
| 171 | * Octal strings are not supported, as per the ACPI specification. |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 172 | * |
| 173 | * Examples (both are hex values): |
| 174 | * Add ("BA98", Arg0, Local0) |
| 175 | * Subtract ("0x12345678", Arg1, Local1) |
| 176 | * |
Bob Moore | 72a2935 | 2017-09-20 10:00:43 +0800 | [diff] [blame] | 177 | * Conversion rules as extracted from the ACPI specification: |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 178 | * |
| 179 | * The converted integer is initialized to the value zero. |
Bob Moore | 72a2935 | 2017-09-20 10:00:43 +0800 | [diff] [blame] | 180 | * The ASCII string is always interpreted as a hexadecimal constant. |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 181 | * |
Bob Moore | 72a2935 | 2017-09-20 10:00:43 +0800 | [diff] [blame] | 182 | * 1) According to the ACPI specification, a "0x" prefix is not allowed. |
| 183 | * However, ACPICA allows this as an ACPI extension on general |
| 184 | * principle. (NO ERROR) |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 185 | * |
Bob Moore | 72a2935 | 2017-09-20 10:00:43 +0800 | [diff] [blame] | 186 | * 2) The conversion terminates when the size of an integer is reached |
| 187 | * (32 or 64 bits). There are no numeric overflow conditions. (NO ERROR) |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 188 | * |
| 189 | * 3) The first non-hex character terminates the conversion and returns |
| 190 | * the current accumulated value of the converted integer (NO ERROR). |
| 191 | * |
| 192 | * 4) Conversion of a null (zero-length) string to an integer is |
Bob Moore | 72a2935 | 2017-09-20 10:00:43 +0800 | [diff] [blame] | 193 | * technically not allowed. However, ACPICA allows this as an ACPI |
| 194 | * extension. The conversion returns the value 0. (NO ERROR) |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 195 | * |
Bob Moore | 72a2935 | 2017-09-20 10:00:43 +0800 | [diff] [blame] | 196 | * NOTE: There are no error conditions returned by this function. At |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 197 | * the minimum, a value of zero is returned. |
| 198 | * |
| 199 | * Current users of this function: |
| 200 | * |
| 201 | * interpreter - All runtime implicit conversions, as per ACPI specification |
Bob Moore | 72a2935 | 2017-09-20 10:00:43 +0800 | [diff] [blame] | 202 | * iASL - Data Table Compiler parser (constants and math expressions) |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 203 | * |
| 204 | ******************************************************************************/ |
| 205 | |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 206 | u64 acpi_ut_implicit_strtoul64(char *string) |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 207 | { |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 208 | u64 converted_integer = 0; |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 209 | |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 210 | ACPI_FUNCTION_TRACE_STR(ut_implicit_strtoul64, string); |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 211 | |
Bob Moore | c2e56e5 | 2017-09-20 10:00:49 +0800 | [diff] [blame] | 212 | if (!acpi_ut_remove_whitespace(&string)) { |
| 213 | return_VALUE(0); |
| 214 | } |
| 215 | |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 216 | /* |
| 217 | * Per the ACPI specification, only hexadecimal is supported for |
| 218 | * implicit conversions, and the "0x" prefix is "not allowed". |
| 219 | * However, allow a "0x" prefix as an ACPI extension. |
| 220 | */ |
Erik Schmauss | 089b2be | 2018-08-10 14:42:57 -0700 | [diff] [blame] | 221 | acpi_ut_remove_hex_prefix(&string); |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 222 | |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 223 | if (!acpi_ut_remove_leading_zeros(&string)) { |
| 224 | return_VALUE(0); |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 225 | } |
| 226 | |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 227 | /* |
| 228 | * Ignore overflow as per the ACPI specification. This is implemented by |
Bob Moore | c2e56e5 | 2017-09-20 10:00:49 +0800 | [diff] [blame] | 229 | * ignoring the return status from the conversion function called below. |
| 230 | * On overflow, the input string is simply truncated. |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 231 | */ |
| 232 | acpi_ut_convert_hex_string(string, &converted_integer); |
| 233 | return_VALUE(converted_integer); |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 234 | } |
| 235 | |
| 236 | /******************************************************************************* |
| 237 | * |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 238 | * FUNCTION: acpi_ut_explicit_strtoul64 |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 239 | * |
Bob Moore | 72a2935 | 2017-09-20 10:00:43 +0800 | [diff] [blame] | 240 | * PARAMETERS: string - Null terminated input string, |
| 241 | * must be a valid pointer |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 242 | * |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 243 | * RETURN: Converted integer |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 244 | * |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 245 | * DESCRIPTION: Perform a 64-bit conversion with the restrictions placed upon |
| 246 | * an "explicit conversion" by the ACPI specification. The |
| 247 | * main restriction is that only hex and decimal are supported. |
| 248 | * |
| 249 | * ----------------------------------------------------------------------------- |
| 250 | * |
Bob Moore | 72a2935 | 2017-09-20 10:00:43 +0800 | [diff] [blame] | 251 | * Base is either 10 (default) or 16 (with 0x prefix). Octal (base 8) strings |
| 252 | * are not supported, as per the ACPI specification. |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 253 | * |
| 254 | * Examples: |
| 255 | * to_integer ("1000") Decimal |
| 256 | * to_integer ("0xABCD") Hex |
| 257 | * |
Bob Moore | 72a2935 | 2017-09-20 10:00:43 +0800 | [diff] [blame] | 258 | * Conversion rules as extracted from the ACPI specification: |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 259 | * |
Bob Moore | 72a2935 | 2017-09-20 10:00:43 +0800 | [diff] [blame] | 260 | * 1) The input string is either a decimal or hexadecimal numeric string. |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 261 | * A hex value must be prefixed by "0x" or it is interpreted as decimal. |
| 262 | * |
| 263 | * 2) The value must not exceed the maximum of an integer value |
| 264 | * (32 or 64 bits). The ACPI specification states the behavior is |
| 265 | * "unpredictable", so ACPICA matches the behavior of the implicit |
| 266 | * conversion case. There are no numeric overflow conditions. (NO ERROR) |
| 267 | * |
Bob Moore | 72a2935 | 2017-09-20 10:00:43 +0800 | [diff] [blame] | 268 | * 3) Behavior on the first non-hex character is not defined by the ACPI |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 269 | * specification (for the to_integer operator), so ACPICA matches the |
| 270 | * behavior of the implicit conversion case. It terminates the |
| 271 | * conversion and returns the current accumulated value of the converted |
| 272 | * integer. (NO ERROR) |
| 273 | * |
| 274 | * 4) Conversion of a null (zero-length) string to an integer is |
Bob Moore | 72a2935 | 2017-09-20 10:00:43 +0800 | [diff] [blame] | 275 | * technically not allowed. However, ACPICA allows this as an ACPI |
| 276 | * extension. The conversion returns the value 0. (NO ERROR) |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 277 | * |
Bob Moore | 72a2935 | 2017-09-20 10:00:43 +0800 | [diff] [blame] | 278 | * NOTE: There are no error conditions returned by this function. At the |
| 279 | * minimum, a value of zero is returned. |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 280 | * |
| 281 | * Current users of this function: |
| 282 | * |
| 283 | * interpreter - Runtime ASL to_integer operator, as per the ACPI specification |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 284 | * |
| 285 | ******************************************************************************/ |
| 286 | |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 287 | u64 acpi_ut_explicit_strtoul64(char *string) |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 288 | { |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 289 | u64 converted_integer = 0; |
| 290 | u32 base = 10; /* Default is decimal */ |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 291 | |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 292 | ACPI_FUNCTION_TRACE_STR(ut_explicit_strtoul64, string); |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 293 | |
Bob Moore | c2e56e5 | 2017-09-20 10:00:49 +0800 | [diff] [blame] | 294 | if (!acpi_ut_remove_whitespace(&string)) { |
| 295 | return_VALUE(0); |
| 296 | } |
| 297 | |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 298 | /* |
| 299 | * Only Hex and Decimal are supported, as per the ACPI specification. |
Bob Moore | 72a2935 | 2017-09-20 10:00:43 +0800 | [diff] [blame] | 300 | * A "0x" prefix indicates hex; otherwise decimal is assumed. |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 301 | */ |
| 302 | if (acpi_ut_detect_hex_prefix(&string)) { |
| 303 | base = 16; |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 304 | } |
| 305 | |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 306 | if (!acpi_ut_remove_leading_zeros(&string)) { |
| 307 | return_VALUE(0); |
| 308 | } |
| 309 | |
| 310 | /* |
| 311 | * Ignore overflow as per the ACPI specification. This is implemented by |
Bob Moore | c2e56e5 | 2017-09-20 10:00:49 +0800 | [diff] [blame] | 312 | * ignoring the return status from the conversion functions called below. |
| 313 | * On overflow, the input string is simply truncated. |
Bob Moore | fe97d28 | 2017-09-20 10:00:36 +0800 | [diff] [blame] | 314 | */ |
| 315 | switch (base) { |
| 316 | case 10: |
| 317 | default: |
| 318 | acpi_ut_convert_decimal_string(string, &converted_integer); |
| 319 | break; |
| 320 | |
| 321 | case 16: |
| 322 | acpi_ut_convert_hex_string(string, &converted_integer); |
| 323 | break; |
| 324 | } |
| 325 | |
| 326 | return_VALUE(converted_integer); |
Bob Moore | 5ebd2ea | 2016-09-07 14:14:30 +0800 | [diff] [blame] | 327 | } |