提交 709c2160 创建 作者: Silas Boyd-Wickizer's avatar Silas Boyd-Wickizer

The start of SYSCALL and SYSRET.

上级 f25a83b9
...@@ -57,8 +57,8 @@ struct segdesc { ...@@ -57,8 +57,8 @@ struct segdesc {
#define KCSEG (2<<3) /* kernel code segment */ #define KCSEG (2<<3) /* kernel code segment */
#define KDSEG (3<<3) /* kernel data segment */ #define KDSEG (3<<3) /* kernel data segment */
#define TSSSEG (4<<3) /* tss segment - takes two slots */ #define TSSSEG (4<<3) /* tss segment - takes two slots */
#define UCSEG (6<<3) /* user code segment */ #define UDSEG (6<<3) /* user data segment */
#define UDSEG (7<<3) /* user data segment */ #define UCSEG (7<<3) /* user code segment */
#define NSEGS 8 #define NSEGS 8
// User segment bits (SEG_S set). // User segment bits (SEG_S set).
......
...@@ -169,8 +169,10 @@ inittrap(void) ...@@ -169,8 +169,10 @@ inittrap(void)
void void
initseg(void) initseg(void)
{ {
extern void sysentry(void);
volatile struct desctr dtr; volatile struct desctr dtr;
struct cpu *c; struct cpu *c;
u64 star;
dtr.limit = sizeof(idt) - 1; dtr.limit = sizeof(idt) - 1;
dtr.base = (u64)idt; dtr.base = (u64)idt;
...@@ -183,4 +185,13 @@ initseg(void) ...@@ -183,4 +185,13 @@ initseg(void)
dtr.limit = sizeof(c->gdt) - 1; dtr.limit = sizeof(c->gdt) - 1;
dtr.base = (u64)c->gdt; dtr.base = (u64)c->gdt;
lgdt((void *)&dtr.limit); lgdt((void *)&dtr.limit);
// When executing a syscall instruction the CPU sets the SS selector
// to (star >> 32) + 8 and the CS selector to (star >> 32).
// When executing a sysret instruction the CPU sets the SS selector
// to (star >> 48) + 8 and the CS selector to (star >> 48) + 16.
star = ((((u64)UCSEG|0x3) - 16)<<48)|((u64)KCSEG<<32);
writemsr(MSR_STAR, star);
writemsr(MSR_LSTAR, (u64)&sysentry);
writemsr(MSR_SFMASK, FL_TF);
} }
...@@ -14,6 +14,11 @@ ...@@ -14,6 +14,11 @@
#define TRAPCODE(x) _TRAP(x, trapcommon) #define TRAPCODE(x) _TRAP(x, trapcommon)
.code64 .code64
.globl sysentry
.align 8
sysentry:
jmp sysentry
.globl trappush .globl trappush
.align 8 .align 8
trappush: trappush:
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论