/*++ 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; } }