utmisc.c revision 1.1 1 1.1 jruoho /*******************************************************************************
2 1.1 jruoho *
3 1.1 jruoho * Module Name: utmisc - common utility procedures
4 1.1 jruoho *
5 1.1 jruoho ******************************************************************************/
6 1.1 jruoho
7 1.1 jruoho /******************************************************************************
8 1.1 jruoho *
9 1.1 jruoho * 1. Copyright Notice
10 1.1 jruoho *
11 1.1 jruoho * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp.
12 1.1 jruoho * All rights reserved.
13 1.1 jruoho *
14 1.1 jruoho * 2. License
15 1.1 jruoho *
16 1.1 jruoho * 2.1. This is your license from Intel Corp. under its intellectual property
17 1.1 jruoho * rights. You may have additional license terms from the party that provided
18 1.1 jruoho * you this software, covering your right to use that party's intellectual
19 1.1 jruoho * property rights.
20 1.1 jruoho *
21 1.1 jruoho * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22 1.1 jruoho * copy of the source code appearing in this file ("Covered Code") an
23 1.1 jruoho * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24 1.1 jruoho * base code distributed originally by Intel ("Original Intel Code") to copy,
25 1.1 jruoho * make derivatives, distribute, use and display any portion of the Covered
26 1.1 jruoho * Code in any form, with the right to sublicense such rights; and
27 1.1 jruoho *
28 1.1 jruoho * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29 1.1 jruoho * license (with the right to sublicense), under only those claims of Intel
30 1.1 jruoho * patents that are infringed by the Original Intel Code, to make, use, sell,
31 1.1 jruoho * offer to sell, and import the Covered Code and derivative works thereof
32 1.1 jruoho * solely to the minimum extent necessary to exercise the above copyright
33 1.1 jruoho * license, and in no event shall the patent license extend to any additions
34 1.1 jruoho * to or modifications of the Original Intel Code. No other license or right
35 1.1 jruoho * is granted directly or by implication, estoppel or otherwise;
36 1.1 jruoho *
37 1.1 jruoho * The above copyright and patent license is granted only if the following
38 1.1 jruoho * conditions are met:
39 1.1 jruoho *
40 1.1 jruoho * 3. Conditions
41 1.1 jruoho *
42 1.1 jruoho * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43 1.1 jruoho * Redistribution of source code of any substantial portion of the Covered
44 1.1 jruoho * Code or modification with rights to further distribute source must include
45 1.1 jruoho * the above Copyright Notice, the above License, this list of Conditions,
46 1.1 jruoho * and the following Disclaimer and Export Compliance provision. In addition,
47 1.1 jruoho * Licensee must cause all Covered Code to which Licensee contributes to
48 1.1 jruoho * contain a file documenting the changes Licensee made to create that Covered
49 1.1 jruoho * Code and the date of any change. Licensee must include in that file the
50 1.1 jruoho * documentation of any changes made by any predecessor Licensee. Licensee
51 1.1 jruoho * must include a prominent statement that the modification is derived,
52 1.1 jruoho * directly or indirectly, from Original Intel Code.
53 1.1 jruoho *
54 1.1 jruoho * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55 1.1 jruoho * Redistribution of source code of any substantial portion of the Covered
56 1.1 jruoho * Code or modification without rights to further distribute source must
57 1.1 jruoho * include the following Disclaimer and Export Compliance provision in the
58 1.1 jruoho * documentation and/or other materials provided with distribution. In
59 1.1 jruoho * addition, Licensee may not authorize further sublicense of source of any
60 1.1 jruoho * portion of the Covered Code, and must include terms to the effect that the
61 1.1 jruoho * license from Licensee to its licensee is limited to the intellectual
62 1.1 jruoho * property embodied in the software Licensee provides to its licensee, and
63 1.1 jruoho * not to intellectual property embodied in modifications its licensee may
64 1.1 jruoho * make.
65 1.1 jruoho *
66 1.1 jruoho * 3.3. Redistribution of Executable. Redistribution in executable form of any
67 1.1 jruoho * substantial portion of the Covered Code or modification must reproduce the
68 1.1 jruoho * above Copyright Notice, and the following Disclaimer and Export Compliance
69 1.1 jruoho * provision in the documentation and/or other materials provided with the
70 1.1 jruoho * distribution.
71 1.1 jruoho *
72 1.1 jruoho * 3.4. Intel retains all right, title, and interest in and to the Original
73 1.1 jruoho * Intel Code.
74 1.1 jruoho *
75 1.1 jruoho * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76 1.1 jruoho * Intel shall be used in advertising or otherwise to promote the sale, use or
77 1.1 jruoho * other dealings in products derived from or relating to the Covered Code
78 1.1 jruoho * without prior written authorization from Intel.
79 1.1 jruoho *
80 1.1 jruoho * 4. Disclaimer and Export Compliance
81 1.1 jruoho *
82 1.1 jruoho * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83 1.1 jruoho * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84 1.1 jruoho * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85 1.1 jruoho * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86 1.1 jruoho * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87 1.1 jruoho * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88 1.1 jruoho * PARTICULAR PURPOSE.
89 1.1 jruoho *
90 1.1 jruoho * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91 1.1 jruoho * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92 1.1 jruoho * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93 1.1 jruoho * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94 1.1 jruoho * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95 1.1 jruoho * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96 1.1 jruoho * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97 1.1 jruoho * LIMITED REMEDY.
98 1.1 jruoho *
99 1.1 jruoho * 4.3. Licensee shall not export, either directly or indirectly, any of this
100 1.1 jruoho * software or system incorporating such software without first obtaining any
101 1.1 jruoho * required license or other approval from the U. S. Department of Commerce or
102 1.1 jruoho * any other agency or department of the United States Government. In the
103 1.1 jruoho * event Licensee exports any such software from the United States or
104 1.1 jruoho * re-exports any such software from a foreign destination, Licensee shall
105 1.1 jruoho * ensure that the distribution and export/re-export of the software is in
106 1.1 jruoho * compliance with all laws, regulations, orders, or other restrictions of the
107 1.1 jruoho * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108 1.1 jruoho * any of its subsidiaries will export/re-export any technical data, process,
109 1.1 jruoho * software, or service, directly or indirectly, to any country for which the
110 1.1 jruoho * United States government or any agency thereof requires an export license,
111 1.1 jruoho * other governmental approval, or letter of assurance, without first obtaining
112 1.1 jruoho * such license, approval or letter.
113 1.1 jruoho *
114 1.1 jruoho *****************************************************************************/
115 1.1 jruoho
116 1.1 jruoho
117 1.1 jruoho #define __UTMISC_C__
118 1.1 jruoho
119 1.1 jruoho #include "acpi.h"
120 1.1 jruoho #include "accommon.h"
121 1.1 jruoho #include "acnamesp.h"
122 1.1 jruoho
123 1.1 jruoho
124 1.1 jruoho #define _COMPONENT ACPI_UTILITIES
125 1.1 jruoho ACPI_MODULE_NAME ("utmisc")
126 1.1 jruoho
127 1.1 jruoho /*
128 1.1 jruoho * Common suffix for messages
129 1.1 jruoho */
130 1.1 jruoho #define ACPI_COMMON_MSG_SUFFIX \
131 1.1 jruoho AcpiOsPrintf (" (%8.8X/%s-%u)\n", ACPI_CA_VERSION, ModuleName, LineNumber)
132 1.1 jruoho
133 1.1 jruoho
134 1.1 jruoho /*******************************************************************************
135 1.1 jruoho *
136 1.1 jruoho * FUNCTION: AcpiUtValidateException
137 1.1 jruoho *
138 1.1 jruoho * PARAMETERS: Status - The ACPI_STATUS code to be formatted
139 1.1 jruoho *
140 1.1 jruoho * RETURN: A string containing the exception text. NULL if exception is
141 1.1 jruoho * not valid.
142 1.1 jruoho *
143 1.1 jruoho * DESCRIPTION: This function validates and translates an ACPI exception into
144 1.1 jruoho * an ASCII string.
145 1.1 jruoho *
146 1.1 jruoho ******************************************************************************/
147 1.1 jruoho
148 1.1 jruoho const char *
149 1.1 jruoho AcpiUtValidateException (
150 1.1 jruoho ACPI_STATUS Status)
151 1.1 jruoho {
152 1.1 jruoho UINT32 SubStatus;
153 1.1 jruoho const char *Exception = NULL;
154 1.1 jruoho
155 1.1 jruoho
156 1.1 jruoho ACPI_FUNCTION_ENTRY ();
157 1.1 jruoho
158 1.1 jruoho
159 1.1 jruoho /*
160 1.1 jruoho * Status is composed of two parts, a "type" and an actual code
161 1.1 jruoho */
162 1.1 jruoho SubStatus = (Status & ~AE_CODE_MASK);
163 1.1 jruoho
164 1.1 jruoho switch (Status & AE_CODE_MASK)
165 1.1 jruoho {
166 1.1 jruoho case AE_CODE_ENVIRONMENTAL:
167 1.1 jruoho
168 1.1 jruoho if (SubStatus <= AE_CODE_ENV_MAX)
169 1.1 jruoho {
170 1.1 jruoho Exception = AcpiGbl_ExceptionNames_Env [SubStatus];
171 1.1 jruoho }
172 1.1 jruoho break;
173 1.1 jruoho
174 1.1 jruoho case AE_CODE_PROGRAMMER:
175 1.1 jruoho
176 1.1 jruoho if (SubStatus <= AE_CODE_PGM_MAX)
177 1.1 jruoho {
178 1.1 jruoho Exception = AcpiGbl_ExceptionNames_Pgm [SubStatus];
179 1.1 jruoho }
180 1.1 jruoho break;
181 1.1 jruoho
182 1.1 jruoho case AE_CODE_ACPI_TABLES:
183 1.1 jruoho
184 1.1 jruoho if (SubStatus <= AE_CODE_TBL_MAX)
185 1.1 jruoho {
186 1.1 jruoho Exception = AcpiGbl_ExceptionNames_Tbl [SubStatus];
187 1.1 jruoho }
188 1.1 jruoho break;
189 1.1 jruoho
190 1.1 jruoho case AE_CODE_AML:
191 1.1 jruoho
192 1.1 jruoho if (SubStatus <= AE_CODE_AML_MAX)
193 1.1 jruoho {
194 1.1 jruoho Exception = AcpiGbl_ExceptionNames_Aml [SubStatus];
195 1.1 jruoho }
196 1.1 jruoho break;
197 1.1 jruoho
198 1.1 jruoho case AE_CODE_CONTROL:
199 1.1 jruoho
200 1.1 jruoho if (SubStatus <= AE_CODE_CTRL_MAX)
201 1.1 jruoho {
202 1.1 jruoho Exception = AcpiGbl_ExceptionNames_Ctrl [SubStatus];
203 1.1 jruoho }
204 1.1 jruoho break;
205 1.1 jruoho
206 1.1 jruoho default:
207 1.1 jruoho break;
208 1.1 jruoho }
209 1.1 jruoho
210 1.1 jruoho return (ACPI_CAST_PTR (const char, Exception));
211 1.1 jruoho }
212 1.1 jruoho
213 1.1 jruoho
214 1.1 jruoho /*******************************************************************************
215 1.1 jruoho *
216 1.1 jruoho * FUNCTION: AcpiUtIsPciRootBridge
217 1.1 jruoho *
218 1.1 jruoho * PARAMETERS: Id - The HID/CID in string format
219 1.1 jruoho *
220 1.1 jruoho * RETURN: TRUE if the Id is a match for a PCI/PCI-Express Root Bridge
221 1.1 jruoho *
222 1.1 jruoho * DESCRIPTION: Determine if the input ID is a PCI Root Bridge ID.
223 1.1 jruoho *
224 1.1 jruoho ******************************************************************************/
225 1.1 jruoho
226 1.1 jruoho BOOLEAN
227 1.1 jruoho AcpiUtIsPciRootBridge (
228 1.1 jruoho char *Id)
229 1.1 jruoho {
230 1.1 jruoho
231 1.1 jruoho /*
232 1.1 jruoho * Check if this is a PCI root bridge.
233 1.1 jruoho * ACPI 3.0+: check for a PCI Express root also.
234 1.1 jruoho */
235 1.1 jruoho if (!(ACPI_STRCMP (Id,
236 1.1 jruoho PCI_ROOT_HID_STRING)) ||
237 1.1 jruoho
238 1.1 jruoho !(ACPI_STRCMP (Id,
239 1.1 jruoho PCI_EXPRESS_ROOT_HID_STRING)))
240 1.1 jruoho {
241 1.1 jruoho return (TRUE);
242 1.1 jruoho }
243 1.1 jruoho
244 1.1 jruoho return (FALSE);
245 1.1 jruoho }
246 1.1 jruoho
247 1.1 jruoho
248 1.1 jruoho /*******************************************************************************
249 1.1 jruoho *
250 1.1 jruoho * FUNCTION: AcpiUtIsAmlTable
251 1.1 jruoho *
252 1.1 jruoho * PARAMETERS: Table - An ACPI table
253 1.1 jruoho *
254 1.1 jruoho * RETURN: TRUE if table contains executable AML; FALSE otherwise
255 1.1 jruoho *
256 1.1 jruoho * DESCRIPTION: Check ACPI Signature for a table that contains AML code.
257 1.1 jruoho * Currently, these are DSDT,SSDT,PSDT. All other table types are
258 1.1 jruoho * data tables that do not contain AML code.
259 1.1 jruoho *
260 1.1 jruoho ******************************************************************************/
261 1.1 jruoho
262 1.1 jruoho BOOLEAN
263 1.1 jruoho AcpiUtIsAmlTable (
264 1.1 jruoho ACPI_TABLE_HEADER *Table)
265 1.1 jruoho {
266 1.1 jruoho
267 1.1 jruoho /* These are the only tables that contain executable AML */
268 1.1 jruoho
269 1.1 jruoho if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_DSDT) ||
270 1.1 jruoho ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_PSDT) ||
271 1.1 jruoho ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_SSDT))
272 1.1 jruoho {
273 1.1 jruoho return (TRUE);
274 1.1 jruoho }
275 1.1 jruoho
276 1.1 jruoho return (FALSE);
277 1.1 jruoho }
278 1.1 jruoho
279 1.1 jruoho
280 1.1 jruoho /*******************************************************************************
281 1.1 jruoho *
282 1.1 jruoho * FUNCTION: AcpiUtAllocateOwnerId
283 1.1 jruoho *
284 1.1 jruoho * PARAMETERS: OwnerId - Where the new owner ID is returned
285 1.1 jruoho *
286 1.1 jruoho * RETURN: Status
287 1.1 jruoho *
288 1.1 jruoho * DESCRIPTION: Allocate a table or method owner ID. The owner ID is used to
289 1.1 jruoho * track objects created by the table or method, to be deleted
290 1.1 jruoho * when the method exits or the table is unloaded.
291 1.1 jruoho *
292 1.1 jruoho ******************************************************************************/
293 1.1 jruoho
294 1.1 jruoho ACPI_STATUS
295 1.1 jruoho AcpiUtAllocateOwnerId (
296 1.1 jruoho ACPI_OWNER_ID *OwnerId)
297 1.1 jruoho {
298 1.1 jruoho UINT32 i;
299 1.1 jruoho UINT32 j;
300 1.1 jruoho UINT32 k;
301 1.1 jruoho ACPI_STATUS Status;
302 1.1 jruoho
303 1.1 jruoho
304 1.1 jruoho ACPI_FUNCTION_TRACE (UtAllocateOwnerId);
305 1.1 jruoho
306 1.1 jruoho
307 1.1 jruoho /* Guard against multiple allocations of ID to the same location */
308 1.1 jruoho
309 1.1 jruoho if (*OwnerId)
310 1.1 jruoho {
311 1.1 jruoho ACPI_ERROR ((AE_INFO, "Owner ID [0x%2.2X] already exists", *OwnerId));
312 1.1 jruoho return_ACPI_STATUS (AE_ALREADY_EXISTS);
313 1.1 jruoho }
314 1.1 jruoho
315 1.1 jruoho /* Mutex for the global ID mask */
316 1.1 jruoho
317 1.1 jruoho Status = AcpiUtAcquireMutex (ACPI_MTX_CACHES);
318 1.1 jruoho if (ACPI_FAILURE (Status))
319 1.1 jruoho {
320 1.1 jruoho return_ACPI_STATUS (Status);
321 1.1 jruoho }
322 1.1 jruoho
323 1.1 jruoho /*
324 1.1 jruoho * Find a free owner ID, cycle through all possible IDs on repeated
325 1.1 jruoho * allocations. (ACPI_NUM_OWNERID_MASKS + 1) because first index may have
326 1.1 jruoho * to be scanned twice.
327 1.1 jruoho */
328 1.1 jruoho for (i = 0, j = AcpiGbl_LastOwnerIdIndex;
329 1.1 jruoho i < (ACPI_NUM_OWNERID_MASKS + 1);
330 1.1 jruoho i++, j++)
331 1.1 jruoho {
332 1.1 jruoho if (j >= ACPI_NUM_OWNERID_MASKS)
333 1.1 jruoho {
334 1.1 jruoho j = 0; /* Wraparound to start of mask array */
335 1.1 jruoho }
336 1.1 jruoho
337 1.1 jruoho for (k = AcpiGbl_NextOwnerIdOffset; k < 32; k++)
338 1.1 jruoho {
339 1.1 jruoho if (AcpiGbl_OwnerIdMask[j] == ACPI_UINT32_MAX)
340 1.1 jruoho {
341 1.1 jruoho /* There are no free IDs in this mask */
342 1.1 jruoho
343 1.1 jruoho break;
344 1.1 jruoho }
345 1.1 jruoho
346 1.1 jruoho if (!(AcpiGbl_OwnerIdMask[j] & (1 << k)))
347 1.1 jruoho {
348 1.1 jruoho /*
349 1.1 jruoho * Found a free ID. The actual ID is the bit index plus one,
350 1.1 jruoho * making zero an invalid Owner ID. Save this as the last ID
351 1.1 jruoho * allocated and update the global ID mask.
352 1.1 jruoho */
353 1.1 jruoho AcpiGbl_OwnerIdMask[j] |= (1 << k);
354 1.1 jruoho
355 1.1 jruoho AcpiGbl_LastOwnerIdIndex = (UINT8) j;
356 1.1 jruoho AcpiGbl_NextOwnerIdOffset = (UINT8) (k + 1);
357 1.1 jruoho
358 1.1 jruoho /*
359 1.1 jruoho * Construct encoded ID from the index and bit position
360 1.1 jruoho *
361 1.1 jruoho * Note: Last [j].k (bit 255) is never used and is marked
362 1.1 jruoho * permanently allocated (prevents +1 overflow)
363 1.1 jruoho */
364 1.1 jruoho *OwnerId = (ACPI_OWNER_ID) ((k + 1) + ACPI_MUL_32 (j));
365 1.1 jruoho
366 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_VALUES,
367 1.1 jruoho "Allocated OwnerId: %2.2X\n", (unsigned int) *OwnerId));
368 1.1 jruoho goto Exit;
369 1.1 jruoho }
370 1.1 jruoho }
371 1.1 jruoho
372 1.1 jruoho AcpiGbl_NextOwnerIdOffset = 0;
373 1.1 jruoho }
374 1.1 jruoho
375 1.1 jruoho /*
376 1.1 jruoho * All OwnerIds have been allocated. This typically should
377 1.1 jruoho * not happen since the IDs are reused after deallocation. The IDs are
378 1.1 jruoho * allocated upon table load (one per table) and method execution, and
379 1.1 jruoho * they are released when a table is unloaded or a method completes
380 1.1 jruoho * execution.
381 1.1 jruoho *
382 1.1 jruoho * If this error happens, there may be very deep nesting of invoked control
383 1.1 jruoho * methods, or there may be a bug where the IDs are not released.
384 1.1 jruoho */
385 1.1 jruoho Status = AE_OWNER_ID_LIMIT;
386 1.1 jruoho ACPI_ERROR ((AE_INFO,
387 1.1 jruoho "Could not allocate new OwnerId (255 max), AE_OWNER_ID_LIMIT"));
388 1.1 jruoho
389 1.1 jruoho Exit:
390 1.1 jruoho (void) AcpiUtReleaseMutex (ACPI_MTX_CACHES);
391 1.1 jruoho return_ACPI_STATUS (Status);
392 1.1 jruoho }
393 1.1 jruoho
394 1.1 jruoho
395 1.1 jruoho /*******************************************************************************
396 1.1 jruoho *
397 1.1 jruoho * FUNCTION: AcpiUtReleaseOwnerId
398 1.1 jruoho *
399 1.1 jruoho * PARAMETERS: OwnerIdPtr - Pointer to a previously allocated OwnerID
400 1.1 jruoho *
401 1.1 jruoho * RETURN: None. No error is returned because we are either exiting a
402 1.1 jruoho * control method or unloading a table. Either way, we would
403 1.1 jruoho * ignore any error anyway.
404 1.1 jruoho *
405 1.1 jruoho * DESCRIPTION: Release a table or method owner ID. Valid IDs are 1 - 255
406 1.1 jruoho *
407 1.1 jruoho ******************************************************************************/
408 1.1 jruoho
409 1.1 jruoho void
410 1.1 jruoho AcpiUtReleaseOwnerId (
411 1.1 jruoho ACPI_OWNER_ID *OwnerIdPtr)
412 1.1 jruoho {
413 1.1 jruoho ACPI_OWNER_ID OwnerId = *OwnerIdPtr;
414 1.1 jruoho ACPI_STATUS Status;
415 1.1 jruoho UINT32 Index;
416 1.1 jruoho UINT32 Bit;
417 1.1 jruoho
418 1.1 jruoho
419 1.1 jruoho ACPI_FUNCTION_TRACE_U32 (UtReleaseOwnerId, OwnerId);
420 1.1 jruoho
421 1.1 jruoho
422 1.1 jruoho /* Always clear the input OwnerId (zero is an invalid ID) */
423 1.1 jruoho
424 1.1 jruoho *OwnerIdPtr = 0;
425 1.1 jruoho
426 1.1 jruoho /* Zero is not a valid OwnerID */
427 1.1 jruoho
428 1.1 jruoho if (OwnerId == 0)
429 1.1 jruoho {
430 1.1 jruoho ACPI_ERROR ((AE_INFO, "Invalid OwnerId: 0x%2.2X", OwnerId));
431 1.1 jruoho return_VOID;
432 1.1 jruoho }
433 1.1 jruoho
434 1.1 jruoho /* Mutex for the global ID mask */
435 1.1 jruoho
436 1.1 jruoho Status = AcpiUtAcquireMutex (ACPI_MTX_CACHES);
437 1.1 jruoho if (ACPI_FAILURE (Status))
438 1.1 jruoho {
439 1.1 jruoho return_VOID;
440 1.1 jruoho }
441 1.1 jruoho
442 1.1 jruoho /* Normalize the ID to zero */
443 1.1 jruoho
444 1.1 jruoho OwnerId--;
445 1.1 jruoho
446 1.1 jruoho /* Decode ID to index/offset pair */
447 1.1 jruoho
448 1.1 jruoho Index = ACPI_DIV_32 (OwnerId);
449 1.1 jruoho Bit = 1 << ACPI_MOD_32 (OwnerId);
450 1.1 jruoho
451 1.1 jruoho /* Free the owner ID only if it is valid */
452 1.1 jruoho
453 1.1 jruoho if (AcpiGbl_OwnerIdMask[Index] & Bit)
454 1.1 jruoho {
455 1.1 jruoho AcpiGbl_OwnerIdMask[Index] ^= Bit;
456 1.1 jruoho }
457 1.1 jruoho else
458 1.1 jruoho {
459 1.1 jruoho ACPI_ERROR ((AE_INFO,
460 1.1 jruoho "Release of non-allocated OwnerId: 0x%2.2X", OwnerId + 1));
461 1.1 jruoho }
462 1.1 jruoho
463 1.1 jruoho (void) AcpiUtReleaseMutex (ACPI_MTX_CACHES);
464 1.1 jruoho return_VOID;
465 1.1 jruoho }
466 1.1 jruoho
467 1.1 jruoho
468 1.1 jruoho /*******************************************************************************
469 1.1 jruoho *
470 1.1 jruoho * FUNCTION: AcpiUtStrupr (strupr)
471 1.1 jruoho *
472 1.1 jruoho * PARAMETERS: SrcString - The source string to convert
473 1.1 jruoho *
474 1.1 jruoho * RETURN: None
475 1.1 jruoho *
476 1.1 jruoho * DESCRIPTION: Convert string to uppercase
477 1.1 jruoho *
478 1.1 jruoho * NOTE: This is not a POSIX function, so it appears here, not in utclib.c
479 1.1 jruoho *
480 1.1 jruoho ******************************************************************************/
481 1.1 jruoho
482 1.1 jruoho void
483 1.1 jruoho AcpiUtStrupr (
484 1.1 jruoho char *SrcString)
485 1.1 jruoho {
486 1.1 jruoho char *String;
487 1.1 jruoho
488 1.1 jruoho
489 1.1 jruoho ACPI_FUNCTION_ENTRY ();
490 1.1 jruoho
491 1.1 jruoho
492 1.1 jruoho if (!SrcString)
493 1.1 jruoho {
494 1.1 jruoho return;
495 1.1 jruoho }
496 1.1 jruoho
497 1.1 jruoho /* Walk entire string, uppercasing the letters */
498 1.1 jruoho
499 1.1 jruoho for (String = SrcString; *String; String++)
500 1.1 jruoho {
501 1.1 jruoho *String = (char) ACPI_TOUPPER (*String);
502 1.1 jruoho }
503 1.1 jruoho
504 1.1 jruoho return;
505 1.1 jruoho }
506 1.1 jruoho
507 1.1 jruoho
508 1.1 jruoho /*******************************************************************************
509 1.1 jruoho *
510 1.1 jruoho * FUNCTION: AcpiUtPrintString
511 1.1 jruoho *
512 1.1 jruoho * PARAMETERS: String - Null terminated ASCII string
513 1.1 jruoho * MaxLength - Maximum output length
514 1.1 jruoho *
515 1.1 jruoho * RETURN: None
516 1.1 jruoho *
517 1.1 jruoho * DESCRIPTION: Dump an ASCII string with support for ACPI-defined escape
518 1.1 jruoho * sequences.
519 1.1 jruoho *
520 1.1 jruoho ******************************************************************************/
521 1.1 jruoho
522 1.1 jruoho void
523 1.1 jruoho AcpiUtPrintString (
524 1.1 jruoho char *String,
525 1.1 jruoho UINT8 MaxLength)
526 1.1 jruoho {
527 1.1 jruoho UINT32 i;
528 1.1 jruoho
529 1.1 jruoho
530 1.1 jruoho if (!String)
531 1.1 jruoho {
532 1.1 jruoho AcpiOsPrintf ("<\"NULL STRING PTR\">");
533 1.1 jruoho return;
534 1.1 jruoho }
535 1.1 jruoho
536 1.1 jruoho AcpiOsPrintf ("\"");
537 1.1 jruoho for (i = 0; String[i] && (i < MaxLength); i++)
538 1.1 jruoho {
539 1.1 jruoho /* Escape sequences */
540 1.1 jruoho
541 1.1 jruoho switch (String[i])
542 1.1 jruoho {
543 1.1 jruoho case 0x07:
544 1.1 jruoho AcpiOsPrintf ("\\a"); /* BELL */
545 1.1 jruoho break;
546 1.1 jruoho
547 1.1 jruoho case 0x08:
548 1.1 jruoho AcpiOsPrintf ("\\b"); /* BACKSPACE */
549 1.1 jruoho break;
550 1.1 jruoho
551 1.1 jruoho case 0x0C:
552 1.1 jruoho AcpiOsPrintf ("\\f"); /* FORMFEED */
553 1.1 jruoho break;
554 1.1 jruoho
555 1.1 jruoho case 0x0A:
556 1.1 jruoho AcpiOsPrintf ("\\n"); /* LINEFEED */
557 1.1 jruoho break;
558 1.1 jruoho
559 1.1 jruoho case 0x0D:
560 1.1 jruoho AcpiOsPrintf ("\\r"); /* CARRIAGE RETURN*/
561 1.1 jruoho break;
562 1.1 jruoho
563 1.1 jruoho case 0x09:
564 1.1 jruoho AcpiOsPrintf ("\\t"); /* HORIZONTAL TAB */
565 1.1 jruoho break;
566 1.1 jruoho
567 1.1 jruoho case 0x0B:
568 1.1 jruoho AcpiOsPrintf ("\\v"); /* VERTICAL TAB */
569 1.1 jruoho break;
570 1.1 jruoho
571 1.1 jruoho case '\'': /* Single Quote */
572 1.1 jruoho case '\"': /* Double Quote */
573 1.1 jruoho case '\\': /* Backslash */
574 1.1 jruoho AcpiOsPrintf ("\\%c", (int) String[i]);
575 1.1 jruoho break;
576 1.1 jruoho
577 1.1 jruoho default:
578 1.1 jruoho
579 1.1 jruoho /* Check for printable character or hex escape */
580 1.1 jruoho
581 1.1 jruoho if (ACPI_IS_PRINT (String[i]))
582 1.1 jruoho {
583 1.1 jruoho /* This is a normal character */
584 1.1 jruoho
585 1.1 jruoho AcpiOsPrintf ("%c", (int) String[i]);
586 1.1 jruoho }
587 1.1 jruoho else
588 1.1 jruoho {
589 1.1 jruoho /* All others will be Hex escapes */
590 1.1 jruoho
591 1.1 jruoho AcpiOsPrintf ("\\x%2.2X", (INT32) String[i]);
592 1.1 jruoho }
593 1.1 jruoho break;
594 1.1 jruoho }
595 1.1 jruoho }
596 1.1 jruoho AcpiOsPrintf ("\"");
597 1.1 jruoho
598 1.1 jruoho if (i == MaxLength && String[i])
599 1.1 jruoho {
600 1.1 jruoho AcpiOsPrintf ("...");
601 1.1 jruoho }
602 1.1 jruoho }
603 1.1 jruoho
604 1.1 jruoho
605 1.1 jruoho /*******************************************************************************
606 1.1 jruoho *
607 1.1 jruoho * FUNCTION: AcpiUtDwordByteSwap
608 1.1 jruoho *
609 1.1 jruoho * PARAMETERS: Value - Value to be converted
610 1.1 jruoho *
611 1.1 jruoho * RETURN: UINT32 integer with bytes swapped
612 1.1 jruoho *
613 1.1 jruoho * DESCRIPTION: Convert a 32-bit value to big-endian (swap the bytes)
614 1.1 jruoho *
615 1.1 jruoho ******************************************************************************/
616 1.1 jruoho
617 1.1 jruoho UINT32
618 1.1 jruoho AcpiUtDwordByteSwap (
619 1.1 jruoho UINT32 Value)
620 1.1 jruoho {
621 1.1 jruoho union
622 1.1 jruoho {
623 1.1 jruoho UINT32 Value;
624 1.1 jruoho UINT8 Bytes[4];
625 1.1 jruoho } Out;
626 1.1 jruoho union
627 1.1 jruoho {
628 1.1 jruoho UINT32 Value;
629 1.1 jruoho UINT8 Bytes[4];
630 1.1 jruoho } In;
631 1.1 jruoho
632 1.1 jruoho
633 1.1 jruoho ACPI_FUNCTION_ENTRY ();
634 1.1 jruoho
635 1.1 jruoho
636 1.1 jruoho In.Value = Value;
637 1.1 jruoho
638 1.1 jruoho Out.Bytes[0] = In.Bytes[3];
639 1.1 jruoho Out.Bytes[1] = In.Bytes[2];
640 1.1 jruoho Out.Bytes[2] = In.Bytes[1];
641 1.1 jruoho Out.Bytes[3] = In.Bytes[0];
642 1.1 jruoho
643 1.1 jruoho return (Out.Value);
644 1.1 jruoho }
645 1.1 jruoho
646 1.1 jruoho
647 1.1 jruoho /*******************************************************************************
648 1.1 jruoho *
649 1.1 jruoho * FUNCTION: AcpiUtSetIntegerWidth
650 1.1 jruoho *
651 1.1 jruoho * PARAMETERS: Revision From DSDT header
652 1.1 jruoho *
653 1.1 jruoho * RETURN: None
654 1.1 jruoho *
655 1.1 jruoho * DESCRIPTION: Set the global integer bit width based upon the revision
656 1.1 jruoho * of the DSDT. For Revision 1 and 0, Integers are 32 bits.
657 1.1 jruoho * For Revision 2 and above, Integers are 64 bits. Yes, this
658 1.1 jruoho * makes a difference.
659 1.1 jruoho *
660 1.1 jruoho ******************************************************************************/
661 1.1 jruoho
662 1.1 jruoho void
663 1.1 jruoho AcpiUtSetIntegerWidth (
664 1.1 jruoho UINT8 Revision)
665 1.1 jruoho {
666 1.1 jruoho
667 1.1 jruoho if (Revision < 2)
668 1.1 jruoho {
669 1.1 jruoho /* 32-bit case */
670 1.1 jruoho
671 1.1 jruoho AcpiGbl_IntegerBitWidth = 32;
672 1.1 jruoho AcpiGbl_IntegerNybbleWidth = 8;
673 1.1 jruoho AcpiGbl_IntegerByteWidth = 4;
674 1.1 jruoho }
675 1.1 jruoho else
676 1.1 jruoho {
677 1.1 jruoho /* 64-bit case (ACPI 2.0+) */
678 1.1 jruoho
679 1.1 jruoho AcpiGbl_IntegerBitWidth = 64;
680 1.1 jruoho AcpiGbl_IntegerNybbleWidth = 16;
681 1.1 jruoho AcpiGbl_IntegerByteWidth = 8;
682 1.1 jruoho }
683 1.1 jruoho }
684 1.1 jruoho
685 1.1 jruoho
686 1.1 jruoho #ifdef ACPI_DEBUG_OUTPUT
687 1.1 jruoho /*******************************************************************************
688 1.1 jruoho *
689 1.1 jruoho * FUNCTION: AcpiUtDisplayInitPathname
690 1.1 jruoho *
691 1.1 jruoho * PARAMETERS: Type - Object type of the node
692 1.1 jruoho * ObjHandle - Handle whose pathname will be displayed
693 1.1 jruoho * Path - Additional path string to be appended.
694 1.1 jruoho * (NULL if no extra path)
695 1.1 jruoho *
696 1.1 jruoho * RETURN: ACPI_STATUS
697 1.1 jruoho *
698 1.1 jruoho * DESCRIPTION: Display full pathname of an object, DEBUG ONLY
699 1.1 jruoho *
700 1.1 jruoho ******************************************************************************/
701 1.1 jruoho
702 1.1 jruoho void
703 1.1 jruoho AcpiUtDisplayInitPathname (
704 1.1 jruoho UINT8 Type,
705 1.1 jruoho ACPI_NAMESPACE_NODE *ObjHandle,
706 1.1 jruoho char *Path)
707 1.1 jruoho {
708 1.1 jruoho ACPI_STATUS Status;
709 1.1 jruoho ACPI_BUFFER Buffer;
710 1.1 jruoho
711 1.1 jruoho
712 1.1 jruoho ACPI_FUNCTION_ENTRY ();
713 1.1 jruoho
714 1.1 jruoho
715 1.1 jruoho /* Only print the path if the appropriate debug level is enabled */
716 1.1 jruoho
717 1.1 jruoho if (!(AcpiDbgLevel & ACPI_LV_INIT_NAMES))
718 1.1 jruoho {
719 1.1 jruoho return;
720 1.1 jruoho }
721 1.1 jruoho
722 1.1 jruoho /* Get the full pathname to the node */
723 1.1 jruoho
724 1.1 jruoho Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
725 1.1 jruoho Status = AcpiNsHandleToPathname (ObjHandle, &Buffer);
726 1.1 jruoho if (ACPI_FAILURE (Status))
727 1.1 jruoho {
728 1.1 jruoho return;
729 1.1 jruoho }
730 1.1 jruoho
731 1.1 jruoho /* Print what we're doing */
732 1.1 jruoho
733 1.1 jruoho switch (Type)
734 1.1 jruoho {
735 1.1 jruoho case ACPI_TYPE_METHOD:
736 1.1 jruoho AcpiOsPrintf ("Executing ");
737 1.1 jruoho break;
738 1.1 jruoho
739 1.1 jruoho default:
740 1.1 jruoho AcpiOsPrintf ("Initializing ");
741 1.1 jruoho break;
742 1.1 jruoho }
743 1.1 jruoho
744 1.1 jruoho /* Print the object type and pathname */
745 1.1 jruoho
746 1.1 jruoho AcpiOsPrintf ("%-12s %s",
747 1.1 jruoho AcpiUtGetTypeName (Type), (char *) Buffer.Pointer);
748 1.1 jruoho
749 1.1 jruoho /* Extra path is used to append names like _STA, _INI, etc. */
750 1.1 jruoho
751 1.1 jruoho if (Path)
752 1.1 jruoho {
753 1.1 jruoho AcpiOsPrintf (".%s", Path);
754 1.1 jruoho }
755 1.1 jruoho AcpiOsPrintf ("\n");
756 1.1 jruoho
757 1.1 jruoho ACPI_FREE (Buffer.Pointer);
758 1.1 jruoho }
759 1.1 jruoho #endif
760 1.1 jruoho
761 1.1 jruoho
762 1.1 jruoho /*******************************************************************************
763 1.1 jruoho *
764 1.1 jruoho * FUNCTION: AcpiUtValidAcpiChar
765 1.1 jruoho *
766 1.1 jruoho * PARAMETERS: Char - The character to be examined
767 1.1 jruoho * Position - Byte position (0-3)
768 1.1 jruoho *
769 1.1 jruoho * RETURN: TRUE if the character is valid, FALSE otherwise
770 1.1 jruoho *
771 1.1 jruoho * DESCRIPTION: Check for a valid ACPI character. Must be one of:
772 1.1 jruoho * 1) Upper case alpha
773 1.1 jruoho * 2) numeric
774 1.1 jruoho * 3) underscore
775 1.1 jruoho *
776 1.1 jruoho * We allow a '!' as the last character because of the ASF! table
777 1.1 jruoho *
778 1.1 jruoho ******************************************************************************/
779 1.1 jruoho
780 1.1 jruoho BOOLEAN
781 1.1 jruoho AcpiUtValidAcpiChar (
782 1.1 jruoho char Character,
783 1.1 jruoho UINT32 Position)
784 1.1 jruoho {
785 1.1 jruoho
786 1.1 jruoho if (!((Character >= 'A' && Character <= 'Z') ||
787 1.1 jruoho (Character >= '0' && Character <= '9') ||
788 1.1 jruoho (Character == '_')))
789 1.1 jruoho {
790 1.1 jruoho /* Allow a '!' in the last position */
791 1.1 jruoho
792 1.1 jruoho if (Character == '!' && Position == 3)
793 1.1 jruoho {
794 1.1 jruoho return (TRUE);
795 1.1 jruoho }
796 1.1 jruoho
797 1.1 jruoho return (FALSE);
798 1.1 jruoho }
799 1.1 jruoho
800 1.1 jruoho return (TRUE);
801 1.1 jruoho }
802 1.1 jruoho
803 1.1 jruoho
804 1.1 jruoho /*******************************************************************************
805 1.1 jruoho *
806 1.1 jruoho * FUNCTION: AcpiUtValidAcpiName
807 1.1 jruoho *
808 1.1 jruoho * PARAMETERS: Name - The name to be examined
809 1.1 jruoho *
810 1.1 jruoho * RETURN: TRUE if the name is valid, FALSE otherwise
811 1.1 jruoho *
812 1.1 jruoho * DESCRIPTION: Check for a valid ACPI name. Each character must be one of:
813 1.1 jruoho * 1) Upper case alpha
814 1.1 jruoho * 2) numeric
815 1.1 jruoho * 3) underscore
816 1.1 jruoho *
817 1.1 jruoho ******************************************************************************/
818 1.1 jruoho
819 1.1 jruoho BOOLEAN
820 1.1 jruoho AcpiUtValidAcpiName (
821 1.1 jruoho UINT32 Name)
822 1.1 jruoho {
823 1.1 jruoho UINT32 i;
824 1.1 jruoho
825 1.1 jruoho
826 1.1 jruoho ACPI_FUNCTION_ENTRY ();
827 1.1 jruoho
828 1.1 jruoho
829 1.1 jruoho for (i = 0; i < ACPI_NAME_SIZE; i++)
830 1.1 jruoho {
831 1.1 jruoho if (!AcpiUtValidAcpiChar ((ACPI_CAST_PTR (char, &Name))[i], i))
832 1.1 jruoho {
833 1.1 jruoho return (FALSE);
834 1.1 jruoho }
835 1.1 jruoho }
836 1.1 jruoho
837 1.1 jruoho return (TRUE);
838 1.1 jruoho }
839 1.1 jruoho
840 1.1 jruoho
841 1.1 jruoho /*******************************************************************************
842 1.1 jruoho *
843 1.1 jruoho * FUNCTION: AcpiUtRepairName
844 1.1 jruoho *
845 1.1 jruoho * PARAMETERS: Name - The ACPI name to be repaired
846 1.1 jruoho *
847 1.1 jruoho * RETURN: Repaired version of the name
848 1.1 jruoho *
849 1.1 jruoho * DESCRIPTION: Repair an ACPI name: Change invalid characters to '*' and
850 1.1 jruoho * return the new name. NOTE: the Name parameter must reside in
851 1.1 jruoho * read/write memory, cannot be a const.
852 1.1 jruoho *
853 1.1 jruoho * An ACPI Name must consist of valid ACPI characters. We will repair the name
854 1.1 jruoho * if necessary because we don't want to abort because of this, but we want
855 1.1 jruoho * all namespace names to be printable. A warning message is appropriate.
856 1.1 jruoho *
857 1.1 jruoho * This issue came up because there are in fact machines that exhibit
858 1.1 jruoho * this problem, and we want to be able to enable ACPI support for them,
859 1.1 jruoho * even though there are a few bad names.
860 1.1 jruoho *
861 1.1 jruoho ******************************************************************************/
862 1.1 jruoho
863 1.1 jruoho void
864 1.1 jruoho AcpiUtRepairName (
865 1.1 jruoho char *Name)
866 1.1 jruoho {
867 1.1 jruoho UINT32 i;
868 1.1 jruoho BOOLEAN FoundBadChar = FALSE;
869 1.1 jruoho
870 1.1 jruoho
871 1.1 jruoho ACPI_FUNCTION_NAME (UtRepairName);
872 1.1 jruoho
873 1.1 jruoho
874 1.1 jruoho /* Check each character in the name */
875 1.1 jruoho
876 1.1 jruoho for (i = 0; i < ACPI_NAME_SIZE; i++)
877 1.1 jruoho {
878 1.1 jruoho if (AcpiUtValidAcpiChar (Name[i], i))
879 1.1 jruoho {
880 1.1 jruoho continue;
881 1.1 jruoho }
882 1.1 jruoho
883 1.1 jruoho /*
884 1.1 jruoho * Replace a bad character with something printable, yet technically
885 1.1 jruoho * still invalid. This prevents any collisions with existing "good"
886 1.1 jruoho * names in the namespace.
887 1.1 jruoho */
888 1.1 jruoho Name[i] = '*';
889 1.1 jruoho FoundBadChar = TRUE;
890 1.1 jruoho }
891 1.1 jruoho
892 1.1 jruoho if (FoundBadChar)
893 1.1 jruoho {
894 1.1 jruoho /* Report warning only if in strict mode or debug mode */
895 1.1 jruoho
896 1.1 jruoho if (!AcpiGbl_EnableInterpreterSlack)
897 1.1 jruoho {
898 1.1 jruoho ACPI_WARNING ((AE_INFO,
899 1.1 jruoho "Found bad character(s) in name, repaired: [%4.4s]\n", Name));
900 1.1 jruoho }
901 1.1 jruoho else
902 1.1 jruoho {
903 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
904 1.1 jruoho "Found bad character(s) in name, repaired: [%4.4s]\n", Name));
905 1.1 jruoho }
906 1.1 jruoho }
907 1.1 jruoho }
908 1.1 jruoho
909 1.1 jruoho
910 1.1 jruoho /*******************************************************************************
911 1.1 jruoho *
912 1.1 jruoho * FUNCTION: AcpiUtStrtoul64
913 1.1 jruoho *
914 1.1 jruoho * PARAMETERS: String - Null terminated string
915 1.1 jruoho * Base - Radix of the string: 16 or ACPI_ANY_BASE;
916 1.1 jruoho * ACPI_ANY_BASE means 'in behalf of ToInteger'
917 1.1 jruoho * RetInteger - Where the converted integer is returned
918 1.1 jruoho *
919 1.1 jruoho * RETURN: Status and Converted value
920 1.1 jruoho *
921 1.1 jruoho * DESCRIPTION: Convert a string into an unsigned value. Performs either a
922 1.1 jruoho * 32-bit or 64-bit conversion, depending on the current mode
923 1.1 jruoho * of the interpreter.
924 1.1 jruoho * NOTE: Does not support Octal strings, not needed.
925 1.1 jruoho *
926 1.1 jruoho ******************************************************************************/
927 1.1 jruoho
928 1.1 jruoho ACPI_STATUS
929 1.1 jruoho AcpiUtStrtoul64 (
930 1.1 jruoho char *String,
931 1.1 jruoho UINT32 Base,
932 1.1 jruoho UINT64 *RetInteger)
933 1.1 jruoho {
934 1.1 jruoho UINT32 ThisDigit = 0;
935 1.1 jruoho UINT64 ReturnValue = 0;
936 1.1 jruoho UINT64 Quotient;
937 1.1 jruoho UINT64 Dividend;
938 1.1 jruoho UINT32 ToIntegerOp = (Base == ACPI_ANY_BASE);
939 1.1 jruoho UINT32 Mode32 = (AcpiGbl_IntegerByteWidth == 4);
940 1.1 jruoho UINT8 ValidDigits = 0;
941 1.1 jruoho UINT8 SignOf0x = 0;
942 1.1 jruoho UINT8 Term = 0;
943 1.1 jruoho
944 1.1 jruoho
945 1.1 jruoho ACPI_FUNCTION_TRACE_STR (UtStroul64, String);
946 1.1 jruoho
947 1.1 jruoho
948 1.1 jruoho switch (Base)
949 1.1 jruoho {
950 1.1 jruoho case ACPI_ANY_BASE:
951 1.1 jruoho case 16:
952 1.1 jruoho break;
953 1.1 jruoho
954 1.1 jruoho default:
955 1.1 jruoho /* Invalid Base */
956 1.1 jruoho return_ACPI_STATUS (AE_BAD_PARAMETER);
957 1.1 jruoho }
958 1.1 jruoho
959 1.1 jruoho if (!String)
960 1.1 jruoho {
961 1.1 jruoho goto ErrorExit;
962 1.1 jruoho }
963 1.1 jruoho
964 1.1 jruoho /* Skip over any white space in the buffer */
965 1.1 jruoho
966 1.1 jruoho while ((*String) && (ACPI_IS_SPACE (*String) || *String == '\t'))
967 1.1 jruoho {
968 1.1 jruoho String++;
969 1.1 jruoho }
970 1.1 jruoho
971 1.1 jruoho if (ToIntegerOp)
972 1.1 jruoho {
973 1.1 jruoho /*
974 1.1 jruoho * Base equal to ACPI_ANY_BASE means 'ToInteger operation case'.
975 1.1 jruoho * We need to determine if it is decimal or hexadecimal.
976 1.1 jruoho */
977 1.1 jruoho if ((*String == '0') && (ACPI_TOLOWER (*(String + 1)) == 'x'))
978 1.1 jruoho {
979 1.1 jruoho SignOf0x = 1;
980 1.1 jruoho Base = 16;
981 1.1 jruoho
982 1.1 jruoho /* Skip over the leading '0x' */
983 1.1 jruoho String += 2;
984 1.1 jruoho }
985 1.1 jruoho else
986 1.1 jruoho {
987 1.1 jruoho Base = 10;
988 1.1 jruoho }
989 1.1 jruoho }
990 1.1 jruoho
991 1.1 jruoho /* Any string left? Check that '0x' is not followed by white space. */
992 1.1 jruoho
993 1.1 jruoho if (!(*String) || ACPI_IS_SPACE (*String) || *String == '\t')
994 1.1 jruoho {
995 1.1 jruoho if (ToIntegerOp)
996 1.1 jruoho {
997 1.1 jruoho goto ErrorExit;
998 1.1 jruoho }
999 1.1 jruoho else
1000 1.1 jruoho {
1001 1.1 jruoho goto AllDone;
1002 1.1 jruoho }
1003 1.1 jruoho }
1004 1.1 jruoho
1005 1.1 jruoho /*
1006 1.1 jruoho * Perform a 32-bit or 64-bit conversion, depending upon the current
1007 1.1 jruoho * execution mode of the interpreter
1008 1.1 jruoho */
1009 1.1 jruoho Dividend = (Mode32) ? ACPI_UINT32_MAX : ACPI_UINT64_MAX;
1010 1.1 jruoho
1011 1.1 jruoho /* Main loop: convert the string to a 32- or 64-bit integer */
1012 1.1 jruoho
1013 1.1 jruoho while (*String)
1014 1.1 jruoho {
1015 1.1 jruoho if (ACPI_IS_DIGIT (*String))
1016 1.1 jruoho {
1017 1.1 jruoho /* Convert ASCII 0-9 to Decimal value */
1018 1.1 jruoho
1019 1.1 jruoho ThisDigit = ((UINT8) *String) - '0';
1020 1.1 jruoho }
1021 1.1 jruoho else if (Base == 10)
1022 1.1 jruoho {
1023 1.1 jruoho /* Digit is out of range; possible in ToInteger case only */
1024 1.1 jruoho
1025 1.1 jruoho Term = 1;
1026 1.1 jruoho }
1027 1.1 jruoho else
1028 1.1 jruoho {
1029 1.1 jruoho ThisDigit = (UINT8) ACPI_TOUPPER (*String);
1030 1.1 jruoho if (ACPI_IS_XDIGIT ((char) ThisDigit))
1031 1.1 jruoho {
1032 1.1 jruoho /* Convert ASCII Hex char to value */
1033 1.1 jruoho
1034 1.1 jruoho ThisDigit = ThisDigit - 'A' + 10;
1035 1.1 jruoho }
1036 1.1 jruoho else
1037 1.1 jruoho {
1038 1.1 jruoho Term = 1;
1039 1.1 jruoho }
1040 1.1 jruoho }
1041 1.1 jruoho
1042 1.1 jruoho if (Term)
1043 1.1 jruoho {
1044 1.1 jruoho if (ToIntegerOp)
1045 1.1 jruoho {
1046 1.1 jruoho goto ErrorExit;
1047 1.1 jruoho }
1048 1.1 jruoho else
1049 1.1 jruoho {
1050 1.1 jruoho break;
1051 1.1 jruoho }
1052 1.1 jruoho }
1053 1.1 jruoho else if ((ValidDigits == 0) && (ThisDigit == 0) && !SignOf0x)
1054 1.1 jruoho {
1055 1.1 jruoho /* Skip zeros */
1056 1.1 jruoho String++;
1057 1.1 jruoho continue;
1058 1.1 jruoho }
1059 1.1 jruoho
1060 1.1 jruoho ValidDigits++;
1061 1.1 jruoho
1062 1.1 jruoho if (SignOf0x && ((ValidDigits > 16) || ((ValidDigits > 8) && Mode32)))
1063 1.1 jruoho {
1064 1.1 jruoho /*
1065 1.1 jruoho * This is ToInteger operation case.
1066 1.1 jruoho * No any restrictions for string-to-integer conversion,
1067 1.1 jruoho * see ACPI spec.
1068 1.1 jruoho */
1069 1.1 jruoho goto ErrorExit;
1070 1.1 jruoho }
1071 1.1 jruoho
1072 1.1 jruoho /* Divide the digit into the correct position */
1073 1.1 jruoho
1074 1.1 jruoho (void) AcpiUtShortDivide ((Dividend - (UINT64) ThisDigit),
1075 1.1 jruoho Base, &Quotient, NULL);
1076 1.1 jruoho
1077 1.1 jruoho if (ReturnValue > Quotient)
1078 1.1 jruoho {
1079 1.1 jruoho if (ToIntegerOp)
1080 1.1 jruoho {
1081 1.1 jruoho goto ErrorExit;
1082 1.1 jruoho }
1083 1.1 jruoho else
1084 1.1 jruoho {
1085 1.1 jruoho break;
1086 1.1 jruoho }
1087 1.1 jruoho }
1088 1.1 jruoho
1089 1.1 jruoho ReturnValue *= Base;
1090 1.1 jruoho ReturnValue += ThisDigit;
1091 1.1 jruoho String++;
1092 1.1 jruoho }
1093 1.1 jruoho
1094 1.1 jruoho /* All done, normal exit */
1095 1.1 jruoho
1096 1.1 jruoho AllDone:
1097 1.1 jruoho
1098 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Converted value: %8.8X%8.8X\n",
1099 1.1 jruoho ACPI_FORMAT_UINT64 (ReturnValue)));
1100 1.1 jruoho
1101 1.1 jruoho *RetInteger = ReturnValue;
1102 1.1 jruoho return_ACPI_STATUS (AE_OK);
1103 1.1 jruoho
1104 1.1 jruoho
1105 1.1 jruoho ErrorExit:
1106 1.1 jruoho /* Base was set/validated above */
1107 1.1 jruoho
1108 1.1 jruoho if (Base == 10)
1109 1.1 jruoho {
1110 1.1 jruoho return_ACPI_STATUS (AE_BAD_DECIMAL_CONSTANT);
1111 1.1 jruoho }
1112 1.1 jruoho else
1113 1.1 jruoho {
1114 1.1 jruoho return_ACPI_STATUS (AE_BAD_HEX_CONSTANT);
1115 1.1 jruoho }
1116 1.1 jruoho }
1117 1.1 jruoho
1118 1.1 jruoho
1119 1.1 jruoho /*******************************************************************************
1120 1.1 jruoho *
1121 1.1 jruoho * FUNCTION: AcpiUtCreateUpdateStateAndPush
1122 1.1 jruoho *
1123 1.1 jruoho * PARAMETERS: Object - Object to be added to the new state
1124 1.1 jruoho * Action - Increment/Decrement
1125 1.1 jruoho * StateList - List the state will be added to
1126 1.1 jruoho *
1127 1.1 jruoho * RETURN: Status
1128 1.1 jruoho *
1129 1.1 jruoho * DESCRIPTION: Create a new state and push it
1130 1.1 jruoho *
1131 1.1 jruoho ******************************************************************************/
1132 1.1 jruoho
1133 1.1 jruoho ACPI_STATUS
1134 1.1 jruoho AcpiUtCreateUpdateStateAndPush (
1135 1.1 jruoho ACPI_OPERAND_OBJECT *Object,
1136 1.1 jruoho UINT16 Action,
1137 1.1 jruoho ACPI_GENERIC_STATE **StateList)
1138 1.1 jruoho {
1139 1.1 jruoho ACPI_GENERIC_STATE *State;
1140 1.1 jruoho
1141 1.1 jruoho
1142 1.1 jruoho ACPI_FUNCTION_ENTRY ();
1143 1.1 jruoho
1144 1.1 jruoho
1145 1.1 jruoho /* Ignore null objects; these are expected */
1146 1.1 jruoho
1147 1.1 jruoho if (!Object)
1148 1.1 jruoho {
1149 1.1 jruoho return (AE_OK);
1150 1.1 jruoho }
1151 1.1 jruoho
1152 1.1 jruoho State = AcpiUtCreateUpdateState (Object, Action);
1153 1.1 jruoho if (!State)
1154 1.1 jruoho {
1155 1.1 jruoho return (AE_NO_MEMORY);
1156 1.1 jruoho }
1157 1.1 jruoho
1158 1.1 jruoho AcpiUtPushGenericState (StateList, State);
1159 1.1 jruoho return (AE_OK);
1160 1.1 jruoho }
1161 1.1 jruoho
1162 1.1 jruoho
1163 1.1 jruoho /*******************************************************************************
1164 1.1 jruoho *
1165 1.1 jruoho * FUNCTION: AcpiUtWalkPackageTree
1166 1.1 jruoho *
1167 1.1 jruoho * PARAMETERS: SourceObject - The package to walk
1168 1.1 jruoho * TargetObject - Target object (if package is being copied)
1169 1.1 jruoho * WalkCallback - Called once for each package element
1170 1.1 jruoho * Context - Passed to the callback function
1171 1.1 jruoho *
1172 1.1 jruoho * RETURN: Status
1173 1.1 jruoho *
1174 1.1 jruoho * DESCRIPTION: Walk through a package
1175 1.1 jruoho *
1176 1.1 jruoho ******************************************************************************/
1177 1.1 jruoho
1178 1.1 jruoho ACPI_STATUS
1179 1.1 jruoho AcpiUtWalkPackageTree (
1180 1.1 jruoho ACPI_OPERAND_OBJECT *SourceObject,
1181 1.1 jruoho void *TargetObject,
1182 1.1 jruoho ACPI_PKG_CALLBACK WalkCallback,
1183 1.1 jruoho void *Context)
1184 1.1 jruoho {
1185 1.1 jruoho ACPI_STATUS Status = AE_OK;
1186 1.1 jruoho ACPI_GENERIC_STATE *StateList = NULL;
1187 1.1 jruoho ACPI_GENERIC_STATE *State;
1188 1.1 jruoho UINT32 ThisIndex;
1189 1.1 jruoho ACPI_OPERAND_OBJECT *ThisSourceObj;
1190 1.1 jruoho
1191 1.1 jruoho
1192 1.1 jruoho ACPI_FUNCTION_TRACE (UtWalkPackageTree);
1193 1.1 jruoho
1194 1.1 jruoho
1195 1.1 jruoho State = AcpiUtCreatePkgState (SourceObject, TargetObject, 0);
1196 1.1 jruoho if (!State)
1197 1.1 jruoho {
1198 1.1 jruoho return_ACPI_STATUS (AE_NO_MEMORY);
1199 1.1 jruoho }
1200 1.1 jruoho
1201 1.1 jruoho while (State)
1202 1.1 jruoho {
1203 1.1 jruoho /* Get one element of the package */
1204 1.1 jruoho
1205 1.1 jruoho ThisIndex = State->Pkg.Index;
1206 1.1 jruoho ThisSourceObj = (ACPI_OPERAND_OBJECT *)
1207 1.1 jruoho State->Pkg.SourceObject->Package.Elements[ThisIndex];
1208 1.1 jruoho
1209 1.1 jruoho /*
1210 1.1 jruoho * Check for:
1211 1.1 jruoho * 1) An uninitialized package element. It is completely
1212 1.1 jruoho * legal to declare a package and leave it uninitialized
1213 1.1 jruoho * 2) Not an internal object - can be a namespace node instead
1214 1.1 jruoho * 3) Any type other than a package. Packages are handled in else
1215 1.1 jruoho * case below.
1216 1.1 jruoho */
1217 1.1 jruoho if ((!ThisSourceObj) ||
1218 1.1 jruoho (ACPI_GET_DESCRIPTOR_TYPE (ThisSourceObj) != ACPI_DESC_TYPE_OPERAND) ||
1219 1.1 jruoho (ThisSourceObj->Common.Type != ACPI_TYPE_PACKAGE))
1220 1.1 jruoho {
1221 1.1 jruoho Status = WalkCallback (ACPI_COPY_TYPE_SIMPLE, ThisSourceObj,
1222 1.1 jruoho State, Context);
1223 1.1 jruoho if (ACPI_FAILURE (Status))
1224 1.1 jruoho {
1225 1.1 jruoho return_ACPI_STATUS (Status);
1226 1.1 jruoho }
1227 1.1 jruoho
1228 1.1 jruoho State->Pkg.Index++;
1229 1.1 jruoho while (State->Pkg.Index >= State->Pkg.SourceObject->Package.Count)
1230 1.1 jruoho {
1231 1.1 jruoho /*
1232 1.1 jruoho * We've handled all of the objects at this level, This means
1233 1.1 jruoho * that we have just completed a package. That package may
1234 1.1 jruoho * have contained one or more packages itself.
1235 1.1 jruoho *
1236 1.1 jruoho * Delete this state and pop the previous state (package).
1237 1.1 jruoho */
1238 1.1 jruoho AcpiUtDeleteGenericState (State);
1239 1.1 jruoho State = AcpiUtPopGenericState (&StateList);
1240 1.1 jruoho
1241 1.1 jruoho /* Finished when there are no more states */
1242 1.1 jruoho
1243 1.1 jruoho if (!State)
1244 1.1 jruoho {
1245 1.1 jruoho /*
1246 1.1 jruoho * We have handled all of the objects in the top level
1247 1.1 jruoho * package just add the length of the package objects
1248 1.1 jruoho * and exit
1249 1.1 jruoho */
1250 1.1 jruoho return_ACPI_STATUS (AE_OK);
1251 1.1 jruoho }
1252 1.1 jruoho
1253 1.1 jruoho /*
1254 1.1 jruoho * Go back up a level and move the index past the just
1255 1.1 jruoho * completed package object.
1256 1.1 jruoho */
1257 1.1 jruoho State->Pkg.Index++;
1258 1.1 jruoho }
1259 1.1 jruoho }
1260 1.1 jruoho else
1261 1.1 jruoho {
1262 1.1 jruoho /* This is a subobject of type package */
1263 1.1 jruoho
1264 1.1 jruoho Status = WalkCallback (ACPI_COPY_TYPE_PACKAGE, ThisSourceObj,
1265 1.1 jruoho State, Context);
1266 1.1 jruoho if (ACPI_FAILURE (Status))
1267 1.1 jruoho {
1268 1.1 jruoho return_ACPI_STATUS (Status);
1269 1.1 jruoho }
1270 1.1 jruoho
1271 1.1 jruoho /*
1272 1.1 jruoho * Push the current state and create a new one
1273 1.1 jruoho * The callback above returned a new target package object.
1274 1.1 jruoho */
1275 1.1 jruoho AcpiUtPushGenericState (&StateList, State);
1276 1.1 jruoho State = AcpiUtCreatePkgState (ThisSourceObj,
1277 1.1 jruoho State->Pkg.ThisTargetObj, 0);
1278 1.1 jruoho if (!State)
1279 1.1 jruoho {
1280 1.1 jruoho /* Free any stacked Update State objects */
1281 1.1 jruoho
1282 1.1 jruoho while (StateList)
1283 1.1 jruoho {
1284 1.1 jruoho State = AcpiUtPopGenericState (&StateList);
1285 1.1 jruoho AcpiUtDeleteGenericState (State);
1286 1.1 jruoho }
1287 1.1 jruoho return_ACPI_STATUS (AE_NO_MEMORY);
1288 1.1 jruoho }
1289 1.1 jruoho }
1290 1.1 jruoho }
1291 1.1 jruoho
1292 1.1 jruoho /* We should never get here */
1293 1.1 jruoho
1294 1.1 jruoho return_ACPI_STATUS (AE_AML_INTERNAL);
1295 1.1 jruoho }
1296 1.1 jruoho
1297 1.1 jruoho
1298 1.1 jruoho /*******************************************************************************
1299 1.1 jruoho *
1300 1.1 jruoho * FUNCTION: AcpiError, AcpiException, AcpiWarning, AcpiInfo
1301 1.1 jruoho *
1302 1.1 jruoho * PARAMETERS: ModuleName - Caller's module name (for error output)
1303 1.1 jruoho * LineNumber - Caller's line number (for error output)
1304 1.1 jruoho * Format - Printf format string + additional args
1305 1.1 jruoho *
1306 1.1 jruoho * RETURN: None
1307 1.1 jruoho *
1308 1.1 jruoho * DESCRIPTION: Print message with module/line/version info
1309 1.1 jruoho *
1310 1.1 jruoho ******************************************************************************/
1311 1.1 jruoho
1312 1.1 jruoho void ACPI_INTERNAL_VAR_XFACE
1313 1.1 jruoho AcpiError (
1314 1.1 jruoho const char *ModuleName,
1315 1.1 jruoho UINT32 LineNumber,
1316 1.1 jruoho const char *Format,
1317 1.1 jruoho ...)
1318 1.1 jruoho {
1319 1.1 jruoho va_list args;
1320 1.1 jruoho
1321 1.1 jruoho
1322 1.1 jruoho AcpiOsPrintf ("ACPI Error: ");
1323 1.1 jruoho
1324 1.1 jruoho va_start (args, Format);
1325 1.1 jruoho AcpiOsVprintf (Format, args);
1326 1.1 jruoho ACPI_COMMON_MSG_SUFFIX;
1327 1.1 jruoho va_end (args);
1328 1.1 jruoho }
1329 1.1 jruoho
1330 1.1 jruoho void ACPI_INTERNAL_VAR_XFACE
1331 1.1 jruoho AcpiException (
1332 1.1 jruoho const char *ModuleName,
1333 1.1 jruoho UINT32 LineNumber,
1334 1.1 jruoho ACPI_STATUS Status,
1335 1.1 jruoho const char *Format,
1336 1.1 jruoho ...)
1337 1.1 jruoho {
1338 1.1 jruoho va_list args;
1339 1.1 jruoho
1340 1.1 jruoho
1341 1.1 jruoho AcpiOsPrintf ("ACPI Exception: %s, ", AcpiFormatException (Status));
1342 1.1 jruoho
1343 1.1 jruoho va_start (args, Format);
1344 1.1 jruoho AcpiOsVprintf (Format, args);
1345 1.1 jruoho ACPI_COMMON_MSG_SUFFIX;
1346 1.1 jruoho va_end (args);
1347 1.1 jruoho }
1348 1.1 jruoho
1349 1.1 jruoho void ACPI_INTERNAL_VAR_XFACE
1350 1.1 jruoho AcpiWarning (
1351 1.1 jruoho const char *ModuleName,
1352 1.1 jruoho UINT32 LineNumber,
1353 1.1 jruoho const char *Format,
1354 1.1 jruoho ...)
1355 1.1 jruoho {
1356 1.1 jruoho va_list args;
1357 1.1 jruoho
1358 1.1 jruoho
1359 1.1 jruoho AcpiOsPrintf ("ACPI Warning: ");
1360 1.1 jruoho
1361 1.1 jruoho va_start (args, Format);
1362 1.1 jruoho AcpiOsVprintf (Format, args);
1363 1.1 jruoho ACPI_COMMON_MSG_SUFFIX;
1364 1.1 jruoho va_end (args);
1365 1.1 jruoho }
1366 1.1 jruoho
1367 1.1 jruoho void ACPI_INTERNAL_VAR_XFACE
1368 1.1 jruoho AcpiInfo (
1369 1.1 jruoho const char *ModuleName,
1370 1.1 jruoho UINT32 LineNumber,
1371 1.1 jruoho const char *Format,
1372 1.1 jruoho ...)
1373 1.1 jruoho {
1374 1.1 jruoho va_list args;
1375 1.1 jruoho
1376 1.1 jruoho
1377 1.1 jruoho AcpiOsPrintf ("ACPI: ");
1378 1.1 jruoho
1379 1.1 jruoho va_start (args, Format);
1380 1.1 jruoho AcpiOsVprintf (Format, args);
1381 1.1 jruoho AcpiOsPrintf ("\n");
1382 1.1 jruoho va_end (args);
1383 1.1 jruoho }
1384 1.1 jruoho
1385 1.1 jruoho ACPI_EXPORT_SYMBOL (AcpiError)
1386 1.1 jruoho ACPI_EXPORT_SYMBOL (AcpiException)
1387 1.1 jruoho ACPI_EXPORT_SYMBOL (AcpiWarning)
1388 1.1 jruoho ACPI_EXPORT_SYMBOL (AcpiInfo)
1389 1.1 jruoho
1390 1.1 jruoho
1391 1.1 jruoho /*******************************************************************************
1392 1.1 jruoho *
1393 1.1 jruoho * FUNCTION: AcpiUtPredefinedWarning
1394 1.1 jruoho *
1395 1.1 jruoho * PARAMETERS: ModuleName - Caller's module name (for error output)
1396 1.1 jruoho * LineNumber - Caller's line number (for error output)
1397 1.1 jruoho * Pathname - Full pathname to the node
1398 1.1 jruoho * NodeFlags - From Namespace node for the method/object
1399 1.1 jruoho * Format - Printf format string + additional args
1400 1.1 jruoho *
1401 1.1 jruoho * RETURN: None
1402 1.1 jruoho *
1403 1.1 jruoho * DESCRIPTION: Warnings for the predefined validation module. Messages are
1404 1.1 jruoho * only emitted the first time a problem with a particular
1405 1.1 jruoho * method/object is detected. This prevents a flood of error
1406 1.1 jruoho * messages for methods that are repeatedly evaluated.
1407 1.1 jruoho *
1408 1.1 jruoho ******************************************************************************/
1409 1.1 jruoho
1410 1.1 jruoho void ACPI_INTERNAL_VAR_XFACE
1411 1.1 jruoho AcpiUtPredefinedWarning (
1412 1.1 jruoho const char *ModuleName,
1413 1.1 jruoho UINT32 LineNumber,
1414 1.1 jruoho char *Pathname,
1415 1.1 jruoho UINT8 NodeFlags,
1416 1.1 jruoho const char *Format,
1417 1.1 jruoho ...)
1418 1.1 jruoho {
1419 1.1 jruoho va_list args;
1420 1.1 jruoho
1421 1.1 jruoho
1422 1.1 jruoho /*
1423 1.1 jruoho * Warning messages for this method/object will be disabled after the
1424 1.1 jruoho * first time a validation fails or an object is successfully repaired.
1425 1.1 jruoho */
1426 1.1 jruoho if (NodeFlags & ANOBJ_EVALUATED)
1427 1.1 jruoho {
1428 1.1 jruoho return;
1429 1.1 jruoho }
1430 1.1 jruoho
1431 1.1 jruoho AcpiOsPrintf ("ACPI Warning for %s: ", Pathname);
1432 1.1 jruoho
1433 1.1 jruoho va_start (args, Format);
1434 1.1 jruoho AcpiOsVprintf (Format, args);
1435 1.1 jruoho ACPI_COMMON_MSG_SUFFIX;
1436 1.1 jruoho va_end (args);
1437 1.1 jruoho }
1438 1.1 jruoho
1439 1.1 jruoho /*******************************************************************************
1440 1.1 jruoho *
1441 1.1 jruoho * FUNCTION: AcpiUtPredefinedInfo
1442 1.1 jruoho *
1443 1.1 jruoho * PARAMETERS: ModuleName - Caller's module name (for error output)
1444 1.1 jruoho * LineNumber - Caller's line number (for error output)
1445 1.1 jruoho * Pathname - Full pathname to the node
1446 1.1 jruoho * NodeFlags - From Namespace node for the method/object
1447 1.1 jruoho * Format - Printf format string + additional args
1448 1.1 jruoho *
1449 1.1 jruoho * RETURN: None
1450 1.1 jruoho *
1451 1.1 jruoho * DESCRIPTION: Info messages for the predefined validation module. Messages
1452 1.1 jruoho * are only emitted the first time a problem with a particular
1453 1.1 jruoho * method/object is detected. This prevents a flood of
1454 1.1 jruoho * messages for methods that are repeatedly evaluated.
1455 1.1 jruoho *
1456 1.1 jruoho ******************************************************************************/
1457 1.1 jruoho
1458 1.1 jruoho void ACPI_INTERNAL_VAR_XFACE
1459 1.1 jruoho AcpiUtPredefinedInfo (
1460 1.1 jruoho const char *ModuleName,
1461 1.1 jruoho UINT32 LineNumber,
1462 1.1 jruoho char *Pathname,
1463 1.1 jruoho UINT8 NodeFlags,
1464 1.1 jruoho const char *Format,
1465 1.1 jruoho ...)
1466 1.1 jruoho {
1467 1.1 jruoho va_list args;
1468 1.1 jruoho
1469 1.1 jruoho
1470 1.1 jruoho /*
1471 1.1 jruoho * Warning messages for this method/object will be disabled after the
1472 1.1 jruoho * first time a validation fails or an object is successfully repaired.
1473 1.1 jruoho */
1474 1.1 jruoho if (NodeFlags & ANOBJ_EVALUATED)
1475 1.1 jruoho {
1476 1.1 jruoho return;
1477 1.1 jruoho }
1478 1.1 jruoho
1479 1.1 jruoho AcpiOsPrintf ("ACPI Info for %s: ", Pathname);
1480 1.1 jruoho
1481 1.1 jruoho va_start (args, Format);
1482 1.1 jruoho AcpiOsVprintf (Format, args);
1483 1.1 jruoho ACPI_COMMON_MSG_SUFFIX;
1484 1.1 jruoho va_end (args);
1485 1.1 jruoho }
1486