1/* 2 * linux/arch/m68knommu/platform/68328/entry.S 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/segment.h> 19#include <asm/traps.h> 20#include <asm/asm-offsets.h> 21#include <asm/entry.h> 22 23.text 24 25.globl system_call 26.globl resume 27.globl ret_from_exception 28.globl ret_from_signal 29.globl sys_call_table 30.globl ret_from_interrupt 31.globl bad_interrupt 32.globl inthandler1 33.globl inthandler2 34.globl inthandler3 35.globl inthandler4 36.globl inthandler5 37.globl inthandler6 38.globl inthandler7 39 40badsys: 41 movel #-ENOSYS,%sp@(PT_OFF_D0) 42 jra ret_from_exception 43 44do_trace: 45 movel #-ENOSYS,%sp@(PT_OFF_D0) /* needed for strace*/ 46 subql #4,%sp 47 SAVE_SWITCH_STACK 48 jbsr syscall_trace_enter 49 RESTORE_SWITCH_STACK 50 addql #4,%sp 51 movel %sp@(PT_OFF_ORIG_D0),%d1 52 movel #-ENOSYS,%d0 53 cmpl #NR_syscalls,%d1 54 jcc 1f 55 lsl #2,%d1 56 lea sys_call_table, %a0 57 jbsr %a0@(%d1) 58 591: movel %d0,%sp@(PT_OFF_D0) /* save the return value */ 60 subql #4,%sp /* dummy return address */ 61 SAVE_SWITCH_STACK 62 jbsr syscall_trace_leave 63 64ret_from_signal: 65 RESTORE_SWITCH_STACK 66 addql #4,%sp 67 jra ret_from_exception 68 69ENTRY(system_call) 70 SAVE_ALL_SYS 71 72 /* save top of frame*/ 73 pea %sp@ 74 jbsr set_esp0 75 addql #4,%sp 76 77 movel %sp@(PT_OFF_ORIG_D0),%d0 78 79 movel %sp,%d1 /* get thread_info pointer */ 80 andl #-THREAD_SIZE,%d1 81 movel %d1,%a2 82 btst #(TIF_SYSCALL_TRACE%8),%a2@(TINFO_FLAGS+(31-TIF_SYSCALL_TRACE)/8) 83 jne do_trace 84 cmpl #NR_syscalls,%d0 85 jcc badsys 86 lsl #2,%d0 87 lea sys_call_table,%a0 88 movel %a0@(%d0), %a0 89 jbsr %a0@ 90 movel %d0,%sp@(PT_OFF_D0) /* save the return value*/ 91 92ret_from_exception: 93 btst #5,%sp@(PT_OFF_SR) /* check if returning to kernel*/ 94 jeq Luser_return /* if so, skip resched, signals*/ 95 96Lkernel_return: 97 RESTORE_ALL 98 99Luser_return: 100 /* only allow interrupts when we are really the last one on the*/ 101 /* kernel stack, otherwise stack overflow can occur during*/ 102 /* heavy interrupt load*/ 103 andw #ALLOWINT,%sr 104 105 movel %sp,%d1 /* get thread_info pointer */ 106 andl #-THREAD_SIZE,%d1 107 movel %d1,%a2 1081: 109 move %a2@(TINFO_FLAGS),%d1 /* thread_info->flags */ 110 jne Lwork_to_do 111 RESTORE_ALL 112 113Lwork_to_do: 114 movel %a2@(TINFO_FLAGS),%d1 /* thread_info->flags */ 115 btst #TIF_NEED_RESCHED,%d1 116 jne reschedule 117 118Lsignal_return: 119 subql #4,%sp /* dummy return address*/ 120 SAVE_SWITCH_STACK 121 pea %sp@(SWITCH_STACK_SIZE) 122 bsrw do_signal 123 addql #4,%sp 124 RESTORE_SWITCH_STACK 125 addql #4,%sp 126 jra 1b 127 128/* 129 * This is the main interrupt handler, responsible for calling process_int() 130 */ 131inthandler1: 132 SAVE_ALL_INT 133 movew %sp@(PT_OFF_FORMATVEC), %d0 134 and #0x3ff, %d0 135 136 movel %sp,%sp@- 137 movel #65,%sp@- /* put vector # on stack*/ 138 jbsr process_int /* process the IRQ*/ 1393: addql #8,%sp /* pop parameters off stack*/ 140 bra ret_from_interrupt 141 142inthandler2: 143 SAVE_ALL_INT 144 movew %sp@(PT_OFF_FORMATVEC), %d0 145 and #0x3ff, %d0 146 147 movel %sp,%sp@- 148 movel #66,%sp@- /* put vector # on stack*/ 149 jbsr process_int /* process the IRQ*/ 1503: addql #8,%sp /* pop parameters off stack*/ 151 bra ret_from_interrupt 152 153inthandler3: 154 SAVE_ALL_INT 155 movew %sp@(PT_OFF_FORMATVEC), %d0 156 and #0x3ff, %d0 157 158 movel %sp,%sp@- 159 movel #67,%sp@- /* put vector # on stack*/ 160 jbsr process_int /* process the IRQ*/ 1613: addql #8,%sp /* pop parameters off stack*/ 162 bra ret_from_interrupt 163 164inthandler4: 165 SAVE_ALL_INT 166 movew %sp@(PT_OFF_FORMATVEC), %d0 167 and #0x3ff, %d0 168 169 movel %sp,%sp@- 170 movel #68,%sp@- /* put vector # on stack*/ 171 jbsr process_int /* process the IRQ*/ 1723: addql #8,%sp /* pop parameters off stack*/ 173 bra ret_from_interrupt 174 175inthandler5: 176 SAVE_ALL_INT 177 movew %sp@(PT_OFF_FORMATVEC), %d0 178 and #0x3ff, %d0 179 180 movel %sp,%sp@- 181 movel #69,%sp@- /* put vector # on stack*/ 182 jbsr process_int /* process the IRQ*/ 1833: addql #8,%sp /* pop parameters off stack*/ 184 bra ret_from_interrupt 185 186inthandler6: 187 SAVE_ALL_INT 188 movew %sp@(PT_OFF_FORMATVEC), %d0 189 and #0x3ff, %d0 190 191 movel %sp,%sp@- 192 movel #70,%sp@- /* put vector # on stack*/ 193 jbsr process_int /* process the IRQ*/ 1943: addql #8,%sp /* pop parameters off stack*/ 195 bra ret_from_interrupt 196 197inthandler7: 198 SAVE_ALL_INT 199 movew %sp@(PT_OFF_FORMATVEC), %d0 200 and #0x3ff, %d0 201 202 movel %sp,%sp@- 203 movel #71,%sp@- /* put vector # on stack*/ 204 jbsr process_int /* process the IRQ*/ 2053: addql #8,%sp /* pop parameters off stack*/ 206 bra ret_from_interrupt 207 208inthandler: 209 SAVE_ALL_INT 210 movew %sp@(PT_OFF_FORMATVEC), %d0 211 and #0x3ff, %d0 212 213 movel %sp,%sp@- 214 movel %d0,%sp@- /* put vector # on stack*/ 215 jbsr process_int /* process the IRQ*/ 2163: addql #8,%sp /* pop parameters off stack*/ 217 bra ret_from_interrupt 218 219ret_from_interrupt: 220 jeq 1f 2212: 222 RESTORE_ALL 2231: 224 moveb %sp@(PT_OFF_SR), %d0 225 and #7, %d0 226 jhi 2b 227 228 /* check if we need to do software interrupts */ 229 jeq ret_from_exception 230 231 pea ret_from_exception 232 jra do_softirq 233 234 235/* 236 * Handler for uninitialized and spurious interrupts. 237 */ 238ENTRY(bad_interrupt) 239 addql #1,irq_err_count 240 rte 241 242/* 243 * Beware - when entering resume, prev (the current task) is 244 * in a0, next (the new task) is in a1, so don't change these 245 * registers until their contents are no longer needed. 246 */ 247ENTRY(resume) 248 movel %a0,%d1 /* save prev thread in d1 */ 249 movew %sr,%a0@(TASK_THREAD+THREAD_SR) /* save sr */ 250 SAVE_SWITCH_STACK 251 movel %sp,%a0@(TASK_THREAD+THREAD_KSP) /* save kernel stack */ 252 movel %usp,%a3 /* save usp */ 253 movel %a3,%a0@(TASK_THREAD+THREAD_USP) 254 255 movel %a1@(TASK_THREAD+THREAD_USP),%a3 /* restore user stack */ 256 movel %a3,%usp 257 movel %a1@(TASK_THREAD+THREAD_KSP),%sp /* restore new thread stack */ 258 RESTORE_SWITCH_STACK 259 movew %a1@(TASK_THREAD+THREAD_SR),%sr /* restore thread status reg */ 260 rts 261 262