Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch Add DISABLE_INTERRUPT_SAVE(), like DISABLE_INTERRUP...
details: https://anonhg.NetBSD.org/src/rev/08d455e3f0a1
branches: trunk
changeset: 953215:08d455e3f0a1
user: jmcneill <jmcneill%NetBSD.org@localhost>
date: Mon Mar 01 11:29:14 2021 +0000
description:
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.
diffstat:
sys/arch/aarch64/include/locore.h | 9 +++++----
sys/arch/arm/include/cpufunc.h | 5 +++--
sys/arch/arm/pic/pic_splfuncs.c | 15 ++++++++-------
3 files changed, 16 insertions(+), 13 deletions(-)
diffs (93 lines):
diff -r 474b58aa4db9 -r 08d455e3f0a1 sys/arch/aarch64/include/locore.h
--- a/sys/arch/aarch64/include/locore.h Mon Mar 01 09:24:27 2021 +0000
+++ b/sys/arch/aarch64/include/locore.h Mon Mar 01 11:29:14 2021 +0000
@@ -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)
diff -r 474b58aa4db9 -r 08d455e3f0a1 sys/arch/arm/include/cpufunc.h
--- a/sys/arch/arm/include/cpufunc.h Mon Mar 01 09:24:27 2021 +0000
+++ b/sys/arch/arm/include/cpufunc.h Mon Mar 01 11:29:14 2021 +0000
@@ -353,8 +353,9 @@
#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__));
diff -r 474b58aa4db9 -r 08d455e3f0a1 sys/arch/arm/pic/pic_splfuncs.c
--- a/sys/arch/arm/pic/pic_splfuncs.c Mon Mar 01 09:24:27 2021 +0000
+++ b/sys/arch/arm/pic/pic_splfuncs.c Mon Mar 01 11:29:14 2021 +0000
@@ -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 @@
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 @@
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 @@
}
ci->ci_intr_depth--;
if ((psw & I32_bit) == 0) {
- cpsie(I32_bit);
+ ENABLE_INTERRUPT();
}
}
#endif
Home |
Main Index |
Thread Index |
Old Index