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

📄 entry.s

📁 ARM 嵌入式 系统 设计与实例开发 实验教材 二源码
💻 S
📖 第 1 页 / 共 3 页
字号:
/* $Id: entry.S,v 1.38 2002/01/16 15:15:30 bjornw Exp $ * *  linux/arch/cris/entry.S * *  Copyright (C) 2000, 2001 Axis Communications AB * *  Authors:	Bjorn Wesen (bjornw@axis.com) * *  $Log: entry.S,v $ *  Revision 1.38  2002/01/16 15:15:30  bjornw *  Use a C-code compatible watchdog reset when NICE_DOGGY is enabled * *  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/sv_addr_ag.h>#include <asm/errno.h>		;; functions exported from this file		.globl system_call	.globl ret_from_intr	.globl ret_from_sys_call	.globl resume	.globl multiple_interrupt	.globl hwbreakpoint	.globl IRQ1_interrupt	.globl timer_interrupt	.globl timer_shortcut	.globl spurious_interrupt	.globl hw_bp_trigs	.globl mmu_bus_fault	.globl do_sigtrap	.globl gdb_handle_breakpoint				.globl sys_call_table		;; Get values and offsets into various structs.  The file isn't	;; suitable for consumption by the preprocessor, so don't use	;; #include.	.include "entryoffsets.s"	;; process bits for ptrace.  FIXME: Should be in a header file.PT_TRACESYS_BIT	  = 1	;; below are various parts of system_call which are not in the fast-path		;; handle software irqs				_handle_softirq:	move.d	$r9, $r1	jsr	do_softirq	; call the C routine for softirq handling	move.d	$r1, $r9	;; fall-through	ret_from_intr:	;; check for resched only 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 + LDCCR], $r0; regs->dccr	btstq	8, $r0		; U-flag	bpl	_Rexit		; go back directly	nop	ba	_ret_with_reschedule  ; go back but check schedule and signals first 	nop_reschedule:	;; keep r9 intact	move.d	$r9, $r1	jsr	schedule	ba	ret_from_sys_call	move.d	$r1, $r9	;; return but call do_signal first_signal_return:	ei			; we can get here from an interrupt	move.d	$r9, $r10	; do_signals syscall/irq param	moveq	0, $r11		; oldset param - 0 in this case	move.d	$sp, $r12	; another argument to do_signal (the regs param)	jsr	do_signal	; arch/cris/kernel/signal.c	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+LR10]	; 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+LTASK_PTRACE], $r0	btstq	PT_TRACESYS_BIT, $r0	bmi	_tracesys	nop		;; check for sanity in the requested syscall number		cmpu.w	NR_syscalls, $r9		bcc	ret_from_sys_call	lslq	2, $r9		;  multiply by 4, in the delay slot	;; as a bonus 7th parameter, we give the location on the stack	;; of the register structure itself. some syscalls need this.	push	$sp		;; the parameter carrying registers r10, r11, r12 and 13 are intact.	;; the fifth and sixth parameters (if any) was in mof and srp 	;; respectively, and we need to put them on the stack.	push	$srp	push	$mof		jsr	[$r9+sys_call_table]	; actually do the system call	addq	3*4, $sp		; pop the mof, srp and regs parameters	move.d	$r10, [$sp+LR10]	; save the return value	moveq	1, $r9		; "parameter" to ret_from_sys_call to show it was a sys call		;; fall through into ret_from_sys_call to return	ret_from_sys_call:	;; r9 is a parameter - if 1, we came from a syscall, if 0, from an irq			;; check if any bottom halves need service		test.d	[irq_stat]	       ; softirq_pending	bne	_handle_softirq	nop_ret_with_reschedule:	;; first get the current task-struct pointer (see top for defs)	move.d	$sp, $r0	and.d	-8192, $r0	; THREAD_SIZE == 8192		;; see if we want to reschedule into another process		test.d	[$r0+LTASK_NEEDRESCHED]

⌨️ 快捷键说明

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