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

The start of SYSCALL and SYSRET.

上级 f25a83b9
......@@ -57,8 +57,8 @@ struct segdesc {
#define KCSEG (2<<3) /* kernel code segment */
#define KDSEG (3<<3) /* kernel data segment */
#define TSSSEG (4<<3) /* tss segment - takes two slots */
#define UCSEG (6<<3) /* user code segment */
#define UDSEG (7<<3) /* user data segment */
#define UDSEG (6<<3) /* user data segment */
#define UCSEG (7<<3) /* user code segment */
#define NSEGS 8
// User segment bits (SEG_S set).
......
......@@ -169,8 +169,10 @@ inittrap(void)
void
initseg(void)
{
extern void sysentry(void);
volatile struct desctr dtr;
struct cpu *c;
u64 star;
dtr.limit = sizeof(idt) - 1;
dtr.base = (u64)idt;
......@@ -183,4 +185,13 @@ initseg(void)
dtr.limit = sizeof(c->gdt) - 1;
dtr.base = (u64)c->gdt;
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 @@
#define TRAPCODE(x) _TRAP(x, trapcommon)
.code64
.globl sysentry
.align 8
sysentry:
jmp sysentry
.globl trappush
.align 8
trappush:
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论