2 Main file for Dblk shell Debug1 function.
4 (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>
5 Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>
6 SPDX-License-Identifier: BSD-2-Clause-Patent
10 #include "UefiShellDebug1CommandsLib.h"
11 #include <Protocol/BlockIo.h>
14 Display blocks to the screen.
16 @param[in] DevPath The device path to get the blocks from.
17 @param[in] Lba The Lba number to start from.
18 @param[in] BlockCount How many blocks to display.
20 @retval SHELL_SUCCESS The display was successful.
24 IN CONST EFI_DEVICE_PATH_PROTOCOL
*DevPath
,
26 IN CONST UINT8 BlockCount
29 EFI_BLOCK_IO_PROTOCOL
*BlockIo
;
30 EFI_HANDLE BlockIoHandle
;
32 SHELL_STATUS ShellStatus
;
34 UINT8
*OriginalBuffer
;
37 ShellStatus
= SHELL_SUCCESS
;
39 Status
= gBS
->LocateDevicePath(&gEfiBlockIoProtocolGuid
, (EFI_DEVICE_PATH_PROTOCOL
**)&DevPath
, &BlockIoHandle
);
40 if (EFI_ERROR(Status
)) {
41 return (SHELL_NOT_FOUND
);
44 Status
= gBS
->OpenProtocol(BlockIoHandle
, &gEfiBlockIoProtocolGuid
, (VOID
**)&BlockIo
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
45 if (EFI_ERROR(Status
)) {
46 return (SHELL_NOT_FOUND
);
49 BufferSize
= BlockIo
->Media
->BlockSize
* BlockCount
;
50 if(BlockIo
->Media
->IoAlign
== 0) {
51 BlockIo
->Media
->IoAlign
= 1;
55 OriginalBuffer
= AllocateZeroPool(BufferSize
+ BlockIo
->Media
->IoAlign
);
56 Buffer
= ALIGN_POINTER (OriginalBuffer
,BlockIo
->Media
->IoAlign
);
58 ShellPrintEx(-1,-1,L
" BlockSize: 0x%08x, BlockCount: 0x%08x\r\n", BlockIo
->Media
->BlockSize
, BlockCount
);
59 OriginalBuffer
= NULL
;
63 Status
= BlockIo
->ReadBlocks(BlockIo
, BlockIo
->Media
->MediaId
, Lba
, BufferSize
, Buffer
);
64 if (!EFI_ERROR(Status
) && Buffer
!= NULL
) {
69 STRING_TOKEN (STR_DBLK_HEADER
),
70 gShellDebug1HiiHandle
,
76 DumpHex(2,0,BufferSize
,Buffer
);
78 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_READ_FAIL
), gShellDebug1HiiHandle
, L
"dblk", L
"BlockIo");
79 ShellStatus
= SHELL_DEVICE_ERROR
;
82 if (OriginalBuffer
!= NULL
) {
83 FreePool (OriginalBuffer
);
86 gBS
->CloseProtocol(BlockIoHandle
, &gEfiBlockIoProtocolGuid
, gImageHandle
, NULL
);
91 Function for 'dblk' command.
93 @param[in] ImageHandle Handle to the Image (NULL if Internal).
94 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
99 IN EFI_HANDLE ImageHandle
,
100 IN EFI_SYSTEM_TABLE
*SystemTable
105 CHAR16
*ProblemParam
;
106 SHELL_STATUS ShellStatus
;
107 CONST CHAR16
*BlockName
;
108 CONST CHAR16
*LbaString
;
109 CONST CHAR16
*BlockCountString
;
112 EFI_DEVICE_PATH_PROTOCOL
*DevPath
;
114 ShellStatus
= SHELL_SUCCESS
;
115 Status
= EFI_SUCCESS
;
118 // initialize the shell lib (we must be in non-auto-init...)
120 Status
= ShellInitialize();
121 ASSERT_EFI_ERROR(Status
);
123 Status
= CommandInit();
124 ASSERT_EFI_ERROR(Status
);
127 // parse the command line
129 Status
= ShellCommandLineParse (EmptyParamList
, &Package
, &ProblemParam
, TRUE
);
130 if (EFI_ERROR(Status
)) {
131 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
132 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, L
"dblk", ProblemParam
);
133 FreePool(ProblemParam
);
134 ShellStatus
= SHELL_INVALID_PARAMETER
;
139 if (ShellCommandLineGetCount(Package
) > 4) {
140 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDebug1HiiHandle
, L
"dblk");
141 ShellStatus
= SHELL_INVALID_PARAMETER
;
142 } else if (ShellCommandLineGetCount(Package
) < 2) {
143 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_FEW
), gShellDebug1HiiHandle
, L
"dblk");
144 ShellStatus
= SHELL_INVALID_PARAMETER
;
149 BlockName
= ShellCommandLineGetRawValue(Package
, 1);
150 LbaString
= ShellCommandLineGetRawValue(Package
, 2);
151 BlockCountString
= ShellCommandLineGetRawValue(Package
, 3);
153 if (LbaString
== NULL
) {
156 if (!ShellIsHexOrDecimalNumber(LbaString
, TRUE
, FALSE
)) {
157 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_INV
), gShellDebug1HiiHandle
, L
"dblk", LbaString
);
158 ShellStatus
= SHELL_INVALID_PARAMETER
;
160 ShellConvertStringToUint64(LbaString
, &Lba
, TRUE
, FALSE
);
163 if (BlockCountString
== NULL
) {
166 if (!ShellIsHexOrDecimalNumber(BlockCountString
, TRUE
, FALSE
)) {
167 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_INV
), gShellDebug1HiiHandle
, L
"dblk", BlockCountString
);
168 ShellStatus
= SHELL_INVALID_PARAMETER
;
170 ShellConvertStringToUint64(BlockCountString
, &BlockCount
, TRUE
, FALSE
);
171 if (BlockCount
> 0x10) {
173 } else if (BlockCount
== 0) {
174 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_INV
), gShellDebug1HiiHandle
, L
"dblk", BlockCountString
);
175 ShellStatus
= SHELL_INVALID_PARAMETER
;
179 if (ShellStatus
== SHELL_SUCCESS
) {
181 // do the work if we have a valid block identifier
183 if (gEfiShellProtocol
->GetDevicePathFromMap(BlockName
) == NULL
) {
184 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_INV
), gShellDebug1HiiHandle
, L
"dblk", BlockName
);
185 ShellStatus
= SHELL_INVALID_PARAMETER
;
187 DevPath
= (EFI_DEVICE_PATH_PROTOCOL
*)gEfiShellProtocol
->GetDevicePathFromMap(BlockName
);
188 if (gBS
->LocateDevicePath(&gEfiBlockIoProtocolGuid
, &DevPath
, NULL
) == EFI_NOT_FOUND
) {
189 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_MAP_PROTOCOL
), gShellDebug1HiiHandle
, L
"dblk", BlockName
, L
"BlockIo");
190 ShellStatus
= SHELL_INVALID_PARAMETER
;
192 ShellStatus
= DisplayTheBlocks(gEfiShellProtocol
->GetDevicePathFromMap(BlockName
), Lba
, (UINT8
)BlockCount
);
198 ShellCommandLineFreeVarList (Package
);
200 return (ShellStatus
);