2 Main file for Dblk shell Debug1 function.
4 Copyright (c) 2005 - 2010, 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>
21 IN CONST EFI_DEVICE_PATH_PROTOCOL
*DevPath
,
23 IN CONST UINT8 BlockCount
26 EFI_BLOCK_IO_PROTOCOL
*BlockIo
;
27 EFI_DEVICE_PATH_PROTOCOL
*Copy
;
28 EFI_HANDLE BlockIoHandle
;
30 SHELL_STATUS ShellStatus
;
34 ShellStatus
= SHELL_SUCCESS
;
35 Copy
= (EFI_DEVICE_PATH_PROTOCOL
*)DevPath
;
37 Status
= gBS
->LocateDevicePath(&gEfiBlockIoProtocolGuid
, &Copy
, &BlockIoHandle
);
38 ASSERT_EFI_ERROR(Status
);
40 Status
= gBS
->OpenProtocol(BlockIoHandle
, &gEfiBlockIoProtocolGuid
, (VOID
**)&BlockIo
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
41 ASSERT_EFI_ERROR(Status
);
43 BufferSize
= BlockIo
->Media
->BlockSize
* BlockCount
;
45 Buffer
= AllocatePool(BufferSize
);
50 Status
= BlockIo
->ReadBlocks(BlockIo
, BlockIo
->Media
->MediaId
, Lba
, BufferSize
, Buffer
);
51 if (!EFI_ERROR(Status
) && Buffer
!= NULL
) {
52 DumpHex(2,0,BufferSize
,Buffer
);
54 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_READ_FAIL
), gShellDebug1HiiHandle
, L
"BlockIo", Status
);
55 ShellStatus
= SHELL_DEVICE_ERROR
;
62 gBS
->CloseProtocol(BlockIoHandle
, &gEfiBlockIoProtocolGuid
, gImageHandle
, NULL
);
69 IN EFI_HANDLE ImageHandle
,
70 IN EFI_SYSTEM_TABLE
*SystemTable
76 SHELL_STATUS ShellStatus
;
77 CONST CHAR16
*BlockName
;
78 CONST CHAR16
*LbaString
;
79 CONST CHAR16
*BlockCountString
;
83 ShellStatus
= SHELL_SUCCESS
;
87 // initialize the shell lib (we must be in non-auto-init...)
89 Status
= ShellInitialize();
90 ASSERT_EFI_ERROR(Status
);
92 Status
= CommandInit();
93 ASSERT_EFI_ERROR(Status
);
96 // parse the command line
98 Status
= ShellCommandLineParse (EmptyParamList
, &Package
, &ProblemParam
, TRUE
);
99 if (EFI_ERROR(Status
)) {
100 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
101 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, ProblemParam
);
102 FreePool(ProblemParam
);
103 ShellStatus
= SHELL_INVALID_PARAMETER
;
108 if (ShellCommandLineGetCount(Package
) > 4) {
109 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDebug1HiiHandle
);
110 ShellStatus
= SHELL_INVALID_PARAMETER
;
111 } else if (ShellCommandLineGetCount(Package
) < 2) {
112 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_FEW
), gShellDebug1HiiHandle
);
113 ShellStatus
= SHELL_INVALID_PARAMETER
;
118 BlockName
= ShellCommandLineGetRawValue(Package
, 1);
119 LbaString
= ShellCommandLineGetRawValue(Package
, 2);
120 BlockCountString
= ShellCommandLineGetRawValue(Package
, 3);
122 if (LbaString
== NULL
) {
125 Lba
= (UINT64
)StrHexToUintn(LbaString
);
128 if (BlockCountString
== NULL
) {
131 BlockCount
= (UINT8
)StrHexToUintn(BlockCountString
);
132 if (BlockCount
> 0x10) {
138 // do the work if we have a valid block identifier
140 if (mEfiShellProtocol
->GetDevicePathFromMap(BlockName
) == NULL
) {
141 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, BlockName
);
142 ShellStatus
= SHELL_INVALID_PARAMETER
;
144 ShellStatus
= DisplayTheBlocks(mEfiShellProtocol
->GetDevicePathFromMap(BlockName
), Lba
, BlockCount
);
148 ShellCommandLineFreeVarList (Package
);
150 return (ShellStatus
);