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