summaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv/linux/i386
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv/linux/i386')
-rw-r--r--sysdeps/unix/sysv/linux/i386/clone.S1
-rw-r--r--sysdeps/unix/sysv/linux/i386/mmap.S1
-rw-r--r--sysdeps/unix/sysv/linux/i386/profil-counter.h4
-rw-r--r--sysdeps/unix/sysv/linux/i386/sigcontext.h29
-rw-r--r--sysdeps/unix/sysv/linux/i386/socket.S1
-rw-r--r--sysdeps/unix/sysv/linux/i386/syscall.S10
-rw-r--r--sysdeps/unix/sysv/linux/i386/sysdep.S3
-rw-r--r--sysdeps/unix/sysv/linux/i386/sysdep.h25
8 files changed, 60 insertions, 14 deletions
diff --git a/sysdeps/unix/sysv/linux/i386/clone.S b/sysdeps/unix/sysv/linux/i386/clone.S
index b60bc8ed92..0afbf872d9 100644
--- a/sysdeps/unix/sysv/linux/i386/clone.S
+++ b/sysdeps/unix/sysv/linux/i386/clone.S
@@ -65,6 +65,7 @@ ENTRY(__clone)
jz thread_start
ret
+ .size __clone,.-__clone
SYSCALL_ERROR_HANDLER
diff --git a/sysdeps/unix/sysv/linux/i386/mmap.S b/sysdeps/unix/sysv/linux/i386/mmap.S
index 638d548e00..30b0f76a43 100644
--- a/sysdeps/unix/sysv/linux/i386/mmap.S
+++ b/sysdeps/unix/sysv/linux/i386/mmap.S
@@ -42,5 +42,6 @@ ENTRY (__mmap)
/* Successful; return the syscall's value. */
ret
+ .size __mmap,.-__mmap
weak_alias (__mmap, mmap)
diff --git a/sysdeps/unix/sysv/linux/i386/profil-counter.h b/sysdeps/unix/sysv/linux/i386/profil-counter.h
index 7de3faec0e..96b38e24c0 100644
--- a/sysdeps/unix/sysv/linux/i386/profil-counter.h
+++ b/sysdeps/unix/sysv/linux/i386/profil-counter.h
@@ -17,10 +17,10 @@ License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
-#include <asm/sigcontext.h>
+#include <sigcontext.h>
void
-profil_counter (int signo, struct sigcontext_struct sc)
+profil_counter (int signo, struct sigcontext sc)
{
profil_count ((void *) sc.eip);
}
diff --git a/sysdeps/unix/sysv/linux/i386/sigcontext.h b/sysdeps/unix/sysv/linux/i386/sigcontext.h
new file mode 100644
index 0000000000..92733ab447
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/sigcontext.h
@@ -0,0 +1,29 @@
+/* Copyright (C) 1996 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
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+#ifndef _SIGCONTEXT_H
+#define _SIGCONTEXT_H 1
+
+/* Kernel headers before 2.1.1 define a struct sigcontext_struct, but
+ we need sigcontext. */
+#define sigcontext_struct sigcontext
+
+#include <asm/sigcontext.h>
+
+
+#endif /* sigcontext.h */
diff --git a/sysdeps/unix/sysv/linux/i386/socket.S b/sysdeps/unix/sysv/linux/i386/socket.S
index 39db6aa50a..0cf4bfdf9e 100644
--- a/sysdeps/unix/sysv/linux/i386/socket.S
+++ b/sysdeps/unix/sysv/linux/i386/socket.S
@@ -57,5 +57,6 @@ ENTRY (P(__,socket))
/* Successful; return the syscall's value. */
ret
+ .size P(__,socket),.-P(__,socket)
weak_alias (P(__,socket), socket)
diff --git a/sysdeps/unix/sysv/linux/i386/syscall.S b/sysdeps/unix/sysv/linux/i386/syscall.S
index b7b44e76da..e7839cd1c0 100644
--- a/sysdeps/unix/sysv/linux/i386/syscall.S
+++ b/sysdeps/unix/sysv/linux/i386/syscall.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1996 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
@@ -18,6 +18,9 @@ Cambridge, MA 02139, USA. */
#include <sysdep.h>
+/* Please consult the file sysdeps/unix/sysv/linux/i386/sysdep.h for
+ more information about the value -125 used below.*/
+
.text
SYSCALL_ERROR_HANDLER /* Define error handler for PIC. */
ENTRY (syscall)
@@ -26,6 +29,7 @@ ENTRY (syscall)
movl 16(%esp), %eax /* Load syscall number into %eax. */
int $0x80 /* Do the system call. */
POPARGS_5 /* Restore register contents. */
- testl %eax, %eax /* Check %eax for error. */
- jl syscall_error /* Jump to error handler if negative. */
+ cmpl $-125, %eax /* Check %eax for error. */
+ jae syscall_error /* Jump to error handler if error. */
ret /* Return to caller. */
+ .size syscall,.-syscall
diff --git a/sysdeps/unix/sysv/linux/i386/sysdep.S b/sysdeps/unix/sysv/linux/i386/sysdep.S
index 213af51548..9727f8976f 100644
--- a/sysdeps/unix/sysv/linux/i386/sysdep.S
+++ b/sysdeps/unix/sysv/linux/i386/sysdep.S
@@ -67,5 +67,4 @@ ENTRY (__errno_location)
movl $errno, %eax
#endif
ret
-.Lfe1:
- .size __errno_location, .Lfe1-__errno_location
+ .size __errno_location, .-__errno_location
diff --git a/sysdeps/unix/sysv/linux/i386/sysdep.h b/sysdeps/unix/sysv/linux/i386/sysdep.h
index 1bf20bd718..b00c976351 100644
--- a/sysdeps/unix/sysv/linux/i386/sysdep.h
+++ b/sysdeps/unix/sysv/linux/i386/sysdep.h
@@ -37,16 +37,25 @@ Cambridge, MA 02139, USA. */
#ifdef ASSEMBLER
-/* Linux uses a negative return value to indicate syscall errors, unlike
- most Unices, which use the condition codes' carry flag. */
+/* Linux uses a negative return value to indicate syscall errors,
+ unlike most Unices, which use the condition codes' carry flag.
+
+ Since version 2.1 the return value of a system call might be
+ negative even if the call succeeded. E.g., the `lseek' system call
+ might return a large offset. Therefore we must not anymore test
+ for < 0, but test for a real error by making sure the value in %eax
+ is a real error number. For now (as of 2.1.1) 122 is the largest
+ defined error number. Given a bit room for development, Linus
+ chose in <asm/unistd.h> to use the values -125 to -1 for error
+ values. We follow him here. */
#undef PSEUDO
#define PSEUDO(name, syscall_name, args) \
.text; \
SYSCALL_ERROR_HANDLER \
ENTRY (name) \
DO_CALL (args, syscall_name); \
- testl %eax, %eax; \
- jl syscall_error;
+ cmpl $-125, %eax; \
+ jae syscall_error;
#ifndef PIC
#define SYSCALL_ERROR_HANDLER /* Nothing here; code in sysdep.S is used. */
@@ -70,9 +79,10 @@ syscall_error: \
popl %ebx; \
movl %ecx, (%eax); \
movl $-1, %eax; \
- ret;
+ ret; \
+ .size syscall_error,.-syscall-error;
/* A quick note: it is assumed that the call to `__errno_location' does
- not modify the parameter value! */
+ not modify the stack! */
#else
#define SYSCALL_ERROR_HANDLER \
.type syscall_error,@function; \
@@ -85,7 +95,8 @@ syscall_error: \
movl errno@GOT(%ecx), %ecx; \
movl %edx, (%ecx); \
movl $-1, %eax; \
- ret;
+ ret; \
+ .size syscall_error,.-syscall-error;
#endif /* _LIBC_REENTRANT */
#endif /* PIC */