windows-nt/Source/XPSP1/NT/base/efiutil/sdk/shell/mem/mem.c
2020-09-26 16:20:57 +08:00

134 lines
3.6 KiB
C

/*++
Copyright (c) 1999 Intel Corporation
Module Name:
io.c
Abstract:
Revision History
--*/
#include "shelle.h"
EFI_STATUS
DumpMem (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
);
EFI_DRIVER_ENTRY_POINT(DumpMem)
EFI_STATUS
DumpMem (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
/*+++
mem [Address] [Size] ;MMIO
if no Address default address is EFI System Table
if no size default size is 512;
if ;MMIO then use memory mapped IO and not system memory
--*/
{
EFI_STATUS Status;
EFI_HANDLE Handle;
EFI_DEVICE_PATH *DevicePath;
EFI_DEVICE_IO_INTERFACE *IoDev;
UINT64 Address;
UINTN Size;
UINT8 *Buffer;
BOOLEAN MMIo;
UINTN Index;
CHAR16 *AddressStr, *SizeStr, *p;
InstallInternalShellCommand (
ImageHandle, SystemTable, DumpMem,
L"mem", /* command */
L"mem [Address] [size] [;MMIO]", /* command syntax */
L"Dump Memory or Memory Mapped IO", /* 1 line descriptor */
NULL /* command help page */
);
/*
* The End Device Path represents the Root of the tree, thus get the global IoDev
* for the system
*/
InitializeShellApplication (ImageHandle, SystemTable);
MMIo = FALSE;
AddressStr = SizeStr = NULL;
for (Index = 1; Index < SI->Argc; Index += 1) {
p = SI->Argv[Index];
if (*p == ';') {
/* Shortcut! assume MMIo if ; exists */
MMIo = TRUE;
continue;
} else if (*p == '-') {
switch (p[1]) {
case 'h':
case 'H':
case '?':
default:
Print (L"\n%Hmem%N [%HAddress%N] [%HSize%N] [%H;MMIO%N]\n");
Print (L" if no %HAddress%N is specified the EFI System Table is used\n");
Print (L" if no %HSize%N is specified 512 bytes is used\n");
Print (L" if %H;MMIO%N is specified memory is referenced with the DeviceIo Protocol\n");
return EFI_SUCCESS;
};
continue;
}
if (!AddressStr) {
AddressStr = p;
continue;
}
if (!SizeStr) {
SizeStr = p;
continue;
}
}
Address = (AddressStr) ? xtoi(AddressStr) : (UINT64)SystemTable;
Size = (SizeStr) ? xtoi(SizeStr) : 512;
Print (L" Memory Address %016lx %0x Bytes\n", Address, Size);
if (MMIo) {
DevicePath = EndDevicePath;
Status = BS->LocateDevicePath (&DeviceIoProtocol, &DevicePath, &Handle);
if (!EFI_ERROR(Status)) {
Status = BS->HandleProtocol (Handle, &DeviceIoProtocol, (VOID*)&IoDev);
}
if (EFI_ERROR(Status)) {
Print (L"%E - handle protocol error %r%N", Status);
return Status;
}
Buffer = AllocatePool (Size);
if (Buffer == NULL) {
return EFI_OUT_OF_RESOURCES;
}
IoDev->Mem.Read (IoDev, IO_UINT8, Address, Size, Buffer);
} else {
Buffer = (UINT8 *)Address;
}
DumpHex (2, (UINTN)Address, Size, Buffer);
EFIStructsPrint (Buffer, Size, Address, NULL);
if (MMIo) {
FreePool (Buffer);
}
return EFI_SUCCESS;
}