Remove erroneous swapgs and implement proper segment setting
This commit is contained in:
@@ -109,13 +109,22 @@ _Ar\Type\Vector\()Start:
|
|||||||
mov %cr2, %eax
|
mov %cr2, %eax
|
||||||
mov %eax, TrapCr2(%ebp)
|
mov %eax, TrapCr2(%ebp)
|
||||||
|
|
||||||
/* Test previous mode and swap GS if needed */
|
/* Test previous mode */
|
||||||
movl $0, TrapPreviousMode(%ebp)
|
movl $0, TrapPreviousMode(%ebp)
|
||||||
mov TrapSegCs(%ebp), %ax
|
mov TrapSegCs(%ebp), %ax
|
||||||
and $3, %al
|
and $3, %al
|
||||||
mov %al, TrapPreviousMode(%ebp)
|
mov %al, TrapPreviousMode(%ebp)
|
||||||
jz KernelMode\Type\Vector
|
jz KernelMode\Type\Vector
|
||||||
swapgs
|
|
||||||
|
/* Load Kernel PB selector into FS */
|
||||||
|
mov $KGDT_R0_PB, %ax
|
||||||
|
mov %ax, %fs
|
||||||
|
|
||||||
|
/* Set sane data segment selectors */
|
||||||
|
mov $(KGDT_R3_DATA | RPL_MASK), %ax
|
||||||
|
mov %ax, %ds
|
||||||
|
mov %ax, %es
|
||||||
|
|
||||||
jmp UserMode\Type\Vector
|
jmp UserMode\Type\Vector
|
||||||
|
|
||||||
KernelMode\Type\Vector:
|
KernelMode\Type\Vector:
|
||||||
@@ -141,11 +150,10 @@ UserMode\Type\Vector:
|
|||||||
/* Clean up the stack */
|
/* Clean up the stack */
|
||||||
add $4, %esp
|
add $4, %esp
|
||||||
|
|
||||||
/* Test previous mode and swapgs if needed */
|
/* Test previous mode and disable interrupts before user mode return */
|
||||||
testb $1, TrapPreviousMode(%ebp)
|
testb $1, TrapPreviousMode(%ebp)
|
||||||
jz KernelModeReturn\Type\Vector
|
jz KernelModeReturn\Type\Vector
|
||||||
cli
|
cli
|
||||||
swapgs
|
|
||||||
|
|
||||||
KernelModeReturn\Type\Vector:
|
KernelModeReturn\Type\Vector:
|
||||||
/* Restore segment selectors */
|
/* Restore segment selectors */
|
||||||
|
|||||||
@@ -10,6 +10,13 @@
|
|||||||
#define __XTOSKRNL_I686_ASMSUP_H
|
#define __XTOSKRNL_I686_ASMSUP_H
|
||||||
|
|
||||||
|
|
||||||
|
/* Selector masks */
|
||||||
|
#define RPL_MASK 0x0003
|
||||||
|
|
||||||
|
/* GDT selectors */
|
||||||
|
#define KGDT_R3_DATA 0x0020
|
||||||
|
#define KGDT_R0_PB 0x0030
|
||||||
|
|
||||||
/* KTRAP_FRAME structure offsets */
|
/* KTRAP_FRAME structure offsets */
|
||||||
#define TrapPreviousMode 0
|
#define TrapPreviousMode 0
|
||||||
#define TrapCr2 4
|
#define TrapCr2 4
|
||||||
|
|||||||
Reference in New Issue
Block a user