xref: /kvm-unit-tests/lib/powerpc/processor.c (revision 5d5710978d19e5b74e2a0872731612298899f639)
16842bc34SLaurent Vivier /*
26842bc34SLaurent Vivier  * processor control and status function
3b1a6fd7dSThomas Huth  *
4b1a6fd7dSThomas Huth  * This code is free software; you can redistribute it and/or modify it
5b1a6fd7dSThomas Huth  * under the terms of the GNU Library General Public License version 2.
66842bc34SLaurent Vivier  */
76842bc34SLaurent Vivier 
86842bc34SLaurent Vivier #include <libcflat.h>
96842bc34SLaurent Vivier #include <asm/processor.h>
106842bc34SLaurent Vivier #include <asm/ptrace.h>
11f4d8d939SSuraj Jitindar Singh #include <asm/setup.h>
12f4d8d939SSuraj Jitindar Singh #include <asm/barrier.h>
136842bc34SLaurent Vivier 
146842bc34SLaurent Vivier static struct {
156842bc34SLaurent Vivier 	void (*func)(struct pt_regs *, void *data);
166842bc34SLaurent Vivier 	void *data;
176842bc34SLaurent Vivier } handlers[16];
186842bc34SLaurent Vivier 
196842bc34SLaurent Vivier void handle_exception(int trap, void (*func)(struct pt_regs *, void *),
206842bc34SLaurent Vivier 		      void * data)
216842bc34SLaurent Vivier {
22*5d571097SNicholas Piggin 	assert(!(trap & ~0xf00));
23*5d571097SNicholas Piggin 
246842bc34SLaurent Vivier 	trap >>= 8;
256842bc34SLaurent Vivier 
26*5d571097SNicholas Piggin 	if (func && handlers[trap].func) {
27*5d571097SNicholas Piggin 		printf("exception handler installed twice %#x\n", trap);
28*5d571097SNicholas Piggin 		abort();
29*5d571097SNicholas Piggin 	}
306842bc34SLaurent Vivier 	handlers[trap].func = func;
316842bc34SLaurent Vivier 	handlers[trap].data = data;
326842bc34SLaurent Vivier }
336842bc34SLaurent Vivier 
346842bc34SLaurent Vivier void do_handle_exception(struct pt_regs *regs)
356842bc34SLaurent Vivier {
366842bc34SLaurent Vivier 	unsigned char v;
376842bc34SLaurent Vivier 
386842bc34SLaurent Vivier 	v = regs->trap >> 8;
396842bc34SLaurent Vivier 
406842bc34SLaurent Vivier 	if (v < 16 && handlers[v].func) {
416842bc34SLaurent Vivier 		handlers[v].func(regs, handlers[v].data);
426842bc34SLaurent Vivier 		return;
436842bc34SLaurent Vivier 	}
446842bc34SLaurent Vivier 
458e458b76SNicholas Piggin 	printf("unhandled cpu exception %#lx at NIA:0x%016lx MSR:0x%016lx\n", regs->trap, regs->nip, regs->msr);
466842bc34SLaurent Vivier 	abort();
476842bc34SLaurent Vivier }
48f4d8d939SSuraj Jitindar Singh 
49f4d8d939SSuraj Jitindar Singh void delay(uint64_t cycles)
50f4d8d939SSuraj Jitindar Singh {
51f4d8d939SSuraj Jitindar Singh 	uint64_t start = get_tb();
52f4d8d939SSuraj Jitindar Singh 
53f4d8d939SSuraj Jitindar Singh 	while ((get_tb() - start) < cycles)
54f4d8d939SSuraj Jitindar Singh 		cpu_relax();
55f4d8d939SSuraj Jitindar Singh }
56f4d8d939SSuraj Jitindar Singh 
57f4d8d939SSuraj Jitindar Singh void udelay(uint64_t us)
58f4d8d939SSuraj Jitindar Singh {
59f4d8d939SSuraj Jitindar Singh 	delay((us * tb_hz) / 1000000);
60f4d8d939SSuraj Jitindar Singh }
61