1 /*
2 * SPDX-License-Identifier: BSD-3-Clause
3 *
4 * Copyright © 2024 Keith Packard
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 *
13 * 2. Redistributions in binary form must reproduce the above
14 * copyright notice, this list of conditions and the following
15 * disclaimer in the documentation and/or other materials provided
16 * with the distribution.
17 *
18 * 3. Neither the name of the copyright holder nor the names of its
19 * contributors may be used to endorse or promote products derived
20 * from this software without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
27 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
29 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
31 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
33 * OF THE POSSIBILITY OF SUCH DAMAGE.
34 */
35
36 #include <stdint.h>
37
38 static void
m68k_halt_isr(void)39 m68k_halt_isr(void)
40 {
41 for(;;);
42 }
43
44 static void
m68k_ignore_isr(void)45 m68k_ignore_isr(void)
46 {
47 }
48
49 void _start(void);
50
51 extern char __stack[];
52
53 #define isr(name) \
54 void m68k_ ## name ## _isr(void) __attribute__ ((weak, alias("m68k_ignore_isr")));
55
56 #define isr_halt(name) \
57 void m68k_ ## name ## _isr(void) __attribute__ ((weak, alias("m68k_halt_isr")));
58
59 isr_halt(access_fault);
60 isr_halt(address_error);
61 isr_halt(illegal_instruction);
62 isr_halt(divide_by_zero);
63 isr(chk);
64 isr(trap);
65
66 isr_halt(fp_branch_uc);
67 isr_halt(fp_inexact);
68 isr_halt(fp_divide_by_zero);
69 isr_halt(fp_underflow);
70
71 isr_halt(fp_operand_error);
72 isr_halt(fp_overflow);
73 isr_halt(fp_signaling_nan);
74 isr_halt(fp_unimplemented_data);
75
76 #define i(id,name) [id] = m68k_ ## name ## _isr
77
78 __section(".data.init.enter")
79 void * const __exception_vector[] = {
80 [0] = __stack,
81 [1] = _start,
82 i(2, access_fault),
83 i(3, address_error),
84
85 i(4, illegal_instruction),
86 i(5, divide_by_zero),
87 i(6, chk),
88 i(7, trap),
89
90 i(48, fp_branch_uc),
91 i(49, fp_inexact),
92 i(50, fp_divide_by_zero),
93 i(51, fp_underflow),
94
95 i(52, fp_operand_error),
96 i(53, fp_overflow),
97 i(54, fp_signaling_nan),
98 i(55, fp_unimplemented_data),
99 };
100