summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/i386/syscall6.S
blob: 488f11afcd9a9c0f0187876a1d89ef68ffdb4701 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/*-
 * Copyright (c) 2017
 *	mirabilos <m@mirbsd.org>
 *
 * Provided that these terms and disclaimer and all copyright notices
 * are retained or reproduced in an accompanying document, permission
 * is granted to deal in this work without restriction, including un-
 * limited rights to use, publicly perform, distribute, sell, modify,
 * merge, give away, or sublicence.
 *
 * This work is provided "AS IS" and WITHOUT WARRANTY of any kind, to
 * the utmost extent permitted by applicable law, neither express nor
 * implied; without malicious intent or gross negligence. In no event
 * may a licensor, author or contributor be held liable for indirect,
 * direct, other damage, loss, or other issues arising in any way out
 * of dealing in the work, even if advised of the possibility of such
 * damage or existence of a defect, except proven that it results out
 * of said person's immediate fault when using the work as intended.
 */

	.intel_syntax noprefix
	.text

/*-
 * long __libc_i386_syscall6(unsigned long nr, ...) with six varargs
 *
 * C definition:
 * extern long __libc_i386_syscall6(unsigned long, ...)
 *    __attribute__((__cdecl__));
 *
 * Stack layout upon entry:		Offsets after saving:
 * [esp + 28]	arg6	-> ebp !	[esp + 44]
 * [esp + 24]	arg5	-> edi !	[esp + 40]
 * [esp + 20]	arg4	-> esi !	[esp + 36]
 * [esp + 16]	arg3	-> edx		[esp + 32]
 * [esp + 12]	arg2	-> ecx		[esp + 28]
 * [esp + 8]	arg1	-> ebx !	[esp + 24]
 * [esp + 4]	nr	-> eax		[esp + 20]
 * [esp]	return address		[esp + 16]
 *					[esp + 12]	saved ebp
 *					[esp + 8]	saved ebx
 *					[esp + 4]	saved esi
 *					[esp]		saved edi
 */

	.p2align 4,0x90
	.globl	__libc_i386_syscall6
	.type	__libc_i386_syscall6,@function
__libc_i386_syscall6:
	push	ebp
	push	ebx
	push	esi
	push	edi
	mov	eax,[esp + 20]	/* nr */
	mov	ebx,[esp + 24]	/* arg1 */
	mov	ecx,[esp + 28]	/* arg2 */
	mov	edx,[esp + 32]	/* arg3 */
	mov	esi,[esp + 36]	/* arg4 */
	mov	edi,[esp + 40]	/* arg5 */
	mov	ebp,[esp + 44]	/* arg6 */
	int	0x80
	pop	edi
	pop	esi
	pop	ebx
	pop	ebp
	ret
	.size	__libc_i386_syscall6,.-__libc_i386_syscall6