245700a2534552d9786ecb109dc1b3c9fa793495
[mirror_edk2.git] / ShellPkg / Library / UefiShellAcpiViewCommandLib / UefiShellAcpiViewCommandLib.c
1 /** @file\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 /**\r
53   This function registers all the available table parsers.\r
54 \r
55   @retval EFI_SUCCESS           The parser is registered.\r
56   @retval EFI_ALREADY_STARTED   The parser for the ACPI Table\r
57                                 was already registered.\r
58   @retval EFI_INVALID_PARAMETER A parameter is invalid.\r
59   @retval EFI_OUT_OF_RESOURCES  No space to register the\r
60                                 parser.\r
61 **/\r
62 EFI_STATUS\r
63 RegisterAllParsers (\r
64   )\r
65 {\r
66   EFI_STATUS Status;\r
67   UINTN Count;\r
68 \r
69   Status = EFI_SUCCESS;\r
70   Count = sizeof (ParserList) / sizeof (ParserList[0]);\r
71 \r
72   while (Count-- != 0) {\r
73     Status = RegisterParser (\r
74                ParserList[Count].Signature,\r
75                ParserList[Count].Parser\r
76                );\r
77     if (EFI_ERROR (Status)) {\r
78       return Status;\r
79     }\r
80   }\r
81   return Status;\r
82 }\r
83 \r
84 /**\r
85   Return the file name of the help text file if not using HII.\r
86 \r
87   @return The string pointer to the file name.\r
88 **/\r
89 CONST CHAR16*\r
90 EFIAPI\r
91 ShellCommandGetManFileNameAcpiView (\r
92   VOID\r
93   )\r
94 {\r
95   return gShellAcpiViewFileName;\r
96 }\r
97 \r
98 /**\r
99   Constructor for the Shell AcpiView Command library.\r
100 \r
101   Install the handlers for acpiview UEFI Shell command.\r
102 \r
103   @param ImageHandle            The image handle of the process.\r
104   @param SystemTable            The EFI System Table pointer.\r
105 \r
106   @retval EFI_SUCCESS           The Shell command handlers were installed\r
107                                 successfully.\r
108   @retval EFI_DEVICE_ERROR      Hii package failed to install.\r
109 **/\r
110 EFI_STATUS\r
111 EFIAPI\r
112 UefiShellAcpiViewCommandLibConstructor (\r
113   IN EFI_HANDLE        ImageHandle,\r
114   IN EFI_SYSTEM_TABLE  *SystemTable\r
115   )\r
116 {\r
117   EFI_STATUS Status;\r
118   gShellAcpiViewHiiHandle = NULL;\r
119 \r
120   // Check Shell Profile Debug1 bit of the profiles mask\r
121   if ((FixedPcdGet8 (PcdShellProfileMask) & BIT1) == 0) {\r
122     return EFI_SUCCESS;\r
123   }\r
124 \r
125   Status = RegisterAllParsers ();\r
126   if (EFI_ERROR (Status)) {\r
127     Print (L"acpiview: Error failed to register parser.\n");\r
128     return Status;\r
129   }\r
130 \r
131   gShellAcpiViewHiiHandle = HiiAddPackages (\r
132                               &gShellAcpiViewHiiGuid,\r
133                               gImageHandle,\r
134                               UefiShellAcpiViewCommandLibStrings,\r
135                               NULL\r
136                               );\r
137   if (gShellAcpiViewHiiHandle == NULL) {\r
138     return EFI_DEVICE_ERROR;\r
139   }\r
140   // Install our Shell command handler\r
141   ShellCommandRegisterCommandName (\r
142     L"acpiview",\r
143     ShellCommandRunAcpiView,\r
144     ShellCommandGetManFileNameAcpiView,\r
145     0,\r
146     L"acpiview",\r
147     TRUE,\r
148     gShellAcpiViewHiiHandle,\r
149     STRING_TOKEN (STR_GET_HELP_ACPIVIEW)\r
150     );\r
151 \r
152   return EFI_SUCCESS;\r
153 }\r
154 \r
155 /**\r
156   Destructor for the library. free any resources.\r
157 \r
158   @param ImageHandle            The image handle of the process.\r
159   @param SystemTable            The EFI System Table pointer.\r
160 **/\r
161 EFI_STATUS\r
162 EFIAPI\r
163 UefiShellAcpiViewCommandLibDestructor (\r
164   IN EFI_HANDLE        ImageHandle,\r
165   IN EFI_SYSTEM_TABLE  *SystemTable\r
166   )\r
167 {\r
168   if (gShellAcpiViewHiiHandle != NULL) {\r
169     HiiRemovePackages (gShellAcpiViewHiiHandle);\r
170   }\r
171   return EFI_SUCCESS;\r
172 }\r