On Mon, Sep 23, 2019 at 08:31:47AM +0800, Abner Chang wrote: > Implementation of RISC-V PEI Service Table Pointer library using > RISC-V OpenSbi. > > Signed-off-by: Abner Chang <abner.ch...@hpe.com> > --- > .../PeiServicesTablePointerLibOpenSbi.inf | 38 +++++++ > .../PeiServicesTablePointerLibOpenSbi.uni | 23 ++++ > .../PeiServicesTablePointerOpenSbi.c | 121 > +++++++++++++++++++++ > 3 files changed, 182 insertions(+) > create mode 100644 > RiscVPkg/Library/PeiServicesTablePointerLibOpenSbi/PeiServicesTablePointerLibOpenSbi.inf > create mode 100644 > RiscVPkg/Library/PeiServicesTablePointerLibOpenSbi/PeiServicesTablePointerLibOpenSbi.uni > create mode 100644 > RiscVPkg/Library/PeiServicesTablePointerLibOpenSbi/PeiServicesTablePointerOpenSbi.c > > diff --git > a/RiscVPkg/Library/PeiServicesTablePointerLibOpenSbi/PeiServicesTablePointerLibOpenSbi.inf > > b/RiscVPkg/Library/PeiServicesTablePointerLibOpenSbi/PeiServicesTablePointerLibOpenSbi.inf > new file mode 100644 > index 0000000..0b029ae > --- /dev/null > +++ > b/RiscVPkg/Library/PeiServicesTablePointerLibOpenSbi/PeiServicesTablePointerLibOpenSbi.inf > @@ -0,0 +1,38 @@ > +## @file > +# Instance of PEI Services Table Pointer Library using RISC-V OpenSBI > FirmwareContext. > +# > +# PEI Services Table Pointer Library implementation that retrieves a > pointer to the > +# PEI Services Table from a RISC-V OpenSBI sbi_platform firmware context > structure. > +# > +# Copyright (c) 2019, Hewlett Packard Enterprise Development LP. All rights > reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + INF_VERSION = 0x0001001b > + BASE_NAME = PeiServicesTablePointerLibOpenSbi > + MODULE_UNI_FILE = PeiServicesTablePointerLibOpenSbi.uni > + FILE_GUID = B4054E46-FE75-4290-B442-4836B1265D8F > + MODULE_TYPE = PEIM > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = PeiServicesTablePointerLib|PEIM PEI_CORE > + > + CONSTRUCTOR = > PeiServicesTablePointerLibOpenSbiConstructor > + > +# > +# VALID_ARCHITECTURES = RISCV64 > +# > + > +[Sources] > + PeiServicesTablePointerOpenSbi.c > + > +[Packages] > + MdePkg/MdePkg.dec > + RiscVPkg/RiscVPkg.dec > + > +[LibraryClasses] > + DebugLib > + RiscVCpuLib > + RiscVOpensbiLib > diff --git > a/RiscVPkg/Library/PeiServicesTablePointerLibOpenSbi/PeiServicesTablePointerLibOpenSbi.uni > > b/RiscVPkg/Library/PeiServicesTablePointerLibOpenSbi/PeiServicesTablePointerLibOpenSbi.uni > new file mode 100644 > index 0000000..f6fad8b > --- /dev/null > +++ > b/RiscVPkg/Library/PeiServicesTablePointerLibOpenSbi/PeiServicesTablePointerLibOpenSbi.uni > @@ -0,0 +1,23 @@ > +// /** @file > +// > +// Instance of PEI Services Table Pointer Library using RISC-V OpenSBI > FirmwareContext. > +// > +// PEI Services Table Pointer Library implementation that retrieves a > pointer to the > +// PEI Services Table from a RISC-V OpenSBI sbi_platform firmware context > structure. > +// > +// Copyright (c) 2019, Hewlett Packard Enterprise Development LP. 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. > +// > +// **/ > + > + > +#string STR_MODULE_ABSTRACT #language en-US "Instance of PEI > Services Table Pointer Library using global variable for the table pointer" > + > +#string STR_MODULE_DESCRIPTION #language en-US "The PEI Services > Table Pointer Library implementation that retrieves a pointer to the PEI > Services Table from a global variable. Not available to modules that execute > from read-only memory." > + > diff --git > a/RiscVPkg/Library/PeiServicesTablePointerLibOpenSbi/PeiServicesTablePointerOpenSbi.c > > b/RiscVPkg/Library/PeiServicesTablePointerLibOpenSbi/PeiServicesTablePointerOpenSbi.c > new file mode 100644 > index 0000000..915964f > --- /dev/null > +++ > b/RiscVPkg/Library/PeiServicesTablePointerLibOpenSbi/PeiServicesTablePointerOpenSbi.c > @@ -0,0 +1,121 @@ > +/** @file > + PEI Services Table Pointer Library. > + > + Copyright (c) 2019, Hewlett Packard Enterprise Development LP. All rights > reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > +**/ > + > +#include <PiPei.h> > +#include <Library/PeiServicesTablePointerLib.h> > +#include <Library/DebugLib.h> > +#include <Library/RiscVCpuLib.h> > +#include <sbi/sbi_scratch.h> > +#include <sbi/sbi_platform.h> > +#include <sbi/SbiFirmwareContext.h>
Please sort the include files alphabetically. > + > +/** > + Caches a pointer PEI Services Table. > + > + Caches the pointer to the PEI Services Table specified by > PeiServicesTablePointer > + in a CPU specific manner as specified in the CPU binding section of the > Platform Initialization > + Pre-EFI Initialization Core Interface Specification. > + > + If PeiServicesTablePointer is NULL, then ASSERT(). > + > + @param PeiServicesTablePointer The address of PeiServices pointer. > +**/ > +VOID > +EFIAPI > +SetPeiServicesTablePointer ( > + IN CONST EFI_PEI_SERVICES ** PeiServicesTablePointer > + ) > +{ > + struct sbi_platform *ThisSbiPlatform; > + EFI_RISCV_OPENSBI_FIRMWARE_CONTEXT *FirmwareContext; > + > + ThisSbiPlatform = (struct sbi_platform > *)sbi_platform_ptr(sbi_scratch_thishart_ptr()); > + FirmwareContext = (EFI_RISCV_OPENSBI_FIRMWARE_CONTEXT > *)ThisSbiPlatform->firmware_context; > + FirmwareContext->PeiServiceTable = (VOID *)(UINTN)PeiServicesTablePointer; > + > + DEBUG ((DEBUG_ERROR, "[OpenSBI]: Set PEI Service 0x%x at Firmware Context > at 0x%x\n", Please drop the [OpenSBI] tag from the message. > + PeiServicesTablePointer, > + ThisSbiPlatform->firmware_context > + )); Indentation is off. / Leif > +} > + > +/** > + Retrieves the cached value of the PEI Services Table pointer. > + > + Returns the cached value of the PEI Services Table pointer in a CPU > specific manner > + as specified in the CPU binding section of the Platform Initialization > Pre-EFI > + Initialization Core Interface Specification. > + > + If the cached PEI Services Table pointer is NULL, then ASSERT(). > + > + @return The pointer to PeiServices. > + > +**/ > +CONST EFI_PEI_SERVICES ** > +EFIAPI > +GetPeiServicesTablePointer ( > + VOID > + ) > +{ > + struct sbi_platform *ThisSbiPlatform; > + EFI_RISCV_OPENSBI_FIRMWARE_CONTEXT *FirmwareContext; > + > + ThisSbiPlatform = (struct sbi_platform > *)sbi_platform_ptr(sbi_scratch_thishart_ptr()); > + FirmwareContext = (EFI_RISCV_OPENSBI_FIRMWARE_CONTEXT > *)ThisSbiPlatform->firmware_context; > + return (CONST EFI_PEI_SERVICES **)FirmwareContext->PeiServiceTable; > +} > + > +/** > + The constructor function caches the pointer to PEI services. > + > + The constructor function caches the pointer to PEI services. > + It will always return EFI_SUCCESS. > + > + @param FileHandle The handle of FFS header the loaded driver. > + @param PeiServices The pointer to the PEI services. > + > + @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS. > + > +**/ > +EFI_STATUS > +EFIAPI > +PeiServicesTablePointerLibOpenSbiConstructor ( > + IN EFI_PEI_FILE_HANDLE FileHandle, > + IN CONST EFI_PEI_SERVICES **PeiServices > + ) > +{ > + SetPeiServicesTablePointer (PeiServices); > + return EFI_SUCCESS; > +} > + > +/** > + Perform CPU specific actions required to migrate the PEI Services Table > + pointer from temporary RAM to permanent RAM. > + > + For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes > + immediately preceding the Interrupt Descriptor Table (IDT) in memory. > + For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes > + immediately preceding the Interrupt Descriptor Table (IDT) in memory. > + For Itanium and ARM CPUs, a the PEI Services Table Pointer is stored in > + a dedicated CPU register. This means that there is no memory storage > + associated with storing the PEI Services Table pointer, so no additional > + migration actions are required for Itanium or ARM CPUs. > + > +**/ > +VOID > +EFIAPI > +MigratePeiServicesTablePointer ( > + VOID > + ) > +{ > + // > + // PEI Services Table pointer is cached in the global variable. No > additional > + // migration actions are required. > + // > + return; > +} > -- > 2.7.4 > > > > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#48307): https://edk2.groups.io/g/devel/message/48307 Mute This Topic: https://groups.io/mt/34258219/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-