This is the mail archive of the newlib@sourceware.cygnus.com mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: illegal code for SH-1 cpu



The RTEMS newlib 1.8.0 patch includes a fix for this.  I have attached the
entire patch.  I have not yet generated a patch for 1.8.1.

I hope it helps.

--joel
Joel Sherrill                    Director of Research & Development
joel@OARcorp.com                 On-Line Applications Research
Ask me about RTEMS: a free RTOS  Huntsville AL 35805
   Support Available             (205) 722-9985




On Sun, 5 Jul 1998, Jens Decker wrote:

> Hello!
> 
> I've compiled newlib-1.8.1 for use with a SH-7032 board (SH-1 cpu kernel):
> 
> ./configure -v --target=sh-coff --prefix=/usr/local/sh-coff
> --host=i586-unknown-linux --norecursion
> 
> Debugging some initial test programs (I'm not very experienced with gcc
> used for embedded systems) I got illegal opcode messages and found that
> memset.S from newlib/libc/machine/sh indeed uses dt <reg> commands which
> are only available for SH-2 and better cpu kernels.
> 
> My workaround was a substitution of the dt opcodes:
> 
> !
> ! Fast SH memset
> !
> ! by Toshiyasu Morita (tm@netcom.com)
> !
> ! Entry: r4: destination pointer
> !        r5: fill value
> !        r6: byte count
> !
> ! Exit:  r0-r3: trashed
> !
> 
> #include "asm.h"
> 
> ENTRY(memset)
> 	mov	r4,r3	! Save return value
> 
> 	mov	r6,r0	! Check explicitly for zero
> 	cmp/eq	#0,r0
> 	bt	L_exit
> 
> 	mov	#12,r0	! Check for small number of bytes
> 	cmp/gt	r6,r0
> 	bt	L_store_byte_loop
> 
> 	neg	r4,r0	! Align destination
> 	add	#4,r0
> 	and	#3,r0
> 	tst	r0,r0
> 	bt	L_dup_bytes
> 	.balignw 4,0x0009
> L_align_loop:
> 	mov.b	r5,@r4
> 	add	#-1,r6
> 	add	#1,r4
> 	add     #-1,r0  ! Substitute for dt r0
> 	cmp/eq  #0,r0   ! Substitute for dt r0
> 	bf	L_align_loop
> 
> L_dup_bytes:
> 	extu.b	r5,r5	! Duplicate bytes across longword
> 	swap.b	r5,r0
> 	or	r0,r5
> 	swap.w	r5,r0
> 	or	r0,r5
> 
> 	mov	r6,r2	! Calculate number of double longwords
> 	shlr2	r2
> 	shlr	r2
> 
> 	.balignw 4,0x0009
> L_store_long_loop:
> 	mov.l	r5,@r4	! Store double longs to memory
>         add     #-1,r2  ! Substitute for dt r2
> 	tst     r2,r2   ! Substitute for dt r2
> 	mov.l	r5,@(4,r4)
> 	add	#8,r4
> 	bf	L_store_long_loop
> 
> 	mov	#7,r0
> 	and	r0,r6
> 	tst	r6,r6
> 	bt	L_exit
> 	.balignw 4,0x0009
> L_store_byte_loop:
> 	mov.b	r5,@r4	! Store bytes to memory
> 	add	#1,r4
> 	add     #-1,r6  ! Substitute for dt r6
> 	tst     r6,r6   ! Substitute for dt r6
> 	bf	L_store_byte_loop
> 
> L_exit:
> 	rts
> 	mov	r3,r0
> 
> Thank you very much for this really good development system!
> 
> Yours,
> 
> Jens Decker
> 
> 
> -- 
> 
> ___________________________________________________________
> 
> * Jens Decker                                             *
> * Universitaet Regensburg                                 *
> * Institut fuer Physikalische und Theoretische Chemie     *
> * Lehrst. Prof. Dick                                      *
> * Universitaetstr. 31                                     *
> * 93059 Regensburg                                        *
> *                                                         *
> * Tel: +49-941/943-4473, -4458 Fax: -4488  Room: 22.2.14  *
> * Email: Jens.Decker@chemie.uni-regensburg.de             *
> * WWW (coming up): http://                                *
> * rchsg41.chemie.uni-regensburg.de/group/Jens.Decker.html *
> ___________________________________________________________
> 
diff -N -P -r -c newlib-1.8.0.orig/Makefile.in newlib-1.8.0/Makefile.in
*** newlib-1.8.0.orig/Makefile.in	Mon Jul 14 16:43:37 1997
--- newlib-1.8.0/Makefile.in	Tue Mar 10 12:04:01 1998
***************
*** 209,216 ****
    fi`
  
  AS_FOR_TARGET = ` \
!   if [ -f $$r/gas/as.new ] ; then \
!     echo $$r/gas/as.new ; \
    else \
      if [ "$(host_canonical)" = "$(target_canonical)" ] ; then \
        echo $(AS); \
--- 209,216 ----
    fi`
  
  AS_FOR_TARGET = ` \
!   if [ -f $$r/gas/as-new ] ; then \
!     echo $$r/gas/as-new ; \
    else \
      if [ "$(host_canonical)" = "$(target_canonical)" ] ; then \
        echo $(AS); \
***************
*** 220,227 ****
    fi`
  
  LD_FOR_TARGET = ` \
!   if [ -f $$r/ld/ld.new ] ; then \
!     echo $$r/ld/ld.new ; \
    else \
      if [ "$(host_canonical)" = "$(target_canonical)" ] ; then \
        echo $(LD); \
--- 220,227 ----
    fi`
  
  LD_FOR_TARGET = ` \
!   if [ -f $$r/ld/ld-new ] ; then \
!     echo $$r/ld/ld-new ; \
    else \
      if [ "$(host_canonical)" = "$(target_canonical)" ] ; then \
        echo $(LD); \
***************
*** 264,271 ****
    fi`
  
  NM_FOR_TARGET = ` \
!   if [ -f $$r/binutils/nm.new ] ; then \
!     echo $$r/binutils/nm.new ; \
    else \
      if [ "$(host_canonical)" = "$(target_canonical)" ] ; then \
        echo $(NM); \
--- 264,271 ----
    fi`
  
  NM_FOR_TARGET = ` \
!   if [ -f $$r/binutils/nm-new ] ; then \
!     echo $$r/binutils/nm-new ; \
    else \
      if [ "$(host_canonical)" = "$(target_canonical)" ] ; then \
        echo $(NM); \
diff -N -P -r -c newlib-1.8.0.orig/configure.in newlib-1.8.0/configure.in
*** newlib-1.8.0.orig/configure.in	Mon Jul 14 16:44:27 1997
--- newlib-1.8.0/configure.in	Tue Mar 10 12:04:01 1998
***************
*** 397,402 ****
--- 397,406 ----
    *-*-netware)
      noconfigdirs="$noconfigdirs target-libg++ target-libstdc++ target-librx target-newlib target-libiberty target-libgloss"
      ;;
+   # This hides the hppa*-*-rtems* below but that one is still informative.
+   *-*-rtems*)
+     noconfigdirs="$noconfigdirs target-libgloss"
+     ;;
    *-*-vxworks*)
      noconfigdirs="$noconfigdirs target-newlib target-libgloss"
      ;;
diff -N -P -r -c newlib-1.8.0.orig/libgloss/configure newlib-1.8.0/libgloss/configure
*** newlib-1.8.0.orig/libgloss/configure	Thu Jul 10 18:18:51 1997
--- newlib-1.8.0/libgloss/configure	Tue Mar 10 12:04:01 1998
***************
*** 753,759 ****
  # Extract the first word of "gcc", so it can be a program name with args.
  set dummy gcc; ac_word=$2
  echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
! echo "configure:762: checking for $ac_word" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 753,759 ----
  # Extract the first word of "gcc", so it can be a program name with args.
  set dummy gcc; ac_word=$2
  echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
! echo "configure:769: checking for $ac_word" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
***************
*** 782,788 ****
    # Extract the first word of "cc", so it can be a program name with args.
  set dummy cc; ac_word=$2
  echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
! echo "configure:791: checking for $ac_word" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 782,788 ----
    # Extract the first word of "cc", so it can be a program name with args.
  set dummy cc; ac_word=$2
  echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
! echo "configure:798: checking for $ac_word" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
***************
*** 830,836 ****
  fi
  
  echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
! echo "configure:839: checking whether we are using GNU C" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 830,836 ----
  fi
  
  echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
! echo "configure:846: checking whether we are using GNU C" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
***************
*** 839,845 ****
    yes;
  #endif
  EOF
! if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:848: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
    ac_cv_prog_gcc=yes
  else
    ac_cv_prog_gcc=no
--- 839,845 ----
    yes;
  #endif
  EOF
! if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:855: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
    ac_cv_prog_gcc=yes
  else
    ac_cv_prog_gcc=no
***************
*** 854,860 ****
    ac_save_CFLAGS="$CFLAGS"
    CFLAGS=
    echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
! echo "configure:863: checking whether ${CC-cc} accepts -g" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 854,860 ----
    ac_save_CFLAGS="$CFLAGS"
    CFLAGS=
    echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
! echo "configure:870: checking whether ${CC-cc} accepts -g" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
***************
*** 886,892 ****
  # Extract the first word of "ar", so it can be a program name with args.
  set dummy ar; ac_word=$2
  echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
! echo "configure:895: checking for $ac_word" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 886,892 ----
  # Extract the first word of "ar", so it can be a program name with args.
  set dummy ar; ac_word=$2
  echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
! echo "configure:902: checking for $ac_word" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
***************
*** 919,925 ****
  # Extract the first word of "ranlib", so it can be a program name with args.
  set dummy ranlib; ac_word=$2
  echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
! echo "configure:928: checking for $ac_word" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 919,925 ----
  # Extract the first word of "ranlib", so it can be a program name with args.
  set dummy ranlib; ac_word=$2
  echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
! echo "configure:935: checking for $ac_word" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
diff -N -P -r -c newlib-1.8.0.orig/newlib/ChangeLog newlib-1.8.0/newlib/ChangeLog
*** newlib-1.8.0.orig/newlib/ChangeLog	Thu Jul 10 18:23:53 1997
--- newlib-1.8.0/newlib/ChangeLog	Thu May 21 12:32:26 1998
***************
*** 1,3 ****
--- 1,46 ----
+ Thu May 21 12:31:38 CDT 1998  Eric Norum <eric@skatter.usask.ca>
+ 
+         * libc/string/strerror.c: Added socket error messages.
+ 
+ Tue Mar 31 09:55:39 CST 1998  Joel Sherrill <joel@OARcorp.com
+ 
+         * configure.in: Added posix_dir to RTEMS target.
+ 
+ Thu Mar 26 08:13:52 CST 1998  Eric Norum <eric@skatter.usask.ca>
+ 
+         * libc/machine/m68k/Makefile.in: Added references to memcpy, strcpy,
+              and strlen.
+         * libc/machine/m68k/memcpy.c: New file.
+         * libc/machine/m68k/strcpy.c: New file.
+         * libc/machine/m68k/strlen.c: New file.
+ 
+ Thu Mar 26 08:15:44 CST 1998  Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+ 
+         * libc/machine/sh/memcpy.S: Fixed to work on SH1.
+         * libc/machine/sh/memset.S: Fixed to work on SH1.
+ 
+ Thu Mar 26 07:56:26 CST 1998  Joel Sherrill <joel@OARcorp.com>
+ 
+         * configure.in: Don't use libgloss with RTEMS.
+         * configure: Don't use libgloss with RTEMS.
+ 
+ Thu Mar 26 07:56:26 CST 1998  Joel Sherrill <joel@OARcorp.com>
+ 
+         * configure.in: Corrected feature defines.  Removed extraneous
+              powerpc*-*-rtems* reference.
+         * libc/include/sys/errno.h: Added ENOTSUP.
+         * libc/machine/i386/Makefile.in: Added setjmp.S.
+         * libc/machine/i386/setjmp.S: New file.
+         * libc/machine/i386/setjmp.h: New file.
+         * libc/machine/i960/Makefile.in: Added rules for i960 specific
+              memory and string routines although they are not actually built.
+         * libc/machine/i960/setjmp.S: New file.
+         * libc/reent/reent.c: Added _wrapup_reent.
+         * libc/stdio/tmpnam.c: Fixed warning.
+         * libc/sys/rtems/crt0.c: Added symbols needed to satisfy link attempt
+             by AC_PROG_CC autoconf macro.
+         * libc/sys/rtems/sys/types.h: Added ifdef for go32.
+ 
  Thu Jul 10 15:11:52 1997  Doug Evans  <dje@canuck.cygnus.com>
  
  	* libm/math/k_standard.c (__kernel_standard): Call fflush(stdout)
diff -N -P -r -c newlib-1.8.0.orig/newlib/configure.in newlib-1.8.0/newlib/configure.in
*** newlib-1.8.0.orig/newlib/configure.in	Thu Jul 10 18:23:54 1997
--- newlib-1.8.0/newlib/configure.in	Tue Mar 31 09:57:25 1998
***************
*** 159,164 ****
--- 159,166 ----
  	;;
    *-*-rtems*)			# generic RTEMS support
  	sys_dir=rtems
+ 	posix_dir=posix
+ 	unix_dir=
  	;;
    a29k-*-*)
  	sys_dir=a29khif
***************
*** 240,250 ****
  # RTEMS supplies its own versions of some routines:
  #       malloc()            (reentrant version)
  #       exit()              RTEMS has a "global" reent to flush
! #       _gettimeofday_r()
  #
! #  NOTE: When newlib malloc uses a semaphore, we should switch to that.
    *-*-rtems*)
! 	target_cflags="${target_cflags} -DHAVE_GETTIMEOFDAY -DMALLOC_PROVIDED -DEXIT_PROVIDED -DMISSING_SYSCALL_NAMES"
  	;;
  # VxWorks supplies its own version of malloc, and the newlib one
  # doesn't work because VxWorks does not have sbrk.
--- 242,253 ----
  # RTEMS supplies its own versions of some routines:
  #       malloc()            (reentrant version)
  #       exit()              RTEMS has a "global" reent to flush
! #       signal()/raise()    RTEMS has its own including pthread signals
! #       _XYZ_r()            RTEMS has its own reentrant routines
  #
! #  NOTE: When newlib malloc uses a semaphore, RTEMS will switch to that.
    *-*-rtems*)
! 	target_cflags="${target_cflags} -DHAVE_GETTIMEOFDAY -DMALLOC_PROVIDED -DEXIT_PROVIDED -DMISSING_SYSCALL_NAMES -DSIGNAL_PROVIDED -DREENTRANT_SYSCALLS_PROVIDED -DHAVE_OPENDIR -DHAVE_RENAME"
  	;;
  # VxWorks supplies its own version of malloc, and the newlib one
  # doesn't work because VxWorks does not have sbrk.
***************
*** 296,302 ****
    powerpc*-*-eabi* | \
    powerpc*-*-elf* | \
    powerpc*-*-linux* | \
-   powerpc*-*-rtem* | \
    powerpc*-*-sysv* | \
    powerpc*-*-solaris*)
  	target_cflags="${target_cflags} -mrelocatable-lib -mno-eabi -mstrict-align -DMISSING_SYSCALL_NAMES"
--- 299,304 ----
diff -N -P -r -c newlib-1.8.0.orig/newlib/libc/include/stdio.h newlib-1.8.0/newlib/libc/include/stdio.h
*** newlib-1.8.0.orig/newlib/libc/include/stdio.h	Wed Jun 22 09:27:11 1994
--- newlib-1.8.0/newlib/libc/include/stdio.h	Mon Apr 27 12:04:49 1998
***************
*** 82,88 ****
  #define	_IONBF	2		/* setvbuf should set unbuffered */
  
  #ifndef NULL
! #define	NULL	0L
  #endif
  
  #define	BUFSIZ	1024
--- 82,88 ----
  #define	_IONBF	2		/* setvbuf should set unbuffered */
  
  #ifndef NULL
! #define	NULL	0
  #endif
  
  #define	BUFSIZ	1024
diff -N -P -r -c newlib-1.8.0.orig/newlib/libc/include/stdlib.h newlib-1.8.0/newlib/libc/include/stdlib.h
*** newlib-1.8.0.orig/newlib/libc/include/stdlib.h	Tue Jun 24 16:42:41 1997
--- newlib-1.8.0/newlib/libc/include/stdlib.h	Mon Apr 27 12:04:51 1998
***************
*** 31,37 ****
  } ldiv_t;
  
  #ifndef NULL
! #define NULL 0L
  #endif
  
  #define EXIT_FAILURE 1
--- 31,37 ----
  } ldiv_t;
  
  #ifndef NULL
! #define NULL 0
  #endif
  
  #define EXIT_FAILURE 1
diff -N -P -r -c newlib-1.8.0.orig/newlib/libc/include/string.h newlib-1.8.0/newlib/libc/include/string.h
*** newlib-1.8.0.orig/newlib/libc/include/string.h	Tue Jun 24 16:42:41 1997
--- newlib-1.8.0/newlib/libc/include/string.h	Mon Apr 27 12:04:53 1998
***************
*** 17,23 ****
  #include <stddef.h>
  
  #ifndef NULL
! #define NULL 0L
  #endif
  
  _PTR 	 _EXFUN(memchr,(const _PTR, int, size_t));
--- 17,23 ----
  #include <stddef.h>
  
  #ifndef NULL
! #define NULL 0
  #endif
  
  _PTR 	 _EXFUN(memchr,(const _PTR, int, size_t));
diff -N -P -r -c newlib-1.8.0.orig/newlib/libc/include/sys/errno.h newlib-1.8.0/newlib/libc/include/sys/errno.h
*** newlib-1.8.0.orig/newlib/libc/include/sys/errno.h	Fri Dec 13 13:06:10 1996
--- newlib-1.8.0/newlib/libc/include/sys/errno.h	Tue Mar 10 12:04:02 1998
***************
*** 132,137 ****
--- 132,138 ----
  #define EUSERS 131
  #define EDQUOT 132
  #define ESTALE 133
+ #define ENOTSUP 134
  
  /* From cygwin32.  */
  #define EWOULDBLOCK EAGAIN	/* Operation would block */
diff -N -P -r -c newlib-1.8.0.orig/newlib/libc/include/sys/stat.h newlib-1.8.0/newlib/libc/include/sys/stat.h
*** newlib-1.8.0.orig/newlib/libc/include/sys/stat.h	Tue Jun 24 16:42:43 1997
--- newlib-1.8.0/newlib/libc/include/sys/stat.h	Tue Jun 16 16:36:36 1998
***************
*** 124,129 ****
--- 124,131 ----
  int	_EXFUN(stat,( const char *_path, struct stat *_sbuf ));
  mode_t	_EXFUN(umask,( mode_t _mask ));
  
+ int     _EXFUN(mknod,( const char *_path, mode_t _mode, dev_t dev ));
+ 
  #endif /* !_STAT_H_ */
  #ifdef __cplusplus
  }
diff -N -P -r -c newlib-1.8.0.orig/newlib/libc/include/time.h newlib-1.8.0/newlib/libc/include/time.h
*** newlib-1.8.0.orig/newlib/libc/include/time.h	Tue Jun 24 16:42:42 1997
--- newlib-1.8.0/newlib/libc/include/time.h	Mon Apr 27 12:04:55 1998
***************
*** 13,19 ****
  #include "_ansi.h"
  
  #ifndef NULL
! #define	NULL	0L
  #endif
  
  #define CLOCKS_PER_SEC 1000		/* Machine dependent */
--- 13,19 ----
  #include "_ansi.h"
  
  #ifndef NULL
! #define	NULL	0
  #endif
  
  #define CLOCKS_PER_SEC 1000		/* Machine dependent */
diff -N -P -r -c newlib-1.8.0.orig/newlib/libc/machine/i386/Makefile.in newlib-1.8.0/newlib/libc/machine/i386/Makefile.in
*** newlib-1.8.0.orig/newlib/libc/machine/i386/Makefile.in	Wed Sep 20 14:03:17 1995
--- newlib-1.8.0/newlib/libc/machine/i386/Makefile.in	Tue Mar 10 12:04:02 1998
***************
*** 25,41 ****
  #### Host, target, and site specific Makefile fragments come in here.
  ###
  
! OFILES=
  
  all: lib.a
! lib.a: $(OFILES) $(COPYOFILES)
  	rm -f $@
  	$(AR) $(AR_FLAGS) $@ $(OFILES) $(COPYOFILES)
  
  doc:
  
  clean mostlyclean:
! 	-$(RM) $(OFILES) $(COPYOFILES) lib.a
  
  distclean maintainer-clean realclean: clean
  	rm -f Makefile config.status
--- 25,45 ----
  #### Host, target, and site specific Makefile fragments come in here.
  ###
  
! OFILES=setjmp.o
! 
! 
! # to support SunOS VPATH
! setjmp.o: setjmp.S
  
  all: lib.a
! lib.a: $(OFILES) 
  	rm -f $@
  	$(AR) $(AR_FLAGS) $@ $(OFILES) $(COPYOFILES)
  
  doc:
  
  clean mostlyclean:
! 	$(RM) $(OFILES) *~ lib.a
  
  distclean maintainer-clean realclean: clean
  	rm -f Makefile config.status
diff -N -P -r -c newlib-1.8.0.orig/newlib/libc/machine/i386/setjmp.S newlib-1.8.0/newlib/libc/machine/i386/setjmp.S
*** newlib-1.8.0.orig/newlib/libc/machine/i386/setjmp.S	Wed Dec 31 18:00:00 1969
--- newlib-1.8.0/newlib/libc/machine/i386/setjmp.S	Tue Mar 10 12:04:02 1998
***************
*** 0 ****
--- 1,137 ----
+ /* This is file is a merger of SETJMP.S and LONGJMP.S */
+ /*
+  *  This file was modified to use the __USER_LABEL_PREFIX__ and
+  *  __REGISTER_PREFIX__ macros defined by later versions of GNU cpp by
+  *  Joel Sherrill (joel@OARcorp.com)
+  *
+  ** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
+  **
+  ** This file is distributed under the terms listed in the document
+  ** "copying.dj", available from DJ Delorie at the address above.
+  ** A copy of "copying.dj" should accompany this file; if not, a copy
+  ** should be available from where this file was obtained.  This file
+  ** may not be distributed without a verbatim copy of "copying.dj".
+  **
+  ** This file is distributed WITHOUT ANY WARRANTY; without even the implied
+  ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+  */
+ 
+  /*
+  **	jmp_buf:
+  **	 eax ebx ecx edx esi edi ebp esp eip
+  **	 0   4   8   12  16  20  24  28  32
+  */
+ 
+ /* These are predefined by new versions of GNU cpp.  */
+  
+ #ifndef __USER_LABEL_PREFIX__
+ #define __USER_LABEL_PREFIX__ _
+ #endif
+  
+ /***************************** TEMPORARY ******************************
+  * 
+  *  It appears that the i386-coff configuration of gcc 2.6.2 does not
+  *  do the __REGISTER_PREFIX__ correctly.  Fix this when it does.
+  **********************************************************************/
+ #define __REGISTER_PREFIX__ %
+ #ifndef __REGISTER_PREFIX__
+ #define __REGISTER_PREFIX__ 
+ #endif
+  
+ /* ANSI concatenation macros.  */
+  
+ #define CONCAT1(a, b) CONCAT2(a, b)
+ #define CONCAT2(a, b) a ## b
+  
+ /* Use the right prefix for global labels.  */
+  
+ #define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
+  
+ /* Use the right prefix for registers.  */
+  
+ #define REG(x) CONCAT1 (__REGISTER_PREFIX__, x)
+  
+ #define eax REG (eax)
+ #define ebx REG (ebx)
+ #define ecx REG (ecx)
+ #define edx REG (edx)
+ #define esi REG (esi)
+ #define edi REG (edi)
+ #define ebp REG (ebp)
+ #define esp REG (esp)
+  
+ #define ax REG (ax)
+ #define bx REG (bx)
+ #define cx REG (cx)
+ #define dx REG (dx)
+ 
+ #define ah REG (ah)
+ #define bh REG (bh)
+ #define ch REG (ch)
+ #define dh REG (dh)
+ 
+ #define al REG (al)
+ #define bl REG (bl)
+ #define cl REG (cl)
+ #define dl REG (dl)
+ 
+         .global SYM (setjmp)
+         .global SYM (longjmp)
+  
+ SYM (setjmp):
+ 
+ 	pushl	ebp
+ 	movl	esp,ebp
+ 
+ 	pushl	edi
+ 	movl	8 (ebp),edi
+ 
+ 	movl	eax,0 (edi)
+ 	movl	ebx,4 (edi)
+ 	movl	ecx,8 (edi)
+ 	movl	edx,12 (edi)
+ 	movl	esi,16 (edi)
+ 
+ 	movl	-4 (ebp),eax
+ 	movl	eax,20 (edi)
+ 
+ 	movl	0 (ebp),eax
+ 	movl	eax,24 (edi)
+ 
+ 	movl	esp,eax
+ 	addl	$12,eax
+ 	movl	eax,28 (edi)
+ 	
+ 	movl	4 (ebp),eax
+ 	movl	eax,32 (edi)
+ 
+ 	popl	edi
+ 	movl	$0,eax
+ 	leave
+ 	ret
+ 
+ SYM (longjmp):
+ 	pushl	ebp
+ 	movl	esp,ebp
+ 
+ 	movl	8(ebp),edi	/* get jmp_buf */
+ 	movl	12(ebp),eax	/* store retval in j->eax */
+ 	movl	eax,0(edi)
+ 
+ 	movl	24(edi),ebp
+ 
+ 	cli
+ 	movl	28(edi),esp
+ 	
+ 	pushl	32(edi)	
+ 
+ 	movl	0(edi),eax
+ 	movl	4(edi),ebx
+ 	movl	8(edi),ecx
+ 	movl	12(edi),edx
+ 	movl	16(edi),esi
+ 	movl	20(edi),edi
+ 	sti
+ 
+ 	ret
+ 
diff -N -P -r -c newlib-1.8.0.orig/newlib/libc/machine/i386/setjmp.h newlib-1.8.0/newlib/libc/machine/i386/setjmp.h
*** newlib-1.8.0.orig/newlib/libc/machine/i386/setjmp.h	Wed Dec 31 18:00:00 1969
--- newlib-1.8.0/newlib/libc/machine/i386/setjmp.h	Tue Mar 10 12:04:02 1998
***************
*** 0 ****
--- 1,40 ----
+ /*
+ ** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
+ **
+ ** This file is distributed under the terms listed in the document
+ ** "copying.dj", available from DJ Delorie at the address above.
+ ** A copy of "copying.dj" should accompany this file; if not, a copy
+ ** should be available from where this file was obtained.  This file
+ ** may not be distributed without a verbatim copy of "copying.dj".
+ **
+ ** This file is distributed WITHOUT ANY WARRANTY; without even the implied
+ ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ */
+ 
+ #ifndef _SETJMP_H_
+ #define _SETJMP_H_
+ 
+ #ifdef __cplusplus
+ extern "C" {
+ #endif
+ 
+ typedef struct {
+   unsigned long eax;
+   unsigned long ebx;
+   unsigned long ecx;
+   unsigned long edx;
+   unsigned long esi;
+   unsigned long edi;
+   unsigned long ebp;
+   unsigned long esp;
+   unsigned long eip;
+ } jmp_buf[1];
+ 
+ extern int setjmp(jmp_buf);
+ extern void longjmp(jmp_buf, int);
+ 
+ #ifdef __cplusplus
+ }
+ #endif
+ 
+ #endif
diff -N -P -r -c newlib-1.8.0.orig/newlib/libc/machine/i960/Makefile.in newlib-1.8.0/newlib/libc/machine/i960/Makefile.in
*** newlib-1.8.0.orig/newlib/libc/machine/i960/Makefile.in	Wed Jun 25 14:11:51 1997
--- newlib-1.8.0/newlib/libc/machine/i960/Makefile.in	Thu Mar 26 08:09:41 1998
***************
*** 25,37 ****
  #### Host, target, and site specific Makefile fragments come in here.
  ###
  
! OFILES=\
  
  
  all: lib.a
  lib.a: $(OFILES) 
  	rm -f $@
  	$(AR) $(AR_FLAGS) $@ $(OFILES) $(COPYOFILES)
  
  doc:
  
--- 25,59 ----
  #### Host, target, and site specific Makefile fragments come in here.
  ###
  
! #OFILES = memccpy.o memchr.o memcmp.o memcpy.o memset.o setjmp.o strchr.o \
! #strcmp.o strcpy.o strcspn.o strdup.o strlen.o strncat.o strncmp.o \
! #strncpy.o strpbrk.o strrchr.o
! OFILES = setjmp.o
  
  
  all: lib.a
  lib.a: $(OFILES) 
  	rm -f $@
  	$(AR) $(AR_FLAGS) $@ $(OFILES) $(COPYOFILES)
+ 
+ # to support SunOS VPATH
+ memccpy.o: memccpy.S
+ memchr.o: memchr.S
+ memcmp.o: memcmp.S
+ memcpy.o: memcpy.S
+ memset.o: memset.S
+ setjmp.o: setjmp.S
+ strchr.o: strchr.S
+ strcmp.o: strcmp.S
+ strcpy.o: strcpy.S
+ strcspn.o: strcspn.S
+ strdup.o: strdup.S
+ strlen.o: strlen.S
+ strncat.o: strncat.S
+ strncmp.o: strncmp.S
+ strncpy.o: strncpy.S
+ strpbrk.o: strpbrk.S
+ strrchr.o: strrchr.S
  
  doc:
  
diff -N -P -r -c newlib-1.8.0.orig/newlib/libc/machine/i960/setjmp.S newlib-1.8.0/newlib/libc/machine/i960/setjmp.S
*** newlib-1.8.0.orig/newlib/libc/machine/i960/setjmp.S	Wed Feb  7 15:22:18 1996
--- newlib-1.8.0/newlib/libc/machine/i960/setjmp.S	Tue Mar 10 12:04:02 1998
***************
*** 35,41 ****
  /******************************************************************************/
  	.file "setjmp.as"
  	.text
! 	.link_pix
  
  	.align	4
  	.globl	_setjmp
--- 35,41 ----
  /******************************************************************************/
  	.file "setjmp.as"
  	.text
! 	/* .link_pix */
  
  	.align	4
  	.globl	_setjmp
diff -N -P -r -c newlib-1.8.0.orig/newlib/libc/machine/m68k/Makefile.in newlib-1.8.0/newlib/libc/machine/m68k/Makefile.in
*** newlib-1.8.0.orig/newlib/libc/machine/m68k/Makefile.in	Wed Sep 20 14:03:25 1995
--- newlib-1.8.0/newlib/libc/machine/m68k/Makefile.in	Fri Jun 12 16:10:36 1998
***************
*** 27,35 ****
  
  SFILES= setjmp.S
  
! OFILES= setjmp.o
  
! CFILES=
  
  all: lib.a
  lib.a: $(OFILES)
--- 27,35 ----
  
  SFILES= setjmp.S
  
! CFILES= strcpy.c strlen.c
  
! OFILES= setjmp.o strcpy.o strlen.o
  
  all: lib.a
  lib.a: $(OFILES)
diff -N -P -r -c newlib-1.8.0.orig/newlib/libc/machine/m68k/strcpy.c newlib-1.8.0/newlib/libc/machine/m68k/strcpy.c
*** newlib-1.8.0.orig/newlib/libc/machine/m68k/strcpy.c	Wed Dec 31 18:00:00 1969
--- newlib-1.8.0/newlib/libc/machine/m68k/strcpy.c	Thu Mar 26 07:54:24 1998
***************
*** 0 ****
--- 1,36 ----
+ /*
+  *  C library strcpy routine
+  *
+  *  This routine has been optimized for the CPU32+.
+  *  It should run on all 68k machines.
+  *
+  *  W. Eric Norum
+  *  Saskatchewan Accelerator Laboratory
+  *  University of Saskatchewan
+  *  Saskatoon, Saskatchewan, CANADA
+  *  eric@skatter.usask.ca
+  */
+ 
+ #include <string.h>
+ 
+ /*
+  * Copy bytes using CPU32+ loop mode if possible
+  */
+ 
+ char *
+ strcpy (char *to, const char *from)
+ {
+ 	char *pto = to;
+ 	unsigned int n = 0xFFFF;
+ 
+ 	asm volatile ("1:\n"
+ 	     "\tmove.b (%0)+,(%1)+\n"
+ #if defined(__mcpu32__)
+ 	     "\tdbeq %2,1b\n"
+ #endif
+ 	     "\tbne.b 1b\n" :
+ 		"=a" (from), "=a" (pto), "=d" (n) :
+ 		 "0" (from),  "1" (pto), "2" (n) :
+ 		 "cc", "memory");
+ 	return to;
+ }
diff -N -P -r -c newlib-1.8.0.orig/newlib/libc/machine/m68k/strlen.c newlib-1.8.0/newlib/libc/machine/m68k/strlen.c
*** newlib-1.8.0.orig/newlib/libc/machine/m68k/strlen.c	Wed Dec 31 18:00:00 1969
--- newlib-1.8.0/newlib/libc/machine/m68k/strlen.c	Thu Mar 26 07:54:50 1998
***************
*** 0 ****
--- 1,35 ----
+ /*
+  *  C library strlen routine
+  *
+  *  This routine has been optimized for the CPU32+.
+  *  It should run on all 68k machines.
+  *
+  *  W. Eric Norum
+  *  Saskatchewan Accelerator Laboratory
+  *  University of Saskatchewan
+  *  Saskatoon, Saskatchewan, CANADA
+  *  eric@skatter.usask.ca
+  */
+ 
+ #include <string.h>
+ 
+ /*
+  * Test bytes using CPU32+ loop mode if possible.
+  */
+ size_t
+ strlen (const char *str)
+ {
+ 	unsigned int n = ~0;
+ 	const char *cp = str;
+ 
+ 	asm volatile ("1:\n"
+ 	     "\ttst.b (%0)+\n"
+ #if defined(__mcpu32__)
+ 	     "\tdbeq %1,1b\n"
+ #endif
+ 	     "\tbne.b 1b\n" :
+ 		"=a" (cp), "=d" (n) :
+ 		 "0" (cp),  "1" (n) :
+ 		 "cc");
+ 	return (cp - str) - 1;
+ }
diff -N -P -r -c newlib-1.8.0.orig/newlib/libc/machine/sh/memcpy.S newlib-1.8.0/newlib/libc/machine/sh/memcpy.S
*** newlib-1.8.0.orig/newlib/libc/machine/sh/memcpy.S	Wed Mar  5 13:35:13 1997
--- newlib-1.8.0/newlib/libc/machine/sh/memcpy.S	Tue Mar 10 12:04:02 1998
***************
*** 37,43 ****
   .balignw 4,0x0009
  L_loop1:
   mov.b @r5+,r0 ! Copy bytes to align source
!  dt r1
   mov.b r0,@r4
   add #-1,r6
   add #1,r4
--- 37,48 ----
   .balignw 4,0x0009
  L_loop1:
   mov.b @r5+,r0 ! Copy bytes to align source
! #if defined(__sh2__) || defined(__sh3__) || defined(__SH3E__)
! 	dt r1
! #else
! 	add #-1,r1
! 	tst r1,r1
! #endif
   mov.b r0,@r4
   add #-1,r6
   add #1,r4
***************
*** 70,76 ****
   .balignw 4,0x0009
  L_dest00:
   mov.l @r5+,r0 ! Read longword, write longword per iteration
!  dt r2
   mov.l r0,@r4
   add #4,r4
   bf L_dest00
--- 75,86 ----
   .balignw 4,0x0009
  L_dest00:
   mov.l @r5+,r0 ! Read longword, write longword per iteration
! #if defined(__sh2__) || defined(__sh3__) || defined(__SH3E__)
! 	dt r2
! #else
! 	add #-1,r2
! 	tst r2,r2
! #endif
   mov.l r0,@r4
   add #4,r4
   bf L_dest00
***************
*** 83,89 ****
   .balignw 4,0x0009
  L_dest10:
   mov.l @r5+,r0 ! Read longword, write two words per iteration
!  dt r2
  #ifdef __LITTLE_ENDIAN__
   mov.w r0,@r4
   shlr16 r0
--- 93,104 ----
   .balignw 4,0x0009
  L_dest10:
   mov.l @r5+,r0 ! Read longword, write two words per iteration
! #if defined(__sh2__) || defined(__sh3__) || defined(__SH3E__)
! 	dt r2
! #else
! 	add #-1,r2
! 	tst r2,r2
! #endif
  #ifdef __LITTLE_ENDIAN__
   mov.w r0,@r4
   shlr16 r0
***************
*** 105,111 ****
  L_dest01:
  L_dest11:
   mov.l @r5+,r0 ! Read longword, write byte, word, byte per iteration
!  dt r2
  #if __LITTLE_ENDIAN__
   mov.b r0,@r4
   shlr8 r0
--- 120,131 ----
  L_dest01:
  L_dest11:
   mov.l @r5+,r0 ! Read longword, write byte, word, byte per iteration
! #if defined(__sh2__) || defined(__sh3__) || defined(__SH3E__)
! 	dt r2
! #else
! 	add #-1,r2
! 	tst r2,r2
! #endif
  #if __LITTLE_ENDIAN__
   mov.b r0,@r4
   shlr8 r0
***************
*** 139,145 ****
   .balignw 4,0x0009
  L_cleanup_loop:
   mov.b @r5+,r0
!  dt r6
   mov.b r0,@r4
   add #1,r4
   bf L_cleanup_loop
--- 159,170 ----
   .balignw 4,0x0009
  L_cleanup_loop:
   mov.b @r5+,r0
! #if defined(__sh2__) || defined(__sh3__) || defined(__SH3E__)
! 	dt r6
! #else
! 	add #-1,r6
! 	tst r6,r6
! #endif
   mov.b r0,@r4
   add #1,r4
   bf L_cleanup_loop
diff -N -P -r -c newlib-1.8.0.orig/newlib/libc/machine/sh/memset.S newlib-1.8.0/newlib/libc/machine/sh/memset.S
*** newlib-1.8.0.orig/newlib/libc/machine/sh/memset.S	Wed Mar  5 13:35:14 1997
--- newlib-1.8.0/newlib/libc/machine/sh/memset.S	Tue Mar 10 12:04:02 1998
***************
*** 33,39 ****
   mov.b r5,@r4
   add #-1,r6
   add #1,r4
!  dt r0
   bf L_align_loop
  
  L_dup_bytes: 
--- 33,44 ----
   mov.b r5,@r4
   add #-1,r6
   add #1,r4
! #if defined(__sh2__) || defined(__sh3__) || defined(__SH3E__)
! 	dt r0
! #else
! 	add #-1,r0
! 	tst r0,r0
! #endif
   bf L_align_loop
  
  L_dup_bytes: 
***************
*** 50,56 ****
   .balignw 4,0x0009
  L_store_long_loop:
   mov.l r5,@r4 ! Store double longs to memory
!  dt r2
   mov.l r5,@(4,r4)
   add #8,r4
   bf L_store_long_loop
--- 55,66 ----
   .balignw 4,0x0009
  L_store_long_loop:
   mov.l r5,@r4 ! Store double longs to memory
! #if defined(__sh2__) || defined(__sh3__) || defined(__SH3E__)
! 	dt r2
! #else
! 	add #-1,r2
! 	tst r2,r2
! #endif
   mov.l r5,@(4,r4)
   add #8,r4
   bf L_store_long_loop
***************
*** 63,69 ****
  L_store_byte_loop:
   mov.b r5,@r4 ! Store bytes to memory
   add #1,r4
!  dt r6
   bf L_store_byte_loop
  
  L_exit:
--- 73,84 ----
  L_store_byte_loop:
   mov.b r5,@r4 ! Store bytes to memory
   add #1,r4
! #if defined(__sh2__) || defined(__sh3__) || defined(__SH3E__)
! 	dt r6
! #else
! 	add #-1,r6
! 	tst r6,r6
! #endif
   bf L_store_byte_loop
  
  L_exit:
diff -N -P -r -c newlib-1.8.0.orig/newlib/libc/reent/reent.c newlib-1.8.0/newlib/libc/reent/reent.c
*** newlib-1.8.0.orig/newlib/libc/reent/reent.c	Mon Feb  5 17:37:21 1996
--- newlib-1.8.0/newlib/libc/reent/reent.c	Tue Mar 10 12:04:02 1998
***************
*** 82,84 ****
--- 82,107 ----
      }
  }
  
+ /*
+  *  Do atexit() processing and cleanup
+  *
+  *  NOTE:  This is to be executed at task exit.  It does not tear anything
+  *         down which is used on a global basis.
+  */
+ 
+ void
+ _wrapup_reent(struct _reent *ptr)
+ {
+   register struct _atexit *p;
+   register int n;
+ 
+   if (ptr == 0)
+       ptr = _REENT;
+ 
+   for (p = ptr->_atexit; p; p = p->_next)
+     for (n = p->_ind; --n >= 0;)
+       (*p->_fns[n]) ();
+   if (ptr->__cleanup)
+     (*ptr->__cleanup) (ptr);
+ }
+ 
diff -N -P -r -c newlib-1.8.0.orig/newlib/libc/stdio/tmpnam.c newlib-1.8.0/newlib/libc/stdio/tmpnam.c
*** newlib-1.8.0.orig/newlib/libc/stdio/tmpnam.c	Wed Jun 25 12:25:22 1997
--- newlib-1.8.0/newlib/libc/stdio/tmpnam.c	Fri May  8 09:22:24 1998
***************
*** 122,132 ****
        t = _open_r (ptr, result, O_RDONLY, 0);
        if (t == -1)
  	{
! 	  if (ptr->_errno == ENOSYS)
! 	    {
! 	      result[0] = '0';
! 	      return 0;
! 	    }
  	  break;
  	}
        (*part4)++;
--- 122,129 ----
        t = _open_r (ptr, result, O_RDONLY, 0);
        if (t == -1)
  	{
! 	  result[0] = '\0';
! 	  return 0;
  	  break;
  	}
        (*part4)++;
diff -N -P -r -c newlib-1.8.0.orig/newlib/libc/string/strerror.c newlib-1.8.0/newlib/libc/string/strerror.c
*** newlib-1.8.0.orig/newlib/libc/string/strerror.c	Mon Aug 26 15:44:12 1996
--- newlib-1.8.0/newlib/libc/string/strerror.c	Thu May 21 12:30:09 1998
***************
*** 605,610 ****
--- 605,645 ----
        error = "Software caused connection abort";
        break;
  #endif
+ #if (defined(EWOULDBLOCK) && (!defined (EAGAIN) || (EWOULDBLOCK != EAGAIN)))
+     case EWOULDBLOCK:
+ 	error = "Operation would block";
+         break;
+ #endif
+ #ifdef ENOTCONN
+     case ENOTCONN:
+ 	error = "Socket is not connected";
+         break;
+ #endif
+ #ifdef ESOCKTNOSUPPORT
+     case ESOCKTNOSUPPORT:
+ 	error = "Socket type not supported";
+         break;
+ #endif
+ #ifdef EISCONN
+     case EISCONN:
+ 	error = "Socket is already connected";
+         break;
+ #endif
+ #ifdef EOPNOTSUPP
+     case EOPNOTSUPP:
+ 	error = "Operation not supported on socket";
+         break;
+ #endif
+ #ifdef EMSGSIZE
+     case EMSGSIZE:
+ 	error = "Message too long";
+         break;
+ #endif
+ #ifdef ETIMEDOUT
+     case ETIMEDOUT:
+ 	error = "Connection timed out";
+         break;
+ #endif
      default:
        if ((error = _user_strerror (errnum)) == 0)
  	error = "";
diff -N -P -r -c newlib-1.8.0.orig/newlib/libc/sys/rtems/crt0.c newlib-1.8.0/newlib/libc/sys/rtems/crt0.c
*** newlib-1.8.0.orig/newlib/libc/sys/rtems/crt0.c	Tue Jun 24 16:49:55 1997
--- newlib-1.8.0/newlib/libc/sys/rtems/crt0.c	Wed Mar 25 08:13:07 1998
***************
*** 1 ****
--- 1,44 ----
+ /*
+  *  RTEMS Fake crt0
+  *
+  *  Each RTEMS BSP provides its own crt0 and linker script.  Unfortunately
+  *  this means that crt0 and the linker script are not available as
+  *  each tool is configured.  Without a crt0 and linker script, some
+  *  targets do not successfully link "conftest.c" during the configuration 
+  *  process.  So this fake crt0.c provides all the symbols required to
+  *  successfully link a program.  The resulting program will not run
+  *  but this is enough to satisfy the autoconf macro AC_PROG_CC.
+  */
+ 
+ /* RTEMS provides some of its own routines including a Malloc family */
+ 
+ void *malloc() { return 0; }
+ void *realloc() { return 0; }
+ void free() { ; }
+  
+ /* The PowerPC expects certain symbols to be defined in the linker script. */
+ 
+ #if defined(__PPC__)
+   int __SDATA_START__;  int __SDATA2_START__;
+   int __GOT_START__;    int __GOT_END__;
+   int __GOT2_START__;   int __GOT2_END__;
+   int __SBSS_END__;     int __SBSS2_END__;
+   int __FIXUP_START__;  int __FIXUP_END__;
+   int __EXCEPT_START__; int __EXCEPT_END__;
+   int __init;           int __fini;
+ #endif
+ 
+ /*  The hppa expects this to be defined in the real crt0.s. 
+  *  Also for some reason, the hppa1.1 does not find atexit()
+  *  during the AC_PROG_CC tests.
+  */
+ 
+ #if defined(__hppa__)
+   asm ( ".subspa \$GLOBAL\$,QUAD=1,ALIGN=8,ACCESS=0x1f,SORT=40");
+   asm ( ".export \$global\$" );
+   asm ( "\$global\$:");
+ 
+   int atexit(void (*function)(void)) { return 0; }
+ #endif
+ 
  void rtems_provides_crt0( void ) {}
diff -N -P -r -c newlib-1.8.0.orig/newlib/libc/sys/rtems/sys/types.h newlib-1.8.0/newlib/libc/sys/rtems/sys/types.h
*** newlib-1.8.0.orig/newlib/libc/sys/rtems/sys/types.h	Tue Jun 24 16:53:04 1997
--- newlib-1.8.0/newlib/libc/sys/rtems/sys/types.h	Tue Jun 16 16:07:18 1998
***************
*** 52,58 ****
  #endif
  #endif
  
! typedef short dev_t;             /* device numbers */
  typedef long  off_t;             /* file sizes */
   
  typedef unsigned short uid_t;    /* user IDs */
--- 52,58 ----
  #endif
  #endif
  
! typedef unsigned long long dev_t;/* device numbers 32-bit major and minor */
  typedef long  off_t;             /* file sizes */
   
  typedef unsigned short uid_t;    /* user IDs */
***************
*** 133,142 ****
--- 133,144 ----
   *        P1003.1b-1993, p. 84
   */
  
+ #ifndef __go32_types__
  uid_t _EXFUN(getuid, (void));
  uid_t _EXFUN(geteuid, (void));
  gid_t _EXFUN(getgid, (void));
  gid_t _EXFUN(getegid, (void));
+ #endif
  
  /*
   *  4.2.2 Set User and Group IDs, P1003.1b-1993, p. 84