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

📄 entry.s

📁 linux 内核源代码
💻 S
📖 第 1 页 / 共 3 页
字号:
(pUStk)	mov ar.bspstore=r23	// M2(pKStk)	dep r29=r22,r29,21,1	// I0 update ipsr.pp with psr.pp(pLvSys)mov r16=r0		// A  clear r16 for leave_syscall, no-op otherwise	;;	mov cr.ipsr=r29		// M2	mov ar.pfs=r26		// I0(pLvSys)mov r17=r0		// A  clear r17 for leave_syscall, no-op otherwise(p9)	mov cr.ifs=r30		// M2	mov b0=r21		// I0(pLvSys)mov r18=r0		// A  clear r18 for leave_syscall, no-op otherwise	mov ar.fpsr=r20		// M2	mov cr.iip=r28		// M2	nop 0	;;(pUStk)	mov ar.rnat=r24		// M2 must happen with RSE in lazy mode	nop 0(pLvSys)mov r2=r0	mov ar.rsc=r27		// M2	mov pr=r31,-1		// I0	rfi			// B	/*	 * On entry:	 *	r20 = &current->thread_info->pre_count (if CONFIG_PREEMPT)	 *	r31 = current->thread_info->flags	 * On exit:	 *	p6 = TRUE if work-pending-check needs to be redone	 */.work_pending_syscall:	add r2=-8,r2	add r3=-8,r3	;;	st8 [r2]=r8	st8 [r3]=r10.work_pending:	tbit.z p6,p0=r31,TIF_NEED_RESCHED		// current_thread_info()->need_resched==0?(p6)	br.cond.sptk.few .notify#ifdef CONFIG_PREEMPT(pKStk) dep r21=-1,r0,PREEMPT_ACTIVE_BIT,1	;;(pKStk) st4 [r20]=r21	ssm psr.i		// enable interrupts#endif	br.call.spnt.many rp=schedule.ret9:	cmp.eq p6,p0=r0,r0				// p6 <- 1	rsm psr.i		// disable interrupts	;;#ifdef CONFIG_PREEMPT(pKStk)	adds r20=TI_PRE_COUNT+IA64_TASK_SIZE,r13	;;(pKStk)	st4 [r20]=r0		// preempt_count() <- 0#endif(pLvSys)br.cond.sptk.few  .work_pending_syscall_end	br.cond.sptk.many .work_processed_kernel	// re-check.notify:(pUStk)	br.call.spnt.many rp=notify_resume_user.ret10:	cmp.ne p6,p0=r0,r0				// p6 <- 0(pLvSys)br.cond.sptk.few  .work_pending_syscall_end	br.cond.sptk.many .work_processed_kernel	// don't re-check.work_pending_syscall_end:	adds r2=PT(R8)+16,r12	adds r3=PT(R10)+16,r12	;;	ld8 r8=[r2]	ld8 r10=[r3]	br.cond.sptk.many .work_processed_syscall	// re-checkEND(ia64_leave_kernel)ENTRY(handle_syscall_error)	/*	 * Some system calls (e.g., ptrace, mmap) can return arbitrary values which could	 * lead us to mistake a negative return value as a failed syscall.  Those syscall	 * must deposit a non-zero value in pt_regs.r8 to indicate an error.  If	 * pt_regs.r8 is zero, we assume that the call completed successfully.	 */	PT_REGS_UNWIND_INFO(0)	ld8 r3=[r2]		// load pt_regs.r8	;;	cmp.eq p6,p7=r3,r0	// is pt_regs.r8==0?	;;(p7)	mov r10=-1(p7)	sub r8=0,r8		// negate return value to get errno	br.cond.sptk ia64_leave_syscallEND(handle_syscall_error)	/*	 * Invoke schedule_tail(task) while preserving in0-in7, which may be needed	 * in case a system call gets restarted.	 */GLOBAL_ENTRY(ia64_invoke_schedule_tail)	.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)	alloc loc1=ar.pfs,8,2,1,0	mov loc0=rp	mov out0=r8				// Address of previous task	;;	br.call.sptk.many rp=schedule_tail.ret11:	mov ar.pfs=loc1	mov rp=loc0	br.ret.sptk.many rpEND(ia64_invoke_schedule_tail)	/*	 * Setup stack and call do_notify_resume_user().  Note that pSys and pNonSys need to	 * be set up by the caller.  We declare 8 input registers so the system call	 * args get preserved, in case we need to restart a system call.	 */ENTRY(notify_resume_user)	.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)	alloc loc1=ar.pfs,8,2,3,0 // preserve all eight input regs in case of syscall restart!	mov r9=ar.unat	mov loc0=rp				// save return address	mov out0=0				// there is no "oldset"	adds out1=8,sp				// out1=&sigscratch->ar_pfs(pSys)	mov out2=1				// out2==1 => we're in a syscall	;;(pNonSys) mov out2=0				// out2==0 => not a syscall	.fframe 16	.spillsp ar.unat, 16	st8 [sp]=r9,-16				// allocate space for ar.unat and save it	st8 [out1]=loc1,-8			// save ar.pfs, out1=&sigscratch	.body	br.call.sptk.many rp=do_notify_resume_user.ret15:	.restore sp	adds sp=16,sp				// pop scratch stack space	;;	ld8 r9=[sp]				// load new unat from sigscratch->scratch_unat	mov rp=loc0	;;	mov ar.unat=r9	mov ar.pfs=loc1	br.ret.sptk.many rpEND(notify_resume_user)ENTRY(sys_rt_sigreturn)	PT_REGS_UNWIND_INFO(0)	/*	 * Allocate 8 input registers since ptrace() may clobber them	 */	alloc r2=ar.pfs,8,0,1,0	.prologue	PT_REGS_SAVES(16)	adds sp=-16,sp	.body	cmp.eq pNonSys,pSys=r0,r0		// sigreturn isn't a normal syscall...	;;	/*	 * leave_kernel() restores f6-f11 from pt_regs, but since the streamlined	 * syscall-entry path does not save them we save them here instead.  Note: we	 * don't need to save any other registers that are not saved by the stream-lined	 * syscall path, because restore_sigcontext() restores them.	 */	adds r16=PT(F6)+32,sp	adds r17=PT(F7)+32,sp	;; 	stf.spill [r16]=f6,32 	stf.spill [r17]=f7,32	;; 	stf.spill [r16]=f8,32 	stf.spill [r17]=f9,32	;; 	stf.spill [r16]=f10 	stf.spill [r17]=f11	adds out0=16,sp				// out0 = &sigscratch	br.call.sptk.many rp=ia64_rt_sigreturn.ret19:	.restore sp,0	adds sp=16,sp	;;	ld8 r9=[sp]				// load new ar.unat	mov.sptk b7=r8,ia64_leave_kernel	;;	mov ar.unat=r9	br.many b7END(sys_rt_sigreturn)GLOBAL_ENTRY(ia64_prepare_handle_unaligned)	.prologue	/*	 * r16 = fake ar.pfs, we simply need to make sure privilege is still 0	 */	mov r16=r0	DO_SAVE_SWITCH_STACK	br.call.sptk.many rp=ia64_handle_unaligned	// stack frame setup in ivt.ret21:	.body	DO_LOAD_SWITCH_STACK	br.cond.sptk.many rp				// goes to ia64_leave_kernelEND(ia64_prepare_handle_unaligned)	//	// unw_init_running(void (*callback)(info, arg), void *arg)	//#	define EXTRA_FRAME_SIZE	((UNW_FRAME_INFO_SIZE+15)&~15)GLOBAL_ENTRY(unw_init_running)	.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(2)	alloc loc1=ar.pfs,2,3,3,0	;;	ld8 loc2=[in0],8	mov loc0=rp	mov r16=loc1	DO_SAVE_SWITCH_STACK	.body	.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(2)	.fframe IA64_SWITCH_STACK_SIZE+EXTRA_FRAME_SIZE	SWITCH_STACK_SAVES(EXTRA_FRAME_SIZE)	adds sp=-EXTRA_FRAME_SIZE,sp	.body	;;	adds out0=16,sp				// &info	mov out1=r13				// current	adds out2=16+EXTRA_FRAME_SIZE,sp	// &switch_stack	br.call.sptk.many rp=unw_init_frame_info1:	adds out0=16,sp				// &info	mov b6=loc2	mov loc2=gp				// save gp across indirect function call	;;	ld8 gp=[in0]	mov out1=in1				// arg	br.call.sptk.many rp=b6			// invoke the callback function1:	mov gp=loc2				// restore gp	// For now, we don't allow changing registers from within	// unw_init_running; if we ever want to allow that, we'd	// have to do a load_switch_stack here:	.restore sp	adds sp=IA64_SWITCH_STACK_SIZE+EXTRA_FRAME_SIZE,sp	mov ar.pfs=loc1	mov rp=loc0	br.ret.sptk.many rpEND(unw_init_running)	.rodata	.align 8	.globl sys_call_tablesys_call_table:	data8 sys_ni_syscall		//  This must be sys_ni_syscall!  See ivt.S.	data8 sys_exit				// 1025	data8 sys_read	data8 sys_write	data8 sys_open	data8 sys_close	data8 sys_creat				// 1030	data8 sys_link	data8 sys_unlink	data8 ia64_execve	data8 sys_chdir	data8 sys_fchdir			// 1035	data8 sys_utimes	data8 sys_mknod	data8 sys_chmod	data8 sys_chown	data8 sys_lseek				// 1040	data8 sys_getpid	data8 sys_getppid	data8 sys_mount	data8 sys_umount	data8 sys_setuid			// 1045	data8 sys_getuid	data8 sys_geteuid	data8 sys_ptrace	data8 sys_access	data8 sys_sync				// 1050	data8 sys_fsync	data8 sys_fdatasync	data8 sys_kill	data8 sys_rename	data8 sys_mkdir				// 1055	data8 sys_rmdir	data8 sys_dup	data8 sys_pipe	data8 sys_times	data8 ia64_brk				// 1060	data8 sys_setgid	data8 sys_getgid	data8 sys_getegid	data8 sys_acct	data8 sys_ioctl				// 1065	data8 sys_fcntl	data8 sys_umask	data8 sys_chroot	data8 sys_ustat	data8 sys_dup2				// 1070	data8 sys_setreuid	data8 sys_setregid	data8 sys_getresuid	data8 sys_setresuid	data8 sys_getresgid			// 1075	data8 sys_setresgid	data8 sys_getgroups	data8 sys_setgroups	data8 sys_getpgid	data8 sys_setpgid			// 1080	data8 sys_setsid	data8 sys_getsid	data8 sys_sethostname	data8 sys_setrlimit	data8 sys_getrlimit			// 1085	data8 sys_getrusage	data8 sys_gettimeofday	data8 sys_settimeofday	data8 sys_select	data8 sys_poll				// 1090	data8 sys_symlink	data8 sys_readlink	data8 sys_uselib	data8 sys_swapon	data8 sys_swapoff			// 1095	data8 sys_reboot	data8 sys_truncate	data8 sys_ftruncate	data8 sys_fchmod	data8 sys_fchown			// 1100	data8 ia64_getpriority	data8 sys_setpriority	data8 sys_statfs	data8 sys_fstatfs	data8 sys_gettid			// 1105	data8 sys_semget	data8 sys_semop	data8 sys_semctl	data8 sys_msgget	data8 sys_msgsnd			// 1110	data8 sys_msgrcv	data8 sys_msgctl	data8 sys_shmget	data8 sys_shmat	data8 sys_shmdt				// 1115	data8 sys_shmctl	data8 sys_syslog	data8 sys_setitimer	data8 sys_getitimer	data8 sys_ni_syscall			// 1120		/* was: ia64_oldstat */	data8 sys_ni_syscall					/* was: ia64_oldlstat */	data8 sys_ni_syscall					/* was: ia64_oldfstat */	data8 sys_vhangup	data8 sys_lchown	data8 sys_remap_file_pages		// 1125	data8 sys_wait4	data8 sys_sysinfo	data8 sys_clone	data8 sys_setdomainname	data8 sys_newuname			// 1130	data8 sys_adjtimex	data8 sys_ni_syscall					/* was: ia64_create_module */	data8 sys_init_module	data8 sys_delete_module	data8 sys_ni_syscall			// 1135		/* was: sys_get_kernel_syms */	data8 sys_ni_syscall					/* was: sys_query_module */	data8 sys_quotactl	data8 sys_bdflush	data8 sys_sysfs	data8 sys_personality			// 1140	data8 sys_ni_syscall		// sys_afs_syscall	data8 sys_setfsuid	data8 sys_setfsgid	data8 sys_getdents	data8 sys_flock				// 1145	data8 sys_readv	data8 sys_writev	data8 sys_pread64	data8 sys_pwrite64	data8 sys_sysctl			// 1150	data8 sys_mmap	data8 sys_munmap	data8 sys_mlock	data8 sys_mlockall	data8 sys_mprotect			// 1155	data8 ia64_mremap	data8 sys_msync	data8 sys_munlock	data8 sys_munlockall	data8 sys_sched_getparam		// 1160	data8 sys_sched_setparam	data8 sys_sched_getscheduler	data8 sys_sched_setscheduler	data8 sys_sched_yield	data8 sys_sched_get_priority_max	// 1165	data8 sys_sched_get_priority_min	data8 sys_sched_rr_get_interval	data8 sys_nanosleep	data8 sys_nfsservctl	data8 sys_prctl				// 1170	data8 sys_getpagesize	data8 sys_mmap2	data8 sys_pciconfig_read	data8 sys_pciconfig_write	data8 sys_perfmonctl			// 1175	data8 sys_sigaltstack	data8 sys_rt_sigaction	data8 sys_rt_sigpending	data8 sys_rt_sigprocmask	data8 sys_rt_sigqueueinfo		// 1180	data8 sys_rt_sigreturn	data8 sys_rt_sigsuspend	data8 sys_rt_sigtimedwait	data8 sys_getcwd	data8 sys_capget			// 1185	data8 sys_capset	data8 sys_sendfile64	data8 sys_ni_syscall		// sys_getpmsg (STREAMS)	data8 sys_ni_syscall		// sys_putpmsg (STREAMS)	data8 sys_socket			// 1190	data8 sys_bind	data8 sys_connect	data8 sys_listen	data8 sys_accept	data8 sys_getsockname			// 1195	data8 sys_getpeername	data8 sys_socketpair	data8 sys_send	data8 sys_sendto	data8 sys_recv				// 1200	data8 sys_recvfrom	data8 sys_shutdown	data8 sys_setsockopt	data8 sys_getsockopt	data8 sys_sendmsg			// 1205	data8 sys_recvmsg	data8 sys_pivot_root	data8 sys_mincore	data8 sys_madvise	data8 sys_newstat			// 1210	data8 sys_newlstat	data8 sys_newfstat	data8 sys_clone2	data8 sys_getdents64	data8 sys_getunwind			// 1215	data8 sys_readahead	data8 sys_setxattr	data8 sys_lsetxattr	data8 sys_fsetxattr	data8 sys_getxattr			// 1220	data8 sys_lgetxattr	data8 sys_fgetxattr	data8 sys_listxattr	data8 sys_llistxattr	data8 sys_flistxattr			// 1225	data8 sys_removexattr	data8 sys_lremovexattr	data8 sys_fremovexattr	data8 sys_tkill	data8 sys_futex				// 1230	data8 sys_sched_setaffinity	data8 sys_sched_getaffinity	data8 sys_set_tid_address	data8 sys_fadvise64_64	data8 sys_tgkill 			// 1235	data8 sys_exit_group	data8 sys_lookup_dcookie	data8 sys_io_setup	data8 sys_io_destroy	data8 sys_io_getevents			// 1240	data8 sys_io_submit	data8 sys_io_cancel	data8 sys_epoll_create	data8 sys_epoll_ctl	data8 sys_epoll_wait			// 1245	data8 sys_restart_syscall	data8 sys_semtimedop	data8 sys_timer_create	data8 sys_timer_settime	data8 sys_timer_gettime			// 1250	data8 sys_timer_getoverrun	data8 sys_timer_delete	data8 sys_clock_settime	data8 sys_clock_gettime	data8 sys_clock_getres			// 1255	data8 sys_clock_nanosleep	data8 sys_fstatfs64	data8 sys_statfs64	data8 sys_mbind	data8 sys_get_mempolicy			// 1260	data8 sys_set_mempolicy	data8 sys_mq_open	data8 sys_mq_unlink	data8 sys_mq_timedsend	data8 sys_mq_timedreceive		// 1265	data8 sys_mq_notify	data8 sys_mq_getsetattr	data8 sys_kexec_load	data8 sys_ni_syscall			// reserved for vserver	data8 sys_waitid			// 1270	data8 sys_add_key	data8 sys_request_key	data8 sys_keyctl	data8 sys_ioprio_set	data8 sys_ioprio_get			// 1275	data8 sys_move_pages	data8 sys_inotify_init	data8 sys_inotify_add_watch	data8 sys_inotify_rm_watch	data8 sys_migrate_pages			// 1280	data8 sys_openat	data8 sys_mkdirat	data8 sys_mknodat	data8 sys_fchownat	data8 sys_futimesat			// 1285	data8 sys_newfstatat	data8 sys_unlinkat	data8 sys_renameat	data8 sys_linkat	data8 sys_symlinkat			// 1290	data8 sys_readlinkat	data8 sys_fchmodat	data8 sys_faccessat	data8 sys_pselect6	data8 sys_ppoll	data8 sys_unshare	data8 sys_splice	data8 sys_set_robust_list	data8 sys_get_robust_list	data8 sys_sync_file_range		// 1300	data8 sys_tee	data8 sys_vmsplice	data8 sys_fallocate	data8 sys_getcpu	data8 sys_epoll_pwait			// 1305	data8 sys_utimensat	data8 sys_signalfd	data8 sys_timerfd	data8 sys_eventfd	.org sys_call_table + 8*NR_syscalls	// guard against failures to increase NR_syscalls

⌨️ 快捷键说明

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