Hi,
So I created this generic program because I was seeing a leak in BS_Data
and wanted to ensure it wasn't StdLib and also wanted to ensure it wasn't
the shell (the same occurs if you just keep booting this file over and over
- using OVMF in VirtualBox because easier) and you'lll see a leak. About
every 5th time you'll see BS_Data increase.
Important Note: you'll have to bump up your PcdUefiLibMaxPrintBufferSize
from 320 to something larger (I used 2048).
------------------------------- INF ------------------------------------
## @file
#
##
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = testnative
FILE_GUID = f9ad1cbc-7cad-4b1c-9d01-4a980516d9fa
MODULE_TYPE = UEFI_APPLICATION
VERSION_STRING = 1.00
ENTRY_POINT = TestEntry
[Packages]
MdePkg/MdePkg.dec
[Sources]
testnative.c
[LibraryClasses]
UefiApplicationEntryPoint
UefiLib
[Protocols]
[Guids]
[BuildOptions]
----------------------------- CODE --------------------------------
// testnative.c - test memory leak
#include <Library/UefiLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/PrintLib.h>
#include <Library/DebugLib.h>
#include <Library/PcdLib.h>
STATIC CONST CHAR16 NameEfiReservedMemoryType[] = L"Reserved";
STATIC CONST CHAR16 NameEfiLoaderCode[] = L"LoaderCode";
STATIC CONST CHAR16 NameEfiLoaderData[] = L"LoaderData";
STATIC CONST CHAR16 NameEfiBootServicesCode[] = L"BS_Code";
STATIC CONST CHAR16 NameEfiBootServicesData[] = L"BS_Data";
STATIC CONST CHAR16 NameEfiRuntimeServicesCode[] = L"RT_Code";
STATIC CONST CHAR16 NameEfiRuntimeServicesData[] = L"RT_Data";
STATIC CONST CHAR16 NameEfiConventionalMemory[] = L"Available";
STATIC CONST CHAR16 NameEfiUnusableMemory[] = L"Unusable";
STATIC CONST CHAR16 NameEfiACPIReclaimMemory[] = L"ACPIRec";
STATIC CONST CHAR16 NameEfiACPIMemoryNVS[] = L"ACPI_NVS";
STATIC CONST CHAR16 NameEfiMemoryMappedIO[] = L"MMIO";
STATIC CONST CHAR16 NameEfiMemoryMappedIOPortSpace[] = L"MMIOPort";
STATIC CONST CHAR16 NameEfiPalCode[] = L"PalCode";
EFI_STATUS EFIAPI MemDump(BOOLEAN details)
{
EFI_STATUS Status;
UINTN Size;
EFI_MEMORY_DESCRIPTOR *Buffer;
UINTN MapKey;
UINTN ItemSize;
UINT32 Version;
UINT8 *Walker;
UINT64 ReservedPages;
UINT64 LoadCodePages;
UINT64 LoadDataPages;
UINT64 BSCodePages;
UINT64 BSDataPages;
UINT64 RTDataPages;
UINT64 RTCodePages;
UINT64 AvailPages;
UINT64 TotalPages;
UINT64 ReservedPagesSize;
UINT64 LoadCodePagesSize;
UINT64 LoadDataPagesSize;
UINT64 BSCodePagesSize;
UINT64 BSDataPagesSize;
UINT64 RTDataPagesSize;
UINT64 RTCodePagesSize;
UINT64 AvailPagesSize;
UINT64 TotalPagesSize;
UINT64 AcpiReclaimPages;
UINT64 AcpiNvsPages;
UINT64 MmioSpacePages;
UINT64 AcpiReclaimPagesSize;
UINT64 AcpiNvsPagesSize;
UINT64 MmioSpacePagesSize;
AcpiReclaimPages = 0;
AcpiNvsPages = 0;
MmioSpacePages = 0;
TotalPages = 0;
ReservedPages = 0;
LoadCodePages = 0;
LoadDataPages = 0;
BSCodePages = 0;
BSDataPages = 0;
RTDataPages = 0;
RTCodePages = 0;
AvailPages = 0;
Size = 0;
Buffer = NULL;
Status = EFI_SUCCESS;
Status = gBS->GetMemoryMap(&Size, Buffer, &MapKey, &ItemSize, &Version);
if (Status == EFI_BUFFER_TOO_SMALL){
Size += SIZE_1KB;
Buffer = AllocateZeroPool(Size);
Status = gBS->GetMemoryMap(&Size, Buffer, &MapKey, &ItemSize, &Version);
}
if (EFI_ERROR(Status)) {
Print(L"Failed to get memory map\r\n");
Status = EFI_ACCESS_DENIED;
} else {
ASSERT(Version == EFI_MEMORY_DESCRIPTOR_VERSION);
Print(L"Type Start End #pages
Attributes\r\n");
for (Walker = (UINT8*)Buffer; Walker < (((UINT8*)Buffer)+Size) &&
Walker != NULL; Walker += ItemSize){
switch (((EFI_MEMORY_DESCRIPTOR*)Walker)->Type) {
// replaced
((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)
with 0000
case EfiReservedMemoryType:
if (details) Print(L"% -9s %016LX-%016LX %016LX %016LX\r\n",
NameEfiReservedMemoryType, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart,
((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1,
((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages,
((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
ReservedPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
break;
case EfiLoaderCode:
if (details) Print(L"% -9s %016LX-%016LX %016LX %016LX\r\n",
NameEfiLoaderCode, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart,
((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1,
((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages,
((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
LoadCodePages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
break;
case EfiLoaderData:
if (details) Print(L"% -9s %016LX-%016LX %016LX
%016LX\r\n",NameEfiLoaderData,
((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart,
((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1,
((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages,
((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
LoadDataPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
break;
case EfiBootServicesCode:
if (details) Print(L"% -9s %016LX-%016LX %016LX
%016LX\r\n",NameEfiBootServicesCode,
((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart,
((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1,
((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages,
((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
BSCodePages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
break;
case EfiBootServicesData:
if (details) Print(L"% -9s %016LX-%016LX %016LX
%016LX\r\n",NameEfiBootServicesData,
((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart,
((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1,
((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages,
((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
BSDataPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
break;
case EfiRuntimeServicesCode:
if (details) Print(L"% -9s %016LX-%016LX %016LX
%016LX\r\n",NameEfiRuntimeServicesCode,
((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart,
((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1,
((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages,
((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
RTCodePages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
break;
case EfiRuntimeServicesData:
if (details) Print(L"% -9s %016LX-%016LX %016LX
%016LX\r\n",NameEfiRuntimeServicesData,
((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart,
((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1,
((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages,
((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
RTDataPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
break;
case EfiConventionalMemory:
if (details) Print(L"% -9s %016LX-%016LX %016LX
%016LX\r\n",NameEfiConventionalMemory,
((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart,
((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1,
((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages,
((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
AvailPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
break;
case EfiUnusableMemory:
if (details) Print(L"% -9s %016LX-%016LX %016LX
%016LX\r\n",NameEfiUnusableMemory,
((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart,
((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1,
((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages,
((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
break;
case EfiACPIReclaimMemory:
if (details) Print(L"% -9s %016LX-%016LX %016LX
%016LX\r\n",NameEfiACPIReclaimMemory,
((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart,
((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1,
((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages,
((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
AcpiReclaimPages +=
((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
break;
case EfiACPIMemoryNVS:
if (details) Print(L"% -9s %016LX-%016LX %016LX
%016LX\r\n",NameEfiACPIMemoryNVS,
((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart,
((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1,
((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages,
((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
AcpiNvsPages +=
((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
break;
case EfiMemoryMappedIO:
if (details) Print(L"% -9s %016LX-%016LX %016LX
%016LX\r\n",NameEfiMemoryMappedIO,
((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart,
((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1,
((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages,
((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
MmioSpacePages +=
((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
break;
case EfiMemoryMappedIOPortSpace:
if (details) Print(L"% -9s %016LX-%016LX %016LX
%016LX\r\n",NameEfiMemoryMappedIOPortSpace,
((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart,
((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1,
((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages,
((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
break;
case EfiPalCode:
if (details) Print(L"% -9s %016LX-%016LX %016LX
%016LX\r\n",NameEfiPalCode,
((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart,
((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1,
((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages,
((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
break;
default:
ASSERT(FALSE);
}
}
//
// print the summary
//
ReservedPagesSize = MultU64x64(SIZE_4KB,ReservedPages);
LoadCodePagesSize = MultU64x64(SIZE_4KB,LoadCodePages);
LoadDataPagesSize = MultU64x64(SIZE_4KB,LoadDataPages);
BSCodePagesSize = MultU64x64(SIZE_4KB,BSCodePages);
BSDataPagesSize = MultU64x64(SIZE_4KB,BSDataPages);
RTDataPagesSize = MultU64x64(SIZE_4KB,RTDataPages);
RTCodePagesSize = MultU64x64(SIZE_4KB,RTCodePages);
AvailPagesSize = MultU64x64(SIZE_4KB,AvailPages);
TotalPagesSize = MultU64x64(SIZE_4KB,TotalPages);
AcpiReclaimPagesSize = MultU64x64(SIZE_4KB,AcpiReclaimPages);
AcpiNvsPagesSize = MultU64x64(SIZE_4KB,AcpiNvsPages);
MmioSpacePagesSize = MultU64x64(SIZE_4KB,MmioSpacePages);
Print(L" Reserved : % ,10ld Pages (%,ld)\r\n"
L" LoaderCode: % ,10ld Pages (%,ld)\r\n"
L" LoaderData: % ,10ld Pages (%,ld)\r\n"
L" BS_Code : % ,10ld Pages (%,ld)\r\n"
L" BS_Data : % ,10ld Pages (%,ld)\r\n"
L" RT_Code : % ,10ld Pages (%,ld)\r\n"
L" RT_Data : % ,10ld Pages (%,ld)\r\n"
L" ACPI Recl : % ,10ld Pages (%,ld)\r\n"
L" ACPI NVS : % ,10ld Pages (%,ld)\r\n"
L" MMIO : % ,10ld Pages (%,ld)\r\n"
L" Available : % ,10ld Pages (%,ld)\r\n"
L"Total Memory: %ld MB (%,ld Bytes)\r\n",
ReservedPages, ReservedPagesSize,
LoadCodePages, LoadCodePagesSize,
LoadDataPages, LoadDataPagesSize,
BSCodePages, BSCodePagesSize,
BSDataPages, BSDataPagesSize,
RTCodePages, RTCodePagesSize,
RTDataPages, RTDataPagesSize,
AcpiReclaimPages, AcpiReclaimPagesSize,
AcpiNvsPages, AcpiNvsPagesSize,
MmioSpacePages, MmioSpacePagesSize,
AvailPages, AvailPagesSize,
DivU64x32(MultU64x64(SIZE_4KB,TotalPages), SIZE_1MB), TotalPagesSize
);
}
if (Buffer != NULL) {
FreePool(Buffer);
}
return (Status);
}
// #define DOPAUSE
EFI_STATUS EFIAPI TestEntry(IN EFI_HANDLE imagehandle, IN EFI_SYSTEM_TABLE
*systemtable)
{
#if defined(DOPAUSE)
INTN e;
EFI_INPUT_KEY k;
#endif
MemDump(FALSE);
#if defined(DOPAUSE)
systemtable->BootServices->WaitForEvent (1,
&systemtable->ConIn->WaitForKey, &e);
systemtable->ConIn->ReadKeyStroke(systemtable->ConIn, &k);
#endif
return EFI_SUCCESS;
}
------------------------------------------------------------------------------
LIMITED TIME SALE - Full Year of Microsoft Training For Just $49.99!
1,500+ hours of tutorials including VisualStudio 2012, Windows 8, SharePoint
2013, SQL 2012, MVC 4, more. BEST VALUE: New Multi-Library Power Pack includes
Mobile, Cloud, Java, and UX Design. Lowest price ever! Ends 9/20/13.
http://pubads.g.doubleclick.net/gampad/clk?id=58041151&iu=/4140/ostg.clktrk
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-devel