diff options
author | Eric Andersen <andersen@codepoet.org> | 2002-06-18 01:10:28 +0000 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2002-06-18 01:10:28 +0000 |
commit | b34e006872e0c6c6f851ca36eda46d01e3ca0e6b (patch) | |
tree | 8206ca5739109e6482643cbea01975601c39b3b0 /libc | |
parent | 33a9fd74f98749da869c8d649f0a148768205867 (diff) |
Patch from Martin Proulx <mproulx@okiok.com> to support
the i960 architecture.
Diffstat (limited to 'libc')
-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 |
17 files changed, 1098 insertions, 0 deletions
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 + |