aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv/linux/powerpc/powerpc32
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv/linux/powerpc/powerpc32')
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc32/Dist1
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc32/Makefile3
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc32/Versions23
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc32/brk.S54
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc32/clone.S94
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc32/kernel_stat.h59
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc32/socket.S85
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc32/syscalls.list54
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h35
9 files changed, 408 insertions, 0 deletions
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/Dist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/Dist
new file mode 100644
index 0000000000..738b9cc542
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/Dist
@@ -0,0 +1 @@
+clone.S
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/Makefile b/sysdeps/unix/sysv/linux/powerpc/powerpc32/Makefile
new file mode 100644
index 0000000000..966a7689e2
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/Makefile
@@ -0,0 +1,3 @@
+ifeq ($(subdir),resource)
+sysdep_routines += oldgetrlimit64
+endif
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/Versions b/sysdeps/unix/sysv/linux/powerpc/powerpc32/Versions
new file mode 100644
index 0000000000..d0bf4a89c0
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/Versions
@@ -0,0 +1,23 @@
+libc {
+ GLIBC_2.0 {
+ # Exception handling support functions from libgcc
+ __register_frame; __register_frame_table; __deregister_frame;
+ __frame_state_for; __register_frame_info_table;
+ }
+ GLIBC_2.2 {
+ # functions used in other libraries
+ __xstat64; __fxstat64; __lxstat64;
+
+ # g*
+ glob64;
+
+ # New rlimit interface
+ getrlimit; setrlimit; getrlimit64; setrlimit64;
+
+ # r*
+ readdir64; readdir64_r;
+
+ # s*
+ scandir64;
+ }
+}
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/brk.S b/sysdeps/unix/sysv/linux/powerpc/powerpc32/brk.S
new file mode 100644
index 0000000000..8ecbb548a2
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/brk.S
@@ -0,0 +1,54 @@
+/* brk system call for Linux/ppc.
+ Copyright (C) 1995, 1996, 1997, 1999, 2000 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <sysdep.h>
+#define _ERRNO_H 1
+#include <bits/errno.h>
+#include <bp-sym.h>
+#include <bp-asm.h>
+
+ .comm __curbrk,4,4
+ .section ".text"
+ENTRY (BP_SYM (__brk))
+ DISCARD_BOUNDS (r3) /* the bounds are meaningless, so toss 'em */
+
+ stwu r1,-16(r1)
+ stw r3,8(r1)
+ DO_CALL(SYS_ify(brk))
+ lwz r6,8(r1)
+#ifdef PIC
+ mflr r4
+ bl _GLOBAL_OFFSET_TABLE_@local-4
+ mflr r5
+ lwz r5,__curbrk@got(r5)
+ mtlr r4
+ stw r3,0(r5)
+#else
+ lis r4,__curbrk@ha
+ stw r3,__curbrk@l(r4)
+#endif
+ cmplw r6,r3
+ addi r1,r1,16
+ li r3,0
+ blelr+
+ li r3,ENOMEM
+ b JUMPTARGET(__syscall_error)
+END (BP_SYM (__brk))
+
+weak_alias (BP_SYM (__brk), BP_SYM (brk))
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/clone.S b/sysdeps/unix/sysv/linux/powerpc/powerpc32/clone.S
new file mode 100644
index 0000000000..97849a5b26
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/clone.S
@@ -0,0 +1,94 @@
+/* Wrapper around clone system call.
+ Copyright (C) 1997,98,99,2000,02 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <sysdep.h>
+#define _ERRNO_H 1
+#include <bits/errno.h>
+#include <bp-sym.h>
+#include <bp-asm.h>
+
+/* This is the only really unusual system call in PPC linux, but not
+ because of any weirdness in the system call itself; because of
+ all the freaky stuff we have to do to make the call useful. */
+
+/* int [r3] clone(int (*fn)(void *arg) [r3], void *child_stack [r4],
+ int flags [r5], void *arg [r6]); */
+
+ENTRY (BP_SYM (__clone))
+ /* GKM FIXME: add bounds checks, where sensible. */
+ DISCARD_BOUNDS (r4)
+ DISCARD_BOUNDS (r6)
+
+ /* Check for child_stack == NULL || fn == NULL. */
+ cmpwi cr0,r4,0
+ cmpwi cr1,r3,0
+ cror cr0*4+eq,cr1*4+eq,cr0*4+eq
+ beq- cr0,L(badargs)
+
+ /* Set up stack frame for parent. */
+ stwu r1,-32(r1)
+ stmw r29,16(r1)
+
+ /* Set up stack frame for child. */
+ clrrwi r4,r4,4
+ li r0,0
+ stwu r0,-16(r4)
+
+ /* Save fn, args, stack across syscall. */
+ mr r29,r3 /* Function in r29. */
+ mr r30,r4 /* Stack pointer in r30. */
+ mr r31,r6 /* Argument in r31. */
+
+ /* 'flags' argument is first parameter to clone syscall. (The other
+ argument is the stack pointer, already in r4.) */
+ mr r3,r5
+
+ /* Do the call. */
+ DO_CALL(SYS_ify(clone))
+
+ /* Check for child process. */
+ cmpwi cr1,r3,0
+ crandc cr1*4+eq,cr1*4+eq,cr0*4+so
+ bne- cr1,L(parent) /* The '-' is to minimise the race. */
+
+ /* On at least mklinux DR3a5, clone() doesn't actually change
+ the stack pointer. I'm pretty sure this is a bug, because
+ it adds a race condition if a signal is sent to a thread
+ just after it is created (in the previous three instructions). */
+ mr r1,r30
+ /* Call procedure. */
+ mtctr r29
+ mr r3,r31
+ bctrl
+ /* Call _exit with result from procedure. */
+ b HIDDEN_JUMPTARGET(_exit)
+
+L(parent):
+ /* Parent. Restore registers & return. */
+ lmw r29,16(r1)
+ addi r1,r1,32
+ bnslr+
+ b JUMPTARGET(__syscall_error)
+
+L(badargs):
+ li r3,EINVAL
+ b JUMPTARGET(__syscall_error)
+END (BP_SYM (__clone))
+
+weak_alias (BP_SYM (__clone), BP_SYM (clone))
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/kernel_stat.h b/sysdeps/unix/sysv/linux/powerpc/powerpc32/kernel_stat.h
new file mode 100644
index 0000000000..a2db586165
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/kernel_stat.h
@@ -0,0 +1,59 @@
+/* Definition of `struct stat' used in the kernel.
+ Copyright (C) 1997, 2000 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+struct kernel_stat
+ {
+ unsigned int st_dev;
+ unsigned int st_ino;
+ unsigned int st_mode;
+ unsigned short st_nlink;
+ unsigned int st_uid;
+ unsigned int st_gid;
+ unsigned int st_rdev;
+ unsigned long int st_size;
+ unsigned long int st_blksize;
+ unsigned long int st_blocks;
+ unsigned long int st_atime;
+ unsigned long int __unused1;
+#define _HAVE___UNUSED1
+ unsigned long int st_mtime;
+ unsigned long int __unused2;
+#define _HAVE___UNUSED2
+ unsigned long int st_ctime;
+ unsigned long int __unused3;
+#define _HAVE___UNUSED3
+ unsigned long int __unused4;
+#define _HAVE___UNUSED4
+ unsigned long int __unused5;
+#define _HAVE___UNUSED5
+ };
+
+#define _HAVE_STAT___UNUSED1
+#define _HAVE_STAT___UNUSED2
+#define _HAVE_STAT___UNUSED3
+#define _HAVE_STAT___UNUSED4
+#define _HAVE_STAT___UNUSED5
+#define _HAVE_STAT___PAD1
+#define _HAVE_STAT___PAD2
+#define _HAVE_STAT64___UNUSED1
+#define _HAVE_STAT64___UNUSED2
+#define _HAVE_STAT64___UNUSED3
+#define _HAVE_STAT64___UNUSED4
+#define _HAVE_STAT64___UNUSED5
+#define _HAVE_STAT64___PAD2
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/socket.S b/sysdeps/unix/sysv/linux/powerpc/powerpc32/socket.S
new file mode 100644
index 0000000000..dbdccefe4c
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/socket.S
@@ -0,0 +1,85 @@
+/* Copyright (C) 1995, 1996, 1997, 1999 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <sysdep.h>
+#include <socketcall.h>
+
+#define P(a, b) P2(a, b)
+#define P2(a, b) a##b
+
+/* The socket-oriented system calls are handled unusally in Linux.
+ They are all gated through the single `socketcall' system call number.
+ `socketcall' takes two arguments: the first is the subcode, specifying
+ which socket function is being called; and the second is a pointer to
+ the arguments to the specific function.
+
+ The .S files for the other calls just #define socket and #include this.
+ They also #define a 'number-of-arguments' word in NARGS, which
+ defaults to 3. */
+
+#ifndef NARGS
+#ifdef socket
+#error NARGS not defined
+#endif
+#define NARGS 3
+#endif
+
+#define stackblock 20
+
+#ifndef __socket
+#define __socket P(__,socket)
+#endif
+
+ .text
+ENTRY(__socket)
+ stwu r1,-48(r1)
+#if NARGS >= 1
+ stw r3,stackblock(r1)
+#endif
+#if NARGS >= 2
+ stw r4,4+stackblock(r1)
+#endif
+#if NARGS >= 3
+ stw r5,8+stackblock(r1)
+#endif
+#if NARGS >= 4
+ stw r6,12+stackblock(r1)
+#endif
+#if NARGS >= 5
+ stw r7,16+stackblock(r1)
+#endif
+#if NARGS >= 6
+ stw r8,20+stackblock(r1)
+#endif
+#if NARGS >= 7
+ stw r9,24+stackblock(r1)
+#endif
+#if NARGS >= 8
+ stw r10,28+stackblock(r1)
+#endif
+#if NARGS >= 9
+#error too many arguments!
+#endif
+ li r3,P(SOCKOP_,socket)
+ addi r4,r1,stackblock
+ DO_CALL(SYS_ify(socketcall))
+ addi r1,r1,48
+ PSEUDO_RET
+PSEUDO_END (__socket)
+
+weak_alias (__socket, socket)
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/syscalls.list b/sysdeps/unix/sysv/linux/powerpc/powerpc32/syscalls.list
new file mode 100644
index 0000000000..434a9a1f7a
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/syscalls.list
@@ -0,0 +1,54 @@
+# File name Caller Syscall name # args Strong name Weak names
+
+# System calls with wrappers.
+s_ioctl ioctl ioctl i:iiI __syscall_ioctl
+s_ipc msgget ipc i:iiiip __syscall_ipc
+s_llseek llseek _llseek i:iiipi __syscall__llseek
+s_readahead readahead readahead i:iiii __syscall_readahead
+s_chown chown chown i:sii __syscall_chown
+s_execve execve execve i:spp __syscall_execve
+rt_sigaction - rt_sigaction i:ippi __syscall_rt_sigaction
+rt_sigpending - rt_sigpending i:pi __syscall_rt_sigpending
+rt_sigprocmask - rt_sigprocmask i:ippi __syscall_rt_sigprocmask
+rt_sigqueueinfo - rt_sigqueueinfo i:iip __syscall_rt_sigqueueinfo
+rt_sigsuspend - rt_sigsuspend i:pi __syscall_rt_sigsuspend
+rt_sigtimedwait - rt_sigtimedwait i:pppi __syscall_rt_sigtimedwait
+s_fcntl fcntl fcntl i:iiF __syscall_fcntl
+s_fcntl64 fcntl64 fcntl64 i:iiF __syscall_fcntl64
+s_fstat64 fxstat64 fstat64 i:ip __syscall_fstat64
+s_ftruncate64 ftruncate64 ftruncate64 i:iii __syscall_ftruncate64
+s_getcwd getcwd getcwd i:pi __syscall_getcwd
+s_getdents getdents getdents i:ipi __syscall_getdents
+s_getdents64 getdents getdents64 i:ipi __syscall_getdents64
+s_getpmsg getpmsg getpmsg i:ipppp __syscall_getpmsg
+s_getpriority getpriority getpriority i:ii __syscall_getpriority
+getresgid - getresgid i:ppp getresgid
+getresuid - getresuid i:ppp getresuid
+s_getrlimit getrlimit getrlimit i:ip __syscall_getrlimit
+s_lstat64 lxstat64 lstat64 i:sp __syscall_lstat64
+s_mmap2 mmap64 mmap2 b:aniiii __syscall_mmap2
+s_poll poll poll i:pii __syscall_poll
+s_pread64 pread64 pread i:ibnii __syscall_pread
+s_ptrace ptrace ptrace i:iipp __syscall_ptrace
+s_putpmsg putpmsg putpmsg i:ippii __syscall_putpmsg
+s_pwrite64 pwrite64 pwrite i:ibnii __syscall_pwrite
+s_reboot reboot reboot i:iii __syscall_reboot
+s_setrlimit setrlimit setrlimit i:ip __syscall_setrlimit
+s_sigaction sigaction sigaction i:ipp __syscall_sigaction
+s_sigpending sigpending sigpending i:p __syscall_sigpending
+s_sigprocmask sigprocmask sigprocmask i:ipp __syscall_sigprocmask
+s_sigsuspend sigsuspend sigsuspend i:iii __syscall_sigsuspend
+s_stat64 xstat64 stat64 i:sp __syscall_stat64
+s_sysctl sysctl _sysctl i:p __syscall__sysctl
+s_truncate64 truncate64 truncate64 i:sii __syscall_truncate64
+s_ugetrlimit getrlimit ugetrlimit i:ip __syscall_ugetrlimit
+s_ustat ustat ustat i:ip __syscall_ustat
+s_vfork vfork vfork i: __syscall_vfork
+sys_fstat fxstat fstat i:ip __syscall_fstat
+sys_lstat lxstat lstat i:sp __syscall_lstat
+sys_mknod xmknod mknod i:pii __syscall_mknod
+sys_readv readv readv i:ipi __syscall_readv
+sys_stat xstat stat i:sp __syscall_stat
+sys_writev writev writev i:ipi __syscall_writev
+oldgetrlimit EXTRA getrlimit i:ip __old_getrlimit getrlimit@GLIBC_2.0
+oldsetrlimit EXTRA setrlimit i:ip __old_setrlimit setrlimit@GLIBC_2.0
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h b/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h
new file mode 100644
index 0000000000..78ff4edcc6
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h
@@ -0,0 +1,35 @@
+/* Copyright (C) 1992,1997,1998,1999,2000,2001 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#ifndef _LINUX_POWERPC_SYSDEP_H
+#define _LINUX_POWERPC_SYSDEP_H 1
+
+#include <sysdeps/unix/powerpc/sysdep.h>
+
+/* For Linux we can use the system call table in the header file
+ /usr/include/asm/unistd.h
+ of the kernel. But these symbols do not follow the SYS_* syntax
+ so we have to redefine the `SYS_ify' macro here. */
+#undef SYS_ify
+#ifdef __STDC__
+# define SYS_ify(syscall_name) __NR_##syscall_name
+#else
+# define SYS_ify(syscall_name) __NR_/**/syscall_name
+#endif
+
+#endif /* linux/powerpc/sysdep.h */