]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDebug1CommandsLib/Bcfg.c
Refine comments and two code style.
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / Bcfg.c
CommitLineData
5d73d92f 1/** @file\r
3737ac2b 2 Main file for bcfg shell Debug1 function.\r
5d73d92f 3\r
3737ac2b 4 Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>\r
5d73d92f 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\r
15#include "UefiShellDebug1CommandsLib.h"\r
16#include <Guid/GlobalVariable.h>\r
17#include <Library/PrintLib.h>\r
18#include <Library/HandleParsingLib.h>\r
19#include <Library/DevicePathLib.h>\r
20\r
21typedef enum {\r
3737ac2b 22 BcfgTargetBootOrder = 0,\r
23 BcfgTargetDriverOrder = 1,\r
24 BcfgTargetMax = 2\r
5d73d92f 25} BCFG_OPERATION_TARGET;\r
26\r
27typedef enum {\r
3737ac2b 28 BcfgTypeDump = 0,\r
29 BcfgTypeAdd = 1,\r
30 BcfgTypeAddp = 2,\r
31 BcfgTypeAddh = 3,\r
32 BcfgTypeRm = 4,\r
33 BcfgTypeMv = 5,\r
34 BcfgTypeOpt = 6,\r
35 BcfgTypeMax = 7\r
5d73d92f 36} BCFG_OPERATION_TYPE;\r
37\r
38typedef struct {\r
39 BCFG_OPERATION_TARGET Target;\r
40 BCFG_OPERATION_TYPE Type;\r
41 UINT16 Number1;\r
42 UINT16 Number2;\r
43 UINTN HandleIndex;\r
44 CHAR16 *FileName;\r
45 CHAR16 *Description;\r
46 UINT16 *Order;\r
47 CONST CHAR16 *OptData;\r
48} BGFG_OPERATION;\r
49\r
6878e7a7 50/**\r
51 This function will populate the device path protocol parameter based on TheHandle.\r
4ff7e37b
ED
52\r
53 @param[in] TheHandle Driver handle.\r
54 @param[in, out] FilePath On a sucessful return the device path to the handle.\r
6878e7a7 55\r
56 @retval EFI_SUCCESS The device path was sucessfully returned.\r
57 @retval other A error from gBS->HandleProtocol.\r
58\r
59 @sa HandleProtocol\r
60**/\r
61EFI_STATUS\r
62EFIAPI\r
63GetDevicePathForDriverHandleDebug1 (\r
64 IN EFI_HANDLE TheHandle,\r
65 IN OUT EFI_DEVICE_PATH_PROTOCOL **FilePath\r
66 )\r
67{\r
68 EFI_STATUS Status;\r
69 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;\r
70 EFI_DEVICE_PATH_PROTOCOL *ImageDevicePath;\r
71\r
72 Status = gBS->OpenProtocol (\r
73 TheHandle,\r
74 &gEfiLoadedImageProtocolGuid,\r
75 (VOID**)&LoadedImage,\r
76 gImageHandle,\r
77 NULL,\r
78 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
79 );\r
80 if (!EFI_ERROR (Status)) {\r
81 Status = gBS->OpenProtocol (\r
82 LoadedImage->DeviceHandle,\r
83 &gEfiDevicePathProtocolGuid,\r
84 (VOID**)&ImageDevicePath,\r
85 gImageHandle,\r
86 NULL,\r
87 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
88 );\r
89 if (!EFI_ERROR (Status)) {\r
90// *DevPath = DuplicateDevicePath (ImageDevicePath);\r
91// *FilePath = DuplicateDevicePath (LoadedImage->FilePath);\r
92 *FilePath = AppendDevicePath(ImageDevicePath,LoadedImage->FilePath);\r
93 gBS->CloseProtocol(\r
94 LoadedImage->DeviceHandle,\r
95 &gEfiDevicePathProtocolGuid,\r
96 gImageHandle,\r
97 NULL);\r
98 }\r
99 gBS->CloseProtocol(\r
100 TheHandle,\r
101 &gEfiLoadedImageProtocolGuid,\r
102 gImageHandle,\r
103 NULL);\r
104 }\r
105 return (Status);\r
106}\r
107\r
3737ac2b 108/**\r
109 Function to add a option.\r
110\r
111 @param[in] Position The position to add Target at.\r
112 @param[in] File The file to make the target.\r
113 @param[in] Desc The description text.\r
114 @param[in] CurrentOrder The pointer to the current order of items.\r
115 @param[in] OrderCount The number if items in CurrentOrder.\r
116 @param[in] Target The info on the option to add.\r
117 @param[in] UseHandle TRUE to use HandleNumber, FALSE to use File and Desc.\r
118 @param[in] UsePath TRUE to convert to devicepath.\r
119 @param[in] HandleNumber The handle number to add.\r
120\r
121 @retval SHELL_SUCCESS The operation was successful.\r
122 @retval SHELL_INVALID_PARAMETER A parameter was invalid.\r
123**/\r
5d73d92f 124SHELL_STATUS\r
125EFIAPI\r
3737ac2b 126BcfgAddDebug1(\r
5d73d92f 127 IN UINTN Position,\r
128 IN CONST CHAR16 *File,\r
129 IN CONST CHAR16 *Desc,\r
130 IN CONST UINT16 *CurrentOrder,\r
131 IN CONST UINTN OrderCount,\r
132 IN CONST BCFG_OPERATION_TARGET Target,\r
133 IN CONST BOOLEAN UseHandle,\r
134 IN CONST BOOLEAN UsePath,\r
135 IN CONST UINTN HandleNumber\r
136 )\r
137{\r
138 EFI_STATUS Status;\r
3737ac2b 139 EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
140 EFI_DEVICE_PATH_PROTOCOL *FilePath;\r
141 EFI_DEVICE_PATH_PROTOCOL *FileNode;\r
6878e7a7 142// EFI_DEVICE_PATH_PROTOCOL *DevPath;\r
5d73d92f 143 CHAR16 *Str;\r
6878e7a7 144// CONST CHAR16 *StringWalker;\r
3737ac2b 145 UINT8 *TempByteBuffer;\r
146 UINT8 *TempByteStart;\r
5d73d92f 147 EFI_SHELL_FILE_INFO *Arg;\r
148 EFI_SHELL_FILE_INFO *FileList;\r
149 CHAR16 OptionStr[40];\r
150 UINTN DescSize, FilePathSize;\r
151 BOOLEAN Found;\r
152 UINTN TargetLocation;\r
153 UINTN Index;\r
154 EFI_HANDLE *Handles;\r
155 EFI_HANDLE CurHandle;\r
156 UINTN DriverBindingHandleCount;\r
157 UINTN ParentControllerHandleCount;\r
158 UINTN ChildControllerHandleCount;\r
159 SHELL_STATUS ShellStatus;\r
160 UINT16 *NewOrder;\r
161\r
162 if (!UseHandle) {\r
3737ac2b 163 if (File == NULL || Desc == NULL) {\r
164 return (SHELL_INVALID_PARAMETER);\r
165 }\r
5d73d92f 166 } else {\r
3737ac2b 167 if (HandleNumber == 0) {\r
168 return (SHELL_INVALID_PARAMETER);\r
169 }\r
5d73d92f 170 }\r
171\r
3737ac2b 172 if (Position > OrderCount) {\r
173 Position = OrderCount;\r
174 }\r
5d73d92f 175\r
176 Str = NULL;\r
177 FilePath = NULL;\r
178 FileNode = NULL;\r
179 FileList = NULL;\r
180 Handles = NULL;\r
181 ShellStatus = SHELL_SUCCESS;\r
182 TargetLocation = 0xFFFF;\r
183\r
5d73d92f 184 if (UseHandle) {\r
6878e7a7 185 CurHandle = ConvertHandleIndexToHandle(HandleNumber);\r
186 if (CurHandle == NULL) {\r
187 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"Handle Number");\r
5d73d92f 188 ShellStatus = SHELL_INVALID_PARAMETER;\r
189 } else {\r
6878e7a7 190 if (Target == BcfgTargetBootOrder) {\r
191 //\r
192 //Make sure that the handle should point to a real controller\r
193 //\r
194 Status = PARSE_HANDLE_DATABASE_UEFI_DRIVERS (\r
195 CurHandle,\r
196 &DriverBindingHandleCount,\r
197 NULL);\r
198\r
199 Status = PARSE_HANDLE_DATABASE_PARENTS (\r
200 CurHandle,\r
201 &ParentControllerHandleCount,\r
202 NULL);\r
203\r
204 Status = ParseHandleDatabaseForChildControllers (\r
205 CurHandle,\r
206 &ChildControllerHandleCount,\r
207 NULL);\r
208\r
209 if (DriverBindingHandleCount > 0\r
210 || ParentControllerHandleCount > 0\r
211 || ChildControllerHandleCount > 0) {\r
212 FilePath = NULL;\r
213 Status = gBS->HandleProtocol (\r
214 CurHandle,\r
215 &gEfiDevicePathProtocolGuid,\r
216 (VOID**)&FilePath);\r
217 }\r
218 if (EFI_ERROR (Status)) {\r
219 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_HANDLE), gShellDebug1HiiHandle, HandleNumber);\r
220 ShellStatus = SHELL_INVALID_PARAMETER;\r
221 }\r
222 } else {\r
223 //\r
224 //Make sure that the handle should point to driver, not a controller.\r
225 //\r
226 Status = PARSE_HANDLE_DATABASE_UEFI_DRIVERS (\r
227 CurHandle,\r
228 &DriverBindingHandleCount,\r
229 NULL);\r
230\r
231 Status = PARSE_HANDLE_DATABASE_PARENTS (\r
232 CurHandle,\r
233 &ParentControllerHandleCount,\r
234 NULL);\r
235\r
236 Status = ParseHandleDatabaseForChildControllers (\r
237 CurHandle,\r
238 &ChildControllerHandleCount,\r
239 NULL);\r
240\r
5d73d92f 241 Status = gBS->HandleProtocol (\r
242 CurHandle,\r
243 &gEfiDevicePathProtocolGuid,\r
244 (VOID**)&FilePath);\r
6878e7a7 245\r
246 if (DriverBindingHandleCount > 0\r
247 || ParentControllerHandleCount > 0\r
248 || ChildControllerHandleCount > 0\r
249 || !EFI_ERROR(Status) ) {\r
250 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"Handle Number");\r
251 ShellStatus = SHELL_INVALID_PARAMETER;\r
252 } else {\r
253 //\r
254 // Get the DevicePath from the loaded image information.\r
255 //\r
256 Status = GetDevicePathForDriverHandleDebug1(CurHandle, &FilePath);\r
257 }\r
5d73d92f 258 }\r
259 }\r
260 } else {\r
261 //\r
262 // Get file info\r
263 //\r
264 ShellOpenFileMetaArg ((CHAR16*)File, EFI_FILE_MODE_READ, &FileList);\r
265\r
3737ac2b 266 if (FileList == NULL) {\r
267 //\r
268 // If filename matched nothing fail\r
269 //\r
270 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, File);\r
271 ShellStatus = SHELL_INVALID_PARAMETER;\r
272 } else if (FileList->Link.ForwardLink != FileList->Link.BackLink) {\r
273 //\r
274 // If filename expanded to multiple names, fail\r
275 //\r
5d73d92f 276 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_FILE), gShellDebug1HiiHandle, File);\r
277 ShellStatus = SHELL_INVALID_PARAMETER;\r
278 } else {\r
279 Arg = (EFI_SHELL_FILE_INFO*)GetFirstNode(&FileList->Link);\r
280 if (EFI_ERROR(Arg->Status)) {\r
281 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_FILE_OPEN), gShellDebug1HiiHandle, File, Arg->Status);\r
282 ShellStatus = SHELL_INVALID_PARAMETER;\r
283 } else {\r
284 //\r
285 // Build FilePath to the filename\r
286 //\r
287\r
288 //\r
289 // get the device path\r
290 //\r
366f81a0 291 DevicePath = gEfiShellProtocol->GetDevicePathFromFilePath(Arg->FullName);\r
3737ac2b 292 if (DevicePath == NULL) {\r
5d73d92f 293 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_FILE_DP), gShellDebug1HiiHandle, Arg->FullName);\r
294 ShellStatus = SHELL_UNSUPPORTED;\r
295 } else {\r
6878e7a7 296/*\r
5d73d92f 297 if (UsePath) {\r
298 DevPath = DevicePath;\r
299 while (!IsDevicePathEnd(DevPath)) {\r
300 if ((DevicePathType(DevPath) == MEDIA_DEVICE_PATH) &&\r
301 (DevicePathSubType(DevPath) == MEDIA_HARDDRIVE_DP)) {\r
302\r
303 //\r
304 // If we find it use it instead\r
305 //\r
306 DevicePath = DevPath;\r
307 break;\r
308 }\r
309 DevPath = NextDevicePathNode(DevPath);\r
310 }\r
311 //\r
312 // append the file\r
313 //\r
3737ac2b 314 for(StringWalker=Arg->FullName; *StringWalker != CHAR_NULL && *StringWalker != ':'; StringWalker++);\r
315 FileNode = FileDevicePath(NULL, StringWalker+1);\r
5d73d92f 316 FilePath = AppendDevicePath(DevicePath, FileNode);\r
317 FreePool(FileNode);\r
318 } else {\r
6878e7a7 319*/\r
5d73d92f 320 FilePath = DuplicateDevicePath(DevicePath);\r
6878e7a7 321/*\r
5d73d92f 322 }\r
6878e7a7 323*/\r
5d73d92f 324 FreePool(DevicePath);\r
325 }\r
326 }\r
327 }\r
328 }\r
329\r
330\r
331 if (ShellStatus == SHELL_SUCCESS) {\r
332 //\r
333 // Find a free target ,a brute force implementation\r
334 //\r
335 Found = FALSE;\r
3737ac2b 336 for (TargetLocation=0; TargetLocation < 0xFFFF; TargetLocation++) {\r
5d73d92f 337 Found = TRUE;\r
338 for (Index=0; Index < OrderCount; Index++) {\r
339 if (CurrentOrder[Index] == TargetLocation) {\r
340 Found = FALSE;\r
341 break;\r
342 }\r
343 }\r
344\r
345 if (Found) {\r
346 break;\r
347 }\r
348 }\r
349\r
350 if (TargetLocation == 0xFFFF) {\r
351 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_TARGET_NF), gShellDebug1HiiHandle);\r
352 } else {\r
353 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_TARGET), gShellDebug1HiiHandle, TargetLocation);\r
354 }\r
355 }\r
356\r
357 if (ShellStatus == SHELL_SUCCESS) {\r
358 //\r
359 // Add the option\r
360 //\r
361 DescSize = StrSize(Desc);\r
362 FilePathSize = GetDevicePathSize (FilePath);\r
363\r
3737ac2b 364 TempByteBuffer = AllocateZeroPool(sizeof(UINT32) + sizeof(UINT16) + DescSize + FilePathSize);\r
33c031ee 365 if (TempByteBuffer != NULL) {\r
366 TempByteStart = TempByteBuffer;\r
367 *((UINT32 *) TempByteBuffer) = LOAD_OPTION_ACTIVE; // Attributes\r
368 TempByteBuffer += sizeof (UINT32);\r
5d73d92f 369\r
33c031ee 370 *((UINT16 *) TempByteBuffer) = (UINT16)FilePathSize; // FilePathListLength\r
371 TempByteBuffer += sizeof (UINT16);\r
5d73d92f 372\r
33c031ee 373 CopyMem (TempByteBuffer, Desc, DescSize);\r
374 TempByteBuffer += DescSize;\r
375 CopyMem (TempByteBuffer, FilePath, FilePathSize);\r
5d73d92f 376\r
33c031ee 377 UnicodeSPrint (OptionStr, sizeof(OptionStr), L"%s%04x", Target == BcfgTargetBootOrder?L"Boot":L"Driver", TargetLocation);\r
378 Status = gRT->SetVariable (\r
379 OptionStr,\r
380 &gEfiGlobalVariableGuid,\r
381 EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS,\r
382 sizeof(UINT32) + sizeof(UINT16) + DescSize + FilePathSize,\r
383 TempByteStart\r
384 );\r
385\r
386 FreePool(TempByteStart);\r
387 } else {\r
388 Status = EFI_OUT_OF_RESOURCES;\r
389 }\r
5d73d92f 390\r
391 if (EFI_ERROR(Status)) {\r
392 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellDebug1HiiHandle, OptionStr, Status);\r
393 } else {\r
3737ac2b 394 NewOrder = AllocateZeroPool((OrderCount+1)*sizeof(NewOrder[0]));\r
5d73d92f 395 ASSERT(NewOrder != NULL);\r
396 CopyMem(NewOrder, CurrentOrder, (OrderCount)*sizeof(NewOrder[0]));\r
397\r
398 //\r
399 // Insert target into order list\r
400 //\r
401 for (Index=OrderCount; Index > Position; Index--) {\r
402 NewOrder[Index] = NewOrder[Index-1];\r
403 }\r
404\r
405 NewOrder[Position] = (UINT16) TargetLocation;\r
406 Status = gRT->SetVariable (\r
3737ac2b 407 Target == BcfgTargetBootOrder?L"BootOrder":L"DriverOrder",\r
5d73d92f 408 &gEfiGlobalVariableGuid,\r
409 EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS,\r
410 (OrderCount+1) * sizeof(UINT16),\r
411 NewOrder\r
412 );\r
413\r
414 FreePool(NewOrder);\r
415\r
416 if (EFI_ERROR(Status)) {\r
3737ac2b 417 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellDebug1HiiHandle, Target == BcfgTargetBootOrder?L"BootOrder":L"DriverOrder", Status);\r
5d73d92f 418 ShellStatus = SHELL_INVALID_PARAMETER;\r
419 } else {\r
420 Print (L"bcfg: Add %s as %x\n", OptionStr, Position);\r
421 }\r
422 }\r
423 }\r
5d73d92f 424\r
425//\r
426//If always Free FilePath, will free devicepath in system when use "addh"\r
427//\r
5d73d92f 428 if (FilePath!=NULL && !UseHandle) {\r
429 FreePool (FilePath);\r
430 }\r
431\r
432 if (Str != NULL) {\r
433 FreePool(Str);\r
434 }\r
435\r
436 if (Handles != NULL) {\r
437 FreePool (Handles);\r
438 }\r
439\r
440 if (FileList != NULL) {\r
441 ShellCloseFileMetaArg (&FileList);\r
442 }\r
443\r
444 return (ShellStatus);\r
445}\r
446\r
3737ac2b 447/**\r
448 Funciton to remove an item.\r
449\r
450 @param[in] Target The target item to move.\r
451 @param[in] CurrentOrder The pointer to the current order of items.\r
452 @param[in] OrderCount The number if items in CurrentOrder.\r
453 @param[in] Location The current location of the Target.\r
454\r
455 @retval SHELL_SUCCESS The operation was successful.\r
456 @retval SHELL_INVALID_PARAMETER A parameter was invalid.\r
457**/\r
5d73d92f 458SHELL_STATUS\r
459EFIAPI\r
3737ac2b 460BcfgRemoveDebug1(\r
5d73d92f 461 IN CONST BCFG_OPERATION_TARGET Target,\r
462 IN CONST UINT16 *CurrentOrder,\r
463 IN CONST UINTN OrderCount,\r
6878e7a7 464 IN CONST UINT16 Location\r
5d73d92f 465 )\r
466{\r
467 CHAR16 VariableName[12];\r
468 UINT16 *NewOrder;\r
469 EFI_STATUS Status;\r
5d73d92f 470 UINTN NewCount;\r
471\r
6878e7a7 472 UnicodeSPrint(VariableName, sizeof(VariableName), L"%s%04x", Target == BcfgTargetBootOrder?L"Boot":L"Driver", CurrentOrder[Location]);\r
5d73d92f 473 Status = gRT->SetVariable(\r
474 VariableName,\r
475 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
476 EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS,\r
477 0,\r
478 NULL);\r
479 if (EFI_ERROR(Status)) {\r
480 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellDebug1HiiHandle, VariableName, Status);\r
481 return (SHELL_INVALID_PARAMETER);\r
482 }\r
3737ac2b 483 NewOrder = AllocateZeroPool(OrderCount*sizeof(CurrentOrder[0]));\r
33c031ee 484 if (NewOrder != NULL) {\r
485 NewCount = OrderCount;\r
486 CopyMem(NewOrder, CurrentOrder, OrderCount*sizeof(CurrentOrder[0]));\r
6878e7a7 487 CopyMem(NewOrder+Location, NewOrder+Location+1, (OrderCount - Location - 1)*sizeof(CurrentOrder[0]));\r
488 NewCount--;\r
489\r
33c031ee 490 Status = gRT->SetVariable(\r
491 Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder",\r
492 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
493 EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS,\r
494 NewCount*sizeof(NewOrder[0]),\r
495 NewOrder);\r
496 FreePool(NewOrder);\r
497 } else {\r
498 Status = EFI_OUT_OF_RESOURCES;\r
5d73d92f 499 }\r
5d73d92f 500 if (EFI_ERROR(Status)) {\r
3737ac2b 501 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellDebug1HiiHandle, Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder", Status);\r
5d73d92f 502 return (SHELL_INVALID_PARAMETER);\r
503 }\r
504 return (SHELL_SUCCESS);\r
505}\r
506\r
3737ac2b 507/**\r
508 Funciton to move a item to another location.\r
509\r
510 @param[in] Target The target item to move.\r
511 @param[in] CurrentOrder The pointer to the current order of items.\r
512 @param[in] OrderCount The number if items in CurrentOrder.\r
513 @param[in] OldLocation The current location of the Target.\r
514 @param[in] NewLocation The desired location of the Target.\r
515\r
516 @retval SHELL_SUCCESS The operation was successful.\r
517 @retval SHELL_INVALID_PARAMETER A parameter was invalid.\r
518**/\r
5d73d92f 519SHELL_STATUS\r
520EFIAPI\r
3737ac2b 521BcfgMoveDebug1(\r
5d73d92f 522 IN CONST BCFG_OPERATION_TARGET Target,\r
523 IN CONST UINT16 *CurrentOrder,\r
524 IN CONST UINTN OrderCount,\r
525 IN CONST UINT16 OldLocation,\r
526 IN CONST UINT16 NewLocation\r
527 )\r
528{\r
529 UINT16 *NewOrder;\r
530 EFI_STATUS Status;\r
531 UINT16 Temp;\r
532\r
3737ac2b 533 NewOrder = AllocateZeroPool(OrderCount*sizeof(CurrentOrder[0]));\r
5d73d92f 534 ASSERT(NewOrder != NULL);\r
535\r
536 Temp = CurrentOrder[OldLocation];\r
537 CopyMem(NewOrder, CurrentOrder, OrderCount*sizeof(CurrentOrder[0]));\r
538 CopyMem(NewOrder+OldLocation, NewOrder+OldLocation+1, (OrderCount - OldLocation - 1)*sizeof(CurrentOrder[0]));\r
539 CopyMem(NewOrder+NewLocation+1, NewOrder+NewLocation, (OrderCount - NewLocation - 1)*sizeof(CurrentOrder[0]));\r
540 NewOrder[NewLocation] = Temp;\r
541\r
542\r
543 Status = gRT->SetVariable(\r
3737ac2b 544 Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder",\r
5d73d92f 545 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
546 EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS,\r
547 OrderCount*sizeof(CurrentOrder[0]),\r
548 NewOrder);\r
549\r
550 FreePool(NewOrder);\r
551\r
552 if (EFI_ERROR(Status)) {\r
3737ac2b 553 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellDebug1HiiHandle, Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder", Status);\r
5d73d92f 554 return (SHELL_INVALID_PARAMETER);\r
555 }\r
556 return (SHELL_SUCCESS);\r
557}\r
558\r
f2ad804f 559/**\r
560 Function to add optional data to an option.\r
561\r
562 @param[in] OptData The optional data to add.\r
563 @param[in] Target The target of the operation.\r
564\r
565 @retval SHELL_SUCCESS The operation was succesful.\r
566**/\r
5d73d92f 567SHELL_STATUS\r
568EFIAPI\r
3737ac2b 569BcfgAddOptDebug1(\r
570 IN CONST CHAR16 *OptData,\r
571 IN CONST BCFG_OPERATION_TARGET Target\r
572 )\r
573{\r
574 ASSERT(OptData != NULL);\r
575 return SHELL_SUCCESS;\r
576}\r
577\r
578/**\r
579 Function to dump the Bcfg information.\r
580\r
581 @param[in] Op The operation.\r
582 @param[in] OrderCount How many to dump.\r
583 @param[in] CurrentOrder The pointer to the current order of items.\r
584 @param[in] VerboseOutput TRUE for extra output. FALSE otherwise.\r
585\r
586 @retval SHELL_SUCCESS The dump was successful.\r
587 @retval SHELL_INVALID_PARAMETER A parameter was invalid.\r
588**/\r
589SHELL_STATUS\r
590EFIAPI\r
591BcfgDisplayDumpDebug1(\r
5d73d92f 592 IN CONST CHAR16 *Op,\r
3737ac2b 593 IN CONST UINTN OrderCount,\r
594 IN CONST UINT16 *CurrentOrder,\r
5d73d92f 595 IN CONST BOOLEAN VerboseOutput\r
596 )\r
597{\r
598 EFI_STATUS Status;\r
599 UINT8 *Buffer;\r
600 UINTN BufferSize;\r
601 CHAR16 VariableName[12];\r
602 UINTN LoopVar;\r
603 UINTN LoopVar2;\r
604 CHAR16 *DevPathString;\r
605 VOID *DevPath;\r
606\r
3737ac2b 607 if (OrderCount == 0) {\r
608 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN(STR_BCFG_NONE), gShellDebug1HiiHandle);\r
609 return (SHELL_SUCCESS);\r
610 }\r
611\r
5d73d92f 612 for (LoopVar = 0 ; LoopVar < OrderCount ; LoopVar++) {\r
613 Buffer = NULL;\r
614 BufferSize = 0;\r
3737ac2b 615 UnicodeSPrint(VariableName, sizeof(VariableName), L"%s%04x", Op, CurrentOrder[LoopVar]);\r
5d73d92f 616\r
617 Status = gRT->GetVariable(\r
618 VariableName,\r
619 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
620 NULL,\r
621 &BufferSize,\r
622 Buffer);\r
623 if (Status == EFI_BUFFER_TOO_SMALL) {\r
3737ac2b 624 Buffer = AllocateZeroPool(BufferSize);\r
5d73d92f 625 Status = gRT->GetVariable(\r
626 VariableName,\r
627 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
628 NULL,\r
629 &BufferSize,\r
630 Buffer);\r
631 }\r
632\r
633 if (EFI_ERROR(Status) || Buffer == NULL) {\r
634 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_READ_FAIL), gShellDebug1HiiHandle, VariableName, Status);\r
635 return (SHELL_INVALID_PARAMETER);\r
636 }\r
637\r
6878e7a7 638 if ((*(UINT16*)(Buffer+4)) != 0) {\r
639 DevPath = AllocateZeroPool(*(UINT16*)(Buffer+4));\r
640 CopyMem(DevPath, Buffer+6+StrSize((CHAR16*)(Buffer+6)), *(UINT16*)(Buffer+4));\r
641 DevPathString = gDevPathToText->ConvertDevicePathToText(DevPath, TRUE, FALSE);\r
642 } else {\r
643 DevPath = NULL;\r
644 DevPathString = NULL;\r
645 }\r
5d73d92f 646 ShellPrintHiiEx(\r
647 -1,\r
648 -1,\r
649 NULL,\r
650 STRING_TOKEN(STR_BCFG_LOAD_OPTIONS),\r
651 gShellDebug1HiiHandle,\r
3737ac2b 652 LoopVar,\r
5d73d92f 653 VariableName,\r
654 (CHAR16*)(Buffer+6),\r
655 DevPathString,\r
656 (StrSize((CHAR16*)(Buffer+6)) + *(UINT16*)(Buffer+4) + 6) <= BufferSize?L'N':L'Y');\r
657 if (VerboseOutput) {\r
658 for (LoopVar2 = (StrSize((CHAR16*)(Buffer+6)) + *(UINT16*)(Buffer+4) + 6);LoopVar2<BufferSize;LoopVar2++){\r
659 ShellPrintEx(\r
660 -1,\r
661 -1,\r
662 NULL,\r
663 L"%02x",\r
664 Buffer[LoopVar2]);\r
665 }\r
666 ShellPrintEx(\r
667 -1,\r
668 -1,\r
669 NULL,\r
670 L"\r\n");\r
671 }\r
672\r
673 if (Buffer != NULL) {\r
674 FreePool(Buffer);\r
675 }\r
676 if (DevPath != NULL) {\r
677 FreePool(DevPath);\r
678 }\r
679 if (DevPathString != NULL) {\r
680 FreePool(DevPathString);\r
681 }\r
682 }\r
683 return (SHELL_SUCCESS);\r
684}\r
685\r
3737ac2b 686/**\r
687 Function to initialize the BCFG operation structure.\r
688\r
689 @param[in] Struct The stuct to initialize.\r
690**/\r
5d73d92f 691VOID\r
692EFIAPI\r
3737ac2b 693InitBcfgStructDebug1(\r
5d73d92f 694 IN BGFG_OPERATION *Struct\r
695 )\r
696{\r
697 ASSERT(Struct != NULL);\r
3737ac2b 698 Struct->Target = BcfgTargetMax;\r
699 Struct->Type = BcfgTypeMax;\r
5d73d92f 700 Struct->Number1 = 0;\r
701 Struct->Number2 = 0;\r
702 Struct->HandleIndex = 0;\r
703 Struct->FileName = NULL;\r
704 Struct->Description = NULL;\r
705 Struct->Order = NULL;\r
706 Struct->OptData = NULL;\r
707}\r
708\r
709\r
710STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
711 {L"-v", TypeFlag},\r
712 {L"-opt", TypeMaxValue},\r
713 {NULL, TypeMax}\r
714 };\r
715\r
716/**\r
717 Function for 'bcfg' command.\r
718\r
719 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
720 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
721**/\r
722SHELL_STATUS\r
723EFIAPI\r
724ShellCommandRunBcfg (\r
725 IN EFI_HANDLE ImageHandle,\r
726 IN EFI_SYSTEM_TABLE *SystemTable\r
727 )\r
728{\r
729 EFI_STATUS Status;\r
730 LIST_ENTRY *Package;\r
731 CHAR16 *ProblemParam;\r
732 SHELL_STATUS ShellStatus;\r
733 UINTN ParamNumber;\r
734 CONST CHAR16 *CurrentParam;\r
735 BGFG_OPERATION CurrentOperation;\r
736 UINTN Length;\r
3737ac2b 737 UINT64 Intermediate;\r
5d73d92f 738\r
739 Length = 0;\r
740 ProblemParam = NULL;\r
741 Package = NULL;\r
742 ShellStatus = SHELL_SUCCESS;\r
743\r
3737ac2b 744 InitBcfgStructDebug1(&CurrentOperation);\r
5d73d92f 745\r
746 //\r
747 // initialize the shell lib (we must be in non-auto-init...)\r
748 //\r
749 Status = ShellInitialize();\r
750 ASSERT_EFI_ERROR(Status);\r
751\r
752 Status = CommandInit();\r
753 ASSERT_EFI_ERROR(Status);\r
754\r
755 //\r
756 // parse the command line\r
757 //\r
758 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
759 if (EFI_ERROR(Status)) {\r
760 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
761 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, ProblemParam);\r
762 FreePool(ProblemParam);\r
763 ShellStatus = SHELL_INVALID_PARAMETER;\r
764 } else {\r
765 ASSERT(FALSE);\r
766 }\r
767 } else {\r
3737ac2b 768 //\r
769 // Read in if we are doing -OPT\r
770 //\r
771 if (ShellCommandLineGetFlag(Package, L"-opt")) {\r
772 CurrentOperation.OptData = ShellCommandLineGetValue(Package, L"-opt");\r
773 if (CurrentOperation.OptData == NULL) {\r
774 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellDebug1HiiHandle, L"-opt");\r
775 ShellStatus = SHELL_INVALID_PARAMETER;\r
776 }\r
777 CurrentOperation.Type = BcfgTypeOpt;\r
778 }\r
779\r
5d73d92f 780 //\r
781 // small block to read the target of the operation\r
782 //\r
3737ac2b 783 if ((ShellCommandLineGetCount(Package) < 3 && CurrentOperation.Type != BcfgTypeOpt) ||\r
784 (ShellCommandLineGetCount(Package) < 2 && CurrentOperation.Type == BcfgTypeOpt)\r
785 ){\r
5d73d92f 786 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle);\r
787 ShellStatus = SHELL_INVALID_PARAMETER;\r
788 } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)ShellCommandLineGetRawValue(Package, 1), L"driver") == 0) {\r
3737ac2b 789 CurrentOperation.Target = BcfgTargetDriverOrder;\r
5d73d92f 790 } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)ShellCommandLineGetRawValue(Package, 1), L"boot") == 0) {\r
3737ac2b 791 CurrentOperation.Target = BcfgTargetBootOrder;\r
5d73d92f 792 } else {\r
793 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_DRIVER_BOOT), gShellDebug1HiiHandle);\r
794 ShellStatus = SHELL_INVALID_PARAMETER;\r
795 }\r
796\r
5d73d92f 797\r
798 //\r
799 // Read in the boot or driver order environment variable (not needed for opt)\r
800 //\r
3737ac2b 801 if (ShellStatus == SHELL_SUCCESS && CurrentOperation.Target < BcfgTargetMax && CurrentOperation.Type != BcfgTypeOpt) {\r
5d73d92f 802 Length = 0;\r
803 Status = gRT->GetVariable(\r
3737ac2b 804 CurrentOperation.Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder",\r
5d73d92f 805 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
806 NULL,\r
807 &Length,\r
808 CurrentOperation.Order);\r
809 if (Status == EFI_BUFFER_TOO_SMALL) {\r
3737ac2b 810 CurrentOperation.Order = AllocateZeroPool(Length+(4*sizeof(CurrentOperation.Order[0])));\r
5d73d92f 811 Status = gRT->GetVariable(\r
3737ac2b 812 CurrentOperation.Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder",\r
5d73d92f 813 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
814 NULL,\r
815 &Length,\r
816 CurrentOperation.Order);\r
817 }\r
818 }\r
819\r
820 //\r
821 // large block to read the type of operation and verify parameter types for the info.\r
822 //\r
3737ac2b 823 if (ShellStatus == SHELL_SUCCESS && CurrentOperation.Target < BcfgTargetMax) {\r
5d73d92f 824 for (ParamNumber = 2 ; ParamNumber < ShellCommandLineGetCount(Package) && ShellStatus == SHELL_SUCCESS; ParamNumber++) {\r
825 CurrentParam = ShellCommandLineGetRawValue(Package, ParamNumber);\r
826 if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"dump") == 0) {\r
3737ac2b 827 CurrentOperation.Type = BcfgTypeDump;\r
5d73d92f 828 } else if (ShellCommandLineGetFlag(Package, L"-v")) {\r
829 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"-v (without dump)");\r
830 ShellStatus = SHELL_INVALID_PARAMETER;\r
831 } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"add") == 0) {\r
832 if ((ParamNumber + 3) >= ShellCommandLineGetCount(Package)) {\r
833 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle);\r
834 ShellStatus = SHELL_INVALID_PARAMETER;\r
835 }\r
3737ac2b 836 CurrentOperation.Type = BcfgTypeAdd;\r
5d73d92f 837 CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);\r
838 if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {\r
839 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, CurrentParam);\r
840 ShellStatus = SHELL_INVALID_PARAMETER;\r
841 } else {\r
3737ac2b 842 Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);\r
843 CurrentOperation.Number1 = (UINT16)Intermediate;\r
5d73d92f 844 ASSERT(CurrentOperation.FileName == NULL);\r
845 CurrentOperation.FileName = StrnCatGrow(&CurrentOperation.FileName , NULL, ShellCommandLineGetRawValue(Package, ++ParamNumber), 0);\r
846 ASSERT(CurrentOperation.Description == NULL);\r
847 CurrentOperation.Description = StrnCatGrow(&CurrentOperation.Description, NULL, ShellCommandLineGetRawValue(Package, ++ParamNumber), 0);\r
848 }\r
849 } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"addp") == 0) {\r
850 if ((ParamNumber + 3) >= ShellCommandLineGetCount(Package)) {\r
851 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle);\r
852 ShellStatus = SHELL_INVALID_PARAMETER;\r
853 }\r
3737ac2b 854 CurrentOperation.Type = BcfgTypeAddp;\r
5d73d92f 855 CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);\r
856 if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {\r
857 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, CurrentParam);\r
858 ShellStatus = SHELL_INVALID_PARAMETER;\r
859 } else {\r
3737ac2b 860 Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);\r
861 CurrentOperation.Number1 = (UINT16)Intermediate;\r
5d73d92f 862 ASSERT(CurrentOperation.FileName == NULL);\r
863 CurrentOperation.FileName = StrnCatGrow(&CurrentOperation.FileName , NULL, ShellCommandLineGetRawValue(Package, ++ParamNumber), 0);\r
864 ASSERT(CurrentOperation.Description == NULL);\r
865 CurrentOperation.Description = StrnCatGrow(&CurrentOperation.Description, NULL, ShellCommandLineGetRawValue(Package, ++ParamNumber), 0);\r
866 }\r
867 } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"addh") == 0) {\r
868 if ((ParamNumber + 3) >= ShellCommandLineGetCount(Package)) {\r
869 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle);\r
870 ShellStatus = SHELL_INVALID_PARAMETER;\r
871 }\r
3737ac2b 872 CurrentOperation.Type = BcfgTypeAddh;\r
5d73d92f 873 CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);\r
874 if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {\r
875 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, CurrentParam);\r
876 ShellStatus = SHELL_INVALID_PARAMETER;\r
877 } else {\r
3737ac2b 878 Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);\r
879 CurrentOperation.Number1 = (UINT16)Intermediate;\r
5d73d92f 880 CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);\r
881 if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {\r
882 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, CurrentParam);\r
883 ShellStatus = SHELL_INVALID_PARAMETER;\r
884 } else {\r
3737ac2b 885 Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);\r
886 CurrentOperation.HandleIndex = (UINT16)Intermediate;\r
5d73d92f 887 ASSERT(CurrentOperation.Description == NULL);\r
888 CurrentOperation.Description = StrnCatGrow(&CurrentOperation.Description, NULL, ShellCommandLineGetRawValue(Package, ++ParamNumber), 0);\r
889 }\r
890 }\r
891 } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"rm") == 0) {\r
892 if ((ParamNumber + 1) >= ShellCommandLineGetCount(Package)) {\r
893 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle);\r
894 ShellStatus = SHELL_INVALID_PARAMETER;\r
895 }\r
3737ac2b 896 CurrentOperation.Type = BcfgTypeRm;\r
5d73d92f 897 CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);\r
898 if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {\r
899 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, CurrentParam);\r
900 ShellStatus = SHELL_INVALID_PARAMETER;\r
901 } else {\r
3737ac2b 902 Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);\r
903 CurrentOperation.Number1 = (UINT16)Intermediate;\r
5d73d92f 904 if (CurrentOperation.Number1 > (Length / sizeof(CurrentOperation.Order[0]))){\r
905 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellDebug1HiiHandle, Length / sizeof(CurrentOperation.Order[0]));\r
906 ShellStatus = SHELL_INVALID_PARAMETER;\r
907 }\r
908 }\r
909 } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"mv") == 0) {\r
910 if ((ParamNumber + 2) >= ShellCommandLineGetCount(Package)) {\r
911 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle);\r
912 ShellStatus = SHELL_INVALID_PARAMETER;\r
913 }\r
3737ac2b 914 CurrentOperation.Type = BcfgTypeMv;\r
5d73d92f 915 CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);\r
916 if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {\r
917 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, CurrentParam);\r
918 ShellStatus = SHELL_INVALID_PARAMETER;\r
919 } else {\r
3737ac2b 920 Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);\r
921 CurrentOperation.Number1 = (UINT16)Intermediate;\r
5d73d92f 922 if (CurrentOperation.Number1 > (Length / sizeof(CurrentOperation.Order[0]))){\r
923 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellDebug1HiiHandle, Length / sizeof(CurrentOperation.Order[0]));\r
924 ShellStatus = SHELL_INVALID_PARAMETER;\r
925 }\r
926 CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);\r
927 if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {\r
928 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, CurrentParam);\r
929 ShellStatus = SHELL_INVALID_PARAMETER;\r
930 } else {\r
3737ac2b 931 Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);\r
932 CurrentOperation.Number2 = (UINT16)Intermediate;\r
5d73d92f 933 }\r
934 if (CurrentOperation.Number2 == CurrentOperation.Number1\r
935 ||CurrentOperation.Number1 > (Length / sizeof(CurrentOperation.Order[0]))\r
936 ||CurrentOperation.Number2 > (Length / sizeof(CurrentOperation.Order[0]))\r
937 ){\r
938 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellDebug1HiiHandle, Length / sizeof(CurrentOperation.Order[0]));\r
939 ShellStatus = SHELL_INVALID_PARAMETER;\r
940 }\r
941 }\r
942 } else {\r
943 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, CurrentParam);\r
944 ShellStatus = SHELL_INVALID_PARAMETER;\r
945 }\r
946 }\r
947 }\r
3737ac2b 948 if (ShellStatus == SHELL_SUCCESS && CurrentOperation.Target < BcfgTargetMax && CurrentOperation.Type < BcfgTypeMax) {\r
5d73d92f 949 //\r
950 // we have all the info. Do the work\r
951 //\r
952 switch (CurrentOperation.Type) {\r
3737ac2b 953 case BcfgTypeDump:\r
954 ShellStatus = BcfgDisplayDumpDebug1(\r
955 CurrentOperation.Target == BcfgTargetBootOrder?L"Boot":L"Driver",\r
5d73d92f 956 Length / sizeof(CurrentOperation.Order[0]),\r
3737ac2b 957 CurrentOperation.Order,\r
5d73d92f 958 ShellCommandLineGetFlag(Package, L"-v"));\r
959 break;\r
3737ac2b 960 case BcfgTypeMv:\r
961 ShellStatus = BcfgMoveDebug1(\r
5d73d92f 962 CurrentOperation.Target,\r
963 CurrentOperation.Order,\r
964 Length / sizeof(CurrentOperation.Order[0]),\r
965 CurrentOperation.Number1,\r
966 CurrentOperation.Number2);\r
967 break;\r
3737ac2b 968 case BcfgTypeRm:\r
969 ShellStatus = BcfgRemoveDebug1(\r
5d73d92f 970 CurrentOperation.Target,\r
971 CurrentOperation.Order,\r
972 Length / sizeof(CurrentOperation.Order[0]),\r
973 CurrentOperation.Number1);\r
974 break;\r
3737ac2b 975 case BcfgTypeAdd:\r
976 case BcfgTypeAddp:\r
977 case BcfgTypeAddh:\r
978 ShellStatus = BcfgAddDebug1(\r
5d73d92f 979 CurrentOperation.Number1,\r
980 CurrentOperation.FileName,\r
981 CurrentOperation.Description,\r
982 CurrentOperation.Order,\r
3737ac2b 983 Length / sizeof(CurrentOperation.Order[0]),\r
5d73d92f 984 CurrentOperation.Target,\r
3737ac2b 985 (BOOLEAN)(CurrentOperation.Type == BcfgTypeAddh),\r
986 (BOOLEAN)(CurrentOperation.Type == BcfgTypeAddp),\r
5d73d92f 987 CurrentOperation.HandleIndex);\r
988 break;\r
3737ac2b 989 case BcfgTypeOpt:\r
990 ShellStatus = BcfgAddOptDebug1(\r
991 CurrentOperation.OptData,\r
992 CurrentOperation.Target);\r
993 break;\r
5d73d92f 994 default:\r
995 ASSERT(FALSE);\r
996 }\r
997 }\r
998 }\r
999\r
1000 if (Package != NULL) {\r
1001 ShellCommandLineFreeVarList (Package);\r
1002 }\r
1003 if (CurrentOperation.FileName != NULL) {\r
1004 FreePool(CurrentOperation.FileName);\r
1005 }\r
1006 if (CurrentOperation.Description != NULL) {\r
1007 FreePool(CurrentOperation.Description);\r
1008 }\r
1009 if (CurrentOperation.Order != NULL) {\r
1010 FreePool(CurrentOperation.Order);\r
1011 }\r
1012\r
1013 return (ShellStatus);\r
1014}\r