summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2002-06-18 01:10:28 +0000
committerEric Andersen <andersen@codepoet.org>2002-06-18 01:10:28 +0000
commitb34e006872e0c6c6f851ca36eda46d01e3ca0e6b (patch)
tree8206ca5739109e6482643cbea01975601c39b3b0
parent33a9fd74f98749da869c8d649f0a148768205867 (diff)
Patch from Martin Proulx <mproulx@okiok.com> to support
the i960 architecture.
-rw-r--r--extra/Configs/Config.i960219
-rw-r--r--libc/sysdeps/linux/i960/AUTHORS4
-rw-r--r--libc/sysdeps/linux/i960/Makefile80
-rw-r--r--libc/sysdeps/linux/i960/README72
-rw-r--r--libc/sysdeps/linux/i960/_mmap.S52
-rw-r--r--libc/sysdeps/linux/i960/bits/endian.h15
-rw-r--r--libc/sysdeps/linux/i960/bits/fcntl.h179
-rw-r--r--libc/sysdeps/linux/i960/bits/mman.h93
-rw-r--r--libc/sysdeps/linux/i960/bits/setjmp.h33
-rw-r--r--libc/sysdeps/linux/i960/bits/syscalls.h10
-rw-r--r--libc/sysdeps/linux/i960/bits/wordsize.h19
-rw-r--r--libc/sysdeps/linux/i960/clone.S62
-rw-r--r--libc/sysdeps/linux/i960/crt0.S49
-rw-r--r--libc/sysdeps/linux/i960/setjmp.S124
-rw-r--r--libc/sysdeps/linux/i960/specs.uclinux.gcc-2.95.i960-intel-coff64
-rw-r--r--libc/sysdeps/linux/i960/sys/procfs.h126
-rw-r--r--libc/sysdeps/linux/i960/sys/ucontext.h76
-rw-r--r--libc/sysdeps/linux/i960/vfork.S40
18 files changed, 1317 insertions, 0 deletions
diff --git a/extra/Configs/Config.i960 b/extra/Configs/Config.i960
new file mode 100644
index 000000000..8ab2cfea4
--- /dev/null
+++ b/extra/Configs/Config.i960
@@ -0,0 +1,219 @@
+# Library Configuration rules for uClibc
+#
+# This file contains rules which are shared between multiple Makefiles. All
+# normal configuration options live in the file named "Config". You probably
+# should not mess with this file unless you know what you are doing...
+#
+# Copyright (C) 2000 by Lineo, inc.
+# Copyright (C) 2000,2001 Erik Andersen <andersee@debian.org>
+#
+# This program 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.
+#
+# This program 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 this program; if not, write to the Free Software Foundation, Inc.,
+# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Derived in part from the Linux-8086 C library, the GNU C Library, and several
+# other sundry sources. Files within this library are copyright by their
+# respective copyright holders.
+
+NATIVE_CC = gcc
+
+# If you are running a cross compiler, you may want to set this
+# to something more interesting... Target architecture is determined
+# by asking this compiler what arch it compiles stuff for.
+CROSS = i960-intel-coff-
+CC = $(CROSS)gcc
+AR = $(CROSS)ar
+LD = $(CROSS)ld
+NM = $(CROSS)nm
+STRIPTOOL = $(CROSS)strip
+#STRIPTOOL = /bin/true
+
+# Set the following to `true' to make a debuggable build, and `false' for
+# production builds.
+DODEBUG = false
+
+# Compiler warnings you want to see
+WARNINGS=-Wall
+
+# Note that the kernel source you use to compile with should be the same as the
+# Linux kernel you run your apps on. uClibc doesn't even try to achieve binary
+# compatibility across kernel versions. So don't expect, for example, uClibc
+# compiled with Linux kernel 2.0.x to implement lchown properly, since 2.0.x
+# can't do that. Similarly, if you compile uClibc vs Linux 2.4.x kernel headers,
+# but then run on Linux 2.0.x, lchown will be compiled into uClibc, but won't
+# work at all. You have been warned.
+KERNEL_SOURCE=/home/mproulx/uClinux/linux-2.0.x
+
+# Set this to `false' if your CPU doesn't have a memory management unit (MMU).
+# Set it to `true' otherwise.
+HAS_MMU = false
+
+# Set this to `false' if you don't have/need basic floating point support
+# support in libc (strtod, printf, scanf). Set it to `true' otherwise.
+# If this is not true, then libm will not be built.
+HAS_FLOATING_POINT = false
+
+# Set to `true' if you want the math library to contain the full set
+# of C99 math library features. Costs an extra 35k or so on x86.
+DO_C99_MATH = false
+
+# Set this to `false' if you don't have/need "(unsigned) long long int" support.
+# Set it to `true' otherwise.
+# Affects *printf and *scanf functions.
+# Also omits strto(u)ll, and (u)lltostr from the library if `false'.
+HAS_LONG_LONG = true
+
+# Set this to 'false if you don't need shadow password support.
+HAS_SHADOW = false
+
+# Set this to `false' if you don't have/need locale support; `true' otherwise.
+# Note: Currently only affects the ctype functions. You must also generate
+# a locale file for anything but the C locale. See directory extra/locale for
+# a utility to do so. Also see the following option.
+HAS_LOCALE = false
+
+# Set this to the path of your uClibc locale file directory.
+# Warning! This must be different than the glibc locale directory to avoid
+# name conflicts, as the locale files are entirely different in format!
+LOCALE_DIR = "/usr/share/uClibc-locale/"
+
+# This specifies which malloc implementation is used.
+# "malloc-simple" is very, very small, but is also very, very dumb
+# and does not try to make good use of memory or clean up after itself.
+#
+# "malloc" on the other hand is a bit bigger, but is pretty smart thereby
+# minimizing memory wastage and reusing already allocated memory. This
+# can be lots faster and safer IMHO.
+#
+# "malloc-930716" is from libc-5.3.12 and was/is the standard gnu malloc.
+# It is actually smaller than "malloc", at least on i386. Right now, it
+# only works on i386 (and maybe m68k) because it needs sbrk.
+#MALLOC = malloc-simple
+MALLOC = malloc
+#MALLOC = malloc-930716
+
+# Having brk allows one to use malloc-930716, which is an order
+# of magnitude faster then "malloc" for most allocations, but
+# will do very bad things on MMU-less systems...
+EXCLUDE_BRK=true
+
+# If you want to collect common syscall code into one function, set to this to
+# `true'. Set it to false otherwise.
+# On i386 this saves about than 2.8k over all syscalls.
+# The idea came from the implementation in dietlibc.
+# At present, only affects i386.
+UNIFIED_SYSCALL = false
+
+# If you want large file support (greater then 2 GiB) turn this on.
+# Do not enable this unless your kernel provides large file support.
+DOLFS = false
+
+# Posix regular expression code is really big -- 27k all by itself.
+# If you don't use regular expressions, turn this off and save space.
+# Of course, if you only staticly link, leave this on, since it will
+# only be included in your apps if you use regular expressions.
+INCLUDE_REGEX=true
+
+# If you want to include RPC support, enable this. RPC is almost never used
+# for anything except NFS support, so unless you plan to use NFS, leave this
+# disabled. This is off by default.
+INCLUDE_RPC = true
+
+# If you want to include support for the next version of the Internet
+# Protocol: IP version 6, enable this. This is off by default.
+INCLUDE_IPV6 = false
+
+# If you want to include threads support, enable this. The C library will
+# be compiled thread-safe, and the libpthread library will be built.
+INCLUDE_THREADS = false
+
+# If you want to support only Unix 98 PTYs enable this. Some older
+# applications may need this disabled. For most current programs,
+# you can generally leave this true.
+UNIX98PTY_ONLY = false
+
+# Enable this if /dev/pts is on a devpts or devfs file system. Both
+# these filesystems automatically manage permissions on the /dev/pts
+# devices. You may need to mount this fs on /dev/pts for this to work.
+# This is true by default.
+ASSUME_DEVPTS = true
+
+
+# If you want to compile the library as PIC code, turn this on.
+# This is automagically enabled when HAVE_SHARED is true
+DOPIC = false
+
+#
+# ARCH_CFLAGS if your have something special to add to the CFLAGS
+#
+ARCH_CFLAGS = -mrp
+#
+#
+# get this from elsewhere, maybe
+#
+OPTIMIZATION = -O2 $(DEBUG_CFLAGS)
+
+# This is a COFF compiler (ick), so disable all the cool stuff
+HAVE_ELF = false
+
+
+
+# Enable support for shared libraries? If this is false, you can
+# ignore all the rest of the options in this file...
+HAVE_SHARED = false
+
+# uClibc has a native shared library loader for some architectures.
+BUILD_UCLIBC_LDSO=false
+
+# If you are using shared libraries, but do not want/have a native
+# uClibc shared library loader, please specify the name of your
+# system's shared library loader here...
+#SYSTEM_LDSO=/lib/ld-linux.so.2
+
+# When using shared libraries, this path is the location where the
+# shared library will be invoked. This value will be compiled into
+# every binary compiled with uClibc.
+#
+# BIG FAT WARNING:
+# If you do not have a shared library loader with the correct name
+# sitting in the directory this points to, your binaries will not run.
+#SHARED_LIB_LOADER_PATH=$(DEVEL_PREFIX)/lib
+
+# DEVEL_PREFIX is the directory into which the uClibc development
+# environment will be installed. The result will look something
+# like the following:
+# DEVEL_PREFIX/
+# bin/ <contains gcc, ld, etc>
+# lib/ <contains all runtime and static libs>
+# include/ <Where all the header files go>
+# This value is used by the 'make install' Makefile target. Since this
+# directory is compiled into the uclibc cross compiler spoofer, you
+# have to recompile if you change this value...
+DEVEL_PREFIX = /usr/local/cross-compilers/i960-intel-coff
+
+# SYSTEM_DEVEL_PREFIX is the directory prefix used when installing
+# usr/bin/arch-uclibc-gcc, usr/bin/arch-uclibc-ld, etc. This is only
+# used by the 'make install' target, and is not compiled into anything.
+# This defaults to $DEVEL_PREFIX, but makers of .rpms and .debs will
+# want to set this to "/" instead.
+#SYSTEM_DEVEL_PREFIX = $(DEVEL_PREFIX)
+SYSTEM_DEVEL_PREFIX = /tmp/uclibc-trashed
+
+# If you want 'make install' to install everything under a temporary
+# directory, the define PREFIX during the install step,
+# i.e., 'make PREFIX=/var/tmp/uClibc install'.
+#PREFIX = $(TOPDIR)/_install
+
+# C defiend symbols prefix charactor
+C_SYMBOL_PREFIX = _
+
diff --git a/libc/sysdeps/linux/i960/AUTHORS b/libc/sysdeps/linux/i960/AUTHORS
new file mode 100644
index 000000000..0d6554927
--- /dev/null
+++ b/libc/sysdeps/linux/i960/AUTHORS
@@ -0,0 +1,4 @@
+The initial support (inspired by what was done in an old i960 port of uC-libc):
+
+Martin Proulx <mproulx at okiok.com>
+http://www.okiok.com
diff --git a/libc/sysdeps/linux/i960/Makefile b/libc/sysdeps/linux/i960/Makefile
new file mode 100644
index 000000000..83ca37213
--- /dev/null
+++ b/libc/sysdeps/linux/i960/Makefile
@@ -0,0 +1,80 @@
+# Makefile for uClibc
+#
+# Copyright (C) 2000 by Lineo, inc.
+# Copyright (C) 2000,2001 Erik Andersen <andersen@uclibc.org>
+#
+# This program 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.
+#
+# This program 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 this program; if not, write to the Free Software Foundation, Inc.,
+# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Derived in part from the Linux-8086 C library, the GNU C Library, and several
+# other sundry sources. Files within this library are copyright by their
+# respective copyright holders.
+
+USE_CRT0_C=false
+
+TOPDIR=../../../../
+include $(TOPDIR)Rules.mak
+ASFLAGS=$(CFLAGS)
+
+ifeq ($(USE_CRT0_C),true)
+CRT0=crt0.c
+CRT0_OBJ=$(patsubst %.c,%.o, $(CRT0))
+else
+CRT0=crt0.S
+CRT0_OBJ=$(patsubst %.S,%.o, $(CRT0))
+endif
+
+SSRC=clone.S _mmap.S setjmp.S vfork.S
+ifeq ($(UNIFIED_SYSCALL),true)
+ SSRC += __uClibc_syscall.S
+endif
+SOBJS=$(patsubst %.S,%.o, $(SSRC))
+
+CSRC=
+COBJS=$(patsubst %.c,%.o, $(CSRC))
+
+OBJS=$(SOBJS) $(COBJS)
+
+
+all: $(OBJS) $(LIBC)
+
+$(LIBC): ar-target
+
+ar-target: $(OBJS) $(CRT0_OBJ)
+ $(AR) $(ARFLAGS) $(LIBC) $(OBJS)
+ cp $(CRT0_OBJ) $(TOPDIR)lib/$(CRT0_OBJ)
+
+ifeq ($(USE_CRT0_C),true)
+$(CRT0_OBJ): %.o : %.c
+else
+$(CRT0_OBJ): %.o : %.S
+endif
+ $(CC) $(CFLAGS) -c $< -o $@
+ $(STRIPTOOL) -x -R .note -R .comment $*.o
+
+$(SOBJS): %.o : %.S
+ $(CC) $(CFLAGS) -c $< -o $@
+ $(STRIPTOOL) -x -R .note -R .comment $*.o
+
+$(COBJS): %.o : %.c
+ $(CC) $(CFLAGS) -c $< -o $@
+ $(STRIPTOOL) -x -R .note -R .comment $*.o
+
+headers:
+
+
+clean:
+ rm -f *.[oa] *~ core
+ rm -f bits/syscall.h
+
diff --git a/libc/sysdeps/linux/i960/README b/libc/sysdeps/linux/i960/README
new file mode 100644
index 000000000..db4567a55
--- /dev/null
+++ b/libc/sysdeps/linux/i960/README
@@ -0,0 +1,72 @@
+Overview
+---------------------------------------------------------------------------
+
+This is the README file for the i960 support in uClibc.
+
+This has been tested with gcc 2.95.3 and i960-intel-coff target.
+
+There is no support at all to compile with the intel CTOOLS, as this would
+have required too many changes to uClibc. So you won't see any support
+in the asm files for position independent data or code.
+
+Quirks needed
+---------------------------------------------------------------------------
+
+prepended underscore
+--------------------
+
+As the i960 compiler prepends an underscore to symbols, it is critical that
+the Config file define C_SYMBOL_PREFIX as
+ C_SYMBOL_PREFIX = _
+to make sure that underscores are applied to symbol names when needed.
+
+
+__va_copy in va-i960.h
+----------------------
+
+When compiled with gcc-2.95, the __va_copy macro in va-i960.h seems to be broken
+and it has to be modified in order for uClibc to compile correctly.
+
+Change:
+
+#define __va_copy(dest, src) (dest) = (src)
+
+To:
+
+#define __va_copy(dest, src) dest[0] = src[0]; dest[1] = src[1]
+
+
+gcc integration
+---------------------------------------------------------------------------
+
+I'm personnaly not using the gcc-uClibc wrapper.
+I've preferred modifying the specs file so that the i960-intel-coff compiler
+directly compiles with uClibc.
+
+First, compile and install the standard i960-intel-coff compiler, which is meant
+to be used with newlib.
+
+Then, compile uClibc, installing over the newlib include files and libraries.
+
+Update the specs file with the included specs.uclinux.gcc-2.95.i960-intel-coff
+
+This specs file always build relocatable objects, which has the disadvantage
+of not letting you know if the link is missing any symbols.
+
+coff2flt
+---------------------------------------------------------------------------
+
+In order to run the executables under uClinux, fully relocatable binaries
+need to be built using coff2flt.
+
+We have built a working coff2flt that works with the i960 and the current version
+of binfmt_flat with uClinux.
+
+Contact Martin Proulx <mproulx at okiok.com> for further informations.
+
+
+
+
+
+Check:
+ _mmap.S: besoin???
diff --git a/libc/sysdeps/linux/i960/_mmap.S b/libc/sysdeps/linux/i960/_mmap.S
new file mode 100644
index 000000000..bc4267948
--- /dev/null
+++ b/libc/sysdeps/linux/i960/_mmap.S
@@ -0,0 +1,52 @@
+#
+# __mmap.S, part of the i960 support for the uClibc library.
+#
+# Copyright (C) 2002 by Okiok Data Ltd. http://www.okiok.com/
+#
+# This program 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.
+#
+# This program 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 this program; if not, write to the Free Software Foundation, Inc.,
+# at 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Derived from an old port of uC-libc to the i960 by Keith Adams (kma@cse.ogi.edu).
+#
+
+#include <sys/syscall.h>
+
+/* This is a plain system call. The 6 arguments are already set up correctly */
+/* void * mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset) */
+
+
+ .globl _mmap
+_mmap:
+ mov g13, r3
+ ldconst __NR_mmap, g13
+ calls 0
+ mov r3, g13
+
+ /* We now need to check if the return value is a small negative integer. */
+ /* This is somewhat tricky as the return code (normally an address) is an */
+ /* unsigned type, or an ordinal in i960 assembler. */
+ /* We'll use the fact that, integers from -256 to -1 are ordinals 0xFFFFFF00 to 0xFFFFFFFF. */
+ /* So by checking that the return address is in the top range of the ordinals, we'll */
+ /* in fact be checking if it's not an encoded negated erro code. */
+
+ /* The range -256 to -1 should be enough since that in uClinux 2.0.39, there are */
+ /* 124 system calls for the i960. */
+
+ ldconst 0xFFFFFF00, r3 /* This is the integer's -256 representation */
+ cmpobl g0, r3, 1f /* Something smaller than this means it's out of the range, and a valid address */
+ subi g0, 0, r3 /* If it's an errno, save its negated (now positive) value in _errno. */
+ st r3, _errno
+ subi 1, 0, g0 /* And return -1. */
+1:
+ ret
diff --git a/libc/sysdeps/linux/i960/bits/endian.h b/libc/sysdeps/linux/i960/bits/endian.h
new file mode 100644
index 000000000..e2b13161c
--- /dev/null
+++ b/libc/sysdeps/linux/i960/bits/endian.h
@@ -0,0 +1,15 @@
+/* This file should define __BYTE_ORDER as appropriate for the machine
+ in question. See string/endian.h for how to define it.
+
+ If only the stub bits/endian.h applies to a particular configuration,
+ bytesex.h is generated by running a program on the host machine.
+ So if cross-compiling to a machine with a different byte order,
+ the bits/endian.h file for that machine must exist. */
+
+#ifndef _ENDIAN_H
+# error "Never use <bits/endian.h> directly; include <endian.h> instead."
+#endif
+
+#define __BYTE_ORDER __LITTLE_ENDIAN
+
+
diff --git a/libc/sysdeps/linux/i960/bits/fcntl.h b/libc/sysdeps/linux/i960/bits/fcntl.h
new file mode 100644
index 000000000..36b504a54
--- /dev/null
+++ b/libc/sysdeps/linux/i960/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 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. */
+#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/libc/sysdeps/linux/i960/bits/mman.h b/libc/sysdeps/linux/i960/bits/mman.h
new file mode 100644
index 000000000..45663c963
--- /dev/null
+++ b/libc/sysdeps/linux/i960/bits/mman.h
@@ -0,0 +1,93 @@
+/* Definitions for POSIX memory map interface. Linux/i960 version.
+ Copyright (C) 1997, 2000 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#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. */
+
+/* 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/libc/sysdeps/linux/i960/bits/setjmp.h b/libc/sysdeps/linux/i960/bits/setjmp.h
new file mode 100644
index 000000000..29fe2439f
--- /dev/null
+++ b/libc/sysdeps/linux/i960/bits/setjmp.h
@@ -0,0 +1,33 @@
+/* Define the machine-dependent type `jmp_buf'. i960 version. */
+
+#ifndef _SETJMP_H
+# error "Never include <bits/setjmp.h> directly; use <setjmp.h> instead."
+#endif
+
+/*
+ * assume that every single local and global register
+ * must be saved.
+ *
+ * ___SAVEREGS is the number of quads to save.
+ *
+ * Using the structure will guarantee quad-word alignment for the
+ * jmp_buf type.
+ */
+
+#define ___SAVEREGS 8
+
+typedef struct __jmp_buf__ {
+ long _q0;
+ long _q1;
+ long _q2;
+ long _q3;
+} __attribute__ ((aligned (16))) __jmp_buf[___SAVEREGS] ;
+
+/* I have not yet figured out what this should be for the i960... */
+
+#if 0
+/* Test if longjmp to JMPBUF would unwind the frame
+ containing a local variable at ADDRESS. */
+#define _JMPBUF_UNWINDS(jmpbuf, address) \
+ ((void *) (address) < (jmpbuf)[0].__sp)
+#endif
diff --git a/libc/sysdeps/linux/i960/bits/syscalls.h b/libc/sysdeps/linux/i960/bits/syscalls.h
new file mode 100644
index 000000000..5c30e2193
--- /dev/null
+++ b/libc/sysdeps/linux/i960/bits/syscalls.h
@@ -0,0 +1,10 @@
+/*
+ * nothing needed here until we want pthread support or similar
+ */
+
+#include <features.h>
+/* Do something very evil for now. Until we include our out syscall
+ * macros, short circuit bits/syscall.h and use asm/unistd.h instead */
+#define _BITS_SYSCALL_H
+#include <asm/unistd.h>
+
diff --git a/libc/sysdeps/linux/i960/bits/wordsize.h b/libc/sysdeps/linux/i960/bits/wordsize.h
new file mode 100644
index 000000000..ba643b60a
--- /dev/null
+++ b/libc/sysdeps/linux/i960/bits/wordsize.h
@@ -0,0 +1,19 @@
+/* Copyright (C) 1999 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#define __WORDSIZE 32
diff --git a/libc/sysdeps/linux/i960/clone.S b/libc/sysdeps/linux/i960/clone.S
new file mode 100644
index 000000000..e6d504bb7
--- /dev/null
+++ b/libc/sysdeps/linux/i960/clone.S
@@ -0,0 +1,62 @@
+#
+# clone.S, part of the i960 support for the uClibc library.
+#
+# Copyright (C) 2002 by Okiok Data Ltd. http://www.okiok.com/
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the t