[PATCH] Handle 6 arguments (+ SYS_name) in syscall(3) on IA-32

Jakub Jelinek jakub@redhat.com
Fri Oct 15 21:08:00 GMT 2004


Hi!

syscall(3) ATM only handles at most 5 argument syscalls on IA-32, while
there are a couple of 6 argument ones.  Although we have functions for
all of them now, it is not that expensive to handle it...

2004-10-15  Jakub Jelinek  <jakub@redhat.com>

	* sysdeps/unix/sysv/linux/i386/sysdep.h (PUSHARGS_6, DOARGS_6,
	POPARGS_6, _PUSHARGS_6, _DOARGS_6, _POPARGS_6): Define.
	* sysdeps/unix/sysv/linux/i386/syscall.S (syscall): Handle 6 argument
	syscalls.

--- libc/sysdeps/unix/sysv/linux/i386/sysdep.h.jj	2004-10-05 09:05:00.000000000 +0200
+++ libc/sysdeps/unix/sysv/linux/i386/sysdep.h	2004-10-15 14:22:59.714897250 +0200
@@ -297,6 +297,13 @@ __i686.get_pc_thunk.reg:						      \
 #define _DOARGS_5(n)	movl n(%esp), %edi; _DOARGS_4 (n-4)
 #define _POPARGS_5	_POPARGS_4; popl %edi; L(POPDI1):
 
+#define PUSHARGS_6	_PUSHARGS_6
+#define DOARGS_6	_DOARGS_6 (36)
+#define POPARGS_6	_POPARGS_6
+#define _PUSHARGS_6	pushl %ebp; L(PUSHBP1): _PUSHARGS_5
+#define _DOARGS_6(n)	movl n(%esp), %ebp; _DOARGS_5 (n-4)
+#define _POPARGS_6	_POPARGS_5; popl %ebp; L(POPBP1):
+
 #else	/* !__ASSEMBLER__ */
 
 /* We need some help from the assembler to generate optimal code.  We
--- libc/sysdeps/unix/sysv/linux/i386/syscall.S.jj	2002-12-18 12:55:22.000000000 +0100
+++ libc/sysdeps/unix/sysv/linux/i386/syscall.S	2004-10-15 19:41:10.113099618 +0200
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995, 1996, 1998, 2002 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1996, 1998, 2002, 2004 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -24,11 +24,11 @@
 	.text
 ENTRY (syscall)
 
-	PUSHARGS_5		/* Save register contents.  */
-	_DOARGS_5(36)		/* Load arguments.  */
-	movl 16(%esp), %eax	/* Load syscall number into %eax.  */
+	PUSHARGS_6		/* Save register contents.  */
+	_DOARGS_6(44)		/* Load arguments.  */
+	movl 20(%esp), %eax	/* Load syscall number into %eax.  */
 	ENTER_KERNEL		/* Do the system call.  */
-	POPARGS_5		/* Restore register contents.  */
+	POPARGS_6		/* Restore register contents.  */
 	cmpl $-4095, %eax	/* Check %eax for error.  */
 	jae SYSCALL_ERROR_LABEL	/* Jump to error handler if error.  */
 L(pseudo_end):


	Jakub



More information about the Libc-hacker mailing list