diff options
Diffstat (limited to 'sysdeps/unix')
-rw-r--r-- | sysdeps/unix/sysv/linux/alpha/clone.S | 118 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/direntry.h | 22 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/ftime.c | 3 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/i386/clone.S | 80 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/m68k/resourcebits.h | 3 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sys/acct.h | 3 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sys/io.h | 13 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sys/klog.h | 26 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sys/module.h | 23 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sys/timex.h | 9 |
10 files changed, 277 insertions, 23 deletions
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 |