Module Name: src Committed By: jmcneill Date: Mon Mar 1 11:29:14 UTC 2021
Modified Files: src/sys/arch/aarch64/include: locore.h src/sys/arch/arm/include: cpufunc.h src/sys/arch/arm/pic: pic_splfuncs.c Log Message: Add DISABLE_INTERRUPT_SAVE(), like DISABLE_INTERRUPT() but also returns the previous state. Use DISABLE_INTERRUPT_SAVE()/ENABLE_INTERRUPT() in pic_splfuncs instead of cpsid()/cpsie(). The difference here is the caller no longer specifies which bits to disable and enable; on arm32 we continue to use I32_bit and on aarch64 we now consistently toggle both IRQ and FIQ state. To generate a diff of this commit: cvs rdiff -u -r1.8 -r1.9 src/sys/arch/aarch64/include/locore.h cvs rdiff -u -r1.87 -r1.88 src/sys/arch/arm/include/cpufunc.h cvs rdiff -u -r1.18 -r1.19 src/sys/arch/arm/pic/pic_splfuncs.c 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/aarch64/include/locore.h diff -u src/sys/arch/aarch64/include/locore.h:1.8 src/sys/arch/aarch64/include/locore.h:1.9 --- src/sys/arch/aarch64/include/locore.h:1.8 Sat Feb 20 19:27:35 2021 +++ src/sys/arch/aarch64/include/locore.h Mon Mar 1 11:29:14 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: locore.h,v 1.8 2021/02/20 19:27:35 jmcneill Exp $ */ +/* $NetBSD: locore.h,v 1.9 2021/03/01 11:29:14 jmcneill Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -58,11 +58,12 @@ #define cpsie(psw) daif_enable((psw)) #define cpsid(psw) daif_disable((psw)) - -#define ENABLE_INTERRUPT() \ +#define ENABLE_INTERRUPT() \ reg_daifclr_write((DAIF_I|DAIF_F) >> DAIF_SETCLR_SHIFT) -#define DISABLE_INTERRUPT() \ +#define DISABLE_INTERRUPT() \ reg_daifset_write((DAIF_I|DAIF_F) >> DAIF_SETCLR_SHIFT) +#define DISABLE_INTERRUPT_SAVE() \ + daif_disable(DAIF_I|DAIF_F) #define DAIF_MASK (DAIF_D|DAIF_A|DAIF_I|DAIF_F) Index: src/sys/arch/arm/include/cpufunc.h diff -u src/sys/arch/arm/include/cpufunc.h:1.87 src/sys/arch/arm/include/cpufunc.h:1.88 --- src/sys/arch/arm/include/cpufunc.h:1.87 Sun Feb 7 21:15:40 2021 +++ src/sys/arch/arm/include/cpufunc.h Mon Mar 1 11:29:14 2021 @@ -353,8 +353,9 @@ enable_interrupts(uint32_t mask) #define restore_interrupts(old_cpsr) \ (__set_cpsr_c((I32_bit | F32_bit), (old_cpsr) & (I32_bit | F32_bit))) -#define ENABLE_INTERRUPT() cpsie(I32_bit) -#define DISABLE_INTERRUPT() cpsid(I32_bit) +#define ENABLE_INTERRUPT() cpsie(I32_bit) +#define DISABLE_INTERRUPT() cpsid(I32_bit) +#define DISABLE_INTERRUPT_SAVE() cpsid(I32_bit) static inline void cpsie(register_t psw) __attribute__((__unused__)); static inline register_t cpsid(register_t psw) __attribute__((__unused__)); Index: src/sys/arch/arm/pic/pic_splfuncs.c diff -u src/sys/arch/arm/pic/pic_splfuncs.c:1.18 src/sys/arch/arm/pic/pic_splfuncs.c:1.19 --- src/sys/arch/arm/pic/pic_splfuncs.c:1.18 Mon Feb 22 21:16:25 2021 +++ src/sys/arch/arm/pic/pic_splfuncs.c Mon Mar 1 11:29:14 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: pic_splfuncs.c,v 1.18 2021/02/22 21:16:25 jmcneill Exp $ */ +/* $NetBSD: pic_splfuncs.c,v 1.19 2021/03/01 11:29:14 jmcneill Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. @@ -28,7 +28,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pic_splfuncs.c,v 1.18 2021/02/22 21:16:25 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pic_splfuncs.c,v 1.19 2021/03/01 11:29:14 jmcneill Exp $"); #define _INTR_PRIVATE #include <sys/param.h> @@ -75,12 +75,13 @@ _spllower(int newipl) const int oldipl = ci->ci_cpl; KDASSERT(panicstr || newipl <= ci->ci_cpl); if (newipl < ci->ci_cpl) { - register_t psw = cpsid(I32_bit); + register_t psw = DISABLE_INTERRUPT_SAVE(); ci->ci_intr_depth++; pic_do_pending_ints(psw, newipl, NULL); ci->ci_intr_depth--; - if ((psw & I32_bit) == 0 || newipl == IPL_NONE) - cpsie(I32_bit); + if ((psw & I32_bit) == 0 || newipl == IPL_NONE) { + ENABLE_INTERRUPT(); + } cpu_dosoftints(); } return oldipl; @@ -113,7 +114,7 @@ splx(int savedipl) static void __noinline splx_dopendingints(struct cpu_info *ci, const int savedipl) { - const register_t psw = cpsid(I32_bit); + const register_t psw = DISABLE_INTERRUPT_SAVE(); ci->ci_intr_depth++; while ((ci->ci_pending_ipls & ~__BIT(savedipl)) > __BIT(savedipl)) { KASSERT(ci->ci_pending_ipls < __BIT(NIPL)); @@ -131,7 +132,7 @@ splx_dopendingints(struct cpu_info *ci, } ci->ci_intr_depth--; if ((psw & I32_bit) == 0) { - cpsie(I32_bit); + ENABLE_INTERRUPT(); } } #endif