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