ShellPkg: Add acpiview tool to dump ACPI tables
[mirror_edk2.git] / ShellPkg / Library / UefiShellAcpiViewCommandLib / UefiShellAcpiViewCommandLib.c
1 /**\r
2   Main file for 'acpiview' Shell command function.\r
3 \r
4   Copyright (c) 2016 - 2018, ARM Limited. All rights reserved.<BR>\r
5   This program and the accompanying materials\r
6   are licensed and made available under the terms and conditions of the BSD License\r
7   which accompanies this distribution.  The full text of the license may be found at\r
8   http://opensource.org/licenses/bsd-license.php\r
9 \r
10   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12 **/\r
13 \r
14 #include <Guid/ShellLibHiiGuid.h>\r
15 #include <IndustryStandard/Acpi.h>\r
16 #include <Library/HiiLib.h>\r
17 #include <Library/ShellCommandLib.h>\r
18 #include <Library/UefiLib.h>\r
19 #include <Library/UefiBootServicesTableLib.h>\r
20 #include <Uefi.h>\r
21 #include "AcpiParser.h"\r
22 #include "AcpiTableParser.h"\r
23 #include "AcpiView.h"\r
24 #include "UefiShellAcpiViewCommandLib.h"\r
25 \r
26 CONST CHAR16 gShellAcpiViewFileName[] = L"ShellCommand";\r
27 \r
28 /**\r
29   A list of available table parsers.\r
30 */\r
31 STATIC\r
32 CONST\r
33 ACPI_TABLE_PARSER ParserList[] = {\r
34   {EFI_ACPI_6_2_BOOT_GRAPHICS_RESOURCE_TABLE_SIGNATURE, ParseAcpiBgrt},\r
35   {EFI_ACPI_6_2_DEBUG_PORT_2_TABLE_SIGNATURE, ParseAcpiDbg2},\r
36   {EFI_ACPI_6_2_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE,\r
37    ParseAcpiDsdt},\r
38   {EFI_ACPI_6_2_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE, ParseAcpiFadt},\r
39   {EFI_ACPI_6_2_GENERIC_TIMER_DESCRIPTION_TABLE_SIGNATURE, ParseAcpiGtdt},\r
40   {EFI_ACPI_6_2_IO_REMAPPING_TABLE_SIGNATURE, ParseAcpiIort},\r
41   {EFI_ACPI_6_2_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE, ParseAcpiMadt},\r
42   {EFI_ACPI_6_2_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE,\r
43    ParseAcpiMcfg},\r
44   {RSDP_TABLE_INFO, ParseAcpiRsdp},\r
45   {EFI_ACPI_6_2_SYSTEM_LOCALITY_INFORMATION_TABLE_SIGNATURE, ParseAcpiSlit},\r
46   {EFI_ACPI_6_2_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE, ParseAcpiSpcr},\r
47   {EFI_ACPI_6_2_SYSTEM_RESOURCE_AFFINITY_TABLE_SIGNATURE, ParseAcpiSrat},\r
48   {EFI_ACPI_6_2_SECONDARY_SYSTEM_DESCRIPTION_TABLE_SIGNATURE, ParseAcpiSsdt},\r
49   {EFI_ACPI_6_2_EXTENDED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE, ParseAcpiXsdt}\r
50 };\r
51 \r
52 /** This function registers all the available table parsers.\r
53 \r
54   @retval EFI_SUCCESS           The parser is registered.\r
55   @retval EFI_ALREADY_STARTED   The parser for the ACPI Table\r
56                                 was already registered.\r
57   @retval EFI_INVALID_PARAMETER A parameter is invalid.\r
58   @retval EFI_OUT_OF_RESOURCES  No space to register the\r
59                                 parser.\r
60 */\r
61 EFI_STATUS\r
62 RegisterAllParsers (\r
63   )\r
64 {\r
65   EFI_STATUS Status;\r
66   UINTN Count = sizeof (ParserList) / sizeof (ParserList[0]);\r
67   while (Count-- != 0) {\r
68     Status = RegisterParser (\r
69                ParserList[Count].Signature,\r
70                ParserList[Count].Parser\r
71                );\r
72     if (EFI_ERROR (Status)) {\r
73       return Status;\r
74     }\r
75   }\r
76   return Status;\r
77 }\r
78 \r
79 /**\r
80   Return the file name of the help text file if not using HII.\r
81 \r
82   @return The string pointer to the file name.\r
83 */\r
84 CONST CHAR16*\r
85 EFIAPI\r
86 ShellCommandGetManFileNameAcpiView (\r
87   VOID\r
88   )\r
89 {\r
90   return gShellAcpiViewFileName;\r
91 }\r
92 \r
93 /**\r
94   Constructor for the Shell AcpiView Command library.\r
95 \r
96   Install the handlers for acpiview UEFI Shell command.\r
97 \r
98   @param ImageHandle            The image handle of the process.\r
99   @param SystemTable            The EFI System Table pointer.\r
100 \r
101   @retval EFI_SUCCESS           The Shell command handlers were installed\r
102                                 successfully.\r
103   @retval EFI_DEVICE_ERROR      Hii package failed to install.\r
104 */\r
105 EFI_STATUS\r
106 EFIAPI\r
107 UefiShellAcpiViewCommandLibConstructor (\r
108   IN EFI_HANDLE        ImageHandle,\r
109   IN EFI_SYSTEM_TABLE  *SystemTable\r
110   )\r
111 {\r
112   EFI_STATUS Status;\r
113   gShellAcpiViewHiiHandle = NULL;\r
114 \r
115   // Check Shell Profile Debug1 bit of the profiles mask\r
116   if ((FixedPcdGet8 (PcdShellProfileMask) & BIT1) == 0) {\r
117     return EFI_SUCCESS;\r
118   }\r
119 \r
120   Status = RegisterAllParsers ();\r
121   if (EFI_ERROR (Status)) {\r
122     Print (L"acpiview: Error failed to register parser.\n");\r
123     return Status;\r
124   }\r
125 \r
126   gShellAcpiViewHiiHandle = HiiAddPackages (\r
127                               &gShellAcpiViewHiiGuid,\r
128                               gImageHandle,\r
129                               UefiShellAcpiViewCommandLibStrings,\r
130                               NULL\r
131                               );\r
132   if (gShellAcpiViewHiiHandle == NULL) {\r
133     return EFI_DEVICE_ERROR;\r
134   }\r
135   // Install our Shell command handler\r
136   ShellCommandRegisterCommandName (\r
137     L"acpiview",\r
138     ShellCommandRunAcpiView,\r
139     ShellCommandGetManFileNameAcpiView,\r
140     0,\r
141     L"acpiview",\r
142     TRUE,\r
143     gShellAcpiViewHiiHandle,\r
144     STRING_TOKEN (STR_GET_HELP_ACPIVIEW)\r
145     );\r
146 \r
147   return EFI_SUCCESS;\r
148 }\r
149 \r
150 /**\r
151   Destructor for the library. free any resources.\r
152 \r
153   @param ImageHandle            The image handle of the process.\r
154   @param SystemTable            The EFI System Table pointer.\r
155 */\r
156 EFI_STATUS\r
157 EFIAPI\r
158 UefiShellAcpiViewCommandLibDestructor (\r
159   IN EFI_HANDLE        ImageHandle,\r
160   IN EFI_SYSTEM_TABLE  *SystemTable\r
161   )\r
162 {\r
163   if (gShellAcpiViewHiiHandle != NULL) {\r
164     HiiRemovePackages (gShellAcpiViewHiiHandle);\r
165   }\r
166   return EFI_SUCCESS;\r
167 }\r