1/*
2 * Copyright (c) 2011 Aeroflex Gaisler
3 *
4 * BSD license:
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
23 */
24
25
26/* The traptable has to be the first code in a boot PROM. */
27
28#include <asm-leon/head.h>
29
30#define TRAP(H)  mov %psr, %l0; sethi %hi(H), %l4; jmp %l4+%lo(H); nop;
31#define TRAPL(H)  mov %g0, %g4; sethi %hi(H), %g4; jmp %g4+%lo(H); nop;
32#define TRAP_ENTRY(H) rd %psr, %l0; b H; rd %wim, %l3; nop;
33/* srmmu trap */
34#define SRMMU_TFAULT rd %psr, %l0; rd %wim, %l3; b _srmmu_fault; mov 1, %l6;
35#define SRMMU_DFAULT rd %psr, %l0; rd %wim, %l3; b _srmmu_fault; mov 9, %l6;
36
37#define WIM_INIT 2
38#ifdef _SOFT_FLOAT
39#define PSR_INIT 0x0e0
40#else
41#define PSR_INIT 0x10e0
42#endif
43
44#define NUMREGWINDOWS 8
45
46/* Unexcpected trap will halt the processor by forcing it to error state */
47#define BAD_TRAP ta 0; nop; nop; nop;
48
49/* Software trap. Treat as BAD_TRAP */
50#define SOFT_TRAP BAD_TRAP
51
52  .seg    "text"
53  .global _trap_table, cpuinit, leonbare_irq_entry, _hardreset, _hardreset_mvt
54  .global _window_overflow, _window_underflow, _flush_windows, _fpdis_enable
55  .global start
56start:
57_trap_table:
58  TRAPL(_hardreset_mvt);	! 00 reset trap
59  SRMMU_TFAULT			! 01 instruction_access_exception (in mmu_asm.S)
60  BAD_TRAP;			! 02 illegal_instruction
61  BAD_TRAP;			! 03 priveleged_instruction
62#ifndef _SOFT_FLOAT
63  TRAP(_fpdis_enable);		! 04 fp_disabled
64#else
65  TRAP(_fpdis);			! 04 fp_disabled
66#endif
67#ifndef _FLAT
68  TRAP(_window_overflow);	! 05 window_overflow
69  TRAP(_window_underflow);	! 06 window_underflow
70#else
71  BAD_TRAP; BAD_TRAP;
72#endif
73  BAD_TRAP;			! 07 memory_address_not_aligned
74  BAD_TRAP;			! 08 fp_exception
75  SRMMU_DFAULT		        ! 09 data_access_exception (in mmu_asm.S)
76  BAD_TRAP;			! 0A tag_overflow
77
78  BAD_TRAP;			! 0B undefined
79  BAD_TRAP;			! 0C undefined
80  BAD_TRAP;			! 0D undefined
81  BAD_TRAP;			! 0E undefined
82  BAD_TRAP;			! 0F undefined
83  BAD_TRAP;			! 10 undefined
84
85  /* Interrupt entries */
86  TRAP_ENTRY_INTERRUPT(1);		! 11 interrupt level 1
87  TRAP_ENTRY_INTERRUPT(2);		! 12 interrupt level 2
88  TRAP_ENTRY_INTERRUPT(3);		! 13 interrupt level 3
89  TRAP_ENTRY_INTERRUPT(4);		! 14 interrupt level 4
90  TRAP_ENTRY_INTERRUPT(5);		! 15 interrupt level 5
91  TRAP_ENTRY_INTERRUPT(6);		! 16 interrupt level 6
92  TRAP_ENTRY_INTERRUPT(7);		! 17 interrupt level 7
93  TRAP_ENTRY_INTERRUPT(8);		! 18 interrupt level 8
94  TRAP_ENTRY_INTERRUPT(9);		! 19 interrupt level 9
95  TRAP_ENTRY_INTERRUPT(10);		! 1A interrupt level 1
96  TRAP_ENTRY_INTERRUPT(11);		! 1B interrupt level 11
97  TRAP_ENTRY_INTERRUPT(12);		! 1C interrupt level 12
98  TRAP_ENTRY_INTERRUPT(13);		! 1D interrupt level 13
99  TRAP_ENTRY_INTERRUPT(14);		! 1E interrupt level 14
100  TRAP_ENTRY_INTERRUPT(15);		! 1F interrupt level 15
101  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 20 - 23 undefined
102  BAD_TRAP;					! 24 cp_disabled
103	    BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 25 - 27 undefined
104  BAD_TRAP;					! 28 cp_exception
105	    BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 29 - 2B undefined
106  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 2C - 2F undefined
107  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 30 - 33 undefined
108  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 34 - 37 undefined
109  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 38 - 3B undefined
110  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 3C - 3F undefined
111  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 40 - 43 undefined
112  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 44 - 47 undefined
113  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 48 - 4B undefined
114  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 4C - 4F undefined
115  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 50 - 53 undefined
116  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 54 - 57 undefined
117  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 58 - 5B undefined
118  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 5C - 5F undefined
119  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 60 - 63 undefined
120  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 64 - 67 undefined
121  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 68 - 6B undefined
122  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 6C - 6F undefined
123  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 70 - 73 undefined
124  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 74 - 77 undefined
125  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 78 - 7B undefined
126  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 7C - 7F undefined
127
128  /* Software traps */
129  SOFT_TRAP; SOFT_TRAP; TRAP(_irqcall); 	! 80 - 82
130#ifndef _FLAT
131  TRAP_ENTRY(_flush_windows)			! 83
132#else
133  SOFT_TRAP
134#endif
135  SOFT_TRAP;					! 84
136  TRAP(_irqcall_disableirq);			! 85
137  SOFT_TRAP; SOFT_TRAP;				! 86 - 87
138  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! 88 - 8B
139  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! 8C - 8F
140  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! 90 - 93
141  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! 94 - 97
142  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! 98 - 9B
143  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! 9C - 9F
144  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! A0 - A3
145  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! A4 - A7
146  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! A8 - AB
147  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! AC - AF
148  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! B0 - B3
149  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! B4 - B7
150  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! B8 - BB
151  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! BC - BF
152  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! C0 - C3
153  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! C4 - C7
154  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! C8 - CB
155  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! CC - CF
156  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! D0 - D3
157  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! D4 - D7
158  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! D8 - DB
159  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! DC - DF
160  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! E0 - E3
161  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! E4 - E7
162  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! E8 - EB
163  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! EC - EF
164  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! F0 - F3
165  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! F4 - F7
166  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! F8 - FB
167  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! FC - FF
168
169
170
171