summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/i386/syscall6.S
diff options
context:
space:
mode:
authormirabilos <m@mirbsd.org>2017-01-29 15:30:50 +0100
committerWaldemar Brodkorb <wbx@openadk.org>2017-01-29 20:07:28 +0100
commit9b457baf8d46329f7d7ee2aa084022bb0df88551 (patch)
tree87b726f65dd2223975c89ce98a180e792017d7f3 /libc/sysdeps/linux/i386/syscall6.S
parent2d3403be6c680fddcc66238baa0a25c0554e2227 (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.S67
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