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

Reply via email to