summaryrefslogtreecommitdiff
path: root/ports/sysdeps/unix/sysv/linux
diff options
context:
space:
mode:
Diffstat (limited to 'ports/sysdeps/unix/sysv/linux')
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/Makefile3
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/bits/fcntl.h179
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/bits/mman.h97
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/brk.c46
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/chown.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/clone.S81
-rwxr-xr-xports/sysdeps/unix/sysv/linux/am33/configure4
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/configure.in4
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/fchown.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/fcntl.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/fxstat.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/getegid.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/geteuid.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/getgid.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/getgroups.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/getmsg.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/getresgid.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/getresuid.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/getrlimit.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/getuid.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/lchown.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/linuxthreads/sysdep-cancel.h159
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/lockf64.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/lxstat.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/profil-counter.h27
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/putmsg.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/setegid.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/seteuid.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/setfsgid.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/setfsuid.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/setgid.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/setgroups.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/setregid.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/setresgid.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/setresuid.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/setreuid.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/setrlimit.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/setuid.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/socket.S73
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/syscall.S43
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/sysdep.S42
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/sysdep.h317
-rw-r--r--ports/sysdeps/unix/sysv/linux/am33/xstat.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/Dist5
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/_G_config.h106
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/bits/fcntl.h189
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/bits/mman.h97
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/brk.c44
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/chown.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/clone.S88
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/fchown.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/fcntl.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/fxstat.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/getegid.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/geteuid.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/getgid.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/getgroups.c2
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/getresgid.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/getresuid.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/getrlimit.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/getrlimit64.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/getuid.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/lchown.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/lockf64.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/lxstat.c2
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/mmap.S68
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/mmap64.S91
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/msgctl.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/profil-counter.h26
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/register-dump.h117
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/semctl.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/setegid.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/seteuid.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/setfsgid.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/setfsuid.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/setgid.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/setgroups.c2
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/setregid.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/setresgid.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/setresuid.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/setreuid.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/setrlimit.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/setuid.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/shmctl.c1
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/socket.S96
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/sys/ucontext.h56
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/syscall.S40
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/sysdep.S66
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/sysdep.h226
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/vfork.S27
-rw-r--r--ports/sysdeps/unix/sysv/linux/cris/xstat.c1
91 files changed, 2482 insertions, 0 deletions
diff --git a/ports/sysdeps/unix/sysv/linux/am33/Makefile b/ports/sysdeps/unix/sysv/linux/am33/Makefile
new file mode 100644
index 000000000..ece39e8a4
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/Makefile
@@ -0,0 +1,3 @@
+ifeq ($(subdir),misc)
+sysdep_routines += setfsgid setfsuid
+endif
diff --git a/ports/sysdeps/unix/sysv/linux/am33/bits/fcntl.h b/ports/sysdeps/unix/sysv/linux/am33/bits/fcntl.h
new file mode 100644
index 000000000..4c276c548
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/bits/fcntl.h
@@ -0,0 +1,179 @@
+/* O_*, F_*, FD_* bit values for Linux.
+ Copyright (C) 1995, 1996, 1997, 1998, 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 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 _FCNTL_H
+# error "Never use <bits/fcntl.h> directly; include <fcntl.h> instead."
+#endif
+
+
+#include <sys/types.h>
+
+/* open/fcntl - O_SYNC is only implemented on blocks devices and on files
+ located on an ext2 file system */
+#define O_ACCMODE 0003
+#define O_RDONLY 00
+#define O_WRONLY 01
+#define O_RDWR 02
+#define O_CREAT 0100 /* not fcntl */
+#define O_EXCL 0200 /* not fcntl */
+#define O_NOCTTY 0400 /* not fcntl */
+#define O_TRUNC 01000 /* not fcntl */
+#define O_APPEND 02000
+#define O_NONBLOCK 04000
+#define O_NDELAY O_NONBLOCK
+#define O_SYNC 010000
+#define O_FSYNC O_SYNC
+#define O_ASYNC 020000
+
+#ifdef __USE_GNU
+# define O_DIRECT 040000 /* Direct disk access. */
+# define O_DIRECTORY 0200000 /* Must be a directory. */
+# define O_NOFOLLOW 0400000 /* Do not follow links. */
+#endif
+
+/* For now Linux has synchronisity options for data and read operations.
+ We define the symbols here but let them do the same as O_SYNC since
+ this is a superset. */
+#if defined __USE_POSIX199309 || defined __USE_UNIX98
+# define O_DSYNC O_SYNC /* Synchronize data. */
+# define O_RSYNC O_SYNC /* Synchronize read operations. */
+#endif
+
+#ifdef __USE_LARGEFILE64
+# define O_LARGEFILE 0100000
+#endif
+
+/* Values for the second argument to `fcntl'. */
+#define F_DUPFD 0 /* Duplicate file descriptor. */
+#define F_GETFD 1 /* Get file descriptor flags. */
+#define F_SETFD 2 /* Set file descriptor flags. */
+#define F_GETFL 3 /* Get file status flags. */
+#define F_SETFL 4 /* Set file status flags. */
+#ifndef __USE_FILE_OFFSET64
+# define F_GETLK 5 /* Get record locking info. */
+# define F_SETLK 6 /* Set record locking info (non-blocking). */
+# define F_SETLKW 7 /* Set record locking info (blocking). */
+#else
+# define F_GETLK F_GETLK64 /* Get record locking info. */
+# define F_SETLK F_SETLK64 /* Set record locking info (non-blocking).*/
+# define F_SETLKW F_SETLKW64 /* Set record locking info (blocking). */
+#endif
+#define F_GETLK64 12 /* Get record locking info. */
+#define F_SETLK64 13 /* Set record locking info (non-blocking). */
+#define F_SETLKW64 14 /* Set record locking info (blocking). */
+
+#if defined __USE_BSD || defined __USE_XOPEN2K
+# define F_SETOWN 8 /* Get owner of socket (receiver of SIGIO). */
+# define F_GETOWN 9 /* Set owner of socket (receiver of SIGIO). */
+#endif
+
+#ifdef __USE_GNU
+# define F_SETSIG 10 /* Set number of signal to be sent. */
+# define F_GETSIG 11 /* Get number of signal to be sent. */
+#endif
+
+#ifdef __USE_GNU
+# define F_SETLEASE 1024 /* Set a lease. */
+# define F_GETLEASE 1025 /* Enquire what lease is active. */
+# define F_NOTIFY 1026 /* Request notfications on a directory. */
+#endif
+
+/* For F_[GET|SET]FL. */
+#define FD_CLOEXEC 1 /* actually anything with low bit set goes */
+
+/* For posix fcntl() and `l_type' field of a `struct flock' for lockf(). */
+#define F_RDLCK 0 /* Read lock. */
+#define F_WRLCK 1 /* Write lock. */
+#define F_UNLCK 2 /* Remove lock. */
+
+/* For old implementation of bsd flock(). */
+#define F_EXLCK 4 /* or 3 */
+#define F_SHLCK 8 /* or 4 */
+
+#ifdef __USE_BSD
+/* Operations for bsd flock(), also used by the kernel implementation. */
+# define LOCK_SH 1 /* shared lock */
+# define LOCK_EX 2 /* exclusive lock */
+# define LOCK_NB 4 /* or'd with one of the above to prevent
+ blocking */
+# define LOCK_UN 8 /* remove lock */
+#endif
+
+#ifdef __USE_GNU
+# define LOCK_MAND 32 /* This is a mandatory flock: */
+# define LOCK_READ 64 /* ... which allows concurrent read operations. */
+# define LOCK_WRITE 128 /* ... which allows concurrent write operations. */
+# define LOCK_RW 192 /* ... Which allows concurrent read & write operations. */
+#endif
+
+#ifdef __USE_GNU
+/* Types of directory notifications that may be requested with F_NOTIFY. */
+# define DN_ACCESS 0x00000001 /* File accessed. */
+# define DN_MODIFY 0x00000002 /* File modified. */
+# define DN_CREATE 0x00000004 /* File created. */
+# define DN_DELETE 0x00000008 /* File removed. */
+# define DN_RENAME 0x00000010 /* File renamed. */
+# define DN_ATTRIB 0x00000020 /* File changed attibutes. */
+# define DN_MULTISHOT 0x80000000 /* Don't remove notifier. */
+#endif
+
+struct flock
+ {
+ short int l_type; /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK. */
+ short int l_whence; /* Where `l_start' is relative to (like `lseek'). */
+#ifndef __USE_FILE_OFFSET64
+ __off_t l_start; /* Offset where the lock begins. */
+ __off_t l_len; /* Size of the locked area; zero means until EOF. */
+#else
+ __off64_t l_start; /* Offset where the lock begins. */
+ __off64_t l_len; /* Size of the locked area; zero means until EOF. */
+#endif
+ __pid_t l_pid; /* Process holding the lock. */
+ };
+
+#ifdef __USE_LARGEFILE64
+struct flock64
+ {
+ short int l_type; /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK. */
+ short int l_whence; /* Where `l_start' is relative to (like `lseek'). */
+ __off64_t l_start; /* Offset where the lock begins. */
+ __off64_t l_len; /* Size of the locked area; zero means until EOF. */
+ __pid_t l_pid; /* Process holding the lock. */
+ };
+#endif
+
+/* Define some more compatibility macros to be backward compatible with
+ BSD systems which did not managed to hide these kernel macros. */
+#ifdef __USE_BSD
+# define FAPPEND O_APPEND
+# define FFSYNC O_FSYNC
+# define FASYNC O_ASYNC
+# define FNONBLOCK O_NONBLOCK
+# define FNDELAY O_NDELAY
+#endif /* Use BSD. */
+
+/* Advise to `posix_fadvise'. */
+#ifdef __USE_XOPEN2K
+# define POSIX_FADV_NORMAL 0 /* No further special treatment. */
+# define POSIX_FADV_RANDOM 1 /* Expect random page references. */
+# define POSIX_FADV_SEQUENTIAL 2 /* Expect sequential page references. */
+# define POSIX_FADV_WILLNEED 3 /* Will need these pages. */
+# define POSIX_FADV_DONTNEED 4 /* Don't need these pages. */
+# define POSIX_FADV_NOREUSE 5 /* Data will be accessed once. */
+#endif
diff --git a/ports/sysdeps/unix/sysv/linux/am33/bits/mman.h b/ports/sysdeps/unix/sysv/linux/am33/bits/mman.h
new file mode 100644
index 000000000..99fceda88
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/bits/mman.h
@@ -0,0 +1,97 @@
+/* Definitions for POSIX memory map interface. Linux/AM33 version.
+ Copyright (C) 1997, 2000, 2001, 2004 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 _SYS_MMAN_H
+# error "Never use <bits/mman.h> directly; include <sys/mman.h> instead."
+#endif
+
+/* The following definitions basically come from the kernel headers.
+ But the kernel header is not namespace clean. */
+
+
+/* Protections are chosen from these bits, OR'd together. The
+ implementation does not necessarily support PROT_EXEC or PROT_WRITE
+ without PROT_READ. The only guarantees are that no writing will be
+ allowed without PROT_WRITE and no access will be allowed for PROT_NONE. */
+
+#define PROT_READ 0x1 /* Page can be read. */
+#define PROT_WRITE 0x2 /* Page can be written. */
+#define PROT_EXEC 0x4 /* Page can be executed. */
+#define PROT_NONE 0x0 /* Page can not be accessed. */
+#define PROT_GROWSDOWN 0x01000000 /* Extend change to start of
+ growsdown vma (mprotect only). */
+#define PROT_GROWSUP 0x02000000 /* Extend change to start of
+ growsup vma (mprotect only). */
+
+/* Sharing types (must choose one and only one of these). */
+#define MAP_SHARED 0x01 /* Share changes. */
+#define MAP_PRIVATE 0x02 /* Changes are private. */
+#ifdef __USE_MISC
+# define MAP_TYPE 0x0f /* Mask for type of mapping. */
+#endif
+
+/* Other flags. */
+#define MAP_FIXED 0x10 /* Interpret addr exactly. */
+#ifdef __USE_MISC
+# define MAP_FILE 0
+# define MAP_ANONYMOUS 0x20 /* Don't use a file. */
+# define MAP_ANON MAP_ANONYMOUS
+#endif
+
+/* These are Linux-specific. */
+#ifdef __USE_MISC
+# define MAP_GROWSDOWN 0x0100 /* Stack-like segment. */
+# define MAP_DENYWRITE 0x0800 /* ETXTBSY */
+# define MAP_EXECUTABLE 0x1000 /* Mark it as an executable. */
+# define MAP_LOCKED 0x2000 /* Lock the mapping. */
+# define MAP_NORESERVE 0x4000 /* Don't check for reservations. */
+#endif
+
+/* Flags to `msync'. */
+#define MS_ASYNC 1 /* Sync memory asynchronously. */
+#define MS_SYNC 4 /* Synchronous memory sync. */
+#define MS_INVALIDATE 2 /* Invalidate the caches. */
+
+/* Flags for `mlockall'. */
+#define MCL_CURRENT 1 /* Lock all currently mapped pages. */
+#define MCL_FUTURE 2 /* Lock all additions to address
+ space. */
+
+/* Flags for `mremap'. */
+#ifdef __USE_GNU
+# define MREMAP_MAYMOVE 1
+#endif
+
+/* Advice to `madvise'. */
+#ifdef __USE_BSD
+# define MADV_NORMAL 0 /* No further special treatment. */
+# define MADV_RANDOM 1 /* Expect random page references. */
+# define MADV_SEQUENTIAL 2 /* Expect sequential page references. */
+# define MADV_WILLNEED 3 /* Will need these pages. */
+# define MADV_DONTNEED 4 /* Don't need these pages. */
+#endif
+
+/* The POSIX people had to invent similar names for the same things. */
+#ifdef __USE_XOPEN2K
+# define POSIX_MADV_NORMAL 0 /* No further special treatment. */
+# define POSIX_MADV_RANDOM 1 /* Expect random page references. */
+# define POSIX_MADV_SEQUENTIAL 2 /* Expect sequential page references. */
+# define POSIX_MADV_WILLNEED 3 /* Will need these pages. */
+# define POSIX_MADV_DONTNEED 4 /* Don't need these pages. */
+#endif
diff --git a/ports/sysdeps/unix/sysv/linux/am33/brk.c b/ports/sysdeps/unix/sysv/linux/am33/brk.c
new file mode 100644
index 000000000..f56736359
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/brk.c
@@ -0,0 +1,46 @@
+/* brk system call for Linux/am33.
+ Copyright (C) 1995, 1996, 2000 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Alexandre Oliva <aoliva@redhat.com>.
+ Based on ../i386/brk.c.
+
+ 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. */
+
+#include <errno.h>
+#include <unistd.h>
+#include <sysdep.h>
+
+/* This must be initialized data because commons can't have aliases. */
+void *__curbrk = 0;
+
+int
+__brk (void *addr)
+{
+ void *newbrk;
+
+ newbrk = INLINE_SYSCALL (brk, 1, __ptrvalue (addr));
+
+ __curbrk = newbrk;
+
+ if (newbrk < addr)
+ {
+ __set_errno (ENOMEM);
+ return -1;
+ }
+
+ return 0;
+}
+weak_alias (__brk, brk)
diff --git a/ports/sysdeps/unix/sysv/linux/am33/chown.c b/ports/sysdeps/unix/sysv/linux/am33/chown.c
new file mode 100644
index 000000000..819923eb4
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/chown.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/chown.c>
diff --git a/ports/sysdeps/unix/sysv/linux/am33/clone.S b/ports/sysdeps/unix/sysv/linux/am33/clone.S
new file mode 100644
index 000000000..26ba740d2
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/clone.S
@@ -0,0 +1,81 @@
+/* Copyright 2001 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Alexandre Oliva <aoliva@redhat.com>.
+ Based on ../i386/clone.S.
+
+ 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. */
+
+/* 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>
+#define _ERRNO_H 1
+#include <bits/errno.h>
+#include <asm-syntax.h>
+#include <bp-sym.h>
+
+/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg); */
+
+ .text
+ENTRY (BP_SYM (__clone))
+ /* Sanity check arguments. */
+ cmp 0,d0 /* no NULL function pointers */
+ beq L(error_inval)
+ cmp 0,d1 /* no NULL stack pointers */
+ beq L(error_inval)
+
+ /* Allocate room for a function call in the new stack, and
+ store fn and arg in it. They will be read back in
+ thread_start. */
+ mov d1,a0
+ sub 12,a0
+ mov d0,(a0)
+ mov (16,sp),d1
+ mov d1,(4,a0)
+
+ /* Do the system call */
+ mov a0,d1
+ mov (12,sp),a0
+ mov SYS_ify(clone),d0
+ syscall 0
+
+ cmp 0,d0
+ beq thread_start
+ blt L(to_SYSCALL_ERROR_LABEL)
+
+L(pseudo_end):
+ ret
+
+L(error_inval):
+ mov -EINVAL,d0
+L(to_SYSCALL_ERROR_LABEL):
+ jmp SYSCALL_ERROR_LABEL
+
+thread_start:
+ mov 0,a3 /* terminate the stack frame */
+ mov (4,sp),d0
+ mov (sp),a0
+ calls (a0)
+#ifdef PIC
+L(here):
+ mov pc,a2
+ add _GLOBAL_OFFSET_TABLE_-(L(here) - .),a2
+#endif
+ call JUMPTARGET (_exit),[],0
+
+PSEUDO_END (BP_SYM (__clone))
+
+weak_alias (BP_SYM (__clone), BP_SYM (clone))
diff --git a/ports/sysdeps/unix/sysv/linux/am33/configure b/ports/sysdeps/unix/sysv/linux/am33/configure
new file mode 100755
index 000000000..d4490122b
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/configure
@@ -0,0 +1,4 @@
+# This file is generated from configure.in by Autoconf. DO NOT EDIT!
+ # Local configure fragment for am33/sysdeps/unix/sysv/linux/am33
+
+arch_minimum_kernel=2.4.0
diff --git a/ports/sysdeps/unix/sysv/linux/am33/configure.in b/ports/sysdeps/unix/sysv/linux/am33/configure.in
new file mode 100644
index 000000000..a94c370cf
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/configure.in
@@ -0,0 +1,4 @@
+GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
+# Local configure fragment for am33/sysdeps/unix/sysv/linux/am33
+
+arch_minimum_kernel=2.4.0
diff --git a/ports/sysdeps/unix/sysv/linux/am33/fchown.c b/ports/sysdeps/unix/sysv/linux/am33/fchown.c
new file mode 100644
index 000000000..3a69ecc9e
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/fchown.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/fchown.c>
diff --git a/ports/sysdeps/unix/sysv/linux/am33/fcntl.c b/ports/sysdeps/unix/sysv/linux/am33/fcntl.c
new file mode 100644
index 000000000..ea951bc4f
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/fcntl.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/fcntl.c>
diff --git a/ports/sysdeps/unix/sysv/linux/am33/fxstat.c b/ports/sysdeps/unix/sysv/linux/am33/fxstat.c
new file mode 100644
index 000000000..4f219f0b9
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/fxstat.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/fxstat.c>
diff --git a/ports/sysdeps/unix/sysv/linux/am33/getegid.c b/ports/sysdeps/unix/sysv/linux/am33/getegid.c
new file mode 100644
index 000000000..37b4b4a53
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/getegid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getegid.c>
diff --git a/ports/sysdeps/unix/sysv/linux/am33/geteuid.c b/ports/sysdeps/unix/sysv/linux/am33/geteuid.c
new file mode 100644
index 000000000..ebcb555b5
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/geteuid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/geteuid.c>
diff --git a/ports/sysdeps/unix/sysv/linux/am33/getgid.c b/ports/sysdeps/unix/sysv/linux/am33/getgid.c
new file mode 100644
index 000000000..0a4d6061f
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/getgid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getgid.c>
diff --git a/ports/sysdeps/unix/sysv/linux/am33/getgroups.c b/ports/sysdeps/unix/sysv/linux/am33/getgroups.c
new file mode 100644
index 000000000..20a716610
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/getgroups.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getgroups.c>
diff --git a/ports/sysdeps/unix/sysv/linux/am33/getmsg.c b/ports/sysdeps/unix/sysv/linux/am33/getmsg.c
new file mode 100644
index 000000000..3a1fa0852
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/getmsg.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getmsg.c>
diff --git a/ports/sysdeps/unix/sysv/linux/am33/getresgid.c b/ports/sysdeps/unix/sysv/linux/am33/getresgid.c
new file mode 100644
index 000000000..b703a414c
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/getresgid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getresgid.c>
diff --git a/ports/sysdeps/unix/sysv/linux/am33/getresuid.c b/ports/sysdeps/unix/sysv/linux/am33/getresuid.c
new file mode 100644
index 000000000..0b14cefe3
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/getresuid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getresuid.c>
diff --git a/ports/sysdeps/unix/sysv/linux/am33/getrlimit.c b/ports/sysdeps/unix/sysv/linux/am33/getrlimit.c
new file mode 100644
index 000000000..fc06dbd64
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/getrlimit.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getrlimit.c>
diff --git a/ports/sysdeps/unix/sysv/linux/am33/getuid.c b/ports/sysdeps/unix/sysv/linux/am33/getuid.c
new file mode 100644
index 000000000..d682c79a4
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/getuid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getuid.c>
diff --git a/ports/sysdeps/unix/sysv/linux/am33/lchown.c b/ports/sysdeps/unix/sysv/linux/am33/lchown.c
new file mode 100644
index 000000000..c89de99ba
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/lchown.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/lchown.c>
diff --git a/ports/sysdeps/unix/sysv/linux/am33/linuxthreads/sysdep-cancel.h b/ports/sysdeps/unix/sysv/linux/am33/linuxthreads/sysdep-cancel.h
new file mode 100644
index 000000000..56d3bb62f
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/linuxthreads/sysdep-cancel.h
@@ -0,0 +1,159 @@
+/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Alexandre Oliva <aoliva@redhat.com>
+
+ 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 <tls.h>
+#include <pt-machine.h>
+#ifndef __ASSEMBLER__
+# include <linuxthreads/internals.h>
+#endif
+
+#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
+
+# undef PSEUDO
+# define PSEUDO(name, syscall_name, args) \
+ .text ; \
+ ENTRY (name) \
+ PUSHARGS_##args \
+ DOARGS_##args \
+ SINGLE_THREAD_P; \
+ bne L(pseudo_cancel); \
+ mov SYS_ify (syscall_name),d0; \
+ syscall 0 \
+ POPARGS_##args ; \
+ cmp -126,d0; \
+ bls L(pseudo_end); \
+ jmp SYSCALL_ERROR_LABEL; \
+ L(pseudo_cancel): \
+ add -(16+STACK_SPACE (args)),sp; \
+ SAVE_ARGS_##args \
+ CENABLE \
+ mov d0,r0; \
+ LOAD_ARGS_##args \
+ mov SYS_ify (syscall_name),d0; \
+ syscall 0; \
+ mov d0,(12,sp); \
+ mov r0,d0; \
+ CDISABLE \
+ mov (12,sp),d0; \
+ add +16+STACK_SPACE (args),sp \
+ POPARGS_##args ; \
+ cmp -126,d0; \
+ bls L(pseudo_end); \
+ jmp SYSCALL_ERROR_LABEL; \
+ L(pseudo_end): \
+ mov d0,a0
+
+/* Reserve up to 2 stack slots for a0 and d1, but fewer than that if
+ we don't have that many arguments. */
+# define STACK_SPACE(n) (((((n) < 3) * (2 - (n))) + 2) * 4)
+
+# define SAVE_ARGS_0
+# define SAVE_ARGS_1 mov a0,(20,sp) ;
+# define SAVE_ARGS_2 SAVE_ARGS_1 mov d1,(24,sp) ;
+# define SAVE_ARGS_3 SAVE_ARGS_2
+# define SAVE_ARGS_4 SAVE_ARGS_3
+# define SAVE_ARGS_5 SAVE_ARGS_4
+# define SAVE_ARGS_6 SAVE_ARGS_5
+
+# define LOAD_ARGS_0
+# define LOAD_ARGS_1 mov (20,sp),a0 ;
+# define LOAD_ARGS_2 LOAD_ARGS_1 mov (24,sp),d1 ;
+# define LOAD_ARGS_3 LOAD_ARGS_2
+# define LOAD_ARGS_4 LOAD_ARGS_3
+# define LOAD_ARGS_5 LOAD_ARGS_4
+# define LOAD_ARGS_6 LOAD_ARGS_5
+
+# ifdef IS_IN_libpthread
+# define CENABLE call __pthread_enable_asynccancel,[],0;
+# define CDISABLE call __pthread_disable_asynccancel,[],0;
+# elif defined IS_IN_librt
+# ifdef PIC
+# define CENABLE movm [a2],(sp); \
+ 1: mov pc,a2; \
+ add _GLOBAL_OFFSET_TABLE_-(1b-.),a2; \
+ call +__librt_enable_asynccancel@PLT,[],0; \
+ movm (sp),[a2];
+# define CENABLE movm [a2],(sp); \
+ 1: mov pc,a2; \
+ add _GLOBAL_OFFSET_TABLE_-(1b-.),a2; \
+ call +__librt_disable_asynccancel@PLT,[],0; \
+ movm (sp),[a2];
+# else
+# define CENABLE call +__librt_enable_asynccancel,[],0;
+# define CDISABLE call +__librt_disable_asynccancel,[],0;
+# endif
+# else
+# define CENABLE call +__libc_enable_asynccancel,[],0;
+# define CDISABLE call +__libc_disable_asynccancel,[],0;
+# endif
+
+#if !defined NOT_IN_libc
+# define __local_multiple_threads __libc_multiple_threads
+#elif defined IS_IN_libpthread
+# define __local_multiple_threads __pthread_multiple_threads
+#else
+# define __local_multiple_threads __librt_multiple_threads
+#endif
+
+# ifndef __ASSEMBLER__
+# if defined FLOATING_STACKS && USE___THREAD && defined PIC
+# define SINGLE_THREAD_P \
+ __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
+ p_header.data.multiple_threads) == 0, 1)
+# else
+extern int __local_multiple_threads
+# if !defined NOT_IN_libc || defined IS_IN_libpthread
+ attribute_hidden;
+# else
+ ;
+# endif
+# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
+# endif
+# else
+# if !defined PIC
+# define SINGLE_THREAD_P \
+ mov (+__local_multiple_threads),d0; \
+ cmp 0,d0
+# elif !defined NOT_IN_libc || defined IS_IN_libpthread
+# define SINGLE_THREAD_P \
+ movm [a2],(sp); \
+ 1: mov pc,a2; \
+ add _GLOBAL_OFFSET_TABLE_-(1b-.),a2; \
+ mov (+__local_multiple_threads@GOTOFF,a2),d0; \
+ movm (sp),[a2]; \
+ cmp 0,d0
+# else
+# define SINGLE_THREAD_P \
+ movm [a2],(sp); \
+ 1: mov pc,a2; \
+ add _GLOBAL_OFFSET_TABLE_-(1b-.),a2; \
+ mov (+__local_multiple_threads@GOT,a2),a2; \
+ mov (a2),d0; \
+ movm (sp),[a2]; \
+ cmp 0,d0
+# endif
+# endif
+
+#elif !defined __ASSEMBLER__
+
+/* This code should never be used but we define it anyhow. */
+# define SINGLE_THREAD_P (1)
+
+#endif
diff --git a/ports/sysdeps/unix/sysv/linux/am33/lockf64.c b/ports/sysdeps/unix/sysv/linux/am33/lockf64.c
new file mode 100644
index 000000000..a88f5a784
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/lockf64.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/lockf64.c>
diff --git a/ports/sysdeps/unix/sysv/linux/am33/lxstat.c b/ports/sysdeps/unix/sysv/linux/am33/lxstat.c
new file mode 100644
index 000000000..0efa0aea4
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/lxstat.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/lxstat.c>
diff --git a/ports/sysdeps/unix/sysv/linux/am33/profil-counter.h b/ports/sysdeps/unix/sysv/linux/am33/profil-counter.h
new file mode 100644
index 000000000..31422bb7e
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/profil-counter.h
@@ -0,0 +1,27 @@
+/* Low-level statistical profiling support function. Linux/am33 version.
+ Copyright (C) 1996, 1997, 1998, 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 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. */
+
+#include <signal.h>
+#include <sigcontextinfo.h>
+
+static void
+profil_counter (int signo, SIGCONTEXT scp)
+{
+ profil_count ((void *) GET_PC (scp));
+}
diff --git a/ports/sysdeps/unix/sysv/linux/am33/putmsg.c b/ports/sysdeps/unix/sysv/linux/am33/putmsg.c
new file mode 100644
index 000000000..ebc1680ca
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/putmsg.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/putmsg.c>
diff --git a/ports/sysdeps/unix/sysv/linux/am33/setegid.c b/ports/sysdeps/unix/sysv/linux/am33/setegid.c
new file mode 100644
index 000000000..2e3a54c89
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/setegid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setegid.c>
diff --git a/ports/sysdeps/unix/sysv/linux/am33/seteuid.c b/ports/sysdeps/unix/sysv/linux/am33/seteuid.c
new file mode 100644
index 000000000..18e41d08c
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/seteuid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/seteuid.c>
diff --git a/ports/sysdeps/unix/sysv/linux/am33/setfsgid.c b/ports/sysdeps/unix/sysv/linux/am33/setfsgid.c
new file mode 100644
index 000000000..088671256
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/setfsgid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setfsgid.c>
diff --git a/ports/sysdeps/unix/sysv/linux/am33/setfsuid.c b/ports/sysdeps/unix/sysv/linux/am33/setfsuid.c
new file mode 100644
index 000000000..a9f22eb8a
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/setfsuid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setfsuid.c>
diff --git a/ports/sysdeps/unix/sysv/linux/am33/setgid.c b/ports/sysdeps/unix/sysv/linux/am33/setgid.c
new file mode 100644
index 000000000..377021d9e
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/setgid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setgid.c>
diff --git a/ports/sysdeps/unix/sysv/linux/am33/setgroups.c b/ports/sysdeps/unix/sysv/linux/am33/setgroups.c
new file mode 100644
index 000000000..cb9a7708e
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/setgroups.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setgroups.c>
diff --git a/ports/sysdeps/unix/sysv/linux/am33/setregid.c b/ports/sysdeps/unix/sysv/linux/am33/setregid.c
new file mode 100644
index 000000000..99c57ad20
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/setregid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setregid.c>
diff --git a/ports/sysdeps/unix/sysv/linux/am33/setresgid.c b/ports/sysdeps/unix/sysv/linux/am33/setresgid.c
new file mode 100644
index 000000000..daca1a483
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/setresgid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setresgid.c>
diff --git a/ports/sysdeps/unix/sysv/linux/am33/setresuid.c b/ports/sysdeps/unix/sysv/linux/am33/setresuid.c
new file mode 100644
index 000000000..3aeabe9ad
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/setresuid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setresuid.c>
diff --git a/ports/sysdeps/unix/sysv/linux/am33/setreuid.c b/ports/sysdeps/unix/sysv/linux/am33/setreuid.c
new file mode 100644
index 000000000..8ad61226e
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/setreuid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setreuid.c>
diff --git a/ports/sysdeps/unix/sysv/linux/am33/setrlimit.c b/ports/sysdeps/unix/sysv/linux/am33/setrlimit.c
new file mode 100644
index 000000000..bfaef74c3
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/setrlimit.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setrlimit.c>
diff --git a/ports/sysdeps/unix/sysv/linux/am33/setuid.c b/ports/sysdeps/unix/sysv/linux/am33/setuid.c
new file mode 100644
index 000000000..de394379b
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/setuid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setuid.c>
diff --git a/ports/sysdeps/unix/sysv/linux/am33/socket.S b/ports/sysdeps/unix/sysv/linux/am33/socket.S
new file mode 100644
index 000000000..2c09239f3
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/socket.S
@@ -0,0 +1,73 @@
+/* Copyright 2001 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Alexandre Oliva <aoliva@redhat.com>.
+ Based on ../i386/socket.S.
+
+ 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. */
+
+#include <sysdep.h>
+#include <socketcall.h>
+
+#define P(a, b) P2(a, b)
+#define P2(a, b) a##b
+
+ .text
+/* 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. */
+
+#ifndef __socket
+#ifndef NO_WEAK_ALIAS
+#define __socket P(__,socket)
+#else
+#define __socket socket
+#endif
+#endif
+
+.globl __socket
+ENTRY (__socket)
+
+ mov d0,(4,sp)
+ mov d1,(8,sp)
+
+ mov SYS_ify(socketcall),d0 /* System call number in d0. */
+
+ /* Use ## so `socket' is a separate token that might be #define'd. */
+ mov P(SOCKOP_,socket),a0 /* Subcode is first arg to syscall. */
+ mov sp,d1
+ add 4,d1 /* Address of args is 2nd arg. */
+
+ /* Do the system call trap. */
+ syscall 0
+
+ /* d0 is < 0 if there was an error. */
+ cmp -126,d0
+ bls L(pseudo_end)
+ jmp SYSCALL_ERROR_LABEL
+
+ /* Successful; return the syscall's value. */
+L(pseudo_end):
+ ret
+
+PSEUDO_END (__socket)
+
+#ifndef NO_WEAK_ALIAS
+weak_alias (__socket, socket)
+#endif
diff --git a/ports/sysdeps/unix/sysv/linux/am33/syscall.S b/ports/sysdeps/unix/sysv/linux/am33/syscall.S
new file mode 100644
index 000000000..180e5822c
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/syscall.S
@@ -0,0 +1,43 @@
+/* Copyright (C) 1995, 1996, 1998, 2001 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Alexandre Oliva <aoliva@redhat.com>.
+ Based on ../i386/syscall.S.
+
+ 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. */
+
+#include <sysdep.h>
+
+/* Please consult the file sysdeps/unix/sysv/linux/am33/sysdep.h for
+ more information about the value -126 used below.*/
+
+ .text
+ENTRY (syscall)
+ movm [d2,d3,a2,a3],(sp) /* Save register contents. */
+ mov d1,a0
+ mov (28,sp),d1
+ mov (32,sp),a3
+ mov (36,sp),a2
+ mov (40,sp),d3
+ mov (44,sp),d2
+ syscall 0 /* Do the system call. */
+ movm (sp),[d2,d3,a2,a3] /* Restore register contents. */
+ cmp -126,d0 /* Check for error. */
+ bls L(pseudo_end)
+ jmp SYSCALL_ERROR_LABEL /* Jump to error handler if error. */
+L(pseudo_end):
+ ret /* Return to caller. */
+
+PSEUDO_END (syscall)
diff --git a/ports/sysdeps/unix/sysv/linux/am33/sysdep.S b/ports/sysdeps/unix/sysv/linux/am33/sysdep.S
new file mode 100644
index 000000000..b41bfce40
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/sysdep.S
@@ -0,0 +1,42 @@
+/* Copyright (C) 1995, 1996, 1997, 1998, 2001, 2004
+ Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Alexandre Oliva <aoliva@redhat.com>.
+ Based on ../i386/sysdep.S.
+
+ 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. */
+
+#include <sysdep.h>
+
+/* The following code is only used in the shared library when we
+ compile the reentrant version. Otherwise each system call defines
+ each own version. */
+
+#ifndef PIC
+
+#undef CALL_MCOUNT
+#define CALL_MCOUNT /* Don't insert the profiling call, it clobbers %eax. */
+
+ .text
+ENTRY (__syscall_error)
+ mov d0,d1
+ clr d0
+ sub d1,d0
+
+#define __syscall_error __syscall_error_1
+#include <../../../am33/sysdep.S>
+
+#endif /* !PIC */
diff --git a/ports/sysdeps/unix/sysv/linux/am33/sysdep.h b/ports/sysdeps/unix/sysv/linux/am33/sysdep.h
new file mode 100644
index 000000000..b0ff4ec86
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/sysdep.h
@@ -0,0 +1,317 @@
+/* Copyright 2001, 2004 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Alexandre Oliva <aoliva@redhat.com>.
+ Based on ../i386/sysdep.h.
+
+ 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 _LINUX_AM33_SYSDEP_H
+#define _LINUX_AM33_SYSDEP_H 1
+
+/* There is some commonality. */
+#include "../../../am33/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
+#define SYS_ify(syscall_name) __NR_##syscall_name
+
+/* ELF-like local names start with `.L'. */
+#undef L
+#define L(name) .L##name
+
+#ifdef __ASSEMBLER__
+
+/* 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. Linus said he will make sure the no syscall
+ returns a value in -1 .. -4095 as a valid result so we can savely
+ test with -4095. */
+
+/* We don't want the label for the error handle to be global when we define
+ it here. */
+#ifdef PIC
+# define SYSCALL_ERROR_LABEL 0f
+#else
+# define SYSCALL_ERROR_LABEL syscall_error
+#endif
+
+#undef PSEUDO
+#define PSEUDO(name, syscall_name, args) \
+ .text; \
+ ENTRY (name) \
+ DO_CALL (syscall_name, args); \
+ cmp -126,d0; \
+ bls L(pseudo_end); \
+ jmp SYSCALL_ERROR_LABEL; \
+ L(pseudo_end): \
+ mov d0,a0;
+
+#undef PSEUDO_END
+#define PSEUDO_END(name) \
+ SYSCALL_ERROR_HANDLER \
+ END (name)
+
+#undef PSEUDO_NOERROR
+#define PSEUDO_NOERRNO(name, syscall_name, args) \
+ .text; \
+ ENTRY (name) \
+ DO_CALL (syscall_name, args)
+
+#undef PSEUDO_END_NOERRNO
+#define PSEUDO_END_NOERRNO(name) \
+ END (name)
+
+#define ret_NOERRNO ret
+
+/* The function has to return the error code. */
+#undef PSEUDO_ERRVAL
+#define PSEUDO_ERRVAL(name, syscall_name, args) \
+ .text; \
+ ENTRY (name) \
+ DO_CALL (syscall_name, args); \
+ clr d1; \
+ sub d0,d1,d0
+
+#undef PSEUDO_END_ERRVAL
+#define PSEUDO_END_ERRVAL(name) \
+ END (name)
+
+#define ret_ERRVAL ret
+
+#ifndef PIC
+#define SYSCALL_ERROR_HANDLER /* Nothing here; code in sysdep.S is used. */
+#else
+/* Store (- d0) into errno through the GOT. */
+#ifdef _LIBC_REENTRANT
+#define SYSCALL_ERROR_HANDLER \
+0:movm [d2,a2],(sp); \
+ add -12,sp; \
+1:mov pc,a2; \
+ add _GLOBAL_OFFSET_TABLE_-(1b-.),a2; \
+ clr d2; \
+ sub d0,d2; \
+ call __errno_location@PLT,[],0; \
+ mov d2,(a0); \
+ add 12,sp; \
+ movm (sp),[d2,a2]; \
+ mov -1,d0; \
+ mov d0,a0; \
+ jmp L(pseudo_end);
+/* A quick note: it is assumed that the call to `__errno_location' does
+ not modify the stack! */
+#else
+#define SYSCALL_ERROR_HANDLER \
+0:mov pc,a0; \
+ add _GLOBAL_OFFSET_TABLE_-(0b-.),a0; \
+ clr d1; \
+ sub d0,d1; \
+ mov (errno@GOT,a0),a1; \
+ mov d1,(a0); \
+ mov -1,d0; \
+ mov d0,a0; \
+ jmp L(pseudo_end);
+#endif /* _LIBC_REENTRANT */
+#endif /* PIC */
+
+/* Linux takes system call arguments in registers:
+
+ syscall number d0 call-clobbered
+ arg 1 a0 call-clobbered
+ arg 2 d1 call-clobbered
+ arg 3 a3 call-saved
+ arg 4 a2 call-saved
+ arg 5 d3 call-saved
+ arg 6 d2 call-saved
+
+ The stack layout upon entering the function is:
+
+ (24,sp) Arg# 6
+ (20,sp) Arg# 5
+ (16,sp) Arg# 4
+ (12,sp) Arg# 3
+ d1 Arg# 2
+ d0 Arg# 1
+ (sp) Return address
+
+ (Of course a function with say 3 arguments does not have entries for
+ arguments 4, 5 and 6.) */
+
+#undef DO_CALL
+#define DO_CALL(syscall_name, args) \
+ PUSHARGS_##args \
+ DOARGS_##args \
+ mov SYS_ify (syscall_name),d0; \
+ syscall 0 \
+ POPARGS_##args
+
+#define PUSHARGS_0 /* No arguments to push. */
+#define _DOARGS_0(N) /* No arguments to frob. */
+#define DOARGS_0 /* No arguments to frob. */
+#define POPARGS_0 /* No arguments to pop. */
+
+#define PUSHARGS_1 /* No arguments to push. */
+#define _DOARGS_1(N) _DOARGS_0 (N-4) mov d0,a0;
+#define DOARGS_1 _DOARGS_1 (4)
+#define POPARGS_1 /* No arguments to pop. */
+
+#define PUSHARGS_2 /* No arguments to push. */
+#define _DOARGS_2(N) _DOARGS_1 (N-4) /* Argument already in d1. */
+#define DOARGS_2 _DOARGS_2 (8)
+#define POPARGS_2 /* No arguments to pop. */
+
+#define PUSHARGS_3 movm [a3],(sp);
+#define _DOARGS_3(N) _DOARGS_2 (N-4) mov (N,sp),a3;
+#define DOARGS_3 _DOARGS_3 (16)
+#define POPARGS_3 ; movm (sp),[a3]
+
+#define PUSHARGS_4 movm [a2,a3],(sp);
+#define _DOARGS_4(N) _DOARGS_3 (N-4) mov (N,sp),a2;
+#define DOARGS_4 _DOARGS_4 (24)
+#define POPARGS_4 ; movm (sp),[a2,a3]
+
+#define PUSHARGS_5 movm [d3,a2,a3],(sp);
+#define _DOARGS_5(N) _DOARGS_4 (N-4) mov (N,sp),d3;
+#define DOARGS_5 _DOARGS_5 (32)
+#define POPARGS_5 ; movm (sp),[d3,a2,a3]
+
+#define PUSHARGS_6 movm [d2,d3,a2,a3],(sp);
+#define _DOARGS_6(N) _DOARGS_5 (N-4) mov (N,sp),d2;
+#define DOARGS_6 _DOARGS_6 (40)
+#define POPARGS_6 ; movm (sp),[d2,d3,a2,a3]
+
+#else /* !__ASSEMBLER__ */
+
+/* Define a macro which expands inline into the wrapper code for a system
+ call. */
+#undef INLINE_SYSCALL
+#define INLINE_SYSCALL(name, nr, args...) \
+ ({ \
+ unsigned int resultvar = INTERNAL_SYSCALL (name, , nr, args); \
+ if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (resultvar, ), 0)) \
+ { \
+ __set_errno (INTERNAL_SYSCALL_ERRNO (resultvar, )); \
+ resultvar = 0xffffffff; \
+ } \
+ (int) resultvar; })
+
+#define INTERNAL_SYSCALL(name, err, nr, args...) \
+({ \
+ register long __sc0 asm ("d0") = __NR_##name; \
+ inline_syscall##nr(name, ## args); \
+ __sc0; \
+})
+
+#undef INTERNAL_SYSCALL_DECL
+#define INTERNAL_SYSCALL_DECL(err) do { } while (0)
+
+#undef INTERNAL_SYSCALL_ERROR_P
+#define INTERNAL_SYSCALL_ERROR_P(val, err) \
+ ((unsigned int) (val) >= (unsigned long)-125)
+
+#undef INTERNAL_SYSCALL_ERRNO
+#define INTERNAL_SYSCALL_ERRNO(val, err) (-(val))
+
+#define inline_syscall0(name,dummy...) \
+__asm__ __volatile__ ("syscall 0" \
+ : "+d" (__sc0) \
+ : : "memory")
+
+#define inline_syscall1(name,arg1) \
+register long __sc1 asm ("a0") = (long) (arg1); \
+inline_syscall0 (name); \
+__asm__ __volatile__ ("" : : "r" (__sc1))
+
+#define inline_syscall2(name,arg1,arg2) \
+register long __sc2 asm ("d1") = (long) (arg2); \
+inline_syscall1 (name,(arg1)); \
+__asm__ __volatile__ ("" : : "r" (__sc2))
+
+/* We can't tell whether a3 is going to be eliminated in the enclosing
+ function, so we have to assume it isn't. We first load the value
+ of any arguments into their registers, except for a3 itself, that
+ may be needed to load the value of the other arguments. Then, we
+ save a3's value in some other register, and load the argument value
+ into a3. We have to force both a3 and its copy to be live in
+ different registers at the same time, to avoid having the copy
+ spilled and the value reloaded into the same register, in which
+ case we'd be unable to get the value of a3 back, should the stack
+ slot reference be (offset,a3). */
+#define inline_syscall3(name,arg1,arg2,arg3) \
+long __sc3v = (long) (arg3); \
+register long __sc1 asm ("a0") = (long) (arg1); \
+register long __sc2 asm ("d1") = (long) (arg2); \
+register long __sc3 asm ("a3") = __sc3; \
+register long __sc3c; \
+__asm__ __volatile__ ("mov %1,%0" : "=&r" (__sc3c) : "r" (__sc3)); \
+__sc3 = __sc3v; \
+__asm__ __volatile__ ("" : : "r" (__sc3c), "r" (__sc3)); \
+inline_syscall0 (name); \
+__sc3 = __sc3c; \
+__asm__ __volatile__ ("" : : "r" (__sc3), "r" (__sc2), "r" (__sc1))
+
+#ifdef PIC
+/* Since a2 is the PIC register, it requires similar handling as a3
+ when we're generating PIC, as a2's value may be needed to load
+ arguments whose values live in global variables. The difference is
+ that we don't need to require its value to be live in a register;
+ it may well be in a stack slot, as long as we save it before
+ clobbering a3 and restore it after restoring a3. */
+#define inline_syscall4(name,arg1,arg2,arg3,arg4) \
+long __sc4v = (long) (arg4); \
+long __sc3v = (long) (arg3); \
+register long __sc1 asm ("a0") = (long) (arg1); \
+register long __sc2 asm ("d1") = (long) (arg2); \
+register long __sc3 asm ("a3") = __sc3; \
+register long __sc3c; \
+register long __sc4 asm ("a2") = __sc4; \
+long __sc4c = __sc4; \
+__sc4 = __sc4v; \
+__asm__ __volatile__ ("mov %1,%0" : "=&r" (__sc3c) : "r" (__sc3)); \
+__sc3 = __sc3v; \
+__asm__ __volatile__ ("" : : "r" (__sc3c), "r" (__sc3), "r" (__sc4)); \
+inline_syscall0 (name); \
+__sc3 = __sc3c; \
+__sc4 = __sc4c; \
+__asm__ __volatile__ ("" : : "r" (__sc4), "r" (__sc3), \
+ "r" (__sc2), "r" (__sc1))
+#else
+#define inline_syscall4(name,arg1,arg2,arg3,arg4) \
+register long __sc4 asm ("a2") = (long) (arg4); \
+inline_syscall3 (name,(arg1),(arg2),(arg3)); \
+__asm__ __volatile__ ("" : : "r" (__sc4))
+#endif
+
+#define inline_syscall5(name,arg1,arg2,arg3,arg4,arg5) \
+register long __sc5 asm ("d3") = (long) (arg5); \
+inline_syscall4 (name,(arg1),(arg2),(arg3),(arg4)); \
+__asm__ __volatile__ ("" : : "r" (__sc5))
+
+#define inline_syscall6(name,arg1,arg2,arg3,arg4,arg5,arg6) \
+register long __sc6 asm ("d2") = (long) (arg6); \
+inline_syscall5 (name,(arg1),(arg2),(arg3),(arg4),(arg5)); \
+__asm__ __volatile__ ("" : : "r" (__sc6))
+
+#endif /* __ASSEMBLER__ */
+
+#endif /* linux/am33/sysdep.h */
diff --git a/ports/sysdeps/unix/sysv/linux/am33/xstat.c b/ports/sysdeps/unix/sysv/linux/am33/xstat.c
new file mode 100644
index 000000000..e9869f550
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/am33/xstat.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/xstat.c>
diff --git a/ports/sysdeps/unix/sysv/linux/cris/Dist b/ports/sysdeps/unix/sysv/linux/cris/Dist
new file mode 100644
index 000000000..1b8a7e61a
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/Dist
@@ -0,0 +1,5 @@
+clone.S
+setresuid.c
+setresgid.c
+setfsuid.c
+setfsgid.c
diff --git a/ports/sysdeps/unix/sysv/linux/cris/_G_config.h b/ports/sysdeps/unix/sysv/linux/cris/_G_config.h
new file mode 100644
index 000000000..083a00abf
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/_G_config.h
@@ -0,0 +1,106 @@
+/* This file is needed by libio to define various configuration parameters.
+ These are always the same in the GNU C library. */
+
+/* We have to keep a separate copy for CRIS, because we don't use thunks,
+ and libstdc++-v2 (which we currently use) cares. The C++ ABI is
+ changed totally with GCC 3.0, where we should not need a separate file. */
+
+#ifndef _G_config_h
+#define _G_config_h 1
+
+/* Define types for libio in terms of the standard internal type names. */
+
+#include <bits/types.h>
+#define __need_size_t
+#define __need_wchar_t
+#define __need_wint_t
+#define __need_NULL
+#include <stddef.h>
+#ifndef _WINT_T
+/* Integral type unchanged by default argument promotions that can
+ hold any value corresponding to members of the extended character
+ set, as well as at least one value that does not correspond to any
+ member of the extended character set. */
+# define _WINT_T
+typedef unsigned int wint_t;
+#endif
+#define __need_mbstate_t
+#include <wchar.h>
+#define _G_size_t size_t
+typedef struct
+{
+ __off_t __pos;
+ __mbstate_t __state;
+} _G_fpos_t;
+typedef struct
+{
+ __off64_t __pos;
+ __mbstate_t __state;
+} _G_fpos64_t;
+#define _G_ssize_t __ssize_t
+#define _G_off_t __off_t
+#define _G_off64_t __off64_t
+#define _G_pid_t __pid_t
+#define _G_uid_t __uid_t
+#define _G_wchar_t wchar_t
+#define _G_wint_t wint_t
+#define _G_stat64 stat64
+#include <gconv.h>
+typedef union
+{
+ struct __gconv_info __cd;
+ struct
+ {
+ struct __gconv_info __cd;
+ struct __gconv_step_data __data;
+ } __combined;
+} _G_iconv_t;
+
+typedef int _G_int16_t __attribute__ ((__mode__ (__HI__)));
+typedef int _G_int32_t __attribute__ ((__mode__ (__SI__)));
+typedef unsigned int _G_uint16_t __attribute__ ((__mode__ (__HI__)));
+typedef unsigned int _G_uint32_t __attribute__ ((__mode__ (__SI__)));
+
+#define _G_HAVE_BOOL 1
+
+
+/* These library features are always available in the GNU C library. */
+#define _G_HAVE_ATEXIT 1
+#define _G_HAVE_SYS_CDEFS 1
+#define _G_HAVE_SYS_WAIT 1
+#define _G_NEED_STDARG_H 1
+#define _G_va_list __gnuc_va_list
+
+#define _G_HAVE_PRINTF_FP 1
+#define _G_HAVE_MMAP 1
+#define _G_HAVE_LONG_DOUBLE_IO 1
+#define _G_HAVE_IO_FILE_OPEN 1
+#define _G_HAVE_IO_GETLINE_INFO 1
+
+#define _G_IO_IO_FILE_VERSION 0x20001
+
+#define _G_OPEN64 __open64
+#define _G_LSEEK64 __lseek64
+#define _G_MMAP64 __mmap64
+#define _G_FSTAT64(fd,buf) __fxstat64 (_STAT_VER, fd, buf)
+
+/* This is defined by <bits/stat.h> if `st_blksize' exists. */
+#define _G_HAVE_ST_BLKSIZE defined (_STATBUF_ST_BLKSIZE)
+
+#define _G_BUFSIZ 8192
+
+/* These are the vtbl details for ELF. */
+#define _G_NAMES_HAVE_UNDERSCORE 0
+#define _G_VTABLE_LABEL_HAS_LENGTH 1
+#undef _G_USING_THUNKS
+#define _G_VTABLE_LABEL_PREFIX "_vt."
+#define _G_VTABLE_LABEL_PREFIX_ID _vt.
+
+
+#if defined __cplusplus || defined __STDC__
+# define _G_ARGS(ARGLIST) ARGLIST
+#else
+# define _G_ARGS(ARGLIST) ()
+#endif
+
+#endif /* _G_config.h */
diff --git a/ports/sysdeps/unix/sysv/linux/cris/bits/fcntl.h b/ports/sysdeps/unix/sysv/linux/cris/bits/fcntl.h
new file mode 100644
index 000000000..36799aa50
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/bits/fcntl.h
@@ -0,0 +1,189 @@
+/* O_*, F_*, FD_* bit values for Linux.
+ Copyright (C) 1995, 1996, 1997, 1998, 2000, 2001, 2004
+ 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 _FCNTL_H
+# error "Never use <bits/fcntl.h> directly; include <fcntl.h> instead."
+#endif
+
+
+#include <sys/types.h>
+
+/* open/fcntl - O_SYNC is only implemented on blocks devices and on files
+ located on an ext2 file system */
+#define O_ACCMODE 0003
+#define O_RDONLY 00
+#define O_WRONLY 01
+#define O_RDWR 02
+#define O_CREAT 0100 /* not fcntl */
+#define O_EXCL 0200 /* not fcntl */
+#define O_NOCTTY 0400 /* not fcntl */
+#define O_TRUNC 01000 /* not fcntl */
+#define O_APPEND 02000
+#define O_NONBLOCK 04000
+#define O_NDELAY O_NONBLOCK
+#define O_SYNC 010000
+#define O_FSYNC O_SYNC
+#define O_ASYNC 020000
+
+#ifdef __USE_GNU
+# define O_DIRECT 040000 /* Direct disk access. */
+# define O_DIRECTORY 0200000 /* Must be a directory. */
+# define O_NOFOLLOW 0400000 /* Do not follow links. */
+# define O_NOATIME 01000000 /* Do not set atime. */
+#endif
+
+/* For now Linux has synchronisity options for data and read operations.
+ We define the symbols here but let them do the same as O_SYNC since
+ this is a superset. */
+#if defined __USE_POSIX199309 || defined __USE_UNIX98
+# define O_DSYNC O_SYNC /* Synchronize data. */
+# define O_RSYNC O_SYNC /* Synchronize read operations. */
+#endif
+
+#ifdef __USE_LARGEFILE64
+# define O_LARGEFILE 0100000
+#endif
+
+/* Values for the second argument to `fcntl'. */
+#define F_DUPFD 0 /* Duplicate file descriptor. */
+#define F_GETFD 1 /* Get file descriptor flags. */
+#define F_SETFD 2 /* Set file descriptor flags. */
+#define F_GETFL 3 /* Get file status flags. */
+#define F_SETFL 4 /* Set file status flags. */
+#ifndef __USE_FILE_OFFSET64
+# define F_GETLK 5 /* Get record locking info. */
+# define F_SETLK 6 /* Set record locking info (non-blocking). */
+# define F_SETLKW 7 /* Set record locking info (blocking). */
+#else
+# define F_GETLK F_GETLK64 /* Get record locking info. */
+# define F_SETLK F_SETLK64 /* Set record locking info (non-blocking).*/
+# define F_SETLKW F_SETLKW64 /* Set record locking info (blocking). */
+#endif
+#define F_GETLK64 12 /* Get record locking info. */
+#define F_SETLK64 13 /* Set record locking info (non-blocking). */
+#define F_SETLKW64 14 /* Set record locking info (blocking). */
+
+#if defined __USE_BSD || defined __USE_UNIX98
+# define F_SETOWN 8 /* Get owner of socket (receiver of SIGIO). */
+# define F_GETOWN 9 /* Set owner of socket (receiver of SIGIO). */
+#endif
+
+#ifdef __USE_GNU
+# define F_SETSIG 10 /* Set number of signal to be sent. */
+# define F_GETSIG 11 /* Get number of signal to be sent. */
+#endif
+
+#ifdef __USE_GNU
+# define F_SETLEASE 1024 /* Set a lease. */
+# define F_GETLEASE 1025 /* Enquire what lease is active. */
+# define F_NOTIFY 1026 /* Request notfications on a directory. */
+#endif
+
+/* For F_[GET|SET]FL. */
+#define FD_CLOEXEC 1 /* actually anything with low bit set goes */
+
+/* For posix fcntl() and `l_type' field of a `struct flock' for lockf(). */
+#define F_RDLCK 0 /* Read lock. */
+#define F_WRLCK 1 /* Write lock. */
+#define F_UNLCK 2 /* Remove lock. */
+
+/* For old implementation of bsd flock(). */
+#define F_EXLCK 4 /* or 3 */
+#define F_SHLCK 8 /* or 4 */
+
+#ifdef __USE_BSD
+/* Operations for bsd flock(), also used by the kernel implementation. */
+# define LOCK_SH 1 /* shared lock */
+# define LOCK_EX 2 /* exclusive lock */
+# define LOCK_NB 4 /* or'd with one of the above to prevent
+ blocking */
+# define LOCK_UN 8 /* remove lock */
+#endif
+
+#ifdef __USE_GNU
+# define LOCK_MAND 32 /* This is a mandatory flock: */
+# define LOCK_READ 64 /* ... which allows concurrent read operations. */
+# define LOCK_WRITE 128 /* ... which allows concurrent write operations. */
+# define LOCK_RW 192 /* ... Which allows concurrent read & write operations. */
+#endif
+
+#ifdef __USE_GNU
+/* Types of directory notifications that may be requested with F_NOTIFY. */
+# define DN_ACCESS 0x00000001 /* File accessed. */
+# define DN_MODIFY 0x00000002 /* File modified. */
+# define DN_CREATE 0x00000004 /* File created. */
+# define DN_DELETE 0x00000008 /* File removed. */
+# define DN_RENAME 0x00000010 /* File renamed. */
+# define DN_ATTRIB 0x00000020 /* File changed attibutes. */
+# define DN_MULTISHOT 0x80000000 /* Don't remove notifier. */
+#endif
+
+struct flock
+ {
+ short int l_type; /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK. */
+ short int l_whence; /* Where `l_start' is relative to (like `lseek'). */
+#ifndef __USE_FILE_OFFSET64
+ __off_t l_start; /* Offset where the lock begins. */
+ __off_t l_len; /* Size of the locked area; zero means until EOF. */
+#else
+ __off64_t l_start; /* Offset where the lock begins. */
+ __off64_t l_len; /* Size of the locked area; zero means until EOF. */
+#endif
+ __pid_t l_pid; /* Process holding the lock. */
+ };
+
+#ifdef __USE_LARGEFILE64
+struct flock64
+ {
+ short int l_type; /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK. */
+ short int l_whence; /* Where `l_start' is relative to (like `lseek'). */
+ __off64_t l_start; /* Offset where the lock begins. */
+ __off64_t l_len; /* Size of the locked area; zero means until EOF. */
+ __pid_t l_pid; /* Process holding the lock. */
+ };
+#endif
+
+/* Define some more compatibility macros to be backward compatible with
+ BSD systems which did not managed to hide these kernel macros. */
+#ifdef __USE_BSD
+# define FAPPEND O_APPEND
+# define FFSYNC O_FSYNC
+# define FASYNC O_ASYNC
+# define FNONBLOCK O_NONBLOCK
+# define FNDELAY O_NDELAY
+#endif /* Use BSD. */
+
+/* Advise to `posix_fadvise'. */
+#ifdef __USE_XOPEN2K
+# define POSIX_FADV_NORMAL 0 /* No further special treatment. */
+# define POSIX_FADV_RANDOM 1 /* Expect random page references. */
+# define POSIX_FADV_SEQUENTIAL 2 /* Expect sequential page references. */
+# define POSIX_FADV_WILLNEED 3 /* Will need these pages. */
+# define POSIX_FADV_DONTNEED 4 /* Don't need these pages. */
+# define POSIX_FADV_NOREUSE 5 /* Data will be accessed once. */
+#endif
+
+__BEGIN_DECLS
+
+/* Provide kernel hint to read ahead. */
+extern ssize_t readahead (int __fd, __off64_t __offset, size_t __count)
+ __THROW;
+
+__END_DECLS
diff --git a/ports/sysdeps/unix/sysv/linux/cris/bits/mman.h b/ports/sysdeps/unix/sysv/linux/cris/bits/mman.h
new file mode 100644
index 000000000..b66c0bdb6
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/bits/mman.h
@@ -0,0 +1,97 @@
+/* Definitions for POSIX memory map interface. Linux/CRIS version.
+ Copyright (C) 1997, 2000, 2001, 2003 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 _SYS_MMAN_H
+# error "Never use <bits/mman.h> directly; include <sys/mman.h> instead."
+#endif
+
+/* The following definitions basically come from the kernel headers.
+ But the kernel header is not namespace clean. */
+
+
+/* Protections are chosen from these bits, OR'd together. The
+ implementation does not necessarily support PROT_EXEC or PROT_WRITE
+ without PROT_READ. The only guarantees are that no writing will be
+ allowed without PROT_WRITE and no access will be allowed for PROT_NONE. */
+
+#define PROT_READ 0x1 /* Page can be read. */
+#define PROT_WRITE 0x2 /* Page can be written. */
+#define PROT_EXEC 0x4 /* Page can be executed. */
+#define PROT_NONE 0x0 /* Page can not be accessed. */
+#define PROT_GROWSDOWN 0x01000000 /* Extend change to start of
+ growsdown vma (mprotect only). */
+#define PROT_GROWSUP 0x02000000 /* Extend change to start of
+ growsup vma (mprotect only). */
+
+/* Sharing types (must choose one and only one of these). */
+#define MAP_SHARED 0x01 /* Share changes. */
+#define MAP_PRIVATE 0x02 /* Changes are private. */
+#ifdef __USE_MISC
+# define MAP_TYPE 0x0f /* Mask for type of mapping. */
+#endif
+
+/* Other flags. */
+#define MAP_FIXED 0x10 /* Interpret addr exactly. */
+#ifdef __USE_MISC
+# define MAP_FILE 0
+# define MAP_ANONYMOUS 0x20 /* Don't use a file. */
+# define MAP_ANON MAP_ANONYMOUS
+#endif
+
+/* These are Linux-specific. */
+#ifdef __USE_MISC
+# define MAP_GROWSDOWN 0x0100 /* Stack-like segment. */
+# define MAP_DENYWRITE 0x0800 /* ETXTBSY */
+# define MAP_EXECUTABLE 0x1000 /* Mark it as an executable. */
+# define MAP_LOCKED 0x2000 /* Lock the mapping. */
+# define MAP_NORESERVE 0x4000 /* Don't check for reservations. */
+#endif
+
+/* Flags to `msync'. */
+#define MS_ASYNC 1 /* Sync memory asynchronously. */
+#define MS_SYNC 4 /* Synchronous memory sync. */
+#define MS_INVALIDATE 2 /* Invalidate the caches. */
+
+/* Flags for `mlockall'. */
+#define MCL_CURRENT 1 /* Lock all currently mapped pages. */
+#define MCL_FUTURE 2 /* Lock all additions to address
+ space. */
+
+/* Flags for `mremap'. */
+#ifdef __USE_GNU
+# define MREMAP_MAYMOVE 1
+#endif
+
+/* Advice to `madvise'. */
+#ifdef __USE_BSD
+# define MADV_NORMAL 0 /* No further special treatment. */
+# define MADV_RANDOM 1 /* Expect random page references. */
+# define MADV_SEQUENTIAL 2 /* Expect sequential page references. */
+# define MADV_WILLNEED 3 /* Will need these pages. */
+# define MADV_DONTNEED 4 /* Don't need these pages. */
+#endif
+
+/* The POSIX people had to invent similar names for the same things. */
+#ifdef __USE_XOPEN2K
+# define POSIX_MADV_NORMAL 0 /* No further special treatment. */
+# define POSIX_MADV_RANDOM 1 /* Expect random page references. */
+# define POSIX_MADV_SEQUENTIAL 2 /* Expect sequential page references. */
+# define POSIX_MADV_WILLNEED 3 /* Will need these pages. */
+# define POSIX_MADV_DONTNEED 4 /* Don't need these pages. */
+#endif
diff --git a/ports/sysdeps/unix/sysv/linux/cris/brk.c b/ports/sysdeps/unix/sysv/linux/cris/brk.c
new file mode 100644
index 000000000..ce4944512
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/brk.c
@@ -0,0 +1,44 @@
+/* brk system call for Linux/CRIS.
+ Copyright (C) 1995, 1996, 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. */
+
+#include <errno.h>
+#include <unistd.h>
+#include <sysdep.h>
+
+/* This must be initialized data because commons can't have aliases. */
+void *__curbrk = 0;
+
+int
+__brk (void *addr)
+{
+ unsigned char *newbrk;
+
+ newbrk = (unsigned char *) INLINE_SYSCALL (brk, 1, addr);
+
+ __curbrk = newbrk;
+
+ if (newbrk < (unsigned char *) addr)
+ {
+ __set_errno (ENOMEM);
+ return -1;
+ }
+
+ return 0;
+}
+weak_alias (__brk, brk)
diff --git a/ports/sysdeps/unix/sysv/linux/cris/chown.c b/ports/sysdeps/unix/sysv/linux/cris/chown.c
new file mode 100644
index 000000000..196162256
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/chown.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/m68k/chown.c>
diff --git a/ports/sysdeps/unix/sysv/linux/cris/clone.S b/ports/sysdeps/unix/sysv/linux/cris/clone.S
new file mode 100644
index 000000000..b2016438a
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/clone.S
@@ -0,0 +1,88 @@
+/* Copyright (C) 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. */
+
+#include <sysdep.h>
+#define _ERRNO_H 1
+#include <bits/errno.h>
+
+/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg); */
+
+ .syntax no_register_prefix
+
+ .text
+ENTRY (__clone)
+ /* Sanity check arguments: No NULL function pointers. Allow a NULL
+ stack pointer though; it makes the kernel allocate stack. */
+ test.d r10
+ beq 1f
+ nop
+
+ /* We need to muck with a few registers. */
+ movem r1,[sp=sp-8]
+
+ /* Save the function pointer and argument. We can't save them
+ onto the new stack since it can be NULL. */
+ move.d r10,r0
+ move.d r13,r1
+
+ /* Move the other arguments into place for the system call. */
+ move.d r11,r10
+ move.d r12,r11
+
+ /* Do the system call. */
+ movu.w SYS_ify (clone),r9
+ break 13
+ test.d r10
+ beq .Lthread_start
+ nop
+
+ /* Jump to error handler if we get (unsigned) -4096 .. 0xffffffff. */
+ cmps.w -4096,r10
+ bhs 0f
+ movem [sp+],r1
+
+ /* In parent, successful return. (Avoid using "ret" - it's a macro.) */
+ Ret
+ nop
+
+.Lthread_start:
+ /* Terminate frame pointers here. */
+ moveq 0,r8
+
+ /* I've told you once. */
+ move.d r1,r10
+ jsr r0
+
+ SETUP_PIC
+ PLTCALL (_exit)
+
+ /* Die horribly. */
+ test.d [6809]
+
+ /* Stop the unstoppable. */
+9:
+ ba 9b
+ nop
+
+/* Local error handler. */
+1:
+ movs.w -EINVAL,r10
+ /* Drop through into the ordinary error handler. */
+PSEUDO_END (__clone)
+
+weak_alias (__clone, clone)
diff --git a/ports/sysdeps/unix/sysv/linux/cris/fchown.c b/ports/sysdeps/unix/sysv/linux/cris/fchown.c
new file mode 100644
index 000000000..3a69ecc9e
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/fchown.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/fchown.c>
diff --git a/ports/sysdeps/unix/sysv/linux/cris/fcntl.c b/ports/sysdeps/unix/sysv/linux/cris/fcntl.c
new file mode 100644
index 000000000..ea951bc4f
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/fcntl.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/fcntl.c>
diff --git a/ports/sysdeps/unix/sysv/linux/cris/fxstat.c b/ports/sysdeps/unix/sysv/linux/cris/fxstat.c
new file mode 100644
index 000000000..4f219f0b9
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/fxstat.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/fxstat.c>
diff --git a/ports/sysdeps/unix/sysv/linux/cris/getegid.c b/ports/sysdeps/unix/sysv/linux/cris/getegid.c
new file mode 100644
index 000000000..37b4b4a53
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/getegid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getegid.c>
diff --git a/ports/sysdeps/unix/sysv/linux/cris/geteuid.c b/ports/sysdeps/unix/sysv/linux/cris/geteuid.c
new file mode 100644
index 000000000..ebcb555b5
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/geteuid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/geteuid.c>
diff --git a/ports/sysdeps/unix/sysv/linux/cris/getgid.c b/ports/sysdeps/unix/sysv/linux/cris/getgid.c
new file mode 100644
index 000000000..0a4d6061f
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/getgid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getgid.c>
diff --git a/ports/sysdeps/unix/sysv/linux/cris/getgroups.c b/ports/sysdeps/unix/sysv/linux/cris/getgroups.c
new file mode 100644
index 000000000..102ea24e1
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/getgroups.c
@@ -0,0 +1,2 @@
+/* We also have to rewrite the kernel gid_t to the user land type. */
+#include <sysdeps/unix/sysv/linux/i386/getgroups.c>
diff --git a/ports/sysdeps/unix/sysv/linux/cris/getresgid.c b/ports/sysdeps/unix/sysv/linux/cris/getresgid.c
new file mode 100644
index 000000000..b703a414c
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/getresgid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getresgid.c>
diff --git a/ports/sysdeps/unix/sysv/linux/cris/getresuid.c b/ports/sysdeps/unix/sysv/linux/cris/getresuid.c
new file mode 100644
index 000000000..0b14cefe3
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/getresuid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getresuid.c>
diff --git a/ports/sysdeps/unix/sysv/linux/cris/getrlimit.c b/ports/sysdeps/unix/sysv/linux/cris/getrlimit.c
new file mode 100644
index 000000000..fc06dbd64
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/getrlimit.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getrlimit.c>
diff --git a/ports/sysdeps/unix/sysv/linux/cris/getrlimit64.c b/ports/sysdeps/unix/sysv/linux/cris/getrlimit64.c
new file mode 100644
index 000000000..fef018f47
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/getrlimit64.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getrlimit64.c>
diff --git a/ports/sysdeps/unix/sysv/linux/cris/getuid.c b/ports/sysdeps/unix/sysv/linux/cris/getuid.c
new file mode 100644
index 000000000..d682c79a4
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/getuid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getuid.c>
diff --git a/ports/sysdeps/unix/sysv/linux/cris/lchown.c b/ports/sysdeps/unix/sysv/linux/cris/lchown.c
new file mode 100644
index 000000000..c89de99ba
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/lchown.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/lchown.c>
diff --git a/ports/sysdeps/unix/sysv/linux/cris/lockf64.c b/ports/sysdeps/unix/sysv/linux/cris/lockf64.c
new file mode 100644
index 000000000..a88f5a784
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/lockf64.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/lockf64.c>
diff --git a/ports/sysdeps/unix/sysv/linux/cris/lxstat.c b/ports/sysdeps/unix/sysv/linux/cris/lxstat.c
new file mode 100644
index 000000000..2371cd971
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/lxstat.c
@@ -0,0 +1,2 @@
+#include <sysdeps/unix/sysv/linux/i386/lxstat.c>
+
diff --git a/ports/sysdeps/unix/sysv/linux/cris/mmap.S b/ports/sysdeps/unix/sysv/linux/cris/mmap.S
new file mode 100644
index 000000000..3c74d590f
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/mmap.S
@@ -0,0 +1,68 @@
+/* Copyright (C) 1995, 96, 97, 98, 99, 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. */
+
+#include <sysdep.h>
+
+#include "kernel-features.h"
+
+#include <asm/errno.h>
+
+/* Rather than dragging in yet another kernel file, <asm/page.h>, we
+ define it here. Provide for easy override. */
+#ifndef PAGE_SHIFT
+#define PAGE_SHIFT 13
+#endif
+
+ .syntax no_register_prefix
+
+/* This is __ptr_t
+ __mmap (__ptr_t addr, size_t len, int prot, int flags, int fd, off_t offset) */
+
+ ENTRY (__mmap)
+
+ /* Only accept a offset (and address) being a multiple of PAGE_SIZE,
+ since we only pass the page part in the system call. */
+ move.d [sp+4],r9
+ btstq (PAGE_SHIFT - 1),r9
+ bne 1f
+ btstq (PAGE_SHIFT - 1),r10
+
+ bne 1f
+ lsrq PAGE_SHIFT,r9
+
+ move [sp],mof
+ move srp,[sp]
+ move r9,srp
+
+ movu.b SYS_ify (mmap2),r9
+ break 13
+
+ cmps.w -4096,r10
+ bhs 0f
+ move [sp],srp
+
+ Ret
+ nop
+
+/* Local error handler. */
+1:
+ movs.w -EINVAL,r10
+ /* Drop through into the ordinary error handler. */
+PSEUDO_END (__mmap)
+
+weak_alias (__mmap, mmap)
diff --git a/ports/sysdeps/unix/sysv/linux/cris/mmap64.S b/ports/sysdeps/unix/sysv/linux/cris/mmap64.S
new file mode 100644
index 000000000..d71114454
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/mmap64.S
@@ -0,0 +1,91 @@
+/* Copyright (C) 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. */
+
+#include <sysdep.h>
+
+#include "kernel-features.h"
+
+#include <asm/errno.h>
+
+/* Rather than dragging in yet another kernel file, <asm/page.h>, we
+ define it here. Provide for easy override. */
+#ifndef PAGE_SHIFT
+#define PAGE_SHIFT 13
+#endif
+
+/* This is: __ptr_t
+ __mmap64 (__ptr_t addr, size_t len, int prot, int flags, int fd,
+ off64_t offset); */
+
+/* This was done in C, but the resulting code didn't look anywhere near
+ nice, and mmap64 is important enough to have fast code. Rather than
+ fixing (the generic bits in) gcc, we make sure not to depend on it by
+ writing code that GCC cannot reasonably generate. */
+
+ .syntax no_register_prefix
+
+ENTRY (__mmap64)
+
+ move [sp],mof
+ move.d [sp+4],r9
+
+ /* Only accept an offset being a multiple of PAGE_SIZE, ditto address. */
+ btstq (PAGE_SHIFT - 1),r9
+ bne 1f
+ lsrq PAGE_SHIFT,r9
+
+ btstq (PAGE_SHIFT - 1),r10
+ bne 1f
+ move.d r9,[sp]
+
+ /* We have to store the adjusted part somewhere we can "or" from.
+ No registers available, so let's re-use the incoming low-part
+ parameter location. */
+ move.d [sp+8],r9
+
+ swapwbr r9
+ /* Check if the highest bits (now the lowest bits) are zero. They
+ must be, since we're actually calling a system function
+ specifying the size in *pages* in a single dword. Thus you can
+ mmap64 PAGE_SIZE * 4 Gbyte. */
+ btstq (PAGE_SHIFT - 1),r9
+ bne 1f
+ swapwbr r9
+
+ lslq (32 - PAGE_SHIFT),r9
+ or.d [sp],r9
+ move srp,[sp]
+ move r9,srp
+
+ movu.b SYS_ify (mmap2),r9
+ break 13
+
+ cmps.w -4096,r10
+ bhs 0f
+ move [sp],srp
+
+ Ret
+ nop
+
+/* Local error handler. */
+1:
+ movs.w -EINVAL,r10
+ /* Drop through into the ordinary error handler. */
+PSEUDO_END (__mmap64)
+
+weak_alias (__mmap64, mmap64)
diff --git a/ports/sysdeps/unix/sysv/linux/cris/msgctl.c b/ports/sysdeps/unix/sysv/linux/cris/msgctl.c
new file mode 100644
index 000000000..9f9b8431a
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/msgctl.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/msgctl.c>
diff --git a/ports/sysdeps/unix/sysv/linux/cris/profil-counter.h b/ports/sysdeps/unix/sysv/linux/cris/profil-counter.h
new file mode 100644
index 000000000..37adc1fee
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/profil-counter.h
@@ -0,0 +1,26 @@
+/* Low-level statistical profiling support function. Linux/CRIS version.
+ Copyright (C) 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. */
+
+#include <signal.h>
+
+static void
+profil_counter (int signo, struct sigcontext *scp)
+{
+ profil_count ((void *) scp->regs.irp);
+}
diff --git a/ports/sysdeps/unix/sysv/linux/cris/register-dump.h b/ports/sysdeps/unix/sysv/linux/cris/register-dump.h
new file mode 100644
index 000000000..309728bf9
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/register-dump.h
@@ -0,0 +1,117 @@
+/* Dump registers.
+ Copyright (C) 1998, 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. */
+
+#include <stddef.h>
+#include <sys/uio.h>
+#include <stdio-common/_itoa.h>
+
+/* We will print the register dump in this format:
+
+ R0: XXXXXXXX R1: XXXXXXXX R2: XXXXXXXX R3: XXXXXXXX
+ R4: XXXXXXXX R5: XXXXXXXX R6: XXXXXXXX R7: XXXXXXXX
+ R8: XXXXXXXX R9: XXXXXXXX R10: XXXXXXXX R11: XXXXXXXX
+ R12: XXXXXXXX R13: XXXXXXXX SP: XXXXXXXX PC: XXXXXXXX
+DCCR: XXXXXXXX SRP: XXXXXXXX */
+
+static void
+hexvalue (unsigned long int value, char *buf, size_t len)
+{
+ char *cp = _itoa_word (value, buf + len, 16, 0);
+ while (cp > buf)
+ *--cp = '0';
+}
+
+static void register_dump (int fd, struct sigcontext *ctx)
+{
+ char regs[18][8];
+ struct iovec iov[36], *next_iov = iov;
+ struct pt_regs *rx = &ctx->regs;
+
+#define ADD_STRING(str) \
+ next_iov->iov_base = (char *) (str); \
+ next_iov->iov_len = strlen (str); \
+ ++next_iov
+#define ADD_MEM(str, len) \
+ next_iov->iov_base = (str); \
+ next_iov->iov_len = (len); \
+ ++next_iov
+
+ /* Generate strings of register contents. */
+ hexvalue (rx->r0, regs[0], 8);
+ hexvalue (rx->r1, regs[1], 8);
+ hexvalue (rx->r2, regs[2], 8);
+ hexvalue (rx->r3, regs[3], 8);
+ hexvalue (rx->r4, regs[4], 8);
+ hexvalue (rx->r5, regs[5], 8);
+ hexvalue (rx->r6, regs[6], 8);
+ hexvalue (rx->r7, regs[7], 8);
+ hexvalue (rx->r8, regs[8], 8);
+ hexvalue (rx->r9, regs[9], 8);
+ hexvalue (rx->r10, regs[10], 8);
+ hexvalue (rx->r11, regs[11], 8);
+ hexvalue (rx->r12, regs[12], 8);
+ hexvalue (rx->r13, regs[13], 8);
+ hexvalue (ctx->usp, regs[14], 8);
+ hexvalue (rx->irp, regs[17], 8);
+ hexvalue (rx->dccr, regs[15], 8);
+ hexvalue (rx->srp, regs[16], 8);
+
+ /* Generate the output. */
+ ADD_STRING ("Register dump:\n\n R0: ");
+ ADD_MEM (regs[0], 8);
+ ADD_STRING (" R1: ");
+ ADD_MEM (regs[1], 8);
+ ADD_STRING (" R2: ");
+ ADD_MEM (regs[2], 8);
+ ADD_STRING (" R3: ");
+ ADD_MEM (regs[3], 8);
+ ADD_STRING ("\n R4: ");
+ ADD_MEM (regs[4], 8);
+ ADD_STRING (" R5: ");
+ ADD_MEM (regs[5], 8);
+ ADD_STRING (" R6: ");
+ ADD_MEM (regs[6], 8);
+ ADD_STRING (" R7: ");
+ ADD_MEM (regs[7], 8);
+ ADD_STRING ("\n R8: ");
+ ADD_MEM (regs[8], 8);
+ ADD_STRING (" R9: ");
+ ADD_MEM (regs[9], 8);
+ ADD_STRING (" R10: ");
+ ADD_MEM (regs[10], 8);
+ ADD_STRING (" R11: ");
+ ADD_MEM (regs[11], 8);
+ ADD_STRING ("\n R12: ");
+ ADD_MEM (regs[12], 8);
+ ADD_STRING (" R13: ");
+ ADD_MEM (regs[13], 8);
+ ADD_STRING (" SP: ");
+ ADD_MEM (regs[14], 8);
+ ADD_STRING (" PC: ");
+ ADD_MEM (regs[17], 8);
+ ADD_STRING ("\nDCCR: ");
+ ADD_MEM (regs[15], 8);
+ ADD_STRING (" SRP: ");
+ ADD_MEM (regs[16], 4);
+
+ /* Write the stuff out. */
+ writev (fd, iov, next_iov - iov);
+}
+
+#define REGISTER_DUMP register_dump (fd, ctx)
diff --git a/ports/sysdeps/unix/sysv/linux/cris/semctl.c b/ports/sysdeps/unix/sysv/linux/cris/semctl.c
new file mode 100644
index 000000000..e9b1a483c
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/semctl.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/semctl.c>
diff --git a/ports/sysdeps/unix/sysv/linux/cris/setegid.c b/ports/sysdeps/unix/sysv/linux/cris/setegid.c
new file mode 100644
index 000000000..2e3a54c89
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/setegid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setegid.c>
diff --git a/ports/sysdeps/unix/sysv/linux/cris/seteuid.c b/ports/sysdeps/unix/sysv/linux/cris/seteuid.c
new file mode 100644
index 000000000..18e41d08c
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/seteuid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/seteuid.c>
diff --git a/ports/sysdeps/unix/sysv/linux/cris/setfsgid.c b/ports/sysdeps/unix/sysv/linux/cris/setfsgid.c
new file mode 100644
index 000000000..088671256
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/setfsgid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setfsgid.c>
diff --git a/ports/sysdeps/unix/sysv/linux/cris/setfsuid.c b/ports/sysdeps/unix/sysv/linux/cris/setfsuid.c
new file mode 100644
index 000000000..a9f22eb8a
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/setfsuid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setfsuid.c>
diff --git a/ports/sysdeps/unix/sysv/linux/cris/setgid.c b/ports/sysdeps/unix/sysv/linux/cris/setgid.c
new file mode 100644
index 000000000..377021d9e
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/setgid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setgid.c>
diff --git a/ports/sysdeps/unix/sysv/linux/cris/setgroups.c b/ports/sysdeps/unix/sysv/linux/cris/setgroups.c
new file mode 100644
index 000000000..0e7086278
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/setgroups.c
@@ -0,0 +1,2 @@
+/* We also have to rewrite the kernel gid_t to the user land type. */
+#include <sysdeps/unix/sysv/linux/i386/setgroups.c>
diff --git a/ports/sysdeps/unix/sysv/linux/cris/setregid.c b/ports/sysdeps/unix/sysv/linux/cris/setregid.c
new file mode 100644
index 000000000..99c57ad20
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/setregid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setregid.c>
diff --git a/ports/sysdeps/unix/sysv/linux/cris/setresgid.c b/ports/sysdeps/unix/sysv/linux/cris/setresgid.c
new file mode 100644
index 000000000..daca1a483
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/setresgid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setresgid.c>
diff --git a/ports/sysdeps/unix/sysv/linux/cris/setresuid.c b/ports/sysdeps/unix/sysv/linux/cris/setresuid.c
new file mode 100644
index 000000000..3aeabe9ad
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/setresuid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setresuid.c>
diff --git a/ports/sysdeps/unix/sysv/linux/cris/setreuid.c b/ports/sysdeps/unix/sysv/linux/cris/setreuid.c
new file mode 100644
index 000000000..8ad61226e
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/setreuid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setreuid.c>
diff --git a/ports/sysdeps/unix/sysv/linux/cris/setrlimit.c b/ports/sysdeps/unix/sysv/linux/cris/setrlimit.c
new file mode 100644
index 000000000..bfaef74c3
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/setrlimit.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setrlimit.c>
diff --git a/ports/sysdeps/unix/sysv/linux/cris/setuid.c b/ports/sysdeps/unix/sysv/linux/cris/setuid.c
new file mode 100644
index 000000000..de394379b
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/setuid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setuid.c>
diff --git a/ports/sysdeps/unix/sysv/linux/cris/shmctl.c b/ports/sysdeps/unix/sysv/linux/cris/shmctl.c
new file mode 100644
index 000000000..7eac6380d
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/shmctl.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/shmctl.c>
diff --git a/ports/sysdeps/unix/sysv/linux/cris/socket.S b/ports/sysdeps/unix/sysv/linux/cris/socket.S
new file mode 100644
index 000000000..38b4ac5fb
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/socket.S
@@ -0,0 +1,96 @@
+/* Copyright (C) 1995, 1996, 1997, 1999, 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. */
+
+#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
+
+ .syntax no_register_prefix
+
+#ifndef __socket
+#define __socket P(__,socket)
+#endif
+
+ENTRY(__socket)
+ subq NARGS*4,sp
+
+#if NARGS >= 2
+ move.d sp,r9
+ move.d r10,[r9+]
+#else
+ move.d r10,[sp]
+#endif
+#if NARGS >= 2
+ move.d r11,[r9+]
+#endif
+#if NARGS >= 3
+ move.d r12,[r9+]
+#endif
+#if NARGS >= 4
+ move.d r13,[r9+]
+#endif
+#if NARGS >= 5
+ move.d [sp+NARGS*4],r13
+ move.d r13,[r9+]
+#endif
+#if NARGS >= 6
+ move.d [sp+NARGS*4+4],r13
+ move.d r13,[r9+]
+#endif
+#if NARGS >= 7
+ move.d [sp+NARGS*4+8],r13
+ move.d r13,[r9+]
+#endif
+#if NARGS >= 8
+ move.d [sp+NARGS*4+12],r13
+ move.d r13,[r9+]
+#endif
+#if NARGS >= 9
+#error Too many arguments!
+#endif
+ moveq P(SOCKOP_,socket),r10
+ move.d sp,r11
+ movu.w SYS_ify(socketcall),r9
+ break 13
+ cmps.w -4096,r10
+ bhs 0f
+ addq NARGS*4,sp
+ Ret
+ nop
+PSEUDO_END (__socket)
+
+weak_alias (__socket, socket)
diff --git a/ports/sysdeps/unix/sysv/linux/cris/sys/ucontext.h b/ports/sysdeps/unix/sysv/linux/cris/sys/ucontext.h
new file mode 100644
index 000000000..2d3aee076
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/sys/ucontext.h
@@ -0,0 +1,56 @@
+/* Copyright (C) 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 _SYS_UCONTEXT_H
+#define _SYS_UCONTEXT_H 1
+
+#include <features.h>
+#include <signal.h>
+
+#include <bits/sigcontext.h>
+
+
+/* Type for general register. */
+typedef long int greg_t;
+
+/* Number of general registers. */
+#define NGREG 20
+
+/* Container for all general registers. */
+typedef greg_t gregset_t[NGREG];
+
+/* A placeholder type for floating-point register. */
+typedef long int fpreg_t;
+
+/* A placeholder; CRIS does not have any fp regs. */
+typedef unsigned long fpregset_t;
+
+/* A machine context is exactly a sigcontext. */
+typedef struct sigcontext mcontext_t;
+
+/* Userlevel context. */
+typedef struct ucontext
+ {
+ unsigned long int uc_flags;
+ struct ucontext *uc_link;
+ stack_t uc_stack;
+ mcontext_t uc_mcontext;
+ __sigset_t uc_sigmask;
+ } ucontext_t;
+
+#endif /* sys/ucontext.h */
diff --git a/ports/sysdeps/unix/sysv/linux/cris/syscall.S b/ports/sysdeps/unix/sysv/linux/cris/syscall.S
new file mode 100644
index 000000000..03626b094
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/syscall.S
@@ -0,0 +1,40 @@
+/* Copyright (C) 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. */
+
+#include <sysdep.h>
+
+ .syntax no_register_prefix
+
+/* Make syscall (callno, ...) into a system call. */
+
+ENTRY (syscall)
+ move.d r10,r9
+ move.d r11,r10
+ move.d r12,r11
+ move.d r13,r12
+ move.d [sp],r13
+ move srp,[sp]
+ move [sp+4],mof
+ move [sp+8],srp
+ break 13
+ cmps.w -4096,r10
+ bhs 0f
+ move [sp],srp
+ Ret
+ nop
+PSEUDO_END (syscall)
diff --git a/ports/sysdeps/unix/sysv/linux/cris/sysdep.S b/ports/sysdeps/unix/sysv/linux/cris/sysdep.S
new file mode 100644
index 000000000..e53e7bbfb
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/sysdep.S
@@ -0,0 +1,66 @@
+/* Copyright (C) 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. */
+
+#include <sysdep.h>
+
+/* The syscall stubs jump here when they detect an error, bot for PIC and
+ non-PIC. */
+
+ .syntax no_register_prefix
+
+ENTRY (__syscall_error)
+ neg.d r10,r10
+
+#ifdef _LIBC_REENTRANT
+ push r10
+ push srp
+
+ /* Note that __syscall_error is only visible within this library,
+ and no-one passes it on as a pointer, so can assume that R0 (GOT
+ pointer) is correctly set up. */
+ PLTCALL (__errno_location)
+
+ pop srp
+ pop r11
+ move.d r11,[r10]
+
+#else /* not _LIBC_REENTRANT */
+# ifdef __PIC__
+ move.d [r0+C_SYMBOL_NAME(errno:GOT)],r9
+ move.d r10,[r9]
+# else
+ move.d r10,[C_SYMBOL_NAME(errno)]
+# endif
+#endif /* _LIBC_REENTRANT */
+
+#ifdef __PIC__
+/* PIC callers are supposed to have R0 on stack, ready for us to restore.
+ Callers are only allowed from within this DSO, so the GOT in r0 is the
+ one we want to use.
+
+ (Don't use "ret" - it's a macro). */
+
+ moveq -1,r10
+ Ret
+ pop r0
+#else
+ Ret
+ moveq -1,r10
+#endif
+
+END (__syscall_error)
diff --git a/ports/sysdeps/unix/sysv/linux/cris/sysdep.h b/ports/sysdeps/unix/sysv/linux/cris/sysdep.h
new file mode 100644
index 000000000..5013dd5d3
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/sysdep.h
@@ -0,0 +1,226 @@
+/* Assembler macros for CRIS.
+ Copyright (C) 1999, 2001, 2003 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 <asm/unistd.h>
+#include <sysdeps/cris/sysdep.h>
+#include <sys/syscall.h>
+#include "config.h"
+
+#undef SYS_ify
+#define SYS_ify(syscall_name) (__NR_##syscall_name)
+
+
+#ifdef __ASSEMBLER__
+
+/* 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
+#define SYS_ify(syscall_name) __NR_##syscall_name
+
+/* ELF-like local names start with `.L'. */
+#undef L
+#define L(name) .L##name
+
+/* 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. Linus said he will make sure the no syscall
+ returns a value in -1 .. -4095 as a valid result so we can safely
+ test with -4095. */
+
+/* Syscall wrappers consist of
+ #include <sysdep.h>
+ PSEUDO (...)
+ ret
+ PSEUDO_END (...)
+
+ which expand to the following. */
+
+/* Linux takes system call arguments in registers:
+ syscall number R9
+ arg 1 R10
+ arg 2 R11
+ arg 3 R12
+ arg 4 R13
+ arg 5 MOF
+ arg 6 SRP
+
+ The compiler calls us by the C convention:
+ syscall number in the DO_CALL macro
+ arg 1 R10
+ arg 2 R11
+ arg 3 R12
+ arg 4 R13
+ arg 5 [SP]
+ arg 6 [SP + 4]
+ */
+
+/* Note that we use "bhs", since we want to match
+ (unsigned) -4096 .. 0xffffffff. Using "ble" would match
+ -4096 .. -2**31. */
+#define PSEUDO(name, syscall_name, args) \
+ ENTRY (name) @ \
+ DOARGS_##args @ \
+ movu.w SYS_ify (syscall_name),$r9 @ \
+ break 13 @ \
+ cmps.w -4096,$r10 @ \
+ bhs 0f @ \
+ nop @ \
+ UNDOARGS_return_##args
+
+/* Ouch! We have to remember not to use "ret" in assembly-code.
+ ("Luckily", mnemonics are case-insensitive.)
+ Note that we assume usage is exactly:
+ PSEUDO (...)
+ ret
+ PSEUDO_END (...)
+ so we can put all payload into PSEUDO (except for error handling). */
+
+#define ret
+
+#define PSEUDO_END(name) \
+0: @ \
+ SETUP_PIC @ \
+ PLTJUMP (syscall_error) @ \
+ END (name)
+
+#define PSEUDO_NOERRNO(name, syscall_name, args) \
+ ENTRY (name) @ \
+ DOARGS_##args @ \
+ movu.w SYS_ify (syscall_name),$r9 @ \
+ break 13 @ \
+ UNDOARGS_return_##args
+
+#define ret_NOERRNO
+
+#define PSEUDO_END_NOERRNO(name) \
+ END (name)
+
+#define DOARGS_0
+#define DOARGS_1
+#define DOARGS_2
+#define DOARGS_3
+#define DOARGS_4
+#define DOARGS_5 \
+ move [$sp],$mof
+
+/* To avoid allocating stack-space, we re-use the arg 5 (MOF) entry by
+ storing SRP into it. If called with too-few arguments, we will crash,
+ but that will happen in the general case too. */
+#define DOARGS_6 \
+ DOARGS_5 @ \
+ move $srp,[$sp] @ \
+ move [$sp+4],$srp
+
+#define UNDOARGS_return_0 \
+ Ret @ \
+ nop
+
+#define UNDOARGS_return_1 UNDOARGS_return_0
+#define UNDOARGS_return_2 UNDOARGS_return_0
+#define UNDOARGS_return_3 UNDOARGS_return_0
+#define UNDOARGS_return_4 UNDOARGS_return_0
+#define UNDOARGS_return_5 UNDOARGS_return_0
+
+/* We assume the following code will be "ret" and "PSEUDO_END". */
+#define UNDOARGS_return_return_6 \
+ jump [$sp]
+
+#else /* not __ASSEMBLER__ */
+
+#undef INLINE_SYSCALL
+#define INLINE_SYSCALL(name, nr, args...) \
+ ({ \
+ unsigned long __sys_res; \
+ register unsigned long __res asm ("r10"); \
+ LOAD_ARGS_c_##nr (args) \
+ register unsigned long __callno asm ("r9") \
+ = SYS_ify (name); \
+ asm volatile (LOAD_ARGS_asm_##nr (args) \
+ "break 13" \
+ : "=r" (__res) \
+ : ASM_ARGS_##nr (args) \
+ : ASM_CLOBBER_##nr); \
+ __sys_res = __res; \
+ \
+ if (__sys_res >= (unsigned long) -4096) \
+ { \
+ __set_errno (- __sys_res); \
+ __sys_res = (unsigned long) -1; \
+ } \
+ (long int) __sys_res; \
+ })
+
+#define LOAD_ARGS_c_0()
+#define LOAD_ARGS_asm_0()
+#define ASM_CLOBBER_0 "memory"
+#define ASM_ARGS_0() "r" (__callno)
+
+#define LOAD_ARGS_c_1(r10) \
+ LOAD_ARGS_c_0() \
+ register unsigned long __r10 __asm__ ("r10") = (unsigned long) (r10);
+#define LOAD_ARGS_asm_1(r10) LOAD_ARGS_asm_0 ()
+#define ASM_CLOBBER_1 ASM_CLOBBER_0
+#define ASM_ARGS_1(r10) ASM_ARGS_0 (), "0" (__r10)
+
+#define LOAD_ARGS_c_2(r10, r11) \
+ LOAD_ARGS_c_1(r10) \
+ register unsigned long __r11 __asm__ ("r11") = (unsigned long) (r11);
+#define LOAD_ARGS_asm_2(r10, r11) LOAD_ARGS_asm_1 (r10)
+#define ASM_CLOBBER_2 ASM_CLOBBER_1
+#define ASM_ARGS_2(r10, r11) ASM_ARGS_1 (r10), "r" (__r11)
+
+#define LOAD_ARGS_c_3(r10, r11, r12) \
+ LOAD_ARGS_c_2(r10, r11) \
+ register unsigned long __r12 __asm__ ("r12") = (unsigned long) (r12);
+#define LOAD_ARGS_asm_3(r10, r11, r12) LOAD_ARGS_asm_2 (r10, r11)
+#define ASM_CLOBBER_3 ASM_CLOBBER_2
+#define ASM_ARGS_3(r10, r11, r12) ASM_ARGS_2 (r10, r11), "r" (__r12)
+
+#define LOAD_ARGS_c_4(r10, r11, r12, r13) \
+ LOAD_ARGS_c_3(r10, r11, r12) \
+ register unsigned long __r13 __asm__ ("r13") = (unsigned long) (r13);
+#define LOAD_ARGS_asm_4(r10, r11, r12, r13) LOAD_ARGS_asm_3 (r10, r11, r12)
+#define ASM_CLOBBER_4 ASM_CLOBBER_3
+#define ASM_ARGS_4(r10, r11, r12, r13) ASM_ARGS_3 (r10, r11, r12), "r" (__r13)
+
+#define LOAD_ARGS_c_5(r10, r11, r12, r13, mof) \
+ LOAD_ARGS_c_4(r10, r11, r12, r13)
+#define LOAD_ARGS_asm_5(r10, r11, r12, r13, mof) \
+ LOAD_ARGS_asm_4 (r10, r11, r12, r13) "move %6,$mof\n\t"
+#define ASM_CLOBBER_5 ASM_CLOBBER_4
+#define ASM_ARGS_5(r10, r11, r12, r13, mof) \
+ ASM_ARGS_4 (r10, r11, r12, r13), "g" (mof)
+
+#define LOAD_ARGS_c_6(r10, r11, r12, r13, mof, srp) \
+ LOAD_ARGS_c_5(r10, r11, r12, r13, mof)
+#define LOAD_ARGS_asm_6(r10, r11, r12, r13, mof, srp) \
+ LOAD_ARGS_asm_5(r10, r11, r12, r13, mof) \
+ "move %7,$srp\n\t"
+#define ASM_CLOBBER_6 ASM_CLOBBER_5, "srp"
+#define ASM_ARGS_6(r10, r11, r12, r13, mof, srp) \
+ ASM_ARGS_5 (r10, r11, r12, r13, mof), "g" (srp)
+
+#endif /* not __ASSEMBLER__ */
diff --git a/ports/sysdeps/unix/sysv/linux/cris/vfork.S b/ports/sysdeps/unix/sysv/linux/cris/vfork.S
new file mode 100644
index 000000000..74a855676
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/vfork.S
@@ -0,0 +1,27 @@
+/* Copyright (C) 1999, 2001, 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
+ 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>
+
+PSEUDO (__vfork, vfork, 0)
+ Ret
+ nop
+PSEUDO_END (__vfork)
+libc_hidden_def (__vfork)
+
+weak_alias (__vfork, vfork)
diff --git a/ports/sysdeps/unix/sysv/linux/cris/xstat.c b/ports/sysdeps/unix/sysv/linux/cris/xstat.c
new file mode 100644
index 000000000..e9869f550
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/cris/xstat.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/xstat.c>