summaryrefslogtreecommitdiff
path: root/sysdeps
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/i386/i686/Implies2
-rw-r--r--sysdeps/libm-ieee754/s_isnan.c1
-rw-r--r--sysdeps/posix/tempname.c1
-rw-r--r--sysdeps/unix/sysv/linux/alpha/clone.S118
-rw-r--r--sysdeps/unix/sysv/linux/direntry.h22
-rw-r--r--sysdeps/unix/sysv/linux/ftime.c3
-rw-r--r--sysdeps/unix/sysv/linux/i386/clone.S80
-rw-r--r--sysdeps/unix/sysv/linux/m68k/resourcebits.h3
-rw-r--r--sysdeps/unix/sysv/linux/sys/acct.h3
-rw-r--r--sysdeps/unix/sysv/linux/sys/io.h13
-rw-r--r--sysdeps/unix/sysv/linux/sys/klog.h26
-rw-r--r--sysdeps/unix/sysv/linux/sys/module.h23
-rw-r--r--sysdeps/unix/sysv/linux/sys/timex.h9
13 files changed, 280 insertions, 24 deletions
diff --git a/sysdeps/i386/i686/Implies b/sysdeps/i386/i686/Implies
new file mode 100644
index 0000000000..75fde78977
--- /dev/null
+++ b/sysdeps/i386/i686/Implies
@@ -0,0 +1,2 @@
+# Code optimized for i586 is better than simple i386 code.
+i386/i586
diff --git a/sysdeps/libm-ieee754/s_isnan.c b/sysdeps/libm-ieee754/s_isnan.c
index 4d8983c9b3..1aed525af1 100644
--- a/sysdeps/libm-ieee754/s_isnan.c
+++ b/sysdeps/libm-ieee754/s_isnan.c
@@ -38,5 +38,6 @@ static char rcsid[] = "$NetBSD: s_isnan.c,v 1.8 1995/05/10 20:47:36 jtc Exp $";
}
weak_alias (__isnan, isnan)
#ifdef NO_LONG_DOUBLE
+strong_alias (__isnan, __isnanl)
weak_alias (__isnan, isnanl)
#endif
diff --git a/sysdeps/posix/tempname.c b/sysdeps/posix/tempname.c
index 5881febf81..0f088ec915 100644
--- a/sysdeps/posix/tempname.c
+++ b/sysdeps/posix/tempname.c
@@ -202,7 +202,6 @@ __stdio_gen_tempname (const char *dir, const char *pfx, int dir_search,
goto lose;
}
fp->file._flags &= ~_IO_DELETE_DONT_CLOSE;
- fp->file._IO_file_flags = 0;
*streamptr = (FILE *) fp;
#else
diff --git a/sysdeps/unix/sysv/linux/alpha/clone.S b/sysdeps/unix/sysv/linux/alpha/clone.S
new file mode 100644
index 0000000000..a1ef324956
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/alpha/clone.S
@@ -0,0 +1,118 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+ Contributed by Richard Henderson (rth@tamu.edu)
+
+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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+/* clone() is even more special than fork() as it mucks with stacks
+ and invokes a function in the right context after its all over. */
+
+#include <sysdep.h>
+#include <errnos.h>
+
+/* int clone(int (*fn)(), void *child_stack, int flags, int nargs, ...) */
+
+ .text
+ENTRY(__clone)
+ lda sp,-16(sp)
+ .frame sp,16,$26,0
+ /* Save rest of argument registers for varargs-type work. */
+ stq a4,0(sp)
+ stq a5,8(sp)
+ .prologue 1
+
+ /* Sanity check arguments. */
+ sextl a3,a3
+ ldiq v0,EINVAL
+ beq a0,$error /* no NULL function pointers */
+ beq a1,$error /* no NULL stack pointers */
+ blt a3,$error /* no negative argument counts */
+
+ /* Allocate space on the new stack and copy args over */
+ mov a3,t0 /* save nargs for thread_start */
+ s8addq a3,sp,t1
+1: ldq t2,-8(t1)
+ subq t1,8,t1
+ stq t2,-8(a1)
+ subq a3,1,a3
+ subq a1,8,a1
+ bne a3,1b
+
+ /* Do the system call */
+ mov a0,pv /* get fn ptr out of the way */
+ mov a2,a0
+ ldiq v0,__NR_clone
+ call_pal PAL_callsys
+
+ bne a3,$error
+ beq v0,thread_start
+
+ /* Successful return from the parent */
+ lda sp,16(sp)
+ ret
+
+ /* Something bad happened -- no child created */
+$error:
+ br gp,1f
+1: ldgp gp,0(gp)
+ lda sp,16(sp)
+ jmp zero,__syscall_error
+
+ END(__clone)
+
+/* Load up the arguments to the function. Put this block of code in
+ its own function so that we can terminate the stack trace with our
+ debug info.
+
+ At this point we have $t0=nargs, $pv=fn, $sp=&arg[0]. */
+
+ .ent thread_start
+thread_start:
+ .frame fp,0,zero,0
+ mov zero,fp
+ .prologue 0
+
+ /* Calculate address of jump into argument loading code */
+ cmple t0,6,t2 /* no more than 6 args in registers */
+ cmoveq t2,6,t0
+ br v0,1f /* find address of arg0 */
+1: lda v0,$arg0-1b(v0)
+ s4addq t0,zero,t1
+ subq v0,t1,v0
+ jmp (v0)
+
+ /* Load the integer register arguments */
+ ldq a5,40(sp)
+ ldq a4,32(sp)
+ ldq a3,24(sp)
+ ldq a2,16(sp)
+ ldq a1,8(sp)
+ ldq a0,0(sp)
+$arg0:
+
+ /* Adjust stack to remove the arguments we just loaded */
+ s8addq t0,sp,sp
+
+ /* Call the user's function */
+ jsr ra,(pv)
+ ldgp gp,0(ra)
+
+ /* Call _exit rather than doing it inline for breakpoint purposes */
+ mov v0,a0
+ jsr ra,_exit
+
+ .end thread_start
+
+weak_alias(__clone, clone)
diff --git a/sysdeps/unix/sysv/linux/direntry.h b/sysdeps/unix/sysv/linux/direntry.h
index 1d661d642a..732a068461 100644
--- a/sysdeps/unix/sysv/linux/direntry.h
+++ b/sysdeps/unix/sysv/linux/direntry.h
@@ -1,8 +1,26 @@
-/* Get `struct dirent' from the Linux kernel header file. */
+/* 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
#ifndef _DIRENTRY_H
-#define _DIRENTRY_H
+#define _DIRENTRY_H 1
+/* Get `struct dirent' from the Linux kernel header file. */
+#include <asm/posix_types.h>
#include <linux/dirent.h>
#define d_fileno d_ino /* backwards compatibility */
diff --git a/sysdeps/unix/sysv/linux/ftime.c b/sysdeps/unix/sysv/linux/ftime.c
new file mode 100644
index 0000000000..e8b5e6e60b
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/ftime.c
@@ -0,0 +1,3 @@
+/* Linux defines the ftime system call but doesn't actually implement
+ it. Use the generic implementation. */
+#include <sysdeps/generic/ftime.c>
diff --git a/sysdeps/unix/sysv/linux/i386/clone.S b/sysdeps/unix/sysv/linux/i386/clone.S
new file mode 100644
index 0000000000..02f561927e
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/clone.S
@@ -0,0 +1,80 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+ Contributed by Richard Henderson (rth@tamu.edu)
+
+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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+/* clone() is even more special than fork() as it mucks with stacks
+ and invokes a function in the right context after its all over. */
+
+#include <sysdep.h>
+#include <errnos.h>
+
+/* int clone(int (*fn)(), void *child_stack, int flags, int nargs, ...) */
+
+ .text
+ENTRY(__clone)
+ /* Sanity check arguments. */
+ movl $-EINVAL,%eax
+ movl 4(%esp),%ecx /* no NULL function pointers */
+ testl %ecx,%ecx
+ jz syscall_error
+ movl 8(%esp),%ecx /* no NULL stack pointers */
+ testl %ecx,%ecx
+ jz syscall_error
+ movl 16(%esp),%edx /* no negative argument counts */
+ testl %edx,%edx
+ js syscall_error
+
+ /* Allocate space on the new stack and copy args over */
+ movl %edx,%eax
+ negl %eax
+ lea -4(%ecx,%eax,4),%ecx
+ jz 2f
+1: movl 16(%esp,%edx,4),%eax
+ movl %eax,0(%ecx,%edx,4)
+ dec %edx
+ jnz 1b
+2:
+ /* Save the function pointer as the zeroth argument.
+ It will be popped off in the child in the ebx frobbing below. */
+ movl 4(%esp),%eax
+ movl %eax,0(%ecx)
+
+ /* Do the system call */
+ pushl %ebx
+ movl 16(%esp),%ebx
+ movl $SYS_ify(clone),%eax
+ int $0x80
+ popl %ebx
+
+ test %eax,%eax
+ jl syscall_error
+ jz thread_start
+
+ ret
+
+ SYSCALL_ERROR_HANDLER
+
+thread_start:
+ subl %ebp,%ebp /* terminate the stack frame */
+ call *%ebx
+#ifdef PIC
+ call _exit@PLT
+#else
+ call _exit
+#endif
+
+weak_alias(__clone, clone)
diff --git a/sysdeps/unix/sysv/linux/m68k/resourcebits.h b/sysdeps/unix/sysv/linux/m68k/resourcebits.h
index 65cc6e550a..d2f2daef91 100644
--- a/sysdeps/unix/sysv/linux/m68k/resourcebits.h
+++ b/sysdeps/unix/sysv/linux/m68k/resourcebits.h
@@ -54,6 +54,9 @@ enum __rlimit_resource
/* Locked-in-memory address space. */
RLIMIT_MEMLOCK,
#define RLIMIT_MEMLOCK RLIMIT_MEMLOCK
+ /* Address space limit. */
+ RLIMIT_AS,
+#define RLIMIT_AS RLIMIT_AS
RLIMIT_NLIMITS, /* Number of limit flavors. */
RLIM_NLIMITS = RLIMIT_NLIMITS /* Traditional name for same. */
diff --git a/sysdeps/unix/sysv/linux/sys/acct.h b/sysdeps/unix/sysv/linux/sys/acct.h
index adb2da7a99..da039307d1 100644
--- a/sysdeps/unix/sysv/linux/sys/acct.h
+++ b/sysdeps/unix/sysv/linux/sys/acct.h
@@ -21,6 +21,9 @@ Boston, MA 02111-1307, USA. */
#define _SYS_ACCT_H 1
#include <features.h>
+#define __need_time_t
+#include <time.h>
+
/* Get needed constants. */
#include <linux/acct.h>
diff --git a/sysdeps/unix/sysv/linux/sys/io.h b/sysdeps/unix/sysv/linux/sys/io.h
index d44850f025..6f0b9aba14 100644
--- a/sysdeps/unix/sysv/linux/sys/io.h
+++ b/sysdeps/unix/sysv/linux/sys/io.h
@@ -16,9 +16,12 @@ 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. */
-#ifndef _SYS_IO_H
-#define _SYS_IO_H
+#ifndef _SYS_IO_H
+#define _SYS_IO_H 1
+#include <features.h>
+
+/* Get constants from kernel header files. */
#include <asm/io.h>
/* If TURN_ON is TRUE, request for permission to do direct i/o on the
@@ -28,12 +31,12 @@ Cambridge, MA 02139, USA. */
Portability note: not all Linux platforms support this call. Most
platforms based on the PC I/O architecture probably will, however.
E.g., Linux/Alpha for Alpha PCs supports this. */
-extern int ioperm __P((unsigned long __from, unsigned long __num,
- int __turn_on));
+extern int ioperm __P ((unsigned long int __from, unsigned long int __num,
+ int __turn_on));
/* Set the I/O privilege level to LEVEL. If LEVEL>3, permission to
access any I/O port is granted. This call requires root
privileges. */
-extern int iopl __P((int __level));
+extern int iopl __P ((int __level));
#endif /* _SYS_IO_H */
diff --git a/sysdeps/unix/sysv/linux/sys/klog.h b/sysdeps/unix/sysv/linux/sys/klog.h
index b8a39d6492..91811c3e32 100644
--- a/sysdeps/unix/sysv/linux/sys/klog.h
+++ b/sysdeps/unix/sysv/linux/sys/klog.h
@@ -1,10 +1,30 @@
-#ifndef _SYS_KLOG_H
-#define _SYS_KLOG_H
+/* 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#ifndef _SYS_KLOG_H
+
+#define _SYS_KLOG_H 1
+#include <features.h>
/* Control the kernel's logging facility. This corresponds exactly to
the kernel's syslog system call, but that name is easily confused
with the user-level syslog facility, which is something completely
different. */
-extern int klogctl __P((int type, char *bufp, int len));
+extern int klogctl __P ((int __type, char *__bufp, int __len));
#endif /* _SYS_KLOG_H */
diff --git a/sysdeps/unix/sysv/linux/sys/module.h b/sysdeps/unix/sysv/linux/sys/module.h
index 5c4dbcea37..1062854704 100644
--- a/sysdeps/unix/sysv/linux/sys/module.h
+++ b/sysdeps/unix/sysv/linux/sys/module.h
@@ -1,21 +1,24 @@
-#ifndef _SYS_MODULE_H
-#define _SYS_MODULE_H
+#ifndef _SYS_MODULE_H
+#define _SYS_MODULE_H 1
#include <features.h>
+#define __need_size_t
+#include <stddef.h>
+
#include <linux/module.h>
/* Return number of kernel symbols if TABLE == NULL, otherwise, return
kernel symbols in TABLE. TABLE must be large enough to hold all
kernel symbols. */
-extern int get_kernel_syms __P((struct kernel_sym * table));
+extern int get_kernel_syms __P ((struct kernel_sym * table));
/* Create a new module of name MODULE_NAME and of size SIZE bytes.
The return address is the starting address of the new module or -1L
if the module cannot be created (the return value needs to be cast
to (long) to detect the error condition). */
-extern unsigned long create_module __P((const char * module_name,
- size_t size));
+extern unsigned long create_module __P ((__const char * module_name,
+ size_t size));
/* Initialize the module called MODULE_NAME with the CONTENTSSIZE
bytes starting at address CONTENTS. CONTENTS normally contains the
@@ -25,12 +28,12 @@ extern unsigned long create_module __P((const char * module_name,
ROUTINES.cleanup is executed. SYMTAB is NULL if the module does
not want to export symbols by itself, or a pointer to a symbol
table if the module wants to register its own symbols. */
-extern int init_module __P((const char * module_name,
- const void * contents, size_t contentssize,
- struct mod_routines * routines,
- struct symbol_table * symtab));
+extern int init_module __P ((__const char * module_name,
+ __const void * contents, size_t contentssize,
+ struct mod_routines * routines,
+ struct symbol_table * symtab));
/* Delete the module named MODULE_NAME from the kernel. */
-extern int delete_module __P((const char *module_name));
+extern int delete_module __P ((__const char *module_name));
#endif /* _SYS_MODULE_H */
diff --git a/sysdeps/unix/sysv/linux/sys/timex.h b/sysdeps/unix/sysv/linux/sys/timex.h
index fad47cd607..8543b0deae 100644
--- a/sysdeps/unix/sysv/linux/sys/timex.h
+++ b/sysdeps/unix/sysv/linux/sys/timex.h
@@ -1,4 +1,5 @@
-/* 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
modify it under the terms of the GNU Library General Public License as
@@ -15,10 +16,12 @@ 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 _SYS_TIMEX_H
-#define _SYS_TIMEX_H
+#ifndef _SYS_TIMEX_H
+#define _SYS_TIMEX_H 1
#include <features.h>
+
+#include <sys/time.h>
#include <linux/timex.h>
__BEGIN_DECLS