diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2022-11-27 21:28:32 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2022-11-27 21:29:43 +0100 |
commit | 97314ab115206137018b0cd7196ce404ceee136c (patch) | |
tree | 0bb534b5667c8821ff44e8a0f0a591b29b542eea /x86_64 | |
parent | d30481122a5d24ad6b921062f93b9172ef922fc3 (diff) | |
download | gnumach-97314ab115206137018b0cd7196ce404ceee136c.tar.gz gnumach-97314ab115206137018b0cd7196ce404ceee136c.tar.bz2 gnumach-97314ab115206137018b0cd7196ce404ceee136c.zip |
Update kdb_kintr according to new interrupt stack layout
e2fcf261076b ("interrupt: Fix saving irq/ipl when linux drivers are
disabled") changed the stack layout for interrupt handlers, but missed
updating kdb_kintr's code that tries to mangle it.
This restores the control-alt-d shortcut.
Diffstat (limited to 'x86_64')
-rw-r--r-- | x86_64/interrupt.S | 2 | ||||
-rw-r--r-- | x86_64/locore.S | 8 |
2 files changed, 8 insertions, 2 deletions
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 */ |