void exception_init(void) { unsigned int i; /* Clear exception table */ for (i = 0; i < IVT_ITEMS; i++) exc_register(i, "undef", false, (iroutine_t) unhandled_exception); exc_register(EXC_Bp, "bkpoint", true, (iroutine_t) breakpoint_exception); exc_register(EXC_RI, "resinstr", true, (iroutine_t) reserved_instr_exception); exc_register(EXC_Mod, "tlb_mod", true, (iroutine_t) tlbmod_exception); exc_register(EXC_TLBL, "tlbinvl", true, (iroutine_t) tlbinv_exception); exc_register(EXC_TLBS, "tlbinvl", true, (iroutine_t) tlbinv_exception); exc_register(EXC_Int, "interrupt", true, (iroutine_t) interrupt_exception); #ifdef CONFIG_FPU_LAZY exc_register(EXC_CpU, "cpunus", true, (iroutine_t) cpuns_exception); #endif exc_register(EXC_Sys, "syscall", true, (iroutine_t) syscall_exception); }
void page_arch_init(void) { if (config.cpu_active > 1) { write_cr3((uintptr_t) AS_KERNEL->genarch.page_table); return; } uintptr_t cur; unsigned int identity_flags = PAGE_GLOBAL | PAGE_CACHEABLE | PAGE_EXEC | PAGE_WRITE | PAGE_READ; page_mapping_operations = &pt_mapping_operations; page_table_lock(AS_KERNEL, true); /* * PA2KA(identity) mapping for all low-memory frames. */ for (cur = 0; cur < min(config.identity_size, config.physmem_end); cur += FRAME_SIZE) page_mapping_insert(AS_KERNEL, PA2KA(cur), cur, identity_flags); page_table_unlock(AS_KERNEL, true); exc_register(14, "page_fault", true, (iroutine_t) page_fault); write_cr3((uintptr_t) AS_KERNEL->genarch.page_table); }
void noc_receive() { int id = get_cpuid(); done[id] = 0; exc_register(18,&__data_resp_handler); //exc_register(19,&__data_resp_handler); intr_unmask_all(); intr_enable(); //puts("Interrupt handler setup"); while(done[id] != 1){;} intr_disable(); return; }
int main(void) { // register exception handlers for (unsigned i = 0; i < 32; i++) { exc_register(i, &fault_handler); } exc_register(8, &trap_handler); exc_register(18, &intr_handler); exc_register(19, &intr_handler); exc_register(20, &intr_handler); exc_register(21, &intr_handler); // unmask interrupts intr_unmask_all(); // clear pending flags intr_clear_all_pending(); // enable interrupts intr_enable(); // go to user mode EXC_STATUS &= ~0x2; // a that prints "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_" N times and does some self-checking volatile unsigned starts = 0; volatile unsigned ends = 0; volatile unsigned sent = 0; for (unsigned k = 0; k < N; k++) { starts++; for (unsigned i = 0; i < 32; i++) { putchar('@'+i); sent+=i; } putchar('\n'); ends++; if (sent != 496*(k+1) || starts != ends) { LEDS = 0x55; abort(); } } // disabling interrupts again only works in privileged mode /* intr_disable(); */ // call exception vector number 8 trap(8); // trigger illegal operation fault asm volatile(".word 0xffffffff"); // illegal operation // trigger illegal memory access fault, never reached (*((volatile _IODEV unsigned *)0xffffffff)) = 0; return 0; }
void interrupt_init(void) { unsigned int i; for (i = 0; i < IVT_ITEMS; i++) exc_register(i, "null", false, (iroutine_t) null_interrupt); for (i = 0; i < IRQ_COUNT; i++) { if ((i != IRQ_PIC_SPUR) && (i != IRQ_PIC1)) exc_register(IVT_IRQBASE + i, "irq", true, (iroutine_t) irq_interrupt); } exc_register(0, "de_fault", true, (iroutine_t) de_fault); exc_register(7, "nm_fault", true, (iroutine_t) nm_fault); exc_register(12, "ss_fault", true, (iroutine_t) ss_fault); exc_register(13, "gp_fault", true, (iroutine_t) gp_fault); #ifdef CONFIG_SMP exc_register(VECTOR_TLB_SHOOTDOWN_IPI, "tlb_shootdown", true, (iroutine_t) tlb_shootdown_ipi); #endif }