ACK: [SRU][G][PATCH 1/1] s390: fix fpu restore in entry.S
Stefan Bader
stefan.bader at canonical.com
Thu Dec 3 08:48:37 UTC 2020
On 02.12.20 21:33, frank.heimes at canonical.com wrote:
> From: Sven Schnelle <svens at linux.ibm.com>
>
> BugLink: https://bugs.launchpad.net/bugs/1906255
>
> We need to disable interrupts in load_fpu_regs(). Otherwise an
> interrupt might come in after the registers are loaded, but before
> CIF_FPU is cleared in load_fpu_regs(). When the interrupt returns,
> CIF_FPU will be cleared and the registers will never be restored.
>
> The entry.S code usually saves the interrupt state in __SF_EMPTY on the
> stack when disabling/restoring interrupts. sie64a however saves the pointer
> to the sie control block in __SF_SIE_CONTROL, which references the same
> location. This is non-obvious to the reader. To avoid thrashing the sie
> control block pointer in load_fpu_regs(), move the __SIE_* offsets eight
> bytes after __SF_EMPTY on the stack.
>
> Cc: <stable at vger.kernel.org> # 5.8
> Fixes: 0b0ed657fe00 ("s390: remove critical section cleanup from entry.S")
> Reported-by: Pierre Morel <pmorel at linux.ibm.com>
> Signed-off-by: Sven Schnelle <svens at linux.ibm.com>
> Acked-by: Christian Borntraeger <borntraeger at de.ibm.com>
> Reviewed-by: Heiko Carstens <hca at linux.ibm.com>
> Signed-off-by: Heiko Carstens <hca at linux.ibm.com>
> (cherry picked from commit 1179f170b6f0af7bb0b3b7628136eaac450ddf31 linux-next)
> Signed-off-by: Frank Heimes <frank.heimes at canonical.com>
Acked-by: Stefan Bader <stefan.bader at canonical.com>
> ---
> arch/s390/kernel/asm-offsets.c | 10 +++++-----
> arch/s390/kernel/entry.S | 2 ++
> 2 files changed, 7 insertions(+), 5 deletions(-)
>
> diff --git a/arch/s390/kernel/asm-offsets.c b/arch/s390/kernel/asm-offsets.c
> index 5d8cc1864566..62a18dee4c36 100644
> --- a/arch/s390/kernel/asm-offsets.c
> +++ b/arch/s390/kernel/asm-offsets.c
> @@ -53,11 +53,11 @@ int main(void)
> /* stack_frame offsets */
> OFFSET(__SF_BACKCHAIN, stack_frame, back_chain);
> OFFSET(__SF_GPRS, stack_frame, gprs);
> - OFFSET(__SF_EMPTY, stack_frame, empty1);
> - OFFSET(__SF_SIE_CONTROL, stack_frame, empty1[0]);
> - OFFSET(__SF_SIE_SAVEAREA, stack_frame, empty1[1]);
> - OFFSET(__SF_SIE_REASON, stack_frame, empty1[2]);
> - OFFSET(__SF_SIE_FLAGS, stack_frame, empty1[3]);
> + OFFSET(__SF_EMPTY, stack_frame, empty1[0]);
> + OFFSET(__SF_SIE_CONTROL, stack_frame, empty1[1]);
> + OFFSET(__SF_SIE_SAVEAREA, stack_frame, empty1[2]);
> + OFFSET(__SF_SIE_REASON, stack_frame, empty1[3]);
> + OFFSET(__SF_SIE_FLAGS, stack_frame, empty1[4]);
> BLANK();
> /* timeval/timezone offsets for use by vdso */
> OFFSET(__VDSO_UPD_COUNT, vdso_data, tb_update_count);
> diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S
> index 969b35b177dd..f314a638fa8d 100644
> --- a/arch/s390/kernel/entry.S
> +++ b/arch/s390/kernel/entry.S
> @@ -1070,6 +1070,7 @@ EXPORT_SYMBOL(save_fpu_regs)
> * %r4
> */
> load_fpu_regs:
> + stnsm __SF_EMPTY(%r15),0xfc
> lg %r4,__LC_CURRENT
> aghi %r4,__TASK_thread
> TSTMSK __LC_CPU_FLAGS,_CIF_FPU
> @@ -1101,6 +1102,7 @@ load_fpu_regs:
> .Lload_fpu_regs_done:
> ni __LC_CPU_FLAGS+7,255-_CIF_FPU
> .Lload_fpu_regs_exit:
> + ssm __SF_EMPTY(%r15)
> BR_EX %r14
> .Lload_fpu_regs_end:
> ENDPROC(load_fpu_regs)
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <https://lists.ubuntu.com/archives/kernel-team/attachments/20201203/92e4e4b2/attachment.sig>
More information about the kernel-team
mailing list