diff options
author | mirabilos <m@mirbsd.org> | 2017-01-29 15:30:50 +0100 |
---|---|---|
committer | Waldemar Brodkorb <wbx@openadk.org> | 2017-01-29 20:07:28 +0100 |
commit | 9b457baf8d46329f7d7ee2aa084022bb0df88551 (patch) | |
tree | 87b726f65dd2223975c89ce98a180e792017d7f3 /libc/sysdeps/linux/i386/syscall6.S | |
parent | 2d3403be6c680fddcc66238baa0a25c0554e2227 (diff) |
use safe, even if possibly a few cycles slower, six-argument syscall implementation
Signed-off-by: mirabilos <m@mirbsd.org>
Signed-off-by: Waldemar Brodkorb <wbx@openadk.org>
Diffstat (limited to 'libc/sysdeps/linux/i386/syscall6.S')
-rw-r--r-- | libc/sysdeps/linux/i386/syscall6.S | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/libc/sysdeps/linux/i386/syscall6.S b/libc/sysdeps/linux/i386/syscall6.S new file mode 100644 index 000000000..488f11afc --- /dev/null +++ b/libc/sysdeps/linux/i386/syscall6.S @@ -0,0 +1,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 |