Ensure SS and RSP are saved in trap frame
This commit is contained in:
@@ -104,12 +104,20 @@ ArTrap\Vector:
|
|||||||
/* Test previous mode and swap GS if needed */
|
/* Test previous mode and swap GS if needed */
|
||||||
movl $0, TrapPreviousMode(%rbp)
|
movl $0, TrapPreviousMode(%rbp)
|
||||||
mov %cs, %ax
|
mov %cs, %ax
|
||||||
and $1, %al
|
and $3, %al
|
||||||
mov %al, TrapPreviousMode(%rbp)
|
mov %al, TrapPreviousMode(%rbp)
|
||||||
jz KernelMode$\Vector
|
jz KernelMode$\Vector
|
||||||
swapgs
|
swapgs
|
||||||
|
jmp UserMode$\Vector
|
||||||
|
|
||||||
KernelMode$\Vector:
|
KernelMode$\Vector:
|
||||||
|
/* Save kernel stack pointer (SS:RSP) */
|
||||||
|
movl %ss, %eax
|
||||||
|
mov %eax, TrapSegSs(%rbp)
|
||||||
|
lea TRAP_FRAME_SIZE(%rbp), %rax
|
||||||
|
mov %rax, TrapRsp(%rbp)
|
||||||
|
|
||||||
|
UserMode$\Vector:
|
||||||
/* Push Frame Pointer, clear direction flag and pass to trap dispatcher */
|
/* Push Frame Pointer, clear direction flag and pass to trap dispatcher */
|
||||||
mov %rsp, %rcx
|
mov %rsp, %rcx
|
||||||
cld
|
cld
|
||||||
|
|||||||
@@ -56,6 +56,8 @@
|
|||||||
#define TrapSegEs 330
|
#define TrapSegEs 330
|
||||||
#define TrapSegFs 332
|
#define TrapSegFs 332
|
||||||
#define TrapSegGs 334
|
#define TrapSegGs 334
|
||||||
|
#define TrapRsp 496
|
||||||
|
#define TrapSegSs 504
|
||||||
|
|
||||||
/* KTRAP_FRAME length related definitions */
|
/* KTRAP_FRAME length related definitions */
|
||||||
#define TRAP_FRAME_SIZE 512
|
#define TRAP_FRAME_SIZE 512
|
||||||
|
|||||||
Reference in New Issue
Block a user