⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 entry.s

📁 microwindows移植到S3C44B0的源码
💻 S
📖 第 1 页 / 共 2 页
字号:
/* -*- 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 + -