#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 fp; __asm__ volatile("cli"); 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, 0); do_sched1((void*)®s, cr3); }