/* * processor control and status function * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU Library General Public License version 2. */ #include #include #include #include #include static struct { void (*func)(struct pt_regs *, void *data); void *data; } handlers[16]; void handle_exception(int trap, void (*func)(struct pt_regs *, void *), void * data) { trap >>= 8; if (trap < 16) { handlers[trap].func = func; handlers[trap].data = data; } } void do_handle_exception(struct pt_regs *regs) { unsigned char v; v = regs->trap >> 8; if (v < 16 && handlers[v].func) { handlers[v].func(regs, handlers[v].data); return; } printf("unhandled cpu exception %#lx\n", regs->trap); abort(); } void delay(uint64_t cycles) { uint64_t start = get_tb(); while ((get_tb() - start) < cycles) cpu_relax(); } void udelay(uint64_t us) { delay((us * tb_hz) / 1000000); }