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

📄 ia32entry.s

📁 linux 内核源代码
💻 S
📖 第 1 页 / 共 2 页
字号:
/* * Compatibility mode system call entry point for x86-64.  * 		 * Copyright 2000-2002 Andi Kleen, SuSE Labs. */		 #include <asm/dwarf2.h>#include <asm/calling.h>#include <asm/asm-offsets.h>#include <asm/current.h>#include <asm/errno.h>#include <asm/ia32_unistd.h>	#include <asm/thread_info.h>	#include <asm/segment.h>#include <asm/vsyscall32.h>#include <asm/irqflags.h>#include <linux/linkage.h>#define IA32_NR_syscalls ((ia32_syscall_end - ia32_sys_call_table)/8)	.macro IA32_ARG_FIXUP noebp=0	movl	%edi,%r8d	.if \noebp	.else	movl	%ebp,%r9d	.endif	xchg	%ecx,%esi	movl	%ebx,%edi	movl	%edx,%edx	/* zero extension */	.endm 	/* clobbers %eax */		.macro  CLEAR_RREGS	xorl 	%eax,%eax	movq	%rax,R11(%rsp)	movq	%rax,R10(%rsp)	movq	%rax,R9(%rsp)	movq	%rax,R8(%rsp)	.endm	.macro LOAD_ARGS32 offset	movl \offset(%rsp),%r11d	movl \offset+8(%rsp),%r10d	movl \offset+16(%rsp),%r9d	movl \offset+24(%rsp),%r8d	movl \offset+40(%rsp),%ecx	movl \offset+48(%rsp),%edx	movl \offset+56(%rsp),%esi	movl \offset+64(%rsp),%edi	movl \offset+72(%rsp),%eax	.endm		.macro CFI_STARTPROC32 simple	CFI_STARTPROC	\simple	CFI_UNDEFINED	r8	CFI_UNDEFINED	r9	CFI_UNDEFINED	r10	CFI_UNDEFINED	r11	CFI_UNDEFINED	r12	CFI_UNDEFINED	r13	CFI_UNDEFINED	r14	CFI_UNDEFINED	r15	.endm/* * 32bit SYSENTER instruction entry. * * Arguments: * %eax	System call number. * %ebx Arg1 * %ecx Arg2 * %edx Arg3 * %esi Arg4 * %edi Arg5 * %ebp user stack * 0(%ebp) Arg6	 * 	 * Interrupts off. *	 * This is purely a fast path. For anything complicated we use the int 0x80 * path below.	Set up a complete hardware stack frame to share code * with the int 0x80 path. */ 	ENTRY(ia32_sysenter_target)	CFI_STARTPROC32	simple	CFI_SIGNAL_FRAME	CFI_DEF_CFA	rsp,0	CFI_REGISTER	rsp,rbp	swapgs	movq	%gs:pda_kernelstack, %rsp	addq	$(PDA_STACKOFFSET),%rsp		/*	 * No need to follow this irqs on/off section: the syscall	 * disabled irqs, here we enable it straight after entry:	 */	sti	 	movl	%ebp,%ebp		/* zero extension */	pushq	$__USER32_DS	CFI_ADJUST_CFA_OFFSET 8	/*CFI_REL_OFFSET ss,0*/	pushq	%rbp	CFI_ADJUST_CFA_OFFSET 8	CFI_REL_OFFSET rsp,0	pushfq	CFI_ADJUST_CFA_OFFSET 8	/*CFI_REL_OFFSET rflags,0*/	movl	$VSYSCALL32_SYSEXIT, %r10d	CFI_REGISTER rip,r10	pushq	$__USER32_CS	CFI_ADJUST_CFA_OFFSET 8	/*CFI_REL_OFFSET cs,0*/	movl	%eax, %eax	pushq	%r10	CFI_ADJUST_CFA_OFFSET 8	CFI_REL_OFFSET rip,0	pushq	%rax	CFI_ADJUST_CFA_OFFSET 8	cld	SAVE_ARGS 0,0,1 	/* no need to do an access_ok check here because rbp has been 	   32bit zero extended */ 1:	movl	(%rbp),%r9d 	.section __ex_table,"a" 	.quad 1b,ia32_badarg 	.previous		GET_THREAD_INFO(%r10)	orl    $TS_COMPAT,threadinfo_status(%r10)	testl  $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP),threadinfo_flags(%r10)	CFI_REMEMBER_STATE	jnz  sysenter_tracesyssysenter_do_call:		cmpl	$(IA32_NR_syscalls-1),%eax	ja	ia32_badsys	IA32_ARG_FIXUP 1	call	*ia32_sys_call_table(,%rax,8)	movq	%rax,RAX-ARGOFFSET(%rsp)	GET_THREAD_INFO(%r10)	cli	TRACE_IRQS_OFF	testl	$_TIF_ALLWORK_MASK,threadinfo_flags(%r10)	jnz	int_ret_from_sys_call	andl    $~TS_COMPAT,threadinfo_status(%r10)	/* clear IF, that popfq doesn't enable interrupts early */	andl  $~0x200,EFLAGS-R11(%rsp) 	RESTORE_ARGS 1,24,1,1,1,1	popfq	CFI_ADJUST_CFA_OFFSET -8	/*CFI_RESTORE rflags*/	popq	%rcx				/* User %esp */	CFI_ADJUST_CFA_OFFSET -8	CFI_REGISTER rsp,rcx	movl	$VSYSCALL32_SYSEXIT,%edx	/* User %eip */	CFI_REGISTER rip,rdx	TRACE_IRQS_ON	swapgs	sti		/* sti only takes effect after the next instruction */	/* sysexit */	.byte	0xf, 0x35sysenter_tracesys:	CFI_RESTORE_STATE	xchgl	%r9d,%ebp	SAVE_REST	CLEAR_RREGS	movq	%r9,R9(%rsp)	movq	$-ENOSYS,RAX(%rsp)	/* really needed? */	movq	%rsp,%rdi        /* &pt_regs -> arg1 */	call	syscall_trace_enter	LOAD_ARGS32 ARGOFFSET  /* reload args from stack in case ptrace changed it */	RESTORE_REST	xchgl	%ebp,%r9d	jmp	sysenter_do_call	CFI_ENDPROCENDPROC(ia32_sysenter_target)/* * 32bit SYSCALL instruction entry. * * Arguments: * %eax	System call number. * %ebx Arg1 * %ecx return EIP  * %edx Arg3 * %esi Arg4 * %edi Arg5 * %ebp Arg2    [note: not saved in the stack frame, should not be touched] * %esp user stack  * 0(%esp) Arg6 * 	 * Interrupts off. *	 * This is purely a fast path. For anything complicated we use the int 0x80 * path below.	Set up a complete hardware stack frame to share code * with the int 0x80 path.	 */ 	ENTRY(ia32_cstar_target)	CFI_STARTPROC32	simple	CFI_SIGNAL_FRAME	CFI_DEF_CFA	rsp,PDA_STACKOFFSET	CFI_REGISTER	rip,rcx	/*CFI_REGISTER	rflags,r11*/	swapgs	movl	%esp,%r8d	CFI_REGISTER	rsp,r8	movq	%gs:pda_kernelstack,%rsp	/*	 * No need to follow this irqs on/off section: the syscall	 * disabled irqs and here we enable it straight after entry:	 */	sti	SAVE_ARGS 8,1,1	movl 	%eax,%eax	/* zero extension */	movq	%rax,ORIG_RAX-ARGOFFSET(%rsp)	movq	%rcx,RIP-ARGOFFSET(%rsp)	CFI_REL_OFFSET rip,RIP-ARGOFFSET	movq	%rbp,RCX-ARGOFFSET(%rsp) /* this lies slightly to ptrace */	movl	%ebp,%ecx	movq	$__USER32_CS,CS-ARGOFFSET(%rsp)	movq	$__USER32_DS,SS-ARGOFFSET(%rsp)	movq	%r11,EFLAGS-ARGOFFSET(%rsp)	/*CFI_REL_OFFSET rflags,EFLAGS-ARGOFFSET*/	movq	%r8,RSP-ARGOFFSET(%rsp)		CFI_REL_OFFSET rsp,RSP-ARGOFFSET	/* no need to do an access_ok check here because r8 has been	   32bit zero extended */ 	/* hardware stack frame is complete now */	1:	movl	(%r8),%r9d	.section __ex_table,"a"	.quad 1b,ia32_badarg	.previous		GET_THREAD_INFO(%r10)	orl   $TS_COMPAT,threadinfo_status(%r10)	testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP),threadinfo_flags(%r10)	CFI_REMEMBER_STATE	jnz   cstar_tracesyscstar_do_call:		cmpl $IA32_NR_syscalls-1,%eax	ja  ia32_badsys	IA32_ARG_FIXUP 1	call *ia32_sys_call_table(,%rax,8)	movq %rax,RAX-ARGOFFSET(%rsp)	GET_THREAD_INFO(%r10)	cli	TRACE_IRQS_OFF	testl $_TIF_ALLWORK_MASK,threadinfo_flags(%r10)	jnz  int_ret_from_sys_call	andl $~TS_COMPAT,threadinfo_status(%r10)	RESTORE_ARGS 1,-ARG_SKIP,1,1,1	movl RIP-ARGOFFSET(%rsp),%ecx	CFI_REGISTER rip,rcx	movl EFLAGS-ARGOFFSET(%rsp),%r11d		/*CFI_REGISTER rflags,r11*/	TRACE_IRQS_ON	movl RSP-ARGOFFSET(%rsp),%esp	CFI_RESTORE rsp	swapgs	sysretl	cstar_tracesys:		CFI_RESTORE_STATE	xchgl %r9d,%ebp	SAVE_REST	CLEAR_RREGS	movq %r9,R9(%rsp)	movq $-ENOSYS,RAX(%rsp)	/* really needed? */	movq %rsp,%rdi        /* &pt_regs -> arg1 */	call syscall_trace_enter	LOAD_ARGS32 ARGOFFSET  /* reload args from stack in case ptrace changed it */	RESTORE_REST	xchgl %ebp,%r9d	movl RSP-ARGOFFSET(%rsp), %r8d	jmp cstar_do_callEND(ia32_cstar_target)				ia32_badarg:	movq $-EFAULT,%rax	jmp ia32_sysret	CFI_ENDPROC/*  * Emulated IA32 system calls via int 0x80.  * * Arguments:	  * %eax	System call number. * %ebx Arg1 * %ecx Arg2 * %edx Arg3 * %esi Arg4 * %edi Arg5 * %ebp Arg6    [note: not saved in the stack frame, should not be touched] * * Notes: * Uses the same stack frame as the x86-64 version.	 * All registers except %eax must be saved (but ptrace may violate that) * Arguments are zero extended. For system calls that want sign extension and * take long arguments a wrapper is needed. Most calls can just be called * directly. * Assumes it is only called from user space and entered with interrupts off.	 */ 				ENTRY(ia32_syscall)	CFI_STARTPROC32	simple	CFI_SIGNAL_FRAME	CFI_DEF_CFA	rsp,SS+8-RIP	/*CFI_REL_OFFSET	ss,SS-RIP*/	CFI_REL_OFFSET	rsp,RSP-RIP	/*CFI_REL_OFFSET	rflags,EFLAGS-RIP*/	/*CFI_REL_OFFSET	cs,CS-RIP*/	CFI_REL_OFFSET	rip,RIP-RIP	swapgs	/*	 * No need to follow this irqs on/off section: the syscall	 * disabled irqs and here we enable it straight after entry:	 */	sti	movl %eax,%eax	pushq %rax	CFI_ADJUST_CFA_OFFSET 8	cld	/* note the registers are not zero extended to the sf.	   this could be a problem. */	SAVE_ARGS 0,0,1	GET_THREAD_INFO(%r10)	orl   $TS_COMPAT,threadinfo_status(%r10)	testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP),threadinfo_flags(%r10)	jnz ia32_tracesysia32_do_syscall:		cmpl $(IA32_NR_syscalls-1),%eax	ja  ia32_badsys	IA32_ARG_FIXUP	call *ia32_sys_call_table(,%rax,8) # xxx: rip relativeia32_sysret:	movq %rax,RAX-ARGOFFSET(%rsp)	jmp int_ret_from_sys_call ia32_tracesys:			 	SAVE_REST	CLEAR_RREGS	movq $-ENOSYS,RAX(%rsp)	/* really needed? */	movq %rsp,%rdi        /* &pt_regs -> arg1 */	call syscall_trace_enter	LOAD_ARGS32 ARGOFFSET  /* reload args from stack in case ptrace changed it */	RESTORE_REST	jmp ia32_do_syscallEND(ia32_syscall)ia32_badsys:	movq $0,ORIG_RAX-ARGOFFSET(%rsp)	movq $-ENOSYS,RAX-ARGOFFSET(%rsp)	jmp int_ret_from_sys_callquiet_ni_syscall:	movq $-ENOSYS,%rax	ret	CFI_ENDPROC		.macro PTREGSCALL label, func, arg	.globl \label\label:	leaq \func(%rip),%rax	leaq -ARGOFFSET+8(%rsp),\arg	/* 8 for return address */	jmp  ia32_ptregs_common		.endm	CFI_STARTPROC32

⌨️ 快捷键说明

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