From d00ff2950eacc375d57e44d65c7697f636c67625 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Sat, 19 Mar 2011 18:51:42 -0400 Subject: overhaul syscall interface this commit shuffles around the location of syscall definitions so that we can make a syscall() library function with both SYS_* and __NR_* style syscall names available to user applications, provides the syscall() library function, and optimizes the code that performs the actual inline syscalls in the library itself. previously on i386 when built as PIC (shared library), syscalls were incurring bus lock (lock prefix) overhead at entry and exit, due to the way the ebx register was being loaded (xchg instruction with a memory operand). now the xchg takes place between two registers. further cleanup to arch/$(ARCH)/syscall.h is planned. --- src/thread/pthread_create.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/thread') diff --git a/src/thread/pthread_create.c b/src/thread/pthread_create.c index 7494a486..fccfa191 100644 --- a/src/thread/pthread_create.c +++ b/src/thread/pthread_create.c @@ -91,7 +91,7 @@ static void rsyscall_handler(int sig, siginfo_t *si, void *ctx) return; } - if (syscall6(rs.nr, rs.arg[0], rs.arg[1], rs.arg[2], + if (__syscall(rs.nr, rs.arg[0], rs.arg[1], rs.arg[2], rs.arg[3], rs.arg[4], rs.arg[5]) < 0 && !rs.err) rs.err=errno; a_inc(&rs.cnt); @@ -140,7 +140,7 @@ static int rsyscall(int nr, long a, long b, long c, long d, long e, long f) while((i=rs.cnt)) __wait(&rs.cnt, 0, i, 1); if (rs.err) errno = rs.err, ret = -1; - else ret = syscall6(nr, a, b, c, d, e, f); + else ret = __syscall(nr, a, b, c, d, e, f); UNLOCK(&rs.lock); return ret; -- cgit v1.2.1