Looks reasonable to me.

Reviewed-by: Andrei Warkentin <andrei.warken...@intel.com>

> -----Original Message-----
> From: Yang Wang <wangy...@bosc.ac.cn>
> Sent: Wednesday, December 27, 2023 8:57 PM
> To: Warkentin, Andrei <andrei.warken...@intel.com>; devel@edk2.groups.io
> Cc: Yang Wang <wangy...@bosc.ac.cn>; Ran Wang <wang...@bosc.ac.cn>;
> Bamvor Jian ZHANG <zhangj...@bosc.ac.cn>; Gao, Liming
> <gaolim...@byosoft.com.cn>; Kinney, Michael D
> <michael.d.kin...@intel.com>; Sunil V L <suni...@ventanamicro.com>; Liu,
> Zhiguang <zhiguang....@intel.com>
> Subject: [PATCH v2] MdePkg/BaseLib:Fix boot DxeCore hang on riscv platform
> 
> For scene of
> HandOffToDxeCore()->SwitchStack(DxeCoreEntryPoint)->
> InternalSwitchStack()->LongJump(),Variable HobList.Raw
> will be passed (from *Context1 to register a0) to
> DxeMain() in parameter *HobStart.
> 
> However, meanwhile the function LongJump() overrides
> register a0 with a1 (-1)  due to commit (ea628f28e5 "RISCV: Fix
> InternalLongJump to return correct value"), then cause hang.
> 
> Replacing calling LongJump() with new InternalSwitchStackAsm() to pass
> addres data in register s0 to register a0 could fix this issue (just
> like the solution in MdePkg/Library/BaseLib/AArch64/SwitchStack.S)
> 
> Signed-off-by: Yang Wang <wangy...@bosc.ac.cn>
> Reviewed-by: Ran Wang <wang...@bosc.ac.cn>
> Cc: Bamvor Jian ZHANG <zhangj...@bosc.ac.cn>
> Cc: Andrei Warkentin <andrei.warken...@intel.com>
> Cc: Liming Gao <gaolim...@byosoft.com.cn>
> Cc: Michael D Kinney <michael.d.kin...@intel.com>
> Cc: Sunil V L <suni...@ventanamicro.com>
> Cc: Zhiguang Liu <zhiguang....@intel.com>
> ---
> Change in v2:
>         - Remove JumpBuffer variable parameter
>         - Take these in the order of Context1, Context2, EntryPoint, NewStack
>         - Fix BaseLib.inf, add Compilation SwitchStack.S
>         - Drop REG_S/REG_L
> 
>  MdePkg/Library/BaseLib/BaseLib.inf            |  1 +
>  .../BaseLib/RiscV64/InternalSwitchStack.c     | 31 ++++++++++++----
>  MdePkg/Library/BaseLib/RiscV64/SwitchStack.S  | 37
> +++++++++++++++++++
>  3 files changed, 62 insertions(+), 7 deletions(-)
>  create mode 100644 MdePkg/Library/BaseLib/RiscV64/SwitchStack.S
> 
> diff --git a/MdePkg/Library/BaseLib/BaseLib.inf
> b/MdePkg/Library/BaseLib/BaseLib.inf
> index 5338938944..6b46949be3 100644
> --- a/MdePkg/Library/BaseLib/BaseLib.inf
> +++ b/MdePkg/Library/BaseLib/BaseLib.inf
> @@ -397,6 +397,7 @@
>    RiscV64/CpuPause.c
> 
>    RiscV64/MemoryFence.S             | GCC
> 
>    RiscV64/RiscVSetJumpLongJump.S    | GCC
> 
> +  RiscV64/SwitchStack.S             | GCC
> 
>    RiscV64/RiscVCpuBreakpoint.S      | GCC
> 
>    RiscV64/RiscVCpuPause.S           | GCC
> 
>    RiscV64/RiscVInterrupt.S          | GCC
> 
> diff --git a/MdePkg/Library/BaseLib/RiscV64/InternalSwitchStack.c
> b/MdePkg/Library/BaseLib/RiscV64/InternalSwitchStack.c
> index b78424c163..3216d241ad 100644
> --- a/MdePkg/Library/BaseLib/RiscV64/InternalSwitchStack.c
> +++ b/MdePkg/Library/BaseLib/RiscV64/InternalSwitchStack.c
> @@ -8,6 +8,29 @@
> 
> 
>  #include "BaseLibInternals.h"
> 
> 
> 
> +/**
> 
> +  Transfers control to a function starting with a new stack.
> 
> +
> 
> +  This internal worker function transfers control to the function
> 
> +  specified by EntryPoint using the new stack specified by NewStack,
> 
> +  and passes in the parameters specified by Context1 and Context2.
> 
> +  Context1 and Context2 are optional and may be NULL.
> 
> +  The function EntryPoint must never return.
> 
> +
> 
> +  @param Context1     The first parameter to pass in.
> 
> +  @param Context2     The second Parameter to pass in
> 
> +  @param EntryPoint   The pointer to the function to enter.
> 
> +  @param NewStack     The new Location of the stack
> 
> +
> 
> +**/
> 
> +VOID
> 
> +EFIAPI
> 
> +InternalSwitchStackAsm (
> 
> +  IN      VOID                      *Context1    OPTIONAL,
> 
> +  IN      VOID                      *Context2    OPTIONAL,
> 
> +  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,
> 
> +  IN      VOID                      *NewStack
> 
> +  );
> 
>  /**
> 
>    Transfers control to a function starting with a new stack.
> 
> 
> 
> @@ -42,12 +65,6 @@ InternalSwitchStack (
>    IN      VA_LIST                   Marker
> 
>    )
> 
>  {
> 
> -  BASE_LIBRARY_JUMP_BUFFER  JumpBuffer;
> 
> -
> 
> -  JumpBuffer.RA = (UINTN)EntryPoint;
> 
> -  JumpBuffer.SP = (UINTN)NewStack - sizeof (VOID *);
> 
> -  JumpBuffer.S0 = (UINT64)(UINTN)Context1;
> 
> -  JumpBuffer.S1 = (UINT64)(UINTN)Context2;
> 
> -  LongJump (&JumpBuffer, (UINTN)-1);
> 
> +  InternalSwitchStackAsm (Context1, Context2, EntryPoint, (VOID
> *)((UINTN)NewStack - sizeof (VOID *)));
> 
>    ASSERT (FALSE);
> 
>  }
> 
> diff --git a/MdePkg/Library/BaseLib/RiscV64/SwitchStack.S
> b/MdePkg/Library/BaseLib/RiscV64/SwitchStack.S
> new file mode 100644
> index 0000000000..db535c1aab
> --- /dev/null
> +++ b/MdePkg/Library/BaseLib/RiscV64/SwitchStack.S
> @@ -0,0 +1,37 @@
> +//------------------------------------------------------------------------------
> 
> +//
> 
> +// InternalSwitchStackAsm for RISC-V
> 
> +//
> 
> +// Copyright (c) 2023, Bosc Corporation. All rights reserved.<BR>
> 
> +//
> 
> +// SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> +//
> 
> +//------------------------------------------------------------------------------
> 
> +.align 3
> 
> +
> 
> +#/**
> 
> +#
> 
> +# This allows the caller to switch the stack and goes to the new entry point
> 
> +#
> 
> +# @param      Context      Parameter to pass in
> 
> +# @param      Context2     Parameter2 to pass in
> 
> +# @param      EntryPoint   The pointer to the location to enter
> 
> +# @param      NewStack     New Location of the stack
> 
> +#
> 
> +# @return     Nothing. Goes to the Entry Point passing in the new parameters
> 
> +#
> 
> +#**/
> 
> +#VOID
> 
> +#EFIAPI
> 
> +#InternalSwitchStackAsm (
> 
> +#  VOID  *Context,
> 
> +#  VOID  *Context2,
> 
> +#  SWITCH_STACK_ENTRY_POINT EntryPoint,
> 
> +#  VOID  *NewStack
> 
> +#  );
> 
> +#
> 
> +    .globl InternalSwitchStackAsm
> 
> +InternalSwitchStackAsm:
> 
> +  mv ra, a2
> 
> +  mv sp, a3
> 
> +  ret
> 
> --
> 2.25.1



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


Reply via email to