x86_64: re-arrange user and kernel GDT entries for compatibility with syscall instruction
This commit is contained in:
@@ -28,11 +28,11 @@ int gdt_init(struct gdt *gdt, struct gdt_ptr *gdtp)
|
|||||||
GDT_F_64BIT);
|
GDT_F_64BIT);
|
||||||
init_entry(
|
init_entry(
|
||||||
&gdt->g_entries[3],
|
&gdt->g_entries[3],
|
||||||
GDT_A_PRESENT | GDT_A_USER | GDT_A_CODEREAD | GDT_A_CODE,
|
GDT_A_PRESENT | GDT_A_USER | GDT_A_DATAWRITE | GDT_A_DATA,
|
||||||
GDT_F_64BIT);
|
GDT_F_64BIT);
|
||||||
init_entry(
|
init_entry(
|
||||||
&gdt->g_entries[4],
|
&gdt->g_entries[4],
|
||||||
GDT_A_PRESENT | GDT_A_USER | GDT_A_DATAWRITE | GDT_A_DATA,
|
GDT_A_PRESENT | GDT_A_USER | GDT_A_CODEREAD | GDT_A_CODE,
|
||||||
GDT_F_64BIT);
|
GDT_F_64BIT);
|
||||||
|
|
||||||
gdtp->g_ptr = (uint64_t)gdt;
|
gdtp->g_ptr = (uint64_t)gdt;
|
||||||
|
|||||||
@@ -31,10 +31,11 @@ extern void ml_thread_prepare_user_context(
|
|||||||
(*kernel_sp) -= sizeof(struct ml_cpu_context);
|
(*kernel_sp) -= sizeof(struct ml_cpu_context);
|
||||||
|
|
||||||
struct ml_cpu_context *ctx = (struct ml_cpu_context *)(*kernel_sp);
|
struct ml_cpu_context *ctx = (struct ml_cpu_context *)(*kernel_sp);
|
||||||
|
memset(ctx, 0x0, sizeof *ctx);
|
||||||
ctx->rip = ip;
|
ctx->rip = ip;
|
||||||
ctx->rsp = user_sp;
|
ctx->rsp = user_sp;
|
||||||
ctx->ss = 0x23;
|
ctx->ss = 0x1b;
|
||||||
ctx->cs = 0x1B;
|
ctx->cs = 0x23;
|
||||||
ctx->rflags = 0x202;
|
ctx->rflags = 0x202;
|
||||||
ctx->rdi = 0; // arg 0
|
ctx->rdi = 0; // arg 0
|
||||||
ctx->rsi = 0; // arg 1
|
ctx->rsi = 0; // arg 1
|
||||||
|
|||||||
Reference in New Issue
Block a user