The draw application is this one:
#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 testeMain(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
return PrintImage(ImageHandle, 50, 50);
}
Unfortunately I don't have this systems GOP driver code.
Thanks and Regards.
Rafael R. Machado
Em qua, 1 de jun de 2016 às 15:02, Carsey, Jaben <[email protected]>
escreveu:
> It’s possible that you found a leak in the driver. Have you double
> checked your drawing app to be sure it’s not leaking anything? Do you have
> source for the driver?
>
> -Jaben
>
>
> From: Rafael Machado [mailto:[email protected]]
> Sent: Wednesday, June 01, 2016 11:00 AM
> To: Carsey, Jaben <[email protected]>
> Cc: [email protected]
> Subject: Re: [edk2] Memory Consumption after BLT (GOP)
> Importance: High
>
> I did that :)
>
> To get the available memory I did the following function:
>
> EFI_STATUS CalculateAvaiableMemoryForDebug (VOID)
> {
>
> EFI_STATUS Status = EFI_SUCCESS;
> EFI_MEMORY_DESCRIPTOR *MemMap = NULL;
> EFI_MEMORY_DESCRIPTOR *Desc;
> UINTN DescriptorSize = 0;
> UINT32 DescriptorVersion = 0; UINTN MapKey;
> UINTN MemMapSize = sizeof(EFI_MEMORY_DESCRIPTOR);
> UINTN Index = 0;
> UINTN NoDesc = 0;
>
>
> UINTN TotalOfPages = 0;
> UINTN TotalOfFreePages = 0;
> UINTN TotalOfBlocks = 0;
> UINTN CurrentBlock = 0;
>
>
>
> if (MemMap != NULL) {
> FreePool(MemMap);
> }
>
> Status = gBS->AllocatePool(EfiBootServicesData,
> MemMapSize,
> (VOID**)&MemMap);
>
> if (Status == EFI_SUCCESS) {
> Status = gBS->GetMemoryMap(&MemMapSize,
> MemMap,
> &MapKey,
> &DescriptorSize,
> &DescriptorVersion);
> } else {
> Status = EFI_DEVICE_ERROR;
> }
>
> if (Status == EFI_SUCCESS) {
>
> CurrentBlock = 1;
> Desc = MemMap;
> NoDesc = MemMapSize / DescriptorSize;
>
> for(Index = 0; Index < NoDesc; Index++) {
>
> if (Desc->Type == EfiConventionalMemory) {
> TotalOfFreePages += (UINTN) Desc->NumberOfPages;
> TotalOfBlocks++;
> }
>
> TotalOfPages += (UINTN) Desc->NumberOfPages;
>
> Desc = NextMemoryDescriptor (Desc, DescriptorSize);
> }
>
> } else {
> Status = EFI_DEVICE_ERROR;
> }
>
> if (MemMap != NULL) {
> FreePool(MemMap);
> }
>
> DEBUG_LOG(DbgFileModeMemoryAvailable,
> DEBUG_LEVEL_DUMP,
> L"-----Available Pages: %ld --------\n",
> TotalOfFreePages);
>
>
> return Status;
> }
>
> The available memory also decreases in this case.
> I didn't find any leak at this function too.
>
> I'm considering some problem with other driver that is causing this
> memory decrease during the execution time.
>
> Thanks
> Rafael R. Machado
>
> Em qua, 1 de jun de 2016 às 14:53, Carsey, Jaben <[email protected]
> <mailto:[email protected]>> escreveu:
> Well... sadly the best way to debug would be to get the memory map
> yourself, run your graphical operation, and then compare all inside the
> same program (assuming that you allocate no memory within your memory map
> acquisitions).
>
> -Jaben
>
> > -----Original Message-----
> > From: edk2-devel [mailto:[email protected]<mailto:
> [email protected]>] On Behalf Of
> > Rafael Machado
> > Sent: Wednesday, June 01, 2016 10:33 AM
> > To: Carsey, Jaben <[email protected]<mailto:[email protected]
> >>
> > Cc: [email protected]<mailto:[email protected]>
> > Subject: Re: [edk2] Memory Consumption after BLT (GOP)
> > Importance: High
> >
> > The system has one page decreased after some executions.
> > I used the following script to check this:
> >
> > FS1:
> > echo -off
> > memmap >> memmapShellBefore.txt
> > for %a run (1 10)
> > TestesImagemBMP.efi
> > memmap >> memmapShellAfter_%a.txt
> > endfor
> >
> > The decrease happened at execution number 4 and 9
> > From execution 1 to 2, and 2 to 3 no decrease was detected. The same
> with
> > execution 4 to 5, 5 to 6 6 to 7 and 7 to 8
> >
> > I thought that since I'm using the script no command log was saved by the
> > shell application.
> > At the begin I added a echo -off to avoid scroll.
> >
> >
> > Thanks and Regards
> > Rafael R. Machado
> >
> > Em qua, 1 de jun de 2016 às 14:13, Carsey, Jaben <[email protected]
> <mailto:[email protected]>>
> > escreveu:
> >
> > > 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]<mailto:
> [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]<mailto:[email protected]>
> > > > https://lists.01.org/mailman/listinfo/edk2-devel
> > >
> > _______________________________________________
> > edk2-devel mailing list
> > [email protected]<mailto:[email protected]>
> > https://lists.01.org/mailman/listinfo/edk2-devel
> _______________________________________________
> 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