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..cac183636d 100644 --- a/MdePkg/Library/BaseLib/RiscV64/InternalSwitchStack.c +++ b/MdePkg/Library/BaseLib/RiscV64/InternalSwitchStack.c @@ -8,6 +8,30 @@ #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 +66,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.
+// +// 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