📄 entry.s
字号:
/* -*- mode: asm -*- * * linux/arch/m68k/kernel/entry.S * * Copyright (C) 1991, 1992 Linus Torvalds * * This file is subject to the terms and conditions of the GNU General Public * License. See the file README.legal in the main directory of this archive * for more details. * * Linux/m68k support by Hamish Macdonald * *//* * entry.S contains the system-call and fault low-level handling routines. * This also contains the timer-interrupt handler, as well as all interrupts * and faults that can result in a task-switch. * * NOTE: This code handles signal-recognition, which happens every time * after a timer-interrupt and after each system call. * *//* * 12/03/96 Jes: Currently we only support m68k single-cpu systems, so * all pointers that used to be 'current' are now entry * number 0 in the 'current_set' list. */#include <linux/sys.h>#include <linux/config.h>#include <linux/linkage.h>#include <asm/entry.h>#include <asm/errno.h>#include <asm/setup.h>#include <asm/segment.h>#include <asm/traps.h>#include "m68k_defs.h"#define IMMED ##define DBG_PUTC(x) moveb IMMED x,0xfffff907; \ moveb IMMED '\r',0xfffff907; \ moveb IMMED '\n',0xfffff907.globl SYMBOL_NAME(system_call), SYMBOL_NAME(buserr), SYMBOL_NAME(trap).globl SYMBOL_NAME(exception3), SYMBOL_NAME(exception4), SYMBOL_NAME(exception5).globl SYMBOL_NAME(exception6), SYMBOL_NAME(exception7), SYMBOL_NAME(exception8).globl SYMBOL_NAME(exception9), SYMBOL_NAME(exception10), SYMBOL_NAME(exception12).globl SYMBOL_NAME(exception14), SYMBOL_NAME(exception15).globl SYMBOL_NAME(trap1), SYMBOL_NAME(trap15).globl SYMBOL_NAME(resume), SYMBOL_NAME(ret_from_exception).globl SYMBOL_NAME(ret_from_signal).globl SYMBOL_NAME(sys_call_table).globl SYMBOL_NAME(sys_fork), SYMBOL_NAME(sys_clone), SYMBOL_NAME(sys_vfork).globl SYMBOL_NAME(ret_from_interrupt), SYMBOL_NAME(bad_interrupt).globl SYMBOL_NAME(inthandler1), SYMBOL_NAME(inthandler2),SYMBOL_NAME(inthandler3).globl SYMBOL_NAME(inthandler4),SYMBOL_NAME(inthandler5),SYMBOL_NAME(inthandler6).globl SYMBOL_NAME(inthandler7).textENTRY(buserr) SAVE_ALL_INT 8 GET_CURRENT(%d0) movel %sp,%sp@- /* stack frame pointer argument*/ bsrw SYMBOL_NAME(buserr_c) addql #4,%sp jra SYMBOL_NAME(ret_from_exception)ENTRY(exception3) SAVE_ALL_INT 12 GET_CURRENT(%d0) movel %sp,%sp@- /* stack frame pointer argument*/ bsrw SYMBOL_NAME(trap_c) addql #4,%sp jra SYMBOL_NAME(ret_from_exception)ENTRY(exception4) SAVE_ALL_INT 16 GET_CURRENT(%d0) movel %sp,%sp@- /* stack frame pointer argument*/ bsrw SYMBOL_NAME(trap_c) addql #4,%sp jra SYMBOL_NAME(ret_from_exception)ENTRY(exception5) SAVE_ALL_INT 20 GET_CURRENT(%d0) movel %sp,%sp@- /* stack frame pointer argument*/ bsrw SYMBOL_NAME(trap_c) addql #4,%sp jra SYMBOL_NAME(ret_from_exception)ENTRY(exception6) SAVE_ALL_INT 24 GET_CURRENT(%d0) movel %sp,%sp@- /* stack frame pointer argument*/ bsrw SYMBOL_NAME(trap_c) addql #4,%sp jra SYMBOL_NAME(ret_from_exception)ENTRY(exception7) SAVE_ALL_INT 28 GET_CURRENT(%d0) movel %sp,%sp@- /* stack frame pointer argument*/ bsrw SYMBOL_NAME(trap_c) addql #4,%sp jra SYMBOL_NAME(ret_from_exception)ENTRY(exception8) SAVE_ALL_INT 32 GET_CURRENT(%d0) movel %sp,%sp@- /* stack frame pointer argument*/ bsrw SYMBOL_NAME(trap_c) addql #4,%sp jra SYMBOL_NAME(ret_from_exception)ENTRY(exception9) SAVE_ALL_INT 36 GET_CURRENT(%d0) movel %sp,%sp@- /* stack frame pointer argument*/ bsrw SYMBOL_NAME(trap_c) addql #4,%sp jra SYMBOL_NAME(ret_from_exception)ENTRY(exception10) SAVE_ALL_INT 40 GET_CURRENT(%d0) movel %sp,%sp@- /* stack frame pointer argument*/ bsrw SYMBOL_NAME(trap_c) addql #4,%sp jra SYMBOL_NAME(ret_from_exception)ENTRY(exception11) SAVE_ALL_INT 44 GET_CURRENT(%d0) movel %sp,%sp@- /* stack frame pointer argument*/ bsrw SYMBOL_NAME(trap_c) addql #4,%sp jra SYMBOL_NAME(ret_from_exception)ENTRY(exception14) SAVE_ALL_INT 56 GET_CURRENT(%d0) movel %sp,%sp@- /* stack frame pointer argument*/ bsrw SYMBOL_NAME(trap_c) addql #4,%sp jra SYMBOL_NAME(ret_from_exception)ENTRY(exception15) SAVE_ALL_INT 60 GET_CURRENT(%d0) movel %sp,%sp@- /* stack frame pointer argument*/ bsrw SYMBOL_NAME(trap_c) addql #4,%sp jra SYMBOL_NAME(ret_from_exception)ENTRY(trap1) SAVE_ALL_INT 132 GET_CURRENT(%d0) movel %sp,%sp@- /* stack frame pointer argument*/ bsrw SYMBOL_NAME(trap_c) addql #4,%sp jra SYMBOL_NAME(ret_from_exception)ENTRY(trap15) SAVE_ALL_INT 188 GET_CURRENT(%d0) movel %sp,%sp@- /* stack frame pointer argument*/ bsrw SYMBOL_NAME(trap_c) addql #4,%sp jra SYMBOL_NAME(ret_from_exception)ENTRY(reschedule) /* save top of frame*/ movel SYMBOL_NAME(_current_task),%a2 movel %sp,%a2@(TASK_THREAD+THREAD_ESP0) pea SYMBOL_NAME(ret_from_exception) jmp SYMBOL_NAME(schedule) /* After a fork we jump here directly from resume,*/ /* so that %d1 contains the previous task*/ /* Theoretically only needed on SMP, but let's watch*/ /* what happens in schedule_tail() in future...*/ENTRY(ret_from_fork) movel %d1,%sp@- jsr SYMBOL_NAME(schedule_tail) addql #4,%sp jra SYMBOL_NAME(ret_from_exception)badsys: movel #-ENOSYS,%sp@(PT_D0) jra SYMBOL_NAME(ret_from_exception)do_trace: movel #-ENOSYS,%sp@(PT_D0) /* needed for strace*/ subql #4,%sp SAVE_SWITCH_STACK jbsr SYMBOL_NAME(syscall_trace) RESTORE_SWITCH_STACK addql #4,%sp movel %sp@(PT_ORIG_D0),%d1 movel #-ENOSYS,%d0 cmpl #NR_syscalls,%d1 jcc 1f/* jbsr @(SYMBOL_NAME(sys_call_table),%d1:l:4)@(0) */ lsl #2,%d1#if 1 lea SYMBOL_NAME(sys_call_table), %a0 jbsr %a0@(%d1)#else bsrw SYMBOL_NAME(sys_call_table)@(%d1)#endif1: movel %d0,%sp@(PT_D0) /* save the return value*/ subql #4,%sp /* dummy return address*/ SAVE_SWITCH_STACK jbsr SYMBOL_NAME(syscall_trace)SYMBOL_NAME_LABEL(ret_from_signal) RESTORE_SWITCH_STACK addql #4,%sp jra SYMBOL_NAME(ret_from_exception)ENTRY(system_call) SAVE_ALL_SYS 128 GET_CURRENT(%d1) /* save top of frame*/ movel SYMBOL_NAME(_current_task),%a2 movel %sp,%a2@(TASK_THREAD+THREAD_ESP0) btst #PF_TRACESYS_BIT,%a2@(TASK_FLAGS+PF_TRACESYS_OFF) jne do_trace cmpl #NR_syscalls,%d0 jcc badsys/* jbsr @(SYMBOL_NAME(sys_call_table),%d0:l:4)@(0) */ lsl #2,%d0#if 1 lea SYMBOL_NAME(sys_call_table),%a0 movel %a0@(%d0), %a0 jbsr %a0@#else jbsr SYMBOL_NAME(sys_call_table)@(%d0)#endif movel %d0,%sp@(PT_D0) /* save the return value*/SYMBOL_NAME_LABEL(ret_from_exception) btst #5,%sp@(PT_SR) /* check if returning to kernel*/ bnes 2f /* if so, skip resched, signals*/ /* only allow interrupts when we are really the last one on the*/ /* kernel stack, otherwise stack overflow can occur during*/ /* heavy interupt load*/ andw #ALLOWINT,%sr movel SYMBOL_NAME(_current_task),%a2 tstl %a2@(TASK_NEEDRESCHED) jne SYMBOL_NAME(reschedule)#if 0 cmpl #SYMBOL_NAME(task),%a2 /* task[0] cannot have signals*/ jeq 2f#endif /* check for delayed trace*/ bclr #PF_DTRACE_BIT,%a2@(TASK_FLAGS+PF_DTRACE_OFF) jne do_delayed_trace5: tstl %a2@(TASK_STATE) /* state*/ jne SYMBOL_NAME(reschedule) tstl %a2@(TASK_SIGPENDING) jne Lsignal_return2: RESTORE_ALLLsignal_return: subql #4,%sp /* dummy return address*/ SAVE_SWITCH_STACK pea %sp@(SWITCH_STACK_SIZE) clrl %sp@- bsrw SYMBOL_NAME(do_signal) addql #8,%sp RESTORE_SWITCH_STACK addql #4,%sp /* * if an app is getting tricky and using "a5", the signal handler * may trigger while "a5" is invalid, so we have to set it here */ jbsr SYMBOL_NAME(get_pic_a5) movel %d0, %a5 RESTORE_ALLdo_delayed_trace: bclr #7,%sp@(PT_SR) /* clear trace bit in SR*/ pea 1 /* send SIGTRAP*/ movel %a2,%sp@- pea LSIGTRAP jbsr SYMBOL_NAME(send_sig) addql #8,%sp addql #4,%sp jra 5b/*** This is the main interrupt handler, responsible for calling process_int()*/SYMBOL_NAME_LABEL(inthandler1) SAVE_ALL_INT 260 GET_CURRENT(%d0) addql #1,SYMBOL_NAME(irq_stat)+CPUSTAT_LOCAL_IRQ_COUNT movel %sp,%sp@- movel #65,%sp@- /* put vector # on stack*/ jbsr SYMBOL_NAME(process_int)/* process the IRQ*/3: addql #8,%sp /* pop parameters off stack*/ bra ret_from_interruptSYMBOL_NAME_LABEL(inthandler2) SAVE_ALL_INT 264 GET_CURRENT(%d0) addql #1,SYMBOL_NAME(irq_stat)+CPUSTAT_LOCAL_IRQ_COUNT movel %sp,%sp@- movel #66,%sp@- /* put vector # on stack*/ jbsr SYMBOL_NAME(process_int)/* process the IRQ*/3: addql #8,%sp /* pop parameters off stack*/ bra ret_from_interruptSYMBOL_NAME_LABEL(inthandler3) SAVE_ALL_INT 268 GET_CURRENT(%d0) addql #1,SYMBOL_NAME(irq_stat)+CPUSTAT_LOCAL_IRQ_COUNT movel %sp,%sp@- movel #67,%sp@- /* put vector # on stack*/ jbsr SYMBOL_NAME(process_int)/* process the IRQ*/3: addql #8,%sp /* pop parameters off stack*/ bra ret_from_interruptSYMBOL_NAME_LABEL(inthandler4) SAVE_ALL_INT 272 GET_CURRENT(%d0) addql #1,SYMBOL_NAME(irq_stat)+CPUSTAT_LOCAL_IRQ_COUNT movel %sp,%sp@- movel #68,%sp@- /* put vector # on stack*/ jbsr SYMBOL_NAME(process_int)/* process the IRQ*/3: addql #8,%sp /* pop parameters off stack*/ bra ret_from_interruptSYMBOL_NAME_LABEL(inthandler5) SAVE_ALL_INT 276 GET_CURRENT(%d0) addql #1,SYMBOL_NAME(irq_stat)+CPUSTAT_LOCAL_IRQ_COUNT movel %sp,%sp@- movel #69,%sp@- /* put vector # on stack*/ jbsr SYMBOL_NAME(process_int)/* process the IRQ*/3: addql #8,%sp /* pop parameters off stack*/ bra ret_from_interruptSYMBOL_NAME_LABEL(inthandler6) SAVE_ALL_INT 280 GET_CURRENT(%d0) addql #1,SYMBOL_NAME(irq_stat)+CPUSTAT_LOCAL_IRQ_COUNT movel %sp,%sp@- movel #70,%sp@- /* put vector # on stack*/ jbsr SYMBOL_NAME(process_int)/* process the IRQ*/3: addql #8,%sp /* pop parameters off stack*/ bra ret_from_interruptSYMBOL_NAME_LABEL(inthandler7) SAVE_ALL_INT 284 GET_CURRENT(%d0) addql #1,SYMBOL_NAME(irq_stat)+CPUSTAT_LOCAL_IRQ_COUNT movel %sp,%sp@- movel #71,%sp@- /* put vector # on stack*/ jbsr SYMBOL_NAME(process_int)/* process the IRQ*/3: addql #8,%sp /* pop parameters off stack*/ bra ret_from_interrupt#if 0SYMBOL_NAME_LABEL(inthandler8) SAVE_ALL_INT GET_CURRENT(%d0) addql #1,SYMBOL_NAME(irq_stat)+CPUSTAT_LOCAL_IRQ_COUNT /* put exception # in d0*//* bfextu %sp@(PT_VECTOR){#4,#10},%d0 */ movew %sp@(PT_VECTOR), %d0 and #0x3ff, %d0 movel %sp,%sp@- movel #72,%sp@- /* put vector # on stack*/ jbsr SYMBOL_NAME(process_int)/* process the IRQ*/3: addql #8,%sp /* pop parameters off stack*/ bra ret_from_interruptSYMBOL_NAME_LABEL(timerhandler) SAVE_ALL_INT GET_CURRENT(%d0) addql #1,SYMBOL_NAME(irq_stat)+CPUSTAT_LOCAL_IRQ_COUNT /* put exception # in d0*//* bfextu %sp@(PT_VECTOR){#4,#10},%d0 */ movew %sp@(PT_VECTOR), %d0 and #0x3ff, %d0 movel %sp,%sp@- movel #0x40,%sp@- /* put vector # on stack*/ jbsr SYMBOL_NAME(process_int)/* process the IRQ*/3: addql #8,%sp /* pop parameters off stack*/ bra ret_from_interruptSYMBOL_NAME_LABEL(serialhandler) SAVE_ALL_INT GET_CURRENT(%d0) addql #1,SYMBOL_NAME(irq_stat)+CPUSTAT_LOCAL_IRQ_COUNT /* put exception # in d0*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -