From 44c2904c11b3cc05b35b627c9ac50f415935b50f Mon Sep 17 00:00:00 2001 From: Max Wash Date: Thu, 19 Feb 2026 18:59:37 +0000 Subject: [PATCH] x86_64: re-arrange user and kernel GDT entries for compatibility with syscall instruction --- arch/x86_64/gdt.c | 4 ++-- arch/x86_64/thread.c | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/arch/x86_64/gdt.c b/arch/x86_64/gdt.c index 4dd3cae..5580f8d 100644 --- a/arch/x86_64/gdt.c +++ b/arch/x86_64/gdt.c @@ -28,11 +28,11 @@ int gdt_init(struct gdt *gdt, struct gdt_ptr *gdtp) GDT_F_64BIT); init_entry( &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); init_entry( &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); gdtp->g_ptr = (uint64_t)gdt; diff --git a/arch/x86_64/thread.c b/arch/x86_64/thread.c index 9b29acc..70d696c 100644 --- a/arch/x86_64/thread.c +++ b/arch/x86_64/thread.c @@ -31,10 +31,11 @@ extern void ml_thread_prepare_user_context( (*kernel_sp) -= sizeof(struct ml_cpu_context); struct ml_cpu_context *ctx = (struct ml_cpu_context *)(*kernel_sp); + memset(ctx, 0x0, sizeof *ctx); ctx->rip = ip; ctx->rsp = user_sp; - ctx->ss = 0x23; - ctx->cs = 0x1B; + ctx->ss = 0x1b; + ctx->cs = 0x23; ctx->rflags = 0x202; ctx->rdi = 0; // arg 0 ctx->rsi = 0; // arg 1