]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellDebug1CommandsLib/Bcfg.c
update Bcfg to correctly remove by option index not variable name and add driver...
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / Bcfg.c
index e6884a2d59307fa49a8a5b946b20ae635cf988c2..c2b14d7ee757295c9a09ccb19585856fa33bef90 100644 (file)
@@ -47,6 +47,63 @@ typedef struct {
   CONST CHAR16          *OptData;\r
 } BGFG_OPERATION;\r
 \r
+/**\r
+  This function will populate the device path protocol parameter based on TheHandle.\r
+  \r
+  @param[in,out] DevPath       On a sucessful return the device path to the handle.\r
+\r
+  @retval EFI_SUCCESS           The device path was sucessfully returned.\r
+  @retval other                 A error from gBS->HandleProtocol.\r
+\r
+  @sa HandleProtocol\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetDevicePathForDriverHandleDebug1 (\r
+  IN EFI_HANDLE                   TheHandle,\r
+  IN OUT EFI_DEVICE_PATH_PROTOCOL **FilePath\r
+  )\r
+{\r
+  EFI_STATUS                Status;\r
+  EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;\r
+  EFI_DEVICE_PATH_PROTOCOL  *ImageDevicePath;\r
+\r
+  Status = gBS->OpenProtocol (\r
+                TheHandle,\r
+                &gEfiLoadedImageProtocolGuid,\r
+                (VOID**)&LoadedImage,\r
+                gImageHandle,\r
+                NULL,\r
+                EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+               );\r
+  if (!EFI_ERROR (Status)) {\r
+    Status = gBS->OpenProtocol (\r
+                  LoadedImage->DeviceHandle,\r
+                  &gEfiDevicePathProtocolGuid,\r
+                  (VOID**)&ImageDevicePath,\r
+                  gImageHandle,\r
+                  NULL,\r
+                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                 );\r
+    if (!EFI_ERROR (Status)) {\r
+//      *DevPath  = DuplicateDevicePath (ImageDevicePath);\r
+//      *FilePath = DuplicateDevicePath (LoadedImage->FilePath);\r
+        *FilePath = AppendDevicePath(ImageDevicePath,LoadedImage->FilePath);\r
+      gBS->CloseProtocol(\r
+                  LoadedImage->DeviceHandle,\r
+                  &gEfiDevicePathProtocolGuid,\r
+                  gImageHandle,\r
+                  NULL);\r
+    }\r
+    gBS->CloseProtocol(\r
+                TheHandle,\r
+                &gEfiLoadedImageProtocolGuid,\r
+                gImageHandle,\r
+                NULL);\r
+  }\r
+  return (Status);\r
+}\r
+\r
 /**\r
   Function to add a option.\r
 \r
@@ -81,9 +138,9 @@ BcfgAddDebug1(
   EFI_DEVICE_PATH_PROTOCOL  *DevicePath;\r
   EFI_DEVICE_PATH_PROTOCOL  *FilePath;\r
   EFI_DEVICE_PATH_PROTOCOL  *FileNode;\r
-  EFI_DEVICE_PATH_PROTOCOL  *DevPath;\r
+//  EFI_DEVICE_PATH_PROTOCOL  *DevPath;\r
   CHAR16                    *Str;\r
-  CONST CHAR16              *StringWalker;\r
+//  CONST CHAR16              *StringWalker;\r
   UINT8                     *TempByteBuffer;\r
   UINT8                     *TempByteStart;\r
   EFI_SHELL_FILE_INFO       *Arg;\r
@@ -100,7 +157,6 @@ BcfgAddDebug1(
   UINTN                     ChildControllerHandleCount;\r
   SHELL_STATUS              ShellStatus;\r
   UINT16                    *NewOrder;\r
-  UINT64                    Intermediate;\r
 \r
   if (!UseHandle) {\r
     if (File == NULL || Desc == NULL) {\r
@@ -125,42 +181,79 @@ BcfgAddDebug1(
   TargetLocation  = 0xFFFF;\r
 \r
   if (UseHandle) {\r
-    Status = ShellConvertStringToUint64(File, &Intermediate, TRUE, FALSE);\r
-    CurHandle = ConvertHandleIndexToHandle((UINTN)Intermediate);\r
-    if (CurHandle == NULL || EFI_ERROR(Status)) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, File);\r
+    CurHandle = ConvertHandleIndexToHandle(HandleNumber);\r
+    if (CurHandle == NULL) {\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"Handle Number");\r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
     } else {\r
-      //\r
-      //Make sure that the handle should point to a real controller\r
-      //\r
-      Status = PARSE_HANDLE_DATABASE_UEFI_DRIVERS (\r
-                 CurHandle,\r
-                 &DriverBindingHandleCount,\r
-                 NULL);\r
-\r
-      Status = PARSE_HANDLE_DATABASE_PARENTS (\r
-                 CurHandle,\r
-                 &ParentControllerHandleCount,\r
-                 NULL);\r
-\r
-      Status = ParseHandleDatabaseForChildControllers (\r
-                 CurHandle,\r
-                 &ChildControllerHandleCount,\r
-                 NULL);\r
-\r
-      if (DriverBindingHandleCount > 0\r
-            || ParentControllerHandleCount > 0\r
-            || ChildControllerHandleCount > 0) {\r
-        FilePath = NULL;\r
+      if (Target == BcfgTargetBootOrder) {\r
+        //\r
+        //Make sure that the handle should point to a real controller\r
+        //\r
+        Status = PARSE_HANDLE_DATABASE_UEFI_DRIVERS (\r
+                   CurHandle,\r
+                   &DriverBindingHandleCount,\r
+                   NULL);\r
+\r
+        Status = PARSE_HANDLE_DATABASE_PARENTS (\r
+                   CurHandle,\r
+                   &ParentControllerHandleCount,\r
+                   NULL);\r
+\r
+        Status = ParseHandleDatabaseForChildControllers (\r
+                   CurHandle,\r
+                   &ChildControllerHandleCount,\r
+                   NULL);\r
+\r
+        if (DriverBindingHandleCount > 0\r
+              || ParentControllerHandleCount > 0\r
+              || ChildControllerHandleCount > 0) {\r
+          FilePath = NULL;\r
+          Status = gBS->HandleProtocol (\r
+                     CurHandle,\r
+                     &gEfiDevicePathProtocolGuid,\r
+                     (VOID**)&FilePath);\r
+        }\r
+        if (EFI_ERROR (Status)) {\r
+          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_HANDLE), gShellDebug1HiiHandle, HandleNumber);\r
+          ShellStatus = SHELL_INVALID_PARAMETER;\r
+        }\r
+      } else {\r
+        //\r
+        //Make sure that the handle should point to driver, not a controller.\r
+        //\r
+        Status = PARSE_HANDLE_DATABASE_UEFI_DRIVERS (\r
+                   CurHandle,\r
+                   &DriverBindingHandleCount,\r
+                   NULL);\r
+\r
+        Status = PARSE_HANDLE_DATABASE_PARENTS (\r
+                   CurHandle,\r
+                   &ParentControllerHandleCount,\r
+                   NULL);\r
+\r
+        Status = ParseHandleDatabaseForChildControllers (\r
+                   CurHandle,\r
+                   &ChildControllerHandleCount,\r
+                   NULL);\r
+\r
         Status = gBS->HandleProtocol (\r
                    CurHandle,\r
                    &gEfiDevicePathProtocolGuid,\r
                    (VOID**)&FilePath);\r
-      }\r
-      if (EFI_ERROR (Status)) {\r
-        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_HANDLE), gShellDebug1HiiHandle, Intermediate);\r
-        ShellStatus = SHELL_INVALID_PARAMETER;\r
+\r
+        if (DriverBindingHandleCount > 0\r
+              || ParentControllerHandleCount > 0\r
+              || ChildControllerHandleCount > 0\r
+              || !EFI_ERROR(Status) ) {\r
+          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"Handle Number");\r
+          ShellStatus = SHELL_INVALID_PARAMETER;\r
+        } else {\r
+          //\r
+          // Get the DevicePath from the loaded image information.\r
+          //\r
+          Status = GetDevicePathForDriverHandleDebug1(CurHandle, &FilePath);\r
+        }\r
       }\r
     }\r
   } else {\r
@@ -199,6 +292,7 @@ BcfgAddDebug1(
           ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_FILE_DP), gShellDebug1HiiHandle, Arg->FullName);\r
           ShellStatus = SHELL_UNSUPPORTED;\r
         } else {\r
+/*\r
           if (UsePath) {\r
             DevPath = DevicePath;\r
             while (!IsDevicePathEnd(DevPath)) {\r
@@ -221,9 +315,11 @@ BcfgAddDebug1(
             FilePath = AppendDevicePath(DevicePath, FileNode);\r
             FreePool(FileNode);\r
           } else {\r
+*/\r
             FilePath = DuplicateDevicePath(DevicePath);\r
+/*\r
           }\r
-\r
+*/\r
           FreePool(DevicePath);\r
         }\r
       }\r
@@ -364,16 +460,15 @@ BcfgRemoveDebug1(
   IN CONST BCFG_OPERATION_TARGET  Target,\r
   IN CONST UINT16                 *CurrentOrder,\r
   IN CONST UINTN                  OrderCount,\r
-  IN CONST UINT16                  Location\r
+  IN CONST UINT16                 Location\r
   )\r
 {\r
   CHAR16      VariableName[12];\r
   UINT16      *NewOrder;\r
   EFI_STATUS  Status;\r
-  UINTN       LoopVar;\r
   UINTN       NewCount;\r
 \r
-  UnicodeSPrint(VariableName, sizeof(VariableName), L"%s%04x", Target == BcfgTargetBootOrder?L"Boot":L"Driver", Location);\r
+  UnicodeSPrint(VariableName, sizeof(VariableName), L"%s%04x", Target == BcfgTargetBootOrder?L"Boot":L"Driver", CurrentOrder[Location]);\r
   Status = gRT->SetVariable(\r
     VariableName,\r
     (EFI_GUID*)&gEfiGlobalVariableGuid,\r
@@ -388,12 +483,9 @@ BcfgRemoveDebug1(
   if (NewOrder != NULL) {\r
     NewCount = OrderCount;\r
     CopyMem(NewOrder, CurrentOrder, OrderCount*sizeof(CurrentOrder[0]));\r
-    for (LoopVar = 0 ; LoopVar < OrderCount ; LoopVar++){\r
-      if (NewOrder[LoopVar] == Location) {\r
-        CopyMem(NewOrder+LoopVar, NewOrder+LoopVar+1, (OrderCount - LoopVar - 1)*sizeof(CurrentOrder[0]));\r
-        NewCount--;\r
-      }\r
-    }\r
+    CopyMem(NewOrder+Location, NewOrder+Location+1, (OrderCount - Location - 1)*sizeof(CurrentOrder[0]));\r
+    NewCount--;\r
+\r
     Status = gRT->SetVariable(\r
       Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder",\r
       (EFI_GUID*)&gEfiGlobalVariableGuid,\r
@@ -542,9 +634,14 @@ BcfgDisplayDumpDebug1(
       return (SHELL_INVALID_PARAMETER);\r
     }\r
 \r
-    DevPath = AllocateZeroPool(*(UINT16*)(Buffer+4));\r
-    CopyMem(DevPath, Buffer+6+StrSize((CHAR16*)(Buffer+6)), *(UINT16*)(Buffer+4));\r
-    DevPathString = gDevPathToText->ConvertDevicePathToText(DevPath, TRUE, FALSE);\r
+    if ((*(UINT16*)(Buffer+4)) != 0) {\r
+      DevPath = AllocateZeroPool(*(UINT16*)(Buffer+4));\r
+      CopyMem(DevPath, Buffer+6+StrSize((CHAR16*)(Buffer+6)), *(UINT16*)(Buffer+4));\r
+      DevPathString = gDevPathToText->ConvertDevicePathToText(DevPath, TRUE, FALSE);\r
+    } else {\r
+      DevPath       = NULL;\r
+      DevPathString = NULL;\r
+    }\r
     ShellPrintHiiEx(\r
       -1,\r
       -1,\r