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