]> git.proxmox.com Git - mirror_edk2.git/blob - ShellPkg/Library/UefiShellDebug1CommandsLib/Comp.c
ShellPkg: fix Comp command output
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / Comp.c
1 /** @file
2 Main file for Comp shell Debug1 function.
3
4 Copyright (c) 2010 - 2014, 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
17 /**
18 Function for 'comp' command.
19
20 @param[in] ImageHandle Handle to the Image (NULL if Internal).
21 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
22 **/
23 SHELL_STATUS
24 EFIAPI
25 ShellCommandRunComp (
26 IN EFI_HANDLE ImageHandle,
27 IN EFI_SYSTEM_TABLE *SystemTable
28 )
29 {
30 EFI_STATUS Status;
31 LIST_ENTRY *Package;
32 CHAR16 *ProblemParam;
33 SHELL_STATUS ShellStatus;
34 UINTN LoopVar;
35 SHELL_FILE_HANDLE FileHandle1;
36 SHELL_FILE_HANDLE FileHandle2;
37 UINT8 ErrorCount;
38 UINT64 Size1;
39 UINT64 Size2;
40 UINT8 DataFromFile1;
41 UINT8 DataFromFile2;
42 UINT8 ADF_File11;
43 UINT8 ADF_File12;
44 UINT8 ADF_File13;
45 UINT8 ADF_File21;
46 UINT8 ADF_File22;
47 UINT8 ADF_File23;
48 UINTN DataSizeFromFile1;
49 UINTN DataSizeFromFile2;
50 CHAR16 *FileName1;
51 CHAR16 *FileName2;
52 CONST CHAR16 *TempParam;
53 UINTN ErrorAddress;
54
55 ErrorCount = 0;
56 ShellStatus = SHELL_SUCCESS;
57 Status = EFI_SUCCESS;
58 FileName1 = NULL;
59 FileName2 = NULL;
60 FileHandle1 = NULL;
61 FileHandle2 = NULL;
62 Size1 = 0;
63
64 //
65 // initialize the shell lib (we must be in non-auto-init...)
66 //
67 Status = ShellInitialize();
68 ASSERT_EFI_ERROR(Status);
69
70 Status = CommandInit();
71 ASSERT_EFI_ERROR(Status);
72
73 //
74 // parse the command line
75 //
76 Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE);
77 if (EFI_ERROR(Status)) {
78 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {
79 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, ProblemParam);
80 FreePool(ProblemParam);
81 ShellStatus = SHELL_INVALID_PARAMETER;
82 } else {
83 ASSERT(FALSE);
84 }
85 } else {
86 if (ShellCommandLineGetCount(Package) > 3) {
87 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle);
88 ShellStatus = SHELL_INVALID_PARAMETER;
89 } else if (ShellCommandLineGetCount(Package) < 3) {
90 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle);
91 ShellStatus = SHELL_INVALID_PARAMETER;
92 } else {
93 TempParam = ShellCommandLineGetRawValue(Package, 1);
94 ASSERT(TempParam != NULL);
95 FileName1 = ShellFindFilePath(TempParam);
96 if (FileName1 == NULL) {
97 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_FIND_FAIL), gShellDebug1HiiHandle, TempParam);
98 ShellStatus = SHELL_NOT_FOUND;
99 } else {
100 Status = ShellOpenFileByName(FileName1, &FileHandle1, EFI_FILE_MODE_READ, 0);
101 if (EFI_ERROR(Status)) {
102 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_OPEN_FAIL), gShellDebug1HiiHandle, TempParam, Status);
103 ShellStatus = SHELL_NOT_FOUND;
104 }
105 }
106 TempParam = ShellCommandLineGetRawValue(Package, 2);
107 ASSERT(TempParam != NULL);
108 FileName2 = ShellFindFilePath(TempParam);
109 if (FileName2 == NULL) {
110 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_FIND_FAIL), gShellDebug1HiiHandle, TempParam);
111 ShellStatus = SHELL_NOT_FOUND;
112 } else {
113 Status = ShellOpenFileByName(FileName2, &FileHandle2, EFI_FILE_MODE_READ, 0);
114 if (EFI_ERROR(Status)) {
115 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_OPEN_FAIL), gShellDebug1HiiHandle, TempParam, Status);
116 ShellStatus = SHELL_NOT_FOUND;
117 }
118 }
119 if (ShellStatus == SHELL_SUCCESS) {
120 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_COMP_HEADER), gShellDebug1HiiHandle, FileName1, FileName2);
121 Status = gEfiShellProtocol->GetFileSize(FileHandle1, &Size1);
122 ASSERT_EFI_ERROR(Status);
123 Status = gEfiShellProtocol->GetFileSize(FileHandle2, &Size2);
124 ASSERT_EFI_ERROR(Status);
125 if (Size1 != Size2) {
126 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_COMP_SIZE_FAIL), gShellDebug1HiiHandle);
127 ErrorCount++;
128 ShellStatus = SHELL_NOT_EQUAL;
129 }
130 }
131 if (ShellStatus == SHELL_SUCCESS) {
132 for (LoopVar = 0 ; LoopVar < Size1 && ErrorCount <= 10 ; LoopVar++) {
133 DataSizeFromFile1 = 1;
134 DataSizeFromFile2 = 1;
135 Status = gEfiShellProtocol->ReadFile(FileHandle1, &DataSizeFromFile1, &DataFromFile1);
136 ASSERT_EFI_ERROR(Status);
137 Status = gEfiShellProtocol->ReadFile(FileHandle2, &DataSizeFromFile2, &DataFromFile2);
138 ASSERT_EFI_ERROR(Status);
139 if (DataFromFile1 != DataFromFile2) {
140 ErrorAddress = LoopVar;
141 ADF_File11 = 0;
142 ADF_File12 = 0;
143 ADF_File13 = 0;
144 ADF_File21 = 0;
145 ADF_File22 = 0;
146 ADF_File23 = 0;
147
148 //
149 // Now check the next 3 bytes if possible. This will make output
150 // cleaner when there are a sequence of differences.
151 //
152 if (LoopVar + 1 < Size1) {
153 LoopVar++;
154 DataSizeFromFile1 = 1;
155 DataSizeFromFile2 = 1;
156 Status = gEfiShellProtocol->ReadFile(FileHandle1, &DataSizeFromFile1, &ADF_File11);
157 ASSERT_EFI_ERROR(Status);
158 Status = gEfiShellProtocol->ReadFile(FileHandle2, &DataSizeFromFile2, &ADF_File21);
159 ASSERT_EFI_ERROR(Status);
160 if (LoopVar + 1 < Size1) {
161 LoopVar++;
162 DataSizeFromFile1 = 1;
163 DataSizeFromFile2 = 1;
164 Status = gEfiShellProtocol->ReadFile(FileHandle1, &DataSizeFromFile1, &ADF_File12);
165 ASSERT_EFI_ERROR(Status);
166 Status = gEfiShellProtocol->ReadFile(FileHandle2, &DataSizeFromFile2, &ADF_File22);
167 ASSERT_EFI_ERROR(Status);
168 if (LoopVar + 1 < Size1) {
169 LoopVar++;
170 DataSizeFromFile1 = 1;
171 DataSizeFromFile2 = 1;
172 Status = gEfiShellProtocol->ReadFile(FileHandle1, &DataSizeFromFile1, &ADF_File13);
173 ASSERT_EFI_ERROR(Status);
174 Status = gEfiShellProtocol->ReadFile(FileHandle2, &DataSizeFromFile2, &ADF_File23);
175 ASSERT_EFI_ERROR(Status);
176 }
177 }
178 }
179
180 //
181 // Print out based on highest of the 4 bytes that are different.
182 //
183 if (ADF_File13 != ADF_File23) {
184 ShellPrintHiiEx(
185 -1,
186 -1,
187 NULL,
188 STRING_TOKEN (STR_COMP_SPOT_FAIL4),
189 gShellDebug1HiiHandle,
190 ++ErrorCount,
191 FileName1,
192 ErrorAddress,
193 DataFromFile1, ADF_File11, ADF_File12, ADF_File13,
194 DataFromFile1, ADF_File11, ADF_File12, ADF_File13,
195 FileName2,
196 ErrorAddress,
197 DataFromFile2, ADF_File21, ADF_File22, ADF_File23,
198 DataFromFile2, ADF_File21, ADF_File22, ADF_File23
199 );
200 } else if (ADF_File12 != ADF_File22) {
201 ShellPrintHiiEx(
202 -1,
203 -1,
204 NULL,
205 STRING_TOKEN (STR_COMP_SPOT_FAIL3),
206 gShellDebug1HiiHandle,
207 ++ErrorCount,
208 FileName1,
209 ErrorAddress,
210 DataFromFile1, ADF_File11, ADF_File12,
211 DataFromFile1, ADF_File11, ADF_File12,
212 FileName2,
213 ErrorAddress,
214 DataFromFile2, ADF_File21, ADF_File22,
215 DataFromFile2, ADF_File21, ADF_File22
216 );
217 } else if (ADF_File11 != ADF_File21) {
218 ShellPrintHiiEx(
219 -1,
220 -1,
221 NULL,
222 STRING_TOKEN (STR_COMP_SPOT_FAIL2),
223 gShellDebug1HiiHandle,
224 ++ErrorCount,
225 FileName1,
226 ErrorAddress,
227 DataFromFile1, ADF_File11,
228 DataFromFile1, ADF_File11,
229 FileName2,
230 ErrorAddress,
231 DataFromFile2, ADF_File21,
232 DataFromFile2, ADF_File21
233 );
234 } else {
235 ShellPrintHiiEx(
236 -1,
237 -1,
238 NULL,
239 STRING_TOKEN (STR_COMP_SPOT_FAIL1),
240 gShellDebug1HiiHandle,
241 ++ErrorCount,
242 FileName1,
243 ErrorAddress,
244 DataFromFile1,
245 DataFromFile1,
246 FileName2,
247 ErrorAddress,
248 DataFromFile2,
249 DataFromFile2
250 );
251 }
252 ShellStatus = SHELL_NOT_EQUAL;
253 }
254 }
255 if (ErrorCount == 0) {
256 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_COMP_FOOTER_PASS), gShellDebug1HiiHandle);
257 } else {
258 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_COMP_FOOTER_FAIL), gShellDebug1HiiHandle);
259 }
260 }
261 }
262
263 ShellCommandLineFreeVarList (Package);
264 }
265 SHELL_FREE_NON_NULL(FileName1);
266 SHELL_FREE_NON_NULL(FileName2);
267
268 if (FileHandle1 != NULL) {
269 gEfiShellProtocol->CloseFile(FileHandle1);
270 }
271 if (FileHandle2 != NULL) {
272 gEfiShellProtocol->CloseFile(FileHandle2);
273 }
274
275 return (ShellStatus);
276 }