16842bc34SLaurent Vivier /* 26842bc34SLaurent Vivier * processor control and status function 36842bc34SLaurent Vivier */ 46842bc34SLaurent Vivier 56842bc34SLaurent Vivier #include <libcflat.h> 66842bc34SLaurent Vivier #include <asm/processor.h> 76842bc34SLaurent Vivier #include <asm/ptrace.h> 8*f4d8d939SSuraj Jitindar Singh #include <asm/setup.h> 9*f4d8d939SSuraj Jitindar Singh #include <asm/barrier.h> 106842bc34SLaurent Vivier 116842bc34SLaurent Vivier static struct { 126842bc34SLaurent Vivier void (*func)(struct pt_regs *, void *data); 136842bc34SLaurent Vivier void *data; 146842bc34SLaurent Vivier } handlers[16]; 156842bc34SLaurent Vivier 166842bc34SLaurent Vivier void handle_exception(int trap, void (*func)(struct pt_regs *, void *), 176842bc34SLaurent Vivier void * data) 186842bc34SLaurent Vivier { 196842bc34SLaurent Vivier trap >>= 8; 206842bc34SLaurent Vivier 216842bc34SLaurent Vivier if (trap < 16) { 226842bc34SLaurent Vivier handlers[trap].func = func; 236842bc34SLaurent Vivier handlers[trap].data = data; 246842bc34SLaurent Vivier } 256842bc34SLaurent Vivier } 266842bc34SLaurent Vivier 276842bc34SLaurent Vivier void do_handle_exception(struct pt_regs *regs) 286842bc34SLaurent Vivier { 296842bc34SLaurent Vivier unsigned char v; 306842bc34SLaurent Vivier 316842bc34SLaurent Vivier v = regs->trap >> 8; 326842bc34SLaurent Vivier 336842bc34SLaurent Vivier if (v < 16 && handlers[v].func) { 346842bc34SLaurent Vivier handlers[v].func(regs, handlers[v].data); 356842bc34SLaurent Vivier return; 366842bc34SLaurent Vivier } 376842bc34SLaurent Vivier 386842bc34SLaurent Vivier printf("unhandled cpu exception 0x%lx\n", regs->trap); 396842bc34SLaurent Vivier abort(); 406842bc34SLaurent Vivier } 41*f4d8d939SSuraj Jitindar Singh 42*f4d8d939SSuraj Jitindar Singh void delay(uint64_t cycles) 43*f4d8d939SSuraj Jitindar Singh { 44*f4d8d939SSuraj Jitindar Singh uint64_t start = get_tb(); 45*f4d8d939SSuraj Jitindar Singh 46*f4d8d939SSuraj Jitindar Singh while ((get_tb() - start) < cycles) 47*f4d8d939SSuraj Jitindar Singh cpu_relax(); 48*f4d8d939SSuraj Jitindar Singh } 49*f4d8d939SSuraj Jitindar Singh 50*f4d8d939SSuraj Jitindar Singh void udelay(uint64_t us) 51*f4d8d939SSuraj Jitindar Singh { 52*f4d8d939SSuraj Jitindar Singh delay((us * tb_hz) / 1000000); 53*f4d8d939SSuraj Jitindar Singh } 54