2 Main file for Dblk shell Debug1 function.
4 Copyright (c) 2005 - 2011, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include "UefiShellDebug1CommandsLib.h"
16 #include <Protocol/BlockIo.h>
19 Display blocks to the screen.
21 @param[in] DevPath The device path to get the blocks from.
22 @param[in] Lba The Lba number to start from.
23 @param[in] BlockCount How many blocks to display.
25 @retval SHELL_SUCCESS The display was successful.
30 IN CONST EFI_DEVICE_PATH_PROTOCOL
*DevPath
,
32 IN CONST UINT8 BlockCount
35 EFI_BLOCK_IO_PROTOCOL
*BlockIo
;
36 EFI_HANDLE BlockIoHandle
;
38 SHELL_STATUS ShellStatus
;
42 ShellStatus
= SHELL_SUCCESS
;
44 Status
= gBS
->LocateDevicePath(&gEfiBlockIoProtocolGuid
, (EFI_DEVICE_PATH_PROTOCOL
**)&DevPath
, &BlockIoHandle
);
45 if (EFI_ERROR(Status
)) {
46 return (SHELL_NOT_FOUND
);
49 Status
= gBS
->OpenProtocol(BlockIoHandle
, &gEfiBlockIoProtocolGuid
, (VOID
**)&BlockIo
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
50 if (EFI_ERROR(Status
)) {
51 return (SHELL_NOT_FOUND
);
54 BufferSize
= BlockIo
->Media
->BlockSize
* BlockCount
;
56 Buffer
= AllocateZeroPool(BufferSize
);
58 ShellPrintEx(-1,-1,L
" BlockSize: 0x%08x, BlockCount: 0x%08x\r\n", BlockIo
->Media
->BlockSize
, BlockCount
);
62 Status
= BlockIo
->ReadBlocks(BlockIo
, BlockIo
->Media
->MediaId
, Lba
, BufferSize
, Buffer
);
63 if (!EFI_ERROR(Status
) && Buffer
!= NULL
) {
68 STRING_TOKEN (STR_DBLK_HEADER
),
69 gShellDebug1HiiHandle
,
75 DumpHex(2,0,BufferSize
,Buffer
);
77 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_READ_FAIL
), gShellDebug1HiiHandle
, L
"BlockIo", Status
);
78 ShellStatus
= SHELL_DEVICE_ERROR
;
85 gBS
->CloseProtocol(BlockIoHandle
, &gEfiBlockIoProtocolGuid
, gImageHandle
, NULL
);
90 Function for 'dblk' command.
92 @param[in] ImageHandle Handle to the Image (NULL if Internal).
93 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
98 IN EFI_HANDLE ImageHandle
,
99 IN EFI_SYSTEM_TABLE
*SystemTable
104 CHAR16
*ProblemParam
;
105 SHELL_STATUS ShellStatus
;
106 CONST CHAR16
*BlockName
;
107 CONST CHAR16
*LbaString
;
108 CONST CHAR16
*BlockCountString
;
111 EFI_DEVICE_PATH_PROTOCOL
*DevPath
;
113 ShellStatus
= SHELL_SUCCESS
;
114 Status
= EFI_SUCCESS
;
117 // initialize the shell lib (we must be in non-auto-init...)
119 Status
= ShellInitialize();
120 ASSERT_EFI_ERROR(Status
);
122 Status
= CommandInit();
123 ASSERT_EFI_ERROR(Status
);
126 // parse the command line
128 Status
= ShellCommandLineParse (EmptyParamList
, &Package
, &ProblemParam
, TRUE
);
129 if (EFI_ERROR(Status
)) {
130 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
131 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, ProblemParam
);
132 FreePool(ProblemParam
);
133 ShellStatus
= SHELL_INVALID_PARAMETER
;
138 if (ShellCommandLineGetCount(Package
) > 4) {
139 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDebug1HiiHandle
);
140 ShellStatus
= SHELL_INVALID_PARAMETER
;
141 } else if (ShellCommandLineGetCount(Package
) < 2) {
142 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_FEW
), gShellDebug1HiiHandle
);
143 ShellStatus
= SHELL_INVALID_PARAMETER
;
148 BlockName
= ShellCommandLineGetRawValue(Package
, 1);
149 LbaString
= ShellCommandLineGetRawValue(Package
, 2);
150 BlockCountString
= ShellCommandLineGetRawValue(Package
, 3);
152 if (LbaString
== NULL
) {
155 if (!ShellIsHexOrDecimalNumber(LbaString
, TRUE
, FALSE
)) {
156 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, LbaString
);
157 ShellStatus
= SHELL_INVALID_PARAMETER
;
159 ShellConvertStringToUint64(LbaString
, &Lba
, TRUE
, FALSE
);
162 if (BlockCountString
== NULL
) {
165 if (!ShellIsHexOrDecimalNumber(BlockCountString
, TRUE
, FALSE
)) {
166 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, BlockCountString
);
167 ShellStatus
= SHELL_INVALID_PARAMETER
;
169 ShellConvertStringToUint64(BlockCountString
, &BlockCount
, TRUE
, FALSE
);
170 if (BlockCount
> 0x10) {
172 } else if (BlockCount
== 0) {
173 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, BlockCountString
);
174 ShellStatus
= SHELL_INVALID_PARAMETER
;
178 if (ShellStatus
== SHELL_SUCCESS
) {
180 // do the work if we have a valid block identifier
182 if (gEfiShellProtocol
->GetDevicePathFromMap(BlockName
) == NULL
) {
183 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, BlockName
);
184 ShellStatus
= SHELL_INVALID_PARAMETER
;
186 DevPath
= (EFI_DEVICE_PATH_PROTOCOL
*)gEfiShellProtocol
->GetDevicePathFromMap(BlockName
);
187 if (gBS
->LocateDevicePath(&gEfiBlockIoProtocolGuid
, &DevPath
, NULL
) == EFI_NOT_FOUND
) {
188 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_MAP_PROTOCOL
), gShellDebug1HiiHandle
, BlockName
, L
"BlockIo");
189 ShellStatus
= SHELL_INVALID_PARAMETER
;
191 ShellStatus
= DisplayTheBlocks(gEfiShellProtocol
->GetDevicePathFromMap(BlockName
), Lba
, (UINT8
)BlockCount
);
197 ShellCommandLineFreeVarList (Package
);
199 return (ShellStatus
);