proc: fix gs/fs-related bug in exception handler
1. %rip -> %rsp (misspelt a register name, damn) 2. Rename swapgs_if_needed to iret_swapgs_if_needed for clarification 3. Add iret_swapgs_if_needed before iret from exception handler
This commit is contained in:
@@ -22,8 +22,8 @@ amd64_exc_generic:
|
||||
// 0x10: rip
|
||||
// 0x08: error code
|
||||
// 0x00: error number
|
||||
cmpq $0x08, 0x18(%rip)
|
||||
jnz 1f
|
||||
cmpq $0x08, 0x18(%rsp)
|
||||
jz 1f
|
||||
swapgs
|
||||
1:
|
||||
|
||||
@@ -79,6 +79,7 @@ amd64_exc_generic:
|
||||
|
||||
addq $16, %rsp
|
||||
|
||||
iret_swapgs_if_needed
|
||||
iretq
|
||||
|
||||
amd64_isr_nerr 0
|
||||
|
||||
@@ -7,16 +7,16 @@
|
||||
|
||||
amd64_irq0_early:
|
||||
cli
|
||||
swapgs_if_needed
|
||||
iret_swapgs_if_needed
|
||||
pushq %rax
|
||||
irq_eoi_lapic 0
|
||||
popq %rax
|
||||
swapgs_if_needed
|
||||
iret_swapgs_if_needed
|
||||
iretq
|
||||
|
||||
amd64_irq0:
|
||||
cli
|
||||
swapgs_if_needed
|
||||
iret_swapgs_if_needed
|
||||
|
||||
// Push caller-saved registers so it appears as if a thread just called yield()
|
||||
pushq %r11
|
||||
@@ -42,7 +42,7 @@ amd64_irq0:
|
||||
popq %r10
|
||||
popq %r11
|
||||
|
||||
swapgs_if_needed
|
||||
iret_swapgs_if_needed
|
||||
iretq
|
||||
|
||||
amd64_irq2_counting:
|
||||
|
||||
@@ -50,7 +50,7 @@ amd64_idt_load:
|
||||
.global amd64_irq_msi0
|
||||
amd64_irq_msi0:
|
||||
cli
|
||||
swapgs_if_needed
|
||||
iret_swapgs_if_needed
|
||||
|
||||
pushq %r11
|
||||
pushq %r10
|
||||
@@ -78,5 +78,5 @@ amd64_irq_msi0:
|
||||
popq %r10
|
||||
popq %r11
|
||||
|
||||
swapgs_if_needed
|
||||
iret_swapgs_if_needed
|
||||
iretq
|
||||
|
||||
@@ -14,7 +14,7 @@ context_enter:
|
||||
popq %r10
|
||||
popq %r11
|
||||
|
||||
swapgs_if_needed
|
||||
iret_swapgs_if_needed
|
||||
iretq
|
||||
|
||||
.global context_exec_enter
|
||||
@@ -53,7 +53,7 @@ context_exec_enter:
|
||||
xorq %r14, %r14
|
||||
xorq %r15, %r15
|
||||
|
||||
swapgs_if_needed
|
||||
iret_swapgs_if_needed
|
||||
iretq
|
||||
|
||||
.global context_switch_first
|
||||
|
||||
+1
-2
@@ -170,8 +170,7 @@ KERNEL_CFLAGS=-Iinclude \
|
||||
-Wall \
|
||||
-Wextra \
|
||||
-Wno-unused \
|
||||
-O2 \
|
||||
-funroll-loops \
|
||||
-Og \
|
||||
-ggdb \
|
||||
-Werror $(KERNEL_DEF)
|
||||
KERNEL_LDFLAGS=-nostdlib \
|
||||
|
||||
@@ -11,9 +11,9 @@
|
||||
(__amd64_cpu + off)(%rip)
|
||||
#endif
|
||||
|
||||
// To be used in interrupt handlers
|
||||
// To be used in interrupt handlers or anything with iret-like stack layout
|
||||
// DIRECTLY AFTER ENTRY without prior stack modification
|
||||
.macro swapgs_if_needed
|
||||
.macro iret_swapgs_if_needed
|
||||
cmpq $0x08, 0x08(%rsp)
|
||||
je 1f
|
||||
swapgs
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
.global amd64_irq\n
|
||||
amd64_irq\n:
|
||||
cli
|
||||
swapgs_if_needed
|
||||
iret_swapgs_if_needed
|
||||
|
||||
pushq %r11
|
||||
pushq %r10
|
||||
@@ -39,7 +39,7 @@ amd64_irq\n:
|
||||
popq %r10
|
||||
popq %r11
|
||||
|
||||
swapgs_if_needed
|
||||
iret_swapgs_if_needed
|
||||
iretq
|
||||
.endm
|
||||
|
||||
|
||||
Reference in New Issue
Block a user