From 3584f6831b5c53acbf28d7d3c3d1d35c7d12e894 Mon Sep 17 00:00:00 2001 From: Max Wash Date: Sun, 19 Apr 2026 19:36:16 +0100 Subject: [PATCH] x86_64: thread: copy fs- and gs-base pointers to cloned thread context --- arch/x86_64/include/kernel/machine/thread.h | 4 +++- arch/x86_64/thread.c | 14 ++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/arch/x86_64/include/kernel/machine/thread.h b/arch/x86_64/include/kernel/machine/thread.h index eba7f5f..27e1de7 100644 --- a/arch/x86_64/include/kernel/machine/thread.h +++ b/arch/x86_64/include/kernel/machine/thread.h @@ -34,7 +34,9 @@ extern kern_status_t ml_thread_prepare_user_context( /* prepare the stack so that ml_thread_switch_user can jump to usermode * with the specified register context */ extern kern_status_t ml_thread_clone_user_context( - const struct ml_cpu_context *ctx, + const struct ml_cpu_context *src_regs, + const struct ml_thread *src_ml, + struct ml_thread *dest_ml, uintptr_t return_value, virt_addr_t *kernel_sp); diff --git a/arch/x86_64/thread.c b/arch/x86_64/thread.c index 78862d4..b7b96d3 100644 --- a/arch/x86_64/thread.c +++ b/arch/x86_64/thread.c @@ -81,16 +81,22 @@ extern kern_status_t ml_thread_prepare_user_context( } kern_status_t ml_thread_clone_user_context( - const struct ml_cpu_context *src_ctx, + const struct ml_cpu_context *src_regs, + const struct ml_thread *src_ml, + struct ml_thread *dest_ml, uintptr_t return_value, virt_addr_t *kernel_sp) { (*kernel_sp) -= sizeof(struct ml_cpu_context); - struct ml_cpu_context *ctx = (struct ml_cpu_context *)(*kernel_sp); - memcpy(ctx, src_ctx, sizeof *ctx); + struct ml_cpu_context *regs = (struct ml_cpu_context *)(*kernel_sp); + memcpy(regs, src_regs, sizeof *regs); - ctx->rax = return_value; + regs->rax = return_value; + + dest_ml->tr_fsbase = src_ml->tr_fsbase; + dest_ml->tr_gsbase = src_ml->tr_gsbase; + printk("clone cs=%x, ss=%x, rip=%zx", regs->cs, regs->ss, regs->rip); return KERN_OK; }