Does the pattern continue or level off after time?

I ask as the shell will make some allocations to save things like command 
history and output history for up/down page up/page down support...

-Jaben

> On Jun 1, 2016, at 10:10 AM, Rafael Machado 
> <[email protected]> wrote:
> 
> Hi Everyone.
> 
> I'm doing some tests related to the GOP and graphical applications.
> What I've seeing is that after calling the GOP->BLT several times the
> available memory from the system decrease.
> 
> For example. When the system just boot I have the following at the uefi
> shell memmap command:
> 
>  reserved  :     124 Pages (507,904)
>  LoaderCode:     186 Pages (761,856)
>  LoaderData:      24 Pages (98,304)
>  BS_code   :   1,719 Pages (7,041,024)
>  BS_data   :  10,774 Pages (44,130,304)
>  RT_code   :     256 Pages (1,048,576)
>  RT_data   :     660 Pages (2,703,360)
>  *available : 407,184 Pages (1,667,825,664)*
>  ACPI_recl :      96 Pages (393,216)
>  ACPI_NVS  :     129 Pages (528,384)
>  MemMapIO  :       1 Pages (4,096)
> Total Memory: 1,644 MB (1,724,530,688) Bytes
> 
> After executing a sample application that just draw a white box 10 times, I
> have the following:
> 
>  reserved  :     124 Pages (507,904)
>  LoaderCode:     186 Pages (761,856)
>  LoaderData:      24 Pages (98,304)
>  BS_code   :   1,719 Pages (7,041,024)
>  BS_data   :  10,776 Pages (44,138,496)
>  RT_code   :     256 Pages (1,048,576)
>  RT_data   :     660 Pages (2,703,360)
> * available : 407,182 Pages (1,667,817,472)*
>  ACPI_recl :      96 Pages (393,216)
>  ACPI_NVS  :     129 Pages (528,384)
>  MemMapIO  :       1 Pages (4,096)
> Total Memory: 1,644 MB (1,724,530,688) Bytes
> 
> 
> So the situation is that on a Graphical UEFI application, there is a
> possibility of getting too much memory.
> As much as I execute the application the available memory keeps decreasing.
> 
> Could someone please help me to find some problem on the sample application
> code ?
> 
> "
> #include <Uefi.h>
> #include <Library/UefiBootServicesTableLib.h>
> #include <Library/MemoryAllocationLib.h>
> #include <Library/UefiLib.h>
> #include <Library/PrintLib.h>
> #include <Library/DebugLib.h>
> #include <Protocol/GraphicsOutput.h>
> #include <Protocol/EdidActive.h>
> 
> #define BoxWidth 100
> #define BoxHeight 100
> 
> EFI_STATUS PrintImage(EFI_HANDLE ImageHandle, UINTN ImagePositionX, UINTN
> ImagePositionY){
> 
> UINTN Size;
> EFI_STATUS Status;
> UINTN HandleIndex = 0;
> EFI_HANDLE *HandleArray = NULL;
> EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicProtocol = NULL;
> EFI_GUID gGraphicalProtocol = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID;
> EFI_GUID gEdidActivated = EFI_EDID_ACTIVE_PROTOCOL_GUID;
> EFI_EDID_ACTIVE_PROTOCOL *EdidActivated = NULL;
> EFI_GRAPHICS_OUTPUT_BLT_PIXEL* inMemoryImage = NULL;
> 
> Status = gBS->LocateHandleBuffer(ByProtocol,
> &gEfiGraphicsOutputProtocolGuid,
> NULL,
> &Size,
> &HandleArray);
> 
> if(!EFI_ERROR(Status))
> {
> for(HandleIndex=0; HandleIndex<Size; HandleIndex++)
> {
> 
> Status = gBS->OpenProtocol(HandleArray[HandleIndex],
> &gGraphicalProtocol,
> (VOID**) &GraphicProtocol,
> ImageHandle,
> NULL,
> EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL);
> 
> if(EFI_ERROR(Status)){
> 
> gBS->CloseProtocol(HandleArray[HandleIndex],
> &gGraphicalProtocol,
> ImageHandle,
> NULL);
> 
> GraphicProtocol = NULL;
> 
> continue;
> } else {
> 
> // Verifies if current handle corresponds to current video
> Status = gBS->OpenProtocol(HandleArray[HandleIndex],
> &gEdidActivated,
> (VOID**) &EdidActivated,
> ImageHandle,
> NULL,
> EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL);
> 
> if(EFI_ERROR(Status)){
> 
> gBS->CloseProtocol(HandleArray[HandleIndex],
> &gGraphicalProtocol,
> ImageHandle,
> NULL);
> 
> GraphicProtocol = NULL;
> 
> gBS->CloseProtocol(HandleArray[HandleIndex],
> &gEdidActivated,
> ImageHandle,
> NULL);
> 
> EdidActivated = NULL;
> 
> continue;
> } else {
> break;
> }
> }
> }
> 
> if(!EFI_ERROR(Status))
> {
> Status = gBS->AllocatePool(EfiBootServicesData,
> sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL) *
> BoxWidth * BoxHeight,
> &inMemoryImage);
> 
> if(!EFI_ERROR(Status))
> {
> 
> gBS->SetMem(inMemoryImage,
> sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL) *
> BoxWidth * BoxHeight,
> 0xFF);
> 
> Status = GraphicProtocol->Blt(GraphicProtocol,
> inMemoryImage,
> EfiBltBufferToVideo,
> 0,
> 0,
> ImagePositionX,
> ImagePositionY,
> BoxWidth,
> BoxHeight,
> 0);
> 
> if(EFI_ERROR(Status)){
> Print(L"Fail to print Image");
> goto CLEAR;
> }
> } else {
> Print(L"Fail to allocate buffer");
> goto CLEAR;
> }
> 
> }else{
> Print(L"Fail to locate GraphicIoProtocol devices");
> goto CLEAR;
> }
> }
> 
> CLEAR:
> 
> if(inMemoryImage != NULL) {
> FreePool(inMemoryImage);
> inMemoryImage = NULL;
> }
> 
> if(GraphicProtocol != NULL) {
> 
> Status = gBS->CloseProtocol(HandleArray[HandleIndex],
> &gGraphicalProtocol,
> ImageHandle,
> NULL);
> 
> GraphicProtocol = NULL;
> }
> 
> if(EdidActivated != NULL) {
> 
> Status = gBS->CloseProtocol(HandleArray[HandleIndex],
> &gEdidActivated,
> ImageHandle,
> NULL);
> 
> EdidActivated = NULL;
> }
> 
> if(HandleArray != NULL) {
> FreePool(HandleArray);
> HandleArray = NULL;
> }
> 
> return Status;
> }
> 
> 
> EFI_STATUS testMain(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
> {
> return PrintImage(ImageHandle, 50, 50);
> }
> "
> 
> 
> Any help will be really useful.
> 
> Thanks and Regards
> Rafael R. Machado
> _______________________________________________
> edk2-devel mailing list
> [email protected]
> https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to