NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

PR/52603 CVS commit: [netbsd-8] src/sys



The following reply was made to PR port-arm/52603; it has been noted by GNATS.

From: "Soren Jacobsen" <snj%netbsd.org@localhost>
To: gnats-bugs%gnats.NetBSD.org@localhost
Cc: 
Subject: PR/52603 CVS commit: [netbsd-8] src/sys
Date: Tue, 24 Oct 2017 09:14:59 +0000

 Module Name:	src
 Committed By:	snj
 Date:		Tue Oct 24 09:14:59 UTC 2017
 
 Modified Files:
 	src/sys/arch/arm/vfp [netbsd-8]: vfp_init.c
 	src/sys/kern [netbsd-8]: subr_pcu.c
 
 Log Message:
 Pull up following revision(s) (requested by bouyer in ticket #326):
 	sys/arch/arm/vfp/vfp_init.c: revision 1.54-1.55
 	sys/kern/subr_pcu.c: revision 1.21
 PR port-arm/52603:
 There is a race here, as seen on arm with FPU:
 LWP L is running but not on CPU, has its FPU state on CPU2 which
 has not been released yet, so fpexc still has VFP_FPEXC_EN set in the PCB copy.
 LWP L is scheduled on CPU1, CPU1 calls cpu_switchto() for L in mi_switch().
 cpu_switchto() will set VFP_FPEXC_EN in the FPU's fpexc register per the
 PCB fpexc copy.
 Before CPU1 calls pcu_switchpoint() for L, CPU2 calls
 pcu_do_op(PCU_CMD_SAVE | PCU_CMD_RELEASE) for L because it still holds its
 FPU state and wants to load another lwp. This cause VFP_FPEXC_EN to
 be cleared in the PCB copy, but not in CPU1's register. L's l_pcu_cpu is
 set to NULL.
 When CPU1 calls pcu_switchpoint() for L it see l_pcu_cpu is NULL, and doesn't
 call the release callback.
 Now CPU1 has its FPU enabled but with the wrong FPU state.
 Fix by releasing the PCU even if l_pcu_cpu is NULL.
 --
 In the REENABLE case, make sur the fpexc copy in the pcb also has
 VFP_FPEXC_EN set. Otherwise we could trap on every context switch even if
 the CPU already has the VFP state.
 --
 We KASSERT((fregs->vfp_fpexc & VFP_FPEXC_EN) == 0) just before, so
 enabled is always false. remove.
 
 
 To generate a diff of this commit:
 cvs rdiff -u -r1.53 -r1.53.2.1 src/sys/arch/arm/vfp/vfp_init.c
 cvs rdiff -u -r1.20 -r1.20.6.1 src/sys/kern/subr_pcu.c
 
 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.
 


Home | Main Index | Thread Index | Old Index