blob: ec85b9d854e9c2a564dd86c6105415f801922d19 [file] [log] [blame]
/*
* 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 <libcflat.h>
#include <asm/processor.h>
#include <asm/ptrace.h>
#include <asm/setup.h>
#include <asm/barrier.h>
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);
}