]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellDebug1CommandsLib/Dblk.c
ShellPkg/pci: Fix extended register dumping for MFVC capability
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / Dblk.c
index 96da3044836b50309d6447b44bab75a68e5a7b2c..32e5917523cfe356b3a1be1372b0e60c14b99ae3 100644 (file)
@@ -1,7 +1,8 @@
 /** @file\r
   Main file for Dblk shell Debug1 function.\r
 \r
-  Copyright (c) 2005 - 2010, Intel Corporation. All rights reserved.<BR>\r
+  (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>\r
+  Copyright (c) 2005 - 2011, Intel Corporation. All rights reserved.<BR>\r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
   which accompanies this distribution.  The full text of the license may be found at\r
 #include "UefiShellDebug1CommandsLib.h"\r
 #include <Protocol/BlockIo.h>\r
 \r
+/**\r
+  Display blocks to the screen.\r
+\r
+  @param[in] DevPath      The device path to get the blocks from.\r
+  @param[in] Lba          The Lba number to start from.\r
+  @param[in] BlockCount   How many blocks to display.\r
+\r
+  @retval SHELL_SUCCESS   The display was successful.\r
+**/\r
 SHELL_STATUS\r
-EFIAPI\r
 DisplayTheBlocks(\r
   IN CONST EFI_DEVICE_PATH_PROTOCOL *DevPath,\r
   IN CONST UINT64                   Lba,\r
@@ -24,7 +33,6 @@ DisplayTheBlocks(
   )\r
 {\r
   EFI_BLOCK_IO_PROTOCOL     *BlockIo;\r
-  EFI_DEVICE_PATH_PROTOCOL  *Copy;\r
   EFI_HANDLE                BlockIoHandle;\r
   EFI_STATUS                Status;\r
   SHELL_STATUS              ShellStatus;\r
@@ -32,26 +40,41 @@ DisplayTheBlocks(
   UINTN                     BufferSize;\r
 \r
   ShellStatus = SHELL_SUCCESS;\r
-  Copy = (EFI_DEVICE_PATH_PROTOCOL *)DevPath;\r
 \r
-  Status = gBS->LocateDevicePath(&gEfiBlockIoProtocolGuid, &Copy, &BlockIoHandle);\r
-  ASSERT_EFI_ERROR(Status);\r
+  Status = gBS->LocateDevicePath(&gEfiBlockIoProtocolGuid, (EFI_DEVICE_PATH_PROTOCOL **)&DevPath, &BlockIoHandle);\r
+  if (EFI_ERROR(Status)) {\r
+    return (SHELL_NOT_FOUND);\r
+  }\r
 \r
   Status = gBS->OpenProtocol(BlockIoHandle, &gEfiBlockIoProtocolGuid, (VOID**)&BlockIo, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
-  ASSERT_EFI_ERROR(Status);\r
+  if (EFI_ERROR(Status)) {\r
+    return (SHELL_NOT_FOUND);\r
+  }\r
 \r
   BufferSize = BlockIo->Media->BlockSize * BlockCount;\r
   if (BufferSize > 0) {\r
-    Buffer     = AllocatePool(BufferSize);\r
+    Buffer     = AllocateZeroPool(BufferSize);\r
   } else {\r
+    ShellPrintEx(-1,-1,L"  BlockSize: 0x%08x, BlockCount: 0x%08x\r\n", BlockIo->Media->BlockSize, BlockCount);\r
     Buffer    = NULL;\r
   }\r
 \r
   Status = BlockIo->ReadBlocks(BlockIo, BlockIo->Media->MediaId, Lba, BufferSize, Buffer);\r
   if (!EFI_ERROR(Status) && Buffer != NULL) {\r
+    ShellPrintHiiEx(\r
+      -1, \r
+      -1, \r
+      NULL, \r
+      STRING_TOKEN (STR_DBLK_HEADER), \r
+      gShellDebug1HiiHandle, \r
+      Lba,\r
+      BufferSize,\r
+      BlockIo\r
+      );\r
+\r
     DumpHex(2,0,BufferSize,Buffer);\r
   } else {\r
-    ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_READ_FAIL), gShellDebug1HiiHandle, L"BlockIo", Status);\r
+    ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_READ_FAIL), gShellDebug1HiiHandle, L"dblk", L"BlockIo");  \r
     ShellStatus = SHELL_DEVICE_ERROR;\r
   }\r
 \r
@@ -63,6 +86,12 @@ DisplayTheBlocks(
   return (ShellStatus);\r
 }\r
 \r
+/**\r
+  Function for 'dblk' command.\r
+\r
+  @param[in] ImageHandle  Handle to the Image (NULL if Internal).\r
+  @param[in] SystemTable  Pointer to the System Table (NULL if Internal).\r
+**/\r
 SHELL_STATUS\r
 EFIAPI\r
 ShellCommandRunDblk (\r
@@ -70,15 +99,16 @@ ShellCommandRunDblk (
   IN EFI_SYSTEM_TABLE  *SystemTable\r
   )\r
 {\r
-  EFI_STATUS          Status;\r
-  LIST_ENTRY          *Package;\r
-  CHAR16              *ProblemParam;\r
-  SHELL_STATUS        ShellStatus;\r
-  CONST CHAR16        *BlockName;\r
-  CONST CHAR16        *LbaString;\r
-  CONST CHAR16        *BlockCountString;\r
-  UINT64              Lba;\r
-  UINT8               BlockCount;\r
+  EFI_STATUS                Status;\r
+  LIST_ENTRY                *Package;\r
+  CHAR16                    *ProblemParam;\r
+  SHELL_STATUS              ShellStatus;\r
+  CONST CHAR16              *BlockName;\r
+  CONST CHAR16              *LbaString;\r
+  CONST CHAR16              *BlockCountString;\r
+  UINT64                    Lba;\r
+  UINT64                    BlockCount;\r
+  EFI_DEVICE_PATH_PROTOCOL  *DevPath;\r
 \r
   ShellStatus         = SHELL_SUCCESS;\r
   Status              = EFI_SUCCESS;\r
@@ -98,7 +128,7 @@ ShellCommandRunDblk (
   Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE);\r
   if (EFI_ERROR(Status)) {\r
     if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, ProblemParam);\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"dblk", ProblemParam);  \r
       FreePool(ProblemParam);\r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
     } else {\r
@@ -106,10 +136,10 @@ ShellCommandRunDblk (
     }\r
   } else {\r
     if (ShellCommandLineGetCount(Package) > 4) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle);\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"dblk");  \r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
     } else if (ShellCommandLineGetCount(Package) < 2) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle);\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"dblk");  \r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
     } else {\r
       //\r
@@ -122,26 +152,45 @@ ShellCommandRunDblk (
       if (LbaString == NULL) {\r
         Lba = 0;\r
       } else {\r
-        Lba = (UINT64)StrHexToUintn(LbaString);\r
+        if (!ShellIsHexOrDecimalNumber(LbaString, TRUE, FALSE)) {\r
+          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"dblk", LbaString);  \r
+          ShellStatus = SHELL_INVALID_PARAMETER;\r
+        }\r
+        ShellConvertStringToUint64(LbaString, &Lba, TRUE, FALSE);\r
       }\r
 \r
       if (BlockCountString == NULL) {\r
         BlockCount = 1;\r
       } else {\r
-        BlockCount = (UINT8)StrHexToUintn(BlockCountString);\r
+        if (!ShellIsHexOrDecimalNumber(BlockCountString, TRUE, FALSE)) {\r
+          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"dblk", BlockCountString);  \r
+          ShellStatus = SHELL_INVALID_PARAMETER;\r
+        }\r
+        ShellConvertStringToUint64(BlockCountString, &BlockCount, TRUE, FALSE);\r
         if (BlockCount > 0x10) {\r
           BlockCount = 0x10;\r
+        } else if (BlockCount == 0) {\r
+          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"dblk", BlockCountString);  \r
+          ShellStatus = SHELL_INVALID_PARAMETER;\r
         }\r
       }\r
-\r
-      //\r
-      // do the work if we have a valid block identifier\r
-      //\r
-      if (mEfiShellProtocol->GetDevicePathFromMap(BlockName) == NULL) {\r
-        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, BlockName);\r
-        ShellStatus = SHELL_INVALID_PARAMETER;\r
-      } else {\r
-        ShellStatus = DisplayTheBlocks(mEfiShellProtocol->GetDevicePathFromMap(BlockName), Lba, BlockCount);\r
+      \r
+      if (ShellStatus == SHELL_SUCCESS) {\r
+        //\r
+        // do the work if we have a valid block identifier\r
+        //\r
+        if (gEfiShellProtocol->GetDevicePathFromMap(BlockName) == NULL) {\r
+          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"dblk", BlockName);  \r
+          ShellStatus = SHELL_INVALID_PARAMETER;\r
+        } else {\r
+          DevPath = (EFI_DEVICE_PATH_PROTOCOL*)gEfiShellProtocol->GetDevicePathFromMap(BlockName);\r
+          if (gBS->LocateDevicePath(&gEfiBlockIoProtocolGuid, &DevPath, NULL) == EFI_NOT_FOUND) {\r
+            ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_MAP_PROTOCOL), gShellDebug1HiiHandle, L"dblk", BlockName, L"BlockIo");  \r
+            ShellStatus = SHELL_INVALID_PARAMETER;\r
+          } else {\r
+            ShellStatus = DisplayTheBlocks(gEfiShellProtocol->GetDevicePathFromMap(BlockName), Lba, (UINT8)BlockCount);\r
+          }\r
+        }\r
       }\r
     }\r
 \r