From: Laurent Dufour <ldufour@linux.ibm.com>
To: Nicholas Piggin <npiggin@gmail.com>, linuxppc-dev@lists.ozlabs.org
Cc: "Aneesh Kumar K.V" <aneesh.kumar@linux.ibm.com>
Subject: Re: [PATCH 08/14] powerpc/rtas: call enter_rtas in real-mode on 64-bit
Date: Thu, 17 Mar 2022 10:36:46 +0100 [thread overview]
Message-ID: <8127f55c-c8d9-9151-d7bd-4ca312e079c7@linux.ibm.com> (raw)
In-Reply-To: <20220308135047.478297-9-npiggin@gmail.com>
On 08/03/2022, 14:50:41, Nicholas Piggin wrote:
> This moves MSR save/restore and some real-mode juggling out of asm and
> into C code, simplifying things.
>
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
> ---
> arch/powerpc/kernel/rtas.c | 15 ++++++++++++---
> arch/powerpc/kernel/rtas_entry.S | 32 +++++---------------------------
> 2 files changed, 17 insertions(+), 30 deletions(-)
>
> diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c
> index 6b5892d6a56b..87ede1877816 100644
> --- a/arch/powerpc/kernel/rtas.c
> +++ b/arch/powerpc/kernel/rtas.c
> @@ -47,13 +47,22 @@
> /* This is here deliberately so it's only used in this file */
> void enter_rtas(unsigned long);
>
> -static inline void do_enter_rtas(unsigned long args)
> +static noinline void do_enter_rtas(unsigned long args)
> {
> BUG_ON(!irqs_disabled());
>
> - hard_irq_disable(); /* Ensure MSR[EE] is disabled on PPC64 */
> + if (IS_ENABLED(CONFIG_PPC64)) {
> + unsigned long msr;
>
> - enter_rtas(args);
> + hard_irq_disable();
> +
> + msr = mfmsr();
> + mtmsr(msr & ~(MSR_IR|MSR_DR));
Further test done on top this series shows that switching MSR_DR off before
entering enter_rtas() is generating DSI when accessing the stack in
enter_rtas(). This may happen if the task stack is mapped beyond the VRMA.
Furthermore, there is no real need to run enter_rtas() in real mode (IR and
DR unset) because the MSR will be set to real mode when doing rfid, see below.
> + enter_rtas(args);
> + mtmsr(msr);
> + } else {
> + enter_rtas(args);
> + }
>
> srr_regs_clobbered(); /* rtas uses SRRs, invalidate */
> }
> diff --git a/arch/powerpc/kernel/rtas_entry.S b/arch/powerpc/kernel/rtas_entry.S
> index 5f65ea4436c6..292551684bbd 100644
> --- a/arch/powerpc/kernel/rtas_entry.S
> +++ b/arch/powerpc/kernel/rtas_entry.S
> @@ -84,14 +84,11 @@ _GLOBAL(enter_rtas)
> li r0,0
> mtcr r0
>
> - mfmsr r6
> -
> - /* Unfortunately, the stack pointer and the MSR are also clobbered,
> - * so they are saved in the PACA which allows us to restore
> - * our original state after RTAS returns.
> + /*
> + * The stack pointer is clobbered, so it is saved in the PACA which
> + * allows us to restore our original state after RTAS returns.
> */
> std r1,PACAR1(r13)
> - std r6,PACASAVEDMSR(r13)
>
> /* Setup our real return addr */
> LOAD_REG_ADDR(r4,rtas_return_loc)
> @@ -100,7 +97,6 @@ _GLOBAL(enter_rtas)
>
> LOAD_REG_IMMEDIATE(r6, MSR_ME)
>
> -__enter_rtas:
> LOAD_REG_ADDR(r4, rtas)
> ld r5,RTASENTRY(r4) /* get the rtas->entry value */
> ld r4,RTASBASE(r4) /* get the rtas->base value */
> @@ -112,6 +108,7 @@ __enter_rtas:
> mtspr SPRN_SRR1,r6
> RFI_TO_KERNEL
rfid will load the MSR with the value stored in SRR1 (formely r6) and so
switch to the real mode. This why there is no need to switch earlier in
real mode.
> b . /* prevent speculative execution */
> +_ASM_NOKPROBE_SYMBOL(enter_rtas)
>
> rtas_return_loc:
> FIXUP_ENDIAN
> @@ -127,29 +124,10 @@ rtas_return_loc:
> sync
> mtmsrd r6
>
> - /* relocation is off at this point */> GET_PACA(r13)
>
> - bcl 20,31,$+4
> -0: mflr r3
> - ld r3,(1f-0b)(r3) /* get &rtas_restore_regs */
> -
> ld r1,PACAR1(r13) /* Restore our SP */
> - ld r4,PACASAVEDMSR(r13) /* Restore our MSR */
>
> - mtspr SPRN_SRR0,r3
> - mtspr SPRN_SRR1,r4
> - RFI_TO_KERNEL
This was turning on MSR_DR and MSR_IR so rtas_restore() could access the
stack even if it is beyond the VRMA.
That patch is breaking this and generating panic when task's stack are
below VRMA.
> - b . /* prevent speculative execution */
> -_ASM_NOKPROBE_SYMBOL(enter_rtas)
> -_ASM_NOKPROBE_SYMBOL(__enter_rtas)
> -_ASM_NOKPROBE_SYMBOL(rtas_return_loc)
> -
> - .align 3
> -1: .8byte rtas_restore_regs
> -
> -rtas_restore_regs:
> - /* relocation is on at this point */
> REST_GPR(2, r1) /* Restore the TOC */
> REST_NVGPRS(r1) /* Restore the non-volatiles */
>
> @@ -169,5 +147,5 @@ rtas_restore_regs:
>
> mtlr r0
> blr /* return to caller */
> -
> +_ASM_NOKPROBE_SYMBOL(rtas_return_loc)
> #endif /* CONFIG_PPC32 */
next prev parent reply other threads:[~2022-03-17 9:37 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-08 13:50 [PATCH 00/14] powerpc/rtas: various cleanups and improvements Nicholas Piggin
2022-03-08 13:50 ` [PATCH 01/14] powerpc/rtas: Move rtas entry assembly into its own file Nicholas Piggin
2022-03-08 13:50 ` [PATCH 02/14] powerpc/rtas: Make enter_rtas a nokprobe symbol on 64-bit Nicholas Piggin
2022-03-08 13:50 ` [PATCH 03/14] powerpc/rtas: Fix whitespace in rtas_entry.S Nicholas Piggin
2022-03-08 13:50 ` [PATCH 04/14] powerpc/rtas: Call enter_rtas with MSR[EE] disabled Nicholas Piggin
2022-03-14 15:12 ` Laurent Dufour
2022-03-08 13:50 ` [PATCH 05/14] powerpc/rtas: Modernise RI clearing on 64-bit Nicholas Piggin
2022-03-14 15:15 ` Laurent Dufour
2022-03-08 13:50 ` [PATCH 06/14] powerpc/rtas: Load rtas entry MSR explicitly Nicholas Piggin
2022-03-14 15:17 ` Laurent Dufour
2022-03-08 13:50 ` [PATCH 07/14] powerpc/rtas: PACA can be restored directly from SPRG Nicholas Piggin
2022-03-14 15:32 ` Laurent Dufour
2022-03-08 13:50 ` [PATCH 08/14] powerpc/rtas: call enter_rtas in real-mode on 64-bit Nicholas Piggin
2022-03-14 17:09 ` Laurent Dufour
2022-03-17 9:36 ` Laurent Dufour [this message]
2022-03-08 13:50 ` [PATCH 09/14] powerpc/rtas: Leave MSR[RI] enabled over RTAS call Nicholas Piggin
2022-03-14 17:17 ` Laurent Dufour
2022-03-08 13:50 ` [PATCH 10/14] powerpc/rtas: replace rtas_call_unlocked with raw_rtas_call Nicholas Piggin
2022-03-14 17:30 ` Laurent Dufour
2022-03-08 13:50 ` [PATCH 11/14] powerpc/rtas: tidy __fetch_rtas_last_error Nicholas Piggin
2022-03-08 13:50 ` [PATCH 12/14] powerpc/rtas: Close theoretical memory leak Nicholas Piggin
2022-03-15 17:17 ` Laurent Dufour
2022-03-08 13:50 ` [PATCH 13/14] powerpc/rtas: enture rtas_call is called with MMU enabled Nicholas Piggin
2022-03-15 17:18 ` Laurent Dufour
2022-03-08 13:50 ` [PATCH 14/14] powerpc/rtas: Consolidate and improve checking for rtas callers Nicholas Piggin
2022-03-15 17:26 ` Laurent Dufour
2022-03-08 14:51 ` [PATCH 00/14] powerpc/rtas: various cleanups and improvements Christophe Leroy
2022-03-17 11:15 ` Laurent Dufour
2022-05-24 11:08 ` Michael Ellerman
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-all 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=8127f55c-c8d9-9151-d7bd-4ca312e079c7@linux.ibm.com \
--to=ldufour@linux.ibm.com \
--cc=aneesh.kumar@linux.ibm.com \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=npiggin@gmail.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.