x86_64: thread: copy fs- and gs-base pointers to cloned thread context
This commit is contained in:
@@ -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
|
/* prepare the stack so that ml_thread_switch_user can jump to usermode
|
||||||
* with the specified register context */
|
* with the specified register context */
|
||||||
extern kern_status_t ml_thread_clone_user_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,
|
uintptr_t return_value,
|
||||||
virt_addr_t *kernel_sp);
|
virt_addr_t *kernel_sp);
|
||||||
|
|
||||||
|
|||||||
+10
-4
@@ -81,16 +81,22 @@ extern kern_status_t ml_thread_prepare_user_context(
|
|||||||
}
|
}
|
||||||
|
|
||||||
kern_status_t ml_thread_clone_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,
|
uintptr_t return_value,
|
||||||
virt_addr_t *kernel_sp)
|
virt_addr_t *kernel_sp)
|
||||||
{
|
{
|
||||||
(*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 *regs = (struct ml_cpu_context *)(*kernel_sp);
|
||||||
memcpy(ctx, src_ctx, sizeof *ctx);
|
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;
|
return KERN_OK;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user