]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDebug1CommandsLib/Mm.c
ShellPkg: Parse new SMBIOS 3.0 fields.
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / Mm.c
CommitLineData
5d73d92f 1/** @file\r
2 Main file for Mm shell Debug1 function.\r
3\r
c011b6c9 4 (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>\r
81cd2f53 5 Copyright (c) 2005 - 2014, Intel Corporation. All rights reserved.<BR>\r
5d73d92f 6 This program and the accompanying materials\r
7 are licensed and made available under the terms and conditions of the BSD License\r
8 which accompanies this distribution. The full text of the license may be found at\r
9 http://opensource.org/licenses/bsd-license.php\r
10\r
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13\r
14**/\r
15\r
16#include "UefiShellDebug1CommandsLib.h"\r
17#include <Library/ShellLib.h>\r
18#include <Protocol/PciRootBridgeIo.h>\r
19#include <Protocol/DeviceIo.h>\r
20\r
21typedef enum {\r
22 EfiMemory,\r
23 EFIMemoryMappedIo,\r
24 EfiIo,\r
25 EfiPciConfig,\r
26 EfiPciEConfig\r
27} EFI_ACCESS_TYPE;\r
28\r
3737ac2b 29STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
30 {L"-mmio", TypeFlag},\r
31 {L"-mem", TypeFlag},\r
32 {L"-io", TypeFlag},\r
33 {L"-pci", TypeFlag},\r
34 {L"-pcie", TypeFlag},\r
35 {L"-n", TypeFlag},\r
36 {L"-w", TypeValue},\r
37 {NULL, TypeMax}\r
38 };\r
39\r
e0c2cc6f 40STATIC CONST UINT64 MaxNum[9] = { 0xff, 0xffff, 0xffffffff, 0xffffffffffffffffULL };\r
3737ac2b 41\r
42/**\r
43 Read some data into a buffer from memory.\r
5d73d92f 44\r
3737ac2b 45 @param[in] Width The width of each read.\r
46 @param[in] Addresss The memory location to start reading at.\r
47 @param[in] Size The size of Buffer in Width sized units.\r
48 @param[out] Buffer The buffer to read into.\r
49**/\r
5d73d92f 50VOID\r
51EFIAPI\r
52ReadMem (\r
53 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width,\r
54 IN UINT64 Address,\r
55 IN UINTN Size,\r
3737ac2b 56 OUT VOID *Buffer\r
57 )\r
58{\r
59 //\r
60 // This function is defective. This ASSERT prevents the defect from affecting anything.\r
61 //\r
62 ASSERT(Size == 1);\r
63 do {\r
64 if (Width == EfiPciWidthUint8) {\r
65 *(UINT8 *) Buffer = *(UINT8 *) (UINTN) Address;\r
66 Address -= 1;\r
67 } else if (Width == EfiPciWidthUint16) {\r
68 *(UINT16 *) Buffer = *(UINT16 *) (UINTN) Address;\r
69 Address -= 2;\r
70 } else if (Width == EfiPciWidthUint32) {\r
71 *(UINT32 *) Buffer = *(UINT32 *) (UINTN) Address;\r
72 Address -= 4;\r
73 } else if (Width == EfiPciWidthUint64) {\r
74 *(UINT64 *) Buffer = *(UINT64 *) (UINTN) Address;\r
75 Address -= 8;\r
76 } else {\r
4092a8f6 77 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_READ_ERROR), gShellDebug1HiiHandle, L"mm"); \r
3737ac2b 78 break;\r
79 }\r
80 Size--;\r
81 } while (Size > 0);\r
82}\r
83\r
84/**\r
85 Write some data to memory.\r
5d73d92f 86\r
3737ac2b 87 @param[in] Width The width of each write.\r
88 @param[in] Addresss The memory location to start writing at.\r
89 @param[in] Size The size of Buffer in Width sized units.\r
90 @param[in] Buffer The buffer to write from.\r
91**/\r
5d73d92f 92VOID\r
93EFIAPI\r
94WriteMem (\r
95 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width,\r
96 IN UINT64 Address,\r
97 IN UINTN Size,\r
98 IN VOID *Buffer\r
3737ac2b 99 )\r
100{\r
101 //\r
102 // This function is defective. This ASSERT prevents the defect from affecting anything.\r
103 //\r
104 ASSERT(Size == 1);\r
105 do {\r
106 if (Width == EfiPciWidthUint8) {\r
107 *(UINT8 *) (UINTN) Address = *(UINT8 *) Buffer;\r
108 Address += 1;\r
109 } else if (Width == EfiPciWidthUint16) {\r
110 *(UINT16 *) (UINTN) Address = *(UINT16 *) Buffer;\r
111 Address += 2;\r
112 } else if (Width == EfiPciWidthUint32) {\r
113 *(UINT32 *) (UINTN) Address = *(UINT32 *) Buffer;\r
114 Address += 4;\r
115 } else if (Width == EfiPciWidthUint64) {\r
116 *(UINT64 *) (UINTN) Address = *(UINT64 *) Buffer;\r
117 Address += 8;\r
118 } else {\r
119 ASSERT (FALSE);\r
120 }\r
121 //\r
122 //\r
123 //\r
124 Size--;\r
125 } while (Size > 0);\r
126}\r
5d73d92f 127\r
3737ac2b 128/**\r
129 Convert a string to it's hex data.\r
130\r
131 @param[in] str The pointer to the string of hex data.\r
132 @param[out] data The pointer to the buffer to fill. Valid upon a TRUE return.\r
133\r
134 @retval TRUE The conversion was successful.\r
135 @retval FALSE The conversion failed.\r
136**/\r
5d73d92f 137BOOLEAN\r
138EFIAPI\r
139GetHex (\r
140 IN UINT16 *str,\r
141 OUT UINT64 *data\r
3737ac2b 142 )\r
143{\r
144 UINTN TempUint;\r
145 CHAR16 TempChar;\r
146 BOOLEAN Find;\r
5d73d92f 147\r
3737ac2b 148 Find = FALSE;\r
149 //\r
150 // convert hex digits\r
151 //\r
152 TempUint = 0;\r
153 TempChar = *(str++);\r
154 while (TempChar != CHAR_NULL) {\r
155 if (TempChar >= 'a' && TempChar <= 'f') {\r
156 TempChar -= 'a' - 'A';\r
157 }\r
5d73d92f 158\r
3737ac2b 159 if (TempChar == ' ') {\r
160 break;\r
161 }\r
162\r
163 if ((TempChar >= '0' && TempChar <= '9') || (TempChar >= 'A' && TempChar <= 'F')) {\r
f3c59716 164 TempUint = (TempUint << 4) | (TempChar - (TempChar >= 'A' ? 'A' - 10 : '0'));\r
3737ac2b 165\r
166 Find = TRUE;\r
167 } else {\r
168 return FALSE;\r
169 }\r
170\r
171 TempChar = *(str++);\r
172 }\r
173\r
174 *data = TempUint;\r
175 return Find;\r
176}\r
5d73d92f 177\r
178/**\r
179 Get the PCI-E Address from a PCI address format 0x0000ssbbddffrrr\r
180 where ss is SEGMENT, bb is BUS, dd is DEVICE, ff is FUNCTION\r
181 and rrr is REGISTER (extension format for PCI-E).\r
182\r
183 @param[in] InputAddress PCI address format on input.\r
184 @param[out]PciEAddress PCI-E address extention format.\r
185**/\r
186VOID\r
187EFIAPI\r
188GetPciEAddressFromInputAddress (\r
189 IN UINT64 InputAddress,\r
190 OUT UINT64 *PciEAddress\r
191 )\r
192{\r
193 *PciEAddress = RShiftU64(InputAddress & ~(UINT64) 0xFFF, 4);\r
194 *PciEAddress += LShiftU64((UINT16) InputAddress & 0x0FFF, 32);\r
195}\r
196\r
197/**\r
198 Function for 'mm' command.\r
199\r
200 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
201 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
202**/\r
203SHELL_STATUS\r
204EFIAPI\r
205ShellCommandRunMm (\r
206 IN EFI_HANDLE ImageHandle,\r
207 IN EFI_SYSTEM_TABLE *SystemTable\r
208 )\r
209{\r
210 EFI_STATUS Status;\r
211 EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *IoDev;\r
212 UINT64 Address;\r
213 UINT64 PciEAddress;\r
214 UINT64 Value;\r
215 UINT32 SegmentNumber;\r
216 EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width;\r
217 EFI_ACCESS_TYPE AccessType;\r
218 UINT64 Buffer;\r
219 UINTN Index;\r
220 UINTN Size;\r
5d73d92f 221// CHAR16 *ValueStr;\r
222 BOOLEAN Complete;\r
223 CHAR16 *InputStr;\r
224 BOOLEAN Interactive;\r
225 EFI_HANDLE *HandleBuffer;\r
226 UINTN BufferSize;\r
227 UINTN ItemValue;\r
228 LIST_ENTRY *Package;\r
229 CHAR16 *ProblemParam;\r
230 SHELL_STATUS ShellStatus;\r
231 CONST CHAR16 *Temp;\r
232\r
81cd2f53 233 Value = 0;\r
5d73d92f 234 Address = 0;\r
235 PciEAddress = 0;\r
236 IoDev = NULL;\r
237 HandleBuffer = NULL;\r
238 BufferSize = 0;\r
239 SegmentNumber = 0;\r
240 ShellStatus = SHELL_SUCCESS;\r
241 InputStr = NULL;\r
242\r
243 //\r
244 // Parse arguments\r
245 //\r
246 Width = EfiPciWidthUint8;\r
247 Size = 1;\r
248 AccessType = EfiMemory;\r
5d73d92f 249// ValueStr = NULL;\r
250 Interactive = TRUE;\r
251 Package = NULL;\r
252\r
253 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
254 if (EFI_ERROR(Status)) {\r
255 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
4092a8f6 256 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"mm", ProblemParam); \r
5d73d92f 257 FreePool(ProblemParam);\r
258 ShellStatus = SHELL_INVALID_PARAMETER;\r
259 goto Done;\r
260 } else {\r
261 ASSERT(FALSE);\r
262 }\r
263 } else {\r
3737ac2b 264 if (ShellCommandLineGetCount(Package) < 2) {\r
4092a8f6 265 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"mm"); \r
5d73d92f 266 ShellStatus = SHELL_INVALID_PARAMETER;\r
267 goto Done;\r
268 } else if (ShellCommandLineGetCount(Package) > 3) {\r
4092a8f6 269 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"mm"); \r
5d73d92f 270 ShellStatus = SHELL_INVALID_PARAMETER;\r
271 goto Done;\r
3737ac2b 272 } else if (ShellCommandLineGetFlag(Package, L"-w") && ShellCommandLineGetValue(Package, L"-w") == NULL) {\r
4092a8f6 273 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDebug1HiiHandle, L"mm", L"-w"); \r
3737ac2b 274 ShellStatus = SHELL_INVALID_PARAMETER;\r
275 goto Done;\r
5d73d92f 276 } else {\r
277 if (ShellCommandLineGetFlag(Package, L"-mmio")) {\r
278 AccessType = EFIMemoryMappedIo;\r
3737ac2b 279 if (ShellCommandLineGetFlag(Package, L"-mem")\r
280 ||ShellCommandLineGetFlag(Package, L"-io")\r
281 ||ShellCommandLineGetFlag(Package, L"-pci")\r
282 ||ShellCommandLineGetFlag(Package, L"-pcie")\r
283 ){\r
4092a8f6 284 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"mm"); \r
3737ac2b 285 ShellStatus = SHELL_INVALID_PARAMETER;\r
286 goto Done;\r
287 }\r
5d73d92f 288 } else if (ShellCommandLineGetFlag(Package, L"-mem")) {\r
289 AccessType = EfiMemory;\r
3737ac2b 290 if (ShellCommandLineGetFlag(Package, L"-io")\r
291 ||ShellCommandLineGetFlag(Package, L"-pci")\r
292 ||ShellCommandLineGetFlag(Package, L"-pcie")\r
293 ){\r
4092a8f6 294 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"mm"); \r
3737ac2b 295 ShellStatus = SHELL_INVALID_PARAMETER;\r
296 goto Done;\r
297 }\r
5d73d92f 298 } else if (ShellCommandLineGetFlag(Package, L"-io")) {\r
299 AccessType = EfiIo;\r
3737ac2b 300 if (ShellCommandLineGetFlag(Package, L"-pci")\r
301 ||ShellCommandLineGetFlag(Package, L"-pcie")\r
302 ){\r
4092a8f6 303 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"mm"); \r
3737ac2b 304 ShellStatus = SHELL_INVALID_PARAMETER;\r
305 goto Done;\r
306 }\r
5d73d92f 307 } else if (ShellCommandLineGetFlag(Package, L"-pci")) {\r
308 AccessType = EfiPciConfig;\r
3737ac2b 309 if (ShellCommandLineGetFlag(Package, L"-pcie")\r
310 ){\r
4092a8f6 311 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"mm"); \r
3737ac2b 312 ShellStatus = SHELL_INVALID_PARAMETER;\r
313 goto Done;\r
314 }\r
5d73d92f 315 } else if (ShellCommandLineGetFlag(Package, L"-pcie")) {\r
316 AccessType = EfiPciEConfig;\r
317 }\r
318 }\r
319\r
f79868cd
JC
320 //\r
321 // Non interactive for a script file or for the specific parameter\r
322 //\r
323 if (gEfiShellProtocol->BatchIsActive() || ShellCommandLineGetFlag (Package, L"-n")) {\r
5d73d92f 324 Interactive = FALSE;\r
325 }\r
326\r
327 Temp = ShellCommandLineGetValue(Package, L"-w");\r
328 if (Temp != NULL) {\r
3737ac2b 329 ItemValue = ShellStrToUintn (Temp);\r
5d73d92f 330\r
331 switch (ItemValue) {\r
332 case 1:\r
333 Width = EfiPciWidthUint8;\r
334 Size = 1;\r
335 break;\r
336\r
337 case 2:\r
338 Width = EfiPciWidthUint16;\r
339 Size = 2;\r
340 break;\r
341\r
342 case 4:\r
343 Width = EfiPciWidthUint32;\r
344 Size = 4;\r
345 break;\r
346\r
347 case 8:\r
348 Width = EfiPciWidthUint64;\r
349 Size = 8;\r
350 break;\r
351\r
352 default:\r
4092a8f6 353 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellDebug1HiiHandle, L"mm", Temp, L"-w"); \r
5d73d92f 354 ShellStatus = SHELL_INVALID_PARAMETER;\r
355 goto Done;\r
356 }\r
357 }\r
358\r
359 Temp = ShellCommandLineGetRawValue(Package, 1);\r
3737ac2b 360 if (!ShellIsHexOrDecimalNumber(Temp, TRUE, FALSE) || EFI_ERROR(ShellConvertStringToUint64(Temp, (UINT64*)&Address, TRUE, FALSE))) {\r
4092a8f6 361 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"mm", Temp); \r
3737ac2b 362 ShellStatus = SHELL_INVALID_PARAMETER;\r
363 goto Done;\r
5d73d92f 364 }\r
365\r
366 Temp = ShellCommandLineGetRawValue(Package, 2);\r
367 if (Temp != NULL) {\r
f79868cd
JC
368 //\r
369 // Per spec if value is specified, then -n is assumed.\r
370 //\r
371 Interactive = FALSE;\r
372\r
3737ac2b 373 if (!ShellIsHexOrDecimalNumber(Temp, TRUE, FALSE) || EFI_ERROR(ShellConvertStringToUint64(Temp, &Value, TRUE, FALSE))) {\r
4092a8f6 374 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"mm", Temp); \r
3737ac2b 375 ShellStatus = SHELL_INVALID_PARAMETER;\r
376 goto Done;\r
377 }\r
5d73d92f 378 switch (Size) {\r
379 case 1:\r
380 if (Value > 0xFF) {\r
381 ShellStatus = SHELL_INVALID_PARAMETER;\r
382 }\r
383 break;\r
384\r
385 case 2:\r
386 if (Value > 0xFFFF) {\r
387 ShellStatus = SHELL_INVALID_PARAMETER;\r
388 }\r
389 break;\r
390\r
391 case 4:\r
392 if (Value > 0xFFFFFFFF) {\r
393 ShellStatus = SHELL_INVALID_PARAMETER;\r
394 }\r
395 break;\r
396\r
397 default:\r
398 break;\r
399 }\r
400\r
401 if (ShellStatus != SHELL_SUCCESS) {\r
4092a8f6 402 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"mm", Temp); \r
5d73d92f 403 ShellStatus = SHELL_INVALID_PARAMETER;\r
404 goto Done;\r
405 }\r
406 }\r
407\r
408 if ((Address & (Size - 1)) != 0) {\r
4092a8f6 409 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_NOT_ALIGNED), gShellDebug1HiiHandle, L"mm", Address); \r
5d73d92f 410 ShellStatus = SHELL_INVALID_PARAMETER;\r
411 goto Done;\r
412 }\r
413 //\r
414 // locate DeviceIO protocol interface\r
415 //\r
416 if (AccessType != EfiMemory) {\r
417 Status = gBS->LocateHandleBuffer (\r
418 ByProtocol,\r
419 &gEfiPciRootBridgeIoProtocolGuid,\r
420 NULL,\r
421 &BufferSize,\r
422 &HandleBuffer\r
423 );\r
424 if (EFI_ERROR (Status)) {\r
4092a8f6 425 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PCIRBIO_NF), gShellDebug1HiiHandle, L"mm"); \r
5d73d92f 426 ShellStatus = SHELL_NOT_FOUND;\r
427 goto Done;\r
428 }\r
429 //\r
430 // In the case of PCI or PCIE\r
431 // Get segment number and mask the segment bits in Address\r
432 //\r
433 if (AccessType == EfiPciEConfig) {\r
434 SegmentNumber = (UINT32) RShiftU64 (Address, 36) & 0xff;\r
e0c2cc6f 435 Address &= 0xfffffffffULL;\r
5d73d92f 436 } else {\r
437 if (AccessType == EfiPciConfig) {\r
438 SegmentNumber = (UINT32) RShiftU64 (Address, 32) & 0xff;\r
439 Address &= 0xffffffff;\r
440 }\r
441 }\r
442 //\r
443 // Find the EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL of the specified segment number\r
444 //\r
445 for (Index = 0; Index < BufferSize; Index++) {\r
446 Status = gBS->HandleProtocol (\r
447 HandleBuffer[Index],\r
448 &gEfiPciRootBridgeIoProtocolGuid,\r
449 (VOID *) &IoDev\r
450 );\r
451 if (EFI_ERROR (Status)) {\r
452 continue;\r
453 }\r
454 if (IoDev->SegmentNumber != SegmentNumber) {\r
455 IoDev = NULL;\r
456 }\r
457 }\r
458 if (IoDev == NULL) {\r
4092a8f6 459 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_SEGMENT_NOT_FOUND), gShellDebug1HiiHandle, L"mm", SegmentNumber); \r
5d73d92f 460 ShellStatus = SHELL_INVALID_PARAMETER;\r
461 goto Done;\r
462 }\r
463 }\r
464\r
465 if (AccessType == EfiIo && Address + Size > 0x10000) {\r
4092a8f6 466 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_ADDRESS_RANGE), gShellDebug1HiiHandle, L"mm"); \r
5d73d92f 467 ShellStatus = SHELL_INVALID_PARAMETER;\r
468 goto Done;\r
469 }\r
470\r
471 if (AccessType == EfiPciEConfig) {\r
472 GetPciEAddressFromInputAddress (Address, &PciEAddress);\r
473 }\r
474\r
a0cd353d 475 //\r
476 // Set value\r
477 //\r
478 if (ShellCommandLineGetRawValue(Package, 2) != NULL) {\r
479 if (AccessType == EFIMemoryMappedIo) {\r
480 IoDev->Mem.Write (IoDev, Width, Address, 1, &Value);\r
481 } else if (AccessType == EfiIo) {\r
482 IoDev->Io.Write (IoDev, Width, Address, 1, &Value);\r
483 } else if (AccessType == EfiPciConfig) {\r
484 IoDev->Pci.Write (IoDev, Width, Address, 1, &Value);\r
485 } else if (AccessType == EfiPciEConfig) {\r
486 IoDev->Pci.Write (IoDev, Width, PciEAddress, 1, &Value);\r
487 } else {\r
488 WriteMem (Width, Address, 1, &Value);\r
489 }\r
490\r
491 ASSERT(ShellStatus == SHELL_SUCCESS);\r
492 goto Done;\r
493 }\r
5d73d92f 494\r
495\r
496 //\r
497 // non-interactive mode\r
498 //\r
499 if (!Interactive) {\r
500 Buffer = 0;\r
501 if (AccessType == EFIMemoryMappedIo) {\r
f79868cd
JC
502 if (!gEfiShellProtocol->BatchIsActive()) {\r
503 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_MMIO), gShellDebug1HiiHandle);\r
504 }\r
5d73d92f 505 IoDev->Mem.Read (IoDev, Width, Address, 1, &Buffer);\r
506 } else if (AccessType == EfiIo) {\r
f79868cd
JC
507 if (!gEfiShellProtocol->BatchIsActive()) {\r
508 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_IO), gShellDebug1HiiHandle);\r
509 }\r
5d73d92f 510 IoDev->Io.Read (IoDev, Width, Address, 1, &Buffer);\r
511 } else if (AccessType == EfiPciConfig) {\r
f79868cd
JC
512 if (!gEfiShellProtocol->BatchIsActive()) {\r
513 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_PCI), gShellDebug1HiiHandle);\r
514 }\r
5d73d92f 515 IoDev->Pci.Read (IoDev, Width, Address, 1, &Buffer);\r
516 } else if (AccessType == EfiPciEConfig) {\r
f79868cd
JC
517 if (!gEfiShellProtocol->BatchIsActive()) {\r
518 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_PCIE), gShellDebug1HiiHandle);\r
519 }\r
5d73d92f 520 IoDev->Pci.Read (IoDev, Width, PciEAddress, 1, &Buffer);\r
521 } else {\r
f79868cd
JC
522 if (!gEfiShellProtocol->BatchIsActive()) {\r
523 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_MEM), gShellDebug1HiiHandle);\r
524 }\r
5d73d92f 525 ReadMem (Width, Address, 1, &Buffer);\r
526 }\r
f79868cd
JC
527 if (!gEfiShellProtocol->BatchIsActive()) {\r
528 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_ADDRESS), gShellDebug1HiiHandle, Address);\r
529 }\r
5d73d92f 530 if (Size == 1) {\r
a7e57bd9 531 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_BUF2), gShellDebug1HiiHandle, (UINTN)Buffer);\r
5d73d92f 532 } else if (Size == 2) {\r
a7e57bd9 533 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_BUF4), gShellDebug1HiiHandle, (UINTN)Buffer);\r
5d73d92f 534 } else if (Size == 4) {\r
a7e57bd9 535 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_BUF8), gShellDebug1HiiHandle, (UINTN)Buffer);\r
5d73d92f 536 } else if (Size == 8) {\r
537 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_BUF16), gShellDebug1HiiHandle, Buffer);\r
538 }\r
539\r
540 ShellPrintEx(-1, -1, L"\r\n");\r
541\r
542 ASSERT(ShellStatus == SHELL_SUCCESS);\r
543 goto Done;\r
544 }\r
545 //\r
546 // interactive mode\r
547 //\r
548 Complete = FALSE;\r
549 do {\r
550 if (AccessType == EfiIo && Address + Size > 0x10000) {\r
4092a8f6 551 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_ADDRESS_RANGE2), gShellDebug1HiiHandle, L"mm"); \r
5d73d92f 552 break;\r
553 }\r
554\r
555 Buffer = 0;\r
556 if (AccessType == EFIMemoryMappedIo) {\r
557 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_MMIO), gShellDebug1HiiHandle);\r
5d73d92f 558 IoDev->Mem.Read (IoDev, Width, Address, 1, &Buffer);\r
559 } else if (AccessType == EfiIo) {\r
560 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_IO), gShellDebug1HiiHandle);\r
5d73d92f 561 IoDev->Io.Read (IoDev, Width, Address, 1, &Buffer);\r
562 } else if (AccessType == EfiPciConfig) {\r
563 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_PCI), gShellDebug1HiiHandle);\r
5d73d92f 564 IoDev->Pci.Read (IoDev, Width, Address, 1, &Buffer);\r
565 } else if (AccessType == EfiPciEConfig) {\r
566 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_PCIE), gShellDebug1HiiHandle);\r
5d73d92f 567 IoDev->Pci.Read (IoDev, Width, PciEAddress, 1, &Buffer);\r
568 } else {\r
569 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_MEM), gShellDebug1HiiHandle);\r
5d73d92f 570 ReadMem (Width, Address, 1, &Buffer);\r
571 }\r
572\r
573 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_ADDRESS), gShellDebug1HiiHandle, Address);\r
5d73d92f 574\r
575 if (Size == 1) {\r
a7e57bd9 576 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_BUF2), gShellDebug1HiiHandle, (UINTN)Buffer);\r
5d73d92f 577 } else if (Size == 2) {\r
a7e57bd9 578 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_BUF4), gShellDebug1HiiHandle, (UINTN)Buffer);\r
5d73d92f 579 } else if (Size == 4) {\r
a7e57bd9 580 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_BUF8), gShellDebug1HiiHandle, (UINTN)Buffer);\r
5d73d92f 581 } else if (Size == 8) {\r
582 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_BUF16), gShellDebug1HiiHandle, Buffer);\r
5d73d92f 583 }\r
3737ac2b 584 ShellPrintEx(-1, -1, L" > ");\r
5d73d92f 585 //\r
586 // wait user input to modify\r
587 //\r
588 if (InputStr != NULL) {\r
589 FreePool(InputStr);\r
3737ac2b 590 InputStr = NULL;\r
5d73d92f 591 }\r
592 ShellPromptForResponse(ShellPromptResponseTypeFreeform, NULL, (VOID**)&InputStr);\r
593\r
594 //\r
595 // skip space characters\r
596 //\r
3737ac2b 597 for (Index = 0; InputStr != NULL && InputStr[Index] == ' '; Index++);\r
5d73d92f 598\r
599 //\r
600 // parse input string\r
601 //\r
3737ac2b 602 if (InputStr != NULL && (InputStr[Index] == '.' || InputStr[Index] == 'q' || InputStr[Index] == 'Q')) {\r
5d73d92f 603 Complete = TRUE;\r
3737ac2b 604 } else if (InputStr == NULL || InputStr[Index] == CHAR_NULL) {\r
5d73d92f 605 //\r
606 // Continue to next address\r
607 //\r
608 } else if (GetHex (InputStr + Index, &Buffer) && Buffer <= MaxNum[Width]) {\r
609 if (AccessType == EFIMemoryMappedIo) {\r
610 IoDev->Mem.Write (IoDev, Width, Address, 1, &Buffer);\r
611 } else if (AccessType == EfiIo) {\r
612 IoDev->Io.Write (IoDev, Width, Address, 1, &Buffer);\r
613 } else if (AccessType == EfiPciConfig) {\r
614 IoDev->Pci.Write (IoDev, Width, Address, 1, &Buffer);\r
615 } else if (AccessType == EfiPciEConfig) {\r
616 IoDev->Pci.Write (IoDev, Width, PciEAddress, 1, &Buffer);\r
617 } else {\r
618 WriteMem (Width, Address, 1, &Buffer);\r
619 }\r
620 } else {\r
4092a8f6 621 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_ERROR), gShellDebug1HiiHandle, L"mm"); \r
5d73d92f 622 continue;\r
3737ac2b 623 // PrintToken (STRING_TOKEN (STR_IOMOD_ERROR), HiiHandle);\r
5d73d92f 624 }\r
625\r
626 Address += Size;\r
627 if (AccessType == EfiPciEConfig) {\r
628 GetPciEAddressFromInputAddress (Address, &PciEAddress);\r
629 }\r
630 ShellPrintEx(-1, -1, L"\r\n");\r
631 // Print (L"\n");\r
632 } while (!Complete);\r
633 }\r
634 ASSERT(ShellStatus == SHELL_SUCCESS);\r
635Done:\r
636\r
637 if (InputStr != NULL) {\r
638 FreePool(InputStr);\r
639 }\r
640 if (HandleBuffer != NULL) {\r
641 FreePool (HandleBuffer);\r
642 }\r
643 if (Package != NULL) {\r
644 ShellCommandLineFreeVarList (Package);\r
645 }\r
646 return ShellStatus;\r
647}\r