/** @file\r
Main file for Dblk shell Debug1 function.\r
\r
- Copyright (c) 2005 - 2010, 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
- http://opensource.org/licenses/bsd-license.php\r
-\r
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+ (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>\r
+ Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\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
)\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
UINT8 *Buffer;\r
+ UINT8 *OriginalBuffer;\r
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(BlockIo->Media->IoAlign == 0) {\r
+ BlockIo->Media->IoAlign = 1;\r
+ }\r
+\r
if (BufferSize > 0) {\r
- Buffer = AllocatePool(BufferSize);\r
+ OriginalBuffer = AllocateZeroPool(BufferSize + BlockIo->Media->IoAlign);\r
+ Buffer = ALIGN_POINTER (OriginalBuffer,BlockIo->Media->IoAlign);\r
} else {\r
- Buffer = NULL;\r
+ ShellPrintEx(-1,-1,L" BlockSize: 0x%08x, BlockCount: 0x%08x\r\n", BlockIo->Media->BlockSize, BlockCount);\r
+ OriginalBuffer = NULL;\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
- if (Buffer != NULL) {\r
- FreePool(Buffer);\r
+ if (OriginalBuffer != NULL) {\r
+ FreePool (OriginalBuffer);\r
}\r
\r
gBS->CloseProtocol(BlockIoHandle, &gEfiBlockIoProtocolGuid, gImageHandle, NULL);\r
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
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
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
}\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
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
+ 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