• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6.36/drivers/acpi/acpica/
1/*******************************************************************************
2 *
3 * Module Name: utmisc - common utility procedures
4 *
5 ******************************************************************************/
6
7/*
8 * Copyright (C) 2000 - 2010, Intel Corp.
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 *    notice, this list of conditions, and the following disclaimer,
16 *    without modification.
17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 *    substantially similar to the "NO WARRANTY" disclaimer below
19 *    ("Disclaimer") and any redistribution must be conditioned upon
20 *    including a substantially similar Disclaimer requirement for further
21 *    binary redistribution.
22 * 3. Neither the names of the above-listed copyright holders nor the names
23 *    of any contributors may be used to endorse or promote products derived
24 *    from this software without specific prior written permission.
25 *
26 * Alternatively, this software may be distributed under the terms of the
27 * GNU General Public License ("GPL") version 2 as published by the Free
28 * Software Foundation.
29 *
30 * NO WARRANTY
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGES.
42 */
43
44#include <linux/module.h>
45
46#include <acpi/acpi.h>
47#include "accommon.h"
48#include "acnamesp.h"
49
50#define _COMPONENT          ACPI_UTILITIES
51ACPI_MODULE_NAME("utmisc")
52
53/*
54 * Common suffix for messages
55 */
56#define ACPI_COMMON_MSG_SUFFIX \
57	acpi_os_printf(" (%8.8X/%s-%u)\n", ACPI_CA_VERSION, module_name, line_number)
58/*******************************************************************************
59 *
60 * FUNCTION:    acpi_ut_validate_exception
61 *
62 * PARAMETERS:  Status       - The acpi_status code to be formatted
63 *
64 * RETURN:      A string containing the exception text. NULL if exception is
65 *              not valid.
66 *
67 * DESCRIPTION: This function validates and translates an ACPI exception into
68 *              an ASCII string.
69 *
70 ******************************************************************************/
71const char *acpi_ut_validate_exception(acpi_status status)
72{
73	u32 sub_status;
74	const char *exception = NULL;
75
76	ACPI_FUNCTION_ENTRY();
77
78	/*
79	 * Status is composed of two parts, a "type" and an actual code
80	 */
81	sub_status = (status & ~AE_CODE_MASK);
82
83	switch (status & AE_CODE_MASK) {
84	case AE_CODE_ENVIRONMENTAL:
85
86		if (sub_status <= AE_CODE_ENV_MAX) {
87			exception = acpi_gbl_exception_names_env[sub_status];
88		}
89		break;
90
91	case AE_CODE_PROGRAMMER:
92
93		if (sub_status <= AE_CODE_PGM_MAX) {
94			exception = acpi_gbl_exception_names_pgm[sub_status];
95		}
96		break;
97
98	case AE_CODE_ACPI_TABLES:
99
100		if (sub_status <= AE_CODE_TBL_MAX) {
101			exception = acpi_gbl_exception_names_tbl[sub_status];
102		}
103		break;
104
105	case AE_CODE_AML:
106
107		if (sub_status <= AE_CODE_AML_MAX) {
108			exception = acpi_gbl_exception_names_aml[sub_status];
109		}
110		break;
111
112	case AE_CODE_CONTROL:
113
114		if (sub_status <= AE_CODE_CTRL_MAX) {
115			exception = acpi_gbl_exception_names_ctrl[sub_status];
116		}
117		break;
118
119	default:
120		break;
121	}
122
123	return (ACPI_CAST_PTR(const char, exception));
124}
125
126/*******************************************************************************
127 *
128 * FUNCTION:    acpi_ut_is_pci_root_bridge
129 *
130 * PARAMETERS:  Id              - The HID/CID in string format
131 *
132 * RETURN:      TRUE if the Id is a match for a PCI/PCI-Express Root Bridge
133 *
134 * DESCRIPTION: Determine if the input ID is a PCI Root Bridge ID.
135 *
136 ******************************************************************************/
137
138u8 acpi_ut_is_pci_root_bridge(char *id)
139{
140
141	/*
142	 * Check if this is a PCI root bridge.
143	 * ACPI 3.0+: check for a PCI Express root also.
144	 */
145	if (!(ACPI_STRCMP(id,
146			  PCI_ROOT_HID_STRING)) ||
147	    !(ACPI_STRCMP(id, PCI_EXPRESS_ROOT_HID_STRING))) {
148		return (TRUE);
149	}
150
151	return (FALSE);
152}
153
154/*******************************************************************************
155 *
156 * FUNCTION:    acpi_ut_is_aml_table
157 *
158 * PARAMETERS:  Table               - An ACPI table
159 *
160 * RETURN:      TRUE if table contains executable AML; FALSE otherwise
161 *
162 * DESCRIPTION: Check ACPI Signature for a table that contains AML code.
163 *              Currently, these are DSDT,SSDT,PSDT. All other table types are
164 *              data tables that do not contain AML code.
165 *
166 ******************************************************************************/
167
168u8 acpi_ut_is_aml_table(struct acpi_table_header *table)
169{
170
171	/* These are the only tables that contain executable AML */
172
173	if (ACPI_COMPARE_NAME(table->signature, ACPI_SIG_DSDT) ||
174	    ACPI_COMPARE_NAME(table->signature, ACPI_SIG_PSDT) ||
175	    ACPI_COMPARE_NAME(table->signature, ACPI_SIG_SSDT)) {
176		return (TRUE);
177	}
178
179	return (FALSE);
180}
181
182/*******************************************************************************
183 *
184 * FUNCTION:    acpi_ut_allocate_owner_id
185 *
186 * PARAMETERS:  owner_id        - Where the new owner ID is returned
187 *
188 * RETURN:      Status
189 *
190 * DESCRIPTION: Allocate a table or method owner ID. The owner ID is used to
191 *              track objects created by the table or method, to be deleted
192 *              when the method exits or the table is unloaded.
193 *
194 ******************************************************************************/
195
196acpi_status acpi_ut_allocate_owner_id(acpi_owner_id * owner_id)
197{
198	u32 i;
199	u32 j;
200	u32 k;
201	acpi_status status;
202
203	ACPI_FUNCTION_TRACE(ut_allocate_owner_id);
204
205	/* Guard against multiple allocations of ID to the same location */
206
207	if (*owner_id) {
208		ACPI_ERROR((AE_INFO, "Owner ID [0x%2.2X] already exists",
209			    *owner_id));
210		return_ACPI_STATUS(AE_ALREADY_EXISTS);
211	}
212
213	/* Mutex for the global ID mask */
214
215	status = acpi_ut_acquire_mutex(ACPI_MTX_CACHES);
216	if (ACPI_FAILURE(status)) {
217		return_ACPI_STATUS(status);
218	}
219
220	/*
221	 * Find a free owner ID, cycle through all possible IDs on repeated
222	 * allocations. (ACPI_NUM_OWNERID_MASKS + 1) because first index may have
223	 * to be scanned twice.
224	 */
225	for (i = 0, j = acpi_gbl_last_owner_id_index;
226	     i < (ACPI_NUM_OWNERID_MASKS + 1); i++, j++) {
227		if (j >= ACPI_NUM_OWNERID_MASKS) {
228			j = 0;	/* Wraparound to start of mask array */
229		}
230
231		for (k = acpi_gbl_next_owner_id_offset; k < 32; k++) {
232			if (acpi_gbl_owner_id_mask[j] == ACPI_UINT32_MAX) {
233
234				/* There are no free IDs in this mask */
235
236				break;
237			}
238
239			if (!(acpi_gbl_owner_id_mask[j] & (1 << k))) {
240				/*
241				 * Found a free ID. The actual ID is the bit index plus one,
242				 * making zero an invalid Owner ID. Save this as the last ID
243				 * allocated and update the global ID mask.
244				 */
245				acpi_gbl_owner_id_mask[j] |= (1 << k);
246
247				acpi_gbl_last_owner_id_index = (u8) j;
248				acpi_gbl_next_owner_id_offset = (u8) (k + 1);
249
250				/*
251				 * Construct encoded ID from the index and bit position
252				 *
253				 * Note: Last [j].k (bit 255) is never used and is marked
254				 * permanently allocated (prevents +1 overflow)
255				 */
256				*owner_id =
257				    (acpi_owner_id) ((k + 1) + ACPI_MUL_32(j));
258
259				ACPI_DEBUG_PRINT((ACPI_DB_VALUES,
260						  "Allocated OwnerId: %2.2X\n",
261						  (unsigned int)*owner_id));
262				goto exit;
263			}
264		}
265
266		acpi_gbl_next_owner_id_offset = 0;
267	}
268
269	/*
270	 * All owner_ids have been allocated. This typically should
271	 * not happen since the IDs are reused after deallocation. The IDs are
272	 * allocated upon table load (one per table) and method execution, and
273	 * they are released when a table is unloaded or a method completes
274	 * execution.
275	 *
276	 * If this error happens, there may be very deep nesting of invoked control
277	 * methods, or there may be a bug where the IDs are not released.
278	 */
279	status = AE_OWNER_ID_LIMIT;
280	ACPI_ERROR((AE_INFO,
281		    "Could not allocate new OwnerId (255 max), AE_OWNER_ID_LIMIT"));
282
283      exit:
284	(void)acpi_ut_release_mutex(ACPI_MTX_CACHES);
285	return_ACPI_STATUS(status);
286}
287
288/*******************************************************************************
289 *
290 * FUNCTION:    acpi_ut_release_owner_id
291 *
292 * PARAMETERS:  owner_id_ptr        - Pointer to a previously allocated owner_iD
293 *
294 * RETURN:      None. No error is returned because we are either exiting a
295 *              control method or unloading a table. Either way, we would
296 *              ignore any error anyway.
297 *
298 * DESCRIPTION: Release a table or method owner ID.  Valid IDs are 1 - 255
299 *
300 ******************************************************************************/
301
302void acpi_ut_release_owner_id(acpi_owner_id * owner_id_ptr)
303{
304	acpi_owner_id owner_id = *owner_id_ptr;
305	acpi_status status;
306	u32 index;
307	u32 bit;
308
309	ACPI_FUNCTION_TRACE_U32(ut_release_owner_id, owner_id);
310
311	/* Always clear the input owner_id (zero is an invalid ID) */
312
313	*owner_id_ptr = 0;
314
315	/* Zero is not a valid owner_iD */
316
317	if (owner_id == 0) {
318		ACPI_ERROR((AE_INFO, "Invalid OwnerId: 0x%2.2X", owner_id));
319		return_VOID;
320	}
321
322	/* Mutex for the global ID mask */
323
324	status = acpi_ut_acquire_mutex(ACPI_MTX_CACHES);
325	if (ACPI_FAILURE(status)) {
326		return_VOID;
327	}
328
329	/* Normalize the ID to zero */
330
331	owner_id--;
332
333	/* Decode ID to index/offset pair */
334
335	index = ACPI_DIV_32(owner_id);
336	bit = 1 << ACPI_MOD_32(owner_id);
337
338	/* Free the owner ID only if it is valid */
339
340	if (acpi_gbl_owner_id_mask[index] & bit) {
341		acpi_gbl_owner_id_mask[index] ^= bit;
342	} else {
343		ACPI_ERROR((AE_INFO,
344			    "Release of non-allocated OwnerId: 0x%2.2X",
345			    owner_id + 1));
346	}
347
348	(void)acpi_ut_release_mutex(ACPI_MTX_CACHES);
349	return_VOID;
350}
351
352/*******************************************************************************
353 *
354 * FUNCTION:    acpi_ut_strupr (strupr)
355 *
356 * PARAMETERS:  src_string      - The source string to convert
357 *
358 * RETURN:      None
359 *
360 * DESCRIPTION: Convert string to uppercase
361 *
362 * NOTE: This is not a POSIX function, so it appears here, not in utclib.c
363 *
364 ******************************************************************************/
365
366void acpi_ut_strupr(char *src_string)
367{
368	char *string;
369
370	ACPI_FUNCTION_ENTRY();
371
372	if (!src_string) {
373		return;
374	}
375
376	/* Walk entire string, uppercasing the letters */
377
378	for (string = src_string; *string; string++) {
379		*string = (char)ACPI_TOUPPER(*string);
380	}
381
382	return;
383}
384
385/*******************************************************************************
386 *
387 * FUNCTION:    acpi_ut_print_string
388 *
389 * PARAMETERS:  String          - Null terminated ASCII string
390 *              max_length      - Maximum output length
391 *
392 * RETURN:      None
393 *
394 * DESCRIPTION: Dump an ASCII string with support for ACPI-defined escape
395 *              sequences.
396 *
397 ******************************************************************************/
398
399void acpi_ut_print_string(char *string, u8 max_length)
400{
401	u32 i;
402
403	if (!string) {
404		acpi_os_printf("<\"NULL STRING PTR\">");
405		return;
406	}
407
408	acpi_os_printf("\"");
409	for (i = 0; string[i] && (i < max_length); i++) {
410
411		/* Escape sequences */
412
413		switch (string[i]) {
414		case 0x07:
415			acpi_os_printf("\\a");	/* BELL */
416			break;
417
418		case 0x08:
419			acpi_os_printf("\\b");	/* BACKSPACE */
420			break;
421
422		case 0x0C:
423			acpi_os_printf("\\f");	/* FORMFEED */
424			break;
425
426		case 0x0A:
427			acpi_os_printf("\\n");	/* LINEFEED */
428			break;
429
430		case 0x0D:
431			acpi_os_printf("\\r");	/* CARRIAGE RETURN */
432			break;
433
434		case 0x09:
435			acpi_os_printf("\\t");	/* HORIZONTAL TAB */
436			break;
437
438		case 0x0B:
439			acpi_os_printf("\\v");	/* VERTICAL TAB */
440			break;
441
442		case '\'':	/* Single Quote */
443		case '\"':	/* Double Quote */
444		case '\\':	/* Backslash */
445			acpi_os_printf("\\%c", (int)string[i]);
446			break;
447
448		default:
449
450			/* Check for printable character or hex escape */
451
452			if (ACPI_IS_PRINT(string[i])) {
453				/* This is a normal character */
454
455				acpi_os_printf("%c", (int)string[i]);
456			} else {
457				/* All others will be Hex escapes */
458
459				acpi_os_printf("\\x%2.2X", (s32) string[i]);
460			}
461			break;
462		}
463	}
464	acpi_os_printf("\"");
465
466	if (i == max_length && string[i]) {
467		acpi_os_printf("...");
468	}
469}
470
471/*******************************************************************************
472 *
473 * FUNCTION:    acpi_ut_dword_byte_swap
474 *
475 * PARAMETERS:  Value           - Value to be converted
476 *
477 * RETURN:      u32 integer with bytes swapped
478 *
479 * DESCRIPTION: Convert a 32-bit value to big-endian (swap the bytes)
480 *
481 ******************************************************************************/
482
483u32 acpi_ut_dword_byte_swap(u32 value)
484{
485	union {
486		u32 value;
487		u8 bytes[4];
488	} out;
489	union {
490		u32 value;
491		u8 bytes[4];
492	} in;
493
494	ACPI_FUNCTION_ENTRY();
495
496	in.value = value;
497
498	out.bytes[0] = in.bytes[3];
499	out.bytes[1] = in.bytes[2];
500	out.bytes[2] = in.bytes[1];
501	out.bytes[3] = in.bytes[0];
502
503	return (out.value);
504}
505
506/*******************************************************************************
507 *
508 * FUNCTION:    acpi_ut_set_integer_width
509 *
510 * PARAMETERS:  Revision            From DSDT header
511 *
512 * RETURN:      None
513 *
514 * DESCRIPTION: Set the global integer bit width based upon the revision
515 *              of the DSDT.  For Revision 1 and 0, Integers are 32 bits.
516 *              For Revision 2 and above, Integers are 64 bits.  Yes, this
517 *              makes a difference.
518 *
519 ******************************************************************************/
520
521void acpi_ut_set_integer_width(u8 revision)
522{
523
524	if (revision < 2) {
525
526		/* 32-bit case */
527
528		acpi_gbl_integer_bit_width = 32;
529		acpi_gbl_integer_nybble_width = 8;
530		acpi_gbl_integer_byte_width = 4;
531	} else {
532		/* 64-bit case (ACPI 2.0+) */
533
534		acpi_gbl_integer_bit_width = 64;
535		acpi_gbl_integer_nybble_width = 16;
536		acpi_gbl_integer_byte_width = 8;
537	}
538}
539
540#ifdef ACPI_DEBUG_OUTPUT
541/*******************************************************************************
542 *
543 * FUNCTION:    acpi_ut_display_init_pathname
544 *
545 * PARAMETERS:  Type                - Object type of the node
546 *              obj_handle          - Handle whose pathname will be displayed
547 *              Path                - Additional path string to be appended.
548 *                                      (NULL if no extra path)
549 *
550 * RETURN:      acpi_status
551 *
552 * DESCRIPTION: Display full pathname of an object, DEBUG ONLY
553 *
554 ******************************************************************************/
555
556void
557acpi_ut_display_init_pathname(u8 type,
558			      struct acpi_namespace_node *obj_handle,
559			      char *path)
560{
561	acpi_status status;
562	struct acpi_buffer buffer;
563
564	ACPI_FUNCTION_ENTRY();
565
566	/* Only print the path if the appropriate debug level is enabled */
567
568	if (!(acpi_dbg_level & ACPI_LV_INIT_NAMES)) {
569		return;
570	}
571
572	/* Get the full pathname to the node */
573
574	buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
575	status = acpi_ns_handle_to_pathname(obj_handle, &buffer);
576	if (ACPI_FAILURE(status)) {
577		return;
578	}
579
580	/* Print what we're doing */
581
582	switch (type) {
583	case ACPI_TYPE_METHOD:
584		acpi_os_printf("Executing  ");
585		break;
586
587	default:
588		acpi_os_printf("Initializing ");
589		break;
590	}
591
592	/* Print the object type and pathname */
593
594	acpi_os_printf("%-12s %s",
595		       acpi_ut_get_type_name(type), (char *)buffer.pointer);
596
597	/* Extra path is used to append names like _STA, _INI, etc. */
598
599	if (path) {
600		acpi_os_printf(".%s", path);
601	}
602	acpi_os_printf("\n");
603
604	ACPI_FREE(buffer.pointer);
605}
606#endif
607
608/*******************************************************************************
609 *
610 * FUNCTION:    acpi_ut_valid_acpi_char
611 *
612 * PARAMETERS:  Char            - The character to be examined
613 *              Position        - Byte position (0-3)
614 *
615 * RETURN:      TRUE if the character is valid, FALSE otherwise
616 *
617 * DESCRIPTION: Check for a valid ACPI character. Must be one of:
618 *              1) Upper case alpha
619 *              2) numeric
620 *              3) underscore
621 *
622 *              We allow a '!' as the last character because of the ASF! table
623 *
624 ******************************************************************************/
625
626u8 acpi_ut_valid_acpi_char(char character, u32 position)
627{
628
629	if (!((character >= 'A' && character <= 'Z') ||
630	      (character >= '0' && character <= '9') || (character == '_'))) {
631
632		/* Allow a '!' in the last position */
633
634		if (character == '!' && position == 3) {
635			return (TRUE);
636		}
637
638		return (FALSE);
639	}
640
641	return (TRUE);
642}
643
644/*******************************************************************************
645 *
646 * FUNCTION:    acpi_ut_valid_acpi_name
647 *
648 * PARAMETERS:  Name            - The name to be examined
649 *
650 * RETURN:      TRUE if the name is valid, FALSE otherwise
651 *
652 * DESCRIPTION: Check for a valid ACPI name.  Each character must be one of:
653 *              1) Upper case alpha
654 *              2) numeric
655 *              3) underscore
656 *
657 ******************************************************************************/
658
659u8 acpi_ut_valid_acpi_name(u32 name)
660{
661	u32 i;
662
663	ACPI_FUNCTION_ENTRY();
664
665	for (i = 0; i < ACPI_NAME_SIZE; i++) {
666		if (!acpi_ut_valid_acpi_char
667		    ((ACPI_CAST_PTR(char, &name))[i], i)) {
668			return (FALSE);
669		}
670	}
671
672	return (TRUE);
673}
674
675/*******************************************************************************
676 *
677 * FUNCTION:    acpi_ut_repair_name
678 *
679 * PARAMETERS:  Name            - The ACPI name to be repaired
680 *
681 * RETURN:      Repaired version of the name
682 *
683 * DESCRIPTION: Repair an ACPI name: Change invalid characters to '*' and
684 *              return the new name.
685 *
686 ******************************************************************************/
687
688acpi_name acpi_ut_repair_name(char *name)
689{
690       u32 i;
691	char new_name[ACPI_NAME_SIZE];
692
693	for (i = 0; i < ACPI_NAME_SIZE; i++) {
694		new_name[i] = name[i];
695
696		/*
697		 * Replace a bad character with something printable, yet technically
698		 * still invalid. This prevents any collisions with existing "good"
699		 * names in the namespace.
700		 */
701		if (!acpi_ut_valid_acpi_char(name[i], i)) {
702			new_name[i] = '*';
703		}
704	}
705
706	return (*(u32 *) new_name);
707}
708
709/*******************************************************************************
710 *
711 * FUNCTION:    acpi_ut_strtoul64
712 *
713 * PARAMETERS:  String          - Null terminated string
714 *              Base            - Radix of the string: 16 or ACPI_ANY_BASE;
715 *                                ACPI_ANY_BASE means 'in behalf of to_integer'
716 *              ret_integer     - Where the converted integer is returned
717 *
718 * RETURN:      Status and Converted value
719 *
720 * DESCRIPTION: Convert a string into an unsigned value. Performs either a
721 *              32-bit or 64-bit conversion, depending on the current mode
722 *              of the interpreter.
723 *              NOTE: Does not support Octal strings, not needed.
724 *
725 ******************************************************************************/
726
727acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 * ret_integer)
728{
729	u32 this_digit = 0;
730	u64 return_value = 0;
731	u64 quotient;
732	u64 dividend;
733	u32 to_integer_op = (base == ACPI_ANY_BASE);
734	u32 mode32 = (acpi_gbl_integer_byte_width == 4);
735	u8 valid_digits = 0;
736	u8 sign_of0x = 0;
737	u8 term = 0;
738
739	ACPI_FUNCTION_TRACE_STR(ut_stroul64, string);
740
741	switch (base) {
742	case ACPI_ANY_BASE:
743	case 16:
744		break;
745
746	default:
747		/* Invalid Base */
748		return_ACPI_STATUS(AE_BAD_PARAMETER);
749	}
750
751	if (!string) {
752		goto error_exit;
753	}
754
755	/* Skip over any white space in the buffer */
756
757	while ((*string) && (ACPI_IS_SPACE(*string) || *string == '\t')) {
758		string++;
759	}
760
761	if (to_integer_op) {
762		/*
763		 * Base equal to ACPI_ANY_BASE means 'to_integer operation case'.
764		 * We need to determine if it is decimal or hexadecimal.
765		 */
766		if ((*string == '0') && (ACPI_TOLOWER(*(string + 1)) == 'x')) {
767			sign_of0x = 1;
768			base = 16;
769
770			/* Skip over the leading '0x' */
771			string += 2;
772		} else {
773			base = 10;
774		}
775	}
776
777	/* Any string left? Check that '0x' is not followed by white space. */
778
779	if (!(*string) || ACPI_IS_SPACE(*string) || *string == '\t') {
780		if (to_integer_op) {
781			goto error_exit;
782		} else {
783			goto all_done;
784		}
785	}
786
787	/*
788	 * Perform a 32-bit or 64-bit conversion, depending upon the current
789	 * execution mode of the interpreter
790	 */
791	dividend = (mode32) ? ACPI_UINT32_MAX : ACPI_UINT64_MAX;
792
793	/* Main loop: convert the string to a 32- or 64-bit integer */
794
795	while (*string) {
796		if (ACPI_IS_DIGIT(*string)) {
797
798			/* Convert ASCII 0-9 to Decimal value */
799
800			this_digit = ((u8) * string) - '0';
801		} else if (base == 10) {
802
803			/* Digit is out of range; possible in to_integer case only */
804
805			term = 1;
806		} else {
807			this_digit = (u8) ACPI_TOUPPER(*string);
808			if (ACPI_IS_XDIGIT((char)this_digit)) {
809
810				/* Convert ASCII Hex char to value */
811
812				this_digit = this_digit - 'A' + 10;
813			} else {
814				term = 1;
815			}
816		}
817
818		if (term) {
819			if (to_integer_op) {
820				goto error_exit;
821			} else {
822				break;
823			}
824		} else if ((valid_digits == 0) && (this_digit == 0)
825			   && !sign_of0x) {
826
827			/* Skip zeros */
828			string++;
829			continue;
830		}
831
832		valid_digits++;
833
834		if (sign_of0x && ((valid_digits > 16)
835				  || ((valid_digits > 8) && mode32))) {
836			/*
837			 * This is to_integer operation case.
838			 * No any restrictions for string-to-integer conversion,
839			 * see ACPI spec.
840			 */
841			goto error_exit;
842		}
843
844		/* Divide the digit into the correct position */
845
846		(void)acpi_ut_short_divide((dividend - (u64) this_digit),
847					   base, &quotient, NULL);
848
849		if (return_value > quotient) {
850			if (to_integer_op) {
851				goto error_exit;
852			} else {
853				break;
854			}
855		}
856
857		return_value *= base;
858		return_value += this_digit;
859		string++;
860	}
861
862	/* All done, normal exit */
863
864      all_done:
865
866	ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Converted value: %8.8X%8.8X\n",
867			  ACPI_FORMAT_UINT64(return_value)));
868
869	*ret_integer = return_value;
870	return_ACPI_STATUS(AE_OK);
871
872      error_exit:
873	/* Base was set/validated above */
874
875	if (base == 10) {
876		return_ACPI_STATUS(AE_BAD_DECIMAL_CONSTANT);
877	} else {
878		return_ACPI_STATUS(AE_BAD_HEX_CONSTANT);
879	}
880}
881
882/*******************************************************************************
883 *
884 * FUNCTION:    acpi_ut_create_update_state_and_push
885 *
886 * PARAMETERS:  Object          - Object to be added to the new state
887 *              Action          - Increment/Decrement
888 *              state_list      - List the state will be added to
889 *
890 * RETURN:      Status
891 *
892 * DESCRIPTION: Create a new state and push it
893 *
894 ******************************************************************************/
895
896acpi_status
897acpi_ut_create_update_state_and_push(union acpi_operand_object *object,
898				     u16 action,
899				     union acpi_generic_state **state_list)
900{
901	union acpi_generic_state *state;
902
903	ACPI_FUNCTION_ENTRY();
904
905	/* Ignore null objects; these are expected */
906
907	if (!object) {
908		return (AE_OK);
909	}
910
911	state = acpi_ut_create_update_state(object, action);
912	if (!state) {
913		return (AE_NO_MEMORY);
914	}
915
916	acpi_ut_push_generic_state(state_list, state);
917	return (AE_OK);
918}
919
920/*******************************************************************************
921 *
922 * FUNCTION:    acpi_ut_walk_package_tree
923 *
924 * PARAMETERS:  source_object       - The package to walk
925 *              target_object       - Target object (if package is being copied)
926 *              walk_callback       - Called once for each package element
927 *              Context             - Passed to the callback function
928 *
929 * RETURN:      Status
930 *
931 * DESCRIPTION: Walk through a package
932 *
933 ******************************************************************************/
934
935acpi_status
936acpi_ut_walk_package_tree(union acpi_operand_object * source_object,
937			  void *target_object,
938			  acpi_pkg_callback walk_callback, void *context)
939{
940	acpi_status status = AE_OK;
941	union acpi_generic_state *state_list = NULL;
942	union acpi_generic_state *state;
943	u32 this_index;
944	union acpi_operand_object *this_source_obj;
945
946	ACPI_FUNCTION_TRACE(ut_walk_package_tree);
947
948	state = acpi_ut_create_pkg_state(source_object, target_object, 0);
949	if (!state) {
950		return_ACPI_STATUS(AE_NO_MEMORY);
951	}
952
953	while (state) {
954
955		/* Get one element of the package */
956
957		this_index = state->pkg.index;
958		this_source_obj = (union acpi_operand_object *)
959		    state->pkg.source_object->package.elements[this_index];
960
961		/*
962		 * Check for:
963		 * 1) An uninitialized package element.  It is completely
964		 *    legal to declare a package and leave it uninitialized
965		 * 2) Not an internal object - can be a namespace node instead
966		 * 3) Any type other than a package.  Packages are handled in else
967		 *    case below.
968		 */
969		if ((!this_source_obj) ||
970		    (ACPI_GET_DESCRIPTOR_TYPE(this_source_obj) !=
971		     ACPI_DESC_TYPE_OPERAND)
972		    || (this_source_obj->common.type != ACPI_TYPE_PACKAGE)) {
973			status =
974			    walk_callback(ACPI_COPY_TYPE_SIMPLE,
975					  this_source_obj, state, context);
976			if (ACPI_FAILURE(status)) {
977				return_ACPI_STATUS(status);
978			}
979
980			state->pkg.index++;
981			while (state->pkg.index >=
982			       state->pkg.source_object->package.count) {
983				/*
984				 * We've handled all of the objects at this level,  This means
985				 * that we have just completed a package.  That package may
986				 * have contained one or more packages itself.
987				 *
988				 * Delete this state and pop the previous state (package).
989				 */
990				acpi_ut_delete_generic_state(state);
991				state = acpi_ut_pop_generic_state(&state_list);
992
993				/* Finished when there are no more states */
994
995				if (!state) {
996					/*
997					 * We have handled all of the objects in the top level
998					 * package just add the length of the package objects
999					 * and exit
1000					 */
1001					return_ACPI_STATUS(AE_OK);
1002				}
1003
1004				/*
1005				 * Go back up a level and move the index past the just
1006				 * completed package object.
1007				 */
1008				state->pkg.index++;
1009			}
1010		} else {
1011			/* This is a subobject of type package */
1012
1013			status =
1014			    walk_callback(ACPI_COPY_TYPE_PACKAGE,
1015					  this_source_obj, state, context);
1016			if (ACPI_FAILURE(status)) {
1017				return_ACPI_STATUS(status);
1018			}
1019
1020			/*
1021			 * Push the current state and create a new one
1022			 * The callback above returned a new target package object.
1023			 */
1024			acpi_ut_push_generic_state(&state_list, state);
1025			state = acpi_ut_create_pkg_state(this_source_obj,
1026							 state->pkg.
1027							 this_target_obj, 0);
1028			if (!state) {
1029
1030				/* Free any stacked Update State objects */
1031
1032				while (state_list) {
1033					state =
1034					    acpi_ut_pop_generic_state
1035					    (&state_list);
1036					acpi_ut_delete_generic_state(state);
1037				}
1038				return_ACPI_STATUS(AE_NO_MEMORY);
1039			}
1040		}
1041	}
1042
1043	/* We should never get here */
1044
1045	return_ACPI_STATUS(AE_AML_INTERNAL);
1046}
1047
1048/*******************************************************************************
1049 *
1050 * FUNCTION:    acpi_error, acpi_exception, acpi_warning, acpi_info
1051 *
1052 * PARAMETERS:  module_name         - Caller's module name (for error output)
1053 *              line_number         - Caller's line number (for error output)
1054 *              Format              - Printf format string + additional args
1055 *
1056 * RETURN:      None
1057 *
1058 * DESCRIPTION: Print message with module/line/version info
1059 *
1060 ******************************************************************************/
1061
1062void ACPI_INTERNAL_VAR_XFACE
1063acpi_error(const char *module_name, u32 line_number, const char *format, ...)
1064{
1065	va_list args;
1066
1067	acpi_os_printf("ACPI Error: ");
1068
1069	va_start(args, format);
1070	acpi_os_vprintf(format, args);
1071	ACPI_COMMON_MSG_SUFFIX;
1072	va_end(args);
1073}
1074
1075void ACPI_INTERNAL_VAR_XFACE
1076acpi_exception(const char *module_name,
1077	       u32 line_number, acpi_status status, const char *format, ...)
1078{
1079	va_list args;
1080
1081	acpi_os_printf("ACPI Exception: %s, ", acpi_format_exception(status));
1082
1083	va_start(args, format);
1084	acpi_os_vprintf(format, args);
1085	ACPI_COMMON_MSG_SUFFIX;
1086	va_end(args);
1087}
1088
1089void ACPI_INTERNAL_VAR_XFACE
1090acpi_warning(const char *module_name, u32 line_number, const char *format, ...)
1091{
1092	va_list args;
1093
1094	acpi_os_printf("ACPI Warning: ");
1095
1096	va_start(args, format);
1097	acpi_os_vprintf(format, args);
1098	ACPI_COMMON_MSG_SUFFIX;
1099	va_end(args);
1100}
1101
1102void ACPI_INTERNAL_VAR_XFACE
1103acpi_info(const char *module_name, u32 line_number, const char *format, ...)
1104{
1105	va_list args;
1106
1107	acpi_os_printf("ACPI: ");
1108
1109	va_start(args, format);
1110	acpi_os_vprintf(format, args);
1111	acpi_os_printf("\n");
1112	va_end(args);
1113}
1114
1115ACPI_EXPORT_SYMBOL(acpi_error)
1116ACPI_EXPORT_SYMBOL(acpi_exception)
1117ACPI_EXPORT_SYMBOL(acpi_warning)
1118ACPI_EXPORT_SYMBOL(acpi_info)
1119
1120/*******************************************************************************
1121 *
1122 * FUNCTION:    acpi_ut_predefined_warning
1123 *
1124 * PARAMETERS:  module_name     - Caller's module name (for error output)
1125 *              line_number     - Caller's line number (for error output)
1126 *              Pathname        - Full pathname to the node
1127 *              node_flags      - From Namespace node for the method/object
1128 *              Format          - Printf format string + additional args
1129 *
1130 * RETURN:      None
1131 *
1132 * DESCRIPTION: Warnings for the predefined validation module. Messages are
1133 *              only emitted the first time a problem with a particular
1134 *              method/object is detected. This prevents a flood of error
1135 *              messages for methods that are repeatedly evaluated.
1136 *
1137******************************************************************************/
1138
1139void ACPI_INTERNAL_VAR_XFACE
1140acpi_ut_predefined_warning(const char *module_name,
1141			   u32 line_number,
1142			   char *pathname,
1143			   u8 node_flags, const char *format, ...)
1144{
1145	va_list args;
1146
1147	/*
1148	 * Warning messages for this method/object will be disabled after the
1149	 * first time a validation fails or an object is successfully repaired.
1150	 */
1151	if (node_flags & ANOBJ_EVALUATED) {
1152		return;
1153	}
1154
1155	acpi_os_printf("ACPI Warning for %s: ", pathname);
1156
1157	va_start(args, format);
1158	acpi_os_vprintf(format, args);
1159	ACPI_COMMON_MSG_SUFFIX;
1160	va_end(args);
1161}
1162
1163/*******************************************************************************
1164 *
1165 * FUNCTION:    acpi_ut_predefined_info
1166 *
1167 * PARAMETERS:  module_name     - Caller's module name (for error output)
1168 *              line_number     - Caller's line number (for error output)
1169 *              Pathname        - Full pathname to the node
1170 *              node_flags      - From Namespace node for the method/object
1171 *              Format          - Printf format string + additional args
1172 *
1173 * RETURN:      None
1174 *
1175 * DESCRIPTION: Info messages for the predefined validation module. Messages
1176 *              are only emitted the first time a problem with a particular
1177 *              method/object is detected. This prevents a flood of
1178 *              messages for methods that are repeatedly evaluated.
1179 *
1180 ******************************************************************************/
1181
1182void ACPI_INTERNAL_VAR_XFACE
1183acpi_ut_predefined_info(const char *module_name,
1184			u32 line_number,
1185			char *pathname, u8 node_flags, const char *format, ...)
1186{
1187	va_list args;
1188
1189	/*
1190	 * Warning messages for this method/object will be disabled after the
1191	 * first time a validation fails or an object is successfully repaired.
1192	 */
1193	if (node_flags & ANOBJ_EVALUATED) {
1194		return;
1195	}
1196
1197	acpi_os_printf("ACPI Info for %s: ", pathname);
1198
1199	va_start(args, format);
1200	acpi_os_vprintf(format, args);
1201	ACPI_COMMON_MSG_SUFFIX;
1202	va_end(args);
1203}
1204