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

📄 entry.s

📁 microwindows移植到S3C44B0的源码
💻 S
📖 第 1 页 / 共 2 页
字号:
/* -*- mode: asm -*- * *  linux/arch/m68knommu/platform/68360/entry.S * *  Copyright (C) 1991, 1992  Linus Torvalds *  Copyright (C) 2001 SED Systems, a Division of Calian Ltd. * * 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 * M68360 Port by SED Systems, and Lineo. * *//* * 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/setup.h>#include <asm/segment.h>#include <asm/entry.h>#include <asm/errno.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',0xfffff907LD0         =   0x20LORIG_D0    =   0x24.globl SYMBOL_NAME(system_call).globl SYMBOL_NAME(buserr).globl SYMBOL_NAME(trap).globl SYMBOL_NAME(resume).globl SYMBOL_NAME(ret_from_exception).globl SYMBOL_NAME(ret_from_signal).globl SYMBOL_NAME(sys_call_table).globl SYMBOL_NAME(sys_fork).globl SYMBOL_NAME(sys_clone).globl SYMBOL_NAME(sys_vfork).globl SYMBOL_NAME(ret_from_interrupt).globl SYMBOL_NAME(bad_interrupt).globl SYMBOL_NAME(inthandler).textENTRY(buserr)	SAVE_ALL_INT	/* 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(trap)	SAVE_ALL_INT	GET_CURRENT(%d0)    moveq.l #-1,%d0    move.l  %d0,%sp@(LORIG_D0)/* may have to test for LFORMATVEC here as was done in teh 2.0 module */	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	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(inthandler)	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.l	#0x3ff, %d0    lsr.l   #0x02,  %d0	movel	%sp,%sp@-	movel	%d0,%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(ret_from_interrupt)	subql	#1,SYMBOL_NAME(irq_stat)+CPUSTAT_LOCAL_IRQ_COUNT	jeq	1f2:	RESTORE_ALL1:#if 1/*	bfextu  %sp@(PT_SR){#5,#3},%d0 */	/* Check for nested interrupt.*/	moveb	%sp@(PT_SR), %d0	and	#7, %d0#if MAX_NOINT_IPL > 0	cmpiw	#MAX_NOINT_IPL,%d0#endif	jhi	2b#endif	/* check if we need to do software interrupts */	movel	SYMBOL_NAME(irq_stat)+CPUSTAT_SOFTIRQ_PENDING,%d0	jeq	SYMBOL_NAME(ret_from_exception)	pea	SYMBOL_NAME(ret_from_exception)	jra	SYMBOL_NAME(do_softirq)/* Handler for uninitialized and spurious interrupts */SYMBOL_NAME_LABEL(bad_interrupt)	addql	#1,SYMBOL_NAME(num_spurious)	rteENTRY(sys_fork)	SAVE_SWITCH_STACK		pea	%sp@(SWITCH_STACK_SIZE)	jbsr	SYMBOL_NAME(m68k_fork)	addql	#4,%sp	RESTORE_SWITCH_STACK	rtsENTRY(sys_clone)	SAVE_SWITCH_STACK	pea	%sp@(SWITCH_STACK_SIZE)	jbsr	SYMBOL_NAME(m68k_clone)	addql	#4,%sp	RESTORE_SWITCH_STACK	rtsENTRY(sys_vfork)	SAVE_SWITCH_STACK		pea	%sp@(SWITCH_STACK_SIZE)	jbsr	SYMBOL_NAME(m68k_vfork)	addql	#4,%sp	RESTORE_SWITCH_STACK	rtsENTRY(sys_sigsuspend)	SAVE_SWITCH_STACK	pea	%sp@(SWITCH_STACK_SIZE)	jbsr	SYMBOL_NAME(do_sigsuspend)	addql	#4,%sp	RESTORE_SWITCH_STACK	rtsENTRY(sys_rt_sigsuspend)	SAVE_SWITCH_STACK	pea	%sp@(SWITCH_STACK_SIZE)	jbsr	SYMBOL_NAME(do_rt_sigsuspend)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -