aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--i386/i386/locore.S14
-rw-r--r--i386/i386at/interrupt.S2
-rw-r--r--x86_64/interrupt.S2
-rw-r--r--x86_64/locore.S8
4 files changed, 20 insertions, 6 deletions
diff --git a/i386/i386/locore.S b/i386/i386/locore.S
index 162bb13a..922e3d87 100644
--- a/i386/i386/locore.S
+++ b/i386/i386/locore.S
@@ -793,9 +793,13 @@ ast_from_interrupt:
* frame-> saved %ebp
* return address in interrupt handler
* #ifndef MACH_XEN
- * iunit
+ * 1st parameter iunit
+ * 2nd parameter saved SPL
+ * 3rd parameter irq
+ * 4th parameter return address
+ * 5th parameter registers
* saved SPL
- * irq
+ * saved IRQ
* #endif
* return address == return_to_iret_i
* saved %edx
@@ -834,7 +838,7 @@ ast_from_interrupt:
#ifdef MACH_XEN
#define RET_OFFSET 8
#else /* MACH_XEN */
-#define RET_OFFSET 20
+#define RET_OFFSET 36
#endif /* MACH_XEN */
ENTRY(kdb_kintr)
@@ -848,7 +852,9 @@ ENTRY(kdb_kintr)
cmpl RET_OFFSET(%eax),%edx /* interrupt handler (2)? */
je 2f /* if not: */
movl (%eax),%eax /* try next frame */
- jmp 0b
+ testl %eax,%eax
+ jnz 0b
+ ud2 /* oops, didn't find frame, fix me :/ */
1: movl $kdb_from_iret,RET_OFFSET(%eax)
ret /* returns to kernel/user stack */
diff --git a/i386/i386at/interrupt.S b/i386/i386at/interrupt.S
index 7480fba9..167e02c8 100644
--- a/i386/i386at/interrupt.S
+++ b/i386/i386at/interrupt.S
@@ -29,6 +29,8 @@
* Generic interrupt handler.
*
* On entry, %eax contains the irq number.
+ *
+ * Note: kdb_kintr needs to know our stack usage
*/
#define S_REGS 32(%esp)
diff --git a/x86_64/interrupt.S b/x86_64/interrupt.S
index 56cd771b..110a429c 100644
--- a/x86_64/interrupt.S
+++ b/x86_64/interrupt.S
@@ -29,6 +29,8 @@
* Generic interrupt handler.
*
* On entry, %eax contains the irq number.
+ *
+ * Note: kdb_kintr needs to know our stack usage
*/
#define S_REGS 24(%rsp)
diff --git a/x86_64/locore.S b/x86_64/locore.S
index f677aed1..0833da06 100644
--- a/x86_64/locore.S
+++ b/x86_64/locore.S
@@ -839,6 +839,8 @@ ast_from_interrupt:
*
* frame-> saved %rbp
* return address in interrupt handler
+ * saved SPL
+ * saved IRQ
* return address == return_to_iret_i
* saved %r11
* saved %r10
@@ -878,7 +880,7 @@ ast_from_interrupt:
* Call kdb, passing it that register save area.
*/
-#define RET_OFFSET 16
+#define RET_OFFSET 32
ENTRY(kdb_kintr)
@@ -892,7 +894,9 @@ ENTRY(kdb_kintr)
cmpq RET_OFFSET(%rax),%rdx /* interrupt handler (2)? */
je 2f /* if not: */
movq (%rax),%rax /* try next frame */
- jmp 0b
+ testl %rax,%rax
+ jnz 0b
+ ud2 /* oops, didn't find frame, fix me :/ */
1: movq $kdb_from_iret,RET_OFFSET(%rax)
ret /* returns to kernel/user stack */