1db2bae30SDana Myers /******************************************************************************
2db2bae30SDana Myers *
3db2bae30SDana Myers * Module Name: exutils - interpreter/scanner utilities
4db2bae30SDana Myers *
5db2bae30SDana Myers *****************************************************************************/
6db2bae30SDana Myers
726f3cdf0SGordon Ross /*
8*cb565728SJerry 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
AcpiExEnterInterpreter(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*cb565728SJerry Jelinek * been completed, or when the method blocks.
122*cb565728SJerry Jelinek *
123*cb565728SJerry Jelinek * Cases where the interpreter is unlocked internally:
124*cb565728SJerry Jelinek * 1) Method will be blocked on a Sleep() AML opcode
125*cb565728SJerry Jelinek * 2) Method will be blocked on an Acquire() AML opcode
126*cb565728SJerry Jelinek * 3) Method will be blocked on a Wait() AML opcode
127*cb565728SJerry Jelinek * 4) Method will be blocked to acquire the global lock
128*cb565728SJerry Jelinek * 5) Method will be blocked waiting to execute a serialized control
129*cb565728SJerry Jelinek * method that is currently executing
130*cb565728SJerry Jelinek * 6) About to invoke a user-installed opregion handler
131db2bae30SDana Myers *
132db2bae30SDana Myers ******************************************************************************/
133db2bae30SDana Myers
134db2bae30SDana Myers void
AcpiExExitInterpreter(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*cb565728SJerry 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*cb565728SJerry Jelinek BOOLEAN
AcpiExTruncateFor32bitTable(ACPI_OPERAND_OBJECT * ObjDesc)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*cb565728SJerry 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*cb565728SJerry Jelinek return (FALSE);
184db2bae30SDana Myers }
185db2bae30SDana Myers
186*cb565728SJerry Jelinek if ((AcpiGbl_IntegerByteWidth == 4) &&
187*cb565728SJerry Jelinek (ObjDesc->Integer.Value > (UINT64) ACPI_UINT32_MAX))
188db2bae30SDana Myers {
189db2bae30SDana Myers /*
190*cb565728SJerry Jelinek * We are executing in a 32-bit ACPI table. Truncate
191*cb565728SJerry 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*cb565728SJerry Jelinek return (TRUE);
195db2bae30SDana Myers }
196*cb565728SJerry Jelinek
197*cb565728SJerry 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
AcpiExAcquireGlobalLock(UINT32 FieldFlags)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
AcpiExReleaseGlobalLock(UINT32 FieldFlags)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
AcpiExDigitsNeeded(UINT64 Value,UINT32 Base)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*cb565728SJerry Jelinek * PARAMETERS: OutString - Where to put the converted string (8 bytes)
345*cb565728SJerry 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
AcpiExEisaIdToString(char * OutString,UINT64 CompressedId)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*cb565728SJerry Jelinek "Expected EISAID is larger than 32 bits: "
373*cb565728SJerry 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*cb565728SJerry 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
AcpiExIntegerToString(char * OutString,UINT64 Value)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*cb565728SJerry Jelinek
435*cb565728SJerry Jelinek /*******************************************************************************
436*cb565728SJerry Jelinek *
437*cb565728SJerry Jelinek * FUNCTION: AcpiExPciClsToString
438*cb565728SJerry Jelinek *
439*cb565728SJerry Jelinek * PARAMETERS: OutString - Where to put the converted string (7 bytes)
440*cb565728SJerry Jelinek * ClassCode - PCI class code to be converted (3 bytes)
441*cb565728SJerry Jelinek *
442*cb565728SJerry Jelinek * RETURN: Converted string in OutString
443*cb565728SJerry Jelinek *
444*cb565728SJerry Jelinek * DESCRIPTION: Convert 3-bytes PCI class code to string representation.
445*cb565728SJerry Jelinek * Return buffer must be large enough to hold the string. The
446*cb565728SJerry Jelinek * string returned is always exactly of length
447*cb565728SJerry Jelinek * ACPI_PCICLS_STRING_SIZE (includes null terminator).
448*cb565728SJerry Jelinek *
449*cb565728SJerry Jelinek ******************************************************************************/
450*cb565728SJerry Jelinek
451*cb565728SJerry Jelinek void
AcpiExPciClsToString(char * OutString,UINT8 ClassCode[3])452*cb565728SJerry Jelinek AcpiExPciClsToString (
453*cb565728SJerry Jelinek char *OutString,
454*cb565728SJerry Jelinek UINT8 ClassCode[3])
455*cb565728SJerry Jelinek {
456*cb565728SJerry Jelinek
457*cb565728SJerry Jelinek ACPI_FUNCTION_ENTRY ();
458*cb565728SJerry Jelinek
459*cb565728SJerry Jelinek
460*cb565728SJerry Jelinek /* All 3 bytes are hexadecimal */
461*cb565728SJerry Jelinek
462*cb565728SJerry Jelinek OutString[0] = AcpiUtHexToAsciiChar ((UINT64) ClassCode[0], 4);
463*cb565728SJerry Jelinek OutString[1] = AcpiUtHexToAsciiChar ((UINT64) ClassCode[0], 0);
464*cb565728SJerry Jelinek OutString[2] = AcpiUtHexToAsciiChar ((UINT64) ClassCode[1], 4);
465*cb565728SJerry Jelinek OutString[3] = AcpiUtHexToAsciiChar ((UINT64) ClassCode[1], 0);
466*cb565728SJerry Jelinek OutString[4] = AcpiUtHexToAsciiChar ((UINT64) ClassCode[2], 4);
467*cb565728SJerry Jelinek OutString[5] = AcpiUtHexToAsciiChar ((UINT64) ClassCode[2], 0);
468*cb565728SJerry Jelinek OutString[6] = 0;
469*cb565728SJerry Jelinek }
470*cb565728SJerry Jelinek
471*cb565728SJerry Jelinek
472*cb565728SJerry Jelinek /*******************************************************************************
473*cb565728SJerry Jelinek *
474*cb565728SJerry Jelinek * FUNCTION: AcpiIsValidSpaceId
475*cb565728SJerry Jelinek *
476*cb565728SJerry Jelinek * PARAMETERS: SpaceId - ID to be validated
477*cb565728SJerry Jelinek *
478*cb565728SJerry Jelinek * RETURN: TRUE if SpaceId is a valid/supported ID.
479*cb565728SJerry Jelinek *
480*cb565728SJerry Jelinek * DESCRIPTION: Validate an operation region SpaceID.
481*cb565728SJerry Jelinek *
482*cb565728SJerry Jelinek ******************************************************************************/
483*cb565728SJerry Jelinek
484*cb565728SJerry Jelinek BOOLEAN
AcpiIsValidSpaceId(UINT8 SpaceId)485*cb565728SJerry Jelinek AcpiIsValidSpaceId (
486*cb565728SJerry Jelinek UINT8 SpaceId)
487*cb565728SJerry Jelinek {
488*cb565728SJerry Jelinek
489*cb565728SJerry Jelinek if ((SpaceId >= ACPI_NUM_PREDEFINED_REGIONS) &&
490*cb565728SJerry Jelinek (SpaceId < ACPI_USER_REGION_BEGIN) &&
491*cb565728SJerry Jelinek (SpaceId != ACPI_ADR_SPACE_DATA_TABLE) &&
492*cb565728SJerry Jelinek (SpaceId != ACPI_ADR_SPACE_FIXED_HARDWARE))
493*cb565728SJerry Jelinek {
494*cb565728SJerry Jelinek return (FALSE);
495*cb565728SJerry Jelinek }
496*cb565728SJerry Jelinek
497*cb565728SJerry Jelinek return (TRUE);
498*cb565728SJerry Jelinek }
499*cb565728SJerry Jelinek
500db2bae30SDana Myers #endif
501