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