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