You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
133 lines
3.7 KiB
133 lines
3.7 KiB
/*++
|
|
|
|
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;
|
|
}
|
|
|
|
|