Message ID | 20180528144024.10809-4-ard.biesheuvel@linaro.org |
---|---|
State | Accepted |
Commit | a40e0b7aa9180313611525e5a9c05daaf9120713 |
Headers | show |
Series | Abstract allocation of PEI accessible memory | expand |
On 05/28/18 16:40, Ard Biesheuvel wrote: > Add a routine to DxeServicesLib that abstracts the allocation of memory > that should be accessible by PEI after a warm reboot. We will use it to > replace open coded implementations that limit the address to < 4 GB, > which may not be possible on non-Intel systems that have no 32-bit > addressable memory at all. > > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> > --- > MdePkg/Include/Library/DxeServicesLib.h | 23 ++++++- > MdePkg/Library/DxeServicesLib/Allocate.c | 54 +++++++++++++++ > MdePkg/Library/DxeServicesLib/DxeServicesLib.inf | 11 +++- > MdePkg/Library/DxeServicesLib/X64/Allocate.c | 69 ++++++++++++++++++++ > 4 files changed, 155 insertions(+), 2 deletions(-) Reviewed-by: Laszlo Ersek <lersek@redhat.com> Thanks, Laszlo > > diff --git a/MdePkg/Include/Library/DxeServicesLib.h b/MdePkg/Include/Library/DxeServicesLib.h > index 7c1c62236d96..20aee68af558 100644 > --- a/MdePkg/Include/Library/DxeServicesLib.h > +++ b/MdePkg/Include/Library/DxeServicesLib.h > @@ -305,5 +305,26 @@ GetFileDevicePathFromAnyFv ( > OUT EFI_DEVICE_PATH_PROTOCOL **FvFileDevicePath > ); > > -#endif > +/** > + Allocates one or more 4KB pages of a given type from a memory region that is > + accessible to PEI. > + > + Allocates the number of 4KB pages of type 'MemoryType' and returns a > + pointer to the allocated buffer. The buffer returned is aligned on a 4KB > + boundary. If Pages is 0, then NULL is returned. If there is not enough > + memory remaining to satisfy the request, then NULL is returned. > > + @param[in] MemoryType The memory type to allocate > + @param[in] Pages The number of 4 KB pages to allocate. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +AllocatePeiAccessiblePages ( > + IN EFI_MEMORY_TYPE MemoryType, > + IN UINTN Pages > + ); > + > +#endif > diff --git a/MdePkg/Library/DxeServicesLib/Allocate.c b/MdePkg/Library/DxeServicesLib/Allocate.c > new file mode 100644 > index 000000000000..4d118f766d49 > --- /dev/null > +++ b/MdePkg/Library/DxeServicesLib/Allocate.c > @@ -0,0 +1,54 @@ > +/** @file > + DxeServicesLib memory allocation routines > + > + Copyright (c) 2018, Linaro, Ltd. All rights reserved.<BR> > + > + This program and the accompanying materials are licensed and made available > + under the terms and conditions of the BSD License which accompanies this > + distribution. The full text of the license may be found at > + http://opensource.org/licenses/bsd-license.php. > + > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > + > +**/ > + > +#include <PiDxe.h> > +#include <Library/UefiBootServicesTableLib.h> > +#include <Library/DxeServicesLib.h> > + > +/** > + Allocates one or more 4KB pages of a given type from a memory region that is > + accessible to PEI. > + > + Allocates the number of 4KB pages of type 'MemoryType' and returns a > + pointer to the allocated buffer. The buffer returned is aligned on a 4KB > + boundary. If Pages is 0, then NULL is returned. If there is not enough > + memory remaining to satisfy the request, then NULL is returned. > + > + @param[in] MemoryType The memory type to allocate > + @param[in] Pages The number of 4 KB pages to allocate. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +AllocatePeiAccessiblePages ( > + IN EFI_MEMORY_TYPE MemoryType, > + IN UINTN Pages > + ) > +{ > + EFI_STATUS Status; > + EFI_PHYSICAL_ADDRESS Memory; > + > + if (Pages == 0) { > + return NULL; > + } > + > + Status = gBS->AllocatePages (AllocateAnyPages, MemoryType, Pages, &Memory); > + if (EFI_ERROR (Status)) { > + return NULL; > + } > + return (VOID *)(UINTN)Memory; > +} > diff --git a/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf b/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf > index bd2faf2f6f2d..50ae24f8ee22 100644 > --- a/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf > +++ b/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf > @@ -27,12 +27,18 @@ [Defines] > LIBRARY_CLASS = DxeServicesLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER SMM_CORE UEFI_APPLICATION UEFI_DRIVER > > # > -# VALID_ARCHITECTURES = IA32 X64 IPF EBC > +# VALID_ARCHITECTURES = IA32 X64 IPF EBC ARM AARCH64 > # > > [Sources] > DxeServicesLib.c > > +[Sources.IA32, Sources.IPF, Sources.EBC, Sources.ARM, Sources.AARCH64] > + Allocate.c > + > +[Sources.X64] > + X64/Allocate.c > + > [Packages] > MdePkg/MdePkg.dec > > @@ -44,6 +50,9 @@ [LibraryClasses] > UefiLib > UefiBootServicesTableLib > > +[LibraryClasses.X64] > + HobLib > + > [Guids] > gEfiFileInfoGuid ## SOMETIMES_CONSUMES ## UNDEFINED > > diff --git a/MdePkg/Library/DxeServicesLib/X64/Allocate.c b/MdePkg/Library/DxeServicesLib/X64/Allocate.c > new file mode 100644 > index 000000000000..b6d34ba20881 > --- /dev/null > +++ b/MdePkg/Library/DxeServicesLib/X64/Allocate.c > @@ -0,0 +1,69 @@ > +/** @file > + DxeServicesLib memory allocation routines > + > + Copyright (c) 2018, Linaro, Ltd. All rights reserved.<BR> > + > + This program and the accompanying materials are licensed and made available > + under the terms and conditions of the BSD License which accompanies this > + distribution. The full text of the license may be found at > + http://opensource.org/licenses/bsd-license.php. > + > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > + > +**/ > + > +#include <PiDxe.h> > +#include <Library/HobLib.h> > +#include <Library/UefiBootServicesTableLib.h> > +#include <Library/DxeServicesLib.h> > + > +/** > + Allocates one or more 4KB pages of a given type from a memory region that is > + accessible to PEI. > + > + Allocates the number of 4KB pages of type 'MemoryType' and returns a > + pointer to the allocated buffer. The buffer returned is aligned on a 4KB > + boundary. If Pages is 0, then NULL is returned. If there is not enough > + memory remaining to satisfy the request, then NULL is returned. > + > + @param[in] MemoryType The memory type to allocate > + @param[in] Pages The number of 4 KB pages to allocate. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +AllocatePeiAccessiblePages ( > + IN EFI_MEMORY_TYPE MemoryType, > + IN UINTN Pages > + ) > +{ > + EFI_STATUS Status; > + EFI_ALLOCATE_TYPE AllocType; > + EFI_PHYSICAL_ADDRESS Memory; > + EFI_HOB_HANDOFF_INFO_TABLE *PhitHob; > + > + if (Pages == 0) { > + return NULL; > + } > + > + AllocType = AllocateAnyPages; > + // > + // A X64 build of DXE may be combined with a 32-bit build of PEI, and so we > + // need to check the memory limit set by PEI, and allocate below 4 GB if the > + // limit is set to 4 GB or lower. > + // > + PhitHob = (EFI_HOB_HANDOFF_INFO_TABLE *)GetHobList (); > + if (PhitHob->EfiFreeMemoryTop <= MAX_UINT32) { > + AllocType = AllocateMaxAddress; > + Memory = MAX_UINT32; > + } > + > + Status = gBS->AllocatePages (AllocType, MemoryType, Pages, &Memory); > + if (EFI_ERROR (Status)) { > + return NULL; > + } > + return (VOID *)(UINTN)Memory; > +} > _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel
I think " be accessible by PEI after a warm reboot " should be " be accessible by PEI after resuming from S3 ". You can update it when pushing without need to send a new patch if other has no comment to the code part. Thanks, Star -----Original Message----- From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of Ard Biesheuvel Sent: Monday, May 28, 2018 10:40 PM To: edk2-devel@lists.01.org Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> Subject: [edk2] [PATCH v3 3/5] MdePkg/DxeServicesLib: introduce AllocatePeiAccessiblePages routine Add a routine to DxeServicesLib that abstracts the allocation of memory that should be accessible by PEI after a warm reboot. We will use it to replace open coded implementations that limit the address to < 4 GB, which may not be possible on non-Intel systems that have no 32-bit addressable memory at all. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> --- MdePkg/Include/Library/DxeServicesLib.h | 23 ++++++- MdePkg/Library/DxeServicesLib/Allocate.c | 54 +++++++++++++++ MdePkg/Library/DxeServicesLib/DxeServicesLib.inf | 11 +++- MdePkg/Library/DxeServicesLib/X64/Allocate.c | 69 ++++++++++++++++++++ 4 files changed, 155 insertions(+), 2 deletions(-) diff --git a/MdePkg/Include/Library/DxeServicesLib.h b/MdePkg/Include/Library/DxeServicesLib.h index 7c1c62236d96..20aee68af558 100644 --- a/MdePkg/Include/Library/DxeServicesLib.h +++ b/MdePkg/Include/Library/DxeServicesLib.h @@ -305,5 +305,26 @@ GetFileDevicePathFromAnyFv ( OUT EFI_DEVICE_PATH_PROTOCOL **FvFileDevicePath ); -#endif +/** + Allocates one or more 4KB pages of a given type from a memory region that is + accessible to PEI. + + Allocates the number of 4KB pages of type 'MemoryType' and returns a + pointer to the allocated buffer. The buffer returned is aligned on a 4KB + boundary. If Pages is 0, then NULL is returned. If there is not enough + memory remaining to satisfy the request, then NULL is returned. + @param[in] MemoryType The memory type to allocate + @param[in] Pages The number of 4 KB pages to allocate. + + @return A pointer to the allocated buffer or NULL if allocation fails. + +**/ +VOID * +EFIAPI +AllocatePeiAccessiblePages ( + IN EFI_MEMORY_TYPE MemoryType, + IN UINTN Pages + ); + +#endif diff --git a/MdePkg/Library/DxeServicesLib/Allocate.c b/MdePkg/Library/DxeServicesLib/Allocate.c new file mode 100644 index 000000000000..4d118f766d49 --- /dev/null +++ b/MdePkg/Library/DxeServicesLib/Allocate.c @@ -0,0 +1,54 @@ +/** @file + DxeServicesLib memory allocation routines + + Copyright (c) 2018, Linaro, Ltd. All rights reserved.<BR> + + This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License which accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#include <PiDxe.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/DxeServicesLib.h> + +/** + Allocates one or more 4KB pages of a given type from a memory region that is + accessible to PEI. + + Allocates the number of 4KB pages of type 'MemoryType' and returns a + pointer to the allocated buffer. The buffer returned is aligned on a 4KB + boundary. If Pages is 0, then NULL is returned. If there is not enough + memory remaining to satisfy the request, then NULL is returned. + + @param[in] MemoryType The memory type to allocate + @param[in] Pages The number of 4 KB pages to allocate. + + @return A pointer to the allocated buffer or NULL if allocation fails. + +**/ +VOID * +EFIAPI +AllocatePeiAccessiblePages ( + IN EFI_MEMORY_TYPE MemoryType, + IN UINTN Pages + ) +{ + EFI_STATUS Status; + EFI_PHYSICAL_ADDRESS Memory; + + if (Pages == 0) { + return NULL; + } + + Status = gBS->AllocatePages (AllocateAnyPages, MemoryType, Pages, &Memory); + if (EFI_ERROR (Status)) { + return NULL; + } + return (VOID *)(UINTN)Memory; +} diff --git a/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf b/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf index bd2faf2f6f2d..50ae24f8ee22 100644 --- a/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf +++ b/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf @@ -27,12 +27,18 @@ [Defines] LIBRARY_CLASS = DxeServicesLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER SMM_CORE UEFI_APPLICATION UEFI_DRIVER # -# VALID_ARCHITECTURES = IA32 X64 IPF EBC +# VALID_ARCHITECTURES = IA32 X64 IPF EBC ARM AARCH64 # [Sources] DxeServicesLib.c +[Sources.IA32, Sources.IPF, Sources.EBC, Sources.ARM, Sources.AARCH64] + Allocate.c + +[Sources.X64] + X64/Allocate.c + [Packages] MdePkg/MdePkg.dec @@ -44,6 +50,9 @@ [LibraryClasses] UefiLib UefiBootServicesTableLib +[LibraryClasses.X64] + HobLib + [Guids] gEfiFileInfoGuid ## SOMETIMES_CONSUMES ## UNDEFINED diff --git a/MdePkg/Library/DxeServicesLib/X64/Allocate.c b/MdePkg/Library/DxeServicesLib/X64/Allocate.c new file mode 100644 index 000000000000..b6d34ba20881 --- /dev/null +++ b/MdePkg/Library/DxeServicesLib/X64/Allocate.c @@ -0,0 +1,69 @@ +/** @file + DxeServicesLib memory allocation routines + + Copyright (c) 2018, Linaro, Ltd. All rights reserved.<BR> + + This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License which accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#include <PiDxe.h> +#include <Library/HobLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/DxeServicesLib.h> + +/** + Allocates one or more 4KB pages of a given type from a memory region that is + accessible to PEI. + + Allocates the number of 4KB pages of type 'MemoryType' and returns a + pointer to the allocated buffer. The buffer returned is aligned on a 4KB + boundary. If Pages is 0, then NULL is returned. If there is not enough + memory remaining to satisfy the request, then NULL is returned. + + @param[in] MemoryType The memory type to allocate + @param[in] Pages The number of 4 KB pages to allocate. + + @return A pointer to the allocated buffer or NULL if allocation fails. + +**/ +VOID * +EFIAPI +AllocatePeiAccessiblePages ( + IN EFI_MEMORY_TYPE MemoryType, + IN UINTN Pages + ) +{ + EFI_STATUS Status; + EFI_ALLOCATE_TYPE AllocType; + EFI_PHYSICAL_ADDRESS Memory; + EFI_HOB_HANDOFF_INFO_TABLE *PhitHob; + + if (Pages == 0) { + return NULL; + } + + AllocType = AllocateAnyPages; + // + // A X64 build of DXE may be combined with a 32-bit build of PEI, and so we + // need to check the memory limit set by PEI, and allocate below 4 GB if the + // limit is set to 4 GB or lower. + // + PhitHob = (EFI_HOB_HANDOFF_INFO_TABLE *)GetHobList (); + if (PhitHob->EfiFreeMemoryTop <= MAX_UINT32) { + AllocType = AllocateMaxAddress; + Memory = MAX_UINT32; + } + + Status = gBS->AllocatePages (AllocType, MemoryType, Pages, &Memory); + if (EFI_ERROR (Status)) { + return NULL; + } + return (VOID *)(UINTN)Memory; +} -- 2.17.0 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org 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
The patch is good to me. Reviewed-by: Liming Gao <liming.gao@intel.com> >-----Original Message----- >From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of >Laszlo Ersek >Sent: Monday, May 28, 2018 11:00 PM >To: Ard Biesheuvel <ard.biesheuvel@linaro.org>; edk2-devel@lists.01.org >Subject: Re: [edk2] [PATCH v3 3/5] MdePkg/DxeServicesLib: introduce >AllocatePeiAccessiblePages routine > >On 05/28/18 16:40, Ard Biesheuvel wrote: >> Add a routine to DxeServicesLib that abstracts the allocation of memory >> that should be accessible by PEI after a warm reboot. We will use it to >> replace open coded implementations that limit the address to < 4 GB, >> which may not be possible on non-Intel systems that have no 32-bit >> addressable memory at all. >> >> Contributed-under: TianoCore Contribution Agreement 1.1 >> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> >> --- >> MdePkg/Include/Library/DxeServicesLib.h | 23 ++++++- >> MdePkg/Library/DxeServicesLib/Allocate.c | 54 +++++++++++++++ >> MdePkg/Library/DxeServicesLib/DxeServicesLib.inf | 11 +++- >> MdePkg/Library/DxeServicesLib/X64/Allocate.c | 69 >++++++++++++++++++++ >> 4 files changed, 155 insertions(+), 2 deletions(-) > >Reviewed-by: Laszlo Ersek <lersek@redhat.com> > >Thanks, >Laszlo > >> >> diff --git a/MdePkg/Include/Library/DxeServicesLib.h >b/MdePkg/Include/Library/DxeServicesLib.h >> index 7c1c62236d96..20aee68af558 100644 >> --- a/MdePkg/Include/Library/DxeServicesLib.h >> +++ b/MdePkg/Include/Library/DxeServicesLib.h >> @@ -305,5 +305,26 @@ GetFileDevicePathFromAnyFv ( >> OUT EFI_DEVICE_PATH_PROTOCOL **FvFileDevicePath >> ); >> >> -#endif >> +/** >> + Allocates one or more 4KB pages of a given type from a memory region >that is >> + accessible to PEI. >> + >> + Allocates the number of 4KB pages of type 'MemoryType' and returns a >> + pointer to the allocated buffer. The buffer returned is aligned on a 4KB >> + boundary. If Pages is 0, then NULL is returned. If there is not enough >> + memory remaining to satisfy the request, then NULL is returned. >> >> + @param[in] MemoryType The memory type to allocate >> + @param[in] Pages The number of 4 KB pages to allocate. >> + >> + @return A pointer to the allocated buffer or NULL if allocation fails. >> + >> +**/ >> +VOID * >> +EFIAPI >> +AllocatePeiAccessiblePages ( >> + IN EFI_MEMORY_TYPE MemoryType, >> + IN UINTN Pages >> + ); >> + >> +#endif >> diff --git a/MdePkg/Library/DxeServicesLib/Allocate.c >b/MdePkg/Library/DxeServicesLib/Allocate.c >> new file mode 100644 >> index 000000000000..4d118f766d49 >> --- /dev/null >> +++ b/MdePkg/Library/DxeServicesLib/Allocate.c >> @@ -0,0 +1,54 @@ >> +/** @file >> + DxeServicesLib memory allocation routines >> + >> + Copyright (c) 2018, Linaro, Ltd. All rights reserved.<BR> >> + >> + This program and the accompanying materials are licensed and made >available >> + under the terms and conditions of the BSD License which accompanies >this >> + distribution. The full text of the license may be found at >> + http://opensource.org/licenses/bsd-license.php. >> + >> + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" >BASIS, >> + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER >EXPRESS OR IMPLIED. >> + >> +**/ >> + >> +#include <PiDxe.h> >> +#include <Library/UefiBootServicesTableLib.h> >> +#include <Library/DxeServicesLib.h> >> + >> +/** >> + Allocates one or more 4KB pages of a given type from a memory region >that is >> + accessible to PEI. >> + >> + Allocates the number of 4KB pages of type 'MemoryType' and returns a >> + pointer to the allocated buffer. The buffer returned is aligned on a 4KB >> + boundary. If Pages is 0, then NULL is returned. If there is not enough >> + memory remaining to satisfy the request, then NULL is returned. >> + >> + @param[in] MemoryType The memory type to allocate >> + @param[in] Pages The number of 4 KB pages to allocate. >> + >> + @return A pointer to the allocated buffer or NULL if allocation fails. >> + >> +**/ >> +VOID * >> +EFIAPI >> +AllocatePeiAccessiblePages ( >> + IN EFI_MEMORY_TYPE MemoryType, >> + IN UINTN Pages >> + ) >> +{ >> + EFI_STATUS Status; >> + EFI_PHYSICAL_ADDRESS Memory; >> + >> + if (Pages == 0) { >> + return NULL; >> + } >> + >> + Status = gBS->AllocatePages (AllocateAnyPages, MemoryType, Pages, >&Memory); >> + if (EFI_ERROR (Status)) { >> + return NULL; >> + } >> + return (VOID *)(UINTN)Memory; >> +} >> diff --git a/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf >b/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf >> index bd2faf2f6f2d..50ae24f8ee22 100644 >> --- a/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf >> +++ b/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf >> @@ -27,12 +27,18 @@ [Defines] >> LIBRARY_CLASS = DxeServicesLib|DXE_CORE DXE_DRIVER >DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER SMM_CORE >UEFI_APPLICATION UEFI_DRIVER >> >> # >> -# VALID_ARCHITECTURES = IA32 X64 IPF EBC >> +# VALID_ARCHITECTURES = IA32 X64 IPF EBC ARM AARCH64 >> # >> >> [Sources] >> DxeServicesLib.c >> >> +[Sources.IA32, Sources.IPF, Sources.EBC, Sources.ARM, Sources.AARCH64] >> + Allocate.c >> + >> +[Sources.X64] >> + X64/Allocate.c >> + >> [Packages] >> MdePkg/MdePkg.dec >> >> @@ -44,6 +50,9 @@ [LibraryClasses] >> UefiLib >> UefiBootServicesTableLib >> >> +[LibraryClasses.X64] >> + HobLib >> + >> [Guids] >> gEfiFileInfoGuid ## SOMETIMES_CONSUMES ## UNDEFINED >> >> diff --git a/MdePkg/Library/DxeServicesLib/X64/Allocate.c >b/MdePkg/Library/DxeServicesLib/X64/Allocate.c >> new file mode 100644 >> index 000000000000..b6d34ba20881 >> --- /dev/null >> +++ b/MdePkg/Library/DxeServicesLib/X64/Allocate.c >> @@ -0,0 +1,69 @@ >> +/** @file >> + DxeServicesLib memory allocation routines >> + >> + Copyright (c) 2018, Linaro, Ltd. All rights reserved.<BR> >> + >> + This program and the accompanying materials are licensed and made >available >> + under the terms and conditions of the BSD License which accompanies >this >> + distribution. The full text of the license may be found at >> + http://opensource.org/licenses/bsd-license.php. >> + >> + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" >BASIS, >> + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER >EXPRESS OR IMPLIED. >> + >> +**/ >> + >> +#include <PiDxe.h> >> +#include <Library/HobLib.h> >> +#include <Library/UefiBootServicesTableLib.h> >> +#include <Library/DxeServicesLib.h> >> + >> +/** >> + Allocates one or more 4KB pages of a given type from a memory region >that is >> + accessible to PEI. >> + >> + Allocates the number of 4KB pages of type 'MemoryType' and returns a >> + pointer to the allocated buffer. The buffer returned is aligned on a 4KB >> + boundary. If Pages is 0, then NULL is returned. If there is not enough >> + memory remaining to satisfy the request, then NULL is returned. >> + >> + @param[in] MemoryType The memory type to allocate >> + @param[in] Pages The number of 4 KB pages to allocate. >> + >> + @return A pointer to the allocated buffer or NULL if allocation fails. >> + >> +**/ >> +VOID * >> +EFIAPI >> +AllocatePeiAccessiblePages ( >> + IN EFI_MEMORY_TYPE MemoryType, >> + IN UINTN Pages >> + ) >> +{ >> + EFI_STATUS Status; >> + EFI_ALLOCATE_TYPE AllocType; >> + EFI_PHYSICAL_ADDRESS Memory; >> + EFI_HOB_HANDOFF_INFO_TABLE *PhitHob; >> + >> + if (Pages == 0) { >> + return NULL; >> + } >> + >> + AllocType = AllocateAnyPages; >> + // >> + // A X64 build of DXE may be combined with a 32-bit build of PEI, and so >we >> + // need to check the memory limit set by PEI, and allocate below 4 GB if >the >> + // limit is set to 4 GB or lower. >> + // >> + PhitHob = (EFI_HOB_HANDOFF_INFO_TABLE *)GetHobList (); >> + if (PhitHob->EfiFreeMemoryTop <= MAX_UINT32) { >> + AllocType = AllocateMaxAddress; >> + Memory = MAX_UINT32; >> + } >> + >> + Status = gBS->AllocatePages (AllocType, MemoryType, Pages, &Memory); >> + if (EFI_ERROR (Status)) { >> + return NULL; >> + } >> + return (VOID *)(UINTN)Memory; >> +} >> > >_______________________________________________ >edk2-devel mailing list >edk2-devel@lists.01.org >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
Maybe " be accessible by PEI after a warm reboot or S3" ? We may want to consider Capsule Update case. > -----Original Message----- > From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of Zeng, > Star > Sent: Monday, May 28, 2018 6:37 PM > To: Ard Biesheuvel <ard.biesheuvel@linaro.org>; edk2-devel@lists.01.org > Cc: Zeng, Star <star.zeng@intel.com> > Subject: Re: [edk2] [PATCH v3 3/5] MdePkg/DxeServicesLib: introduce > AllocatePeiAccessiblePages routine > > I think " be accessible by PEI after a warm reboot " should be " be accessible by > PEI after resuming from S3 ". > You can update it when pushing without need to send a new patch if other has > no comment to the code part. > > > Thanks, > Star > -----Original Message----- > From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of Ard > Biesheuvel > Sent: Monday, May 28, 2018 10:40 PM > To: edk2-devel@lists.01.org > Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> > Subject: [edk2] [PATCH v3 3/5] MdePkg/DxeServicesLib: introduce > AllocatePeiAccessiblePages routine > > Add a routine to DxeServicesLib that abstracts the allocation of memory > that should be accessible by PEI after a warm reboot. We will use it to > replace open coded implementations that limit the address to < 4 GB, > which may not be possible on non-Intel systems that have no 32-bit > addressable memory at all. > > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> > --- > MdePkg/Include/Library/DxeServicesLib.h | 23 ++++++- > MdePkg/Library/DxeServicesLib/Allocate.c | 54 +++++++++++++++ > MdePkg/Library/DxeServicesLib/DxeServicesLib.inf | 11 +++- > MdePkg/Library/DxeServicesLib/X64/Allocate.c | 69 > ++++++++++++++++++++ > 4 files changed, 155 insertions(+), 2 deletions(-) > > diff --git a/MdePkg/Include/Library/DxeServicesLib.h > b/MdePkg/Include/Library/DxeServicesLib.h > index 7c1c62236d96..20aee68af558 100644 > --- a/MdePkg/Include/Library/DxeServicesLib.h > +++ b/MdePkg/Include/Library/DxeServicesLib.h > @@ -305,5 +305,26 @@ GetFileDevicePathFromAnyFv ( > OUT EFI_DEVICE_PATH_PROTOCOL **FvFileDevicePath > ); > > -#endif > +/** > + Allocates one or more 4KB pages of a given type from a memory region that > is > + accessible to PEI. > + > + Allocates the number of 4KB pages of type 'MemoryType' and returns a > + pointer to the allocated buffer. The buffer returned is aligned on a 4KB > + boundary. If Pages is 0, then NULL is returned. If there is not enough > + memory remaining to satisfy the request, then NULL is returned. > > + @param[in] MemoryType The memory type to allocate > + @param[in] Pages The number of 4 KB pages to > allocate. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +AllocatePeiAccessiblePages ( > + IN EFI_MEMORY_TYPE MemoryType, > + IN UINTN Pages > + ); > + > +#endif > diff --git a/MdePkg/Library/DxeServicesLib/Allocate.c > b/MdePkg/Library/DxeServicesLib/Allocate.c > new file mode 100644 > index 000000000000..4d118f766d49 > --- /dev/null > +++ b/MdePkg/Library/DxeServicesLib/Allocate.c > @@ -0,0 +1,54 @@ > +/** @file > + DxeServicesLib memory allocation routines > + > + Copyright (c) 2018, Linaro, Ltd. All rights reserved.<BR> > + > + This program and the accompanying materials are licensed and made > available > + under the terms and conditions of the BSD License which accompanies this > + distribution. The full text of the license may be found at > + http://opensource.org/licenses/bsd-license.php. > + > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > + > +**/ > + > +#include <PiDxe.h> > +#include <Library/UefiBootServicesTableLib.h> > +#include <Library/DxeServicesLib.h> > + > +/** > + Allocates one or more 4KB pages of a given type from a memory region that > is > + accessible to PEI. > + > + Allocates the number of 4KB pages of type 'MemoryType' and returns a > + pointer to the allocated buffer. The buffer returned is aligned on a 4KB > + boundary. If Pages is 0, then NULL is returned. If there is not enough > + memory remaining to satisfy the request, then NULL is returned. > + > + @param[in] MemoryType The memory type to allocate > + @param[in] Pages The number of 4 KB pages to > allocate. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +AllocatePeiAccessiblePages ( > + IN EFI_MEMORY_TYPE MemoryType, > + IN UINTN Pages > + ) > +{ > + EFI_STATUS Status; > + EFI_PHYSICAL_ADDRESS Memory; > + > + if (Pages == 0) { > + return NULL; > + } > + > + Status = gBS->AllocatePages (AllocateAnyPages, MemoryType, Pages, > &Memory); > + if (EFI_ERROR (Status)) { > + return NULL; > + } > + return (VOID *)(UINTN)Memory; > +} > diff --git a/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf > b/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf > index bd2faf2f6f2d..50ae24f8ee22 100644 > --- a/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf > +++ b/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf > @@ -27,12 +27,18 @@ [Defines] > LIBRARY_CLASS = DxeServicesLib|DXE_CORE > DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER > SMM_CORE UEFI_APPLICATION UEFI_DRIVER > > # > -# VALID_ARCHITECTURES = IA32 X64 IPF EBC > +# VALID_ARCHITECTURES = IA32 X64 IPF EBC ARM AARCH64 > # > > [Sources] > DxeServicesLib.c > > +[Sources.IA32, Sources.IPF, Sources.EBC, Sources.ARM, Sources.AARCH64] > + Allocate.c > + > +[Sources.X64] > + X64/Allocate.c > + > [Packages] > MdePkg/MdePkg.dec > > @@ -44,6 +50,9 @@ [LibraryClasses] > UefiLib > UefiBootServicesTableLib > > +[LibraryClasses.X64] > + HobLib > + > [Guids] > gEfiFileInfoGuid ## > SOMETIMES_CONSUMES ## UNDEFINED > > diff --git a/MdePkg/Library/DxeServicesLib/X64/Allocate.c > b/MdePkg/Library/DxeServicesLib/X64/Allocate.c > new file mode 100644 > index 000000000000..b6d34ba20881 > --- /dev/null > +++ b/MdePkg/Library/DxeServicesLib/X64/Allocate.c > @@ -0,0 +1,69 @@ > +/** @file > + DxeServicesLib memory allocation routines > + > + Copyright (c) 2018, Linaro, Ltd. All rights reserved.<BR> > + > + This program and the accompanying materials are licensed and made > available > + under the terms and conditions of the BSD License which accompanies this > + distribution. The full text of the license may be found at > + http://opensource.org/licenses/bsd-license.php. > + > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > + > +**/ > + > +#include <PiDxe.h> > +#include <Library/HobLib.h> > +#include <Library/UefiBootServicesTableLib.h> > +#include <Library/DxeServicesLib.h> > + > +/** > + Allocates one or more 4KB pages of a given type from a memory region that > is > + accessible to PEI. > + > + Allocates the number of 4KB pages of type 'MemoryType' and returns a > + pointer to the allocated buffer. The buffer returned is aligned on a 4KB > + boundary. If Pages is 0, then NULL is returned. If there is not enough > + memory remaining to satisfy the request, then NULL is returned. > + > + @param[in] MemoryType The memory type to allocate > + @param[in] Pages The number of 4 KB pages to > allocate. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +AllocatePeiAccessiblePages ( > + IN EFI_MEMORY_TYPE MemoryType, > + IN UINTN Pages > + ) > +{ > + EFI_STATUS Status; > + EFI_ALLOCATE_TYPE AllocType; > + EFI_PHYSICAL_ADDRESS Memory; > + EFI_HOB_HANDOFF_INFO_TABLE *PhitHob; > + > + if (Pages == 0) { > + return NULL; > + } > + > + AllocType = AllocateAnyPages; > + // > + // A X64 build of DXE may be combined with a 32-bit build of PEI, and so we > + // need to check the memory limit set by PEI, and allocate below 4 GB if the > + // limit is set to 4 GB or lower. > + // > + PhitHob = (EFI_HOB_HANDOFF_INFO_TABLE *)GetHobList (); > + if (PhitHob->EfiFreeMemoryTop <= MAX_UINT32) { > + AllocType = AllocateMaxAddress; > + Memory = MAX_UINT32; > + } > + > + Status = gBS->AllocatePages (AllocType, MemoryType, Pages, &Memory); > + if (EFI_ERROR (Status)) { > + return NULL; > + } > + return (VOID *)(UINTN)Memory; > +} > -- > 2.17.0 > > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > 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 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel
Jiewen, I do not think this service applies to the capsule use cases. A capsule sent at OS runtime can be placed anywhere in memory by the OS. The OS does not know what memory PEI can easily access or not. The main PEI requirement is to not corrupt capsules in memory. Mike > -----Original Message----- > From: edk2-devel [mailto:edk2-devel- > bounces@lists.01.org] On Behalf Of Yao, Jiewen > Sent: Tuesday, May 29, 2018 8:19 AM > To: Zeng, Star <star.zeng@intel.com>; Ard Biesheuvel > <ard.biesheuvel@linaro.org>; edk2-devel@lists.01.org > Cc: Zeng, Star <star.zeng@intel.com> > Subject: Re: [edk2] [PATCH v3 3/5] > MdePkg/DxeServicesLib: introduce > AllocatePeiAccessiblePages routine > > Maybe " be accessible by PEI after a warm reboot or S3" > ? > > We may want to consider Capsule Update case. > > > > -----Original Message----- > > From: edk2-devel [mailto:edk2-devel- > bounces@lists.01.org] On Behalf Of Zeng, > > Star > > Sent: Monday, May 28, 2018 6:37 PM > > To: Ard Biesheuvel <ard.biesheuvel@linaro.org>; edk2- > devel@lists.01.org > > Cc: Zeng, Star <star.zeng@intel.com> > > Subject: Re: [edk2] [PATCH v3 3/5] > MdePkg/DxeServicesLib: introduce > > AllocatePeiAccessiblePages routine > > > > I think " be accessible by PEI after a warm reboot " > should be " be accessible by > > PEI after resuming from S3 ". > > You can update it when pushing without need to send a > new patch if other has > > no comment to the code part. > > > > > > Thanks, > > Star > > -----Original Message----- > > From: edk2-devel [mailto:edk2-devel- > bounces@lists.01.org] On Behalf Of Ard > > Biesheuvel > > Sent: Monday, May 28, 2018 10:40 PM > > To: edk2-devel@lists.01.org > > Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> > > Subject: [edk2] [PATCH v3 3/5] MdePkg/DxeServicesLib: > introduce > > AllocatePeiAccessiblePages routine > > > > Add a routine to DxeServicesLib that abstracts the > allocation of memory > > that should be accessible by PEI after a warm reboot. > We will use it to > > replace open coded implementations that limit the > address to < 4 GB, > > which may not be possible on non-Intel systems that > have no 32-bit > > addressable memory at all. > > > > Contributed-under: TianoCore Contribution Agreement > 1.1 > > Signed-off-by: Ard Biesheuvel > <ard.biesheuvel@linaro.org> > > --- > > MdePkg/Include/Library/DxeServicesLib.h | 23 > ++++++- > > MdePkg/Library/DxeServicesLib/Allocate.c | 54 > +++++++++++++++ > > MdePkg/Library/DxeServicesLib/DxeServicesLib.inf | 11 > +++- > > MdePkg/Library/DxeServicesLib/X64/Allocate.c | 69 > > ++++++++++++++++++++ > > 4 files changed, 155 insertions(+), 2 deletions(-) > > > > diff --git a/MdePkg/Include/Library/DxeServicesLib.h > > b/MdePkg/Include/Library/DxeServicesLib.h > > index 7c1c62236d96..20aee68af558 100644 > > --- a/MdePkg/Include/Library/DxeServicesLib.h > > +++ b/MdePkg/Include/Library/DxeServicesLib.h > > @@ -305,5 +305,26 @@ GetFileDevicePathFromAnyFv ( > > OUT EFI_DEVICE_PATH_PROTOCOL > **FvFileDevicePath > > ); > > > > -#endif > > +/** > > + Allocates one or more 4KB pages of a given type > from a memory region that > > is > > + accessible to PEI. > > + > > + Allocates the number of 4KB pages of type > 'MemoryType' and returns a > > + pointer to the allocated buffer. The buffer > returned is aligned on a 4KB > > + boundary. If Pages is 0, then NULL is returned. > If there is not enough > > + memory remaining to satisfy the request, then NULL > is returned. > > > > + @param[in] MemoryType The memory type > to allocate > > + @param[in] Pages The number of 4 > KB pages to > > allocate. > > + > > + @return A pointer to the allocated buffer or NULL > if allocation fails. > > + > > +**/ > > +VOID * > > +EFIAPI > > +AllocatePeiAccessiblePages ( > > + IN EFI_MEMORY_TYPE MemoryType, > > + IN UINTN Pages > > + ); > > + > > +#endif > > diff --git a/MdePkg/Library/DxeServicesLib/Allocate.c > > b/MdePkg/Library/DxeServicesLib/Allocate.c > > new file mode 100644 > > index 000000000000..4d118f766d49 > > --- /dev/null > > +++ b/MdePkg/Library/DxeServicesLib/Allocate.c > > @@ -0,0 +1,54 @@ > > +/** @file > > + DxeServicesLib memory allocation routines > > + > > + Copyright (c) 2018, Linaro, Ltd. All rights > reserved.<BR> > > + > > + This program and the accompanying materials are > licensed and made > > available > > + under the terms and conditions of the BSD License > which accompanies this > > + distribution. The full text of the license may be > found at > > + http://opensource.org/licenses/bsd-license.php. > > + > > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON > AN "AS IS" > > BASIS, > > + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, > EITHER > > EXPRESS OR IMPLIED. > > + > > +**/ > > + > > +#include <PiDxe.h> > > +#include <Library/UefiBootServicesTableLib.h> > > +#include <Library/DxeServicesLib.h> > > + > > +/** > > + Allocates one or more 4KB pages of a given type > from a memory region that > > is > > + accessible to PEI. > > + > > + Allocates the number of 4KB pages of type > 'MemoryType' and returns a > > + pointer to the allocated buffer. The buffer > returned is aligned on a 4KB > > + boundary. If Pages is 0, then NULL is returned. > If there is not enough > > + memory remaining to satisfy the request, then NULL > is returned. > > + > > + @param[in] MemoryType The memory type > to allocate > > + @param[in] Pages The number of 4 > KB pages to > > allocate. > > + > > + @return A pointer to the allocated buffer or NULL > if allocation fails. > > + > > +**/ > > +VOID * > > +EFIAPI > > +AllocatePeiAccessiblePages ( > > + IN EFI_MEMORY_TYPE MemoryType, > > + IN UINTN Pages > > + ) > > +{ > > + EFI_STATUS Status; > > + EFI_PHYSICAL_ADDRESS Memory; > > + > > + if (Pages == 0) { > > + return NULL; > > + } > > + > > + Status = gBS->AllocatePages (AllocateAnyPages, > MemoryType, Pages, > > &Memory); > > + if (EFI_ERROR (Status)) { > > + return NULL; > > + } > > + return (VOID *)(UINTN)Memory; > > +} > > diff --git > a/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf > > b/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf > > index bd2faf2f6f2d..50ae24f8ee22 100644 > > --- a/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf > > +++ b/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf > > @@ -27,12 +27,18 @@ [Defines] > > LIBRARY_CLASS = > DxeServicesLib|DXE_CORE > > DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SAL_DRIVER > DXE_SMM_DRIVER > > SMM_CORE UEFI_APPLICATION UEFI_DRIVER > > > > # > > -# VALID_ARCHITECTURES = IA32 X64 IPF EBC > > +# VALID_ARCHITECTURES = IA32 X64 IPF EBC > ARM AARCH64 > > # > > > > [Sources] > > DxeServicesLib.c > > > > +[Sources.IA32, Sources.IPF, Sources.EBC, Sources.ARM, > Sources.AARCH64] > > + Allocate.c > > + > > +[Sources.X64] > > + X64/Allocate.c > > + > > [Packages] > > MdePkg/MdePkg.dec > > > > @@ -44,6 +50,9 @@ [LibraryClasses] > > UefiLib > > UefiBootServicesTableLib > > > > +[LibraryClasses.X64] > > + HobLib > > + > > [Guids] > > gEfiFileInfoGuid ## > > SOMETIMES_CONSUMES ## UNDEFINED > > > > diff --git > a/MdePkg/Library/DxeServicesLib/X64/Allocate.c > > b/MdePkg/Library/DxeServicesLib/X64/Allocate.c > > new file mode 100644 > > index 000000000000..b6d34ba20881 > > --- /dev/null > > +++ b/MdePkg/Library/DxeServicesLib/X64/Allocate.c > > @@ -0,0 +1,69 @@ > > +/** @file > > + DxeServicesLib memory allocation routines > > + > > + Copyright (c) 2018, Linaro, Ltd. All rights > reserved.<BR> > > + > > + This program and the accompanying materials are > licensed and made > > available > > + under the terms and conditions of the BSD License > which accompanies this > > + distribution. The full text of the license may be > found at > > + http://opensource.org/licenses/bsd-license.php. > > + > > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON > AN "AS IS" > > BASIS, > > + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, > EITHER > > EXPRESS OR IMPLIED. > > + > > +**/ > > + > > +#include <PiDxe.h> > > +#include <Library/HobLib.h> > > +#include <Library/UefiBootServicesTableLib.h> > > +#include <Library/DxeServicesLib.h> > > + > > +/** > > + Allocates one or more 4KB pages of a given type > from a memory region that > > is > > + accessible to PEI. > > + > > + Allocates the number of 4KB pages of type > 'MemoryType' and returns a > > + pointer to the allocated buffer. The buffer > returned is aligned on a 4KB > > + boundary. If Pages is 0, then NULL is returned. > If there is not enough > > + memory remaining to satisfy the request, then NULL > is returned. > > + > > + @param[in] MemoryType The memory type > to allocate > > + @param[in] Pages The number of 4 > KB pages to > > allocate. > > + > > + @return A pointer to the allocated buffer or NULL > if allocation fails. > > + > > +**/ > > +VOID * > > +EFIAPI > > +AllocatePeiAccessiblePages ( > > + IN EFI_MEMORY_TYPE MemoryType, > > + IN UINTN Pages > > + ) > > +{ > > + EFI_STATUS Status; > > + EFI_ALLOCATE_TYPE AllocType; > > + EFI_PHYSICAL_ADDRESS Memory; > > + EFI_HOB_HANDOFF_INFO_TABLE *PhitHob; > > + > > + if (Pages == 0) { > > + return NULL; > > + } > > + > > + AllocType = AllocateAnyPages; > > + // > > + // A X64 build of DXE may be combined with a 32-bit > build of PEI, and so we > > + // need to check the memory limit set by PEI, and > allocate below 4 GB if the > > + // limit is set to 4 GB or lower. > > + // > > + PhitHob = (EFI_HOB_HANDOFF_INFO_TABLE *)GetHobList > (); > > + if (PhitHob->EfiFreeMemoryTop <= MAX_UINT32) { > > + AllocType = AllocateMaxAddress; > > + Memory = MAX_UINT32; > > + } > > + > > + Status = gBS->AllocatePages (AllocType, MemoryType, > Pages, &Memory); > > + if (EFI_ERROR (Status)) { > > + return NULL; > > + } > > + return (VOID *)(UINTN)Memory; > > +} > > -- > > 2.17.0 > > > > _______________________________________________ > > edk2-devel mailing list > > edk2-devel@lists.01.org > > 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 > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > 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
Mike Please refer to https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Universal/CapsuleRuntimeDxe/X64/SaveLongModeContext.c It uses AllocateReservedMemoryBelow4G() for the context accessed in PEI. Thank you Yao Jiewen > -----Original Message----- > From: Kinney, Michael D > Sent: Tuesday, May 29, 2018 8:31 AM > To: Yao, Jiewen <jiewen.yao@intel.com>; Zeng, Star <star.zeng@intel.com>; Ard > Biesheuvel <ard.biesheuvel@linaro.org>; edk2-devel@lists.01.org; Kinney, > Michael D <michael.d.kinney@intel.com> > Cc: Zeng, Star <star.zeng@intel.com> > Subject: RE: [edk2] [PATCH v3 3/5] MdePkg/DxeServicesLib: introduce > AllocatePeiAccessiblePages routine > > Jiewen, > > I do not think this service applies to the capsule > use cases. > > A capsule sent at OS runtime can be placed anywhere > in memory by the OS. The OS does not know what > memory PEI can easily access or not. > > The main PEI requirement is to not corrupt capsules > in memory. > > Mike > > > -----Original Message----- > > From: edk2-devel [mailto:edk2-devel- > > bounces@lists.01.org] On Behalf Of Yao, Jiewen > > Sent: Tuesday, May 29, 2018 8:19 AM > > To: Zeng, Star <star.zeng@intel.com>; Ard Biesheuvel > > <ard.biesheuvel@linaro.org>; edk2-devel@lists.01.org > > Cc: Zeng, Star <star.zeng@intel.com> > > Subject: Re: [edk2] [PATCH v3 3/5] > > MdePkg/DxeServicesLib: introduce > > AllocatePeiAccessiblePages routine > > > > Maybe " be accessible by PEI after a warm reboot or S3" > > ? > > > > We may want to consider Capsule Update case. > > > > > > > -----Original Message----- > > > From: edk2-devel [mailto:edk2-devel- > > bounces@lists.01.org] On Behalf Of Zeng, > > > Star > > > Sent: Monday, May 28, 2018 6:37 PM > > > To: Ard Biesheuvel <ard.biesheuvel@linaro.org>; edk2- > > devel@lists.01.org > > > Cc: Zeng, Star <star.zeng@intel.com> > > > Subject: Re: [edk2] [PATCH v3 3/5] > > MdePkg/DxeServicesLib: introduce > > > AllocatePeiAccessiblePages routine > > > > > > I think " be accessible by PEI after a warm reboot " > > should be " be accessible by > > > PEI after resuming from S3 ". > > > You can update it when pushing without need to send a > > new patch if other has > > > no comment to the code part. > > > > > > > > > Thanks, > > > Star > > > -----Original Message----- > > > From: edk2-devel [mailto:edk2-devel- > > bounces@lists.01.org] On Behalf Of Ard > > > Biesheuvel > > > Sent: Monday, May 28, 2018 10:40 PM > > > To: edk2-devel@lists.01.org > > > Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> > > > Subject: [edk2] [PATCH v3 3/5] MdePkg/DxeServicesLib: > > introduce > > > AllocatePeiAccessiblePages routine > > > > > > Add a routine to DxeServicesLib that abstracts the > > allocation of memory > > > that should be accessible by PEI after a warm reboot. > > We will use it to > > > replace open coded implementations that limit the > > address to < 4 GB, > > > which may not be possible on non-Intel systems that > > have no 32-bit > > > addressable memory at all. > > > > > > Contributed-under: TianoCore Contribution Agreement > > 1.1 > > > Signed-off-by: Ard Biesheuvel > > <ard.biesheuvel@linaro.org> > > > --- > > > MdePkg/Include/Library/DxeServicesLib.h | 23 > > ++++++- > > > MdePkg/Library/DxeServicesLib/Allocate.c | 54 > > +++++++++++++++ > > > MdePkg/Library/DxeServicesLib/DxeServicesLib.inf | 11 > > +++- > > > MdePkg/Library/DxeServicesLib/X64/Allocate.c | 69 > > > ++++++++++++++++++++ > > > 4 files changed, 155 insertions(+), 2 deletions(-) > > > > > > diff --git a/MdePkg/Include/Library/DxeServicesLib.h > > > b/MdePkg/Include/Library/DxeServicesLib.h > > > index 7c1c62236d96..20aee68af558 100644 > > > --- a/MdePkg/Include/Library/DxeServicesLib.h > > > +++ b/MdePkg/Include/Library/DxeServicesLib.h > > > @@ -305,5 +305,26 @@ GetFileDevicePathFromAnyFv ( > > > OUT EFI_DEVICE_PATH_PROTOCOL > > **FvFileDevicePath > > > ); > > > > > > -#endif > > > +/** > > > + Allocates one or more 4KB pages of a given type > > from a memory region that > > > is > > > + accessible to PEI. > > > + > > > + Allocates the number of 4KB pages of type > > 'MemoryType' and returns a > > > + pointer to the allocated buffer. The buffer > > returned is aligned on a 4KB > > > + boundary. If Pages is 0, then NULL is returned. > > If there is not enough > > > + memory remaining to satisfy the request, then NULL > > is returned. > > > > > > + @param[in] MemoryType The memory type > > to allocate > > > + @param[in] Pages The number of 4 > > KB pages to > > > allocate. > > > + > > > + @return A pointer to the allocated buffer or NULL > > if allocation fails. > > > + > > > +**/ > > > +VOID * > > > +EFIAPI > > > +AllocatePeiAccessiblePages ( > > > + IN EFI_MEMORY_TYPE MemoryType, > > > + IN UINTN Pages > > > + ); > > > + > > > +#endif > > > diff --git a/MdePkg/Library/DxeServicesLib/Allocate.c > > > b/MdePkg/Library/DxeServicesLib/Allocate.c > > > new file mode 100644 > > > index 000000000000..4d118f766d49 > > > --- /dev/null > > > +++ b/MdePkg/Library/DxeServicesLib/Allocate.c > > > @@ -0,0 +1,54 @@ > > > +/** @file > > > + DxeServicesLib memory allocation routines > > > + > > > + Copyright (c) 2018, Linaro, Ltd. All rights > > reserved.<BR> > > > + > > > + This program and the accompanying materials are > > licensed and made > > > available > > > + under the terms and conditions of the BSD License > > which accompanies this > > > + distribution. The full text of the license may be > > found at > > > + http://opensource.org/licenses/bsd-license.php. > > > + > > > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON > > AN "AS IS" > > > BASIS, > > > + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, > > EITHER > > > EXPRESS OR IMPLIED. > > > + > > > +**/ > > > + > > > +#include <PiDxe.h> > > > +#include <Library/UefiBootServicesTableLib.h> > > > +#include <Library/DxeServicesLib.h> > > > + > > > +/** > > > + Allocates one or more 4KB pages of a given type > > from a memory region that > > > is > > > + accessible to PEI. > > > + > > > + Allocates the number of 4KB pages of type > > 'MemoryType' and returns a > > > + pointer to the allocated buffer. The buffer > > returned is aligned on a 4KB > > > + boundary. If Pages is 0, then NULL is returned. > > If there is not enough > > > + memory remaining to satisfy the request, then NULL > > is returned. > > > + > > > + @param[in] MemoryType The memory type > > to allocate > > > + @param[in] Pages The number of 4 > > KB pages to > > > allocate. > > > + > > > + @return A pointer to the allocated buffer or NULL > > if allocation fails. > > > + > > > +**/ > > > +VOID * > > > +EFIAPI > > > +AllocatePeiAccessiblePages ( > > > + IN EFI_MEMORY_TYPE MemoryType, > > > + IN UINTN Pages > > > + ) > > > +{ > > > + EFI_STATUS Status; > > > + EFI_PHYSICAL_ADDRESS Memory; > > > + > > > + if (Pages == 0) { > > > + return NULL; > > > + } > > > + > > > + Status = gBS->AllocatePages (AllocateAnyPages, > > MemoryType, Pages, > > > &Memory); > > > + if (EFI_ERROR (Status)) { > > > + return NULL; > > > + } > > > + return (VOID *)(UINTN)Memory; > > > +} > > > diff --git > > a/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf > > > b/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf > > > index bd2faf2f6f2d..50ae24f8ee22 100644 > > > --- a/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf > > > +++ b/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf > > > @@ -27,12 +27,18 @@ [Defines] > > > LIBRARY_CLASS = > > DxeServicesLib|DXE_CORE > > > DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SAL_DRIVER > > DXE_SMM_DRIVER > > > SMM_CORE UEFI_APPLICATION UEFI_DRIVER > > > > > > # > > > -# VALID_ARCHITECTURES = IA32 X64 IPF EBC > > > +# VALID_ARCHITECTURES = IA32 X64 IPF EBC > > ARM AARCH64 > > > # > > > > > > [Sources] > > > DxeServicesLib.c > > > > > > +[Sources.IA32, Sources.IPF, Sources.EBC, Sources.ARM, > > Sources.AARCH64] > > > + Allocate.c > > > + > > > +[Sources.X64] > > > + X64/Allocate.c > > > + > > > [Packages] > > > MdePkg/MdePkg.dec > > > > > > @@ -44,6 +50,9 @@ [LibraryClasses] > > > UefiLib > > > UefiBootServicesTableLib > > > > > > +[LibraryClasses.X64] > > > + HobLib > > > + > > > [Guids] > > > gEfiFileInfoGuid ## > > > SOMETIMES_CONSUMES ## UNDEFINED > > > > > > diff --git > > a/MdePkg/Library/DxeServicesLib/X64/Allocate.c > > > b/MdePkg/Library/DxeServicesLib/X64/Allocate.c > > > new file mode 100644 > > > index 000000000000..b6d34ba20881 > > > --- /dev/null > > > +++ b/MdePkg/Library/DxeServicesLib/X64/Allocate.c > > > @@ -0,0 +1,69 @@ > > > +/** @file > > > + DxeServicesLib memory allocation routines > > > + > > > + Copyright (c) 2018, Linaro, Ltd. All rights > > reserved.<BR> > > > + > > > + This program and the accompanying materials are > > licensed and made > > > available > > > + under the terms and conditions of the BSD License > > which accompanies this > > > + distribution. The full text of the license may be > > found at > > > + http://opensource.org/licenses/bsd-license.php. > > > + > > > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON > > AN "AS IS" > > > BASIS, > > > + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, > > EITHER > > > EXPRESS OR IMPLIED. > > > + > > > +**/ > > > + > > > +#include <PiDxe.h> > > > +#include <Library/HobLib.h> > > > +#include <Library/UefiBootServicesTableLib.h> > > > +#include <Library/DxeServicesLib.h> > > > + > > > +/** > > > + Allocates one or more 4KB pages of a given type > > from a memory region that > > > is > > > + accessible to PEI. > > > + > > > + Allocates the number of 4KB pages of type > > 'MemoryType' and returns a > > > + pointer to the allocated buffer. The buffer > > returned is aligned on a 4KB > > > + boundary. If Pages is 0, then NULL is returned. > > If there is not enough > > > + memory remaining to satisfy the request, then NULL > > is returned. > > > + > > > + @param[in] MemoryType The memory type > > to allocate > > > + @param[in] Pages The number of 4 > > KB pages to > > > allocate. > > > + > > > + @return A pointer to the allocated buffer or NULL > > if allocation fails. > > > + > > > +**/ > > > +VOID * > > > +EFIAPI > > > +AllocatePeiAccessiblePages ( > > > + IN EFI_MEMORY_TYPE MemoryType, > > > + IN UINTN Pages > > > + ) > > > +{ > > > + EFI_STATUS Status; > > > + EFI_ALLOCATE_TYPE AllocType; > > > + EFI_PHYSICAL_ADDRESS Memory; > > > + EFI_HOB_HANDOFF_INFO_TABLE *PhitHob; > > > + > > > + if (Pages == 0) { > > > + return NULL; > > > + } > > > + > > > + AllocType = AllocateAnyPages; > > > + // > > > + // A X64 build of DXE may be combined with a 32-bit > > build of PEI, and so we > > > + // need to check the memory limit set by PEI, and > > allocate below 4 GB if the > > > + // limit is set to 4 GB or lower. > > > + // > > > + PhitHob = (EFI_HOB_HANDOFF_INFO_TABLE *)GetHobList > > (); > > > + if (PhitHob->EfiFreeMemoryTop <= MAX_UINT32) { > > > + AllocType = AllocateMaxAddress; > > > + Memory = MAX_UINT32; > > > + } > > > + > > > + Status = gBS->AllocatePages (AllocType, MemoryType, > > Pages, &Memory); > > > + if (EFI_ERROR (Status)) { > > > + return NULL; > > > + } > > > + return (VOID *)(UINTN)Memory; > > > +} > > > -- > > > 2.17.0 > > > > > > _______________________________________________ > > > edk2-devel mailing list > > > edk2-devel@lists.01.org > > > 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 > > _______________________________________________ > > edk2-devel mailing list > > edk2-devel@lists.01.org > > 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
Jiewen, I see what you mean. It is not the submitting of capsules you are referring to. It is the processing if capsules in the PEI phase that depends on some things being setup in DXE phase and DXE phase needs to know if PEI is in IA32 mode. So I agree that the commit message could add capsule processing to the list of features that can use this new service. The logic in that file is using PcdDxeIplSwitchToLongMode. That PCD is TRUE when PEI is IA32 and DXE is X64. But it is ignored when PEI and DXE are both X64 and could be TRUE or FALSE. Is there a logic issue here with using that PCD when PEI and DXE are both X64? Thanks, Mike > -----Original Message----- > From: Yao, Jiewen > Sent: Tuesday, May 29, 2018 8:36 AM > To: Kinney, Michael D <michael.d.kinney@intel.com>; > Zeng, Star <star.zeng@intel.com>; Ard Biesheuvel > <ard.biesheuvel@linaro.org>; edk2-devel@lists.01.org > Cc: Zeng, Star <star.zeng@intel.com>; Yao, Jiewen > <jiewen.yao@intel.com> > Subject: RE: [edk2] [PATCH v3 3/5] > MdePkg/DxeServicesLib: introduce > AllocatePeiAccessiblePages routine > > Mike > Please refer to > https://github.com/tianocore/edk2/blob/master/MdeModuleP > kg/Universal/CapsuleRuntimeDxe/X64/SaveLongModeContext.c > > It uses AllocateReservedMemoryBelow4G() for the context > accessed in PEI. > > Thank you > Yao Jiewen > > > > -----Original Message----- > > From: Kinney, Michael D > > Sent: Tuesday, May 29, 2018 8:31 AM > > To: Yao, Jiewen <jiewen.yao@intel.com>; Zeng, Star > <star.zeng@intel.com>; Ard > > Biesheuvel <ard.biesheuvel@linaro.org>; edk2- > devel@lists.01.org; Kinney, > > Michael D <michael.d.kinney@intel.com> > > Cc: Zeng, Star <star.zeng@intel.com> > > Subject: RE: [edk2] [PATCH v3 3/5] > MdePkg/DxeServicesLib: introduce > > AllocatePeiAccessiblePages routine > > > > Jiewen, > > > > I do not think this service applies to the capsule > > use cases. > > > > A capsule sent at OS runtime can be placed anywhere > > in memory by the OS. The OS does not know what > > memory PEI can easily access or not. > > > > The main PEI requirement is to not corrupt capsules > > in memory. > > > > Mike > > > > > -----Original Message----- > > > From: edk2-devel [mailto:edk2-devel- > > > bounces@lists.01.org] On Behalf Of Yao, Jiewen > > > Sent: Tuesday, May 29, 2018 8:19 AM > > > To: Zeng, Star <star.zeng@intel.com>; Ard Biesheuvel > > > <ard.biesheuvel@linaro.org>; edk2-devel@lists.01.org > > > Cc: Zeng, Star <star.zeng@intel.com> > > > Subject: Re: [edk2] [PATCH v3 3/5] > > > MdePkg/DxeServicesLib: introduce > > > AllocatePeiAccessiblePages routine > > > > > > Maybe " be accessible by PEI after a warm reboot or > S3" > > > ? > > > > > > We may want to consider Capsule Update case. > > > > > > > > > > -----Original Message----- > > > > From: edk2-devel [mailto:edk2-devel- > > > bounces@lists.01.org] On Behalf Of Zeng, > > > > Star > > > > Sent: Monday, May 28, 2018 6:37 PM > > > > To: Ard Biesheuvel <ard.biesheuvel@linaro.org>; > edk2- > > > devel@lists.01.org > > > > Cc: Zeng, Star <star.zeng@intel.com> > > > > Subject: Re: [edk2] [PATCH v3 3/5] > > > MdePkg/DxeServicesLib: introduce > > > > AllocatePeiAccessiblePages routine > > > > > > > > I think " be accessible by PEI after a warm reboot > " > > > should be " be accessible by > > > > PEI after resuming from S3 ". > > > > You can update it when pushing without need to > send a > > > new patch if other has > > > > no comment to the code part. > > > > > > > > > > > > Thanks, > > > > Star > > > > -----Original Message----- > > > > From: edk2-devel [mailto:edk2-devel- > > > bounces@lists.01.org] On Behalf Of Ard > > > > Biesheuvel > > > > Sent: Monday, May 28, 2018 10:40 PM > > > > To: edk2-devel@lists.01.org > > > > Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> > > > > Subject: [edk2] [PATCH v3 3/5] > MdePkg/DxeServicesLib: > > > introduce > > > > AllocatePeiAccessiblePages routine > > > > > > > > Add a routine to DxeServicesLib that abstracts the > > > allocation of memory > > > > that should be accessible by PEI after a warm > reboot. > > > We will use it to > > > > replace open coded implementations that limit the > > > address to < 4 GB, > > > > which may not be possible on non-Intel systems > that > > > have no 32-bit > > > > addressable memory at all. > > > > > > > > Contributed-under: TianoCore Contribution > Agreement > > > 1.1 > > > > Signed-off-by: Ard Biesheuvel > > > <ard.biesheuvel@linaro.org> > > > > --- > > > > MdePkg/Include/Library/DxeServicesLib.h > | 23 > > > ++++++- > > > > MdePkg/Library/DxeServicesLib/Allocate.c > | 54 > > > +++++++++++++++ > > > > MdePkg/Library/DxeServicesLib/DxeServicesLib.inf > | 11 > > > +++- > > > > MdePkg/Library/DxeServicesLib/X64/Allocate.c > | 69 > > > > ++++++++++++++++++++ > > > > 4 files changed, 155 insertions(+), 2 deletions(- > ) > > > > > > > > diff --git > a/MdePkg/Include/Library/DxeServicesLib.h > > > > b/MdePkg/Include/Library/DxeServicesLib.h > > > > index 7c1c62236d96..20aee68af558 100644 > > > > --- a/MdePkg/Include/Library/DxeServicesLib.h > > > > +++ b/MdePkg/Include/Library/DxeServicesLib.h > > > > @@ -305,5 +305,26 @@ GetFileDevicePathFromAnyFv ( > > > > OUT EFI_DEVICE_PATH_PROTOCOL > > > **FvFileDevicePath > > > > ); > > > > > > > > -#endif > > > > +/** > > > > + Allocates one or more 4KB pages of a given type > > > from a memory region that > > > > is > > > > + accessible to PEI. > > > > + > > > > + Allocates the number of 4KB pages of type > > > 'MemoryType' and returns a > > > > + pointer to the allocated buffer. The buffer > > > returned is aligned on a 4KB > > > > + boundary. If Pages is 0, then NULL is > returned. > > > If there is not enough > > > > + memory remaining to satisfy the request, then > NULL > > > is returned. > > > > > > > > + @param[in] MemoryType The memory > type > > > to allocate > > > > + @param[in] Pages The number of > 4 > > > KB pages to > > > > allocate. > > > > + > > > > + @return A pointer to the allocated buffer or > NULL > > > if allocation fails. > > > > + > > > > +**/ > > > > +VOID * > > > > +EFIAPI > > > > +AllocatePeiAccessiblePages ( > > > > + IN EFI_MEMORY_TYPE MemoryType, > > > > + IN UINTN Pages > > > > + ); > > > > + > > > > +#endif > > > > diff --git > a/MdePkg/Library/DxeServicesLib/Allocate.c > > > > b/MdePkg/Library/DxeServicesLib/Allocate.c > > > > new file mode 100644 > > > > index 000000000000..4d118f766d49 > > > > --- /dev/null > > > > +++ b/MdePkg/Library/DxeServicesLib/Allocate.c > > > > @@ -0,0 +1,54 @@ > > > > +/** @file > > > > + DxeServicesLib memory allocation routines > > > > + > > > > + Copyright (c) 2018, Linaro, Ltd. All rights > > > reserved.<BR> > > > > + > > > > + This program and the accompanying materials are > > > licensed and made > > > > available > > > > + under the terms and conditions of the BSD > License > > > which accompanies this > > > > + distribution. The full text of the license may > be > > > found at > > > > + http://opensource.org/licenses/bsd-license.php. > > > > + > > > > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD > LICENSE ON > > > AN "AS IS" > > > > BASIS, > > > > + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY > KIND, > > > EITHER > > > > EXPRESS OR IMPLIED. > > > > + > > > > +**/ > > > > + > > > > +#include <PiDxe.h> > > > > +#include <Library/UefiBootServicesTableLib.h> > > > > +#include <Library/DxeServicesLib.h> > > > > + > > > > +/** > > > > + Allocates one or more 4KB pages of a given type > > > from a memory region that > > > > is > > > > + accessible to PEI. > > > > + > > > > + Allocates the number of 4KB pages of type > > > 'MemoryType' and returns a > > > > + pointer to the allocated buffer. The buffer > > > returned is aligned on a 4KB > > > > + boundary. If Pages is 0, then NULL is > returned. > > > If there is not enough > > > > + memory remaining to satisfy the request, then > NULL > > > is returned. > > > > + > > > > + @param[in] MemoryType The memory > type > > > to allocate > > > > + @param[in] Pages The number of > 4 > > > KB pages to > > > > allocate. > > > > + > > > > + @return A pointer to the allocated buffer or > NULL > > > if allocation fails. > > > > + > > > > +**/ > > > > +VOID * > > > > +EFIAPI > > > > +AllocatePeiAccessiblePages ( > > > > + IN EFI_MEMORY_TYPE MemoryType, > > > > + IN UINTN Pages > > > > + ) > > > > +{ > > > > + EFI_STATUS Status; > > > > + EFI_PHYSICAL_ADDRESS Memory; > > > > + > > > > + if (Pages == 0) { > > > > + return NULL; > > > > + } > > > > + > > > > + Status = gBS->AllocatePages (AllocateAnyPages, > > > MemoryType, Pages, > > > > &Memory); > > > > + if (EFI_ERROR (Status)) { > > > > + return NULL; > > > > + } > > > > + return (VOID *)(UINTN)Memory; > > > > +} > > > > diff --git > > > a/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf > > > > b/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf > > > > index bd2faf2f6f2d..50ae24f8ee22 100644 > > > > --- > a/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf > > > > +++ > b/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf > > > > @@ -27,12 +27,18 @@ [Defines] > > > > LIBRARY_CLASS = > > > DxeServicesLib|DXE_CORE > > > > DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SAL_DRIVER > > > DXE_SMM_DRIVER > > > > SMM_CORE UEFI_APPLICATION UEFI_DRIVER > > > > > > > > # > > > > -# VALID_ARCHITECTURES = IA32 X64 IPF > EBC > > > > +# VALID_ARCHITECTURES = IA32 X64 IPF > EBC > > > ARM AARCH64 > > > > # > > > > > > > > [Sources] > > > > DxeServicesLib.c > > > > > > > > +[Sources.IA32, Sources.IPF, Sources.EBC, > Sources.ARM, > > > Sources.AARCH64] > > > > + Allocate.c > > > > + > > > > +[Sources.X64] > > > > + X64/Allocate.c > > > > + > > > > [Packages] > > > > MdePkg/MdePkg.dec > > > > > > > > @@ -44,6 +50,9 @@ [LibraryClasses] > > > > UefiLib > > > > UefiBootServicesTableLib > > > > > > > > +[LibraryClasses.X64] > > > > + HobLib > > > > + > > > > [Guids] > > > > gEfiFileInfoGuid > ## > > > > SOMETIMES_CONSUMES ## UNDEFINED > > > > > > > > diff --git > > > a/MdePkg/Library/DxeServicesLib/X64/Allocate.c > > > > b/MdePkg/Library/DxeServicesLib/X64/Allocate.c > > > > new file mode 100644 > > > > index 000000000000..b6d34ba20881 > > > > --- /dev/null > > > > +++ b/MdePkg/Library/DxeServicesLib/X64/Allocate.c > > > > @@ -0,0 +1,69 @@ > > > > +/** @file > > > > + DxeServicesLib memory allocation routines > > > > + > > > > + Copyright (c) 2018, Linaro, Ltd. All rights > > > reserved.<BR> > > > > + > > > > + This program and the accompanying materials are > > > licensed and made > > > > available > > > > + under the terms and conditions of the BSD > License > > > which accompanies this > > > > + distribution. The full text of the license may > be > > > found at > > > > + http://opensource.org/licenses/bsd-license.php. > > > > + > > > > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD > LICENSE ON > > > AN "AS IS" > > > > BASIS, > > > > + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY > KIND, > > > EITHER > > > > EXPRESS OR IMPLIED. > > > > + > > > > +**/ > > > > + > > > > +#include <PiDxe.h> > > > > +#include <Library/HobLib.h> > > > > +#include <Library/UefiBootServicesTableLib.h> > > > > +#include <Library/DxeServicesLib.h> > > > > + > > > > +/** > > > > + Allocates one or more 4KB pages of a given type > > > from a memory region that > > > > is > > > > + accessible to PEI. > > > > + > > > > + Allocates the number of 4KB pages of type > > > 'MemoryType' and returns a > > > > + pointer to the allocated buffer. The buffer > > > returned is aligned on a 4KB > > > > + boundary. If Pages is 0, then NULL is > returned. > > > If there is not enough > > > > + memory remaining to satisfy the request, then > NULL > > > is returned. > > > > + > > > > + @param[in] MemoryType The memory > type > > > to allocate > > > > + @param[in] Pages The number of > 4 > > > KB pages to > > > > allocate. > > > > + > > > > + @return A pointer to the allocated buffer or > NULL > > > if allocation fails. > > > > + > > > > +**/ > > > > +VOID * > > > > +EFIAPI > > > > +AllocatePeiAccessiblePages ( > > > > + IN EFI_MEMORY_TYPE MemoryType, > > > > + IN UINTN Pages > > > > + ) > > > > +{ > > > > + EFI_STATUS Status; > > > > + EFI_ALLOCATE_TYPE AllocType; > > > > + EFI_PHYSICAL_ADDRESS Memory; > > > > + EFI_HOB_HANDOFF_INFO_TABLE *PhitHob; > > > > + > > > > + if (Pages == 0) { > > > > + return NULL; > > > > + } > > > > + > > > > + AllocType = AllocateAnyPages; > > > > + // > > > > + // A X64 build of DXE may be combined with a > 32-bit > > > build of PEI, and so we > > > > + // need to check the memory limit set by PEI, > and > > > allocate below 4 GB if the > > > > + // limit is set to 4 GB or lower. > > > > + // > > > > + PhitHob = (EFI_HOB_HANDOFF_INFO_TABLE > *)GetHobList > > > (); > > > > + if (PhitHob->EfiFreeMemoryTop <= MAX_UINT32) { > > > > + AllocType = AllocateMaxAddress; > > > > + Memory = MAX_UINT32; > > > > + } > > > > + > > > > + Status = gBS->AllocatePages (AllocType, > MemoryType, > > > Pages, &Memory); > > > > + if (EFI_ERROR (Status)) { > > > > + return NULL; > > > > + } > > > > + return (VOID *)(UINTN)Memory; > > > > +} > > > > -- > > > > 2.17.0 > > > > > > > > _______________________________________________ > > > > edk2-devel mailing list > > > > edk2-devel@lists.01.org > > > > 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 > > > _______________________________________________ > > > edk2-devel mailing list > > > edk2-devel@lists.01.org > > > 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
On 29 May 2018 at 18:09, Kinney, Michael D <michael.d.kinney@intel.com> wrote: > Jiewen, > > I see what you mean. It is not the submitting of > capsules you are referring to. It is the processing > if capsules in the PEI phase that depends on some > things being setup in DXE phase and DXE phase needs > to know if PEI is in IA32 mode. > > So I agree that the commit message could add capsule > processing to the list of features that can use this > new service. > > The logic in that file is using PcdDxeIplSwitchToLongMode. > That PCD is TRUE when PEI is IA32 and DXE is X64. But it > is ignored when PEI and DXE are both X64 and could be > TRUE or FALSE. Is there a logic issue here with using that > PCD when PEI and DXE are both X64? > Hi all, The reason I disregarded this particular case in my series is that this code is already specific to X64. However, given the discussion you are having, I guess the logic of looking at EfiFreeMemoryTop [at runtime] combined with the various [build time] PCD values could help to refine this case as well. _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel
Thanks. I guess we need it even for X64 PEI/X64 DXE case, because a platform may only allocates 4G even in X64 PEI. BTW, I don't mind if you want to use a separate patch to handle capsule case. Current API is good enough and I do not want to block the check-in. :-) I like this simple solution. Patch series: Reviewed-by: Jiewen.Yao@intel.com Thank you Yao Jiewen > -----Original Message----- > From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of Ard > Biesheuvel > Sent: Tuesday, May 29, 2018 9:20 AM > To: Kinney, Michael D <michael.d.kinney@intel.com> > Cc: edk2-devel@lists.01.org; Yao, Jiewen <jiewen.yao@intel.com>; Zeng, Star > <star.zeng@intel.com> > Subject: Re: [edk2] [PATCH v3 3/5] MdePkg/DxeServicesLib: introduce > AllocatePeiAccessiblePages routine > > On 29 May 2018 at 18:09, Kinney, Michael D <michael.d.kinney@intel.com> > wrote: > > Jiewen, > > > > I see what you mean. It is not the submitting of > > capsules you are referring to. It is the processing > > if capsules in the PEI phase that depends on some > > things being setup in DXE phase and DXE phase needs > > to know if PEI is in IA32 mode. > > > > So I agree that the commit message could add capsule > > processing to the list of features that can use this > > new service. > > > > The logic in that file is using PcdDxeIplSwitchToLongMode. > > That PCD is TRUE when PEI is IA32 and DXE is X64. But it > > is ignored when PEI and DXE are both X64 and could be > > TRUE or FALSE. Is there a logic issue here with using that > > PCD when PEI and DXE are both X64? > > > > Hi all, > > The reason I disregarded this particular case in my series is that > this code is already specific to X64. However, given the discussion > you are having, I guess the logic of looking at EfiFreeMemoryTop [at > runtime] combined with the various [build time] PCD values could help > to refine this case as well. > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > 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
We can consider capsule update path is a special S3 path. :) Both capsule update path and S3 path have the attribute that the memory content at previous boot are reserved. Thanks, Star -----Original Message----- From: Kinney, Michael D Sent: Wednesday, May 30, 2018 12:09 AM To: Yao, Jiewen <jiewen.yao@intel.com>; Zeng, Star <star.zeng@intel.com>; Ard Biesheuvel <ard.biesheuvel@linaro.org>; edk2-devel@lists.01.org; Kinney, Michael D <michael.d.kinney@intel.com> Cc: Zeng, Star <star.zeng@intel.com> Subject: RE: [edk2] [PATCH v3 3/5] MdePkg/DxeServicesLib: introduce AllocatePeiAccessiblePages routine Jiewen, I see what you mean. It is not the submitting of capsules you are referring to. It is the processing if capsules in the PEI phase that depends on some things being setup in DXE phase and DXE phase needs to know if PEI is in IA32 mode. So I agree that the commit message could add capsule processing to the list of features that can use this new service. The logic in that file is using PcdDxeIplSwitchToLongMode. That PCD is TRUE when PEI is IA32 and DXE is X64. But it is ignored when PEI and DXE are both X64 and could be TRUE or FALSE. Is there a logic issue here with using that PCD when PEI and DXE are both X64? Thanks, Mike > -----Original Message----- > From: Yao, Jiewen > Sent: Tuesday, May 29, 2018 8:36 AM > To: Kinney, Michael D <michael.d.kinney@intel.com>; Zeng, Star > <star.zeng@intel.com>; Ard Biesheuvel <ard.biesheuvel@linaro.org>; > edk2-devel@lists.01.org > Cc: Zeng, Star <star.zeng@intel.com>; Yao, Jiewen > <jiewen.yao@intel.com> > Subject: RE: [edk2] [PATCH v3 3/5] > MdePkg/DxeServicesLib: introduce > AllocatePeiAccessiblePages routine > > Mike > Please refer to > https://github.com/tianocore/edk2/blob/master/MdeModuleP > kg/Universal/CapsuleRuntimeDxe/X64/SaveLongModeContext.c > > It uses AllocateReservedMemoryBelow4G() for the context accessed in > PEI. > > Thank you > Yao Jiewen > > > > -----Original Message----- > > From: Kinney, Michael D > > Sent: Tuesday, May 29, 2018 8:31 AM > > To: Yao, Jiewen <jiewen.yao@intel.com>; Zeng, Star > <star.zeng@intel.com>; Ard > > Biesheuvel <ard.biesheuvel@linaro.org>; edk2- > devel@lists.01.org; Kinney, > > Michael D <michael.d.kinney@intel.com> > > Cc: Zeng, Star <star.zeng@intel.com> > > Subject: RE: [edk2] [PATCH v3 3/5] > MdePkg/DxeServicesLib: introduce > > AllocatePeiAccessiblePages routine > > > > Jiewen, > > > > I do not think this service applies to the capsule use cases. > > > > A capsule sent at OS runtime can be placed anywhere in memory by the > > OS. The OS does not know what memory PEI can easily access or not. > > > > The main PEI requirement is to not corrupt capsules in memory. > > > > Mike > > > > > -----Original Message----- > > > From: edk2-devel [mailto:edk2-devel- bounces@lists.01.org] On > > > Behalf Of Yao, Jiewen > > > Sent: Tuesday, May 29, 2018 8:19 AM > > > To: Zeng, Star <star.zeng@intel.com>; Ard Biesheuvel > > > <ard.biesheuvel@linaro.org>; edk2-devel@lists.01.org > > > Cc: Zeng, Star <star.zeng@intel.com> > > > Subject: Re: [edk2] [PATCH v3 3/5] > > > MdePkg/DxeServicesLib: introduce > > > AllocatePeiAccessiblePages routine > > > > > > Maybe " be accessible by PEI after a warm reboot or > S3" > > > ? > > > > > > We may want to consider Capsule Update case. > > > > > > > > > > -----Original Message----- > > > > From: edk2-devel [mailto:edk2-devel- > > > bounces@lists.01.org] On Behalf Of Zeng, > > > > Star > > > > Sent: Monday, May 28, 2018 6:37 PM > > > > To: Ard Biesheuvel <ard.biesheuvel@linaro.org>; > edk2- > > > devel@lists.01.org > > > > Cc: Zeng, Star <star.zeng@intel.com> > > > > Subject: Re: [edk2] [PATCH v3 3/5] > > > MdePkg/DxeServicesLib: introduce > > > > AllocatePeiAccessiblePages routine > > > > > > > > I think " be accessible by PEI after a warm reboot > " > > > should be " be accessible by > > > > PEI after resuming from S3 ". > > > > You can update it when pushing without need to > send a > > > new patch if other has > > > > no comment to the code part. > > > > > > > > > > > > Thanks, > > > > Star > > > > -----Original Message----- > > > > From: edk2-devel [mailto:edk2-devel- > > > bounces@lists.01.org] On Behalf Of Ard > > > > Biesheuvel > > > > Sent: Monday, May 28, 2018 10:40 PM > > > > To: edk2-devel@lists.01.org > > > > Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> > > > > Subject: [edk2] [PATCH v3 3/5] > MdePkg/DxeServicesLib: > > > introduce > > > > AllocatePeiAccessiblePages routine > > > > > > > > Add a routine to DxeServicesLib that abstracts the > > > allocation of memory > > > > that should be accessible by PEI after a warm > reboot. > > > We will use it to > > > > replace open coded implementations that limit the > > > address to < 4 GB, > > > > which may not be possible on non-Intel systems > that > > > have no 32-bit > > > > addressable memory at all. > > > > > > > > Contributed-under: TianoCore Contribution > Agreement > > > 1.1 > > > > Signed-off-by: Ard Biesheuvel > > > <ard.biesheuvel@linaro.org> > > > > --- > > > > MdePkg/Include/Library/DxeServicesLib.h > | 23 > > > ++++++- > > > > MdePkg/Library/DxeServicesLib/Allocate.c > | 54 > > > +++++++++++++++ > > > > MdePkg/Library/DxeServicesLib/DxeServicesLib.inf > | 11 > > > +++- > > > > MdePkg/Library/DxeServicesLib/X64/Allocate.c > | 69 > > > > ++++++++++++++++++++ > > > > 4 files changed, 155 insertions(+), 2 deletions(- > ) > > > > > > > > diff --git > a/MdePkg/Include/Library/DxeServicesLib.h > > > > b/MdePkg/Include/Library/DxeServicesLib.h > > > > index 7c1c62236d96..20aee68af558 100644 > > > > --- a/MdePkg/Include/Library/DxeServicesLib.h > > > > +++ b/MdePkg/Include/Library/DxeServicesLib.h > > > > @@ -305,5 +305,26 @@ GetFileDevicePathFromAnyFv ( > > > > OUT EFI_DEVICE_PATH_PROTOCOL > > > **FvFileDevicePath > > > > ); > > > > > > > > -#endif > > > > +/** > > > > + Allocates one or more 4KB pages of a given type > > > from a memory region that > > > > is > > > > + accessible to PEI. > > > > + > > > > + Allocates the number of 4KB pages of type > > > 'MemoryType' and returns a > > > > + pointer to the allocated buffer. The buffer > > > returned is aligned on a 4KB > > > > + boundary. If Pages is 0, then NULL is > returned. > > > If there is not enough > > > > + memory remaining to satisfy the request, then > NULL > > > is returned. > > > > > > > > + @param[in] MemoryType The memory > type > > > to allocate > > > > + @param[in] Pages The number of > 4 > > > KB pages to > > > > allocate. > > > > + > > > > + @return A pointer to the allocated buffer or > NULL > > > if allocation fails. > > > > + > > > > +**/ > > > > +VOID * > > > > +EFIAPI > > > > +AllocatePeiAccessiblePages ( > > > > + IN EFI_MEMORY_TYPE MemoryType, > > > > + IN UINTN Pages > > > > + ); > > > > + > > > > +#endif > > > > diff --git > a/MdePkg/Library/DxeServicesLib/Allocate.c > > > > b/MdePkg/Library/DxeServicesLib/Allocate.c > > > > new file mode 100644 > > > > index 000000000000..4d118f766d49 > > > > --- /dev/null > > > > +++ b/MdePkg/Library/DxeServicesLib/Allocate.c > > > > @@ -0,0 +1,54 @@ > > > > +/** @file > > > > + DxeServicesLib memory allocation routines > > > > + > > > > + Copyright (c) 2018, Linaro, Ltd. All rights > > > reserved.<BR> > > > > + > > > > + This program and the accompanying materials are > > > licensed and made > > > > available > > > > + under the terms and conditions of the BSD > License > > > which accompanies this > > > > + distribution. The full text of the license may > be > > > found at > > > > + http://opensource.org/licenses/bsd-license.php. > > > > + > > > > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD > LICENSE ON > > > AN "AS IS" > > > > BASIS, > > > > + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY > KIND, > > > EITHER > > > > EXPRESS OR IMPLIED. > > > > + > > > > +**/ > > > > + > > > > +#include <PiDxe.h> > > > > +#include <Library/UefiBootServicesTableLib.h> > > > > +#include <Library/DxeServicesLib.h> > > > > + > > > > +/** > > > > + Allocates one or more 4KB pages of a given type > > > from a memory region that > > > > is > > > > + accessible to PEI. > > > > + > > > > + Allocates the number of 4KB pages of type > > > 'MemoryType' and returns a > > > > + pointer to the allocated buffer. The buffer > > > returned is aligned on a 4KB > > > > + boundary. If Pages is 0, then NULL is > returned. > > > If there is not enough > > > > + memory remaining to satisfy the request, then > NULL > > > is returned. > > > > + > > > > + @param[in] MemoryType The memory > type > > > to allocate > > > > + @param[in] Pages The number of > 4 > > > KB pages to > > > > allocate. > > > > + > > > > + @return A pointer to the allocated buffer or > NULL > > > if allocation fails. > > > > + > > > > +**/ > > > > +VOID * > > > > +EFIAPI > > > > +AllocatePeiAccessiblePages ( > > > > + IN EFI_MEMORY_TYPE MemoryType, > > > > + IN UINTN Pages > > > > + ) > > > > +{ > > > > + EFI_STATUS Status; > > > > + EFI_PHYSICAL_ADDRESS Memory; > > > > + > > > > + if (Pages == 0) { > > > > + return NULL; > > > > + } > > > > + > > > > + Status = gBS->AllocatePages (AllocateAnyPages, > > > MemoryType, Pages, > > > > &Memory); > > > > + if (EFI_ERROR (Status)) { > > > > + return NULL; > > > > + } > > > > + return (VOID *)(UINTN)Memory; } > > > > diff --git > > > a/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf > > > > b/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf > > > > index bd2faf2f6f2d..50ae24f8ee22 100644 > > > > --- > a/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf > > > > +++ > b/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf > > > > @@ -27,12 +27,18 @@ [Defines] > > > > LIBRARY_CLASS = > > > DxeServicesLib|DXE_CORE > > > > DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SAL_DRIVER > > > DXE_SMM_DRIVER > > > > SMM_CORE UEFI_APPLICATION UEFI_DRIVER > > > > > > > > # > > > > -# VALID_ARCHITECTURES = IA32 X64 IPF > EBC > > > > +# VALID_ARCHITECTURES = IA32 X64 IPF > EBC > > > ARM AARCH64 > > > > # > > > > > > > > [Sources] > > > > DxeServicesLib.c > > > > > > > > +[Sources.IA32, Sources.IPF, Sources.EBC, > Sources.ARM, > > > Sources.AARCH64] > > > > + Allocate.c > > > > + > > > > +[Sources.X64] > > > > + X64/Allocate.c > > > > + > > > > [Packages] > > > > MdePkg/MdePkg.dec > > > > > > > > @@ -44,6 +50,9 @@ [LibraryClasses] > > > > UefiLib > > > > UefiBootServicesTableLib > > > > > > > > +[LibraryClasses.X64] > > > > + HobLib > > > > + > > > > [Guids] > > > > gEfiFileInfoGuid > ## > > > > SOMETIMES_CONSUMES ## UNDEFINED > > > > > > > > diff --git > > > a/MdePkg/Library/DxeServicesLib/X64/Allocate.c > > > > b/MdePkg/Library/DxeServicesLib/X64/Allocate.c > > > > new file mode 100644 > > > > index 000000000000..b6d34ba20881 > > > > --- /dev/null > > > > +++ b/MdePkg/Library/DxeServicesLib/X64/Allocate.c > > > > @@ -0,0 +1,69 @@ > > > > +/** @file > > > > + DxeServicesLib memory allocation routines > > > > + > > > > + Copyright (c) 2018, Linaro, Ltd. All rights > > > reserved.<BR> > > > > + > > > > + This program and the accompanying materials are > > > licensed and made > > > > available > > > > + under the terms and conditions of the BSD > License > > > which accompanies this > > > > + distribution. The full text of the license may > be > > > found at > > > > + http://opensource.org/licenses/bsd-license.php. > > > > + > > > > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD > LICENSE ON > > > AN "AS IS" > > > > BASIS, > > > > + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY > KIND, > > > EITHER > > > > EXPRESS OR IMPLIED. > > > > + > > > > +**/ > > > > + > > > > +#include <PiDxe.h> > > > > +#include <Library/HobLib.h> > > > > +#include <Library/UefiBootServicesTableLib.h> > > > > +#include <Library/DxeServicesLib.h> > > > > + > > > > +/** > > > > + Allocates one or more 4KB pages of a given type > > > from a memory region that > > > > is > > > > + accessible to PEI. > > > > + > > > > + Allocates the number of 4KB pages of type > > > 'MemoryType' and returns a > > > > + pointer to the allocated buffer. The buffer > > > returned is aligned on a 4KB > > > > + boundary. If Pages is 0, then NULL is > returned. > > > If there is not enough > > > > + memory remaining to satisfy the request, then > NULL > > > is returned. > > > > + > > > > + @param[in] MemoryType The memory > type > > > to allocate > > > > + @param[in] Pages The number of > 4 > > > KB pages to > > > > allocate. > > > > + > > > > + @return A pointer to the allocated buffer or > NULL > > > if allocation fails. > > > > + > > > > +**/ > > > > +VOID * > > > > +EFIAPI > > > > +AllocatePeiAccessiblePages ( > > > > + IN EFI_MEMORY_TYPE MemoryType, > > > > + IN UINTN Pages > > > > + ) > > > > +{ > > > > + EFI_STATUS Status; > > > > + EFI_ALLOCATE_TYPE AllocType; > > > > + EFI_PHYSICAL_ADDRESS Memory; > > > > + EFI_HOB_HANDOFF_INFO_TABLE *PhitHob; > > > > + > > > > + if (Pages == 0) { > > > > + return NULL; > > > > + } > > > > + > > > > + AllocType = AllocateAnyPages; // // A X64 build of DXE may > > > > + be combined with a > 32-bit > > > build of PEI, and so we > > > > + // need to check the memory limit set by PEI, > and > > > allocate below 4 GB if the > > > > + // limit is set to 4 GB or lower. > > > > + // > > > > + PhitHob = (EFI_HOB_HANDOFF_INFO_TABLE > *)GetHobList > > > (); > > > > + if (PhitHob->EfiFreeMemoryTop <= MAX_UINT32) { > > > > + AllocType = AllocateMaxAddress; > > > > + Memory = MAX_UINT32; > > > > + } > > > > + > > > > + Status = gBS->AllocatePages (AllocType, > MemoryType, > > > Pages, &Memory); > > > > + if (EFI_ERROR (Status)) { > > > > + return NULL; > > > > + } > > > > + return (VOID *)(UINTN)Memory; } > > > > -- > > > > 2.17.0 > > > > > > > > _______________________________________________ > > > > edk2-devel mailing list > > > > edk2-devel@lists.01.org > > > > 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 > > > _______________________________________________ > > > edk2-devel mailing list > > > edk2-devel@lists.01.org > > > 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
diff --git a/MdePkg/Include/Library/DxeServicesLib.h b/MdePkg/Include/Library/DxeServicesLib.h index 7c1c62236d96..20aee68af558 100644 --- a/MdePkg/Include/Library/DxeServicesLib.h +++ b/MdePkg/Include/Library/DxeServicesLib.h @@ -305,5 +305,26 @@ GetFileDevicePathFromAnyFv ( OUT EFI_DEVICE_PATH_PROTOCOL **FvFileDevicePath ); -#endif +/** + Allocates one or more 4KB pages of a given type from a memory region that is + accessible to PEI. + + Allocates the number of 4KB pages of type 'MemoryType' and returns a + pointer to the allocated buffer. The buffer returned is aligned on a 4KB + boundary. If Pages is 0, then NULL is returned. If there is not enough + memory remaining to satisfy the request, then NULL is returned. + @param[in] MemoryType The memory type to allocate + @param[in] Pages The number of 4 KB pages to allocate. + + @return A pointer to the allocated buffer or NULL if allocation fails. + +**/ +VOID * +EFIAPI +AllocatePeiAccessiblePages ( + IN EFI_MEMORY_TYPE MemoryType, + IN UINTN Pages + ); + +#endif diff --git a/MdePkg/Library/DxeServicesLib/Allocate.c b/MdePkg/Library/DxeServicesLib/Allocate.c new file mode 100644 index 000000000000..4d118f766d49 --- /dev/null +++ b/MdePkg/Library/DxeServicesLib/Allocate.c @@ -0,0 +1,54 @@ +/** @file + DxeServicesLib memory allocation routines + + Copyright (c) 2018, Linaro, Ltd. All rights reserved.<BR> + + This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License which accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#include <PiDxe.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/DxeServicesLib.h> + +/** + Allocates one or more 4KB pages of a given type from a memory region that is + accessible to PEI. + + Allocates the number of 4KB pages of type 'MemoryType' and returns a + pointer to the allocated buffer. The buffer returned is aligned on a 4KB + boundary. If Pages is 0, then NULL is returned. If there is not enough + memory remaining to satisfy the request, then NULL is returned. + + @param[in] MemoryType The memory type to allocate + @param[in] Pages The number of 4 KB pages to allocate. + + @return A pointer to the allocated buffer or NULL if allocation fails. + +**/ +VOID * +EFIAPI +AllocatePeiAccessiblePages ( + IN EFI_MEMORY_TYPE MemoryType, + IN UINTN Pages + ) +{ + EFI_STATUS Status; + EFI_PHYSICAL_ADDRESS Memory; + + if (Pages == 0) { + return NULL; + } + + Status = gBS->AllocatePages (AllocateAnyPages, MemoryType, Pages, &Memory); + if (EFI_ERROR (Status)) { + return NULL; + } + return (VOID *)(UINTN)Memory; +} diff --git a/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf b/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf index bd2faf2f6f2d..50ae24f8ee22 100644 --- a/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf +++ b/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf @@ -27,12 +27,18 @@ [Defines] LIBRARY_CLASS = DxeServicesLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER SMM_CORE UEFI_APPLICATION UEFI_DRIVER # -# VALID_ARCHITECTURES = IA32 X64 IPF EBC +# VALID_ARCHITECTURES = IA32 X64 IPF EBC ARM AARCH64 # [Sources] DxeServicesLib.c +[Sources.IA32, Sources.IPF, Sources.EBC, Sources.ARM, Sources.AARCH64] + Allocate.c + +[Sources.X64] + X64/Allocate.c + [Packages] MdePkg/MdePkg.dec @@ -44,6 +50,9 @@ [LibraryClasses] UefiLib UefiBootServicesTableLib +[LibraryClasses.X64] + HobLib + [Guids] gEfiFileInfoGuid ## SOMETIMES_CONSUMES ## UNDEFINED diff --git a/MdePkg/Library/DxeServicesLib/X64/Allocate.c b/MdePkg/Library/DxeServicesLib/X64/Allocate.c new file mode 100644 index 000000000000..b6d34ba20881 --- /dev/null +++ b/MdePkg/Library/DxeServicesLib/X64/Allocate.c @@ -0,0 +1,69 @@ +/** @file + DxeServicesLib memory allocation routines + + Copyright (c) 2018, Linaro, Ltd. All rights reserved.<BR> + + This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License which accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#include <PiDxe.h> +#include <Library/HobLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/DxeServicesLib.h> + +/** + Allocates one or more 4KB pages of a given type from a memory region that is + accessible to PEI. + + Allocates the number of 4KB pages of type 'MemoryType' and returns a + pointer to the allocated buffer. The buffer returned is aligned on a 4KB + boundary. If Pages is 0, then NULL is returned. If there is not enough + memory remaining to satisfy the request, then NULL is returned. + + @param[in] MemoryType The memory type to allocate + @param[in] Pages The number of 4 KB pages to allocate. + + @return A pointer to the allocated buffer or NULL if allocation fails. + +**/ +VOID * +EFIAPI +AllocatePeiAccessiblePages ( + IN EFI_MEMORY_TYPE MemoryType, + IN UINTN Pages + ) +{ + EFI_STATUS Status; + EFI_ALLOCATE_TYPE AllocType; + EFI_PHYSICAL_ADDRESS Memory; + EFI_HOB_HANDOFF_INFO_TABLE *PhitHob; + + if (Pages == 0) { + return NULL; + } + + AllocType = AllocateAnyPages; + // + // A X64 build of DXE may be combined with a 32-bit build of PEI, and so we + // need to check the memory limit set by PEI, and allocate below 4 GB if the + // limit is set to 4 GB or lower. + // + PhitHob = (EFI_HOB_HANDOFF_INFO_TABLE *)GetHobList (); + if (PhitHob->EfiFreeMemoryTop <= MAX_UINT32) { + AllocType = AllocateMaxAddress; + Memory = MAX_UINT32; + } + + Status = gBS->AllocatePages (AllocType, MemoryType, Pages, &Memory); + if (EFI_ERROR (Status)) { + return NULL; + } + return (VOID *)(UINTN)Memory; +}
Add a routine to DxeServicesLib that abstracts the allocation of memory that should be accessible by PEI after a warm reboot. We will use it to replace open coded implementations that limit the address to < 4 GB, which may not be possible on non-Intel systems that have no 32-bit addressable memory at all. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> --- MdePkg/Include/Library/DxeServicesLib.h | 23 ++++++- MdePkg/Library/DxeServicesLib/Allocate.c | 54 +++++++++++++++ MdePkg/Library/DxeServicesLib/DxeServicesLib.inf | 11 +++- MdePkg/Library/DxeServicesLib/X64/Allocate.c | 69 ++++++++++++++++++++ 4 files changed, 155 insertions(+), 2 deletions(-) -- 2.17.0 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel