134 lines
3.6 KiB
C
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;
|
||
|
}
|
||
|
|
||
|
|