]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDebug1CommandsLib/Mm.c
Add "Debug1" profile (all but Edit and HexEdit commands)
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / Mm.c
CommitLineData
5d73d92f 1/** @file\r
2 Main file for Mm 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 <Library/ShellLib.h>\r
17#include <Protocol/PciRootBridgeIo.h>\r
18#include <Protocol/DeviceIo.h>\r
19\r
20typedef enum {\r
21 EfiMemory,\r
22 EFIMemoryMappedIo,\r
23 EfiIo,\r
24 EfiPciConfig,\r
25 EfiPciEConfig\r
26} EFI_ACCESS_TYPE;\r
27\r
28EFI_STATUS\r
29EFIAPI\r
30DumpIoModify (\r
31 IN EFI_HANDLE ImageHandle,\r
32 IN EFI_SYSTEM_TABLE *SystemTable\r
33 );\r
34\r
35VOID\r
36EFIAPI\r
37ReadMem (\r
38 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width,\r
39 IN UINT64 Address,\r
40 IN UINTN Size,\r
41 IN VOID *Buffer\r
42 );\r
43\r
44VOID\r
45EFIAPI\r
46WriteMem (\r
47 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width,\r
48 IN UINT64 Address,\r
49 IN UINTN Size,\r
50 IN VOID *Buffer\r
51 );\r
52\r
53BOOLEAN\r
54EFIAPI\r
55GetHex (\r
56 IN UINT16 *str,\r
57 OUT UINT64 *data\r
58 );\r
59\r
60STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
61 {L"-mmio", TypeFlag},\r
62 {L"-mem", TypeFlag},\r
63 {L"-io", TypeFlag},\r
64 {L"-pci", TypeFlag},\r
65 {L"-pcie", TypeFlag},\r
66 {L"-n", TypeFlag},\r
67 {L"-w", TypeValue},\r
68 {NULL, TypeMax}\r
69 };\r
70\r
71STATIC CONST UINT64 MaxNum[9] = { 0xff, 0xffff, 0xffffffff, 0xffffffffffffffff };\r
72\r
73/**\r
74 Get the PCI-E Address from a PCI address format 0x0000ssbbddffrrr\r
75 where ss is SEGMENT, bb is BUS, dd is DEVICE, ff is FUNCTION\r
76 and rrr is REGISTER (extension format for PCI-E).\r
77\r
78 @param[in] InputAddress PCI address format on input.\r
79 @param[out]PciEAddress PCI-E address extention format.\r
80**/\r
81VOID\r
82EFIAPI\r
83GetPciEAddressFromInputAddress (\r
84 IN UINT64 InputAddress,\r
85 OUT UINT64 *PciEAddress\r
86 )\r
87{\r
88 *PciEAddress = RShiftU64(InputAddress & ~(UINT64) 0xFFF, 4);\r
89 *PciEAddress += LShiftU64((UINT16) InputAddress & 0x0FFF, 32);\r
90}\r
91\r
92/**\r
93 Function for 'mm' command.\r
94\r
95 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
96 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
97**/\r
98SHELL_STATUS\r
99EFIAPI\r
100ShellCommandRunMm (\r
101 IN EFI_HANDLE ImageHandle,\r
102 IN EFI_SYSTEM_TABLE *SystemTable\r
103 )\r
104{\r
105 EFI_STATUS Status;\r
106 EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *IoDev;\r
107 UINT64 Address;\r
108 UINT64 PciEAddress;\r
109 UINT64 Value;\r
110 UINT32 SegmentNumber;\r
111 EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width;\r
112 EFI_ACCESS_TYPE AccessType;\r
113 UINT64 Buffer;\r
114 UINTN Index;\r
115 UINTN Size;\r
116 CHAR16 *AddressStr;\r
117// CHAR16 *ValueStr;\r
118 BOOLEAN Complete;\r
119 CHAR16 *InputStr;\r
120 BOOLEAN Interactive;\r
121 EFI_HANDLE *HandleBuffer;\r
122 UINTN BufferSize;\r
123 UINTN ItemValue;\r
124 LIST_ENTRY *Package;\r
125 CHAR16 *ProblemParam;\r
126 SHELL_STATUS ShellStatus;\r
127 CONST CHAR16 *Temp;\r
128\r
129 Address = 0;\r
130 PciEAddress = 0;\r
131 IoDev = NULL;\r
132 HandleBuffer = NULL;\r
133 BufferSize = 0;\r
134 SegmentNumber = 0;\r
135 ShellStatus = SHELL_SUCCESS;\r
136 InputStr = NULL;\r
137\r
138 //\r
139 // Parse arguments\r
140 //\r
141 Width = EfiPciWidthUint8;\r
142 Size = 1;\r
143 AccessType = EfiMemory;\r
144 AddressStr = NULL;\r
145// ValueStr = NULL;\r
146 Interactive = TRUE;\r
147 Package = NULL;\r
148\r
149 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
150 if (EFI_ERROR(Status)) {\r
151 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
152 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, ProblemParam);\r
153 FreePool(ProblemParam);\r
154 ShellStatus = SHELL_INVALID_PARAMETER;\r
155 goto Done;\r
156 } else {\r
157 ASSERT(FALSE);\r
158 }\r
159 } else {\r
160 if (ShellCommandLineGetCount(Package) < 1) {\r
161 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle);\r
162 ShellStatus = SHELL_INVALID_PARAMETER;\r
163 goto Done;\r
164 } else if (ShellCommandLineGetCount(Package) > 3) {\r
165 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle);\r
166 ShellStatus = SHELL_INVALID_PARAMETER;\r
167 goto Done;\r
168 } else {\r
169 if (ShellCommandLineGetFlag(Package, L"-mmio")) {\r
170 AccessType = EFIMemoryMappedIo;\r
171 } else if (ShellCommandLineGetFlag(Package, L"-mem")) {\r
172 AccessType = EfiMemory;\r
173 } else if (ShellCommandLineGetFlag(Package, L"-io")) {\r
174 AccessType = EfiIo;\r
175 } else if (ShellCommandLineGetFlag(Package, L"-pci")) {\r
176 AccessType = EfiPciConfig;\r
177 } else if (ShellCommandLineGetFlag(Package, L"-pcie")) {\r
178 AccessType = EfiPciEConfig;\r
179 }\r
180 }\r
181\r
182 if (ShellCommandLineGetFlag (Package, L"-n")) {\r
183 Interactive = FALSE;\r
184 }\r
185\r
186 Temp = ShellCommandLineGetValue(Package, L"-w");\r
187 if (Temp != NULL) {\r
188 ItemValue = StrDecimalToUintn (Temp);\r
189\r
190 switch (ItemValue) {\r
191 case 1:\r
192 Width = EfiPciWidthUint8;\r
193 Size = 1;\r
194 break;\r
195\r
196 case 2:\r
197 Width = EfiPciWidthUint16;\r
198 Size = 2;\r
199 break;\r
200\r
201 case 4:\r
202 Width = EfiPciWidthUint32;\r
203 Size = 4;\r
204 break;\r
205\r
206 case 8:\r
207 Width = EfiPciWidthUint64;\r
208 Size = 8;\r
209 break;\r
210\r
211 default:\r
212 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"-w");\r
213 ShellStatus = SHELL_INVALID_PARAMETER;\r
214 goto Done;\r
215 }\r
216 }\r
217\r
218 Temp = ShellCommandLineGetRawValue(Package, 1);\r
219 if (Temp != NULL) {\r
220 Address = StrHexToUint64(Temp);\r
221 }\r
222\r
223 Temp = ShellCommandLineGetRawValue(Package, 2);\r
224 if (Temp != NULL) {\r
225 Value = StrHexToUint64(Temp);\r
226 switch (Size) {\r
227 case 1:\r
228 if (Value > 0xFF) {\r
229 ShellStatus = SHELL_INVALID_PARAMETER;\r
230 }\r
231 break;\r
232\r
233 case 2:\r
234 if (Value > 0xFFFF) {\r
235 ShellStatus = SHELL_INVALID_PARAMETER;\r
236 }\r
237 break;\r
238\r
239 case 4:\r
240 if (Value > 0xFFFFFFFF) {\r
241 ShellStatus = SHELL_INVALID_PARAMETER;\r
242 }\r
243 break;\r
244\r
245 default:\r
246 break;\r
247 }\r
248\r
249 if (ShellStatus != SHELL_SUCCESS) {\r
250 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, Temp);\r
251 ShellStatus = SHELL_INVALID_PARAMETER;\r
252 goto Done;\r
253 }\r
254 }\r
255\r
256 if ((Address & (Size - 1)) != 0) {\r
257 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_NOT_ALIGNED), gShellDebug1HiiHandle, Address);\r
258 ShellStatus = SHELL_INVALID_PARAMETER;\r
259 goto Done;\r
260 }\r
261 //\r
262 // locate DeviceIO protocol interface\r
263 //\r
264 if (AccessType != EfiMemory) {\r
265 Status = gBS->LocateHandleBuffer (\r
266 ByProtocol,\r
267 &gEfiPciRootBridgeIoProtocolGuid,\r
268 NULL,\r
269 &BufferSize,\r
270 &HandleBuffer\r
271 );\r
272 if (EFI_ERROR (Status)) {\r
273 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PCIRBIO_NF), gShellDebug1HiiHandle);\r
274 ShellStatus = SHELL_NOT_FOUND;\r
275 goto Done;\r
276 }\r
277 //\r
278 // In the case of PCI or PCIE\r
279 // Get segment number and mask the segment bits in Address\r
280 //\r
281 if (AccessType == EfiPciEConfig) {\r
282 SegmentNumber = (UINT32) RShiftU64 (Address, 36) & 0xff;\r
283 Address &= 0xfffffffff;\r
284 } else {\r
285 if (AccessType == EfiPciConfig) {\r
286 SegmentNumber = (UINT32) RShiftU64 (Address, 32) & 0xff;\r
287 Address &= 0xffffffff;\r
288 }\r
289 }\r
290 //\r
291 // Find the EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL of the specified segment number\r
292 //\r
293 for (Index = 0; Index < BufferSize; Index++) {\r
294 Status = gBS->HandleProtocol (\r
295 HandleBuffer[Index],\r
296 &gEfiPciRootBridgeIoProtocolGuid,\r
297 (VOID *) &IoDev\r
298 );\r
299 if (EFI_ERROR (Status)) {\r
300 continue;\r
301 }\r
302 if (IoDev->SegmentNumber != SegmentNumber) {\r
303 IoDev = NULL;\r
304 }\r
305 }\r
306 if (IoDev == NULL) {\r
307 // TODO add token\r
308 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_SEGMENT_NOT_FOUND), gShellDebug1HiiHandle, SegmentNumber);\r
309 ShellStatus = SHELL_INVALID_PARAMETER;\r
310 goto Done;\r
311 }\r
312 }\r
313\r
314 if (AccessType == EfiIo && Address + Size > 0x10000) {\r
315 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_ADDRESS_RANGE), gShellDebug1HiiHandle);\r
316 ShellStatus = SHELL_INVALID_PARAMETER;\r
317 goto Done;\r
318 }\r
319\r
320 if (AccessType == EfiPciEConfig) {\r
321 GetPciEAddressFromInputAddress (Address, &PciEAddress);\r
322 }\r
323\r
324// //\r
325// // Set value\r
326// //\r
327// if (ValueStr != NULL) {\r
328// if (AccessType == EFIMemoryMappedIo) {\r
329// IoDev->Mem.Write (IoDev, Width, Address, 1, &Value);\r
330// } else if (AccessType == EfiIo) {\r
331// IoDev->Io.Write (IoDev, Width, Address, 1, &Value);\r
332// } else if (AccessType == EfiPciConfig) {\r
333// IoDev->Pci.Write (IoDev, Width, Address, 1, &Value);\r
334// } else if (AccessType == EfiPciEConfig) {\r
335// IoDev->Pci.Write (IoDev, Width, PciEAddress, 1, &Buffer);\r
336// } else {\r
337// WriteMem (Width, Address, 1, &Value);\r
338// }\r
339//\r
340// ASSERT(ShellStatus == SHELL_SUCCESS);\r
341// goto Done;\r
342// }\r
343\r
344\r
345 //\r
346 // non-interactive mode\r
347 //\r
348 if (!Interactive) {\r
349 Buffer = 0;\r
350 if (AccessType == EFIMemoryMappedIo) {\r
351 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_MMIO), gShellDebug1HiiHandle);\r
352 IoDev->Mem.Read (IoDev, Width, Address, 1, &Buffer);\r
353 } else if (AccessType == EfiIo) {\r
354 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_IO), gShellDebug1HiiHandle);\r
355 IoDev->Io.Read (IoDev, Width, Address, 1, &Buffer);\r
356 } else if (AccessType == EfiPciConfig) {\r
357 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_PCI), gShellDebug1HiiHandle);\r
358 IoDev->Pci.Read (IoDev, Width, Address, 1, &Buffer);\r
359 } else if (AccessType == EfiPciEConfig) {\r
360 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_PCIE), gShellDebug1HiiHandle);\r
361 IoDev->Pci.Read (IoDev, Width, PciEAddress, 1, &Buffer);\r
362 } else {\r
363 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_MEM), gShellDebug1HiiHandle);\r
364 ReadMem (Width, Address, 1, &Buffer);\r
365 }\r
366\r
367 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_ADDRESS), gShellDebug1HiiHandle, Address);\r
368 if (Size == 1) {\r
369 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_BUF2), gShellDebug1HiiHandle, Buffer);\r
370 } else if (Size == 2) {\r
371 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_BUF4), gShellDebug1HiiHandle, Buffer);\r
372 } else if (Size == 4) {\r
373 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_BUF8), gShellDebug1HiiHandle, Buffer);\r
374 } else if (Size == 8) {\r
375 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_BUF16), gShellDebug1HiiHandle, Buffer);\r
376 }\r
377\r
378 ShellPrintEx(-1, -1, L"\r\n");\r
379\r
380 ASSERT(ShellStatus == SHELL_SUCCESS);\r
381 goto Done;\r
382 }\r
383 //\r
384 // interactive mode\r
385 //\r
386 Complete = FALSE;\r
387 do {\r
388 if (AccessType == EfiIo && Address + Size > 0x10000) {\r
389 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_ADDRESS_RANGE2), gShellDebug1HiiHandle);\r
390 // PrintToken (STRING_TOKEN (STR_IOMOD_IO_ADDRESS_2), HiiHandle, L"mm");\r
391 break;\r
392 }\r
393\r
394 Buffer = 0;\r
395 if (AccessType == EFIMemoryMappedIo) {\r
396 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_MMIO), gShellDebug1HiiHandle);\r
397 // PrintToken (STRING_TOKEN (STR_IOMOD_HMMIO), HiiHandle);\r
398 IoDev->Mem.Read (IoDev, Width, Address, 1, &Buffer);\r
399 } else if (AccessType == EfiIo) {\r
400 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_IO), gShellDebug1HiiHandle);\r
401 // PrintToken (STRING_TOKEN (STR_IOMOD_HIO), HiiHandle);\r
402 IoDev->Io.Read (IoDev, Width, Address, 1, &Buffer);\r
403 } else if (AccessType == EfiPciConfig) {\r
404 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_PCI), gShellDebug1HiiHandle);\r
405 // PrintToken (STRING_TOKEN (STR_IOMOD_HPCI), HiiHandle);\r
406 IoDev->Pci.Read (IoDev, Width, Address, 1, &Buffer);\r
407 } else if (AccessType == EfiPciEConfig) {\r
408 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_PCIE), gShellDebug1HiiHandle);\r
409 // PrintToken (STRING_TOKEN (STR_IOMOD_HPCIE), HiiHandle);\r
410 IoDev->Pci.Read (IoDev, Width, PciEAddress, 1, &Buffer);\r
411 } else {\r
412 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_MEM), gShellDebug1HiiHandle);\r
413 // PrintToken (STRING_TOKEN (STR_IOMOD_HMEM), HiiHandle);\r
414 ReadMem (Width, Address, 1, &Buffer);\r
415 }\r
416\r
417 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_ADDRESS), gShellDebug1HiiHandle, Address);\r
418 // PrintToken (STRING_TOKEN (STR_IOMOD_ADDRESS), HiiHandle, Address);\r
419\r
420 if (Size == 1) {\r
421 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_BUF2), gShellDebug1HiiHandle, Buffer);\r
422 // PrintToken (STRING_TOKEN (STR_IOMOD_BUFFER_2), HiiHandle, Buffer);\r
423 } else if (Size == 2) {\r
424 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_BUF4), gShellDebug1HiiHandle, Buffer);\r
425 // PrintToken (STRING_TOKEN (STR_IOMOD_BUFFER_4), HiiHandle, Buffer);\r
426 } else if (Size == 4) {\r
427 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_BUF8), gShellDebug1HiiHandle, Buffer);\r
428 // PrintToken (STRING_TOKEN (STR_IOMOD_BUFFER_8), HiiHandle, Buffer);\r
429 } else if (Size == 8) {\r
430 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_BUF16), gShellDebug1HiiHandle, Buffer);\r
431 // PrintToken (STRING_TOKEN (STR_IOMOD_BUFFER_16), HiiHandle, Buffer);\r
432 }\r
433 //\r
434 // wait user input to modify\r
435 //\r
436 if (InputStr != NULL) {\r
437 FreePool(InputStr);\r
438 }\r
439 ShellPromptForResponse(ShellPromptResponseTypeFreeform, NULL, (VOID**)&InputStr);\r
440\r
441 //\r
442 // skip space characters\r
443 //\r
444 for (Index = 0; InputStr[Index] == ' '; Index++);\r
445\r
446 //\r
447 // parse input string\r
448 //\r
449 if (InputStr[Index] == '.' || InputStr[Index] == 'q' || InputStr[Index] == 'Q') {\r
450 Complete = TRUE;\r
451 } else if (InputStr[Index] == CHAR_NULL) {\r
452 //\r
453 // Continue to next address\r
454 //\r
455 } else if (GetHex (InputStr + Index, &Buffer) && Buffer <= MaxNum[Width]) {\r
456 if (AccessType == EFIMemoryMappedIo) {\r
457 IoDev->Mem.Write (IoDev, Width, Address, 1, &Buffer);\r
458 } else if (AccessType == EfiIo) {\r
459 IoDev->Io.Write (IoDev, Width, Address, 1, &Buffer);\r
460 } else if (AccessType == EfiPciConfig) {\r
461 IoDev->Pci.Write (IoDev, Width, Address, 1, &Buffer);\r
462 } else if (AccessType == EfiPciEConfig) {\r
463 IoDev->Pci.Write (IoDev, Width, PciEAddress, 1, &Buffer);\r
464 } else {\r
465 WriteMem (Width, Address, 1, &Buffer);\r
466 }\r
467 } else {\r
468 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_ERROR), gShellDebug1HiiHandle);\r
469 // PrintToken (STRING_TOKEN (STR_IOMOD_ERROR), HiiHandle);\r
470 continue;\r
471 }\r
472\r
473 Address += Size;\r
474 if (AccessType == EfiPciEConfig) {\r
475 GetPciEAddressFromInputAddress (Address, &PciEAddress);\r
476 }\r
477 ShellPrintEx(-1, -1, L"\r\n");\r
478 // Print (L"\n");\r
479 } while (!Complete);\r
480 }\r
481 ASSERT(ShellStatus == SHELL_SUCCESS);\r
482Done:\r
483\r
484 if (InputStr != NULL) {\r
485 FreePool(InputStr);\r
486 }\r
487 if (HandleBuffer != NULL) {\r
488 FreePool (HandleBuffer);\r
489 }\r
490 if (Package != NULL) {\r
491 ShellCommandLineFreeVarList (Package);\r
492 }\r
493 return ShellStatus;\r
494}\r
495\r
496\r
497VOID\r
498EFIAPI\r
499ReadMem (\r
500 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width,\r
501 IN UINT64 Address,\r
502 IN UINTN Size,\r
503 IN VOID *Buffer\r
504 )\r
505{\r
506 do {\r
507 if (Width == EfiPciWidthUint8) {\r
508 *(UINT8 *) Buffer = *(UINT8 *) (UINTN) Address;\r
509 Address -= 1;\r
510 } else if (Width == EfiPciWidthUint16) {\r
511 *(UINT16 *) Buffer = *(UINT16 *) (UINTN) Address;\r
512 Address -= 2;\r
513 } else if (Width == EfiPciWidthUint32) {\r
514 *(UINT32 *) Buffer = *(UINT32 *) (UINTN) Address;\r
515 Address -= 4;\r
516 } else if (Width == EfiPciWidthUint64) {\r
517 *(UINT64 *) Buffer = *(UINT64 *) (UINTN) Address;\r
518 Address -= 8;\r
519 } else {\r
520 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MM_READ_ERROR), gShellDebug1HiiHandle);\r
521// PrintToken (STRING_TOKEN (STR_IOMOD_READ_MEM_ERROR), HiiHandle);\r
522 break;\r
523 }\r
524 //\r
525 //\r
526 //\r
527 Size--;\r
528 } while (Size > 0);\r
529}\r
530\r
531VOID\r
532EFIAPI\r
533WriteMem (\r
534 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width,\r
535 IN UINT64 Address,\r
536 IN UINTN Size,\r
537 IN VOID *Buffer\r
538 )\r
539{\r
540 do {\r
541 if (Width == EfiPciWidthUint8) {\r
542 *(UINT8 *) (UINTN) Address = *(UINT8 *) Buffer;\r
543 Address += 1;\r
544 } else if (Width == EfiPciWidthUint16) {\r
545 *(UINT16 *) (UINTN) Address = *(UINT16 *) Buffer;\r
546 Address += 2;\r
547 } else if (Width == EfiPciWidthUint32) {\r
548 *(UINT32 *) (UINTN) Address = *(UINT32 *) Buffer;\r
549 Address += 4;\r
550 } else if (Width == EfiPciWidthUint64) {\r
551 *(UINT64 *) (UINTN) Address = *(UINT64 *) Buffer;\r
552 Address += 8;\r
553 } else {\r
554 ASSERT (FALSE);\r
555 }\r
556 //\r
557 //\r
558 //\r
559 Size--;\r
560 } while (Size > 0);\r
561}\r
562\r
563BOOLEAN\r
564EFIAPI\r
565GetHex (\r
566 IN UINT16 *str,\r
567 OUT UINT64 *data\r
568 )\r
569{\r
570 UINTN u;\r
571 CHAR16 c;\r
572 BOOLEAN Find;\r
573\r
574 Find = FALSE;\r
575 //\r
576 // convert hex digits\r
577 //\r
578 u = 0;\r
579 c = *(str++);\r
580 while (c != CHAR_NULL) {\r
581 if (c >= 'a' && c <= 'f') {\r
582 c -= 'a' - 'A';\r
583 }\r
584\r
585 if (c == ' ') {\r
586 break;\r
587 }\r
588\r
589 if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F')) {\r
590 u = u << 4 | c - (c >= 'A' ? 'A' - 10 : '0');\r
591\r
592 Find = TRUE;\r
593 } else {\r
594 return FALSE;\r
595 }\r
596\r
597 c = *(str++);\r
598 }\r
599\r
600 *data = u;\r
601 return Find;\r
602}\r