void init_scheduler() { terminal_writestring("Initializing scheduler\n"); memzero(tasks, sizeof(task_t*)*SCHEDULER_MAX_TASKS); //Initialize jump array tasks[0] = (void*)SCHEDULER_MAX_TASKS; curr_task = 0; next_task = 0; set_idt_desc(IRQ_OFFSET+0x00, (uint32_t)&schedule_handler, 0, IntGate32, 0x08); set_idt_desc(PROC_EXIT, (uint32_t)&exit_handler, 3, IntGate32, 0x08); set_idt_desc(PROC_YIELD, (uint32_t)&yield_handler, 3, IntGate32, 0x08); }
/** * Set the IDT. */ void install_idt() { uint32_t i; _idtr.limit = sizeof(struct idt_desc) * MAX_INTERRUPTS; _idtr.base = (uint32_t) &_idt; memset((intptr_t)_idtr.base, 0, _idtr.limit); for(i = 0; i < MAX_INTERRUPTS; i++) set_idt_desc(i, 0b01110001, 0x08, (intptr_t) default_int_handler); __asm__ ("lidt _idtr"); }