Abort creating the SMBIOS HOBs if there's no firmware context to get the
information from.
Turn SbiLib functions for getting mscratch into VOID since they can never
practically fail.

Signed-off-by: Daniel Schaefer <daniel.schae...@hpe.com>
Cc: Abner Chang <abner.ch...@hpe.com>
Cc: Leif Lindholm <l...@nuviainc.com>
---
 .../Include/Library/RiscVEdk2SbiLib.h         | 12 ++---
 .../PlatformPkg/Universal/Sec/SecMain.c       | 11 +++--
 .../Library/RiscVEdk2SbiLib/RiscVEdk2SbiLib.c | 46 +++++++------------
 .../Library/PeiCoreInfoHobLib/CoreInfoHob.c   | 13 ++++--
 4 files changed, 36 insertions(+), 46 deletions(-)

diff --git a/Silicon/RISC-V/ProcessorPkg/Include/Library/RiscVEdk2SbiLib.h 
b/Silicon/RISC-V/ProcessorPkg/Include/Library/RiscVEdk2SbiLib.h
index 558841a970ce..f81ea06b05b0 100644
--- a/Silicon/RISC-V/ProcessorPkg/Include/Library/RiscVEdk2SbiLib.h
+++ b/Silicon/RISC-V/ProcessorPkg/Include/Library/RiscVEdk2SbiLib.h
@@ -514,9 +514,8 @@ SbiVendorCall (
   access the firmware context.

 

   @param[out] ScratchSpace         The scratch space pointer.

-  @retval EFI_SUCCESS              The operation succeeds.

 **/

-EFI_STATUS

+VOID

 EFIAPI

 SbiGetMscratch (

   OUT SBI_SCRATCH                    **ScratchSpace

@@ -527,9 +526,8 @@ SbiGetMscratch (
 

   @param[in]  HartId               The hart id.

   @param[out] ScratchSpace         The scratch space pointer.

-  @retval EFI_SUCCESS              The operation succeeds.

 **/

-EFI_STATUS

+VOID

 EFIAPI

 SbiGetMscratchHartid (

   IN  UINTN                            HartId,

@@ -540,9 +538,8 @@ SbiGetMscratchHartid (
   Get firmware context of the calling hart.

 

   @param[out] FirmwareContext      The firmware context pointer.

-  @retval EFI_SUCCESS              The operation succeeds.

 **/

-EFI_STATUS

+VOID

 EFIAPI

 SbiGetFirmwareContext (

   OUT EFI_RISCV_OPENSBI_FIRMWARE_CONTEXT **FirmwareContext

@@ -552,9 +549,8 @@ SbiGetFirmwareContext (
   Set firmware context of the calling hart.

 

   @param[in] FirmwareContext       The firmware context pointer.

-  @retval EFI_SUCCESS              The operation succeeds.

 **/

-EFI_STATUS

+VOID

 EFIAPI

 SbiSetFirmwareContext (

   IN EFI_RISCV_OPENSBI_FIRMWARE_CONTEXT *FirmwareContext

diff --git a/Platform/RISC-V/PlatformPkg/Universal/Sec/SecMain.c 
b/Platform/RISC-V/PlatformPkg/Universal/Sec/SecMain.c
index 877777bfa1ab..fa9ecd789a57 100644
--- a/Platform/RISC-V/PlatformPkg/Universal/Sec/SecMain.c
+++ b/Platform/RISC-V/PlatformPkg/Universal/Sec/SecMain.c
@@ -415,7 +415,10 @@ EFI_STATUS EFIAPI TemporaryRamDone (
   return EFI_SUCCESS;

 }

 

-/** Handles SBI calls of EDK2's SBI FW extension

+/**

+  Handles SBI calls of EDK2's SBI FW extension.

+

+  The return value is the error code returned by the SBI call.

 

   @param[in]  ExtId        The extension ID of the FW extension.

   @param[in]  FuncId       The called function ID.

@@ -424,7 +427,7 @@ EFI_STATUS EFIAPI TemporaryRamDone (
   @param[out] OutTrap      Trap info for trapping further, see OpenSBI code.

                            Is ignored if return value is not SBI_ETRAP.

 

-  @retval 0                If the handler succeeds.

+  @retval SBI_OK           If the handler succeeds.

   @retval SBI_ENOTSUPP     If there's no function with the given ID.

   @retval SBI_ETRAP        If the called SBI functions wants to trap further.

 **/

@@ -436,7 +439,7 @@ STATIC int SbiEcallFirmwareHandler (
   OUT struct sbi_trap_info *OutTrap

   )

 {

-  int Ret = 0;

+  int Ret = SBI_OK;

 

   switch (FuncId) {

     case SBI_EXT_FW_MSCRATCH_FUNC:

@@ -447,6 +450,8 @@ STATIC int SbiEcallFirmwareHandler (
       break;

     default:

       Ret = SBI_ENOTSUPP;

+      DEBUG ((DEBUG_ERROR, "%a: Called SBI firmware ecall with invalid 
function ID\n", __FUNCTION__));

+      ASSERT (FALSE);

   };

 

   return Ret;

diff --git 
a/Silicon/RISC-V/ProcessorPkg/Library/RiscVEdk2SbiLib/RiscVEdk2SbiLib.c 
b/Silicon/RISC-V/ProcessorPkg/Library/RiscVEdk2SbiLib/RiscVEdk2SbiLib.c
index 0df505d2675b..9bbeaaec3f7a 100644
--- a/Silicon/RISC-V/ProcessorPkg/Library/RiscVEdk2SbiLib/RiscVEdk2SbiLib.c
+++ b/Silicon/RISC-V/ProcessorPkg/Library/RiscVEdk2SbiLib/RiscVEdk2SbiLib.c
@@ -801,9 +801,8 @@ SbiVendorCall (
   access the firmware context.

 

   @param[out] ScratchSpace         The scratch space pointer.

-  @retval EFI_SUCCESS              The operation succeeds.

 **/

-EFI_STATUS

+VOID

 EFIAPI

 SbiGetMscratch (

   OUT SBI_SCRATCH                    **ScratchSpace

@@ -811,11 +810,10 @@ SbiGetMscratch (
 {

   SbiRet Ret = SbiCall (SBI_EDK2_FW_EXT, SBI_EXT_FW_MSCRATCH_FUNC, 0);

 

-  if (!Ret.Error) {

-    *ScratchSpace = (SBI_SCRATCH *)Ret.Value;

-  }

+  // Our ecall handler never returns an error, only when the func id is invalid

+  ASSERT (Ret.Error == SBI_OK);

 

-  return EFI_SUCCESS;

+  *ScratchSpace = (SBI_SCRATCH *)Ret.Value;

 }

 

 /**

@@ -823,9 +821,8 @@ SbiGetMscratch (
 

   @param[in]  HartId               The hart id.

   @param[out] ScratchSpace         The scratch space pointer.

-  @retval EFI_SUCCESS              The operation succeeds.

 **/

-EFI_STATUS

+VOID

 EFIAPI

 SbiGetMscratchHartid (

   IN  UINTN                            HartId,

@@ -839,11 +836,10 @@ SbiGetMscratchHartid (
                  HartId

                  );

 

-  if (!Ret.Error) {

-    *ScratchSpace = (SBI_SCRATCH *)Ret.Value;

-  }

+  // Our ecall handler never returns an error, only when the func id is invalid

+  ASSERT (Ret.Error == SBI_OK);

 

-  return EFI_SUCCESS;

+  *ScratchSpace = (SBI_SCRATCH *)Ret.Value;

 }

 

 /**

@@ -852,7 +848,7 @@ SbiGetMscratchHartid (
   @param[out] FirmwareContext      The firmware context pointer.

   @retval EFI_SUCCESS              The operation succeeds.

 **/

-EFI_STATUS

+VOID

 EFIAPI

 SbiGetFirmwareContext (

   OUT EFI_RISCV_OPENSBI_FIRMWARE_CONTEXT **FirmwareContext

@@ -860,24 +856,18 @@ SbiGetFirmwareContext (
 {

   SBI_SCRATCH  *ScratchSpace;

   SBI_PLATFORM *SbiPlatform;

-  SbiRet Ret = SbiCall (SBI_EDK2_FW_EXT, SBI_EXT_FW_MSCRATCH_FUNC, 0);

 

-  if (!Ret.Error) {

-    ScratchSpace = (SBI_SCRATCH *)Ret.Value;

-    SbiPlatform = (SBI_PLATFORM *)sbi_platform_ptr(ScratchSpace);

-    *FirmwareContext = (EFI_RISCV_OPENSBI_FIRMWARE_CONTEXT 
*)SbiPlatform->firmware_context;

-  }

-

-  return EFI_SUCCESS;

+  SbiGetMscratch(&ScratchSpace);

+  SbiPlatform = (SBI_PLATFORM *)sbi_platform_ptr(ScratchSpace);

+  *FirmwareContext = (EFI_RISCV_OPENSBI_FIRMWARE_CONTEXT 
*)SbiPlatform->firmware_context;

 }

 

 /**

   Set firmware context of the calling hart.

 

   @param[in] FirmwareContext       The firmware context pointer.

-  @retval EFI_SUCCESS              The operation succeeds.

 **/

-EFI_STATUS

+VOID

 EFIAPI

 SbiSetFirmwareContext (

   IN EFI_RISCV_OPENSBI_FIRMWARE_CONTEXT *FirmwareContext

@@ -885,13 +875,9 @@ SbiSetFirmwareContext (
 {

   SBI_SCRATCH  *ScratchSpace;

   SBI_PLATFORM *SbiPlatform;

-  SbiRet Ret = SbiCall (SBI_EDK2_FW_EXT, SBI_EXT_FW_MSCRATCH_FUNC, 0);

 

-  if (!Ret.Error) {

-    ScratchSpace = (SBI_SCRATCH *)Ret.Value;

-    SbiPlatform = (SBI_PLATFORM *)sbi_platform_ptr (ScratchSpace);

-    SbiPlatform->firmware_context = (UINTN)FirmwareContext;

-  }

+  SbiGetMscratch(&ScratchSpace);

 

-  return EFI_SUCCESS;

+  SbiPlatform = (SBI_PLATFORM *)sbi_platform_ptr (ScratchSpace);

+  SbiPlatform->firmware_context = (UINTN)FirmwareContext;

 }

diff --git a/Silicon/SiFive/U54/Library/PeiCoreInfoHobLib/CoreInfoHob.c 
b/Silicon/SiFive/U54/Library/PeiCoreInfoHobLib/CoreInfoHob.c
index edeabf028ff8..88f36cbbe299 100644
--- a/Silicon/SiFive/U54/Library/PeiCoreInfoHobLib/CoreInfoHob.c
+++ b/Silicon/SiFive/U54/Library/PeiCoreInfoHobLib/CoreInfoHob.c
@@ -38,7 +38,7 @@
 

   @return EFI_SUCCESS     The PEIM initialized successfully.

           EFI_UNSUPPORTED HART is ignored by platform.

-

+          EFI_NOT_FOUND   Processor specific data hob is not available.

 **/

 EFI_STATUS

 EFIAPI

@@ -56,7 +56,6 @@ CreateU54E51CoreProcessorSpecificDataHob (
   RISC_V_PROCESSOR_SPECIFIC_HOB_DATA ProcessorSpecDataHob;

   EFI_RISCV_OPENSBI_FIRMWARE_CONTEXT *FirmwareContext;

   EFI_RISCV_FIRMWARE_CONTEXT_HART_SPECIFIC *FirmwareContextHartSpecific;

-  EFI_STATUS Status;

 

   DEBUG ((DEBUG_INFO, "%a: Entry.\n", __FUNCTION__));

 

@@ -64,9 +63,14 @@ CreateU54E51CoreProcessorSpecificDataHob (
     return EFI_INVALID_PARAMETER;

   }

 

-  Status = SbiGetFirmwareContext (&FirmwareContext);

-  ASSERT_EFI_ERROR (Status);

+  SbiGetFirmwareContext (&FirmwareContext);

+  ASSERT (FirmwareContext != NULL);

+  if (FirmwareContext == NULL) {

+    DEBUG ((DEBUG_ERROR, "Failed to get the pointer of 
EFI_RISCV_OPENSBI_FIRMWARE_CONTEXT of hart %d\n", HartId));

+    return EFI_NOT_FOUND;

+  }

   DEBUG ((DEBUG_INFO, "    Firmware Context is at 0x%x.\n", FirmwareContext));

+

   FirmwareContextHartSpecific = FirmwareContext->HartSpecific[HartId];

   DEBUG ((DEBUG_INFO, "    Firmware Context Hart specific is at 0x%x.\n", 
FirmwareContextHartSpecific));

   if (FirmwareContextHartSpecific == NULL) {

@@ -102,7 +106,6 @@ CreateU54E51CoreProcessorSpecificDataHob (
     ProcessorSpecDataHob.ProcessorSpecificData.SupervisorModeXlen       = 
RegisterLen64;

   }

 

-

   DebugPrintHartSpecificInfo (&ProcessorSpecDataHob);

 

   //

-- 
2.28.0



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#65761): https://edk2.groups.io/g/devel/message/65761
Mute This Topic: https://groups.io/mt/77213797/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to