208 lines
5.2 KiB
C
208 lines
5.2 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1998 Intel Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
memmap.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Shell app "memmap"
|
||
|
|
||
|
|
||
|
|
||
|
Revision History
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "shell.h"
|
||
|
|
||
|
|
||
|
/*
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
EFI_STATUS
|
||
|
InitializeMemmap (
|
||
|
IN EFI_HANDLE ImageHandle,
|
||
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||
|
);
|
||
|
|
||
|
BOOLEAN
|
||
|
IsRealMemory (
|
||
|
IN EFI_MEMORY_TYPE Type
|
||
|
);
|
||
|
/*
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
EFI_DRIVER_ENTRY_POINT(InitializeMemmap)
|
||
|
|
||
|
EFI_STATUS
|
||
|
InitializeMemmap (
|
||
|
IN EFI_HANDLE ImageHandle,
|
||
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||
|
)
|
||
|
{
|
||
|
CHAR16 *p;
|
||
|
UINTN Index;
|
||
|
BOOLEAN PageBreaks;
|
||
|
UINTN TempColumn;
|
||
|
UINTN ScreenCount;
|
||
|
UINTN ScreenSize;
|
||
|
CHAR16 ReturnStr[1];
|
||
|
EFI_MEMORY_DESCRIPTOR *Desc, *MemMap;
|
||
|
UINTN DescriptorSize;
|
||
|
UINT32 DescriptorVersion;
|
||
|
UINTN NoDesc, MapKey;
|
||
|
UINT64 Bytes;
|
||
|
UINT64 NoPages[EfiMaxMemoryType];
|
||
|
UINT64 TotalMemory;
|
||
|
|
||
|
/*
|
||
|
* Check to see if the app is to install as a "internal command"
|
||
|
* to the shell
|
||
|
*/
|
||
|
|
||
|
InstallInternalShellCommand (
|
||
|
ImageHandle, SystemTable, InitializeMemmap,
|
||
|
L"memmap", /* command */
|
||
|
L"memmap [-b]", /* command syntax */
|
||
|
L"Dumps memory map", /* 1 line descriptor */
|
||
|
NULL /* command help page */
|
||
|
);
|
||
|
|
||
|
/*
|
||
|
* We are no being installed as an internal command driver, initialize
|
||
|
* as an nshell app and run
|
||
|
*/
|
||
|
|
||
|
InitializeShellApplication (ImageHandle, SystemTable);
|
||
|
|
||
|
PageBreaks = FALSE;
|
||
|
for (Index = 1; Index < SI->Argc; Index += 1) {
|
||
|
p = SI->Argv[Index];
|
||
|
if (*p == '-') {
|
||
|
switch (p[1]) {
|
||
|
case 'b' :
|
||
|
case 'B' :
|
||
|
PageBreaks = TRUE;
|
||
|
ST->ConOut->QueryMode (ST->ConOut, ST->ConOut->Mode->Mode, &TempColumn, &ScreenSize);
|
||
|
ScreenCount = 0;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
Print (L"%EDH: Unkown flag %s\n", p);
|
||
|
return EFI_INVALID_PARAMETER;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
MemMap = LibMemoryMap (&NoDesc, &MapKey, &DescriptorSize, &DescriptorVersion);
|
||
|
if (!MemMap) {
|
||
|
Print (L"Memory map was not returned\n");
|
||
|
}
|
||
|
|
||
|
ASSERT (DescriptorVersion == EFI_MEMORY_DESCRIPTOR_VERSION);
|
||
|
for (Index=0; Index < EfiMaxMemoryType; Index += 1) {
|
||
|
NoPages[Index] = 0;
|
||
|
}
|
||
|
|
||
|
Desc = MemMap;
|
||
|
Print(L"\n%HType Start End # Pages Attributes%N\n");
|
||
|
for (Index=0; Index < NoDesc; Index += 1) {
|
||
|
Bytes = LShiftU64(Desc->NumberOfPages, 12);
|
||
|
p = MemoryTypeStr(Desc->Type);
|
||
|
Print(L"%s %lX-%lX %lX %lX\n", p, Desc->PhysicalStart, Desc->PhysicalStart + Bytes - 1, Desc->NumberOfPages, Desc->Attribute);
|
||
|
|
||
|
if (PageBreaks) {
|
||
|
ScreenCount++;
|
||
|
if (ScreenCount > ScreenSize - 4) {
|
||
|
ScreenCount = 0;
|
||
|
Print (L"\nPress Return to contiue :");
|
||
|
Input (L"", ReturnStr, sizeof(ReturnStr)/sizeof(CHAR16));
|
||
|
Print (L"\n\n");
|
||
|
}
|
||
|
}
|
||
|
NoPages[Desc->Type] += Desc->NumberOfPages;
|
||
|
Desc = NextMemoryDescriptor(Desc, DescriptorSize);
|
||
|
}
|
||
|
|
||
|
Print(L"\n");
|
||
|
|
||
|
if (PageBreaks) {
|
||
|
ScreenCount++;
|
||
|
if (ScreenCount > ScreenSize - 4) {
|
||
|
ScreenCount = 0;
|
||
|
Print (L"\nPress Return to contiue :");
|
||
|
Input (L"", ReturnStr, sizeof(ReturnStr)/sizeof(CHAR16));
|
||
|
Print (L"\n\n");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for (Index=0, TotalMemory = 0; Index < EfiMaxMemoryType; Index += 1) {
|
||
|
if (NoPages[Index]) {
|
||
|
Print(L" %s: %,7ld Pages (%,ld)\n",
|
||
|
MemoryTypeStr((EFI_MEMORY_TYPE)Index),
|
||
|
NoPages[Index],
|
||
|
LShiftU64(NoPages[Index], 12)
|
||
|
);
|
||
|
|
||
|
if (PageBreaks) {
|
||
|
ScreenCount++;
|
||
|
if (ScreenCount > ScreenSize - 4) {
|
||
|
ScreenCount = 0;
|
||
|
Print (L"\nPress Return to contiue :");
|
||
|
Input (L"", ReturnStr, sizeof(ReturnStr)/sizeof(CHAR16));
|
||
|
Print (L"\n\n");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (IsRealMemory((EFI_MEMORY_TYPE)(Index))) {
|
||
|
TotalMemory += NoPages[Index];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Print(L"Total Memory: %,ld MB (%,ld) Bytes\n",
|
||
|
RShiftU64(TotalMemory, 8),
|
||
|
LShiftU64(TotalMemory, 12)
|
||
|
);
|
||
|
|
||
|
FreePool(MemMap);
|
||
|
|
||
|
return EFI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
BOOLEAN
|
||
|
IsRealMemory (
|
||
|
IN EFI_MEMORY_TYPE Type
|
||
|
)
|
||
|
{
|
||
|
switch (Type) {
|
||
|
case EfiLoaderCode:
|
||
|
case EfiLoaderData:
|
||
|
case EfiBootServicesCode:
|
||
|
case EfiBootServicesData:
|
||
|
case EfiRuntimeServicesCode:
|
||
|
case EfiRuntimeServicesData:
|
||
|
case EfiConventionalMemory:
|
||
|
case EfiACPIReclaimMemory:
|
||
|
case EfiACPIMemoryNVS:
|
||
|
case EfiPalCode:
|
||
|
/*
|
||
|
* BugBug can EfiPalCode point to ROM?
|
||
|
*/
|
||
|
return TRUE;
|
||
|
break;
|
||
|
default:
|
||
|
return FALSE;
|
||
|
break;
|
||
|
}
|
||
|
}
|