diff options
Diffstat (limited to 'i386')
-rw-r--r-- | i386/i386/locore.S | 14 | ||||
-rw-r--r-- | i386/i386at/interrupt.S | 2 |
2 files changed, 12 insertions, 4 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) |