aboutsummaryrefslogtreecommitdiff
path: root/x86_64
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2022-11-27 21:28:32 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2022-11-27 21:29:43 +0100
commit97314ab115206137018b0cd7196ce404ceee136c (patch)
tree0bb534b5667c8821ff44e8a0f0a591b29b542eea /x86_64
parentd30481122a5d24ad6b921062f93b9172ef922fc3 (diff)
downloadgnumach-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.S2
-rw-r--r--x86_64/locore.S8
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 */