CFLAGS += -fcf-protection=none
CFLAGS += -nostdlib
CFLAGS += -DNR_TTYS=3
-CFLAGS += -DFIXED_SYSENTER_ESP_MODE=1
CFLAGS += -DENABLE_BOOT_WAIT=0
CFLAGS += -DENABLE_CLOCK_IRQ_WAIT=0
}
void init_apic() {
- ioapic_init();
+ lapic_init();
}
root_task.esp0 = ((unsigned long)&root_task) + sizeof(root_task);
root_task.cr3 = va2pa((unsigned long)(init_pgd));
- tss.esp0 = root_task.esp0;
-#if FIXED_SYSENTER_ESP_MODE
- // do nothing
-#else
- wrmsr(MSR_SYSENTER_ESP, root_task.esp0, 0);
-#endif
+ tss.esp0 = root_task.esp0; // sysenter会把MSR_SYSENTER_ESP设置为&tss.esp0
for (i = 0; i < NR_TASK_OPEN_CNT; i++) {
root_task.files.fds[i] = NULL;
void switch_to() {
set_cr3(current->cr3);
tss.esp0 = current->esp0;
-#if FIXED_SYSENTER_ESP_MODE
- // do nothing
-#else
- wrmsr(MSR_SYSENTER_ESP, current->esp0, 0);
-#endif
}
void context_switch(task_t* prev, task_t* next) {
void parse_rsdt(void* addr);
void setup_kernel() {
- printk("sysenter esp mode: %s\n",
-#if FIXED_SYSENTER_ESP_MODE
- "fixed to &tss.esp0"
-#else
- "use task union stack"
-#endif
- );
+ printk("sysenter esp mode: fixed to &tss.esp0\n");
init_mm();
//.global syscall_exit
syscall_entry:
-#if FIXED_SYSENTER_ESP_MODE
movl (%esp),%esp
-#endif
// sysenter have cleared IF, and sysexit will not set IF.
sti
void setup_sysc() {
wrmsr(MSR_SYSENTER_CS, SELECTOR_KRNL_CS, 0);
wrmsr(MSR_SYSENTER_EIP, syscall_entry, 0);
-#if FIXED_SYSENTER_ESP_MODE
wrmsr(MSR_SYSENTER_ESP, &(tss.esp0), 0);
-#endif
init_sysc_handler_table();
}