> On Jun 2, 2016, at 5:49 AM, Rafael Machado > <rafaelrodrigues.mach...@gmail.com> wrote: > > Hi everyone / Aaron > > I was studying Aaron's message to be sure I got everything he explained. > Now I have just one last question. > > You mentioned that the calls to LocateHandleBuffer, AllocatePool and GOP->BLT > change some memory types and allocate them. > I can confirm that this is exactly what happens. Before the memory is > decreased I have this map from the memmap uefi shell command: > > available 0000000064059000-0000000064086FFF 000000000000002E > 000000000000000F > > BS_data : 10,774 Pages (44,130,304) > available : 407,183 Pages (1,667,821,568) > > And after some executions I have this map: > > available 0000000064059000-0000000064085FFF 000000000000002D > 000000000000000F > BS_data 0000000064086000-0000000064086FFF 0000000000000001 > 000000000000000F > > BS_data : 10,775 Pages (44,134,400) > available : 407,182 Pages (1,667,817,472) > > Now my question is. > After my function is done shouldn't the memory that was converted to BS_Data, > and that was released, go back to the "available memory" memory type ? Since > this is not happening seems there is some leak at some place. I did a test > executing the application 10k times, and BS_Data keeps increasing and > available keeps decreasing. > > At the and the result is: > > LoaderData: 26 Pages (106,496) > BS_data : 14,201 Pages (58,167,296) > available : 403,755 Pages (1,653,780,480) > > > Just one additional information. Some memory was stolen from LoaderData > memory type. It was bigger at the first execution: > > LoaderData: 649 Pages (2,658,304) > > > Any comments are well received. >
I don't have time to look at the code. But I would point out the memory map is showing you that Page view of memory and you are talking about doing Pool allocations. Thus it seems the DXE Core could have a free list that is allocated from Pages. Thus the memory map is showing what you can allocate at a Page level, and a Pool allocation may or may not change the Page map. Thanks, Andrew Fish > Thanks and regards > Rafael R. Machado > > > Em qua, 1 de jun de 2016 às 16:52, Rafael Machado > <rafaelrodrigues.mach...@gmail.com > <mailto:rafaelrodrigues.mach...@gmail.com>> escreveu: > Amazing explanation Aaron!! > Thanks a lot!! > > Rafael R. Machado > > Em qua, 1 de jun de 2016 às 15:29, <aaron....@congatec.com > <mailto:aaron....@congatec.com>> escreveu: > Hi Rafael, > > I think your application is exposing some of the rough edges of the EDK2 > memory allocation routines. > > Your application is calling allocatepool for boot servies data. It is first > doing this to get a handle buffer of GOP devices, then it is doing this to > create a Blt buffer. > > Your application does free this memory, but once you understand how the > internals of the edk2 memory allocation work, the behavior is as expected. > e > When you call allocate pool, if the amount of memory that you are trying to > allocate is greater than a page then the edk2 will round the amount of memory > that you are requesting up to the next page and just allocate pages of memory > to you. > > If you call allocate pool, and the amount of memory you are trying to > allocate is less than a page of memory, the edk2 will look at the current > sets of memory that are of the type you are trying to allocate > (EfiBootServicesData in your case). If it can find an available amount of > memory in its previously allocated pages, it will return that memory to you. > If it cannot find that amount of memory, it will convert available pages of > memory into the type of memory and give that to you. > > If your example code's case, you allocate for a handle buffer, then you > allocate for a gop blt buffer, then you call blt (which may perform memory > allocations too). In all of this, you may have exhausted the amount of > BootServicesData pages that were currently available and caused the system to > convert available memory into Boot Services Data memory. > > I hope this helps explain the behavior that you are seeing. > > > > > From: Andrew Fish <af...@apple.com <mailto:af...@apple.com>> > To: Rafael Machado <rafaelrodrigues.mach...@gmail.com > <mailto:rafaelrodrigues.mach...@gmail.com>> > Cc: "Carsey, Jaben" <jaben.car...@intel.com > <mailto:jaben.car...@intel.com>>, "edk2-devel@lists.01.org > <mailto:edk2-devel@lists.01.org>" <edk2-devel@lists.01.org > <mailto:edk2-devel@lists.01.org>> > Date: 06/01/2016 11:16 AM > Subject: Re: [edk2] Memory Consumption after BLT (GOP) > Sent by: "edk2-devel" <edk2-devel-boun...@lists.01.org > <mailto:edk2-devel-boun...@lists.01.org>> > > > > > > On Jun 1, 2016, at 11:10 AM, Rafael Machado > > <rafaelrodrigues.mach...@gmail.com > > <mailto:rafaelrodrigues.mach...@gmail.com>> wrote: > > > > The draw application is this one: > > > > Yikes that is hard for me to read without indentation.... > > Why don't you try putting some of the GraphicProtocol calls in a loop to see > if that leaks more memory? > > Thanks, > > Andrew Fish > > > #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 <jaben.car...@intel.com > > <mailto:jaben.car...@intel.com>> > > 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:rafaelrodrigues.mach...@gmail.com > >> <mailto:rafaelrodrigues.mach...@gmail.com>] > >> Sent: Wednesday, June 01, 2016 11:00 AM > >> To: Carsey, Jaben <jaben.car...@intel.com <mailto:jaben.car...@intel.com>> > >> Cc: edk2-devel@lists.01.org <mailto:edk2-devel@lists.01.org> > >> 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 <jaben.car...@intel.com > >> <mailto:jaben.car...@intel.com> > >> <mailto:jaben.car...@intel.com <mailto:jaben.car...@intel.com>>> 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:edk2-devel-boun...@lists.01.org > >>> <mailto:edk2-devel-boun...@lists.01.org><mailto: > >> edk2-devel-boun...@lists.01.org <mailto:edk2-devel-boun...@lists.01.org>>] > >> On Behalf Of > >>> Rafael Machado > >>> Sent: Wednesday, June 01, 2016 10:33 AM > >>> To: Carsey, Jaben <jaben.car...@intel.com > >>> <mailto:jaben.car...@intel.com><mailto:jaben.car...@intel.com > >>> <mailto:jaben.car...@intel.com> > >>>> > >>> Cc: edk2-devel@lists.01.org > >>> <mailto:edk2-devel@lists.01.org><mailto:edk2-devel@lists.01.org > >>> <mailto:edk2-devel@lists.01.org>> > >>> 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 <jaben.car...@intel.com > >>> <mailto:jaben.car...@intel.com> > >> <mailto:jaben.car...@intel.com <mailto:jaben.car...@intel.com>>> > >>> 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 < > >>>> rafaelrodrigues.mach...@gmail.com > >>>> <mailto:rafaelrodrigues.mach...@gmail.com><mailto: > >> rafaelrodrigues.mach...@gmail.com > >> <mailto:rafaelrodrigues.mach...@gmail.com>>> 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 > >>>>> edk2-devel@lists.01.org > >>>>> <mailto:edk2-devel@lists.01.org><mailto:edk2-devel@lists.01.org > >>>>> <mailto:edk2-devel@lists.01.org>> > >>>>> https://lists.01.org/mailman/listinfo/edk2-devel > >>>>> <https://lists.01.org/mailman/listinfo/edk2-devel> > >>>> > >>> _______________________________________________ > >>> edk2-devel mailing list > >>> edk2-devel@lists.01.org > >>> <mailto:edk2-devel@lists.01.org><mailto:edk2-devel@lists.01.org > >>> <mailto:edk2-devel@lists.01.org>> > >>> https://lists.01.org/mailman/listinfo/edk2-devel > >>> <https://lists.01.org/mailman/listinfo/edk2-devel> > >> _______________________________________________ > >> edk2-devel mailing list > >> edk2-devel@lists.01.org <mailto:edk2-devel@lists.01.org> > >> https://lists.01.org/mailman/listinfo/edk2-devel > >> <https://lists.01.org/mailman/listinfo/edk2-devel> > >> > > _______________________________________________ > > edk2-devel mailing list > > edk2-devel@lists.01.org <mailto:edk2-devel@lists.01.org> > > https://lists.01.org/mailman/listinfo/edk2-devel > > <https://lists.01.org/mailman/listinfo/edk2-devel> > > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org <mailto:edk2-devel@lists.01.org> > https://lists.01.org/mailman/listinfo/edk2-devel > <https://lists.01.org/mailman/listinfo/edk2-devel> > > _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel