aboutsummaryrefslogtreecommitdiff
path: root/i386
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2023-08-12 18:57:09 +0200
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2023-08-12 23:29:30 +0200
commit18c0d15c5b63fc2345c63a78f5586ff47eda706f (patch)
treeaf58a58053746a84048bfeba5acef6583e16c118 /i386
parent98a5b2d84e39d5cc8a92951589aa307fdbaff902 (diff)
downloadgnumach-18c0d15c5b63fc2345c63a78f5586ff47eda706f.tar.gz
gnumach-18c0d15c5b63fc2345c63a78f5586ff47eda706f.tar.bz2
gnumach-18c0d15c5b63fc2345c63a78f5586ff47eda706f.zip
simple lock: check that the non-_irq variants are not called from IRQ
Diffstat (limited to 'i386')
-rw-r--r--i386/i386/locore.S14
-rw-r--r--i386/i386/mp_desc.c8
2 files changed, 19 insertions, 3 deletions
diff --git a/i386/i386/locore.S b/i386/i386/locore.S
index 55add6e4..cb0f063b 100644
--- a/i386/i386/locore.S
+++ b/i386/i386/locore.S
@@ -701,12 +701,20 @@ ENTRY(all_intrs)
TIME_INT_ENTRY /* do timing */
#endif
- call EXT(interrupt) /* call generic interrupt routine */
+#ifdef MACH_LDEBUG
+ CPU_NUMBER(%ecx)
+ incl CX(EXT(in_interrupt),%ecx)
+#endif
- .globl EXT(return_to_iret)
-LEXT(return_to_iret) /* ( label for kdb_kintr and hardclock) */
+ call EXT(interrupt) /* call generic interrupt routine */
+ .globl EXT(return_to_iret) /* ( label for kdb_kintr and hardclock */
+LEXT(return_to_iret) /* to find the return from calling interrupt) */
CPU_NUMBER(%edx)
+#ifdef MACH_LDEBUG
+ decl CX(EXT(in_interrupt),%edx)
+#endif
+
#if STAT_TIME
#else
TIME_INT_EXIT /* do timing */
diff --git a/i386/i386/mp_desc.c b/i386/i386/mp_desc.c
index fa66aa44..88fbb50a 100644
--- a/i386/i386/mp_desc.c
+++ b/i386/i386/mp_desc.c
@@ -67,6 +67,14 @@
vm_offset_t int_stack_top[NCPUS];
vm_offset_t int_stack_base[NCPUS];
+/*
+ * Whether we are currently handling an interrupt.
+ * To catch code erroneously taking non-irq-safe locks.
+ */
+#ifdef MACH_LDEBUG
+unsigned long in_interrupt[NCPUS];
+#endif
+
/* Interrupt stack allocation */
uint8_t solid_intstack[NCPUS*INTSTACK_SIZE] __aligned(NCPUS*INTSTACK_SIZE);