xref: /kvm-unit-tests/lib/powerpc/processor.c (revision f4d8d9396ff91f66732ebba1e24fb8937eafc49b)
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