entry.S (5663B)
1/* 2 * entry.S -- non-mmu 68000 interrupt and exception entry points 3 * 4 * Copyright (C) 1991, 1992 Linus Torvalds 5 * 6 * This file is subject to the terms and conditions of the GNU General Public 7 * License. See the file README.legal in the main directory of this archive 8 * for more details. 9 * 10 * Linux/m68k support by Hamish Macdonald 11 */ 12 13#include <linux/linkage.h> 14#include <asm/thread_info.h> 15#include <asm/unistd.h> 16#include <asm/errno.h> 17#include <asm/setup.h> 18#include <asm/traps.h> 19#include <asm/asm-offsets.h> 20#include <asm/entry.h> 21 22.text 23 24.globl system_call 25.globl resume 26.globl ret_from_exception 27.globl sys_call_table 28.globl bad_interrupt 29.globl inthandler1 30.globl inthandler2 31.globl inthandler3 32.globl inthandler4 33.globl inthandler5 34.globl inthandler6 35.globl inthandler7 36 37badsys: 38 movel #-ENOSYS,%sp@(PT_OFF_D0) 39 jra ret_from_exception 40 41do_trace: 42 movel #-ENOSYS,%sp@(PT_OFF_D0) /* needed for strace*/ 43 subql #4,%sp 44 SAVE_SWITCH_STACK 45 jbsr syscall_trace_enter 46 RESTORE_SWITCH_STACK 47 addql #4,%sp 48 movel %sp@(PT_OFF_ORIG_D0),%d1 49 movel #-ENOSYS,%d0 50 cmpl #NR_syscalls,%d1 51 jcc 1f 52 lsl #2,%d1 53 lea sys_call_table, %a0 54 jbsr %a0@(%d1) 55 561: movel %d0,%sp@(PT_OFF_D0) /* save the return value */ 57 subql #4,%sp /* dummy return address */ 58 SAVE_SWITCH_STACK 59 jbsr syscall_trace_leave 60 RESTORE_SWITCH_STACK 61 addql #4,%sp 62 jra ret_from_exception 63 64ENTRY(system_call) 65 SAVE_ALL_SYS 66 67 /* save top of frame*/ 68 pea %sp@ 69 jbsr set_esp0 70 addql #4,%sp 71 72 movel %sp@(PT_OFF_ORIG_D0),%d0 73 74 movel %sp,%d1 /* get thread_info pointer */ 75 andl #-THREAD_SIZE,%d1 76 movel %d1,%a2 77 btst #(TIF_SYSCALL_TRACE%8),%a2@(TINFO_FLAGS+(31-TIF_SYSCALL_TRACE)/8) 78 jne do_trace 79 cmpl #NR_syscalls,%d0 80 jcc badsys 81 lsl #2,%d0 82 lea sys_call_table,%a0 83 movel %a0@(%d0), %a0 84 jbsr %a0@ 85 movel %d0,%sp@(PT_OFF_D0) /* save the return value*/ 86 87ret_from_exception: 88 btst #5,%sp@(PT_OFF_SR) /* check if returning to kernel*/ 89 jeq Luser_return /* if so, skip resched, signals*/ 90 91Lkernel_return: 92 RESTORE_ALL 93 94Luser_return: 95 /* only allow interrupts when we are really the last one on the*/ 96 /* kernel stack, otherwise stack overflow can occur during*/ 97 /* heavy interrupt load*/ 98 andw #ALLOWINT,%sr 99 100 movel %sp,%d1 /* get thread_info pointer */ 101 andl #-THREAD_SIZE,%d1 102 movel %d1,%a2 1031: 104 move %a2@(TINFO_FLAGS),%d1 /* thread_info->flags */ 105 jne Lwork_to_do 106 RESTORE_ALL 107 108Lwork_to_do: 109 movel %a2@(TINFO_FLAGS),%d1 /* thread_info->flags */ 110 btst #TIF_NEED_RESCHED,%d1 111 jne reschedule 112 113Lsignal_return: 114 subql #4,%sp /* dummy return address*/ 115 SAVE_SWITCH_STACK 116 pea %sp@(SWITCH_STACK_SIZE) 117 bsrw do_notify_resume 118 addql #4,%sp 119 RESTORE_SWITCH_STACK 120 addql #4,%sp 121 jra 1b 122 123/* 124 * This is the main interrupt handler, responsible for calling process_int() 125 */ 126inthandler1: 127 SAVE_ALL_INT 128 movew %sp@(PT_OFF_FORMATVEC), %d0 129 and #0x3ff, %d0 130 131 movel %sp,%sp@- 132 movel #65,%sp@- /* put vector # on stack*/ 133 jbsr process_int /* process the IRQ*/ 1343: addql #8,%sp /* pop parameters off stack*/ 135 bra ret_from_exception 136 137inthandler2: 138 SAVE_ALL_INT 139 movew %sp@(PT_OFF_FORMATVEC), %d0 140 and #0x3ff, %d0 141 142 movel %sp,%sp@- 143 movel #66,%sp@- /* put vector # on stack*/ 144 jbsr process_int /* process the IRQ*/ 1453: addql #8,%sp /* pop parameters off stack*/ 146 bra ret_from_exception 147 148inthandler3: 149 SAVE_ALL_INT 150 movew %sp@(PT_OFF_FORMATVEC), %d0 151 and #0x3ff, %d0 152 153 movel %sp,%sp@- 154 movel #67,%sp@- /* put vector # on stack*/ 155 jbsr process_int /* process the IRQ*/ 1563: addql #8,%sp /* pop parameters off stack*/ 157 bra ret_from_exception 158 159inthandler4: 160 SAVE_ALL_INT 161 movew %sp@(PT_OFF_FORMATVEC), %d0 162 and #0x3ff, %d0 163 164 movel %sp,%sp@- 165 movel #68,%sp@- /* put vector # on stack*/ 166 jbsr process_int /* process the IRQ*/ 1673: addql #8,%sp /* pop parameters off stack*/ 168 bra ret_from_exception 169 170inthandler5: 171 SAVE_ALL_INT 172 movew %sp@(PT_OFF_FORMATVEC), %d0 173 and #0x3ff, %d0 174 175 movel %sp,%sp@- 176 movel #69,%sp@- /* put vector # on stack*/ 177 jbsr process_int /* process the IRQ*/ 1783: addql #8,%sp /* pop parameters off stack*/ 179 bra ret_from_exception 180 181inthandler6: 182 SAVE_ALL_INT 183 movew %sp@(PT_OFF_FORMATVEC), %d0 184 and #0x3ff, %d0 185 186 movel %sp,%sp@- 187 movel #70,%sp@- /* put vector # on stack*/ 188 jbsr process_int /* process the IRQ*/ 1893: addql #8,%sp /* pop parameters off stack*/ 190 bra ret_from_exception 191 192inthandler7: 193 SAVE_ALL_INT 194 movew %sp@(PT_OFF_FORMATVEC), %d0 195 and #0x3ff, %d0 196 197 movel %sp,%sp@- 198 movel #71,%sp@- /* put vector # on stack*/ 199 jbsr process_int /* process the IRQ*/ 2003: addql #8,%sp /* pop parameters off stack*/ 201 bra ret_from_exception 202 203inthandler: 204 SAVE_ALL_INT 205 movew %sp@(PT_OFF_FORMATVEC), %d0 206 and #0x3ff, %d0 207 208 movel %sp,%sp@- 209 movel %d0,%sp@- /* put vector # on stack*/ 210 jbsr process_int /* process the IRQ*/ 2113: addql #8,%sp /* pop parameters off stack*/ 212 bra ret_from_exception 213 214/* 215 * Handler for uninitialized and spurious interrupts. 216 */ 217ENTRY(bad_interrupt) 218 addql #1,irq_err_count 219 rte 220 221/* 222 * Beware - when entering resume, prev (the current task) is 223 * in a0, next (the new task) is in a1, so don't change these 224 * registers until their contents are no longer needed. 225 */ 226ENTRY(resume) 227 movel %a0,%d1 /* save prev thread in d1 */ 228 movew %sr,%a0@(TASK_THREAD+THREAD_SR) /* save sr */ 229 SAVE_SWITCH_STACK 230 movel %sp,%a0@(TASK_THREAD+THREAD_KSP) /* save kernel stack */ 231 movel %usp,%a3 /* save usp */ 232 movel %a3,%a0@(TASK_THREAD+THREAD_USP) 233 234 movel %a1@(TASK_THREAD+THREAD_USP),%a3 /* restore user stack */ 235 movel %a3,%usp 236 movel %a1@(TASK_THREAD+THREAD_KSP),%sp /* restore new thread stack */ 237 RESTORE_SWITCH_STACK 238 movew %a1@(TASK_THREAD+THREAD_SR),%sr /* restore thread status reg */ 239 rts 240