Module Name: src Committed By: rin Date: Thu Jul 15 04:58:33 UTC 2021
Modified Files: src/sys/arch/sh3/sh3: locore_subr.S Log Message: For cpu_switchto(), inherit PSL_IMASK field of SR between lwp's. Otherwise, IPL is lost during context switch, which allows improper interrupts when, e.g., spin mutexes are hold. With this fix, full ATF is successfully completed on DIAGNOSTIC kernel (with one KASSERT in uvm_map.c, which triggers kern/51254, converted to printf). Thanks uwe@ for review and suggesting optimization. Also thanks ad@ for useful comment, and ryo@ for giving me reference manuals of SH-4! To generate a diff of this commit: cvs rdiff -u -r1.60 -r1.61 src/sys/arch/sh3/sh3/locore_subr.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/sh3/sh3/locore_subr.S diff -u src/sys/arch/sh3/sh3/locore_subr.S:1.60 src/sys/arch/sh3/sh3/locore_subr.S:1.61 --- src/sys/arch/sh3/sh3/locore_subr.S:1.60 Mon Aug 3 16:43:44 2020 +++ src/sys/arch/sh3/sh3/locore_subr.S Thu Jul 15 04:58:33 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: locore_subr.S,v 1.60 2020/08/03 16:43:44 uwe Exp $ */ +/* $NetBSD: locore_subr.S,v 1.61 2021/07/15 04:58:33 rin Exp $ */ /*- * Copyright (c) 2002 The NetBSD Foundation, Inc. @@ -40,7 +40,7 @@ #include <sh3/mmu_sh3.h> #include <sh3/mmu_sh4.h> -__KERNEL_RCSID(0, "$NetBSD: locore_subr.S,v 1.60 2020/08/03 16:43:44 uwe Exp $") +__KERNEL_RCSID(0, "$NetBSD: locore_subr.S,v 1.61 2021/07/15 04:58:33 rin Exp $") /* @@ -140,7 +140,22 @@ ENTRY(cpu_switchto) mov r10, r1 ! &nlwp->l_md.md_pcb->pcb_sf mov r9, r0 ! return olwp (we are about to clobber r9) ldc.l @r1+, gbr - ldc.l @r1+, sr + + /* + * We cannot simply pop SR here; PSL_IMASK field should be + * inherited to nlwp. Otherwise, IPL is lost during context + * switch, which allows improper interrupts when, e.g., + * spin mutexes are hold. + */ + mov.l @r1+, r8 ! r8 = new SR + mov #0x78, r9 + shll r9 ! r9 = PSL_IMASK + not r9, r10 ! r10 = ~PSL_IMASK + and r9, r11 ! r11 = old SR & PSL_IMASK + and r10, r8 + or r11, r8 + ldc r8, sr + lds.l @r1+, pr mov.l @r1+, r8 mov.l @r1+, r9