From c7757f181f0bd52206059f2685a5197113aca76f Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Wed, 8 Oct 2003 18:15:50 +0000 Subject: Patch from George Thanos adding support for the "e1" architecture. --- libc/sysdeps/linux/e1/Makefile | 66 +++++ libc/sysdeps/linux/e1/bits/endian.h | 7 + libc/sysdeps/linux/e1/bits/fcntl.h | 180 ++++++++++++ libc/sysdeps/linux/e1/bits/fenv.h | 88 ++++++ libc/sysdeps/linux/e1/bits/fenvinline.h | 298 +++++++++++++++++++ libc/sysdeps/linux/e1/bits/kernel_stat.h | 57 ++++ libc/sysdeps/linux/e1/bits/kernel_types.h | 45 +++ libc/sysdeps/linux/e1/bits/mman.h | 75 +++++ libc/sysdeps/linux/e1/bits/proto.h | 5 + libc/sysdeps/linux/e1/bits/setjmp.h | 18 ++ libc/sysdeps/linux/e1/bits/syscalls.h | 22 ++ libc/sysdeps/linux/e1/bits/unistd.h | 464 ++++++++++++++++++++++++++++++ libc/sysdeps/linux/e1/bits/wordsize.h | 22 ++ libc/sysdeps/linux/e1/crt0.S | 8 + libc/sysdeps/linux/e1/crt1.c | 48 ++++ libc/sysdeps/linux/e1/longjmp.c | 72 +++++ libc/sysdeps/linux/e1/setjmp.c | 54 ++++ libc/sysdeps/linux/e1/sys/procfs.h | 31 ++ libc/sysdeps/linux/e1/sys/reg.h | 25 ++ libc/sysdeps/linux/e1/sys/ucontext.h | 109 +++++++ libc/sysdeps/linux/e1/syscalls.c | 11 + libc/sysdeps/linux/e1/vfork.c | 7 + 22 files changed, 1712 insertions(+) create mode 100644 libc/sysdeps/linux/e1/Makefile create mode 100644 libc/sysdeps/linux/e1/bits/endian.h create mode 100644 libc/sysdeps/linux/e1/bits/fcntl.h create mode 100644 libc/sysdeps/linux/e1/bits/fenv.h create mode 100644 libc/sysdeps/linux/e1/bits/fenvinline.h create mode 100644 libc/sysdeps/linux/e1/bits/kernel_stat.h create mode 100644 libc/sysdeps/linux/e1/bits/kernel_types.h create mode 100644 libc/sysdeps/linux/e1/bits/mman.h create mode 100644 libc/sysdeps/linux/e1/bits/proto.h create mode 100644 libc/sysdeps/linux/e1/bits/setjmp.h create mode 100644 libc/sysdeps/linux/e1/bits/syscalls.h create mode 100644 libc/sysdeps/linux/e1/bits/unistd.h create mode 100644 libc/sysdeps/linux/e1/bits/wordsize.h create mode 100644 libc/sysdeps/linux/e1/crt0.S create mode 100644 libc/sysdeps/linux/e1/crt1.c create mode 100644 libc/sysdeps/linux/e1/longjmp.c create mode 100644 libc/sysdeps/linux/e1/setjmp.c create mode 100644 libc/sysdeps/linux/e1/sys/procfs.h create mode 100644 libc/sysdeps/linux/e1/sys/reg.h create mode 100644 libc/sysdeps/linux/e1/sys/ucontext.h create mode 100644 libc/sysdeps/linux/e1/syscalls.c create mode 100644 libc/sysdeps/linux/e1/vfork.c (limited to 'libc/sysdeps/linux/e1') diff --git a/libc/sysdeps/linux/e1/Makefile b/libc/sysdeps/linux/e1/Makefile new file mode 100644 index 000000000..45ee29989 --- /dev/null +++ b/libc/sysdeps/linux/e1/Makefile @@ -0,0 +1,66 @@ +# Makefile for uClibc +# +# Copyright (C) 2000-2003 Erik Andersen +# +# 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 + +TOPDIR=../../../../ +include $(TOPDIR)Rules.mak +ASFLAGS=$(CFLAGS) + +# If you're looking for vfork(), it is defined in include/unistd.h + + +CRT0=crt0.S +CRT0_OBJ=$(patsubst %.S,%.o, $(CRT0)) + +SSRC= +SOBJS=$(patsubst %.S,%.o, $(SSRC)) + +CSRC=crt1.c syscalls.c longjmp.c setjmp.c vfork.c +COBJS=$(patsubst %.c,%.o, $(CSRC)) + +OBJS=$(SOBJS) $(MOBJ) $(COBJS) $(CRT0_OBJ) + +all: $(OBJS) $(LIBC) + +$(LIBC): ar-target + +ar-target: $(OBJS) $(CRT0_OBJ) # Tassos + $(AR) $(ARFLAGS) $(LIBC) $(OBJS) #Tassos + cp $(CRT0_OBJ) $(TOPDIR)lib/$(CRT0_OBJ) #Tassos + +$(CRT0_OBJ): %.o : %.S + $(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/sysnum.h +ifneq ($(strip $(HAVE_ELF)),y) + rm -f $(TOPDIR)/include/float.h +endif + diff --git a/libc/sysdeps/linux/e1/bits/endian.h b/libc/sysdeps/linux/e1/bits/endian.h new file mode 100644 index 000000000..6d119f75a --- /dev/null +++ b/libc/sysdeps/linux/e1/bits/endian.h @@ -0,0 +1,7 @@ +/* e1 is big-endian. */ /*Tassos*/ + +#ifndef _ENDIAN_H +# error "Never use directly; include instead." +#endif + +#define __BYTE_ORDER __BIG_ENDIAN diff --git a/libc/sysdeps/linux/e1/bits/fcntl.h b/libc/sysdeps/linux/e1/bits/fcntl.h new file mode 100644 index 000000000..4b41b4715 --- /dev/null +++ b/libc/sysdeps/linux/e1/bits/fcntl.h @@ -0,0 +1,180 @@ +/* O_*, F_*, FD_* bit values for Linux. + Copyright (C) 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 directly; include instead." +#endif + + +#include + +/* 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_DIRECTORY 040000 /* Must be a directory. */ +# define O_NOFOLLOW 0100000 /* Do not follow links. */ +# define O_DIRECT 0200000 /* Direct disk access. */ +# define O_STREAMING 04000000/* streaming access */ +#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 0400000 +#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/e1/bits/fenv.h b/libc/sysdeps/linux/e1/bits/fenv.h new file mode 100644 index 000000000..dde6aceaa --- /dev/null +++ b/libc/sysdeps/linux/e1/bits/fenv.h @@ -0,0 +1,88 @@ + +/* Copyright (C) 2002-2003, George Thanos + Yannis Mitsos + + Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc. + + 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 _FENV_H +# error "Never use directly; include instead." +#endif + + +/* Define bits representing the exception. We use the bit positions of + the appropriate bits in the SR. */ +enum + { + FE_INEXACT = (1 << 8), +#define FE_INEXACT FE_INEXACT + FE_UNDERFLOW = (1 << 9), +#define FE_UNDERFLOW FE_UNDERFLOW + FE_OVERFLOW = (1 << 10), +#define FE_OVERFLOW FE_OVERFLOW + FE_DIVBYZERO = (1 << 11), +#define FE_DIVBYZERO FE_DIVBYZERO + FE_INVALID = (1 << 12) +#define FE_INVALID FE_INVALID + }; + +#define FE_ALL_EXCEPT \ + (FE_INEXACT | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID) + +/* We support all of the four defined rounding modes. We use + the bit positions in the FPCR Mode Control Byte as the values for the + appropriate macros. */ +enum + { + FE_TONEAREST = 0, +#define FE_TONEAREST FE_TONEAREST + FE_TOWARDZERO = 1 << 13 , +#define FE_TOWARDZERO FE_TOWARDZERO + FE_DOWNWARD = 2 << 13, +#define FE_DOWNWARD FE_DOWNWARD + FE_UPWARD = 3 << 13 +#define FE_UPWARD FE_UPWARD + }; + + +/* Type representing exception flags. */ +typedef unsigned int fexcept_t; + + +/* Type representing floating-point environment.*/ +typedef struct +{ + unsigned int round_mode; + unsigned int trap_enabled; + unsigned int accrued_except; + unsigned int actual_except; +} fenv_t; + +#if 0 +/* If the default argument is used we use this value. */ +const fenv FE_DFL_ENV_OBJ = {0, 0x1C00, 0} +#define FE_DFL_ENV (&FE_DFL_ENV_OBJ) + +#ifdef __USE_GNU +/* Floating-point environment where none of the exceptions are masked. */ +const fenv_t FE_NOMASK_ENV_OBJ = { 0, 0x1F00, 0 }; +# define FE_NOMASK_ENV (&FE_NOMASK_ENV_OBJ) +#endif + +#endif + +#include diff --git a/libc/sysdeps/linux/e1/bits/fenvinline.h b/libc/sysdeps/linux/e1/bits/fenvinline.h new file mode 100644 index 000000000..27ee172a5 --- /dev/null +++ b/libc/sysdeps/linux/e1/bits/fenvinline.h @@ -0,0 +1,298 @@ +/* + Inline floating-point environment handling functions for Hyperstone e1-32X. + Copyright (C) 2002-2003, George Thanos + Yannis Mitsos + + Copyright (C) 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + 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. */ + +#if defined __GNUC__ && !defined _SOFT_FLOAT && !defined __NO_MATH_INLINES + +/********************************************************** + * --- A small description of the E1-16/32X FP unit. --- + * FP exceptions can be enabled and disabled through + * , . + * + * - When an enabled exception takes place a SIGFPE signal + * is sent to the process by the exception handler. User + * can test for the exception that took place through + * . + * feraiseexcept works only for accrued exceptions. + * + * - When a disabld exception takes place it does not generate + * a trap. The user can check if any exception took place after + * an FP instruction by issuing an command. + * User should first clear the G2 register by issuing an + * function. + * The following program is a typical example of how the user + * should check for exceptions that did not generate a SIGFPE + * signal : + * { + * double f; + * int raised; + * feclearexcept (FE_ALL_EXCEPT); + * f = compute (); + * raised = fetestexcept (FE_OVERFLOW | FE_INVALID); + * if (raised & FE_OVERFLOW) { ... } + * if (raised & FE_INVALID) { ... } + * ... + * } + ***********************************************************/ + +/* Get FPU rounding mode */ +#define fegetround() \ +({ \ + unsigned int tmp; \ + asm volatile("mov %0, SR" \ + :"=l"(tmp) \ + :/*no input*/); \ + tmp &= (3<<13); \ + (tmp); \ +}) + +/* Set FPU rounding mode */ +#define fesetround(round) \ +({ \ + unsigned int tmp = (3 << 13); \ + while(1) { \ + /* Clear SR.FRM field */ \ + asm volatile("andn SR, %0" \ + :/*no output*/ \ + :"l"(tmp) ); \ + tmp &= round; \ + \ + if(tmp) { \ + tmp = -1; \ + break; \ + } \ + \ + asm volatile("or SR, %0" \ + :/*no input*/ \ + :"l"(round) ); \ + tmp = 0; \ + break; \ + } \ + (tmp); \ +}) + +/* The following functions test for accrued exceptions. + * No trap is generated on an FP exception. + */ +static inline feclearexcept(int __excepts) +{ + unsigned int enabled_excepts, disabled_excepts; + + /* Check that __excepts is correctly set */ + if( __excepts & (~0x1F00) ) + return -1; + + asm volatile("mov %0, SR" + :"=l"(enabled_excepts) + :/*no input*/ ); + + enabled_excepts &= 0x1F00; + disabled_excepts = ~enabled_excepts; + disabled_excepts &= 0x1F00; + + enabled_excepts &= __excepts; + disabled_excepts &= __excepts; + + /* Clear accrued exceptions */ + asm volatile("andn G2, %0\n\t" + "andn G2, %1\n\t" + :/*no output*/ + :"l"(enabled_excepts), + "l"(disabled_excepts >> 8) ); + return 0; +} + +/* fetestexcepts tests both for actual and accrued + * excepts. You can test for an exception either after + * an FP instruction or within a SIGFPE handler + */ +inline int fetestexcept(int __excepts) +{ + unsigned int G2, G2en, G2dis; + unsigned int enabled_excepts, disabled_excepts; + + /* Check that __excepts is correctly set */ + if( __excepts & (~0x1F00) ) + return -1; + + asm volatile("mov %0, SR" + :"=l"(enabled_excepts) + :/*no input*/ ); + + enabled_excepts &= 0x1F00; + disabled_excepts = ~enabled_excepts; + disabled_excepts &= 0x1F00; + + asm volatile("mov %0, G2" + :"=l"(G2) + :/*no input*/ ); + + G2en = G2 & 0x1F00; + G2dis = G2 & 0x1F; + G2en &= enabled_excepts; + G2dis &= (disabled_excepts >> 8); + return ( G2en | (G2dis << 8) ); +} + +static inline int feraiseexcept(int __excepts) +{ + asm volatile("or G2, %0" + :/*no output*/ + :"l"( __excepts >> 8 ) ); + return 0; +} + +/* The following functions enable/disable individual exceptions. + * If enabling an exception trap is going to occur, in case of error. + */ +#define feenableexcept(__excepts) \ +({ \ + int __retval, __pexcepts; \ + int __tmpexcepts = __excepts; \ + \ + while(1) { \ + asm volatile("mov %0, SR" \ + :"=l"(__pexcepts) \ + :/*no input*/ ); \ + __pexcepts &= 0x1F00; \ + \ +/* Check if __except values are valid */ \ + if( __tmpexcepts & ~0x1F00 ) { \ + __retval = -1; \ + fprintf(stderr,"Non valid excepts\n");\ + break; \ + } \ + \ + asm volatile("or SR, %0" \ + :/*no output*/ \ + :"l"(__tmpexcepts) ); \ + __retval = __pexcepts; \ + break; \ + } \ + (__retval); \ +}) + + +#define fedisableexcept(__excepts) \ +({ \ + int __retval, __pexcepts; \ + int __tmpexcepts = __excepts; \ + \ + while(1) { \ + asm volatile("mov %0, SR" \ + :"=l"(__pexcepts) \ + :/*no input*/ ); \ + __pexcepts &= 0x1F00; \ + \ +/* Check if __except values are valid */ \ + if( __tmpexcepts & ~0x1F00 ) { \ + __retval = -1; \ + fprintf(stderr,"Non valid excepts\n");\ + break; \ + } \ + \ + asm volatile("andn SR, %0" \ + :/*no output*/ \ + :"l"(__tmpexcepts) ); \ + __retval = __pexcepts; \ + break; \ + } \ + (__retval); \ +}) + +static inline int fegetexcept(int excepts) +{ + unsigned int tmp; + asm volatile("mov %0, SR" + :"=l"(tmp) + :/*no input*/ ); + tmp &= 0x1F00; + return tmp; +} + +static inline int fegetenv(fenv_t *envp) +{ + asm volatile("mov %0, SR\n\t + mov %1, SR\n\t + mov %2, G2\n\t + mov %3, G2\n\t" + :"=l"(envp->round_mode), + "=l"(envp->trap_enabled), + "=l"(envp->accrued_except), + "=l"(envp->actual_except) + :/*no input*/ ); + envp->round_mode &= (3<<13); + envp->trap_enabled &= 0x1F00; + envp->accrued_except &= 0x1F; + envp->accrued_except <<= 8; + envp->actual_except &= 0x1F00; +} + +#define feholdexcept(envp) \ +( \ + fegetenv(envp); \ + fedisableexcept(FE_ALL_EXCEPT); \ + feclearexcept(FE_ALL_EXCEPT); \ + (0); \ +) + +#define fesetenv(envp) \ +({ \ + /* Clear FRM & FTE field of SR */ \ + unsigned long clearSR = ( 127<<8 ); \ + asm volatile("andn SR, %0\n\t" \ + "or SR, %1\n\t" \ + "or SR, %2\n\t" \ + :/*no output*/ \ + :"l"(clearSR), \ + "l"(envp->round_mode), \ + "l"(envp->trap_enabled) ); \ + asm volatile("andn G2, 0x1F1F\n\t" \ + "or G2, %0\n\t" \ + "or G2, %1\n\t" \ + :/*no output*/ \ + :"l"( envp->accrued_except >> 8),\ + :"l"( envp->actual_except ) ); \ + (0); /* return 0 */ \ +}) + +#define feupdateenv(envp) \ +({ \ + /* Clear FRM & FTE field of SR */ \ + asm volatile(/* We dont clear the prev SR*/ \ + "or SR, %1\n\t" \ + "or SR, %2\n\t" \ + :/*no output*/ \ + :"l"(clearSR), \ + "l"(envp->round_mode), \ + "l"(envp->accrued_except) ); \ + asm volatile(/* We dont clear the prev SR*/ \ + "or G2, %0\n\t" \ + "or G2, %1\n\t" \ + :/*no output*/ \ + :"l"( envp->accrued_except >> 8),\ + :"l"( envp->actual_except ) ); \ + (0); /* return 0 */ \ +}) + + +#endif /* __GNUC__ && !_SOFT_FLOAT */ + diff --git a/libc/sysdeps/linux/e1/bits/kernel_stat.h b/libc/sysdeps/linux/e1/bits/kernel_stat.h new file mode 100644 index 000000000..4bcc0fe3a --- /dev/null +++ b/libc/sysdeps/linux/e1/bits/kernel_stat.h @@ -0,0 +1,57 @@ +#ifndef _BITS_STAT_STRUCT_H +#define _BITS_STAT_STRUCT_H + +/* This file provides whatever this particular arch's kernel thinks + * struct kernel_stat should look like... It turns out each arch has a + * different opinion on the subject... */ +#warning "Please verify struct kernel_stat for your architecture actually matches struct kernel_stat for x86 If it doesn't, then you will need to add a proper kernel_stat.h for your architecture..." + +struct kernel_stat { + unsigned short st_dev; + unsigned short __pad1; + unsigned long st_ino; + unsigned short st_mode; + unsigned short st_nlink; + unsigned short st_uid; + unsigned short st_gid; + unsigned short st_rdev; + unsigned short __pad2; + unsigned long st_size; + unsigned long st_blksize; + unsigned long st_blocks; + unsigned long st_atime; + unsigned long __unused1; + unsigned long st_mtime; + unsigned long __unused2; + unsigned long st_ctime; + unsigned long __unused3; + unsigned long __unused4; + unsigned long __unused5; +}; + +struct kernel_stat64 { + unsigned short st_dev; + unsigned char __pad0[10]; +#define _HAVE_STAT64___ST_INO + unsigned long __st_ino; + unsigned int st_mode; + unsigned int st_nlink; + unsigned long st_uid; + unsigned long st_gid; + unsigned short st_rdev; + unsigned char __pad3[10]; + long long st_size; + unsigned long st_blksize; + unsigned long st_blocks; /* Number 512-byte blocks allocated. */ + unsigned long __pad4; /* future possible st_blocks high bits */ + unsigned long st_atime; + unsigned long __pad5; + unsigned long st_mtime; + unsigned long __pad6; + unsigned long st_ctime; + unsigned long __pad7; /* will be high 32 bits of ctime someday */ + unsigned long long st_ino; +}; + +#endif /* _BITS_STAT_STRUCT_H */ + diff --git a/libc/sysdeps/linux/e1/bits/kernel_types.h b/libc/sysdeps/linux/e1/bits/kernel_types.h new file mode 100644 index 000000000..129455412 --- /dev/null +++ b/libc/sysdeps/linux/e1/bits/kernel_types.h @@ -0,0 +1,45 @@ +/* Note that we use the exact same include guard #define names + * as asm/posix_types.h. This will avoid gratuitous conflicts + * with the posix_types.h kernel header, and will ensure that + * our private content, and not the kernel header, will win. + * -Erik + */ +#ifndef __ARCH_E1_POSIX_TYPES_H +#define __ARCH_E1_POSIX_TYPES_H + +typedef unsigned short __kernel_dev_t; +typedef unsigned long __kernel_ino_t; +typedef unsigned short __kernel_mode_t; +typedef unsigned short __kernel_nlink_t; +typedef long __kernel_off_t; +typedef int __kernel_pid_t; +typedef unsigned short __kernel_ipc_pid_t; +typedef unsigned short __kernel_uid_t; +typedef unsigned short __kernel_gid_t; +typedef unsigned int __kernel_size_t; +typedef int __kernel_ssize_t; +typedef int __kernel_ptrdiff_t; +typedef long __kernel_time_t; +typedef long __kernel_suseconds_t; +typedef long __kernel_clock_t; +typedef int __kernel_daddr_t; +typedef char * __kernel_caddr_t; +typedef unsigned short __kernel_uid16_t; +typedef unsigned short __kernel_gid16_t; +typedef unsigned int __kernel_uid32_t; +typedef unsigned int __kernel_gid32_t; +typedef unsigned short __kernel_old_uid_t; +typedef unsigned short __kernel_old_gid_t; +typedef long long __kernel_loff_t; + +/* +typedef struct { +#ifdef __USE_ALL + int val[2]; +#else + int __val[2]; +#endif +} __kernel_fsid_t; +*/ + +#endif /* __ARCH_E1_POSIX_TYPES_H */ diff --git a/libc/sysdeps/linux/e1/bits/mman.h b/libc/sysdeps/linux/e1/bits/mman.h new file mode 100644 index 000000000..34f14ee5b --- /dev/null +++ b/libc/sysdeps/linux/e1/bits/mman.h @@ -0,0 +1,75 @@ +/* Definitions for POSIX memory map interface. Linux/m68k version. + Copyright (C) 1997 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 directly; include 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 diff --git a/libc/sysdeps/linux/e1/bits/proto.h b/libc/sysdeps/linux/e1/bits/proto.h new file mode 100644 index 000000000..7aa38ffe5 --- /dev/null +++ b/libc/sysdeps/linux/e1/bits/proto.h @@ -0,0 +1,5 @@ +#ifndef _E1_PROTO_H_ +#define _E1_PROTO_H_ +int kprintf( char *msg, int len); +#define KPRINTF(msg) kprintf(msg, strlen(msg)+1) +#endif diff --git a/libc/sysdeps/linux/e1/bits/setjmp.h b/libc/sysdeps/linux/e1/bits/setjmp.h new file mode 100644 index 000000000..88ded3837 --- /dev/null +++ b/libc/sysdeps/linux/e1/bits/setjmp.h @@ -0,0 +1,18 @@ +/* This file is lisenced under LGPL. + * Copyright (C) 2002-2003, George Thanos + * Yannis Mitsos + */ + +#ifndef _SETJMP_H +# error "Never include directly; use instead." +#endif + +typedef struct { + unsigned long G3; + unsigned long G4; + unsigned long SavedSP; + unsigned long SavedPC; + unsigned long SavedSR; + unsigned long ReturnValue; +} __jmp_buf[1]; + diff --git a/libc/sysdeps/linux/e1/bits/syscalls.h b/libc/sysdeps/linux/e1/bits/syscalls.h new file mode 100644 index 000000000..cd67de776 --- /dev/null +++ b/libc/sysdeps/linux/e1/bits/syscalls.h @@ -0,0 +1,22 @@ +/* This file is licensed under LGPL. + * Copyright (C) 2002-2003, George Thanos + * Yannis Mitsos + */ +#ifndef _BITS_SYSCALLS_H +#define _BITS_SYSCALLS_H +#ifndef _SYSCALL_H +# error "Never use directly; include instead." +#endif + +#include + +/* This includes the `__NR_' syscall numbers taken from the Linux kernel + * header files. It also defines the traditional `SYS_' macros for older + * programs. */ +#include + +/* Include the library _syscallx macros */ +#include + +#endif /* _BITS_SYSCALLS_H */ + diff --git a/libc/sysdeps/linux/e1/bits/unistd.h b/libc/sysdeps/linux/e1/bits/unistd.h new file mode 100644 index 000000000..f492b8b82 --- /dev/null +++ b/libc/sysdeps/linux/e1/bits/unistd.h @@ -0,0 +1,464 @@ + /* This file is lisenced under LGPL. + * Copyright (C) 2002-2003, George Thanos + * Yannis Mitsos + */ +#ifndef _BITS_UNISTD_H_ +#define _BITS_UNISTD_H_ + +#include +#include + +#define __E1_COFF_GCC__ + +/* The following macros have been provided by C.Baumhof + * They can be inlined in contrast to the previous ones*/ +#define _syscall0(type, name) \ +type name(void) \ +{ \ + register int par1 __asm__("L15"); \ + register int par2 __asm__("L14"); \ + par1 = -1; \ + par2 = __NR_##name; \ + __asm__ __volatile__( \ + "trap 47" \ + :"=l"(par1) \ + :"0"(par1), "l"(par2) \ + :"memory","L14","L15"); \ + \ + if( par1 < 0 ) { \ + __set_errno( -par1 ); \ + return -1; \ + } else \ + return (type)(par1); \ +} + +#define _syscall1(type, name,atype, a) \ +type name(atype a) \ +{ \ + register int par1 __asm__("L15"); \ + register int par2 __asm__("L14"); \ + register int par3 __asm__("L13"); \ + par1 = -1; \ + par2 = __NR_##name; \ + par3 = (int)a; \ + __asm__ __volatile__( \ + "trap 47" \ + :"=l"(par1) \ + :"0"(par1), "l"(par2), "l"(par3) \ + :"memory","L13","L14","L15"); \ + \ + if( par1 < 0 ) { \ + __set_errno( -par1 ); \ + return -1; \ + } else \ + return (type)(par1); \ +} + +#define _syscall2(type, name,atype, a, btype, b) \ +type name(atype a, btype b) \ +{ \ + register int par1 __asm__("L15"); \ + register int par2 __asm__("L14"); \ + register int par3 __asm__("L13"); \ + register int par4 __asm__("L12"); \ + par1 = -1; \ + par2 = __NR_##name; \ + par3 = (int)a; \ + par4 = (int)b; \ + __asm__ __volatile__( \ + "trap 47" \ + :"=l"(par1) \ + :"0"(par1), "l"(par2), "l"(par3), "l"(par4) \ + :"memory","L12","L13","L14","L15"); \ + \ + if( par1 < 0 ) { \ + __set_errno( -par1 ); \ + return -1; \ + } else \ + return (type)(par1); \ +} + +#define _syscall3(type, name,atype, a, btype, b, ctype, c) \ +type name(atype a, btype b, ctype c) \ +{ \ + register int par1 __asm__("L15"); \ + register int par2 __asm__("L14"); \ + register int par3 __asm__("L13"); \ + register int par4 __asm__("L12"); \ + register int par5 __asm__("L11"); \ + par1 = -1; \ + par2 = __NR_##name; \ + par3 = (int)a; \ + par4 = (int)b; \ + par5 = (int)c; \ + __asm__ __volatile__( \ + "trap 47" \ + :"=l"(par1) \ + :"0"(par1), "l"(par2), "l"(par3), "l"(par4), "l"(par5) \ + :"memory","L11","L12","L13","L14","L15"); \ + \ + if( par1 < 0 ) { \ + __set_errno( -par1 ); \ + return -1; \ + } else \ + return (type)(par1); \ +} + +#define _syscall4(type, name,atype, a, btype, b, ctype, c, dtype, d) \ +type name(atype a, btype b, ctype c,dtype d) \ +{ \ + register int par1 __asm__("L15"); \ + register int par2 __asm__("L14"); \ + register int par3 __asm__("L13"); \ + register int par4 __asm__("L12"); \ + register int par5 __asm__("L11"); \ + register int par6 __asm__("L10"); \ + par1 = -1; \ + par2 = __NR_##name; \ + par3 = (int)a; \ + par4 = (int)b; \ + par5 = (int)c; \ + par6 = (int)d; \ + __asm__ __volatile__( \ + "trap 47" \ + :"=l"(par1) \ + :"0"(par1),"l"(par2),"l"(par3),"l"(par4),"l"(par5),"l"(par6) \ + :"memory","L10","L11","L12","L13","L14","L15"); \ + \ + if( par1 < 0 ) { \ + __set_errno( -par1 ); \ + return -1; \ + } else \ + return (type)(par1); \ +} + +#define _syscall5(type, name,atype, a, btype, b, ctype, c, dtype, d, etype, e) \ +type name(atype a, btype b, ctype c,dtype d, etype e) \ +{ \ + register int par1 __asm__("L15"); \ + register int par2 __asm__("L14"); \ + register int par3 __asm__("L13"); \ + register int par4 __asm__("L12"); \ + register int par5 __asm__("L11"); \ + register int par6 __asm__("L10"); \ + register int par7 __asm__("L9"); \ + par1 = -1; \ + par2 = __NR_##name; \ + par3 = (int)a; \ + par4 = (int)b; \ + par5 = (int)c; \ + par6 = (int)d; \ + par7 = (int)e; \ + __asm__ __volatile__( \ + "trap 47" \ + :"=l"(par1) \ + :"0"(par1),"l"(par2),"l"(par3),"l"(par4),"l"(par5),"l"(par6),"l"(par7) \ + :"memory","L9","L10","L11","L12","L13","L14","L15"); \ + \ + if( par1 < 0 ) { \ + __set_errno( -par1 ); \ + return -1; \ + } else \ + return (type)(par1); \ + return (type)(par1); \ +} + +#define _syscall6(type, name,atype, a, btype, b, ctype, c, dtype, d, etype, e, ftype, f) \ +type name(atype a, btype b, ctype c,dtype d, etype e, ftype f) \ +{ \ + register int par1 __asm__("L15"); \ + register int par2 __asm__("L14"); \ + register int par3 __asm__("L13"); \ + register int par4 __asm__("L12"); \ + register int par5 __asm__("L11"); \ + register int par6 __asm__("L10"); \ + register int par7 __asm__("L9"); \ + register int par8 __asm__("L8"); \ + int sys_retval; \ + par1 = -1; \ + par2 = __NR_##name; \ + par3 = (int)a; \ + par4 = (int)b; \ + par5 = (int)c; \ + par6 = (int)d; \ + par7 = (int)e; \ + par7 = (int)f; \ + __asm__ __volatile__( \ + "trap 47" \ + :"=l"(par1) \ + :"0"(par1),"l"(par2),"l"(par3),"l"(par4),"l"(par5),"l"(par6),"l"(par7),"l"(par8) \ + :"memory","L8","L9","L10","L11","L12","L13","L14","L15"); \ + \ + if( par1 < 0 ) { \ + __set_errno( -par1 ); \ + return -1; \ + } else \ + return (type)(par1); \ +} + +#define __syscall0(type, name) \ +type name(...) \ +{ \ + register int par1 __asm__("L15"); \ + register int par2 __asm__("L14"); \ + par1 = -1; \ + par2 = __NR_##name; \ + __asm__ __volatile__( \ + "trap 47" \ + :"=l"(par1) \ + :"0"(par1), "l"(par2)\ + :"memory","L14","L15"); \ + \ + if( par1 < 0 ) { \ + __set_errno( -par1 ); \ + return -1; \ + } else \ + return (type)(par1); \ +} + +#define __syscall1(type, name, atype, a) \ +type name(atype a, ...) \ +{ \ + register int par1 __asm__("L15"); \ + register int par2 __asm__("L14"); \ + register int par3 __asm__("L13"); \ + par1 = -1; \ + par2 = __NR_##name; \ + par3 = (int)a; \ + __asm__ __volatile__( \ + "trap 47" \ + :"=l"(par1) \ + :"0"(par1), "l"(par2), "l"(par3)\ + :"memory","L13","L14","L15"); \ + \ + if( par1 < 0 ) { \ + __set_errno( -par1 ); \ + return -1; \ + } else \ + return (type)(par1); \ +} + +#define __syscall2(type, name,atype, a, btype, b) \ +type name(atype a, btype b, ...) \ +{ \ + register int par1 __asm__("L15"); \ + register int par2 __asm__("L14"); \ + register int par3 __asm__("L13"); \ + register int par4 __asm__("L12"); \ + par1 = -1; \ + par2 = __NR_##name; \ + par3 = (int)a; \ + par4 = (int)b; \ + __asm__ __volatile__( \ + "trap 47" \ + :"=l"(par1) \ + :"0"(par1), "l"(par2), "l"(par3), "l"(par4)\ + :"memory","L12","L13","L14","L15"); \ + \ + if( par1 < 0 ) { \ + __set_errno( -par1 ); \ + return -1; \ + } else \ + return (type)(par1); \ +} + +#define __syscall3(type, name,atype, a, btype, b, ctype, c) \ +type name(atype a, btype b, ctype c, ...) \ +{ \ + register int par1 __asm__("L15"); \ + register int par2 __asm__("L14"); \ + register int par3 __asm__("L13"); \ + register int par4 __asm__("L12"); \ + register int par5 __asm__("L11"); \ + par1 = -1; \ + par2 = __NR_##name; \ + par3 = (int)a; \ + par4 = (int)b; \ + par5 = (int)c; \ + __asm__ __volatile__( \ + "trap 47" \ + :"=l"(par1) \ + :"0"(par1), "l"(par2), "l"(par3), "l"(par4), "l"(par5) \ + :"memory","L11","L12","L13","L14","L15"); \ + \ + if( par1 < 0 ) { \ + __set_errno( -par1 ); \ + return -1; \ + } else \ + return (type)(par1); \ +} + +#define __syscall4(type, name,atype, a, btype, b, ctype, c, dtype, d) \ +type name(atype a, btype b, ctype c,dtype d, ...) \ +{ \ + register int par1 __asm__("L15"); \ + register int par2 __asm__("L14"); \ + register int par3 __asm__("L13"); \ + register int par4 __asm__("L12"); \ + register int par5 __asm__("L11"); \ + register int par6 __asm__("L10"); \ + par1 = -1; \ + par2 = __NR_##name; \ + par3 = (int)a; \ + par4 = (int)b; \ + par5 = (int)c; \ + par6 = (int)d; \ + __asm__ __volatile__( \ + "trap 47" \ + :"=l"(par1) \ + :"0"(par1),"l"(par2),"l"(par3),"l"(par4),"l"(par5),"l"(par6) \ + :"memory","L10","L11","L12","L13","L14","L15"); \ + \ + if( par1 < 0 ) { \ + __set_errno( -par1 ); \ + return -1; \ + } else \ + return (type)(par1); \ +} + +#define __syscall5(type, name,atype, a, btype, b, ctype, c, dtype, d, etype, e) \ +type name(atype a, btype b, ctype c,dtype d, etype e, ...) \ +{ \ + register int par1 __asm__("L15"); \ + register int par2 __asm__("L14"); \ + register int par3 __asm__("L13"); \ + register int par4 __asm__("L12"); \ + register int par5 __asm__("L11"); \ + register int par6 __asm__("L10"); \ + register int par7 __asm__("L9"); \ + par1 = -1; \ + par2 = __NR_##name; \ + par3 = (int)a; \ + par4 = (int)b; \ + par5 = (int)c; \ + par6 = (int)d; \ + par7 = (int)e; \ + __asm__ __volatile__( \ + "trap 47" \ + :"=l"(par1) \ + :"0"(par1),"l"(par2),"l"(par3),"l"(par4),"l"(par5),"l"(par6),"l"(par7) \ + :"memory","L9","L10","L11","L12","L13","L14","L15"); \ + \ + if( par1 < 0 ) { \ + __set_errno( -par1 ); \ + return -1; \ + } else \ + return (type)(par1); \ +} + +#define __syscall6(type, name,atype, a, btype, b, ctype, c, dtype, d, etype, e, ftype, f) \ +type name(atype a, btype b, ctype c,dtype d, etype e, ftype f, ...) \ +{ \ + register int par1 __asm__("L15"); \ + register int par2 __asm__("L14"); \ + register int par3 __asm__("L13"); \ + register int par4 __asm__("L12"); \ + register int par5 __asm__("L11"); \ + register int par6 __asm__("L10"); \ + register int par7 __asm__("L9"); \ + register int par8 __asm__("L8"); \ + par1 = -1; \ + par2 = __NR_##name; \ + par3 = (int)a; \ + par4 = (int)b; \ + par5 = (int)c; \ + par6 = (int)d; \ + par7 = (int)e; \ + par7 = (int)f; \ + __asm__ __volatile__( \ + "trap 47" \ + :"=l"(par1) \ + :"0"(par1),"l"(par2),"l"(par3),"l"(par4),"l"(par5),"l"(par6),"l"(par7),"l"(par8) \ + :"memory","L8","L9","L10","L11","L12","L13","L14","L15"); \ + \ + if( par1 < 0 ) { \ + __set_errno( -par1 ); \ + return -1; \ + } else \ + return (type)(par1); \ +} + +#include +/* Taken from */ +#ifndef _LIBC +/* We don't support pthreads for the moment*/ +#define __set_errno(val) ((errno) = (val)) +#endif + +#if 0 +#define _syscall3(type, name,atype, a , btype, b, ctype, c) \ +type name(atype a, btype b, ctype c,) \ +{ \ + __asm__ __volatile__( \ + "movi L9, -1\n\t" \ + "movi L8, %0\n\t" \ + "ldw.d G3, L7, 0\n\t" \ + "ldw.d G3, L6, 4\n\t" \ + "ldw.d G3, L5, 8\n\t" \ + :/* no output */ \ + :"i"(__NR_##name) \ + :"cc","memory","%L5","L6","L7","L8","L9");\ + __asm__ __volatile__( \ + "trap 47\n\t" \ + "mov L2, L9\n\t"); \ +} + +#define _syscall4(type, name,atype, a, btype, b, ctype, c, dtype, d) \ +type name(atype a, btype b, ctype c,dtype d) \ +{ \ + __asm__ __volatile__( \ + "movi L11, -1\n\t" \ + "movi L10, %0\n\t" \ + "ldw.d G3, L9, 0\n\t" \ + "ldw.d G3, L8, 4\n\t" \ + "ldw.d G3, L7, 8\n\t" \ + "ldw.d G3, L6, 12\n\t" \ + :/* no output */ \ + :"i"(__NR_##name) \ + :"cc","memory","L6","L7","L8","L9","L10","L11");\ + __asm__ __volatile__( \ + "trap 47\n\t" \ + "mov L2, L11\n\t"); \ +} + +#define _syscall5(type, name,atype, a, btype, b, ctype, c, dtype, d, etype, e) \ +type name(atype a, btype b, ctype c,dtype d, etype e) \ +{ \ + __asm__ __volatile__( \ + "movi L13, -1\n\t" \ + "movi L12, %0\n\t" \ + "ldw.d G3, L11, 0\n\t" \ + "ldw.d G3, L10, 4\n\t" \ + "ldw.d G3, L9, 8\n\t" \ + "ldw.d G3, L8, 12\n\t" \ + "ldw.d G3, L7, 16\n\t" \ + :/* no output */ \ + :"i"(__NR_##name) \ + :"cc","memory","L7","L8","L9","L10","L11","L12","L13");\ + __asm__ __volatile__( \ + "trap 47\n\t" \ + "mov L2, L13\n\t"); \ +} + +#define _syscall6(type, name,atype, a, btype, b, ctype, c, dtype, d, etype, e, ftype, f) \ +type name(atype a, btype b, ctype c,dtype d, etype e, ftype f) \ +{ \ + __asm__ __volatile__( \ + "movi L15, -1\n\t" \ + "movi L14, %0\n\t" \ + "ldw.d G3, L13, 0\n\t" \ + "ldw.d G3, L12, 4\n\t" \ + "ldw.d G3, L11, 8\n\t" \ + "ldw.d G3, L10, 12\n\t" \ + "ldw.d G3, L9, 16\n\t" \ + "ldw.d G3, L8, 20\n\t" \ + :/* no output */ \ + :"i"(__NR_##name) \ + :"cc","memory","L8","L9","L10","L11","L12","L13","L14","L15");\ + __asm__ __volatile__( \ + "trap 47\n\t" \ + "mov L2, L15\n\t"); \ +} +#endif + +#endif /* !_HYPERSTONE_NOMMU_UNISTD_H_ */ diff --git a/libc/sysdeps/linux/e1/bits/wordsize.h b/libc/sysdeps/linux/e1/bits/wordsize.h new file mode 100644 index 000000000..a56d3ef5c --- /dev/null +++ b/libc/sysdeps/linux/e1/bits/wordsize.h @@ -0,0 +1,22 @@ +/* Copyright (C) 2002-2003, George Thanos + Yannis Mitsos + + 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/e1/crt0.S b/libc/sysdeps/linux/e1/crt0.S new file mode 100644 index 000000000..3e63f5939 --- /dev/null +++ b/libc/sysdeps/linux/e1/crt0.S @@ -0,0 +1,8 @@ +/* This file is lisenced under LGPL + * Copyright (C) 2002-2003, George Thanos + * Yannis Mitsos + */ + +.global __start +__start: + call L1, 0, __uClibc_start diff --git a/libc/sysdeps/linux/e1/crt1.c b/libc/sysdeps/linux/e1/crt1.c new file mode 100644 index 000000000..1e1c8be8e --- /dev/null +++ b/libc/sysdeps/linux/e1/crt1.c @@ -0,0 +1,48 @@ +/* vi: set sw=4 ts=4: */ +/* uClibc/sysdeps/linux/m68k/crt0.S + * Pull stuff off the stack and get uClibc moving. + * + * Copyright (C) 2002-2003, George Thanos + * Yannis Mitsos + * + * Copyright (C) 2000,2001 by Erik Andersen + * + * 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 + */ + +/* Stick in a dummy reference to main(), so that if an application + * is linking when the main() function is in a static library (.a) + * we can be sure that main() actually gets linked in */ +extern void main(int argc,void *argv,void *envp); +//void (*mainp)(int argc,void *argv,void *envp) = main; + +void __uClibc_main(int argc,void *argv,void *envp); + +void _uClibc_start(unsigned int first_arg) +{ + unsigned int argc; + char **argv, **envp; + unsigned long *stack; + + stack = (unsigned long*) first_arg; + argc = *(stack); + argv = (char **)(stack + 1); + envp = (char **)(stack + 1 + argc + 1); + + __uClibc_main(argc, argv, envp); +} + +void __main() { } + diff --git a/libc/sysdeps/linux/e1/longjmp.c b/libc/sysdeps/linux/e1/longjmp.c new file mode 100644 index 000000000..5770d4997 --- /dev/null +++ b/libc/sysdeps/linux/e1/longjmp.c @@ -0,0 +1,72 @@ +/* This file is lisenced under LGPL + * Copyright (C) 2002-2003, George Thanos + * Yannis Mitsos + */ + +#include +#include +#include +#include + +#define __NR_e1newSP 224 +static inline _syscall1(int, e1newSP, unsigned long, SavedSP ) + +unsigned long jmpbuf_ptr; + +void longjmp(jmp_buf state, int value ) +{ + if(!value) + state->__jmpbuf->ReturnValue = 1; + else + state->__jmpbuf->ReturnValue = value; + + jmpbuf_ptr = (unsigned long)state; + e1newSP(state->__jmpbuf->SavedSP); + +#define _state_ ((struct __jmp_buf_tag*)jmpbuf_ptr) + asm volatile("mov L0, %0\n\t" + "mov L1, %1\n\t" + "mov L2, %2\n\t" + "mov G3, %3\n\t" + "mov G4, %4\n\t" + "ret PC, L1\n\t" + :/*no output*/ + :"l"(_state_->__jmpbuf->ReturnValue), + "l"(_state_->__jmpbuf->SavedPC), + "l"(_state_->__jmpbuf->SavedSR), + "l"(_state_->__jmpbuf->G3), + "l"(_state_->__jmpbuf->G4) + :"%G3", "%G4", "%L0", "%L1" ); +#undef _state_ +} + +void siglongjmp(sigjmp_buf state, int value ) +{ + if( state->__mask_was_saved ) + sigprocmask(SIG_SETMASK, &state->__saved_mask, NULL); + + if(!value) + state->__jmpbuf->ReturnValue = 1; + else + state->__jmpbuf->ReturnValue = value; + + jmpbuf_ptr = (unsigned long)state; + e1newSP(state->__jmpbuf->SavedSP); + + +#define _state_ ((struct __jmp_buf_tag*)jmpbuf_ptr) + asm volatile("mov L0, %0\n\t" + "mov L1, %1\n\t" + "mov L2, %2\n\t" + "mov G3, %3\n\t" + "mov G4, %4\n\t" + "ret PC, L1\n\t" + :/*no output*/ + :"l"(_state_->__jmpbuf->ReturnValue), + "l"(_state_->__jmpbuf->SavedPC), + "l"(_state_->__jmpbuf->SavedSR), + "l"(_state_->__jmpbuf->G3), + "l"(_state_->__jmpbuf->G4) + :"%G3", "%G4", "%L0", "%L1" ); +#undef _state_ +} diff --git a/libc/sysdeps/linux/e1/setjmp.c b/libc/sysdeps/linux/e1/setjmp.c new file mode 100644 index 000000000..2942cb193 --- /dev/null +++ b/libc/sysdeps/linux/e1/setjmp.c @@ -0,0 +1,54 @@ +/* This file is lisenced under LGPL + * Copyright (C) 2002-2003, George Thanos + * Yannis Mitsos + */ + +#include +#include +#include + +int setjmp( jmp_buf state) +{ + asm volatile( "mov %0, G3\n\t" + "mov %1, G4\n\t" + :"=l"(state->__jmpbuf->G3), + "=l"(state->__jmpbuf->G4) + :/*no input*/ + :"%G3", "%G4" ); + + asm volatile( "setadr %0\n\t" + "mov %1, L1\n\t" + "mov %2, L2\n\t" + :"=l"(state->__jmpbuf->SavedSP), + "=l"(state->__jmpbuf->SavedPC), + "=l"(state->__jmpbuf->SavedSR) + :/*no input*/); + return 0; +} + +int sigsetjmp( sigjmp_buf state , int savesigs) +{ + + if(savesigs) { + state->__mask_was_saved = 1; + /* how arg in is not significant */ + sigprocmask(SIG_SETMASK, NULL, &state->__saved_mask); + } else + state->__mask_was_saved = 0; + + asm volatile( "mov %0, G3\n\t" + "mov %1, G4\n\t" + :"=l"(state->__jmpbuf->G3), + "=l"(state->__jmpbuf->G4) + :/*no input*/ + :"%G3", "%G4" ); + + asm volatile( "setadr %0\n\t" + "mov %1, L2\n\t" + "mov %2, L3\n\t" + :"=l"(state->__jmpbuf->SavedSP), + "=l"(state->__jmpbuf->SavedPC), + "=l"(state->__jmpbuf->SavedSR) + :/*no input*/); + return 0; +} diff --git a/libc/sysdeps/linux/e1/sys/procfs.h b/libc/sysdeps/linux/e1/sys/procfs.h new file mode 100644 index 000000000..8416b3b58 --- /dev/null +++ b/libc/sysdeps/linux/e1/sys/procfs.h @@ -0,0 +1,31 @@ +/* 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. */ + +#endif /* sys/procfs.h */ diff --git a/libc/sysdeps/linux/e1/sys/reg.h b/libc/sysdeps/linux/e1/sys/reg.h new file mode 100644 index 000000000..a8a7ec1b7 --- /dev/null +++ b/libc/sysdeps/linux/e1/sys/reg.h @@ -0,0 +1,25 @@ +/* Copyright (C) 1998 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_REG_H +#define _SYS_REG_H 1 + +/* Index into an array of 4 byte integers returned from ptrace for + location of the users' stored general purpose registers. */ + +#endif /* _SYS_REG_H */ diff --git a/libc/sysdeps/linux/e1/sys/ucontext.h b/libc/sysdeps/linux/e1/sys/ucontext.h new file mode 100644 index 000000000..3c441dc5c --- /dev/null +++ b/libc/sysdeps/linux/e1/sys/ucontext.h @@ -0,0 +1,109 @@ +/* Copyright (C) 1997, 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +/* System V/m68k ABI compliant context switching support. */ + +#ifndef _SYS_UCONTEXT_H +#define _SYS_UCONTEXT_H 1 + +#include +#include + +/* Type for general register. */ +typedef int greg_t; + +/* Number of general registers. */ +#define NGREG 18 + +/* Container for all general registers. */ +typedef greg_t gregset_t[NGREG]; + +/* Number of each register is the `gregset_t' array. */ +enum +{ + R_D0 = 0, +#define R_D0 R_D0 + R_D1 = 1, +#define R_D1 R_D1 + R_D2 = 2, +#define R_D2 R_D2 + R_D3 = 3, +#define R_D3 R_D3 + R_D4 = 4, +#define R_D4 R_D4 + R_D5 = 5, +#define R_D5 R_D5 + R_D6 = 6, +#define R_D6 R_D6 + R_D7 = 7, +#define R_D7 R_D7 + R_A0 = 8, +#define R_A0 R_A0 + R_A1 = 9, +#define R_A1 R_A1 + R_A2 = 10, +#define R_A2 R_A2 + R_A3 = 11, +#define R_A3 R_A3 + R_A4 = 12, +#define R_A4 R_A4 + R_A5 = 13, +#define R_A5 R_A5 + R_A6 = 14, +#define R_A6 R_A6 + R_A7 = 15, +#define R_A7 R_A7 + R_SP = 15, +#define R_SP R_SP + R_PC = 16, +#define R_PC R_PC + R_PS = 17 +#define R_PS R_PS +}; + +/* Structure to describe FPU registers. */ +typedef struct fpregset +{ + int f_fpregs[8][3]; + int f_pcr; + int f_psr; + int f_fpiaddr; +} fpregset_t; + +/* Context to describe whole processor state. */ +typedef struct +{ + int version; + gregset_t gregs; + fpregset_t fpregs; +} mcontext_t; + +#define MCONTEXT_VERSION 2 + +/* Userlevel context. */ +typedef struct ucontext +{ + unsigned long int uc_flags; + struct ucontext *uc_link; + __sigset_t uc_sigmask; + stack_t uc_stack; + mcontext_t uc_mcontext; + long int uc_filler[174]; +} ucontext_t; + +#endif /* sys/ucontext.h */ diff --git a/libc/sysdeps/linux/e1/syscalls.c b/libc/sysdeps/linux/e1/syscalls.c new file mode 100644 index 000000000..e58ad5f79 --- /dev/null +++ b/libc/sysdeps/linux/e1/syscalls.c @@ -0,0 +1,11 @@ +/* This file is lisenced under LGPL + * Copyright (C) 2002-2003, George Thanos + * Yannis Mitsos + */ + +#include + +/* We now need a declaration of the `errno' variable. */ +extern int errno; +# define __set_errno(val) ((errno) = (val)) +_syscall2( int, kprintf, char *, msg, int, len) diff --git a/libc/sysdeps/linux/e1/vfork.c b/libc/sysdeps/linux/e1/vfork.c new file mode 100644 index 000000000..56acfb1bc --- /dev/null +++ b/libc/sysdeps/linux/e1/vfork.c @@ -0,0 +1,7 @@ +#include +#include +#include + +#define __NR___libc_vfork __NR_vfork +inline _syscall0(pid_t, __libc_vfork); +inline _syscall0(pid_t, vfork); -- cgit v1.2.3