1/*
2 * Copyright (c) 2021 Travis Geiselbrecht
3 *
4 * Use of this source code is governed by a MIT-style
5 * license that can be found in the LICENSE file or at
6 * https://opensource.org/licenses/MIT
7 */
8#include <lk/asm.h>
9
10.text
11
12#if M68K_CPU >= 68010
13// For 68010s and above the exception frame already has a code pushed on the stack,
14// so it's easy to just vector most of the handlers into one of a few classes of handlers
15// and decode the vector in C.
16
17.align 4
18_m68k_irq_vector:
19    // TODO: save less state for IRQs
20    moveml  %d0-%d7/%a0-%a6, %sp@-
21
22    movel   %sp,%sp@-
23    jsr     m68k_irq
24    add     #4, %sp
25
26    moveml  %sp@+, %d0-%d7/%a0-%a6
27    rte
28
29.macro exception_vector name func
30.align 4
31\name:
32    moveml  %d0-%d7/%a0-%a6, %sp@-
33
34    movel   %sp,%sp@-
35    jsr     \func
36    add     #4, %sp
37
38    moveml  %sp@+, %d0-%d7/%a0-%a6
39    rte
40.endm
41
42exception_vector _m68k_general_exception m68k_exception
43exception_vector _m68k_trap_exception m68k_trap_exception
44
45.section .text.vectab
46.align 16
47DATA(exc_vectors)
48    // first two entries are the reset vector
49    .long 0
50    .long 0
51    // general exceptions
52    .rept (15 - 2)
53    .long _m68k_general_exception
54    .endr
55.org (15*4)
56    // uninitialized irq vector
57    .long _m68k_irq_vector
58.org (16*4)
59    .rept (24 - 16)
60    .long _m68k_general_exception
61    .endr
62.org (24 * 4) // offset 0x60
63    // start of autovectored interrupts
64    .rept (32 - 24)
65    .long _m68k_irq_vector
66    .endr
67.org (32 * 4) // offset 0x60
68    // index 32, offset 0x80
69    .rept (48 - 32)
70    .long _m68k_trap_exception
71    .endr
72.org (48 * 4)
73    // start of FPU, MMU vectors
74    .rept (64 - 48)
75    .long _m68k_general_exception
76    .endr
77.org (64 * 4) // offset 0x100
78    // index 64, offset 0x100, end of reserved vectors
79    // start of user vectors
80    .rept (256 - 64)
81    .long _m68k_irq_vector
82    .endr
83.org 4*256
84END_DATA(exc_vectors)
85
86#else
87#error add support for pre 68010 exceptions
88#endif
89