entry.s

来自「linux-2.4.29操作系统的源码」· S 代码 · 共 2,106 行 · 第 1/4 页

S
2,106
字号
/* * This file is subject to the terms and conditions of the GNU General Public * License.  See the file "COPYING" in the main directory of this archive * for more details. * * arch/sh64/kernel/entry.S * * Copyright (C) 2000, 2001  Paolo Alberelli * */#include <linux/config.h>#include <linux/errno.h>#include <linux/sys.h>#include <asm/processor.h>#include <asm/registers.h>#include <asm/unistd.h>/* * A few defines that ought to come from sched.h referring * to the task structure. Byte offsets within the task * structure and related flags. */#define flags		4#define sigpending	8#define need_resched	20#define ptrace		24#define PT_TRACESYS	0x00000002/* * SR fields. */#define SR_ASID_MASK	0x00ff0000#define SR_FD_MASK	0x00008000#define SR_SS		0x08000000#define SR_BL		0x10000000#define SR_MD		0x40000000#define SR_MMU		0x80000000/* * Event code. */#define	EVENT_INTERRUPT		0#define	EVENT_FAULT_TLB		1#define	EVENT_FAULT_NOT_TLB	2#define	EVENT_DEBUG		3/* EXPEVT values */#define	RESET_CAUSE		0x20#define DEBUGSS_CAUSE		0x980/* * Frame layout. Quad index. */#define	FRAME_T(x)	FRAME_TBASE+(x*8)#define	FRAME_R(x)	FRAME_RBASE+(x*8)#define	FRAME_S(x)	FRAME_SBASE+(x*8)#define FSPC		0#define FSSR		1#define FSYSCALL_ID	2/* Arrange the save frame to be a multiple of 32 bytes long */#define FRAME_SBASE	0#define FRAME_RBASE	(FRAME_SBASE+(3*8))	/* SYSCALL_ID - SSR - SPC */#define FRAME_TBASE	(FRAME_RBASE+(63*8))	/* r0 - r62 */#define FRAME_PBASE	(FRAME_TBASE+(8*8))	/* t0 -t7 */#define	FRAME_SIZE	(FRAME_PBASE+(2*8))	/* pad0-pad1 */#define FP_FRAME_SIZE	FP_FRAME_BASE+(33*8)	/* dr0 - dr31 + fpscr */#define FP_FRAME_BASE	0#define	SAVED_R2	0*8#define	SAVED_R3	1*8#define	SAVED_R4	2*8#define	SAVED_R5	3*8#define	SAVED_R18	4*8#define	SAVED_R6	5*8#define	SAVED_T0	6*8/* These are the registers saved in the TLB path that aren't saved in the first   level of the normal one. */#define	TLB_SAVED_R25	7*8#define	TLB_SAVED_T1	8*8#define	TLB_SAVED_T2	9*8#define	TLB_SAVED_T3	10*8#define	TLB_SAVED_T4	11*8/* Save R0/R1 : PT-migrating compiler currently dishounours -ffixed-r0 and -ffixed-r1 causing   breakage otherwise. */#define	TLB_SAVED_R0	12*8#define	TLB_SAVED_R1	13*8#define STI()				\	getcon	SR, r6;			\	andi	r6, ~0xf0, r6;		\	putcon	r6, SR;	.section	.data, "aw"#define FAST_TLBMISS_STACK_CACHELINES 4#define FAST_TLBMISS_STACK_QUADWORDS (4*FAST_TLBMISS_STACK_CACHELINES)/* Register back-up area for all exceptions */	.balign	32	/* Allow for 16 quadwords to be pushed by fast tlbmiss handling	 * register saves etc. */	.fill FAST_TLBMISS_STACK_QUADWORDS, 8, 0x0/* This is 32 byte aligned by construction *//* Register back-up area for all exceptions */reg_save_area:	.quad	0	.quad	0	.quad	0	.quad	0	.quad	0	.quad	0	.quad	0	.quad	0	.quad	0	.quad	0	.quad	0	.quad	0	.quad	0	.quad   0/* Save area for RESVEC exceptions. We cannot use reg_save_area because of * reentrancy. Note this area may be accessed via physical address. * Align so this fits a whole single cache line, for ease of purging. */	.balign 32,0,32resvec_save_area:	.quad	0	.quad	0	.quad	0	.quad	0	.quad	0	.balign 32,0,32/* Jump table of 3rd level handlers  */trap_jtable:	.long	do_exception_error		/* 0x000 */	.long	do_exception_error		/* 0x020 */	.long	tlb_miss_load				/* 0x040 */	.long	tlb_miss_store				/* 0x060 */	.long	do_exception_error		/* 0x080 */	.long	tlb_miss_load				/* 0x0A0 */	.long	tlb_miss_store				/* 0x0C0 */	.long	do_address_error_load	/* 0x0E0 */	.long	do_address_error_store	/* 0x100 */#ifndef CONFIG_NOFPU_SUPPORT	.long	do_fpu_error		/* 0x120 */#else	.long	do_exception_error		/* 0x120 */#endif	.long	do_exception_error		/* 0x140 */	.long	system_call				/* 0x160 */	.long	do_reserved_inst		/* 0x180 */	.long	do_illegal_slot_inst	/* 0x1A0 */	.long	do_NMI			/* 0x1C0 */	.long	do_exception_error		/* 0x1E0 */	.rept 15		.long do_IRQ		/* 0x200 - 0x3C0 */	.endr	.long	do_exception_error		/* 0x3E0 */	.rept 32		.long do_IRQ		/* 0x400 - 0x7E0 */	.endr	.long	fpu_error_or_IRQA			/* 0x800 */	.long	fpu_error_or_IRQB			/* 0x820 */	.long	do_IRQ			/* 0x840 */	.long	do_IRQ			/* 0x860 */	.rept 6		.long do_exception_error	/* 0x880 - 0x920 */	.endr	.long	do_software_break_point	/* 0x940 */	.long	do_exception_error		/* 0x960 */	.long	do_single_step		/* 0x980 */	.rept 3		.long do_exception_error	/* 0x9A0 - 0x9E0 */	.endr	.long	do_IRQ			/* 0xA00 */	.long	do_IRQ			/* 0xA20 */	.long	itlb_miss_or_IRQ			/* 0xA40 */	.long	do_IRQ			/* 0xA60 */	.long	do_IRQ			/* 0xA80 */	.long	itlb_miss_or_IRQ			/* 0xAA0 */	.long	do_exception_error		/* 0xAC0 */	.long	do_address_error_exec	/* 0xAE0 */	.rept 8		.long do_exception_error	/* 0xB00 - 0xBE0 */	.endr	.rept 18		.long do_IRQ		/* 0xC00 - 0xE20 */	.endr/* System calls jump table */.globl  sys_call_tablesys_call_table:	.long sys_ni_syscall	/* 0  -  old "setup()" system call  */	.long sys_exit	.long sys_fork	.long sys_read	.long sys_write	.long sys_open		/* 5 */	.long sys_close	.long sys_waitpid	.long sys_creat	.long sys_link	.long sys_unlink		/* 10 */	.long sys_execve	.long sys_chdir	.long sys_time	.long sys_mknod	.long sys_chmod		/* 15 */	.long sys_lchown16	.long sys_ni_syscall	/* old break syscall holder */	.long sys_stat	.long sys_lseek	.long sys_getpid		/* 20 */	.long sys_mount	.long sys_oldumount	.long sys_setuid16	.long sys_getuid16	.long sys_stime		/* 25 */	.long sys_ptrace	.long sys_alarm	.long sys_fstat	.long sys_pause	.long sys_utime		/* 30 */	.long sys_ni_syscall	/* old stty syscall holder */	.long sys_ni_syscall	/* old gtty syscall holder */	.long sys_access	.long sys_nice	.long sys_ni_syscall	/* 35 */						/* old ftime syscall holder */	.long sys_sync	.long sys_kill	.long sys_rename	.long sys_mkdir	.long sys_rmdir		/* 40 */	.long sys_dup	.long sys_pipe	.long sys_times	.long sys_ni_syscall	/* old prof syscall holder */	.long sys_brk		/* 45 */	.long sys_setgid16	.long sys_getgid16	.long sys_signal	.long sys_geteuid16	.long sys_getegid16	/* 50 */	.long sys_acct	.long sys_umount		/* recycled never used phys( */	.long sys_ni_syscall	/* old lock syscall holder */	.long sys_ioctl	.long sys_fcntl		/* 55 */	.long sys_ni_syscall	/* old mpx syscall holder */	.long sys_setpgid	.long sys_ni_syscall	/* old ulimit syscall holder */	.long sys_ni_syscall	/* sys_olduname */	.long sys_umask		/* 60 */	.long sys_chroot	.long sys_ustat	.long sys_dup2	.long sys_getppid	.long sys_getpgrp		/* 65 */	.long sys_setsid	.long sys_sigaction	.long sys_sgetmask	.long sys_ssetmask	.long sys_setreuid16	/* 70 */	.long sys_setregid16	.long sys_sigsuspend	.long sys_sigpending	.long sys_sethostname	.long sys_setrlimit	/* 75 */	.long sys_old_getrlimit	.long sys_getrusage	.long sys_gettimeofday	.long sys_settimeofday	.long sys_getgroups16	/* 80 */	.long sys_setgroups16	.long sys_ni_syscall	/* sys_oldselect */	.long sys_symlink	.long sys_lstat	.long sys_readlink		/* 85 */	.long sys_uselib	.long sys_swapon	.long sys_reboot	.long old_readdir	.long old_mmap		/* 90 */	.long sys_munmap	.long sys_truncate	.long sys_ftruncate	.long sys_fchmod	.long sys_fchown16		/* 95 */	.long sys_getpriority	.long sys_setpriority	.long sys_ni_syscall	/* old profil syscall holder */	.long sys_statfs	.long sys_fstatfs		/* 100 */	.long sys_ni_syscall	/* ioperm */	.long sys_socketcall	/* Obsolete implementation of socket syscall */	.long sys_syslog	.long sys_setitimer	.long sys_getitimer	/* 105 */	.long sys_newstat	.long sys_newlstat	.long sys_newfstat	.long sys_uname	.long sys_ni_syscall	/* 110 */ /* iopl */	.long sys_vhangup	.long sys_ni_syscall	/* idle */	.long sys_ni_syscall	/* vm86old */	.long sys_wait4	.long sys_swapoff		/* 115 */	.long sys_sysinfo	.long sys_ipc		/* Obsolete ipc syscall implementation */	.long sys_fsync	.long sys_sigreturn	.long sys_clone		/* 120 */	.long sys_setdomainname	.long sys_newuname	.long sys_ni_syscall	/* sys_modify_ldt */	.long sys_adjtimex	.long sys_mprotect		/* 125 */	.long sys_sigprocmask	.long sys_create_module	.long sys_init_module	.long sys_delete_module	.long sys_get_kernel_syms	/* 130 */	.long sys_quotactl	.long sys_getpgid	.long sys_fchdir	.long sys_bdflush	.long sys_sysfs		/* 135 */	.long sys_personality	.long sys_ni_syscall	/* for afs_syscall */	.long sys_setfsuid16	.long sys_setfsgid16	.long sys_llseek		/* 140 */	.long sys_getdents	.long sys_select	.long sys_flock	.long sys_msync	.long sys_readv		/* 145 */	.long sys_writev	.long sys_getsid	.long sys_fdatasync	.long sys_sysctl	.long sys_mlock		/* 150 */	.long sys_munlock	.long sys_mlockall	.long sys_munlockall	.long sys_sched_setparam	.long sys_sched_getparam   	/* 155 */	.long sys_sched_setscheduler	.long sys_sched_getscheduler	.long sys_sched_yield	.long sys_sched_get_priority_max	.long sys_sched_get_priority_min  /* 160 */	.long sys_sched_rr_get_interval	.long sys_nanosleep	.long sys_mremap	.long sys_setresuid16	.long sys_getresuid16	/* 165 */	.long sys_ni_syscall	/* vm86 */	.long sys_query_module	.long sys_poll	.long sys_nfsservctl	.long sys_setresgid16	/* 170 */	.long sys_getresgid16	.long sys_prctl	.long sys_rt_sigreturn	.long sys_rt_sigaction	.long sys_rt_sigprocmask	/* 175 */	.long sys_rt_sigpending	.long sys_rt_sigtimedwait	.long sys_rt_sigqueueinfo	.long sys_rt_sigsuspend	.long sys_pread		/* 180 */	.long sys_pwrite	.long sys_chown16	.long sys_getcwd	.long sys_capget	.long sys_capset       	/* 185 */	.long sys_sigaltstack	.long sys_sendfile	.long sys_ni_syscall	/* streams1 */	.long sys_ni_syscall	/* streams2 */	.long sys_vfork        	/* 190 */	.long sys_getrlimit	.long sys_mmap2	.long sys_truncate64	.long sys_ftruncate64	.long sys_stat64		/* 195 */	.long sys_lstat64	.long sys_fstat64	.long sys_lchown	.long sys_getuid	.long sys_getgid		/* 200 */	.long sys_geteuid	.long sys_getegid	.long sys_setreuid	.long sys_setregid	.long sys_getgroups	/* 205 */	.long sys_setgroups	.long sys_fchown	.long sys_setresuid	.long sys_getresuid	.long sys_setresgid	/* 210 */	.long sys_getresgid	.long sys_chown	.long sys_setuid	.long sys_setgid	.long sys_setfsuid		/* 215 */	.long sys_setfsgid	.long sys_pivot_root	.long sys_mincore	.long sys_madvise	.long sys_socket		/* 220 */	.long sys_bind	.long sys_connect	.long sys_listen	.long sys_accept	.long sys_getsockname	/* 225 */	.long sys_getpeername	.long sys_socketpair	.long sys_send	.long sys_sendto	.long sys_recv		/* 230*/	.long sys_recvfrom	.long sys_shutdown	.long sys_setsockopt	.long sys_getsockopt	.long sys_sendmsg		/* 235 */	.long sys_recvmsg	.long sys_semop		/* New ipc syscall implementation */	.long sys_semget	.long sys_semctl	.long sys_msgsnd		/* 240 */	.long sys_msgrcv	.long sys_msgget	.long sys_msgctl	.long sys_shmatcall	.long sys_shmdt		/* 245 */	.long sys_shmget	.long sys_shmctl	/*	 * NOTE!! This doesn't have to be exact - we just have	 * to make sure we have _enough_ of the "sys_ni_syscall"	 * entries. Don't panic if you notice that this hasn't	 * been shrunk every time we add a new system call.	 */	.rept NR_syscalls-247		.long sys_ni_syscall	.endr	.section	.text64, "ax"/* * --- Exception/Interrupt/Event Handling Section *//* * VBR and RESVEC blocks. * * First level handler for VBR-based exceptions. * * To avoid waste of space, align to the maximum text block size. * This is assumed to be at most 128 bytes or 32 instructions. * DO NOT EXCEED 32 instructions on the first level handlers ! * * Also note that RESVEC is contained within the VBR block * where the room left (1KB - TEXT_SIZE) allows placing * the RESVEC block (at most 512B + TEXT_SIZE).  *  * So first (and only) level handler for RESVEC-based exceptions. * * Where the fault/interrupt is handled (not_a_tlb_miss, tlb_miss * and interrupt) we are a lot tight with register space until * saving onto the stack frame, which is done in handle_exception(). * */#define	TEXT_SIZE 	128#define	BLOCK_SIZE 	1664 		/* Dynamic check, 13*128 */	.balign TEXT_SIZELVBR_block:	.space	256, 0			/* Power-on class handler, */					/* not required here       */not_a_tlb_miss:	/* Save original stack pointer into KCR1 */	putcon	SP, KCR1	/* Save other original registers into reg_save_area */        _loada  reg_save_area, SP	st.q	SP, SAVED_R2, r2	st.q	SP, SAVED_R3, r3	st.q	SP, SAVED_R4, r4	st.q	SP, SAVED_R5, r5	st.q	SP, SAVED_R6, r6	st.q	SP, SAVED_R18, r18	gettr	t0, r3	st.q	SP, SAVED_T0, r3#ifdef CONFIG_SH64_PAGE_TABLE_AUDIT	/* This use of DCR is not really legal, but there's nowhere else convenient to store this and it's only for last-resort debug anyway. */	movi    0x100, r3	putcon  r3, dcr#endif		/* Set args for Non-debug, Not a TLB miss class handler */	getcon	EXPEVT, r2	_loada	ret_from_exception, r3	ori	r3, 1, r3	movi	EVENT_FAULT_NOT_TLB, r4	or	SP, ZERO, r5

⌨️ 快捷键说明

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