entry.s

来自「Linux Kernel 2.6.9 for OMAP1710」· S 代码 · 共 906 行 · 第 1/2 页

S
906
字号
	testl $0x4, %eax		# EM (math emulation bit)	jne device_not_available_emulate	preempt_stop	call math_state_restore	jmp ret_from_exceptiondevice_not_available_emulate:	pushl $0			# temporary storage for ORIG_EIP	call math_emulate	addl $4, %esp	jmp ret_from_exception/* * Debug traps and NMI can happen at the one SYSENTER instruction * that sets up the real kernel stack. Check here, since we can't * allow the wrong stack to be used. * * "TSS_sysenter_esp0+12" is because the NMI/debug handler will have * already pushed 3 words if it hits on the sysenter instruction: * eflags, cs and eip. * * We just load the right stack, and push the three (known) values * by hand onto the new stack - while updating the return eip past * the instruction that would have done it for sysenter. */#define FIX_STACK(offset, ok, label)		\	cmpw $__KERNEL_CS,4(%esp);		\	jne ok;					\label:						\	movl TSS_sysenter_esp0+offset(%esp),%esp;	\	pushfl;					\	pushl $__KERNEL_CS;			\	pushl $sysenter_past_espENTRY(debug)	cmpl $sysenter_entry,(%esp)	jne debug_stack_correct	FIX_STACK(12, debug_stack_correct, debug_esp_fix_insn)debug_stack_correct:	pushl $-1			# mark this as an int	SAVE_ALL	movl %esp,%edx  	pushl $0	pushl %edx	call do_debug	addl $8,%esp	testl %eax,%eax	jnz restore_all	jmp ret_from_exception/* * NMI is doubly nasty. It can happen _while_ we're handling * a debug fault, and the debug fault hasn't yet been able to * clear up the stack. So we first check whether we got  an * NMI on the sysenter entry path, but after that we need to * check whether we got an NMI on the debug path where the debug * fault happened on the sysenter path. */ENTRY(nmi)	cmpl $sysenter_entry,(%esp)	je nmi_stack_fixup	pushl %eax	movl %esp,%eax	/* Do not access memory above the end of our stack page,	 * it might not exist.	 */	andl $(THREAD_SIZE-1),%eax	cmpl $(THREAD_SIZE-20),%eax	popl %eax	jae nmi_stack_correct	cmpl $sysenter_entry,12(%esp)	je nmi_debug_stack_checknmi_stack_correct:	pushl %eax	SAVE_ALL	movl %esp, %edx	pushl $0	pushl %edx	call do_nmi	addl $8, %esp	RESTORE_ALLnmi_stack_fixup:	FIX_STACK(12,nmi_stack_correct, 1)	jmp nmi_stack_correctnmi_debug_stack_check:	cmpw $__KERNEL_CS,16(%esp)	jne nmi_stack_correct	cmpl $debug - 1,(%esp)	jle nmi_stack_correct	cmpl $debug_esp_fix_insn,(%esp)	jle nmi_debug_stack_fixupnmi_debug_stack_fixup:	FIX_STACK(24,nmi_stack_correct, 1)	jmp nmi_stack_correctENTRY(int3)	pushl $-1			# mark this as an int	SAVE_ALL	movl %esp,%edx	pushl $0	pushl %edx	call do_int3	addl $8,%esp	testl %eax,%eax	jnz restore_all	jmp ret_from_exceptionENTRY(overflow)	pushl $0	pushl $do_overflow	jmp error_codeENTRY(bounds)	pushl $0	pushl $do_bounds	jmp error_codeENTRY(invalid_op)	pushl $0	pushl $do_invalid_op	jmp error_codeENTRY(coprocessor_segment_overrun)	pushl $0	pushl $do_coprocessor_segment_overrun	jmp error_codeENTRY(invalid_TSS)	pushl $do_invalid_TSS	jmp error_codeENTRY(segment_not_present)	pushl $do_segment_not_present	jmp error_codeENTRY(stack_segment)	pushl $do_stack_segment	jmp error_codeENTRY(general_protection)	pushl $do_general_protection	jmp error_codeENTRY(alignment_check)	pushl $do_alignment_check	jmp error_codeENTRY(page_fault)	pushl $do_page_fault	jmp error_code#ifdef CONFIG_X86_MCEENTRY(machine_check)	pushl $0	pushl machine_check_vector	jmp error_code#endifENTRY(spurious_interrupt_bug)	pushl $0	pushl $do_spurious_interrupt_bug	jmp error_code.dataENTRY(sys_call_table)	.long sys_restart_syscall	/* 0 - old "setup()" system call, used for restarting */	.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_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 old_select	.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_ioperm	.long sys_socketcall	.long sys_syslog	.long sys_setitimer	.long sys_getitimer	/* 105 */	.long sys_newstat	.long sys_newlstat	.long sys_newfstat	.long sys_uname	.long sys_iopl		/* 110 */	.long sys_vhangup	.long sys_ni_syscall	/* old "idle" system call */	.long sys_vm86old	.long sys_wait4	.long sys_swapoff	/* 115 */	.long sys_sysinfo	.long sys_ipc	.long sys_fsync	.long sys_sigreturn	.long sys_clone		/* 120 */	.long sys_setdomainname	.long sys_newuname	.long sys_modify_ldt	.long sys_adjtimex	.long sys_mprotect	/* 125 */	.long sys_sigprocmask	.long sys_ni_syscall	/* old "create_module" */ 	.long sys_init_module	.long sys_delete_module	.long sys_ni_syscall	/* 130:	old "get_kernel_syms" */	.long sys_quotactl	.long sys_getpgid	.long sys_fchdir	.long sys_bdflush	.long sys_sysfs		/* 135 */	.long sys_personality	.long sys_ni_syscall	/* reserved 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_vm86	.long sys_ni_syscall	/* Old 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_pread64	/* 180 */	.long sys_pwrite64	.long sys_chown16	.long sys_getcwd	.long sys_capget	.long sys_capset	/* 185 */	.long sys_sigaltstack	.long sys_sendfile	.long sys_ni_syscall	/* reserved for streams1 */	.long sys_ni_syscall	/* reserved for 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_getdents64	/* 220 */	.long sys_fcntl64	.long sys_ni_syscall	/* reserved for TUX */	.long sys_ni_syscall	.long sys_gettid	.long sys_readahead	/* 225 */	.long sys_setxattr	.long sys_lsetxattr	.long sys_fsetxattr	.long sys_getxattr	.long sys_lgetxattr	/* 230 */	.long sys_fgetxattr	.long sys_listxattr	.long sys_llistxattr	.long sys_flistxattr	.long sys_removexattr	/* 235 */	.long sys_lremovexattr	.long sys_fremovexattr	.long sys_tkill	.long sys_sendfile64	.long sys_futex		/* 240 */	.long sys_sched_setaffinity	.long sys_sched_getaffinity	.long sys_set_thread_area	.long sys_get_thread_area	.long sys_io_setup	/* 245 */	.long sys_io_destroy	.long sys_io_getevents	.long sys_io_submit	.long sys_io_cancel	.long sys_fadvise64	/* 250 */	.long sys_ni_syscall	.long sys_exit_group	.long sys_lookup_dcookie	.long sys_epoll_create	.long sys_epoll_ctl	/* 255 */	.long sys_epoll_wait 	.long sys_remap_file_pages 	.long sys_set_tid_address 	.long sys_timer_create 	.long sys_timer_settime		/* 260 */ 	.long sys_timer_gettime 	.long sys_timer_getoverrun 	.long sys_timer_delete 	.long sys_clock_settime 	.long sys_clock_gettime		/* 265 */ 	.long sys_clock_getres 	.long sys_clock_nanosleep	.long sys_statfs64	.long sys_fstatfs64		.long sys_tgkill	/* 270 */	.long sys_utimes 	.long sys_fadvise64_64	.long sys_ni_syscall	/* sys_vserver */	.long sys_mbind	.long sys_get_mempolicy	.long sys_set_mempolicy	.long sys_mq_open	.long sys_mq_unlink	.long sys_mq_timedsend	.long sys_mq_timedreceive	/* 280 */	.long sys_mq_notify	.long sys_mq_getsetattr	.long sys_ni_syscall		/* reserved for kexec */	.long sys_waitidsyscall_table_size=(.-sys_call_table)

⌨️ 快捷键说明

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