xref: /OK3568_Linux_fs/u-boot/arch/m68k/lib/traps.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * (C) Copyright 2003
3*4882a593Smuzhiyun  * Josef Baumgartner <josef.baumgartner@telex.de>
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * (C) Copyright 2000
6*4882a593Smuzhiyun  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  * SPDX-License-Identifier:	GPL-2.0+
9*4882a593Smuzhiyun  */
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #include <common.h>
12*4882a593Smuzhiyun #include <watchdog.h>
13*4882a593Smuzhiyun #include <command.h>
14*4882a593Smuzhiyun #include <asm/processor.h>
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun extern void _exc_handler(void);
18*4882a593Smuzhiyun extern void _int_handler(void);
19*4882a593Smuzhiyun 
show_frame(struct pt_regs * fp)20*4882a593Smuzhiyun static void show_frame(struct pt_regs *fp)
21*4882a593Smuzhiyun {
22*4882a593Smuzhiyun 	printf ("Vector Number: %d  Format: %02x  Fault Status: %01x\n\n", (fp->vector & 0x3fc) >> 2,
23*4882a593Smuzhiyun 		fp->format, (fp->vector & 0x3) | ((fp->vector & 0xc00) >> 8));
24*4882a593Smuzhiyun 	printf ("PC: %08lx    SR: %08lx    SP: %08lx\n", fp->pc, (long) fp->sr, (long) fp);
25*4882a593Smuzhiyun 	printf ("D0: %08lx    D1: %08lx    D2: %08lx    D3: %08lx\n",
26*4882a593Smuzhiyun 		fp->d0, fp->d1, fp->d2, fp->d3);
27*4882a593Smuzhiyun 	printf ("D4: %08lx    D5: %08lx    D6: %08lx    D7: %08lx\n",
28*4882a593Smuzhiyun 		fp->d4, fp->d5, fp->d6, fp->d7);
29*4882a593Smuzhiyun 	printf ("A0: %08lx    A1: %08lx    A2: %08lx    A3: %08lx\n",
30*4882a593Smuzhiyun 		fp->a0, fp->a1, fp->a2, fp->a3);
31*4882a593Smuzhiyun 	printf ("A4: %08lx    A5: %08lx    A6: %08lx\n",
32*4882a593Smuzhiyun 		fp->a4, fp->a5, fp->a6);
33*4882a593Smuzhiyun }
34*4882a593Smuzhiyun 
exc_handler(struct pt_regs * fp)35*4882a593Smuzhiyun void exc_handler(struct pt_regs *fp) {
36*4882a593Smuzhiyun 	printf("\n\n*** Unexpected exception ***\n");
37*4882a593Smuzhiyun 	show_frame (fp);
38*4882a593Smuzhiyun 	printf("\n*** Please Reset Board! ***\n");
39*4882a593Smuzhiyun 	for(;;);
40*4882a593Smuzhiyun }
41*4882a593Smuzhiyun 
trap_init(ulong value)42*4882a593Smuzhiyun void trap_init(ulong value) {
43*4882a593Smuzhiyun 	unsigned long *vec = (ulong *)value;
44*4882a593Smuzhiyun 	int i;
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun 	for(i = 2; i < 25; i++) {
47*4882a593Smuzhiyun 		vec[i] = (unsigned long)_exc_handler;
48*4882a593Smuzhiyun 	}
49*4882a593Smuzhiyun 	for(i = 25; i < 32; i++) {
50*4882a593Smuzhiyun 		vec[i] = (unsigned long)_int_handler;
51*4882a593Smuzhiyun 	}
52*4882a593Smuzhiyun 	for(i = 32; i < 64; i++) {
53*4882a593Smuzhiyun 		vec[i] = (unsigned long)_exc_handler;
54*4882a593Smuzhiyun 	}
55*4882a593Smuzhiyun 	for(i = 64; i < 256; i++) {
56*4882a593Smuzhiyun 		vec[i] = (unsigned long)_int_handler;
57*4882a593Smuzhiyun 	}
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun 	setvbr(value);		/* set vector base register to new table */
60*4882a593Smuzhiyun }
61