Module Name: src Committed By: riastradh Date: Thu Feb 23 14:56:37 UTC 2023
Modified Files: src/sys/arch/sparc/sparc: locore.s Log Message: sparc: Add missing barriers in cpu_switchto. PR kern/57240 XXX pullup-8 XXX pullup-9 XXX pullup-10 To generate a diff of this commit: cvs rdiff -u -r1.283 -r1.284 src/sys/arch/sparc/sparc/locore.s Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/sparc/sparc/locore.s diff -u src/sys/arch/sparc/sparc/locore.s:1.283 src/sys/arch/sparc/sparc/locore.s:1.284 --- src/sys/arch/sparc/sparc/locore.s:1.283 Sun May 15 02:14:15 2022 +++ src/sys/arch/sparc/sparc/locore.s Thu Feb 23 14:56:37 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: locore.s,v 1.283 2022/05/15 02:14:15 mrg Exp $ */ +/* $NetBSD: locore.s,v 1.284 2023/02/23 14:56:37 riastradh Exp $ */ /* * Copyright (c) 1996 Paul Kranenburg @@ -4889,7 +4889,30 @@ Lwb1: SAVE; SAVE; SAVE; SAVE; SAVE; SAVE /* set new cpcb, and curlwp */ sethi %hi(curlwp), %l7 st %g5, [%l6 + %lo(cpcb)] ! cpcb = newpcb; + + /* + * Issue barriers to coordinate mutex_exit on this CPU with + * mutex_vector_enter on another CPU. + * + * 1. Any prior mutex_exit by oldlwp must be visible to other + * CPUs before we set ci_curlwp := newlwp on this one, + * requiring a store-before-store barrier. + * + * 2. ci_curlwp := newlwp must be visible on all other CPUs + * before any subsequent mutex_exit by newlwp can even test + * whether there might be waiters, requiring a + * store-before-load barrier. + * + * See kern_mutex.c for details -- this is necessary for + * adaptive mutexes to detect whether the lwp is on the CPU in + * order to safely block without requiring atomic r/m/w in + * mutex_exit. + */ + /* stbar -- store-before-store, not needed on TSO */ st %g3, [%l7 + %lo(curlwp)] ! curlwp = l; +#ifdef MULTIPROCESSOR + ldstub [%sp - 4], %g0 /* makeshift store-before-load barrier */ +#endif /* compute new wim */ ld [%g5 + PCB_WIM], %o0