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

📄 entry.s

📁 优龙2410linux2.6.8内核源代码
💻 S
📖 第 1 页 / 共 3 页
字号:
/* $Id: entry.S,v 1.18 2004/05/11 12:28:25 starvik Exp $ * *  linux/arch/cris/entry.S * *  Copyright (C) 2000, 2001, 2002 Axis Communications AB * *  Authors:	Bjorn Wesen (bjornw@axis.com) * *  $Log: entry.S,v $ *  Revision 1.18  2004/05/11 12:28:25  starvik *  Merge of Linux 2.6.6 * *  Revision 1.17  2003/09/11 07:29:49  starvik *  Merge of Linux 2.6.0-test5 * *  Revision 1.16  2003/07/04 08:27:41  starvik *  Merge of Linux 2.5.74 * *  Revision 1.15  2003/04/09 07:32:55  starvik *  resume should return task_struct, not thread_info * *  Revision 1.14  2003/04/09 05:20:44  starvik *  Merge of Linux 2.5.67 * *  Revision 1.13  2002/12/11 15:42:02  starvik *  Extracted v10 (ETRAX 100LX) specific stuff from arch/cris/kernel/*.c * *  Revision 1.12  2002/12/10 09:00:10  starvik *  Merge of Linux 2.5.51 * *  Revision 1.11  2002/12/05 07:53:10  starvik *  Corrected constants used with btstq * *  Revision 1.10  2002/11/27 08:45:10  starvik *  pid is in task_struct, not thread_info * *  Revision 1.9  2002/11/26 09:52:05  starvik *  Added preemptive kernel scheduling (if CONFIG_PREEMPT) * *  Revision 1.8  2002/11/20 11:56:11  starvik *  Merge of Linux 2.5.48 * *  Revision 1.7  2002/11/18 13:02:42  starvik *  Added fourth parameter to do_notify_resume *  Minor cleanup * *  Revision 1.6  2002/11/11 10:37:50  starvik *  Use new asm-offset defines *  Modified for new location of current->work etc *  Removed SYMBOL_NAME from syscalls *  Added some new syscalls * *  Revision 1.5  2002/11/05 06:45:11  starvik *  Merge of Linux 2.5.45 * *  Revision 1.4  2002/02/05 15:41:31  bjornw *  Rewritten to conform better to current 2.5 code (similar to arch/i386) * *  Revision 1.3  2002/01/21 15:22:20  bjornw *  NICE_DOGGY fix from 2.4 arch/cris * *  Revision 1.37  2001/12/07 17:03:55  bjornw *  Call a c-hook called watchdog_bite_hook instead of show_registers directly * *  Revision 1.36  2001/11/22 13:36:36  bjornw *  * In ret_from_intr, check regs->dccr for usermode reentrance instead of *    DCCR explicitely (because the latter might not reflect current reality) *  * In mmu_bus_fault, set $r9 _after_ calling the C-code instead of before *    since $r9 is call-clobbered and is potentially needed afterwards * *  Revision 1.35  2001/10/30 17:10:15  bjornw *  Add some syscalls * *  Revision 1.34  2001/10/01 14:45:03  bjornw *  Removed underscores and added register prefixes * *  Revision 1.33  2001/08/21 13:48:01  jonashg *  Added fix by HP to avoid oops when doing a hard_reset_now. * *  Revision 1.32  2001/08/14 04:32:02  hp *  In _resume, add comment why R9 is saved; don't sound like it's call-saved. * *  Revision 1.31  2001/07/25 16:07:42  bjornw *  softirq_active/mask -> softirq_pending only * *  Revision 1.30  2001/07/05 01:03:32  hp *  - include asm/errno.h to get ENOSYS. *  - Use ENOSYS, not local constant LENOSYS; tweak comments. *  - Explain why .include, not #include is used. *  - Make oops-register-dump if watchdog bits and it's not expected. *  - Don't jsr, use jump _hard_reset_now, and skip spurious nop. *  - Use correct section attribute for section .rodata. *  - Adjust sys_ni_syscall fill number. * *  Revision 1.29  2001/06/25 14:07:00  hp *  	Fix review comment. *  	* head.S: Use IO_STATE, IO_FIELD and IO_MASK constructs instead of *  	magic numbers.  Add comment that -traditional must not be used. *  	* entry.S (SYMBOL_NAME): Change redefinition to use ## concatenation. *  	Correct and update comment. *  	* Makefile (.S.o): Don't use -traditional.  Add comment why the *  	toplevel rule can't be used (now that there's a reason). * *  Revision 1.28  2001/06/21 02:00:40  hp *  	* entry.S: Include asm/unistd.h. *  	(_sys_call_table): Use section .rodata, not .data. *  	(_kernel_thread): Move from... *  	* process.c: ... here. *  	* entryoffsets.c (VAL): Break out from... *  	(OF): Use VAL. *  	(LCLONE_VM): New asmified value from CLONE_VM. * *  Revision 1.27  2001/05/29 11:25:27  markusl *  In case of "spurious_interrupt", do hard_reset instead of hanging system in a loop... * *  Revision 1.26  2001/05/15 15:46:03  bjornw *  Include config.h now that we use some CONFIG_ options * *  Revision 1.25  2001/05/15 05:38:47  hp *  Tweaked code in _ret_from_sys_call * *  Revision 1.24  2001/05/15 05:27:49  hp *  Save r9 in r1 over function call rather than on stack. * *  Revision 1.23  2001/05/15 05:10:00  hp *  Generate entry.S structure offsets from C * *  Revision 1.22  2001/04/17 13:58:39  orjanf *  * Renamed CONFIG_KGDB to CONFIG_ETRAX_KGDB. * *  Revision 1.21  2001/04/17 11:33:29  orjanf *  Updated according to review: *  * Included asm/sv_addr_ag.h to get macro for internal register. *  * Corrected comment regarding system call argument passing. *  * Removed comment about instruction being in a delay slot. *  * Added comment about SYMBOL_NAME macro. * *  Revision 1.20  2001/04/12 08:51:07  hp *  - Add entry for sys_fcntl64.  In fact copy last piece from i386 including ... *  - .rept to fill table to safe state with sys_ni_syscall. * *  Revision 1.19  2001/04/04 09:43:32  orjanf *  * Moved do_sigtrap from traps.c to entry.S. *  * LTASK_PID need not be global anymore. * *  Revision 1.18  2001/03/26 09:25:02  markusl *  Updated after review, should now handle USB interrupts correctly. * *  Revision 1.17  2001/03/21 16:12:55  bjornw *  * Always make room for the cpu status record in the frame, in order to *    use the same framelength and layout for both mmu busfaults and normal *    irqs. No need to check for the explicit CRIS_FRAME_FIXUP type anymore. *  * Fixed bug with using addq for popping the stack in the epilogue - it *    destroyed the flag register. Use instructions that don't affect the *    flag register instead. *  * Removed write to R_PORT_PA_DATA during spurious_interrupt * *  Revision 1.16  2001/03/20 19:43:02  bjornw *  * Get rid of esp0 setting *  * Give a 7th argument to a systemcall - the stackframe * *  Revision 1.15  2001/03/05 13:14:30  bjornw *  Spelling fix * *  Revision 1.14  2001/02/23 08:36:36  perf *  New ABI; syscallnr=r9, arg5=mof, arg6=srp. *  Corrected tracesys call check. * *  Revision 1.13  2001/02/15 08:40:55  perf *  H-P by way of perf; *  - (_system_call): Don't read system call function address into r1. *  - (RBFExit): There is no such thing as a null pop.  Adjust sp by addq. *  - (_system_call): Don't use r10 and don't save and restore it. *  - (THREAD_ESP0): New constant. *  - (_system_call): Inline set_esp0. * *  Revision 1.12  2001/01/31 17:56:25  orjanf *  Added definition of LTASK_PID and made it global. * *  Revision 1.11  2001/01/10 21:13:29  bjornw *  SYMBOL_NAME is defined incorrectly for the compiler options we currently use * *  Revision 1.10  2000/12/18 23:47:56  bjornw *  * Added syscall trace support (ptrace), completely untested of course *  * Removed redundant check for NULL entries in syscall_table * *  Revision 1.9  2000/11/21 16:40:51  bjornw *  * New frame type used when an SBFS frame needs to be popped without *    actually restarting the instruction *  * Enable interrupts in signal_return (they did so in x86, I hope it's a good *    idea) * *  Revision 1.8  2000/11/17 16:53:35  bjornw *  Added detection of frame-type in Rexit, so that mmu_bus_fault can *  use ret_from_intr in the return-path to check for signals (like SEGV) *  and other foul things that might have occurred during the fault. * *  Revision 1.7  2000/10/06 15:04:28  bjornw *  Include mof in register savings * *  Revision 1.6  2000/09/12 16:02:44  bjornw *  Linux-2.4.0-test7 derived updates * *  Revision 1.5  2000/08/17 15:35:15  bjornw *  2.4.0-test6 changed local_irq_count and friends API * *  Revision 1.4  2000/08/02 13:59:30  bjornw *  Removed olduname and uname from the syscall list * *  Revision 1.3  2000/07/31 13:32:58  bjornw *  * Export ret_from_intr *  * _resume updated (prev/last tjohejsan) *  * timer_interrupt obsolete *  * SIGSEGV detection in mmu_bus_fault temporarily disabled * * *//* * entry.S contains the system-call and fault low-level handling routines. * * NOTE: This code handles signal-recognition, which happens every time * after a timer-interrupt and after each system call. * * Stack layout in 'ret_from_system_call': * 	ptrace needs to have all regs on the stack. *	if the order here is changed, it needs to be  *	updated in fork.c:copy_process, signal.c:do_signal, *	ptrace.c and ptrace.h * */#include <linux/config.h>#include <linux/linkage.h>#include <linux/sys.h>#include <asm/unistd.h>#include <asm/arch/sv_addr_ag.h>#include <asm/errno.h>#include <asm/thread_info.h>#include <asm/arch/offset.h>			;; functions exported from this file		.globl system_call	.globl ret_from_intr	.globl ret_from_fork	.globl resume	.globl multiple_interrupt	.globl hwbreakpoint	.globl IRQ1_interrupt	.globl spurious_interrupt	.globl hw_bp_trigs	.globl mmu_bus_fault	.globl do_sigtrap	.globl gdb_handle_breakpoint	.globl sys_call_table		;; below are various parts of system_call which are not in the fast-path	#ifdef CONFIG_PREEMPT		; Check if preemptive kernel scheduling should be done_resume_kernel:	; Load current task struct	movs.w	-8192, $r0	;  THREAD_SIZE = 8192	and.d	$sp, $r0	move.d	[$r0+TI_preempt_count], $r10	;  Preemption disabled?	bne	_Rexit	nop_need_resched:	move.d	[$r0+TI_flags], $r10	btstq	TIF_NEED_RESCHED, $r10	; Check if need_resched is set	bpl	_Rexit	nop	; Ok, lets's do some preemptive kernel scheduling	move.d	PREEMPT_ACTIVE, $r10	move.d	$r10, [$r0+TI_preempt_count] ; Mark as active	ei	jsr	schedule	clear.d	[$r0+TI_preempt_count] ;  Mark as inactive	di	; Load new task struct	movs.w	-8192, $r0	;  THREAD_SIZE = 8192	and.d	$sp, $r0	; One more time (with new task)	ba	_need_resched	nop#else#define _resume_kernel _Rexit#endif		; Called at exit from fork. schedule_tail must be called to drop	; spinlock if CONFIG_PREEMPTret_from_fork:	jsr schedule_tail	ba  ret_from_sys_call	nop		ret_from_intr:	;; check for resched if preemptive kernel or if we're going back to user-mode 	;; this test matches the user_regs(regs) macro	;; we cannot simply test $dccr, because that does not necessarily	;; reflect what mode we'll return into.		move.d	[$sp + PT_dccr], $r0; regs->dccr	btstq	8, $r0		; U-flag	bpl     _resume_kernel	; Note that di below is in delay slot 	_resume_userspace:	di			; so need_resched and sigpending don't change	movs.w	-8192, $r0	; THREAD_SIZE == 8192	and.d	$sp, $r0	move.d	[$r0+TI_flags], $r10	; current->work	and.d	_TIF_WORK_MASK, $r10	; is there any work to be done on return	bne	_work_pending	nop	ba	_Rexit	nop		;; The system_call is called by a BREAK instruction, which works like	;; an interrupt call but it stores the return PC in BRP instead of IRP.	;; Since we dont really want to have two epilogues (one for system calls	;; and one for interrupts) we push the contents of BRP instead of IRP in the	;; system call prologue, to make it look like an ordinary interrupt on the	;; stackframe.	;;	;; Since we can't have system calls inside interrupts, it should not matter	;; that we don't stack IRP.	;; 	;; In r9 we have the wanted syscall number. Arguments come in r10,r11,r12,r13,mof,srp	;;	;; This function looks on the _surface_ like spaghetti programming, but it's	;; really designed so that the fast-path does not force cache-loading of non-used	;; instructions. Only the non-common cases cause the outlined code to run..system_call:	;; stack-frame similar to the irq heads, which is reversed in ret_from_sys_call	move	$brp,[$sp=$sp-16]; instruction pointer and room for a fake SBFS frame	push	$srp	push	$dccr	push	$mof	subq	14*4, $sp		; make room for r0-r13	movem	$r13, [$sp]	; push r0-r13	push	$r10		; push orig_r10	clear.d [$sp=$sp-4]	; frametype == 0, normal stackframe		movs.w	-ENOSYS, $r0	move.d	$r0, [$sp+PT_r10]	; put the default return value in r10 in the frame	;; check if this process is syscall-traced	movs.w	-8192, $r0	; THREAD_SIZE == 8192	and.d	$sp, $r0		move.d	[$r0+TI_flags], $r0	btstq   TIF_SYSCALL_TRACE, $r0	bmi	_syscall_trace_entry	nop	_syscall_traced:		;; check for sanity in the requested syscall number	

⌨️ 快捷键说明

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