PI spec has clear description below in AddMemorySpace().

"If the memory range specified by BaseAddress and Length is of type 
EfiGcdMemoryTypeSystemMemory or EfiGcdMemoryTypeMoreReliable, then the
memory range may be *automatically allocated for use by the UEFI memory 
services*."

But PI spec has no clear description about removing the use from the UEFI 
memory services in FreeMemorySpace() and RemoveMemorySpace().
I think it is very hard (may be not possible) as the added memory space may 
have been used by UEFI memory (page) services for drivers after the memory 
space is added by AddMemorySpace().

What is the usage that the memory space needs to be added first and removed 
later?
Could the memory space be added as EfiGcdMemoryTypeReserved type instead of 
EfiGcdMemoryTypeSystemMemory type?


Thanks,
Star
-----Original Message-----
From: edk2-devel [mailto:[email protected]] On Behalf Of Wasim 
Khan
Sent: Friday, January 5, 2018 5:59 PM
To: [email protected]
Subject: [edk2] Memory space entry is not removed after calling FreeMemorySpace 
and RemoveMemorySpace

Hi All,

I am facing a problem that if a add a memory space using 'gDS->AddMemorySpace'  
and then remove it using 'gDS->FreeMemorySpace' followed by 
'gDS->RemoveMemorySpace'.
I can still see the entry of added memory space in the table shown by 'memmap' 
command.

I enabled DEBUG_GCD and as per logs , the entry is removed from 
GcdMemorySpaceMap , but when I run 'memmap' command which gets the memory map 
using 'gBS->GetMemoryMap', I can see that entry for the added memory space is 
still present. Steps and Logs are below for reference

Do I need to perform any other steps in order to cleanly remove the memory 
space entry ?

Regards,
Wasim



Below are the steps and GCD debug logs.
Steps 1 : Add a memory space . We can see that an entry from system memory is 
added.

Status = gDS->AddMemorySpace (
                                            EfiGcdMemoryTypeSystemMemory,
                                            
FixedPcdGet64(PcdSystemMemoryExBase),
                                            SystemMemoryExSize,
                                            EFI_MEMORY_WC | EFI_MEMORY_WT |
                                            EFI_MEMORY_WB
                                            );

               Logs:
                              
GCD:AddMemorySpace(Base=0000008080000000,Length=0000000380000000)
                              GcdMemoryType   = SystemMem
                              Capabilities    = 000000000000000E
CoreConvertSpace 774
                              Status = Success
GCDMemType Range                             Capabilities     Attributes
========== ================================= ================ ================
NonExist   0000000000000000-000000009FFFFFFF 0000000000000000 0000000000000000
SystemMem  00000000A0000000-00000000DFFFFFFF 800000000000000E 0000000000000008*
NonExist   00000000E0000000-00000000E01BFFFF 0000000000000000 0000000000000000
SystemMem  00000000E01C0000-00000000FFFFFFFF 800000000000000E 0000000000000008*
NonExist   0000000100000000-000000807FFFFFFF 0000000000000000 0000000000000000
SystemMem  0000008080000000-00000083FFFFFFFF 800000000000000E 0000000000000000
NonExist   0000008400000000-0000FFFFFFFFFFFF 0000000000000000 0000000000000000

GCD:AllocateMemorySpace(Base=0000008080000000,Length=0000000380000000)
  GcdAllocateType = AtAddress
  GcdMemoryType   = SystemMem
  Alignment       = 0000000000001000
  ImageHandle     = FED1FF98
  DeviceHandle    = 0
  Status = Success  (BaseAddress = 0000008080000000)
GCDMemType Range                             Capabilities     Attributes
========== ================================= ================ ================
NonExist   0000000000000000-000000009FFFFFFF 0000000000000000 0000000000000000
SystemMem  00000000A0000000-00000000DFFFFFFF 800000000000000E 0000000000000008*
NonExist   00000000E0000000-00000000E01BFFFF 0000000000000000 0000000000000000
SystemMem  00000000E01C0000-00000000FFFFFFFF 800000000000000E 0000000000000008*
NonExist   0000000100000000-000000807FFFFFFF 0000000000000000 0000000000000000
SystemMem  0000008080000000-00000083FFFFFFFF 800000000000000E 0000000000000000*
NonExist   0000008400000000-0000FFFFFFFFFFFF 0000000000000000 0000000000000000


Step2: Free the memory space
               Status = gDS->FreeMemorySpace (
               FixedPcdGet64(PcdSystemMemoryExBase),
               SystemMemoryExSize
               );

               Logs:
                              
GCD:FreeMemorySpace(Base=0000008080000000,Length=0000000380000000)
Status = Success
GCDMemType Range                             Capabilities     Attributes
========== ================================= ================ ================
NonExist   0000000000000000-000000009FFFFFFF 0000000000000000 0000000000000000
SystemMem  00000000A0000000-00000000DFFFFFFF 800000000000000E 0000000000000008*
NonExist   00000000E0000000-00000000E01BFFFF 0000000000000000 0000000000000000
SystemMem  00000000E01C0000-00000000FFFFFFFF 800000000000000E 0000000000000008*
NonExist   0000000100000000-000000807FFFFFFF 0000000000000000 0000000000000000
SystemMem  0000008080000000-00000083FFFFFFFF 800000000000000E 0000000000000000
NonExist   0000008400000000-0000FFFFFFFFFFFF 0000000000000000 0000000000000000


Step3: Remove the memory space , As we can see that entry 'SystemMem  
0000008080000000-00000083FFFFFFFF' is removed.
               Status = gDS->RemoveMemorySpace (
               FixedPcdGet64(PcdSystemMemoryExBase),
               SystemMemoryExSize
               );

               Logs:
                              
GCD:RemoveMemorySpace(Base=0000008080000000,Length=0000000380000000)
Status = Success
GCDMemType Range                             Capabilities     Attributes
========== ================================= ================ ================
NonExist   0000000000000000-000000009FFFFFFF 0000000000000000 0000000000000000
SystemMem  00000000A0000000-00000000DFFFFFFF 800000000000000E 0000000000000008*
NonExist   00000000E0000000-00000000E01BFFFF 0000000000000000 0000000000000000
SystemMem  00000000E01C0000-00000000FFFFFFFF 800000000000000E 0000000000000008*
NonExist   0000000100000000-0000FFFFFFFFFFFF 0000000000000000 0000000000000000

Step4 : Run the 'memmap' command. As we can see that entry is still present.
               Shell> memmap
Type       Start            End              # Pages          Attributes
Available  00000000A0000000-00000000DFFFFFFF 0000000000040000 000000000000000E 
Available  00000000E01C0000-00000000E53C0FFF 0000000000005201 000000000000000E
BS_Data    00000000E53C1000-00000000E5D99FFF 00000000000009D9 000000000000000E
...
Available  0000008080000000-00000083FFFFFFFF 0000000000380000 000000000000000E
                              ...
_______________________________________________
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