diff options
| -rw-r--r-- | extra/Configs/Config.i960 | 219 | ||||
| -rw-r--r-- | libc/sysdeps/linux/i960/AUTHORS | 4 | ||||
| -rw-r--r-- | libc/sysdeps/linux/i960/Makefile | 80 | ||||
| -rw-r--r-- | libc/sysdeps/linux/i960/README | 72 | ||||
| -rw-r--r-- | libc/sysdeps/linux/i960/_mmap.S | 52 | ||||
| -rw-r--r-- | libc/sysdeps/linux/i960/bits/endian.h | 15 | ||||
| -rw-r--r-- | libc/sysdeps/linux/i960/bits/fcntl.h | 179 | ||||
| -rw-r--r-- | libc/sysdeps/linux/i960/bits/mman.h | 93 | ||||
| -rw-r--r-- | libc/sysdeps/linux/i960/bits/setjmp.h | 33 | ||||
| -rw-r--r-- | libc/sysdeps/linux/i960/bits/syscalls.h | 10 | ||||
| -rw-r--r-- | libc/sysdeps/linux/i960/bits/wordsize.h | 19 | ||||
| -rw-r--r-- | libc/sysdeps/linux/i960/clone.S | 62 | ||||
| -rw-r--r-- | libc/sysdeps/linux/i960/crt0.S | 49 | ||||
| -rw-r--r-- | libc/sysdeps/linux/i960/setjmp.S | 124 | ||||
| -rw-r--r-- | libc/sysdeps/linux/i960/specs.uclinux.gcc-2.95.i960-intel-coff | 64 | ||||
| -rw-r--r-- | libc/sysdeps/linux/i960/sys/procfs.h | 126 | ||||
| -rw-r--r-- | libc/sysdeps/linux/i960/sys/ucontext.h | 76 | ||||
| -rw-r--r-- | libc/sysdeps/linux/i960/vfork.S | 40 | 
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 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>         +#include <bits/errno.h> +         +/* clone is even more special than fork as it mucks with stacks +   and invokes a function in the right context after its all over.  */ +         +/* int _clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg); */ + +        .globl __clone +__clone:  +        /* set up new stack image in regs r4-r7; argument will be in r3 in child.  */ +        ldconst 0, r4                   /* pfp == 0 */ +        addo    16, g1, r5              /* sp == newfp + 16 */ +        mov     g0, r6                  /* rip == fnc */ +        mov     g2, r7 +        stq     r4, (g1) + +        addo    sp, 4, sp +        st      g10, -4(sp) +        mov     sp, g10 +        ldconst __NR_clone, g13 +        calls   0 + +        /* Do the system call */ +        cmpibg  0, g0, syscall_error    /* if < 0, error */ +        be      thread_start            /* if == 0, we're the child */ +        ret                             /* we're the parent */ + +syscall_error: +        not     g0, r3 +        callx   ___errno_location +        st      r3, (g0) +        ret + +thread_start: +        # our new pfp is in g1; here we go +        flushreg +        mov     g1, pfp +        flushreg +        ret diff --git a/libc/sysdeps/linux/i960/crt0.S b/libc/sysdeps/linux/i960/crt0.S new file mode 100644 index 000000000..b235e5c50 --- /dev/null +++ b/libc/sysdeps/linux/i960/crt0.S @@ -0,0 +1,49 @@ +# +# 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 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 +# + +/* + *         + * The behavior in this file is tightly coupled with how the linux kernel sets things up + * on the stack before calling us. + * + * Currently fs/binfmt_flat.c (for STACK_GROWS_UP) and arch/i960/kernel/process.c + * build things so that a pointer to argc is left in g13 by start_thread(). + * + * ^ + * |                        <- sp somewhere around here, after being aligned. + * |         + * |envp    -> envp[0] + * |argv    -> argv[0] + * |argc                    <- g13 + * + * A complete picture of how things are set up can be seen in the comments of + * create_flat_tables_stack_grows_up in fs/binfmt_flat.c + * + * I believe having to use this register could probably be avoided. + *         + */ +         +        .globl  start +start: +        mov     g13, r3 +        ldt     (r3), g0 +        callx   ___uClibc_main +         +/* We might want to add some instruction so that it crashes if main returns */ diff --git a/libc/sysdeps/linux/i960/setjmp.S b/libc/sysdeps/linux/i960/setjmp.S new file mode 100644 index 000000000..2133ef557 --- /dev/null +++ b/libc/sysdeps/linux/i960/setjmp.S @@ -0,0 +1,124 @@ +/******************************************************************************* + *  + * Copyright (c) 1993 Intel Corporation + *  + * Intel hereby grants you permission to copy, modify, and distribute this + * software and its documentation.  Intel grants this permission provided + * that the above copyright notice appears in all copies and that both the + * copyright notice and this permission notice appear in supporting + * documentation.  In addition, Intel grants this permission provided that + * you prominently mark as "not part of the original" any modifications + * made to this software or documentation, and that the name of Intel + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software or the documentation without specific, + * written prior permission. + *  + * Intel Corporation provides this AS IS, WITHOUT ANY WARRANTY, EXPRESS OR + * IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY + * OR FITNESS FOR A PARTICULAR PURPOSE.  Intel makes no guarantee or + * representations regarding the use of, or the results of the use of, + * the software and documentation in terms of correctness, accuracy, + * reliability, currentness, or otherwise; and you rely on the software, + * documentation and results solely at your own risk. + * + * IN NO EVENT SHALL INTEL BE LIABLE FOR ANY LOSS OF USE, LOSS OF BUSINESS, + * LOSS OF PROFITS, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES + * OF ANY KIND.  IN NO EVENT SHALL INTEL'S TOTAL LIABILITY EXCEED THE SUM + * PAID TO INTEL FOR THE PRODUCT LICENSED HEREUNDER. + *  + ******************************************************************************/ + +/*************************************************************************** + * + * Modified from the original in order to fit with  + * uClibc's setjmp, _setjmp, __sigsetjmp and ___sigjmp_save. + * + * + * int setjmp (jmp_buf __env)  is the BSD style setjmp function. + * It simply calls __sigsetjmp(env, 1) + * + * int _setjmp (jmp_buf __env) is the posix style setjmp function. + * It simply calls __sigsetjmp(env, 0) + * This is the one normally used. + * + ***************************************************************************/ + +        .text  +        .align  4 +        .globl _setjmp +        .globl __setjmp +         +_setjmp: +        mov 1, g1   /* __sigsetjmp(env, 1) */ +        bx __sigsetjmp + +__setjmp: +        mov 0, g1   /* __sigsetjmp(env, 0) */ +        bx __sigsetjmp      + +         +/******************************************************************************/ +/*                                                                            */ +/*      setjmp(), longjmp()                                                   */ +/*                                                                            */ +/******************************************************************************/ +	.file "setjmp.S" +	.text +	/* .link_pix */ + +	.align	4 +	.globl	__sigsetjmp +__sigsetjmp: +	flushreg +	andnot	0xf,pfp,g2	/* get pfp, mask out return status bits */ +	st	g2, 0x58(g0)	/* save fp of caller*/ +   /* save globals not killed by the calling convention */ +	stq	g8, 0x40(g0)	/* save g8-g11*/ +	st	g12, 0x50(g0)	/* save g12*/ +	st	g14, 0x54(g0)	/* save g14*/ +   /* save previous frame local registers */ +	ldq	(g2), g4	/* get previous frame pfp, sp, rip, r3 */ +	stq	g4, (g0)	/* save pfp, sp, rip, r3 */ +	ldq	0x10(g2), g4	/* get previous frame r4-r7 */ +	stq	g4, 0x10(g0)	/* save r4-r7 */ +	ldq	0x20(g2), g4	/* get previous frame r8-r11 */ +	stq	g4, 0x20(g0)	/* save r8-r11 */ +	ldq	0x30(g2), g4	/* get previous frame r12-r15 */ +	stq	g4, 0x30(g0)	/* save r12-r15 */ + +        bx ___sigjmp_save    + +   /* +    * fake a return to the place that called the corresponding __sigsetjmp +   */ +	.align	4 +	.globl	___longjmp +___longjmp: +	call	0f		/* ensure there is at least one stack frame */ + +0: +	flushreg		/* do this before swapping stack */ +	ld	0x58(g0), pfp	/* get fp of caller of setjmp */ +   /* restore local registers  +    * the following code modifies the frame of the function which originally  +    *  called setjmp. +    */ +	ldq	(g0), g4	/* get pfp, sp, rip, r3 */ +	stq	g4, (pfp)	/* restore pfp, sp, rip, r3 */ +	ldq	0x10(g0), g4	/* get r4-r7 */ +	stq	g4, 0x10(pfp)	/* restore r4-r7 */ +	ldq	0x20(g0), g4	/* get r8-r11 */ +	stq	g4, 0x20(pfp)	/* restore r8-r11 */ +	ldq	0x30(g0), g4	/* get r12-r15 */ +	stq	g4, 0x30(pfp)	/* restore r12-r15 */ +   /* restore global registers */ +	ldq	0x40(g0), g8	/* get old g8-g11 values */ +	ld	0x50(g0), g12	/* get old g12 value */ +	ld	0x54(g0), g14	/* get old g14 value */ + +	mov	g1, g0		/* get return value */ +	cmpo	g0, 0		/* make sure it is not zero */ +	bne	0f +	mov	1, g0		/* return 1 by default */ +0: +	ret			/* return to caller of __sigsetjmp */ diff --git a/libc/sysdeps/linux/i960/specs.uclinux.gcc-2.95.i960-intel-coff b/libc/sysdeps/linux/i960/specs.uclinux.gcc-2.95.i960-intel-coff new file mode 100644 index 000000000..cefd8533e --- /dev/null +++ b/libc/sysdeps/linux/i960/specs.uclinux.gcc-2.95.i960-intel-coff @@ -0,0 +1,64 @@ +*asm: +%{mka:-AKA}%{mkb:-AKB}%{msa:-ASA}%{msb:-ASB}	%{mmc:-AMC}%{mca:-ACA}%{mcc:-ACC}%{mcf:-ACF}        %{mja:-AJX}%{mjd:-AJX}%{mjf:-AJX}%{mrp:-AJX}	%{!mka:%{!mkb:%{!msa:%{!msb:%{!mmc:%{!mca:%{!mcc:%{!mcf:%{!mja:%{!mjd:%{!mjf:%{!mrp:-AKB}}}}}}}}}}}}	%{mlink-relax:-linkrelax} + +*asm_final: + + +*cpp: +%{mic*:-D__i960			%{mka:-D__i960KA}%{mkb:-D__i960KB}			%{mja:-D__i960JA}%{mjd:-D__i960JD}%{mjf:-D__i960JF}			%{mrp:-D__i960RP}			%{msa:-D__i960SA}%{msb:-D__i960SB}			%{mmc:-D__i960MC}			%{mca:-D__i960CA}%{mcc:-D__i960CC}			%{mcf:-D__i960CF}}	%{mka:-D__i960KA__ -D__i960_KA__}	%{mkb:-D__i960KB__ -D__i960_KB__}	%{msa:-D__i960SA__ -D__i960_SA__}	%{msb:-D__i960SB__ -D__i960_SB__}	%{mmc:-D__i960MC__ -D__i960_MC__}	%{mca:-D__i960CA__ -D__i960_CA__}	%{mcc:-D__i960CC__ -D__i960_CC__}	%{mcf:-D__i960CF__ -D__i960_CF__}	%{!mka:%{!mkb:%{!msa:%{!msb:%{!mmc:%{!mca:		%{!mcc:%{!mcf:-D__i960_KB -D__i960KB__ %{mic*:-D__i960KB}}}}}}}}}	%{mlong-double-64:-D__LONG_DOUBLE_64__} + +*cc1: +%{!mka:%{!mkb:%{!msa:%{!msb:%{!mmc:%{!mca:%{!mcc:%{!mcf:%{!mja:%{!mjd:%{!mjf:%{!mrp:-mka}}}}}}}}}}}}	 %{!gs*:%{!gc*:%{mbout:%{g*:-gstabs}}		       %{mcoff:%{g*:-gcoff}}		       %{!mbout:%{!mcoff:%{g*:-gstabs}}}}} + +*cc1plus: + + +*endfile: +crtn.o%s + +*link: +%{mka:-AKA}%{mkb:-AKB}%{msa:-ASA}%{msb:-ASB}	%{mmc:-AMC}%{mca:-ACA}%{mcc:-ACC}%{mcf:-ACF}        %{mja:-AJX}%{mjd:-AJX}%{mjf:-AJX}%{mrp:-AJX}	%{mbout:-Fbout}%{mcoff:-Fcoff}	%{mlink-relax:-relax} -r -d + +*lib: +-lc -lgcc + +*libgcc: + + +*startfile: +%{!shared:%{pg:pgcrt0%O%s}%{!pg:%{p:pcrt0%O%s}%{!p:crt0%O%s}}} crti.o%s + +*switches_need_spaces: + + +*signed_char: +%{!fsigned-char:%{!mic*:-D__CHAR_UNSIGNED__}} + +*predefines: +-Di960 -Di80960 -DI960 -DI80960 -Acpu(i960) -Amachine(i960) -Dunix -Dlinux -Asystem(posix) -D__linux__ -D__uClinux__ -DEMBED + +*cross_compile: +1 + +*version: +2.95.3 + +*multilib: +. !mnumerics !msoft-float !mlong-double-64;float mnumerics !msoft-float !mlong-double-64;soft-float !mnumerics msoft-float !mlong-double-64;ld64 !mnumerics !msoft-float mlong-double-64;float/ld64 mnumerics !msoft-float mlong-double-64;soft-float/ld64 !mnumerics msoft-float mlong-double-64; + +*multilib_defaults: +mnumerics + +*multilib_extra: + + +*multilib_matches: +msb mnumerics;msc mnumerics;mkb mnumerics;mkc mnumerics;mmc mnumerics;mcb mnumerics;mcc mnumerics;mjf mnumerics;msa msoft-float;mka msoft-float;mca msoft-float;mcf msoft-float;mnumerics mnumerics;msoft-float msoft-float;mlong-double-64 mlong-double-64; + +*linker: +collect2 + +*link_command: +%{!fsyntax-only:  %{!c:%{!M:%{!MM:%{!E:%{!S:%(linker) %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} 			%{r} %{s} %{t} %{u*} %{x} %{z} %{Z}			%{!A:%{!nostdlib:%{!nostartfiles:%S}}}			%{static:} %{L*} %D %o			%{!nostdlib:%{!nodefaultlibs:%G %L %G}}			%{!A:%{!nostdlib:%{!nostartfiles:%E}}}			%{T*}			 + }}}}}} + diff --git a/libc/sysdeps/linux/i960/sys/procfs.h b/libc/sysdeps/linux/i960/sys/procfs.h new file mode 100644 index 000000000..27abf8ef5 --- /dev/null +++ b/libc/sysdeps/linux/i960/sys/procfs.h @@ -0,0 +1,126 @@ +/* Copyright (C) 1996, 1997, 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_PROCFS_H +#define _SYS_PROCFS_H	1 + +/* This is somewhat modelled after the file of the same name on SVR4 +   systems.  It provides a definition of the core file format for ELF +   used on Linux.  It doesn't have anything to do with the /proc file +   system, even though Linux has one. + +   Anyway, the whole purpose of this file is for GDB and GDB only. +   Don't read too much into it.  Don't use it for anything other than +   GDB unless you know what you are doing.  */ + +#include <features.h> +#include <sys/time.h> +#include <sys/types.h> +#include <sys/user.h> + +__BEGIN_DECLS + +/* Type for a general-purpose register.  */ +typedef unsigned long elf_greg_t; + +/* And the whole bunch of them.  We could have used `struct +   user_regs_struct' directly in the typedef, but tradition says that +   the register set is an array, which does have some peculiar +   semantics, so leave it that way.  */ +#define ELF_NGREG (sizeof (struct user_regs_struct) / sizeof(elf_greg_t)) +typedef elf_greg_t elf_gregset_t[ELF_NGREG]; + +/* Register set for the floating-point registers.  */ +typedef struct user_m68kfp_struct elf_fpregset_t; + + +/* Signal info.  */ +struct elf_siginfo +  { +    int si_signo;			/* Signal number.  */ +    int si_code;			/* Extra code.  */ +    int si_errno;			/* Errno.  */ +  }; + + +/* Definitions to generate Intel SVR4-like core files.  These mostly +   have the same names as the SVR4 types with "elf_" tacked on the +   front to prevent clashes with Linux definitions, and the typedef +   forms have been avoided.  This is mostly like the SVR4 structure, +   but more Linuxy, with things that Linux does not support and which +   GDB doesn't really use excluded.  */ + +struct elf_prstatus +  { +    struct elf_siginfo pr_info;		/* Info associated with signal.  */ +    short int pr_cursig;		/* Current signal.  */ +    unsigned long int pr_sigpend;	/* Set of pending signals.  */ +    unsigned long int pr_sighold;	/* Set of held signals.  */ +    __pid_t pr_pid; +    __pid_t pr_ppid; +    __pid_t pr_pgrp; +    __pid_t pr_sid; +    struct timeval pr_utime;		/* User time.  */ +    struct timeval pr_stime;		/* System time.  */ +    struct timeval pr_cutime;		/* Cumulative user time.  */ +    struct timeval pr_cstime;		/* Cumulative system time.  */ +    elf_gregset_t pr_reg;		/* GP registers.  */ +    int pr_fpvalid;			/* True if math copro being used.  */ +  }; + + +#define ELF_PRARGSZ     (80)    /* Number of chars for args.  */ + +struct elf_prpsinfo +  { +    char pr_state;			/* Numeric process state.  */ +    char pr_sname;			/* Char for pr_state.  */ +    char pr_zomb;			/* Zombie.  */ +    char pr_nice;			/* Nice val.  */ +    unsigned long int pr_flag;		/* Flags.  */ +    unsigned short int pr_uid; +    unsigned short int pr_gid; +    int pr_pid, pr_ppid, pr_pgrp, pr_sid; +    /* Lots missing */ +    char pr_fname[16];			/* Filename of executable.  */ +    char pr_psargs[ELF_PRARGSZ];	/* Initial part of arg list.  */ +  }; + + +/* The rest of this file provides the types for emulation of the +   Solaris <proc_service.h> interfaces that should be implemented by +   users of libthread_db.  */ + +/* Addresses.  */ +typedef void *psaddr_t; + +/* Register sets.  Linux has different names.  */ +typedef elf_gregset_t prgregset_t; +typedef elf_fpregset_t prfpregset_t; + +/* We don't have any differences between processes and threads, +   therefore have only one PID type.  */ +typedef __pid_t lwpid_t; + +/* Process status and info.  In the end we do provide typedefs for them.  */ +typedef struct elf_prstatus prstatus_t; +typedef struct elf_prpsinfo prpsinfo_t; + +__END_DECLS + +#endif	/* sys/procfs.h */ diff --git a/libc/sysdeps/linux/i960/sys/ucontext.h b/libc/sysdeps/linux/i960/sys/ucontext.h new file mode 100644 index 000000000..8c55ea45b --- /dev/null +++ b/libc/sysdeps/linux/i960/sys/ucontext.h @@ -0,0 +1,76 @@ +/* Copyright (C) 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.  */ + +/* Don't rely on this, the interface is currently messed up and may need to +   be broken to be fixed.  */ +#ifndef _SYS_UCONTEXT_H +#define _SYS_UCONTEXT_H	1 + +#include <features.h> +#include <signal.h> + +/* We need the signal context definitions even if they are not used +   included in <signal.h>.  */ +#include <bits/sigcontext.h> + + +/* Type for general register.  */ +typedef unsigned long int greg_t; + +/* Number of general registers.  */ +#define NGREG	32 /* 16 global and 16 local */ + +/* Container for all general registers.  */ +/* gregset_t must be an array.  The below declared array corresponds to: +typedef struct gregset { +	greg_t	g_regs[32]; +	greg_t	g_hi; +	greg_t	g_lo; +	greg_t	g_pad[3]; +} gregset_t;  */ +typedef greg_t gregset_t[NGREG]; + +/* Container for all FPU registers.  */ +typedef struct fpregset { +    /* No floating point registers on most i960 */ + +    /* Otherwise, signal the missing implementation */ +#if defined(__i960SB) || defined(__i960KB) +#error Floating point support is not yet implemented for the i960 platform. +#endif +} fpregset_t; + + +/* Context to describe whole processor state.  */ +typedef struct +  { +    gregset_t gregs; +    fpregset_t fpregs; +  } 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/libc/sysdeps/linux/i960/vfork.S b/libc/sysdeps/linux/i960/vfork.S new file mode 100644 index 000000000..f519b66fe --- /dev/null +++ b/libc/sysdeps/linux/i960/vfork.S @@ -0,0 +1,40 @@ +# +# 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 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> +         +#ifndef __NR_vfork +#define __NR_vfork __NR_fork /* uClinux-2.0 only has fork which is vfork */ +#endif +      +        .globl _vfork +_vfork:  +        mov         g13, r3 +        ldconst     __NR_vfork, g13 +        calls       0 +        mov         r3, g13 +        cmpible     0, g0, 1f +        subo        g0, 0, r3 +        st          r3, _errno +1:       +        ret +  | 
