aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--x86_64/locore.S16
1 files changed, 11 insertions, 5 deletions
diff --git a/x86_64/locore.S b/x86_64/locore.S
index 16b0dde5..ac7138b7 100644
--- a/x86_64/locore.S
+++ b/x86_64/locore.S
@@ -752,17 +752,17 @@ ENTRY(all_intrs)
pushq %r11
cld /* clear direction flag */
- movq %rsp,%rdx /* on an interrupt stack? */
- and $(~(INTSTACK_SIZE-1)),%rdx
- cmpq %ss:EXT(int_stack_base),%rdx
- je int_from_intstack /* if not: */
-
movq %ds,%rdx /* save segment registers */
pushq %rdx
movq %es,%rdx
pushq %rdx
PUSH_FSGS_ISR
+ movq %rsp,%rdx /* on an interrupt stack? */
+ and $(~(INTSTACK_SIZE-1)),%rdx
+ cmpq %ss:EXT(int_stack_base),%rdx
+ je int_from_intstack /* if not: */
+
mov %ss,%dx /* switch to kernel segments */
mov %dx,%ds
mov %dx,%es
@@ -830,6 +830,12 @@ int_from_intstack:
jb stack_overflowed /* if not: */
call EXT(interrupt) /* call interrupt routine */
_return_to_iret_i: /* ( label for kdb_kintr) */
+ POP_FSGS_ISR
+ pop %rdx
+ mov %rdx,%es
+ pop %rdx
+ mov %rdx,%ds
+
pop %r11
pop %r10
pop %r9