1db2bae30SDana Myers /****************************************************************************** 2db2bae30SDana Myers * 3db2bae30SDana Myers * Module Name: exutils - interpreter/scanner utilities 4db2bae30SDana Myers * 5db2bae30SDana Myers *****************************************************************************/ 6db2bae30SDana Myers 726f3cdf0SGordon Ross /* 8*385cc6b4SJerry Jelinek * Copyright (C) 2000 - 2016, Intel Corp. 9db2bae30SDana Myers * All rights reserved. 10db2bae30SDana Myers * 1126f3cdf0SGordon Ross * Redistribution and use in source and binary forms, with or without 1226f3cdf0SGordon Ross * modification, are permitted provided that the following conditions 1326f3cdf0SGordon Ross * are met: 1426f3cdf0SGordon Ross * 1. Redistributions of source code must retain the above copyright 1526f3cdf0SGordon Ross * notice, this list of conditions, and the following disclaimer, 1626f3cdf0SGordon Ross * without modification. 1726f3cdf0SGordon Ross * 2. Redistributions in binary form must reproduce at minimum a disclaimer 1826f3cdf0SGordon Ross * substantially similar to the "NO WARRANTY" disclaimer below 1926f3cdf0SGordon Ross * ("Disclaimer") and any redistribution must be conditioned upon 2026f3cdf0SGordon Ross * including a substantially similar Disclaimer requirement for further 2126f3cdf0SGordon Ross * binary redistribution. 2226f3cdf0SGordon Ross * 3. Neither the names of the above-listed copyright holders nor the names 2326f3cdf0SGordon Ross * of any contributors may be used to endorse or promote products derived 2426f3cdf0SGordon Ross * from this software without specific prior written permission. 25db2bae30SDana Myers * 2626f3cdf0SGordon Ross * Alternatively, this software may be distributed under the terms of the 2726f3cdf0SGordon Ross * GNU General Public License ("GPL") version 2 as published by the Free 2826f3cdf0SGordon Ross * Software Foundation. 29db2bae30SDana Myers * 3026f3cdf0SGordon Ross * NO WARRANTY 3126f3cdf0SGordon Ross * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 3226f3cdf0SGordon Ross * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 3326f3cdf0SGordon Ross * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 3426f3cdf0SGordon Ross * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 3526f3cdf0SGordon Ross * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 3626f3cdf0SGordon Ross * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 3726f3cdf0SGordon Ross * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3826f3cdf0SGordon Ross * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 3926f3cdf0SGordon Ross * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 4026f3cdf0SGordon Ross * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 4126f3cdf0SGordon Ross * POSSIBILITY OF SUCH DAMAGES. 4226f3cdf0SGordon Ross */ 43db2bae30SDana Myers 44db2bae30SDana Myers /* 45db2bae30SDana Myers * DEFINE_AML_GLOBALS is tested in amlcode.h 46db2bae30SDana Myers * to determine whether certain global names should be "defined" or only 47db2bae30SDana Myers * "declared" in the current compilation. This enhances maintainability 48db2bae30SDana Myers * by enabling a single header file to embody all knowledge of the names 49db2bae30SDana Myers * in question. 50db2bae30SDana Myers * 51db2bae30SDana Myers * Exactly one module of any executable should #define DEFINE_GLOBALS 52db2bae30SDana Myers * before #including the header files which use this convention. The 53db2bae30SDana Myers * names in question will be defined and initialized in that module, 54db2bae30SDana Myers * and declared as extern in all other modules which #include those 55db2bae30SDana Myers * header files. 56db2bae30SDana Myers */ 57db2bae30SDana Myers 58db2bae30SDana Myers #define DEFINE_AML_GLOBALS 59db2bae30SDana Myers 60db2bae30SDana Myers #include "acpi.h" 61aa2aa9a6SDana Myers #include "accommon.h" 62db2bae30SDana Myers #include "acinterp.h" 63db2bae30SDana Myers #include "amlcode.h" 64db2bae30SDana Myers 65db2bae30SDana Myers #define _COMPONENT ACPI_EXECUTER 66db2bae30SDana Myers ACPI_MODULE_NAME ("exutils") 67db2bae30SDana Myers 68db2bae30SDana Myers /* Local prototypes */ 69db2bae30SDana Myers 70db2bae30SDana Myers static UINT32 71db2bae30SDana Myers AcpiExDigitsNeeded ( 7226f3cdf0SGordon Ross UINT64 Value, 73db2bae30SDana Myers UINT32 Base); 74db2bae30SDana Myers 75db2bae30SDana Myers 76db2bae30SDana Myers #ifndef ACPI_NO_METHOD_EXECUTION 77db2bae30SDana Myers /******************************************************************************* 78db2bae30SDana Myers * 79db2bae30SDana Myers * FUNCTION: AcpiExEnterInterpreter 80db2bae30SDana Myers * 81db2bae30SDana Myers * PARAMETERS: None 82db2bae30SDana Myers * 83db2bae30SDana Myers * RETURN: None 84db2bae30SDana Myers * 85db2bae30SDana Myers * DESCRIPTION: Enter the interpreter execution region. Failure to enter 86db2bae30SDana Myers * the interpreter region is a fatal system error. Used in 87db2bae30SDana Myers * conjunction with ExitInterpreter. 88db2bae30SDana Myers * 89db2bae30SDana Myers ******************************************************************************/ 90db2bae30SDana Myers 91db2bae30SDana Myers void 92db2bae30SDana Myers AcpiExEnterInterpreter ( 93db2bae30SDana Myers void) 94db2bae30SDana Myers { 95db2bae30SDana Myers ACPI_STATUS Status; 96db2bae30SDana Myers 97db2bae30SDana Myers 98db2bae30SDana Myers ACPI_FUNCTION_TRACE (ExEnterInterpreter); 99db2bae30SDana Myers 100db2bae30SDana Myers 101db2bae30SDana Myers Status = AcpiUtAcquireMutex (ACPI_MTX_INTERPRETER); 102db2bae30SDana Myers if (ACPI_FAILURE (Status)) 103db2bae30SDana Myers { 104db2bae30SDana Myers ACPI_ERROR ((AE_INFO, "Could not acquire AML Interpreter mutex")); 105db2bae30SDana Myers } 106db2bae30SDana Myers 107db2bae30SDana Myers return_VOID; 108db2bae30SDana Myers } 109db2bae30SDana Myers 110db2bae30SDana Myers 111db2bae30SDana Myers /******************************************************************************* 112db2bae30SDana Myers * 113db2bae30SDana Myers * FUNCTION: AcpiExExitInterpreter 114db2bae30SDana Myers * 115db2bae30SDana Myers * PARAMETERS: None 116db2bae30SDana Myers * 117db2bae30SDana Myers * RETURN: None 118db2bae30SDana Myers * 119db2bae30SDana Myers * DESCRIPTION: Exit the interpreter execution region. This is the top level 120db2bae30SDana Myers * routine used to exit the interpreter when all processing has 121*385cc6b4SJerry Jelinek * been completed, or when the method blocks. 122*385cc6b4SJerry Jelinek * 123*385cc6b4SJerry Jelinek * Cases where the interpreter is unlocked internally: 124*385cc6b4SJerry Jelinek * 1) Method will be blocked on a Sleep() AML opcode 125*385cc6b4SJerry Jelinek * 2) Method will be blocked on an Acquire() AML opcode 126*385cc6b4SJerry Jelinek * 3) Method will be blocked on a Wait() AML opcode 127*385cc6b4SJerry Jelinek * 4) Method will be blocked to acquire the global lock 128*385cc6b4SJerry Jelinek * 5) Method will be blocked waiting to execute a serialized control 129*385cc6b4SJerry Jelinek * method that is currently executing 130*385cc6b4SJerry Jelinek * 6) About to invoke a user-installed opregion handler 131db2bae30SDana Myers * 132db2bae30SDana Myers ******************************************************************************/ 133db2bae30SDana Myers 134db2bae30SDana Myers void 135db2bae30SDana Myers AcpiExExitInterpreter ( 136db2bae30SDana Myers void) 137db2bae30SDana Myers { 138db2bae30SDana Myers ACPI_STATUS Status; 139db2bae30SDana Myers 140db2bae30SDana Myers 141db2bae30SDana Myers ACPI_FUNCTION_TRACE (ExExitInterpreter); 142db2bae30SDana Myers 143db2bae30SDana Myers 144db2bae30SDana Myers Status = AcpiUtReleaseMutex (ACPI_MTX_INTERPRETER); 145db2bae30SDana Myers if (ACPI_FAILURE (Status)) 146db2bae30SDana Myers { 147db2bae30SDana Myers ACPI_ERROR ((AE_INFO, "Could not release AML Interpreter mutex")); 148db2bae30SDana Myers } 149db2bae30SDana Myers 150db2bae30SDana Myers return_VOID; 151db2bae30SDana Myers } 152db2bae30SDana Myers 153db2bae30SDana Myers 154db2bae30SDana Myers /******************************************************************************* 155db2bae30SDana Myers * 156db2bae30SDana Myers * FUNCTION: AcpiExTruncateFor32bitTable 157db2bae30SDana Myers * 158db2bae30SDana Myers * PARAMETERS: ObjDesc - Object to be truncated 159db2bae30SDana Myers * 160*385cc6b4SJerry Jelinek * RETURN: TRUE if a truncation was performed, FALSE otherwise. 161db2bae30SDana Myers * 162db2bae30SDana Myers * DESCRIPTION: Truncate an ACPI Integer to 32 bits if the execution mode is 163db2bae30SDana Myers * 32-bit, as determined by the revision of the DSDT. 164db2bae30SDana Myers * 165db2bae30SDana Myers ******************************************************************************/ 166db2bae30SDana Myers 167*385cc6b4SJerry Jelinek BOOLEAN 168db2bae30SDana Myers AcpiExTruncateFor32bitTable ( 169db2bae30SDana Myers ACPI_OPERAND_OBJECT *ObjDesc) 170db2bae30SDana Myers { 171db2bae30SDana Myers 172db2bae30SDana Myers ACPI_FUNCTION_ENTRY (); 173db2bae30SDana Myers 174db2bae30SDana Myers 175db2bae30SDana Myers /* 176db2bae30SDana Myers * Object must be a valid number and we must be executing 177*385cc6b4SJerry Jelinek * a control method. Object could be NS node for AML_INT_NAMEPATH_OP. 178db2bae30SDana Myers */ 179db2bae30SDana Myers if ((!ObjDesc) || 180db2bae30SDana Myers (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND) || 181aa2aa9a6SDana Myers (ObjDesc->Common.Type != ACPI_TYPE_INTEGER)) 182db2bae30SDana Myers { 183*385cc6b4SJerry Jelinek return (FALSE); 184db2bae30SDana Myers } 185db2bae30SDana Myers 186*385cc6b4SJerry Jelinek if ((AcpiGbl_IntegerByteWidth == 4) && 187*385cc6b4SJerry Jelinek (ObjDesc->Integer.Value > (UINT64) ACPI_UINT32_MAX)) 188db2bae30SDana Myers { 189db2bae30SDana Myers /* 190*385cc6b4SJerry Jelinek * We are executing in a 32-bit ACPI table. Truncate 191*385cc6b4SJerry Jelinek * the value to 32 bits by zeroing out the upper 32-bit field 192db2bae30SDana Myers */ 19326f3cdf0SGordon Ross ObjDesc->Integer.Value &= (UINT64) ACPI_UINT32_MAX; 194*385cc6b4SJerry Jelinek return (TRUE); 195db2bae30SDana Myers } 196*385cc6b4SJerry Jelinek 197*385cc6b4SJerry Jelinek return (FALSE); 198db2bae30SDana Myers } 199db2bae30SDana Myers 200db2bae30SDana Myers 201db2bae30SDana Myers /******************************************************************************* 202db2bae30SDana Myers * 203db2bae30SDana Myers * FUNCTION: AcpiExAcquireGlobalLock 204db2bae30SDana Myers * 205db2bae30SDana Myers * PARAMETERS: FieldFlags - Flags with Lock rule: 206db2bae30SDana Myers * AlwaysLock or NeverLock 207db2bae30SDana Myers * 208db2bae30SDana Myers * RETURN: None 209db2bae30SDana Myers * 210db2bae30SDana Myers * DESCRIPTION: Obtain the ACPI hardware Global Lock, only if the field 211db2bae30SDana Myers * flags specifiy that it is to be obtained before field access. 212db2bae30SDana Myers * 213db2bae30SDana Myers ******************************************************************************/ 214db2bae30SDana Myers 215db2bae30SDana Myers void 216db2bae30SDana Myers AcpiExAcquireGlobalLock ( 217db2bae30SDana Myers UINT32 FieldFlags) 218db2bae30SDana Myers { 219db2bae30SDana Myers ACPI_STATUS Status; 220db2bae30SDana Myers 221db2bae30SDana Myers 222db2bae30SDana Myers ACPI_FUNCTION_TRACE (ExAcquireGlobalLock); 223db2bae30SDana Myers 224db2bae30SDana Myers 225db2bae30SDana Myers /* Only use the lock if the AlwaysLock bit is set */ 226db2bae30SDana Myers 227db2bae30SDana Myers if (!(FieldFlags & AML_FIELD_LOCK_RULE_MASK)) 228db2bae30SDana Myers { 229db2bae30SDana Myers return_VOID; 230db2bae30SDana Myers } 231db2bae30SDana Myers 232db2bae30SDana Myers /* Attempt to get the global lock, wait forever */ 233db2bae30SDana Myers 234db2bae30SDana Myers Status = AcpiExAcquireMutexObject (ACPI_WAIT_FOREVER, 235db2bae30SDana Myers AcpiGbl_GlobalLockMutex, AcpiOsGetThreadId ()); 236db2bae30SDana Myers 237db2bae30SDana Myers if (ACPI_FAILURE (Status)) 238db2bae30SDana Myers { 239db2bae30SDana Myers ACPI_EXCEPTION ((AE_INFO, Status, 240db2bae30SDana Myers "Could not acquire Global Lock")); 241db2bae30SDana Myers } 242db2bae30SDana Myers 243db2bae30SDana Myers return_VOID; 244db2bae30SDana Myers } 245db2bae30SDana Myers 246db2bae30SDana Myers 247db2bae30SDana Myers /******************************************************************************* 248db2bae30SDana Myers * 249db2bae30SDana Myers * FUNCTION: AcpiExReleaseGlobalLock 250db2bae30SDana Myers * 251db2bae30SDana Myers * PARAMETERS: FieldFlags - Flags with Lock rule: 252db2bae30SDana Myers * AlwaysLock or NeverLock 253db2bae30SDana Myers * 254db2bae30SDana Myers * RETURN: None 255db2bae30SDana Myers * 256db2bae30SDana Myers * DESCRIPTION: Release the ACPI hardware Global Lock 257db2bae30SDana Myers * 258db2bae30SDana Myers ******************************************************************************/ 259db2bae30SDana Myers 260db2bae30SDana Myers void 261db2bae30SDana Myers AcpiExReleaseGlobalLock ( 262db2bae30SDana Myers UINT32 FieldFlags) 263db2bae30SDana Myers { 264db2bae30SDana Myers ACPI_STATUS Status; 265db2bae30SDana Myers 266db2bae30SDana Myers 267db2bae30SDana Myers ACPI_FUNCTION_TRACE (ExReleaseGlobalLock); 268db2bae30SDana Myers 269db2bae30SDana Myers 270db2bae30SDana Myers /* Only use the lock if the AlwaysLock bit is set */ 271db2bae30SDana Myers 272db2bae30SDana Myers if (!(FieldFlags & AML_FIELD_LOCK_RULE_MASK)) 273db2bae30SDana Myers { 274db2bae30SDana Myers return_VOID; 275db2bae30SDana Myers } 276db2bae30SDana Myers 277db2bae30SDana Myers /* Release the global lock */ 278db2bae30SDana Myers 279db2bae30SDana Myers Status = AcpiExReleaseMutexObject (AcpiGbl_GlobalLockMutex); 280db2bae30SDana Myers if (ACPI_FAILURE (Status)) 281db2bae30SDana Myers { 282db2bae30SDana Myers /* Report the error, but there isn't much else we can do */ 283db2bae30SDana Myers 284db2bae30SDana Myers ACPI_EXCEPTION ((AE_INFO, Status, 285db2bae30SDana Myers "Could not release Global Lock")); 286db2bae30SDana Myers } 287db2bae30SDana Myers 288db2bae30SDana Myers return_VOID; 289db2bae30SDana Myers } 290db2bae30SDana Myers 291db2bae30SDana Myers 292db2bae30SDana Myers /******************************************************************************* 293db2bae30SDana Myers * 294db2bae30SDana Myers * FUNCTION: AcpiExDigitsNeeded 295db2bae30SDana Myers * 296db2bae30SDana Myers * PARAMETERS: Value - Value to be represented 297db2bae30SDana Myers * Base - Base of representation 298db2bae30SDana Myers * 299db2bae30SDana Myers * RETURN: The number of digits. 300db2bae30SDana Myers * 301db2bae30SDana Myers * DESCRIPTION: Calculate the number of digits needed to represent the Value 302db2bae30SDana Myers * in the given Base (Radix) 303db2bae30SDana Myers * 304db2bae30SDana Myers ******************************************************************************/ 305db2bae30SDana Myers 306db2bae30SDana Myers static UINT32 307db2bae30SDana Myers AcpiExDigitsNeeded ( 30826f3cdf0SGordon Ross UINT64 Value, 309db2bae30SDana Myers UINT32 Base) 310db2bae30SDana Myers { 311db2bae30SDana Myers UINT32 NumDigits; 31226f3cdf0SGordon Ross UINT64 CurrentValue; 313db2bae30SDana Myers 314db2bae30SDana Myers 315db2bae30SDana Myers ACPI_FUNCTION_TRACE (ExDigitsNeeded); 316db2bae30SDana Myers 317db2bae30SDana Myers 31826f3cdf0SGordon Ross /* UINT64 is unsigned, so we don't worry about a '-' prefix */ 319db2bae30SDana Myers 320db2bae30SDana Myers if (Value == 0) 321db2bae30SDana Myers { 322db2bae30SDana Myers return_UINT32 (1); 323db2bae30SDana Myers } 324db2bae30SDana Myers 325db2bae30SDana Myers CurrentValue = Value; 326db2bae30SDana Myers NumDigits = 0; 327db2bae30SDana Myers 328db2bae30SDana Myers /* Count the digits in the requested base */ 329db2bae30SDana Myers 330db2bae30SDana Myers while (CurrentValue) 331db2bae30SDana Myers { 332db2bae30SDana Myers (void) AcpiUtShortDivide (CurrentValue, Base, &CurrentValue, NULL); 333db2bae30SDana Myers NumDigits++; 334db2bae30SDana Myers } 335db2bae30SDana Myers 336db2bae30SDana Myers return_UINT32 (NumDigits); 337db2bae30SDana Myers } 338db2bae30SDana Myers 339db2bae30SDana Myers 340db2bae30SDana Myers /******************************************************************************* 341db2bae30SDana Myers * 342db2bae30SDana Myers * FUNCTION: AcpiExEisaIdToString 343db2bae30SDana Myers * 344*385cc6b4SJerry Jelinek * PARAMETERS: OutString - Where to put the converted string (8 bytes) 345*385cc6b4SJerry Jelinek * CompressedId - EISAID to be converted 346db2bae30SDana Myers * 347db2bae30SDana Myers * RETURN: None 348db2bae30SDana Myers * 34957190917SDana Myers * DESCRIPTION: Convert a numeric EISAID to string representation. Return 35057190917SDana Myers * buffer must be large enough to hold the string. The string 35157190917SDana Myers * returned is always exactly of length ACPI_EISAID_STRING_SIZE 35257190917SDana Myers * (includes null terminator). The EISAID is always 32 bits. 353db2bae30SDana Myers * 354db2bae30SDana Myers ******************************************************************************/ 355db2bae30SDana Myers 356db2bae30SDana Myers void 357db2bae30SDana Myers AcpiExEisaIdToString ( 35857190917SDana Myers char *OutString, 35926f3cdf0SGordon Ross UINT64 CompressedId) 360db2bae30SDana Myers { 36157190917SDana Myers UINT32 SwappedId; 362db2bae30SDana Myers 363db2bae30SDana Myers 364db2bae30SDana Myers ACPI_FUNCTION_ENTRY (); 365db2bae30SDana Myers 366db2bae30SDana Myers 36757190917SDana Myers /* The EISAID should be a 32-bit integer */ 36857190917SDana Myers 36957190917SDana Myers if (CompressedId > ACPI_UINT32_MAX) 37057190917SDana Myers { 37157190917SDana Myers ACPI_WARNING ((AE_INFO, 372*385cc6b4SJerry Jelinek "Expected EISAID is larger than 32 bits: " 373*385cc6b4SJerry Jelinek "0x%8.8X%8.8X, truncating", 37457190917SDana Myers ACPI_FORMAT_UINT64 (CompressedId))); 37557190917SDana Myers } 37657190917SDana Myers 377db2bae30SDana Myers /* Swap ID to big-endian to get contiguous bits */ 378db2bae30SDana Myers 37957190917SDana Myers SwappedId = AcpiUtDwordByteSwap ((UINT32) CompressedId); 380db2bae30SDana Myers 38157190917SDana Myers /* First 3 bytes are uppercase letters. Next 4 bytes are hexadecimal */ 38257190917SDana Myers 38357190917SDana Myers OutString[0] = (char) (0x40 + (((unsigned long) SwappedId >> 26) & 0x1F)); 38457190917SDana Myers OutString[1] = (char) (0x40 + ((SwappedId >> 21) & 0x1F)); 38557190917SDana Myers OutString[2] = (char) (0x40 + ((SwappedId >> 16) & 0x1F)); 38626f3cdf0SGordon Ross OutString[3] = AcpiUtHexToAsciiChar ((UINT64) SwappedId, 12); 38726f3cdf0SGordon Ross OutString[4] = AcpiUtHexToAsciiChar ((UINT64) SwappedId, 8); 38826f3cdf0SGordon Ross OutString[5] = AcpiUtHexToAsciiChar ((UINT64) SwappedId, 4); 38926f3cdf0SGordon Ross OutString[6] = AcpiUtHexToAsciiChar ((UINT64) SwappedId, 0); 390db2bae30SDana Myers OutString[7] = 0; 391db2bae30SDana Myers } 392db2bae30SDana Myers 393db2bae30SDana Myers 394db2bae30SDana Myers /******************************************************************************* 395db2bae30SDana Myers * 39657190917SDana Myers * FUNCTION: AcpiExIntegerToString 397db2bae30SDana Myers * 39857190917SDana Myers * PARAMETERS: OutString - Where to put the converted string. At least 39957190917SDana Myers * 21 bytes are needed to hold the largest 40057190917SDana Myers * possible 64-bit integer. 40157190917SDana Myers * Value - Value to be converted 402db2bae30SDana Myers * 403*385cc6b4SJerry Jelinek * RETURN: Converted string in OutString 404db2bae30SDana Myers * 40557190917SDana Myers * DESCRIPTION: Convert a 64-bit integer to decimal string representation. 40657190917SDana Myers * Assumes string buffer is large enough to hold the string. The 40757190917SDana Myers * largest string is (ACPI_MAX64_DECIMAL_DIGITS + 1). 408db2bae30SDana Myers * 409db2bae30SDana Myers ******************************************************************************/ 410db2bae30SDana Myers 411db2bae30SDana Myers void 41257190917SDana Myers AcpiExIntegerToString ( 41357190917SDana Myers char *OutString, 41426f3cdf0SGordon Ross UINT64 Value) 415db2bae30SDana Myers { 416db2bae30SDana Myers UINT32 Count; 417db2bae30SDana Myers UINT32 DigitsNeeded; 418db2bae30SDana Myers UINT32 Remainder; 419db2bae30SDana Myers 420db2bae30SDana Myers 421db2bae30SDana Myers ACPI_FUNCTION_ENTRY (); 422db2bae30SDana Myers 423db2bae30SDana Myers 424db2bae30SDana Myers DigitsNeeded = AcpiExDigitsNeeded (Value, 10); 425db2bae30SDana Myers OutString[DigitsNeeded] = 0; 426db2bae30SDana Myers 427db2bae30SDana Myers for (Count = DigitsNeeded; Count > 0; Count--) 428db2bae30SDana Myers { 429db2bae30SDana Myers (void) AcpiUtShortDivide (Value, 10, &Value, &Remainder); 430db2bae30SDana Myers OutString[Count-1] = (char) ('0' + Remainder);\ 431db2bae30SDana Myers } 432db2bae30SDana Myers } 433db2bae30SDana Myers 434*385cc6b4SJerry Jelinek 435*385cc6b4SJerry Jelinek /******************************************************************************* 436*385cc6b4SJerry Jelinek * 437*385cc6b4SJerry Jelinek * FUNCTION: AcpiExPciClsToString 438*385cc6b4SJerry Jelinek * 439*385cc6b4SJerry Jelinek * PARAMETERS: OutString - Where to put the converted string (7 bytes) 440*385cc6b4SJerry Jelinek * ClassCode - PCI class code to be converted (3 bytes) 441*385cc6b4SJerry Jelinek * 442*385cc6b4SJerry Jelinek * RETURN: Converted string in OutString 443*385cc6b4SJerry Jelinek * 444*385cc6b4SJerry Jelinek * DESCRIPTION: Convert 3-bytes PCI class code to string representation. 445*385cc6b4SJerry Jelinek * Return buffer must be large enough to hold the string. The 446*385cc6b4SJerry Jelinek * string returned is always exactly of length 447*385cc6b4SJerry Jelinek * ACPI_PCICLS_STRING_SIZE (includes null terminator). 448*385cc6b4SJerry Jelinek * 449*385cc6b4SJerry Jelinek ******************************************************************************/ 450*385cc6b4SJerry Jelinek 451*385cc6b4SJerry Jelinek void 452*385cc6b4SJerry Jelinek AcpiExPciClsToString ( 453*385cc6b4SJerry Jelinek char *OutString, 454*385cc6b4SJerry Jelinek UINT8 ClassCode[3]) 455*385cc6b4SJerry Jelinek { 456*385cc6b4SJerry Jelinek 457*385cc6b4SJerry Jelinek ACPI_FUNCTION_ENTRY (); 458*385cc6b4SJerry Jelinek 459*385cc6b4SJerry Jelinek 460*385cc6b4SJerry Jelinek /* All 3 bytes are hexadecimal */ 461*385cc6b4SJerry Jelinek 462*385cc6b4SJerry Jelinek OutString[0] = AcpiUtHexToAsciiChar ((UINT64) ClassCode[0], 4); 463*385cc6b4SJerry Jelinek OutString[1] = AcpiUtHexToAsciiChar ((UINT64) ClassCode[0], 0); 464*385cc6b4SJerry Jelinek OutString[2] = AcpiUtHexToAsciiChar ((UINT64) ClassCode[1], 4); 465*385cc6b4SJerry Jelinek OutString[3] = AcpiUtHexToAsciiChar ((UINT64) ClassCode[1], 0); 466*385cc6b4SJerry Jelinek OutString[4] = AcpiUtHexToAsciiChar ((UINT64) ClassCode[2], 4); 467*385cc6b4SJerry Jelinek OutString[5] = AcpiUtHexToAsciiChar ((UINT64) ClassCode[2], 0); 468*385cc6b4SJerry Jelinek OutString[6] = 0; 469*385cc6b4SJerry Jelinek } 470*385cc6b4SJerry Jelinek 471*385cc6b4SJerry Jelinek 472*385cc6b4SJerry Jelinek /******************************************************************************* 473*385cc6b4SJerry Jelinek * 474*385cc6b4SJerry Jelinek * FUNCTION: AcpiIsValidSpaceId 475*385cc6b4SJerry Jelinek * 476*385cc6b4SJerry Jelinek * PARAMETERS: SpaceId - ID to be validated 477*385cc6b4SJerry Jelinek * 478*385cc6b4SJerry Jelinek * RETURN: TRUE if SpaceId is a valid/supported ID. 479*385cc6b4SJerry Jelinek * 480*385cc6b4SJerry Jelinek * DESCRIPTION: Validate an operation region SpaceID. 481*385cc6b4SJerry Jelinek * 482*385cc6b4SJerry Jelinek ******************************************************************************/ 483*385cc6b4SJerry Jelinek 484*385cc6b4SJerry Jelinek BOOLEAN 485*385cc6b4SJerry Jelinek AcpiIsValidSpaceId ( 486*385cc6b4SJerry Jelinek UINT8 SpaceId) 487*385cc6b4SJerry Jelinek { 488*385cc6b4SJerry Jelinek 489*385cc6b4SJerry Jelinek if ((SpaceId >= ACPI_NUM_PREDEFINED_REGIONS) && 490*385cc6b4SJerry Jelinek (SpaceId < ACPI_USER_REGION_BEGIN) && 491*385cc6b4SJerry Jelinek (SpaceId != ACPI_ADR_SPACE_DATA_TABLE) && 492*385cc6b4SJerry Jelinek (SpaceId != ACPI_ADR_SPACE_FIXED_HARDWARE)) 493*385cc6b4SJerry Jelinek { 494*385cc6b4SJerry Jelinek return (FALSE); 495*385cc6b4SJerry Jelinek } 496*385cc6b4SJerry Jelinek 497*385cc6b4SJerry Jelinek return (TRUE); 498*385cc6b4SJerry Jelinek } 499*385cc6b4SJerry Jelinek 500db2bae30SDana Myers #endif 501