]> git.proxmox.com Git - mirror_edk2.git/blob - ShellPkg/Library/UefiShellDriver1CommandsLib/Devices.c
Adding Driver1 profile commands to the UEFI Shell 2.0.
[mirror_edk2.git] / ShellPkg / Library / UefiShellDriver1CommandsLib / Devices.c
1 /** @file
2 Main file for devices shell Driver1 function.
3
4 Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13 **/
14
15 #include "UefiShellDriver1CommandsLib.h"
16
17 EFI_STATUS
18 EFIAPI
19 GetDeviceHandleInfo (
20 IN EFI_HANDLE TheHandle,
21 IN CHAR16 *Type,
22 IN BOOLEAN *Cfg,
23 IN BOOLEAN *Diag,
24 IN UINTN *Parents,
25 IN UINTN *Devices,
26 IN UINTN *Children,
27 OUT CHAR16 **Name,
28 IN CONST CHAR8 *Language
29 )
30 {
31 EFI_STATUS Status;
32 EFI_HANDLE *HandleBuffer;
33 UINTN Count;
34
35 if (TheHandle == NULL
36 || Type == NULL
37 || Cfg == NULL
38 || Diag == NULL
39 || Parents == NULL
40 || Devices == NULL
41 || Children == NULL
42 || Name == NULL ) {
43 return (EFI_INVALID_PARAMETER);
44 }
45
46 *Cfg = FALSE;
47 *Diag = FALSE;
48 *Children = 0;
49 *Parents = 0;
50 *Devices = 0;
51 *Type = L' ';
52 *Name = CHAR_NULL;
53 HandleBuffer = NULL;
54 Status = EFI_SUCCESS;
55
56 gEfiShellProtocol->GetDeviceName(TheHandle, EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8*)Language, Name);
57
58 Status = ParseHandleDatabaseForChildControllers(TheHandle, Children, NULL);
59 if (!EFI_ERROR(Status)) {
60 Status = PARSE_HANDLE_DATABASE_PARENTS(TheHandle, Parents, NULL);
61 if (/*!EFI_ERROR(Status) && */Parents != NULL && Children != NULL) {
62 if (*Parents == 0) {
63 *Type = L'R';
64 } else if (*Children > 0) {
65 *Type = L'B';
66 } else {
67 *Type = L'D';
68 }
69 }
70 }
71 Status = PARSE_HANDLE_DATABASE_UEFI_DRIVERS(TheHandle, Devices, &HandleBuffer);
72 if (!EFI_ERROR(Status) && Devices != NULL && HandleBuffer != NULL) {
73 for (Count = 0 ; Count < *Devices ; Count++) {
74 if (!EFI_ERROR(gBS->OpenProtocol(HandleBuffer[Count], &gEfiDriverConfigurationProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {
75 *Cfg = TRUE;
76 }
77 if (!EFI_ERROR(gBS->OpenProtocol(HandleBuffer[Count], &gEfiDriverDiagnosticsProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {
78 *Diag = TRUE;
79 }
80 if (!EFI_ERROR(gBS->OpenProtocol(HandleBuffer[Count], &gEfiDriverDiagnostics2ProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {
81 *Diag = TRUE;
82 }
83 }
84 SHELL_FREE_NON_NULL(HandleBuffer);
85 }
86
87 return (Status);
88 }
89
90 STATIC CONST SHELL_PARAM_ITEM ParamList[] = {
91 {L"-l", TypeValue},
92 {NULL, TypeMax}
93 };
94
95 /**
96 Function for 'devices' command.
97
98 @param[in] ImageHandle Handle to the Image (NULL if Internal).
99 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
100 **/
101 SHELL_STATUS
102 EFIAPI
103 ShellCommandRunDevices (
104 IN EFI_HANDLE ImageHandle,
105 IN EFI_SYSTEM_TABLE *SystemTable
106 )
107 {
108 EFI_STATUS Status;
109 LIST_ENTRY *Package;
110 CHAR16 *ProblemParam;
111 SHELL_STATUS ShellStatus;
112 CHAR8 *Language;
113 EFI_HANDLE *HandleList;
114 EFI_HANDLE *HandleListWalker;
115 CHAR16 Type;
116 BOOLEAN Cfg;
117 BOOLEAN Diag;
118 UINTN Parents;
119 UINTN Devices;
120 UINTN Children;
121 CHAR16 *Name;
122 CONST CHAR16 *Lang;
123
124 ShellStatus = SHELL_SUCCESS;
125 Language = NULL;
126
127 //
128 // initialize the shell lib (we must be in non-auto-init...)
129 //
130 Status = ShellInitialize();
131 ASSERT_EFI_ERROR(Status);
132
133 Status = CommandInit();
134 ASSERT_EFI_ERROR(Status);
135
136 //
137 // parse the command line
138 //
139 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);
140 if (EFI_ERROR(Status)) {
141 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {
142 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, ProblemParam);
143 FreePool(ProblemParam);
144 ShellStatus = SHELL_INVALID_PARAMETER;
145 } else {
146 ASSERT(FALSE);
147 }
148 } else {
149 //
150 // if more than 0 'value' parameters we have too many parameters
151 //
152 if (ShellCommandLineGetRawValue(Package, 1) != NULL){
153 //
154 // error for too many parameters
155 //
156 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle);
157 ShellStatus = SHELL_INVALID_PARAMETER;
158 } else {
159 //
160 // get the language if necessary
161 //
162 Lang = ShellCommandLineGetValue(Package, L"-l");
163 if (Lang != NULL) {
164 Language = AllocateZeroPool(StrSize(Lang));
165 AsciiSPrint(Language, StrSize(Lang), "%S", Lang);
166 } else if (!ShellCommandLineGetFlag(Package, L"-l")){
167 ASSERT(Language == NULL);
168 // Language = AllocateZeroPool(10);
169 // AsciiSPrint(Language, 10, "en-us");
170 } else {
171 ASSERT(Language == NULL);
172 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"-l");
173 ShellCommandLineFreeVarList (Package);
174 return (SHELL_INVALID_PARAMETER);
175 }
176
177
178 //
179 // Print Header
180 //
181 ShellPrintHiiEx(-1, -1, Language, STRING_TOKEN (STR_DEVICES_HEADER_LINES), gShellDriver1HiiHandle);
182
183 //
184 // loop through each handle
185 //
186 HandleList = GetHandleListByProtocol(NULL);
187 ASSERT(HandleList != NULL);
188 for (HandleListWalker = HandleList
189 ; HandleListWalker != NULL && *HandleListWalker != NULL /*&& !EFI_ERROR(Status)*/
190 ; HandleListWalker++
191 ){
192
193 //
194 // get all the info on each handle
195 //
196 Name = NULL;
197 Status = GetDeviceHandleInfo(*HandleListWalker, &Type, &Cfg, &Diag, &Parents, &Devices, &Children, &Name, Language);
198 if (Parents != 0 || Devices != 0 || Children != 0) {
199 ShellPrintHiiEx(
200 -1,
201 -1,
202 Language,
203 STRING_TOKEN (STR_DEVICES_ITEM_LINE),
204 gShellDriver1HiiHandle,
205 ConvertHandleToHandleIndex(*HandleListWalker),
206 Type,
207 Cfg?L'X':L'-',
208 Diag?L'X':L'-',
209 Parents,
210 Devices,
211 Children,
212 Name!=NULL?Name:L"<UNKNOWN>");
213 }
214 if (Name != NULL) {
215 FreePool(Name);
216 }
217 }
218
219 if (HandleList != NULL) {
220 FreePool(HandleList);
221 }
222
223 }
224 SHELL_FREE_NON_NULL(Language);
225 ShellCommandLineFreeVarList (Package);
226 }
227 return (ShellStatus);
228 }
229