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

📄 fsys.s

📁 底层驱动开发
💻 S
📖 第 1 页 / 共 2 页
字号:
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 r8=[r9],r18,ar.ccv		// current->thread_info->flags <- r18	;;	cmp.ne p6,p0=r17,r8			// 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	 *	 * We used to clear some PSR bits here but that requires slow	 * serialization.  Fortuntely, that isn't really necessary.	 * The rationale is as follows: we used to clear bits	 * ~PSR_PRESERVED_BITS in PSR.L.  Since	 * PSR_PRESERVED_BITS==PSR.{UP,MFL,MFH,PK,DT,PP,SP,RT,IC}, we	 * ended up clearing PSR.{BE,AC,I,DFL,DFH,DI,DB,SI,TB}.	 * However,	 *	 * PSR.BE : already is turned off in __kernel_syscall_via_epc()	 * PSR.AC : don't care (kernel normally turns PSR.AC on)	 * PSR.I  : already turned off by the time fsys_bubble_down gets	 *	    invoked	 * PSR.DFL: always 0 (kernel never turns it on)	 * PSR.DFH: don't care --- kernel never touches f32-f127 on its own	 *	    initiative	 * PSR.DI : always 0 (kernel never turns it on)	 * PSR.SI : always 0 (kernel never turns it on)	 * PSR.DB : don't care --- kernel never enables kernel-level	 *	    breakpoints	 * PSR.TB : must be 0 already; if it wasn't zero on entry to	 *          __kernel_syscall_via_epc, the branch to fsys_bubble_down	 *          will trigger a taken branch; the taken-trap-handler then	 *          converts the syscall into a break-based system-call.	 */	/*	 * 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					// M0|1	movl r14=ia64_ret_from_syscall		// X	nop.m 0	movl r28=__kernel_syscall_via_break	// X	create cr.iip	;;	mov r2=r16				// A    get task addr to addl-addressable register	adds r16=IA64_TASK_THREAD_ON_USTACK_OFFSET,r16 // A	mov r31=pr				// I0   save pr (2 cyc)	;;	st1 [r16]=r0				// M2|3 clear current->thread.on_ustack flag	addl r22=IA64_RBS_OFFSET,r2		// A    compute base of RBS	add r3=TI_FLAGS+IA64_TASK_SIZE,r2	// A	;;	ld4 r3=[r3]				// M0|1 r3 = current_thread_info()->flags	lfetch.fault.excl.nt1 [r22]		// M0|1 prefetch register backing-store	nop.i 0	;;	mov ar.rsc=0				// M2   set enforced lazy mode, pl 0, LE, loadrs=0	nop.m 0	nop.i 0	;;	mov r23=ar.bspstore			// M2 (12 cyc) save ar.bspstore	mov.m r24=ar.rnat			// M2 (5 cyc) read ar.rnat (dual-issues!)	nop.i 0	;;	mov ar.bspstore=r22			// M2 (6 cyc) switch to kernel RBS	movl r8=PSR_ONE_BITS			// X	;;	mov r25=ar.unat				// M2 (5 cyc) save ar.unat	mov r19=b6				// I0   save b6 (2 cyc)	mov r20=r1				// A    save caller's gp in r20	;;	or r29=r8,r29				// A    construct cr.ipsr value to save	mov b6=r18				// I0   copy syscall entry-point to b6 (7 cyc)	addl r1=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r2 // A compute base of memory stack	mov r18=ar.bsp				// M2   save (kernel) ar.bsp (12 cyc)	cmp.ne pKStk,pUStk=r0,r0		// A    set pKStk <- 0, pUStk <- 1	br.call.sptk.many b7=ia64_syscall_setup	// B	;;	mov ar.rsc=0x3				// M2   set eager mode, pl 0, LE, loadrs=0	mov rp=r14				// I0   set the real return addr	and r3=_TIF_SYSCALL_TRACEAUDIT,r3	// A	;;	ssm psr.i				// M2   we're on kernel stacks now, reenable irqs	cmp.eq p8,p0=r3,r0			// A(p10)	br.cond.spnt.many ia64_ret_from_syscall	// B    return if bad call-frame or r15 is a NaT	nop.m 0(p8)	br.call.sptk.many b6=b6			// B    (ignore return address)	br.cond.spnt ia64_trace_syscall		// BEND(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 fsys_clock_gettime	// 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 + -