#include #include int ml_cpu_block_init(ml_cpu_block *p) { p->c_this = p; gdt_init(&p->c_gdt, &p->c_gdt_ptr); idt_init(&p->c_idt_ptr); tss_init(&p->c_tss, &p->c_tss_ptr); gdt_write_tss(&p->c_gdt, &p->c_tss); return 0; } int ml_cpu_block_use(ml_cpu_block *p) { gdt_load(&p->c_gdt_ptr); idt_load(&p->c_idt_ptr); tss_load(&p->c_tss); wrmsr(MSR_GS_BASE, (uint64_t)p); return 0; } virt_addr_t ml_cpu_block_get_kstack(ml_cpu_block *p) { return tss_get_kstack(&p->c_tss); } virt_addr_t ml_cpu_block_get_ustack(ml_cpu_block *p) { return tss_get_ustack(&p->c_tss); } void ml_cpu_block_set_kstack(ml_cpu_block *p, virt_addr_t sp) { tss_set_kstack(&p->c_tss, sp); } void ml_cpu_block_set_ustack(ml_cpu_block *p, virt_addr_t sp) { tss_set_ustack(&p->c_tss, sp); }