From f051627fadac5986cb21829c1083a819d4310489 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Wed, 18 Dec 2002 11:56:21 +0000 Subject: Update. 2002-12-18 Ulrich Drepper * sysdeps/unix/sysv/linux/i386/sysdep.h: Define ENTER_KERNEL macro. Use it instead of directly int $0x80. * sysdeps/unix/sysv/linux/i386/brk.c: Use ENTER_KERNEL. * sysdeps/unix/sysv/linux/i386/mmap64.S: Likewise. * sysdeps/unix/sysv/linux/i386/mmap.S: Likewise. * sysdeps/unix/sysv/linux/i386/sigaction.c: Likewise. * sysdeps/unix/sysv/linux/i386/socket.S: Likewise. * sysdeps/unix/sysv/linux/i386/syscall.S: Likewise. --- sysdeps/unix/sysv/linux/i386/brk.c | 10 +++++----- sysdeps/unix/sysv/linux/i386/mmap.S | 4 ++-- sysdeps/unix/sysv/linux/i386/mmap64.S | 6 +++--- sysdeps/unix/sysv/linux/i386/sigaction.c | 6 +++--- sysdeps/unix/sysv/linux/i386/socket.S | 4 ++-- sysdeps/unix/sysv/linux/i386/syscall.S | 4 ++-- sysdeps/unix/sysv/linux/i386/sysdep.h | 13 +++++++++++-- 7 files changed, 28 insertions(+), 19 deletions(-) (limited to 'sysdeps') diff --git a/sysdeps/unix/sysv/linux/i386/brk.c b/sysdeps/unix/sysv/linux/i386/brk.c index 09af9b9f7e..950144d41a 100644 --- a/sysdeps/unix/sysv/linux/i386/brk.c +++ b/sysdeps/unix/sysv/linux/i386/brk.c @@ -1,5 +1,5 @@ /* brk system call for Linux/i386. - Copyright (C) 1995, 1996, 2000 Free Software Foundation, Inc. + Copyright (C) 1995, 1996, 2000, 2002 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 @@ -36,10 +36,10 @@ __brk (void *addr) { void *__unbounded newbrk, *__unbounded scratch; - asm ("movl %%ebx, %1\n" /* Save %ebx in scratch register. */ - "movl %3, %%ebx\n" /* Put ADDR in %ebx to be syscall arg. */ - "int $0x80 # %2\n" /* Perform the system call. */ - "movl %1, %%ebx\n" /* Restore %ebx from scratch register. */ + asm ("movl %%ebx, %1\n\t" /* Save %ebx in scratch register. */ + "movl %3, %%ebx\n\t" /* Put ADDR in %ebx to be syscall arg. */ + ENTER_KERNEL "\n\t" /* Perform the system call. */ + "movl %1, %%ebx" /* Restore %ebx from scratch register. */ : "=a" (newbrk), "=r" (scratch) : "0" (SYS_ify (brk)), "g" (__ptrvalue (addr))); diff --git a/sysdeps/unix/sysv/linux/i386/mmap.S b/sysdeps/unix/sysv/linux/i386/mmap.S index c63a49bcd4..ebb21f3d32 100644 --- a/sysdeps/unix/sysv/linux/i386/mmap.S +++ b/sysdeps/unix/sysv/linux/i386/mmap.S @@ -1,4 +1,4 @@ -/* Copyright (C) 1995, 96, 97, 98, 99, 2000 Free Software Foundation, Inc. +/* Copyright (C) 1995,96,97,98,99,2000,2002 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 @@ -50,7 +50,7 @@ ENTRY (__mmap) movl $SYS_ify(mmap2), %eax /* System call number in %eax. */ /* Do the system call trap. */ - int $0x80 + ENTER_KERNEL L(skip): /* Restore registers. */ popl %edi diff --git a/sysdeps/unix/sysv/linux/i386/mmap64.S b/sysdeps/unix/sysv/linux/i386/mmap64.S index df32998134..3a03335814 100644 --- a/sysdeps/unix/sysv/linux/i386/mmap64.S +++ b/sysdeps/unix/sysv/linux/i386/mmap64.S @@ -1,4 +1,4 @@ -/* Copyright (C) 1995, 96, 97, 98, 99, 2000 Free Software Foundation, Inc. +/* Copyright (C) 1995,96,97,98,99,2000,2002 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 @@ -65,7 +65,7 @@ ENTRY (BP_SYM (__mmap64)) /* Do the system call trap. */ L(do_syscall): - int $0x80 + ENTER_KERNEL /* Restore registers. */ popl %edi @@ -110,7 +110,7 @@ L(einval): lea ADDR-SVRSP(%esp), %ebx /* Address of args is 1st arg. */ /* Do the system call trap. */ - int $0x80 + ENTER_KERNEL /* Restore registers. */ movl %edx, %ebx diff --git a/sysdeps/unix/sysv/linux/i386/sigaction.c b/sysdeps/unix/sysv/linux/i386/sigaction.c index 813c9bab77..bfc8b2c2e2 100644 --- a/sysdeps/unix/sysv/linux/i386/sigaction.c +++ b/sysdeps/unix/sysv/linux/i386/sigaction.c @@ -131,9 +131,9 @@ __libc_sigaction (int sig, const struct sigaction *act, struct sigaction *oact) k_newact.sa_restorer = &restore; } - asm volatile ("pushl %%ebx\n" - "movl %2, %%ebx\n" - "int $0x80\n" + asm volatile ("pushl %%ebx\n\t" + "movl %2, %%ebx\n\t" + ENTER_KERNEL_STR "\n\t" "popl %%ebx" : "=a" (result) : "0" (SYS_ify (sigaction)), "mr" (sig), diff --git a/sysdeps/unix/sysv/linux/i386/socket.S b/sysdeps/unix/sysv/linux/i386/socket.S index 53f1be61ea..a5af6b2907 100644 --- a/sysdeps/unix/sysv/linux/i386/socket.S +++ b/sysdeps/unix/sysv/linux/i386/socket.S @@ -57,7 +57,7 @@ ENTRY (__socket) lea 4(%esp), %ecx /* Address of args is 2nd arg. */ /* Do the system call trap. */ - int $0x80 + ENTER_KERNEL /* Restore registers. */ movl %edx, %ebx @@ -89,7 +89,7 @@ L(pseudo_end): lea 8(%esp), %ecx /* Address of args is 2nd arg. */ /* Do the system call trap. */ - int $0x80 + ENTER_KERNEL /* Restore registers. */ movl %edx, %ebx diff --git a/sysdeps/unix/sysv/linux/i386/syscall.S b/sysdeps/unix/sysv/linux/i386/syscall.S index 355be5a58a..cd7dc65a5f 100644 --- a/sysdeps/unix/sysv/linux/i386/syscall.S +++ b/sysdeps/unix/sysv/linux/i386/syscall.S @@ -1,4 +1,4 @@ -/* Copyright (C) 1995, 1996, 1998 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1996, 1998, 2002 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 @@ -27,7 +27,7 @@ ENTRY (syscall) PUSHARGS_5 /* Save register contents. */ _DOARGS_5(36) /* Load arguments. */ movl 16(%esp), %eax /* Load syscall number into %eax. */ - int $0x80 /* Do the system call. */ + ENTER_KERNEL /* Do the system call. */ POPARGS_5 /* Restore register contents. */ cmpl $-4095, %eax /* Check %eax for error. */ jae SYSCALL_ERROR_LABEL /* Jump to error handler if error. */ diff --git a/sysdeps/unix/sysv/linux/i386/sysdep.h b/sysdeps/unix/sysv/linux/i386/sysdep.h index 7bf146e8be..5275ebaf57 100644 --- a/sysdeps/unix/sysv/linux/i386/sysdep.h +++ b/sysdeps/unix/sysv/linux/i386/sysdep.h @@ -159,6 +159,11 @@ __i686.get_pc_thunk.reg: \ # endif /* _LIBC_REENTRANT */ #endif /* PIC */ + +/* The original calling convention for system calls on Linux/i386 is + to use int $0x80. */ +#define ENTER_KERNEL int $0x80 + /* Linux takes system call arguments in registers: syscall number %eax call-clobbered @@ -208,7 +213,7 @@ __i686.get_pc_thunk.reg: \ PUSHARGS_##args \ DOARGS_##args \ movl $SYS_ify (syscall_name), %eax; \ - int $0x80 \ + ENTER_KERNEL \ POPARGS_##args #define PUSHARGS_0 /* No arguments to push. */ @@ -255,6 +260,10 @@ __i686.get_pc_thunk.reg: \ #else /* !__ASSEMBLER__ */ +/* The original calling convention for system calls on Linux/i386 is + to use int $0x80. */ +#define ENTER_KERNEL "int $0x80" + /* We need some help from the assembler to generate optimal code. We define some macros here which later will be used. */ asm (".L__X'%ebx = 1\n\t" @@ -315,7 +324,7 @@ asm (".L__X'%ebx = 1\n\t" asm volatile ( \ LOADARGS_##nr \ "movl %1, %%eax\n\t" \ - "int $0x80\n\t" \ + ENTER_KERNEL "\n\t" \ RESTOREARGS_##nr \ : "=a" (resultvar) \ : "i" (__NR_##name) ASMFMT_##nr(args) : "memory", "cc"); \ -- cgit 1.4.1