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

📄 fsys.s

📁 优龙2410linux2.6.8内核源代码
💻 S
📖 第 1 页 / 共 2 页
字号:
(p7)	cmp.ne.or.andcm p6,p7=r18,r0		// p6/p7 <- signal pending	mov r19=0					// i must not leak kernel bits...(p6)	br.cond.dpnt.many .sig_pending	;;1:	ld4 r17=[r9]				// r17 <- current->thread_info->flags	;;	mov ar.ccv=r17	and r18=~_TIF_SIGPENDING,r17		// r18 <- r17 & ~(1 << TIF_SIGPENDING)	;;	st8 [r2]=r14				// update current->blocked with new mask	cmpxchg4.acq r14=[r9],r18,ar.ccv	// current->thread_info->flags <- r18	;;	cmp.ne p6,p0=r17,r14			// update failed?(p6)	br.cond.spnt.few 1b			// yes -> retry#ifdef CONFIG_SMP	st4.rel [r31]=r0			// release the lock#endif	ssm psr.i	;;	srlz.d					// ensure psr.i is set again	mov r18=0					// i must not leak kernel bits....store_mask:EX(.fail_efault, (p15) probe.w.fault r34, 3)	// verify user has write-access to *osetEX(.fail_efault, (p15) st8 [r34]=r3)	mov r2=0					// i must not leak kernel bits...	mov r3=0					// i must not leak kernel bits...	mov r8=0				// return 0	mov r9=0					// i must not leak kernel bits...	mov r14=0					// i must not leak kernel bits...	mov r17=0					// i must not leak kernel bits...	mov r31=0					// i must not leak kernel bits...	FSYS_RETURN.sig_pending:#ifdef CONFIG_SMP	st4.rel [r31]=r0			// release the lock#endif	ssm psr.i	;;	srlz.d	br.sptk.many fsys_fallback_syscall	// with signal pending, do the heavy-weight syscall#ifdef CONFIG_SMP.lock_contention:	/* Rather than spinning here, fall back on doing a heavy-weight syscall.  */	ssm psr.i	;;	srlz.d	br.sptk.many fsys_fallback_syscall#endifEND(fsys_rt_sigprocmask)ENTRY(fsys_fallback_syscall)	.prologue	.altrp b6	.body	/*	 * We only get here from light-weight syscall handlers.  Thus, we already	 * know that r15 contains a valid syscall number.  No need to re-check.	 */	adds r17=-1024,r15	movl r14=sys_call_table	;;	rsm psr.i	shladd r18=r17,3,r14	;;	ld8 r18=[r18]				// load normal (heavy-weight) syscall entry-point	mov r29=psr				// read psr (12 cyc load latency)	mov r27=ar.rsc	mov r21=ar.fpsr	mov r26=ar.pfsEND(fsys_fallback_syscall)	/* FALL THROUGH */GLOBAL_ENTRY(fsys_bubble_down)	.prologue	.altrp b6	.body	/*	 * We get here for syscalls that don't have a lightweight handler.  For those, we	 * need to bubble down into the kernel and that requires setting up a minimal	 * pt_regs structure, and initializing the CPU state more or less as if an	 * interruption had occurred.  To make syscall-restarts work, we setup pt_regs	 * such that cr_iip points to the second instruction in syscall_via_break.	 * Decrementing the IP hence will restart the syscall via break and not	 * decrementing IP will return us to the caller, as usual.  Note that we preserve	 * the value of psr.pp rather than initializing it from dcr.pp.  This makes it	 * possible to distinguish fsyscall execution from other privileged execution.	 *	 * On entry:	 *	- normal fsyscall handler register usage, except that we also have:	 *	- r18: address of syscall entry point	 *	- r21: ar.fpsr	 *	- r26: ar.pfs	 *	- r27: ar.rsc	 *	- r29: psr	 */#	define PSR_PRESERVED_BITS	(IA64_PSR_UP | IA64_PSR_MFL | IA64_PSR_MFH | IA64_PSR_PK \					 | IA64_PSR_DT | IA64_PSR_PP | IA64_PSR_SP | IA64_PSR_RT \					 | IA64_PSR_IC)	/*	 * Reading psr.l gives us only bits 0-31, psr.it, and psr.mc.  The rest we have	 * to synthesize.	 */#	define PSR_ONE_BITS		((3 << IA64_PSR_CPL0_BIT) | (0x1 << IA64_PSR_RI_BIT) \					 | IA64_PSR_BN | IA64_PSR_I)	invala	movl r8=PSR_ONE_BITS	mov r25=ar.unat			// save ar.unat (5 cyc)	movl r9=PSR_PRESERVED_BITS	mov ar.rsc=0			// set enforced lazy mode, pl 0, little-endian, loadrs=0	movl r28=__kernel_syscall_via_break	;;	mov r23=ar.bspstore		// save ar.bspstore (12 cyc)	mov r31=pr			// save pr (2 cyc)	mov r20=r1			// save caller's gp in r20	;;	mov r2=r16			// copy current task addr to addl-addressable register	and r9=r9,r29	mov r19=b6			// save b6 (2 cyc)	;;	mov psr.l=r9			// slam the door (17 cyc to srlz.i)	or r29=r8,r29			// construct cr.ipsr value to save	addl r22=IA64_RBS_OFFSET,r2	// compute base of RBS	;;	// GAS reports a spurious RAW hazard on the read of ar.rnat because it thinks	// we may be reading ar.itc after writing to psr.l.  Avoid that message with	// this directive:	dv_serialize_data	mov.m r24=ar.rnat		// read ar.rnat (5 cyc lat)	lfetch.fault.excl.nt1 [r22]	adds r16=IA64_TASK_THREAD_ON_USTACK_OFFSET,r2	// ensure previous insn group is issued before we stall for srlz.i:	;;	srlz.i				// ensure new psr.l has been established	/////////////////////////////////////////////////////////////////////////////	////////// from this point on, execution is not interruptible anymore	/////////////////////////////////////////////////////////////////////////////	addl r1=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r2	// compute base of memory stack	cmp.ne pKStk,pUStk=r0,r0	// set pKStk <- 0, pUStk <- 1	;;	st1 [r16]=r0			// clear current->thread.on_ustack flag	mov ar.bspstore=r22		// switch to kernel RBS	mov b6=r18			// copy syscall entry-point to b6 (7 cyc)	add r3=TI_FLAGS+IA64_TASK_SIZE,r2	;;	ld4 r3=[r3]				// r2 = current_thread_info()->flags	mov r18=ar.bsp			// save (kernel) ar.bsp (12 cyc)	mov ar.rsc=0x3			// set eager mode, pl 0, little-endian, loadrs=0	br.call.sptk.many b7=ia64_syscall_setup	;;	ssm psr.i	movl r2=ia64_ret_from_syscall	;;	mov rp=r2				// set the real return addr	tbit.z p8,p0=r3,TIF_SYSCALL_TRACE(p8)	br.call.sptk.many b6=b6			// ignore this return addr	br.cond.sptk ia64_trace_syscallEND(fsys_bubble_down)	.rodata	.align 8	.globl fsyscall_table	data8 fsys_bubble_downfsyscall_table:	data8 fsys_ni_syscall	data8 0				// exit			// 1025	data8 0				// read	data8 0				// write	data8 0				// open	data8 0				// close	data8 0				// creat		// 1030	data8 0				// link	data8 0				// unlink	data8 0				// execve	data8 0				// chdir	data8 0				// fchdir		// 1035	data8 0				// utimes	data8 0				// mknod	data8 0				// chmod	data8 0				// chown	data8 0				// lseek		// 1040	data8 fsys_getpid		// getpid	data8 fsys_getppid		// getppid	data8 0				// mount	data8 0				// umount	data8 0				// setuid		// 1045	data8 0				// getuid	data8 0				// geteuid	data8 0				// ptrace	data8 0				// access	data8 0				// sync			// 1050	data8 0				// fsync	data8 0				// fdatasync	data8 0				// kill	data8 0				// rename	data8 0				// mkdir		// 1055	data8 0				// rmdir	data8 0				// dup	data8 0				// pipe	data8 0				// times	data8 0				// brk			// 1060	data8 0				// setgid	data8 0				// getgid	data8 0				// getegid	data8 0				// acct	data8 0				// ioctl		// 1065	data8 0				// fcntl	data8 0				// umask	data8 0				// chroot	data8 0				// ustat	data8 0				// dup2			// 1070	data8 0				// setreuid	data8 0				// setregid	data8 0				// getresuid	data8 0				// setresuid	data8 0				// getresgid		// 1075	data8 0				// setresgid	data8 0				// getgroups	data8 0				// setgroups	data8 0				// getpgid	data8 0				// setpgid		// 1080	data8 0				// setsid	data8 0				// getsid	data8 0				// sethostname	data8 0				// setrlimit	data8 0				// getrlimit		// 1085	data8 0				// getrusage	data8 fsys_gettimeofday		// gettimeofday	data8 0				// settimeofday	data8 0				// select	data8 0				// poll			// 1090	data8 0				// symlink	data8 0				// readlink	data8 0				// uselib	data8 0				// swapon	data8 0				// swapoff		// 1095	data8 0				// reboot	data8 0				// truncate	data8 0				// ftruncate	data8 0				// fchmod	data8 0				// fchown		// 1100	data8 0				// getpriority	data8 0				// setpriority	data8 0				// statfs	data8 0				// fstatfs	data8 0				// gettid		// 1105	data8 0				// semget	data8 0				// semop	data8 0				// semctl	data8 0				// msgget	data8 0				// msgsnd		// 1110	data8 0				// msgrcv	data8 0				// msgctl	data8 0				// shmget	data8 0				// shmat	data8 0				// shmdt		// 1115	data8 0				// shmctl	data8 0				// syslog	data8 0				// setitimer	data8 0				// getitimer	data8 0					 		// 1120	data8 0	data8 0	data8 0				// vhangup	data8 0				// lchown	data8 0				// remap_file_pages	// 1125	data8 0				// wait4	data8 0				// sysinfo	data8 0				// clone	data8 0				// setdomainname	data8 0				// newuname		// 1130	data8 0				// adjtimex	data8 0	data8 0				// init_module	data8 0				// delete_module	data8 0							// 1135	data8 0	data8 0				// quotactl	data8 0				// bdflush	data8 0				// sysfs	data8 0				// personality		// 1140	data8 0				// afs_syscall	data8 0				// setfsuid	data8 0				// setfsgid	data8 0				// getdents	data8 0				// flock		// 1145	data8 0				// readv	data8 0				// writev	data8 0				// pread64	data8 0				// pwrite64	data8 0				// sysctl		// 1150	data8 0				// mmap	data8 0				// munmap	data8 0				// mlock	data8 0				// mlockall	data8 0				// mprotect		// 1155	data8 0				// mremap	data8 0				// msync	data8 0				// munlock	data8 0				// munlockall	data8 0				// sched_getparam	// 1160	data8 0				// sched_setparam	data8 0				// sched_getscheduler	data8 0				// sched_setscheduler	data8 0				// sched_yield	data8 0				// sched_get_priority_max	// 1165	data8 0				// sched_get_priority_min	data8 0				// sched_rr_get_interval	data8 0				// nanosleep	data8 0				// nfsservctl	data8 0				// prctl		// 1170	data8 0				// getpagesize	data8 0				// mmap2	data8 0				// pciconfig_read	data8 0				// pciconfig_write	data8 0				// perfmonctl		// 1175	data8 0				// sigaltstack	data8 0				// rt_sigaction	data8 0				// rt_sigpending	data8 fsys_rt_sigprocmask	// rt_sigprocmask	data8 0				// rt_sigqueueinfo	// 1180	data8 0				// rt_sigreturn	data8 0				// rt_sigsuspend	data8 0				// rt_sigtimedwait	data8 0				// getcwd	data8 0				// capget		// 1185	data8 0				// capset	data8 0				// sendfile	data8 0	data8 0	data8 0				// socket		// 1190	data8 0				// bind	data8 0				// connect	data8 0				// listen	data8 0				// accept	data8 0				// getsockname		// 1195	data8 0				// getpeername	data8 0				// socketpair	data8 0				// send	data8 0				// sendto	data8 0				// recv			// 1200	data8 0				// recvfrom	data8 0				// shutdown	data8 0				// setsockopt	data8 0				// getsockopt	data8 0				// sendmsg		// 1205	data8 0				// recvmsg	data8 0				// pivot_root	data8 0				// mincore	data8 0				// madvise	data8 0				// newstat		// 1210	data8 0				// newlstat	data8 0				// newfstat	data8 0				// clone2	data8 0				// getdents64	data8 0				// getunwind		// 1215	data8 0				// readahead	data8 0				// setxattr	data8 0				// lsetxattr	data8 0				// fsetxattr	data8 0				// getxattr		// 1220	data8 0				// lgetxattr	data8 0				// fgetxattr	data8 0				// listxattr	data8 0				// llistxattr	data8 0				// flistxattr		// 1225	data8 0				// removexattr	data8 0				// lremovexattr	data8 0				// fremovexattr	data8 0				// tkill	data8 0				// futex		// 1230	data8 0				// sched_setaffinity	data8 0				// sched_getaffinity	data8 fsys_set_tid_address	// set_tid_address	data8 0				// fadvise64_64	data8 0				// tgkill		// 1235	data8 0				// exit_group	data8 0				// lookup_dcookie	data8 0				// io_setup	data8 0				// io_destroy	data8 0				// io_getevents		// 1240	data8 0				// io_submit	data8 0				// io_cancel	data8 0				// epoll_create	data8 0				// epoll_ctl	data8 0				// epoll_wait		// 1245	data8 0				// restart_syscall	data8 0				// semtimedop	data8 0				// timer_create	data8 0				// timer_settime	data8 0				// timer_gettime 	// 1250	data8 0				// timer_getoverrun	data8 0				// timer_delete	data8 0				// clock_settime	data8 0				// clock_gettime	data8 0				// clock_getres		// 1255	data8 0				// clock_nanosleep	data8 0				// fstatfs64	data8 0				// statfs64	data8 0	data8 0							// 1260	data8 0	data8 0				// mq_open	data8 0				// mq_unlink	data8 0				// mq_timedsend	data8 0				// mq_timedreceive	// 1265	data8 0				// mq_notify	data8 0				// mq_getsetattr	data8 0				// kexec_load	data8 0	data8 0							// 1270	data8 0	data8 0	data8 0	data8 0	data8 0							// 1275	data8 0	data8 0	data8 0	data8 0	.org fsyscall_table + 8*NR_syscalls	// guard against failures to increase NR_syscalls

⌨️ 快捷键说明

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