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]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to