Browse Source

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>
mirabilos 7 years ago
parent
commit
9b457baf8d

+ 1 - 0
ldso/ldso/i386/syscall6.S

@@ -0,0 +1 @@
+#include <libc/sysdeps/linux/i386/syscall6.S>

+ 2 - 2
libc/sysdeps/linux/i386/Makefile.arch

@@ -6,8 +6,8 @@
 #
 
 CSRC-y := brk.c __syscall_error.c sigaction.c
-SSRC-y := __longjmp.S setjmp.S bsd-setjmp.S bsd-_setjmp.S \
-	sync_file_range.S syscall.S mmap.S mmap64.S vfork.S clone.S
+SSRC-y := __longjmp.S bsd-_setjmp.S bsd-setjmp.S clone.S mmap.S mmap64.S \
+	  setjmp.S sync_file_range.S syscall.S syscall6.S vfork.S
 
 SSRC-$(UCLIBC_HAS_ADVANCED_REALTIME) += posix_fadvise64.S
 SSRC-$(UCLIBC_HAS_CONTEXT_FUNCS) += makecontext.S setcontext.S getcontext.S swapcontext.S

+ 5 - 5
libc/sysdeps/linux/i386/bits/syscalls.h

@@ -36,7 +36,11 @@
 #define INTERNAL_SYSCALL_NCS_X86_3 INTERNAL_SYSCALL_NCS_X86_UPTOFIVE
 #define INTERNAL_SYSCALL_NCS_X86_4 INTERNAL_SYSCALL_NCS_X86_UPTOFIVE
 #define INTERNAL_SYSCALL_NCS_X86_5 INTERNAL_SYSCALL_NCS_X86_UPTOFIVE
-#define INTERNAL_SYSCALL_NCS_X86_6 INTERNAL_SYSCALL_NCS_X86_UPTOFIVE
+
+extern long __libc_i386_syscall6(unsigned long, ...)
+    __attribute__((__cdecl__));
+#define INTERNAL_SYSCALL_NCS_X86_6(name, err, nr, args...) \
+	__libc_i386_syscall6((unsigned long)name, args)
 
 #define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \
 	INTERNAL_SYSCALL_NCS_X86_##nr(name, err, nr, args)
@@ -104,7 +108,6 @@ __asm__ (
 #define LOADARGS_3  LOADARGS_1
 #define LOADARGS_4  LOADARGS_1
 #define LOADARGS_5  LOADARGS_1
-#define LOADARGS_6  LOADARGS_1 "push %%ebp\n\t" "movl %7, %%ebp\n\t"
 
 #define RESTOREARGS_0
 #define RESTOREARGS_1  "bpopl .L__X'%k2, %k2\n\t"
@@ -112,7 +115,6 @@ __asm__ (
 #define RESTOREARGS_3  RESTOREARGS_1
 #define RESTOREARGS_4  RESTOREARGS_1
 #define RESTOREARGS_5  RESTOREARGS_1
-#define RESTOREARGS_6  "pop %%ebp\n\t" RESTOREARGS_1
 
 #define ASMFMT_0()
 /* "acdSD" constraint would work too, but "SD" would use esi/edi and cause
@@ -132,8 +134,6 @@ __asm__ (
 	, "a" (arg1), "c" (arg2), "d" (arg3), "S" (arg4)
 #define ASMFMT_5(arg1, arg2, arg3, arg4, arg5) \
 	, "a" (arg1), "c" (arg2), "d" (arg3), "S" (arg4), "D" (arg5)
-#define ASMFMT_6(arg1, arg2, arg3, arg4, arg5, arg6) \
-	, "a" (arg1), "c" (arg2), "d" (arg3), "S" (arg4), "D" (arg5), "g" (arg6)
 
 #endif /* __ASSEMBLER__ */
 #endif /* _BITS_SYSCALLS_H */

+ 67 - 0
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