ahdecode.c revision 1.1.1.1.16.1 1 /******************************************************************************
2 *
3 * Module Name: ahdecode - Operator/Opcode decoding for acpihelp utility
4 *
5 *****************************************************************************/
6
7 /*
8 * Copyright (C) 2000 - 2013, 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 #define ACPI_CREATE_PREDEFINED_TABLE
45 #define ACPI_CREATE_RESOURCE_TABLE
46
47 #include "acpihelp.h"
48 #include "acpredef.h"
49
50
51 /* Device IDs defined in the ACPI specification */
52
53 static const AH_DEVICE_ID AhDeviceIds[] =
54 {
55 {"PNP0A05", "Generic Container Device"},
56 {"PNP0A06", "Generic Container Device"},
57 {"PNP0C08", "ACPI core hardware"},
58 {"PNP0C09", "Embedded Controller Device"},
59 {"PNP0C0A", "Control Method Battery"},
60 {"PNP0C0B", "Fan"},
61 {"PNP0C0C", "Power Button Device"},
62 {"PNP0C0D", "Lid Device"},
63 {"PNP0C0E", "Sleep Button Device"},
64 {"PNP0C0F", "PCI Interrupt Link Device"},
65 {"PNP0C80", "Memory Device"},
66
67 {"ACPI0001", "SMBus 1.0 Host Controller"},
68 {"ACPI0002", "Smart Battery Subsystem"},
69 {"ACPI0003", "Power Source Device"},
70 {"ACPI0004", "Module Device"},
71 {"ACPI0005", "SMBus 2.0 Host Controller"},
72 {"ACPI0006", "GPE Block Device"},
73 {"ACPI0007", "Processor Device"},
74 {"ACPI0008", "Ambient Light Sensor Device"},
75 {"ACPI0009", "I/O xAPIC Device"},
76 {"ACPI000A", "I/O APIC Device"},
77 {"ACPI000B", "I/O SAPIC Device"},
78 {"ACPI000C", "Processor Aggregator Device"},
79 {"ACPI000D", "Power Meter Device"},
80 {"ACPI000E", "Time/Alarm Device"},
81 {"ACPI000F", "User Presence Detection Device"},
82
83 {NULL, NULL}
84 };
85
86 #define AH_DISPLAY_EXCEPTION(Status, Name) \
87 printf ("%.4X: %s\n", Status, Name)
88
89 #define AH_DISPLAY_EXCEPTION_TEXT(Status, Exception) \
90 printf ("%.4X: %-28s (%s)\n", Status, Exception->Name, Exception->Description)
91
92 #define BUFFER_LENGTH 128
93 #define LINE_BUFFER_LENGTH 512
94
95 static char Gbl_Buffer[BUFFER_LENGTH];
96 static char Gbl_LineBuffer[LINE_BUFFER_LENGTH];
97
98 /* Local prototypes */
99
100 static BOOLEAN
101 AhDisplayPredefinedName (
102 char *Name,
103 UINT32 Length);
104
105 static void
106 AhDisplayPredefinedInfo (
107 char *Name);
108
109 static void
110 AhDisplayResourceName (
111 const ACPI_PREDEFINED_INFO *ThisName);
112
113 static void
114 AhDisplayAmlOpcode (
115 const AH_AML_OPCODE *Op);
116
117 static void
118 AhDisplayAslOperator (
119 const AH_ASL_OPERATOR *Op);
120
121 static void
122 AhDisplayOperatorKeywords (
123 const AH_ASL_OPERATOR *Op);
124
125 static void
126 AhDisplayAslKeyword (
127 const AH_ASL_KEYWORD *Op);
128
129 static void
130 AhPrintOneField (
131 UINT32 Indent,
132 UINT32 CurrentPosition,
133 UINT32 MaxPosition,
134 const char *Field);
135
136
137 /*******************************************************************************
138 *
139 * FUNCTION: AhFindPredefinedNames (entry point for predefined name search)
140 *
141 * PARAMETERS: NamePrefix - Name or prefix to find. Must start with
142 * an underscore. NULL means "find all"
143 *
144 * RETURN: None
145 *
146 * DESCRIPTION: Find and display all ACPI predefined names that match the
147 * input name or prefix. Includes the required number of arguments
148 * and the expected return type, if any.
149 *
150 ******************************************************************************/
151
152 void
153 AhFindPredefinedNames (
154 char *NamePrefix)
155 {
156 UINT32 Length;
157 BOOLEAN Found;
158 char Name[9];
159
160
161 if (!NamePrefix)
162 {
163 Found = AhDisplayPredefinedName (Name, 0);
164 return;
165 }
166
167 /* Contruct a local name or name prefix */
168
169 AhStrupr (NamePrefix);
170 if (*NamePrefix == '_')
171 {
172 NamePrefix++;
173 }
174
175 Name[0] = '_';
176 strncpy (&Name[1], NamePrefix, 7);
177
178 Length = strlen (Name);
179 if (Length > 4)
180 {
181 printf ("%.8s: Predefined name must be 4 characters maximum\n", Name);
182 return;
183 }
184
185 Found = AhDisplayPredefinedName (Name, Length);
186 if (!Found)
187 {
188 printf ("%s, no matching predefined names\n", Name);
189 }
190 }
191
192
193 /*******************************************************************************
194 *
195 * FUNCTION: AhDisplayPredefinedName
196 *
197 * PARAMETERS: Name - Name or name prefix
198 *
199 * RETURN: TRUE if any names matched, FALSE otherwise
200 *
201 * DESCRIPTION: Display information about ACPI predefined names that match
202 * the input name or name prefix.
203 *
204 ******************************************************************************/
205
206 static BOOLEAN
207 AhDisplayPredefinedName (
208 char *Name,
209 UINT32 Length)
210 {
211 const AH_PREDEFINED_NAME *Info;
212 BOOLEAN Found = FALSE;
213 BOOLEAN Matched;
214 UINT32 i;
215
216
217 /* Find/display all names that match the input name prefix */
218
219 for (Info = AslPredefinedInfo; Info->Name; Info++)
220 {
221 if (!Name)
222 {
223 Found = TRUE;
224 printf ("%s: <%s>\n", Info->Name, Info->Description);
225 printf ("%*s%s\n", 6, " ", Info->Action);
226
227 AhDisplayPredefinedInfo (Info->Name);
228 continue;
229 }
230
231 Matched = TRUE;
232 for (i = 0; i < Length; i++)
233 {
234 if (Info->Name[i] != Name[i])
235 {
236 Matched = FALSE;
237 break;
238 }
239 }
240
241 if (Matched)
242 {
243 Found = TRUE;
244 printf ("%s: <%s>\n", Info->Name, Info->Description);
245 printf ("%*s%s\n", 6, " ", Info->Action);
246
247 AhDisplayPredefinedInfo (Info->Name);
248 }
249 }
250
251 return (Found);
252 }
253
254
255 /*******************************************************************************
256 *
257 * FUNCTION: AhDisplayPredefinedInfo
258 *
259 * PARAMETERS: Name - Exact 4-character ACPI name.
260 *
261 * RETURN: None
262 *
263 * DESCRIPTION: Find the name in the main ACPICA predefined info table and
264 * display the # of arguments and the return value type.
265 *
266 * Note: Resource Descriptor field names do not appear in this
267 * table -- thus, nothing will be displayed for them.
268 *
269 ******************************************************************************/
270
271 static void
272 AhDisplayPredefinedInfo (
273 char *Name)
274 {
275 const ACPI_PREDEFINED_INFO *ThisName;
276
277
278 /* NOTE: we check both tables always because there are some dupes */
279
280 /* Check against the predefine methods first */
281
282 ThisName = AcpiUtMatchPredefinedMethod (Name);
283 if (ThisName)
284 {
285 AcpiUtDisplayPredefinedMethod (Gbl_Buffer, ThisName, TRUE);
286 }
287
288 /* Check against the predefined resource descriptor names */
289
290 ThisName = AcpiUtMatchResourceName (Name);
291 if (ThisName)
292 {
293 AhDisplayResourceName (ThisName);
294 }
295 }
296
297
298 /*******************************************************************************
299 *
300 * FUNCTION: AhDisplayResourceName
301 *
302 * PARAMETERS: ThisName - Entry in the predefined method/name table
303 *
304 * RETURN: None
305 *
306 * DESCRIPTION: Display information about a resource descriptor name.
307 *
308 ******************************************************************************/
309
310 static void
311 AhDisplayResourceName (
312 const ACPI_PREDEFINED_INFO *ThisName)
313 {
314 UINT32 NumTypes;
315
316
317 NumTypes = AcpiUtGetResourceBitWidth (Gbl_Buffer,
318 ThisName->Info.ArgumentList);
319
320 printf (" %4.4s resource descriptor field is %s bits wide%s\n",
321 ThisName->Info.Name,
322 Gbl_Buffer,
323 (NumTypes > 1) ? " (depending on descriptor type)" : "");
324 }
325
326
327 /*******************************************************************************
328 *
329 * FUNCTION: AhFindAmlOpcode (entry point for AML opcode name search)
330 *
331 * PARAMETERS: Name - Name or prefix for an AML opcode.
332 * NULL means "find all"
333 *
334 * RETURN: None
335 *
336 * DESCRIPTION: Find all AML opcodes that match the input Name or name
337 * prefix.
338 *
339 ******************************************************************************/
340
341 void
342 AhFindAmlOpcode (
343 char *Name)
344 {
345 const AH_AML_OPCODE *Op;
346 BOOLEAN Found = FALSE;
347
348
349 AhStrupr (Name);
350
351 /* Find/display all opcode names that match the input name prefix */
352
353 for (Op = AmlOpcodeInfo; Op->OpcodeString; Op++)
354 {
355 if (!Op->OpcodeName) /* Unused opcodes */
356 {
357 continue;
358 }
359
360 if (!Name)
361 {
362 AhDisplayAmlOpcode (Op);
363 Found = TRUE;
364 continue;
365 }
366
367 /* Upper case the opcode name before substring compare */
368
369 strcpy (Gbl_Buffer, Op->OpcodeName);
370 AhStrupr (Gbl_Buffer);
371
372 if (strstr (Gbl_Buffer, Name) == Gbl_Buffer)
373 {
374 AhDisplayAmlOpcode (Op);
375 Found = TRUE;
376 }
377 }
378
379 if (!Found)
380 {
381 printf ("%s, no matching AML operators\n", Name);
382 }
383 }
384
385
386 /*******************************************************************************
387 *
388 * FUNCTION: AhDecodeAmlOpcode (entry point for AML opcode search)
389 *
390 * PARAMETERS: OpcodeString - String version of AML opcode
391 *
392 * RETURN: None
393 *
394 * DESCRIPTION: Display information about the input AML opcode
395 *
396 ******************************************************************************/
397
398 void
399 AhDecodeAmlOpcode (
400 char *OpcodeString)
401 {
402 const AH_AML_OPCODE *Op;
403 UINT32 Opcode;
404 UINT8 Prefix;
405
406
407 if (!OpcodeString)
408 {
409 AhFindAmlOpcode (NULL);
410 return;
411 }
412
413 Opcode = ACPI_STRTOUL (OpcodeString, NULL, 16);
414 if (Opcode > ACPI_UINT16_MAX)
415 {
416 printf ("Invalid opcode (more than 16 bits)\n");
417 return;
418 }
419
420 /* Only valid opcode extension is 0x5B */
421
422 Prefix = (Opcode & 0x0000FF00) >> 8;
423 if (Prefix && (Prefix != 0x5B))
424 {
425 printf ("Invalid opcode (invalid extension prefix 0x%X)\n",
426 Prefix);
427 return;
428 }
429
430 /* Find/Display the opcode. May fall within an opcode range */
431
432 for (Op = AmlOpcodeInfo; Op->OpcodeString; Op++)
433 {
434 if ((Opcode >= Op->OpcodeRangeStart) &&
435 (Opcode <= Op->OpcodeRangeEnd))
436 {
437 AhDisplayAmlOpcode (Op);
438 }
439 }
440 }
441
442
443 /*******************************************************************************
444 *
445 * FUNCTION: AhDisplayAmlOpcode
446 *
447 * PARAMETERS: Op - An opcode info struct
448 *
449 * RETURN: None
450 *
451 * DESCRIPTION: Display the contents of an AML opcode information struct
452 *
453 ******************************************************************************/
454
455 static void
456 AhDisplayAmlOpcode (
457 const AH_AML_OPCODE *Op)
458 {
459
460 if (!Op->OpcodeName)
461 {
462 printf ("%18s: Opcode=%-9s\n", "Reserved opcode", Op->OpcodeString);
463 return;
464 }
465
466 /* Opcode name and value(s) */
467
468 printf ("%18s: Opcode=%-9s Type (%s)",
469 Op->OpcodeName, Op->OpcodeString, Op->Type);
470
471 /* Optional fixed/static arguments */
472
473 if (Op->FixedArguments)
474 {
475 printf (" FixedArgs (");
476 AhPrintOneField (37, 36 + 7 + strlen (Op->Type) + 12,
477 AH_MAX_AML_LINE_LENGTH, Op->FixedArguments);
478 printf (")");
479 }
480
481 /* Optional variable-length argument list */
482
483 if (Op->VariableArguments)
484 {
485 if (Op->FixedArguments)
486 {
487 printf ("\n%*s", 36, " ");
488 }
489 printf (" VariableArgs (");
490 AhPrintOneField (37, 15, AH_MAX_AML_LINE_LENGTH, Op->VariableArguments);
491 printf (")");
492 }
493 printf ("\n");
494
495 /* Grammar specification */
496
497 if (Op->Grammar)
498 {
499 AhPrintOneField (37, 0, AH_MAX_AML_LINE_LENGTH, Op->Grammar);
500 printf ("\n");
501 }
502 }
503
504
505 /*******************************************************************************
506 *
507 * FUNCTION: AhFindAslKeywords (entry point for ASL keyword search)
508 *
509 * PARAMETERS: Name - Name or prefix for an ASL keyword.
510 * NULL means "find all"
511 *
512 * RETURN: None
513 *
514 * DESCRIPTION: Find all ASL keywords that match the input Name or name
515 * prefix.
516 *
517 ******************************************************************************/
518
519 void
520 AhFindAslKeywords (
521 char *Name)
522 {
523 const AH_ASL_KEYWORD *Keyword;
524 BOOLEAN Found = FALSE;
525
526
527 AhStrupr (Name);
528
529 for (Keyword = AslKeywordInfo; Keyword->Name; Keyword++)
530 {
531 if (!Name)
532 {
533 AhDisplayAslKeyword (Keyword);
534 Found = TRUE;
535 continue;
536 }
537
538 /* Upper case the operator name before substring compare */
539
540 strcpy (Gbl_Buffer, Keyword->Name);
541 AhStrupr (Gbl_Buffer);
542
543 if (strstr (Gbl_Buffer, Name) == Gbl_Buffer)
544 {
545 AhDisplayAslKeyword (Keyword);
546 Found = TRUE;
547 }
548 }
549
550 if (!Found)
551 {
552 printf ("%s, no matching ASL keywords\n", Name);
553 }
554 }
555
556
557 /*******************************************************************************
558 *
559 * FUNCTION: AhDisplayAslKeyword
560 *
561 * PARAMETERS: Op - Pointer to ASL keyword with syntax info
562 *
563 * RETURN: None
564 *
565 * DESCRIPTION: Format and display syntax info for an ASL keyword. Splits
566 * long lines appropriately for reading.
567 *
568 ******************************************************************************/
569
570 static void
571 AhDisplayAslKeyword (
572 const AH_ASL_KEYWORD *Op)
573 {
574
575 /* ASL keyword name and description */
576
577 printf ("%22s: %s\n", Op->Name, Op->Description);
578 if (!Op->KeywordList)
579 {
580 return;
581 }
582
583 /* List of actual keywords */
584
585 AhPrintOneField (24, 0, AH_MAX_ASL_LINE_LENGTH, Op->KeywordList);
586 printf ("\n");
587 }
588
589
590 /*******************************************************************************
591 *
592 * FUNCTION: AhFindAslOperators (entry point for ASL operator search)
593 *
594 * PARAMETERS: Name - Name or prefix for an ASL operator.
595 * NULL means "find all"
596 *
597 * RETURN: None
598 *
599 * DESCRIPTION: Find all ASL operators that match the input Name or name
600 * prefix.
601 *
602 ******************************************************************************/
603
604 void
605 AhFindAslOperators (
606 char *Name)
607 {
608 const AH_ASL_OPERATOR *Operator;
609 BOOLEAN Found = FALSE;
610
611
612 AhStrupr (Name);
613
614 /* Find/display all names that match the input name prefix */
615
616 for (Operator = AslOperatorInfo; Operator->Name; Operator++)
617 {
618 if (!Name)
619 {
620 AhDisplayAslOperator (Operator);
621 Found = TRUE;
622 continue;
623 }
624
625 /* Upper case the operator name before substring compare */
626
627 strcpy (Gbl_Buffer, Operator->Name);
628 AhStrupr (Gbl_Buffer);
629
630 if (strstr (Gbl_Buffer, Name) == Gbl_Buffer)
631 {
632 AhDisplayAslOperator (Operator);
633 Found = TRUE;
634 }
635 }
636
637 if (!Found)
638 {
639 printf ("%s, no matching ASL operators\n", Name);
640 }
641 }
642
643
644 /*******************************************************************************
645 *
646 * FUNCTION: AhDisplayAslOperator
647 *
648 * PARAMETERS: Op - Pointer to ASL operator with syntax info
649 *
650 * RETURN: None
651 *
652 * DESCRIPTION: Format and display syntax info for an ASL operator. Splits
653 * long lines appropriately for reading.
654 *
655 ******************************************************************************/
656
657 static void
658 AhDisplayAslOperator (
659 const AH_ASL_OPERATOR *Op)
660 {
661
662 /* ASL operator name and description */
663
664 printf ("%16s: %s\n", Op->Name, Op->Description);
665 if (!Op->Syntax)
666 {
667 return;
668 }
669
670 /* Syntax for the operator */
671
672 AhPrintOneField (18, 0, AH_MAX_ASL_LINE_LENGTH, Op->Syntax);
673 printf ("\n");
674
675 AhDisplayOperatorKeywords (Op);
676 printf ("\n");
677 }
678
679
680 /*******************************************************************************
681 *
682 * FUNCTION: AhDisplayOperatorKeywords
683 *
684 * PARAMETERS: Op - Pointer to ASL keyword with syntax info
685 *
686 * RETURN: None
687 *
688 * DESCRIPTION: Display any/all keywords that are associated with the ASL
689 * operator.
690 *
691 ******************************************************************************/
692
693 static void
694 AhDisplayOperatorKeywords (
695 const AH_ASL_OPERATOR *Op)
696 {
697 char *Token;
698 char *Separators = "(){}, ";
699 BOOLEAN FirstKeyword = TRUE;
700
701
702 if (!Op || !Op->Syntax)
703 {
704 return;
705 }
706
707 /*
708 * Find all parameters that have the word "keyword" within, and then
709 * display the info about that keyword
710 */
711 strcpy (Gbl_LineBuffer, Op->Syntax);
712 Token = strtok (Gbl_LineBuffer, Separators);
713 while (Token)
714 {
715 if (strstr (Token, "Keyword"))
716 {
717 if (FirstKeyword)
718 {
719 printf ("\n");
720 FirstKeyword = FALSE;
721 }
722
723 /* Found a keyword, display keyword information */
724
725 AhFindAslKeywords (Token);
726 }
727
728 Token = strtok (NULL, Separators);
729 }
730 }
731
732
733 /*******************************************************************************
734 *
735 * FUNCTION: AhPrintOneField
736 *
737 * PARAMETERS: Indent - Indent length for new line(s)
738 * CurrentPosition - Position on current line
739 * MaxPosition - Max allowed line length
740 * Field - Data to output
741 *
742 * RETURN: Line position after field is written
743 *
744 * DESCRIPTION: Split long lines appropriately for ease of reading.
745 *
746 ******************************************************************************/
747
748 static void
749 AhPrintOneField (
750 UINT32 Indent,
751 UINT32 CurrentPosition,
752 UINT32 MaxPosition,
753 const char *Field)
754 {
755 UINT32 Position;
756 UINT32 TokenLength;
757 const char *This;
758 const char *Next;
759 const char *Last;
760
761
762 This = Field;
763 Position = CurrentPosition;
764
765 if (Position == 0)
766 {
767 printf ("%*s", (int) Indent, " ");
768 Position = Indent;
769 }
770
771 Last = This + strlen (This);
772 while ((Next = strpbrk (This, " ")))
773 {
774 TokenLength = Next - This;
775 Position += TokenLength;
776
777 /* Split long lines */
778
779 if (Position > MaxPosition)
780 {
781 printf ("\n%*s", (int) Indent, " ");
782 Position = TokenLength;
783 }
784
785 printf ("%.*s ", (int) TokenLength, This);
786 This = Next + 1;
787 }
788
789 /* Handle last token on the input line */
790
791 TokenLength = Last - This;
792 if (TokenLength > 0)
793 {
794 Position += TokenLength;
795 if (Position > MaxPosition)
796 {
797 printf ("\n%*s", (int) Indent, " ");
798 }
799 printf ("%s", This);
800 }
801 }
802
803
804 /*******************************************************************************
805 *
806 * FUNCTION: AhDisplayDeviceIds
807 *
808 * PARAMETERS: None
809 *
810 * RETURN: None
811 *
812 * DESCRIPTION: Display all PNP* and ACPI* device IDs defined in the ACPI spec.
813 *
814 ******************************************************************************/
815
816 void
817 AhDisplayDeviceIds (
818 void)
819 {
820 const AH_DEVICE_ID *DeviceId = AhDeviceIds;
821
822
823 printf ("ACPI and PNP Device IDs defined in the ACPI specification:\n\n");
824 while (DeviceId->Name)
825 {
826 printf ("%8s %s\n", DeviceId->Name, DeviceId->Description);
827 DeviceId++;
828 }
829 }
830
831
832 /*******************************************************************************
833 *
834 * FUNCTION: AhDecodeException
835 *
836 * PARAMETERS: HexString - ACPI status string from command line, in
837 * hex. If null, display all exceptions.
838 *
839 * RETURN: None
840 *
841 * DESCRIPTION: Decode and display an ACPI_STATUS exception code.
842 *
843 ******************************************************************************/
844
845 void
846 AhDecodeException (
847 char *HexString)
848 {
849 const ACPI_EXCEPTION_INFO *ExceptionInfo;
850 UINT32 Status;
851 UINT32 i;
852
853
854 /*
855 * A null input string means to decode and display all known
856 * exception codes.
857 */
858 if (!HexString)
859 {
860 printf ("All defined ACPICA exception codes:\n\n");
861 AH_DISPLAY_EXCEPTION (0, "AE_OK (No error occurred)");
862
863 /* Display codes in each block of exception types */
864
865 for (i = 1; (i & AE_CODE_MASK) <= AE_CODE_MAX; i += 0x1000)
866 {
867 Status = i;
868 do
869 {
870 ExceptionInfo = AcpiUtValidateException ((ACPI_STATUS) Status);
871 if (ExceptionInfo)
872 {
873 AH_DISPLAY_EXCEPTION_TEXT (Status, ExceptionInfo);
874 }
875 Status++;
876
877 } while (ExceptionInfo);
878 }
879 return;
880 }
881
882 /* Decode a single user-supplied exception code */
883
884 Status = ACPI_STRTOUL (HexString, NULL, 16);
885 if (!Status)
886 {
887 printf ("%s: Invalid hexadecimal exception code value\n", HexString);
888 return;
889 }
890
891 if (Status > ACPI_UINT16_MAX)
892 {
893 AH_DISPLAY_EXCEPTION (Status, "Invalid exception code (more than 16 bits)");
894 return;
895 }
896
897 ExceptionInfo = AcpiUtValidateException ((ACPI_STATUS) Status);
898 if (!ExceptionInfo)
899 {
900 AH_DISPLAY_EXCEPTION (Status, "Unknown exception code");
901 return;
902 }
903
904 AH_DISPLAY_EXCEPTION_TEXT (Status, ExceptionInfo);
905 }
906