1 |
207 |
jeremybenn |
/*
|
2 |
|
|
* cf-isv.c --
|
3 |
|
|
*
|
4 |
|
|
* Copyright (c) 2006 CodeSourcery Inc
|
5 |
|
|
*
|
6 |
|
|
* The authors hereby grant permission to use, copy, modify, distribute,
|
7 |
|
|
* and license this software and its documentation for any purpose, provided
|
8 |
|
|
* that existing copyright notices are retained in all copies and that this
|
9 |
|
|
* notice is included verbatim in any distributions. No written agreement,
|
10 |
|
|
* license, or royalty fee is required for any of the authorized uses.
|
11 |
|
|
* Modifications to this software may be copyrighted by their authors
|
12 |
|
|
* and need not follow the licensing terms described here, provided that
|
13 |
|
|
* the new terms are clearly indicated on the first page of each file where
|
14 |
|
|
* they apply.
|
15 |
|
|
*/
|
16 |
|
|
|
17 |
|
|
/* This file contains default interrupt handlers code for the
|
18 |
|
|
interrupt vector. All but one of the interrupts are user
|
19 |
|
|
replaceable.
|
20 |
|
|
|
21 |
|
|
These interrupt handlers are entered whenever the associated
|
22 |
|
|
interrupt occurs. All they do is stop the debugger to give the user
|
23 |
|
|
the opportunity to determine where the problem was. */
|
24 |
|
|
|
25 |
|
|
|
26 |
|
|
/* Each ISR is a loop containing a halt instruction */
|
27 |
|
|
#define ISR_DEFINE(NAME) \
|
28 |
|
|
void __attribute__((interrupt_handler)) NAME (void) \
|
29 |
|
|
{ \
|
30 |
|
|
while (1) \
|
31 |
|
|
__asm__ __volatile__ ("halt" ::: "memory"); \
|
32 |
|
|
} \
|
33 |
|
|
struct eat_trailing_semicolon
|
34 |
|
|
|
35 |
|
|
#if defined (L_other_interrupt)
|
36 |
|
|
static ISR_DEFINE (__other_interrupt);
|
37 |
|
|
#define ALIAS __other_interrupt
|
38 |
|
|
#define PREFIX interrupt
|
39 |
|
|
#define ALIASES A(6) A(7) \
|
40 |
|
|
A(15) A(16) A(17) A(18) A(19) A(20) A(21) A(22) A(23) \
|
41 |
|
|
A(25) A(26) A(27) A(28) A(29) A(30) A(31) \
|
42 |
|
|
A(56) A(57) A(58) A(59) A(60) A(62) A(63) \
|
43 |
|
|
A(64) A(65) A(66) A(67) A(68) A(69) A(70) A(71) \
|
44 |
|
|
A(72) A(73) A(74) A(75) A(76) A(77) A(78) A(79) \
|
45 |
|
|
A(80) A(81) A(82) A(83) A(84) A(85) A(86) A(87) \
|
46 |
|
|
A(88) A(89) A(90) A(91) A(92) A(93) A(94) A(95) \
|
47 |
|
|
A(96) A(97) A(98) A(99) A(100) A(101) A(102) A(103) \
|
48 |
|
|
A(104) A(105) A(106) A(107) A(108) A(109) A(110) A(111) \
|
49 |
|
|
A(112) A(113) A(114) A(115) A(116) A(117) A(118) A(119) \
|
50 |
|
|
A(120) A(121) A(122) A(123) A(124) A(125) A(126) A(127) \
|
51 |
|
|
A(128) A(129) A(130) A(131) A(132) A(133) A(134) A(135) \
|
52 |
|
|
A(136) A(137) A(138) A(139) A(140) A(141) A(142) A(143) \
|
53 |
|
|
A(144) A(145) A(146) A(147) A(148) A(149) A(150) A(151) \
|
54 |
|
|
A(152) A(153) A(154) A(155) A(156) A(157) A(158) A(159) \
|
55 |
|
|
A(160) A(161) A(162) A(163) A(164) A(165) A(166) A(167) \
|
56 |
|
|
A(168) A(169) A(170) A(171) A(172) A(173) A(174) A(175) \
|
57 |
|
|
A(176) A(177) A(178) A(179) A(180) A(181) A(182) A(183) \
|
58 |
|
|
A(184) A(185) A(186) A(187) A(188) A(189) A(190) A(191) \
|
59 |
|
|
A(192) A(193) A(194) A(195) A(196) A(197) A(198) A(199) \
|
60 |
|
|
A(200) A(201) A(202) A(203) A(204) A(205) A(206) A(207) \
|
61 |
|
|
A(208) A(209) A(210) A(211) A(212) A(213) A(214) A(215) \
|
62 |
|
|
A(216) A(217) A(218) A(219) A(220) A(221) A(222) A(223) \
|
63 |
|
|
A(224) A(225) A(226) A(227) A(228) A(229) A(230) A(231) \
|
64 |
|
|
A(232) A(233) A(234) A(235) A(236) A(237) A(238) A(239) \
|
65 |
|
|
A(240) A(241) A(242) A(243) A(244) A(245) A(246) A(247) \
|
66 |
|
|
A(248) A(249) A(250) A(251) A(252) A(253) A(254) A(255)
|
67 |
|
|
#endif
|
68 |
|
|
|
69 |
|
|
#if defined (L_access_error)
|
70 |
|
|
ISR_DEFINE (__access_error);
|
71 |
|
|
#define DEFINED __access_error
|
72 |
|
|
#endif
|
73 |
|
|
|
74 |
|
|
#if defined (L_address_error)
|
75 |
|
|
ISR_DEFINE (__address_error);
|
76 |
|
|
#define DEFINED __address_error
|
77 |
|
|
#endif
|
78 |
|
|
|
79 |
|
|
#if defined (L_illegal_instruction)
|
80 |
|
|
ISR_DEFINE (__illegal_instruction);
|
81 |
|
|
#define DEFINED __illegal_instruction
|
82 |
|
|
#endif
|
83 |
|
|
|
84 |
|
|
#if defined (L_divide_by_zero)
|
85 |
|
|
ISR_DEFINE (__divide_by_zero);
|
86 |
|
|
#define DEFINED __divide_by_zero
|
87 |
|
|
#endif
|
88 |
|
|
|
89 |
|
|
#if defined (L_privilege_violation)
|
90 |
|
|
ISR_DEFINE (__privilege_violation);
|
91 |
|
|
#define DEFINED __privilege_violation
|
92 |
|
|
#endif
|
93 |
|
|
|
94 |
|
|
#if defined (L_trace)
|
95 |
|
|
ISR_DEFINE (__trace);
|
96 |
|
|
#define DEFINED __trace
|
97 |
|
|
#endif
|
98 |
|
|
|
99 |
|
|
#if defined (L_unimplemented_opcode)
|
100 |
|
|
static ISR_DEFINE (__unimplemented_opcode);
|
101 |
|
|
#define ALIAS __unimplemented_opcode
|
102 |
|
|
#define PREFIX unimplemented_
|
103 |
|
|
#define SUFFIX _opcode
|
104 |
|
|
#define ALIASES A(line_a) A(line_f)
|
105 |
|
|
#endif
|
106 |
|
|
|
107 |
|
|
#if defined (L_breakpoint_debug_interrupt)
|
108 |
|
|
static ISR_DEFINE (__breakpoint_debug_interrupt);
|
109 |
|
|
#define ALIAS __breakpoint_debug_interrupt
|
110 |
|
|
#define SUFFIX _breakpoint_debug_interrupt
|
111 |
|
|
#define ALIASES A(non_pc) A(pc)
|
112 |
|
|
#endif
|
113 |
|
|
|
114 |
|
|
#if defined (L_format_error)
|
115 |
|
|
ISR_DEFINE (__format_error);
|
116 |
|
|
#define DEFINED __format_error
|
117 |
|
|
#endif
|
118 |
|
|
|
119 |
|
|
#if defined (L_spurious_interrupt)
|
120 |
|
|
ISR_DEFINE (__spurious_interrupt);
|
121 |
|
|
#define DEFINED __spurious_interrupt
|
122 |
|
|
#endif
|
123 |
|
|
|
124 |
|
|
#if defined (L_trap_interrupt)
|
125 |
|
|
static ISR_DEFINE (__trap_interrupt);
|
126 |
|
|
#define ALIAS __trap_interrupt
|
127 |
|
|
#define PREFIX trap
|
128 |
|
|
#define ALIASES A(0) A(1) A(2) A(3) A(4) A(5) A(6) A(7) \
|
129 |
|
|
A(8) A(9) A(10) A(11) A(12) A(13) A(14) A(15)
|
130 |
|
|
#endif
|
131 |
|
|
|
132 |
|
|
#if defined (L_fp_interrupt)
|
133 |
|
|
static ISR_DEFINE (__fp_interrupt);
|
134 |
|
|
#define ALIAS __fp_interrupt
|
135 |
|
|
#define PREFIX fp_
|
136 |
|
|
#define ALIASES A(branch_unordered) A(inexact_result) A(divide_by_zero) \
|
137 |
|
|
A(underflow) A(operand_error) A(overflow) A(input_not_a_number) \
|
138 |
|
|
A(input_denormalized_number)
|
139 |
|
|
#endif
|
140 |
|
|
|
141 |
|
|
#if defined (L_unsupported_instruction)
|
142 |
|
|
ISR_DEFINE (__unsupported_instruction);
|
143 |
|
|
#define DEFINED __unsupported_instruction
|
144 |
|
|
#endif
|
145 |
|
|
|
146 |
|
|
#if defined(ALIAS)
|
147 |
|
|
#ifndef PREFIX
|
148 |
|
|
#define PREFIX
|
149 |
|
|
#endif
|
150 |
|
|
#ifndef SUFFIX
|
151 |
|
|
#define SUFFIX
|
152 |
|
|
#endif
|
153 |
|
|
#define STRING_(a) #a
|
154 |
|
|
#define STRING(a) STRING_(a)
|
155 |
|
|
#define PASTE4_(a,b,c,d) a##b##c##d
|
156 |
|
|
#define PASTE4(a,b,c,d) PASTE4_(a,b,c,d)
|
157 |
|
|
#define A(N) \
|
158 |
|
|
void __attribute__((weak, alias(STRING(ALIAS)))) PASTE4(__,PREFIX,N,SUFFIX) (void);
|
159 |
|
|
ALIASES
|
160 |
|
|
#elif !defined(DEFINED)
|
161 |
|
|
#error "No interrupt routine requested"
|
162 |
|
|
#endif
|
163 |
|
|
|