[444] | 1 | /* |
---|
| 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 | |
---|