thread_fast_set_cthread_self64(uint64_t self)
{
pcb_t pcb = current_thread()->machine.pcb;
+ cpu_data_t *cdp;
/* check for canonical address, set 0 otherwise */
if (!IS_USERADDR64_CANONICAL(self))
pcb->cthread_self = self;
mp_disable_preemption();
+ cdp = current_cpu_datap();
#if defined(__x86_64__)
- if (current_cpu_datap()->cpu_uber.cu_user_gs_base != self)
+ if ((cdp->cpu_uber.cu_user_gs_base != pcb->cthread_self) ||
+ (pcb->cthread_self != rdmsr64(MSR_IA32_KERNEL_GS_BASE)))
wrmsr64(MSR_IA32_KERNEL_GS_BASE, self);
#endif
- current_cpu_datap()->cpu_uber.cu_user_gs_base = self;
+ cdp->cpu_uber.cu_user_gs_base = self;
mp_enable_preemption();
return (USER_CTHREAD);
}