Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 14 Feb 2019 15:15:32 +0000 (UTC)
From:      Leandro Lupori <luporl@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r344123 - head/sys/powerpc/powerpc
Message-ID:  <201902141515.x1EFFWQR017952@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: luporl
Date: Thu Feb 14 15:15:32 2019
New Revision: 344123
URL: https://svnweb.freebsd.org/changeset/base/344123

Log:
  [PPC64] Fix mismatch between thread flags and MSR
  
  When sigreturn() restored a thread's context, SRR1 was being restored
  to its previous value, but pcb_flags was not being touched.
  
  This could cause a mismatch between the thread's MSR and its pcb_flags.
  For instance, when the thread used the FPU for the first time inside
  the signal handler, sigreturn() would clear SRR1, but not pcb_flags.
  Then, the thread would return with the FPU bit cleared in MSR and,
  the next time it tried to use the FPU, it would fail on a KASSERT
  that checked if the FPU was disabled.
  
  This change clears the FPU bit in both pcb_flags and frame->srr1,
  as the code that restores the context expects to use the FPU trap
  to re-enable it.
  
  PR:		234539
  Reported by:	sbruno
  Reviewed by:	jhibbits, sbruno
  Differential Revision:	https://reviews.freebsd.org/D19166

Modified:
  head/sys/powerpc/powerpc/exec_machdep.c

Modified: head/sys/powerpc/powerpc/exec_machdep.c
==============================================================================
--- head/sys/powerpc/powerpc/exec_machdep.c	Thu Feb 14 14:50:47 2019	(r344122)
+++ head/sys/powerpc/powerpc/exec_machdep.c	Thu Feb 14 15:15:32 2019	(r344123)
@@ -474,6 +474,10 @@ set_mcontext(struct thread *td, mcontext_t *mcp)
 	else
 		tf->fixreg[2] = tls;
 
+	/* Disable FPU */
+	tf->srr1 &= ~PSL_FP;
+	pcb->pcb_flags &= ~PCB_FPU;
+
 	if (mcp->mc_flags & _MC_FP_VALID) {
 		/* enable_fpu() will happen lazily on a fault */
 		pcb->pcb_flags |= PCB_FPREGS;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201902141515.x1EFFWQR017952>