#include #include #include #include #include #include #include #include #include #include #include #include void do_sched (struct proc* proc, spin_lock_t* cpu_lock, uint64_t lockflags) { __asm__ volatile ("cli"); uint64_t fp; spin_lock (&proc->lock, &fp); thiscpu->tss.rsp0 = proc->pdata.kernel_stack; thiscpu->syscall_kernel_stack = proc->pdata.kernel_stack; wrmsr (MSR_FS_BASE, proc->pdata.fs_base); void* cr3 = (void*)proc->procgroup->pd.cr3_paddr; struct saved_regs regs; memcpy (®s, &proc->pdata.regs, sizeof (regs)); fx_restore (proc->pdata.fx_env); spin_unlock (&proc->lock, fp); spin_unlock (cpu_lock, lockflags); do_sched1 ((void*)®s, cr3); }