]> git.proxmox.com Git - mirror_edk2.git/blob - ShellPkg/Library/UefiShellDebug1CommandsLib/Dblk.c
Add "Debug1" profile (all but Edit and HexEdit commands)
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / Dblk.c
1 /** @file
2 Main file for Dblk shell Debug1 function.
3
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
9
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.
12
13 **/
14
15 #include "UefiShellDebug1CommandsLib.h"
16 #include <Protocol/BlockIo.h>
17
18 SHELL_STATUS
19 EFIAPI
20 DisplayTheBlocks(
21 IN CONST EFI_DEVICE_PATH_PROTOCOL *DevPath,
22 IN CONST UINT64 Lba,
23 IN CONST UINT8 BlockCount
24 )
25 {
26 EFI_BLOCK_IO_PROTOCOL *BlockIo;
27 EFI_DEVICE_PATH_PROTOCOL *Copy;
28 EFI_HANDLE BlockIoHandle;
29 EFI_STATUS Status;
30 SHELL_STATUS ShellStatus;
31 UINT8 *Buffer;
32 UINTN BufferSize;
33
34 ShellStatus = SHELL_SUCCESS;
35 Copy = (EFI_DEVICE_PATH_PROTOCOL *)DevPath;
36
37 Status = gBS->LocateDevicePath(&gEfiBlockIoProtocolGuid, &Copy, &BlockIoHandle);
38 ASSERT_EFI_ERROR(Status);
39
40 Status = gBS->OpenProtocol(BlockIoHandle, &gEfiBlockIoProtocolGuid, (VOID**)&BlockIo, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);
41 ASSERT_EFI_ERROR(Status);
42
43 BufferSize = BlockIo->Media->BlockSize * BlockCount;
44 if (BufferSize > 0) {
45 Buffer = AllocatePool(BufferSize);
46 } else {
47 Buffer = NULL;
48 }
49
50 Status = BlockIo->ReadBlocks(BlockIo, BlockIo->Media->MediaId, Lba, BufferSize, Buffer);
51 if (!EFI_ERROR(Status) && Buffer != NULL) {
52 DumpHex(2,0,BufferSize,Buffer);
53 } else {
54 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_READ_FAIL), gShellDebug1HiiHandle, L"BlockIo", Status);
55 ShellStatus = SHELL_DEVICE_ERROR;
56 }
57
58 if (Buffer != NULL) {
59 FreePool(Buffer);
60 }
61
62 gBS->CloseProtocol(BlockIoHandle, &gEfiBlockIoProtocolGuid, gImageHandle, NULL);
63 return (ShellStatus);
64 }
65
66 SHELL_STATUS
67 EFIAPI
68 ShellCommandRunDblk (
69 IN EFI_HANDLE ImageHandle,
70 IN EFI_SYSTEM_TABLE *SystemTable
71 )
72 {
73 EFI_STATUS Status;
74 LIST_ENTRY *Package;
75 CHAR16 *ProblemParam;
76 SHELL_STATUS ShellStatus;
77 CONST CHAR16 *BlockName;
78 CONST CHAR16 *LbaString;
79 CONST CHAR16 *BlockCountString;
80 UINT64 Lba;
81 UINT8 BlockCount;
82
83 ShellStatus = SHELL_SUCCESS;
84 Status = EFI_SUCCESS;
85
86 //
87 // initialize the shell lib (we must be in non-auto-init...)
88 //
89 Status = ShellInitialize();
90 ASSERT_EFI_ERROR(Status);
91
92 Status = CommandInit();
93 ASSERT_EFI_ERROR(Status);
94
95 //
96 // parse the command line
97 //
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;
104 } else {
105 ASSERT(FALSE);
106 }
107 } else {
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;
114 } else {
115 //
116 // Parse the params
117 //
118 BlockName = ShellCommandLineGetRawValue(Package, 1);
119 LbaString = ShellCommandLineGetRawValue(Package, 2);
120 BlockCountString = ShellCommandLineGetRawValue(Package, 3);
121
122 if (LbaString == NULL) {
123 Lba = 0;
124 } else {
125 Lba = (UINT64)StrHexToUintn(LbaString);
126 }
127
128 if (BlockCountString == NULL) {
129 BlockCount = 1;
130 } else {
131 BlockCount = (UINT8)StrHexToUintn(BlockCountString);
132 if (BlockCount > 0x10) {
133 BlockCount = 0x10;
134 }
135 }
136
137 //
138 // do the work if we have a valid block identifier
139 //
140 if (mEfiShellProtocol->GetDevicePathFromMap(BlockName) == NULL) {
141 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, BlockName);
142 ShellStatus = SHELL_INVALID_PARAMETER;
143 } else {
144 ShellStatus = DisplayTheBlocks(mEfiShellProtocol->GetDevicePathFromMap(BlockName), Lba, BlockCount);
145 }
146 }
147
148 ShellCommandLineFreeVarList (Package);
149 }
150 return (ShellStatus);
151 }