From: "Andrei Warkentin" <andrei.warkentin@intel.com>
To: Yang Wang <wangyang@bosc.ac.cn>,
"devel@edk2.groups.io" <devel@edk2.groups.io>
Cc: Ran Wang <wangran@bosc.ac.cn>,
Bamvor Jian ZHANG <zhangjian@bosc.ac.cn>,
"Gao, Liming" <gaoliming@byosoft.com.cn>,
"Kinney, Michael D" <michael.d.kinney@intel.com>,
Sunil V L <sunilvl@ventanamicro.com>,
"Liu, Zhiguang" <zhiguang.liu@intel.com>
Subject: Re: [edk2-devel] [PATCH v2] MdePkg/BaseLib:Fix boot DxeCore hang on riscv platform
Date: Fri, 5 Jan 2024 15:47:07 +0000 [thread overview]
Message-ID: <PH8PR11MB68567DB1519313ED419CB2A883662@PH8PR11MB6856.namprd11.prod.outlook.com> (raw)
In-Reply-To: <63fe1c56bfa5d917d34c6ca9c5d85494385687bb.1703678382.git.wangyang@bosc.ac.cn>
Looks reasonable to me.
Reviewed-by: Andrei Warkentin <andrei.warkentin@intel.com>
> -----Original Message-----
> From: Yang Wang <wangyang@bosc.ac.cn>
> Sent: Wednesday, December 27, 2023 8:57 PM
> To: Warkentin, Andrei <andrei.warkentin@intel.com>; devel@edk2.groups.io
> Cc: Yang Wang <wangyang@bosc.ac.cn>; Ran Wang <wangran@bosc.ac.cn>;
> Bamvor Jian ZHANG <zhangjian@bosc.ac.cn>; Gao, Liming
> <gaoliming@byosoft.com.cn>; Kinney, Michael D
> <michael.d.kinney@intel.com>; Sunil V L <sunilvl@ventanamicro.com>; Liu,
> Zhiguang <zhiguang.liu@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 <wangyang@bosc.ac.cn>
> Reviewed-by: Ran Wang <wangran@bosc.ac.cn>
> Cc: Bamvor Jian ZHANG <zhangjian@bosc.ac.cn>
> Cc: Andrei Warkentin <andrei.warkentin@intel.com>
> Cc: Liming Gao <gaoliming@byosoft.com.cn>
> Cc: Michael D Kinney <michael.d.kinney@intel.com>
> Cc: Sunil V L <sunilvl@ventanamicro.com>
> Cc: Zhiguang Liu <zhiguang.liu@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/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-
next prev parent reply other threads:[~2024-01-05 15:47 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-12-28 2:56 [edk2-devel] [PATCH v2] MdePkg/BaseLib:Fix boot DxeCore hang on riscv platform 王洋
2024-01-05 15:47 ` Andrei Warkentin [this message]
2024-01-11 15:21 ` Sunil V L
2024-01-15 2:08 ` WangYang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=PH8PR11MB68567DB1519313ED419CB2A883662@PH8PR11MB6856.namprd11.prod.outlook.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox