]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDebug1CommandsLib/Dblk.c
Add "Debug1" profile (all but Edit and HexEdit commands)
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / Dblk.c
CommitLineData
5d73d92f 1/** @file\r
2 Main file for Dblk shell Debug1 function.\r
3\r
4 Copyright (c) 2005 - 2010, Intel Corporation. All rights reserved.<BR>\r
5 This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution. The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
9\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "UefiShellDebug1CommandsLib.h"\r
16#include <Protocol/BlockIo.h>\r
17\r
18SHELL_STATUS\r
19EFIAPI\r
20DisplayTheBlocks(\r
21 IN CONST EFI_DEVICE_PATH_PROTOCOL *DevPath,\r
22 IN CONST UINT64 Lba,\r
23 IN CONST UINT8 BlockCount\r
24 )\r
25{\r
26 EFI_BLOCK_IO_PROTOCOL *BlockIo;\r
27 EFI_DEVICE_PATH_PROTOCOL *Copy;\r
28 EFI_HANDLE BlockIoHandle;\r
29 EFI_STATUS Status;\r
30 SHELL_STATUS ShellStatus;\r
31 UINT8 *Buffer;\r
32 UINTN BufferSize;\r
33\r
34 ShellStatus = SHELL_SUCCESS;\r
35 Copy = (EFI_DEVICE_PATH_PROTOCOL *)DevPath;\r
36\r
37 Status = gBS->LocateDevicePath(&gEfiBlockIoProtocolGuid, &Copy, &BlockIoHandle);\r
38 ASSERT_EFI_ERROR(Status);\r
39\r
40 Status = gBS->OpenProtocol(BlockIoHandle, &gEfiBlockIoProtocolGuid, (VOID**)&BlockIo, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
41 ASSERT_EFI_ERROR(Status);\r
42\r
43 BufferSize = BlockIo->Media->BlockSize * BlockCount;\r
44 if (BufferSize > 0) {\r
45 Buffer = AllocatePool(BufferSize);\r
46 } else {\r
47 Buffer = NULL;\r
48 }\r
49\r
50 Status = BlockIo->ReadBlocks(BlockIo, BlockIo->Media->MediaId, Lba, BufferSize, Buffer);\r
51 if (!EFI_ERROR(Status) && Buffer != NULL) {\r
52 DumpHex(2,0,BufferSize,Buffer);\r
53 } else {\r
54 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_READ_FAIL), gShellDebug1HiiHandle, L"BlockIo", Status);\r
55 ShellStatus = SHELL_DEVICE_ERROR;\r
56 }\r
57\r
58 if (Buffer != NULL) {\r
59 FreePool(Buffer);\r
60 }\r
61\r
62 gBS->CloseProtocol(BlockIoHandle, &gEfiBlockIoProtocolGuid, gImageHandle, NULL);\r
63 return (ShellStatus);\r
64}\r
65\r
66SHELL_STATUS\r
67EFIAPI\r
68ShellCommandRunDblk (\r
69 IN EFI_HANDLE ImageHandle,\r
70 IN EFI_SYSTEM_TABLE *SystemTable\r
71 )\r
72{\r
73 EFI_STATUS Status;\r
74 LIST_ENTRY *Package;\r
75 CHAR16 *ProblemParam;\r
76 SHELL_STATUS ShellStatus;\r
77 CONST CHAR16 *BlockName;\r
78 CONST CHAR16 *LbaString;\r
79 CONST CHAR16 *BlockCountString;\r
80 UINT64 Lba;\r
81 UINT8 BlockCount;\r
82\r
83 ShellStatus = SHELL_SUCCESS;\r
84 Status = EFI_SUCCESS;\r
85\r
86 //\r
87 // initialize the shell lib (we must be in non-auto-init...)\r
88 //\r
89 Status = ShellInitialize();\r
90 ASSERT_EFI_ERROR(Status);\r
91\r
92 Status = CommandInit();\r
93 ASSERT_EFI_ERROR(Status);\r
94\r
95 //\r
96 // parse the command line\r
97 //\r
98 Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE);\r
99 if (EFI_ERROR(Status)) {\r
100 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
101 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, ProblemParam);\r
102 FreePool(ProblemParam);\r
103 ShellStatus = SHELL_INVALID_PARAMETER;\r
104 } else {\r
105 ASSERT(FALSE);\r
106 }\r
107 } else {\r
108 if (ShellCommandLineGetCount(Package) > 4) {\r
109 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle);\r
110 ShellStatus = SHELL_INVALID_PARAMETER;\r
111 } else if (ShellCommandLineGetCount(Package) < 2) {\r
112 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle);\r
113 ShellStatus = SHELL_INVALID_PARAMETER;\r
114 } else {\r
115 //\r
116 // Parse the params\r
117 //\r
118 BlockName = ShellCommandLineGetRawValue(Package, 1);\r
119 LbaString = ShellCommandLineGetRawValue(Package, 2);\r
120 BlockCountString = ShellCommandLineGetRawValue(Package, 3);\r
121\r
122 if (LbaString == NULL) {\r
123 Lba = 0;\r
124 } else {\r
125 Lba = (UINT64)StrHexToUintn(LbaString);\r
126 }\r
127\r
128 if (BlockCountString == NULL) {\r
129 BlockCount = 1;\r
130 } else {\r
131 BlockCount = (UINT8)StrHexToUintn(BlockCountString);\r
132 if (BlockCount > 0x10) {\r
133 BlockCount = 0x10;\r
134 }\r
135 }\r
136\r
137 //\r
138 // do the work if we have a valid block identifier\r
139 //\r
140 if (mEfiShellProtocol->GetDevicePathFromMap(BlockName) == NULL) {\r
141 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, BlockName);\r
142 ShellStatus = SHELL_INVALID_PARAMETER;\r
143 } else {\r
144 ShellStatus = DisplayTheBlocks(mEfiShellProtocol->GetDevicePathFromMap(BlockName), Lba, BlockCount);\r
145 }\r
146 }\r
147\r
148 ShellCommandLineFreeVarList (Package);\r
149 }\r
150 return (ShellStatus);\r
151}\r