This is the mail archive of the newlib@sources.redhat.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]
Other format: [Raw text]

CRIS/CRISv32 port, newlib part (first part)


Here it is.  I'm taking the opportunity to submit the minor
changes to support CRIS v32 (crisv32-*-* and/or the "-march=v32"
multilib of cris-*-*) together with the CRIS port.  I hope
that's ok.  There's no GCC support for CRIS v32 in CVS, but the
binutils support is in CVS and the simulator parts are submitted
and approved (only to be committed).  There are few changes to
accommodate CRIS v32 and all are assembly code changes; the ABI
is the same as for cris-*-*.  CRIS v32 has a simple pipeline
(previous versions did not) and there are instruction and
addressing mode changes to go with that.  There's a vary narrow
common code subset shared between v10 and v32.

I've tested this port with trunk CVS GCC as of LAST_UPDATED "Fri
Jan 21 03:20:28 UTC 2005" (plus a few necessary corrections for
libraries, start-up-files and the -sim* options) and testing
just passed gcc.c-torture/execute/execute.exp for "Wed Jan 26
00:44:25 UTC 2005".  Trunk binutils, the submitted simulator and
HEAD newlib+libgloss were used, together with a trivial
cris-sim.exp.

I did not see a need to change COPYING.NEWLIB, because the
BSD-like license for the CRIS files is supposed to match this
text in COPYING.NEWLIB: "Note that this list may omit certain
licenses that only pertain to the copying/modifying of the
individual source code.  If you are distributing the source
code, then you do not need to worry about these omitted
licenses, so long as you do not modify the copyright information
already in place."  See the license blurbs in the CRIS files.
That license being less restrictive than the KTH BSD-variant
(see COPYING.NEWLIB) that its text is based on (binary dists
differ), I hope and expect it to be acceptable for newlib.

On binutils and GCC, it's frowned upon to post generated files.
I assume the same goes here, so please before committing generate:
libc/machine/cris/aclocal.m4
libc/machine/cris/configure
libc/machine/cris/Makefile.in
libc/sys/cris/aclocal.m4
libc/sys/cris/configure
libc/sys/cris/Makefile.in
If wanted, I can commit the patch including the generated files.

Libgloss part next.

Can I please commit future changes to this port?

I need newlib/libc/sys/cris because the default newlib include
files defines values that are incompatible with the Linux/CRIS
ABI and IIUC a machine-specific libc/sys subdir is the most
clean way to handle that difference.  (BTW, I don't think these
values can generally be expected to be shareable across the
various Linux/* ports.)

newlib:
2005-01-25  Hans-Peter Nilsson  <hp@axis.com>

	* configure.host: Add support for cris-*-* and crisv32-*-*.
	* newlib/libc/include/machine/ieeefp.h: Ditto.
	* newlib/libc/include/machine/setjmp.h: Ditto.
	* newlib/libc/machine/cris: New directory.
	* newlib/libc/sys/cris: New directory.

Index: configure.host
===================================================================
RCS file: /cvs/src/src/newlib/configure.host,v
retrieving revision 1.66
diff -c -p -r1.66 configure.host
*** configure.host	5 Oct 2004 19:44:24 -0000	1.66
--- configure.host	25 Jan 2005 19:52:33 -0000
*************** case "${host_cpu}" in
*** 93,98 ****
--- 93,101 ----
    avr*)
  	newlib_cflags="${newlib_cflags} -DPREFER_SIZE_OVER_SPEED -mcall-prologues"
  	;;
+   cris | crisv32)
+ 	machine_dir=cris
+ 	;;
    crx*)
  	machine_dir=crx
  	;;
*************** case "${host}" in
*** 310,315 ****
--- 313,321 ----
  	  sys_dir=arm
  	fi
  	;;
+   cris-*-* | crisv32-*-*)
+ 	sys_dir=cris
+         ;;
    crx*)
  	sys_dir=
  	;;
*************** case "${host}" in
*** 502,507 ****
--- 508,517 ----
    avr*)
  	newlib_cflags="${newlib_cflags} -DNO_EXEC -DSMALL_MEMORY -DMISSING_SYSCALL_NAMES"
  	;;
+   cris-*-* | crisv32-*-*)
+ 	newlib_cflags="${newlib_cflags} -DHAVE_RENAME -DHAVE_GETTIMEOFDAY -D_USE_WRITE"
+ 	syscall_dir=syscalls
+ 	;;
    crx-*-*)
    	newlib_cflags="${newlib_cflags} -DHAVE_RENAME -DMISSING_SYSCALL_NAMES"
  	syscall_dir=
Index: libc/include/machine/ieeefp.h
===================================================================
RCS file: /cvs/src/src/newlib/libc/include/machine/ieeefp.h,v
retrieving revision 1.24
diff -c -p -r1.24 ieeefp.h
*** libc/include/machine/ieeefp.h	5 Oct 2004 19:44:24 -0000	1.24
--- libc/include/machine/ieeefp.h	25 Jan 2005 19:52:33 -0000
***************
*** 265,270 ****
--- 265,274 ----
  #endif /* __ARMEL__ */
  #endif /* __MAVERICK__ */
  
+ #ifdef __CRIS__
+ #define __IEEE_LITTLE_ENDIAN
+ #endif
+ 
  #ifndef __IEEE_BIG_ENDIAN
  #ifndef __IEEE_LITTLE_ENDIAN
  #error Endianess not declared!!
Index: libc/include/machine/setjmp.h
===================================================================
RCS file: /cvs/src/src/newlib/libc/include/machine/setjmp.h,v
retrieving revision 1.22
diff -c -p -r1.22 setjmp.h
*** libc/include/machine/setjmp.h	25 Oct 2004 17:53:19 -0000	1.22
--- libc/include/machine/setjmp.h	25 Jan 2005 19:52:33 -0000
*************** _BEGIN_STD_C
*** 205,210 ****
--- 205,214 ----
  #define _JBLEN 8
  #endif
  
+ #ifdef __CRIS__
+ #define _JBLEN 18
+ #endif
+ 
  #ifdef _JBLEN
  #ifdef _JBTYPE
  typedef	_JBTYPE jmp_buf[_JBLEN];
--- /dev/null	Tue Oct 29 15:57:07 2002
+++ libc/machine/cris/configure.in	Tue May  2 18:09:58 2000
@@ -0,0 +1,12 @@
+dnl This is the newlib/libc/machine/cris configure.in file.
+dnl Process this file with autoconf to produce a configure script.
+
+AC_PREREQ(2.5)
+AC_INIT(setjmp.c)
+
+dnl Can't be done in NEWLIB_CONFIGURE because that confuses automake. 
+AC_CONFIG_AUX_DIR(../../../..)
+
+NEWLIB_CONFIGURE(../../..)
+
+AC_OUTPUT(Makefile)
--- /dev/null	Tue Oct 29 15:57:07 2002
+++ libc/machine/cris/Makefile.am	Wed Jan  5 15:43:01 2005
@@ -0,0 +1,21 @@
+## Process this file with automake to generate Makefile.in
+
+AUTOMAKE_OPTIONS = cygnus
+
+INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS)
+
+noinst_LIBRARIES = lib.a
+
+# We also make a library with just the useful
+# machine-but-not-system-specific functions, usable as an add-on
+# by itself together with e.g. uclibc.
+toollib_LIBRARIES = libic.a
+
+lib_a_SOURCES = setjmp.c memcpy.c memset.c memmove.c libcdtor.c
+
+libic_a_SOURCES = setjmp.c memcpy.c memset.c memmove.c libcdtor.c
+tooldir = $(exec_prefix)/$(host_alias)
+toollibdir = $(tooldir)/lib$(MULTISUBDIR)
+
+ACLOCAL_AMFLAGS = -I ../../..
+CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host
--- /dev/null	Tue Oct 29 15:57:07 2002
+++ libc/machine/cris/libcdtor.c	Tue Jan 25 12:46:07 2005
@@ -0,0 +1,88 @@
+/* Call ctors and dtors from elinux a.out shared libraries.
+   Copyright (C) 1999, 2000, 2003, 2004, 2005 Axis Communications.
+   All rights reserved.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions
+   are met:
+
+   1. Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+   2. Neither the name of Axis Communications nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+   THIS SOFTWARE IS PROVIDED BY AXIS COMMUNICATIONS AND ITS CONTRIBUTORS
+   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL AXIS
+   COMMUNICATIONS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+   INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+   IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+   POSSIBILITY OF SUCH DAMAGE.  */
+
+typedef void (*vfnp) (void);
+
+/* The guts of the _Libctors and _Libdtors is "optimized" away into
+   empty functions when the definition is visible as well.  Simplest
+   solution is to emit the definitions as asm.  We have no .previous
+   directive in a.out, so we rely on the fact that everything in this
+   file goes into the .text section.  */
+__asm__
+(
+ ".text\n\t.global .$global.lib.ctors\n.$global.lib.ctors:\n\t.dword 0"
+);
+__asm__
+(
+ ".text\n\t.global .$global.lib.dtors\n.$global.lib.dtors:\n\t.dword 0"
+);
+
+extern vfnp * const _Ctors asm(".$global.lib.ctors");
+extern vfnp * const _Dtors asm(".$global.lib.dtors");
+
+/* We better provide weak empty ctor and dtor lists, since they are not
+   created if the main program does not have ctor/dtors.  */
+
+static vfnp const defaultors[] = {0, 0};
+
+extern vfnp * __CTOR_LIST__ __attribute__ ((weak, alias ("defaultors")));
+extern vfnp * __DTOR_LIST__ __attribute__ ((weak, alias ("defaultors")));
+
+void
+_Libctors (void)
+{
+  const vfnp *firstor = _Ctors;
+  const vfnp *ctors;
+
+  /* Have to find the last ctor; they will run in opposite order as in
+     the table. */
+  if (firstor != 0 && *firstor != 0)
+    {
+      for (ctors = firstor; *ctors != 0; ctors++)
+	;
+
+      while (--ctors != firstor)
+	{
+	  (**ctors)();
+	}
+
+      (**ctors)();
+    }
+}
+
+void
+_Libdtors(void)
+{
+  const vfnp *dtors = _Dtors;
+
+  if (dtors)
+    while (*dtors != 0)
+      {
+	(**dtors++) ();
+      }
+}
--- /dev/null	Tue Oct 29 15:57:07 2002
+++ libc/machine/cris/setjmp.c	Tue Jan 25 12:47:57 2005
@@ -0,0 +1,212 @@
+/* A setjmp.c for CRIS
+   Copyright (C) 1993-2005 Axis Communications.
+   All rights reserved.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions
+   are met:
+
+   1. Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+   2. Neither the name of Axis Communications nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+   THIS SOFTWARE IS PROVIDED BY AXIS COMMUNICATIONS AND ITS CONTRIBUTORS
+   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL AXIS
+   COMMUNICATIONS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+   INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+   IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+   POSSIBILITY OF SUCH DAMAGE.  */
+
+/* For benefit of CRIS v0..v3, we save and restore CCR to be able to
+   correctly handle DI/EI; otherwise there would be no reason to save it.
+   Note also that the "move x,ccr" does NOT affect
+   the DMA enable bits (E and D) of v0..v3.
+
+   We do not save mof; it is call-clobbered.  It also does not exist in
+   v0..v8; it should be safe to read or write to it there, but better not.
+
+   jmp_buf[0] - PC
+   jmp_buf[1] - SP (R14)
+   jmp_buf[2] - R13
+   jmp_buf[3] - R12
+   jmp_buf[4] - R11
+   jmp_buf[5] - R10
+   jmp_buf[6] - R9
+   jmp_buf[7] - R8
+   jmp_buf[8] - R7
+   jmp_buf[9] - R6
+   jmp_buf[10] - R5
+   jmp_buf[11] - R4
+   jmp_buf[12] - R3
+   jmp_buf[13] - R2
+   jmp_buf[14] - R1
+   jmp_buf[15] - R0
+   jmp_buf[16] - SRP
+   jmp_buf[17] - CCR
+   */
+
+#include <setjmp.h>
+
+int
+setjmp (jmp_buf buf)
+{
+  int ret;
+#if defined (__arch_common_v10_v32) || defined (__arch_v32)
+  /* No offsets in the compatibility mode.  Also, movem saves in
+     different order on v10 than on v32, so we use single move
+     instructions instead, this not being a speed-prioritized operation.
+     And we don't save CCR or CCS; since long unuseful.  */
+  __asm__ __volatile__
+    ("move.d %1,$r13							\n\
+      move 0f,$mof							\n\
+      move $mof,[$r13+]							\n\
+      move.d $sp,[$r13+]						\n\
+      clear.d [$r13+]							\n\
+      move.d $r12,[$r13+]						\n\
+      move.d $r11,[$r13+]						\n\
+      move.d $r10,[$r13+]						\n\
+      moveq 1,$r9							\n\
+      move.d $r9,[$r13+]						\n\
+      move.d $r8,[$r13+]						\n\
+      move.d $r7,[$r13+]						\n\
+      move.d $r6,[$r13+]						\n\
+      move.d $r5,[$r13+]						\n\
+      move.d $r4,[$r13+]						\n\
+      move.d $r3,[$r13+]						\n\
+      move.d $r2,[$r13+]						\n\
+      move.d $r1,[$r13+]						\n\
+      move.d $r0,[$r13+]						\n\
+      move $srp,[$r13+]							\n\
+      clear.d [$r13+]							\n\
+      clear.d $r9							\n\
+0:									\n\
+      move.d $r9,%0"
+
+     /* Output.  */
+     : "=&r" (ret)
+
+     /* Input.  */
+     : "r" (buf)
+
+     /* Clobber.  */
+     : "r9", "r13", "memory");
+#else /* not __arch_common_v10_v32 or __arch_v32 */
+#ifdef __PIC__
+  __asm__ __volatile__
+    ("moveq 1,$r9							\n\
+      movem $sp,[%1+1*4]						\n\
+      move.d $pc,$r9							\n\
+      addq 0f-.,$r9							\n\
+      move.d $r9,[%1]							\n\
+      move $srp,[%1+16*4]						\n\
+      move $ccr,[%1+17*4]						\n\
+      clear.d $r9							\n\
+0:									\n\
+      move.d $r9,%0"
+
+     /* Output.  */
+     : "=&r" (ret)
+
+     /* Input.  */
+     : "r" (buf)
+
+     /* Clobber.  */
+     : "r9", "memory");
+#else  /* not PIC */
+  __asm__ __volatile__
+    ("moveq 1,$r9							\n\
+      movem $sp,[%1+1*4]						\n\
+      move.d 0f,$r9							\n\
+      move.d $r9,[%1]							\n\
+      move $srp,[%1+16*4]						\n\
+      move $ccr,[%1+17*4]						\n\
+      clear.d $r9							\n\
+0:									\n\
+      move.d $r9,%0"
+
+     /* Output.  */
+     : "=&r" (ret)
+
+     /* Input.  */
+     : "r" (buf)
+
+     /* Clobber.  */
+     : "r9");
+#endif /* not PIC */
+#endif /* not __arch_common_v10_v32 or __arch_v32 */
+  return ret;
+}
+
+void
+longjmp(jmp_buf buf, int val)
+{
+#if defined (__arch_common_v10_v32) || defined (__arch_v32)
+  __asm__ __volatile__
+    ("cmpq 0,%1								\n\
+      beq 0f								\n\
+      move.d %0,$r13	; In delay-slot.				\n\
+      addq 6*4,$r13							\n\
+      move.d %1,[$r13]							\n\
+      subq 6*4,$r13							\n\
+0:\n"
+#ifdef __arch_common_v10_v32
+     /* Cater to branch offset difference between v32 and v10.  We
+	assume the branch above is 8-bit.  */
+"     setf\n"
+#endif
+"     move [$r13+],$mof							\n\
+      move.d [$r13+],$sp						\n\
+      addq 4,$r13							\n\
+      move.d [$r13+],$r12						\n\
+      move.d [$r13+],$r11						\n\
+      move.d [$r13+],$r10						\n\
+      move.d [$r13+],$r9						\n\
+      move.d [$r13+],$r8						\n\
+      move.d [$r13+],$r7						\n\
+      move.d [$r13+],$r6						\n\
+      move.d [$r13+],$r5						\n\
+      move.d [$r13+],$r4						\n\
+      move.d [$r13+],$r3						\n\
+      move.d [$r13+],$r2						\n\
+      move.d [$r13+],$r1						\n\
+      move.d [$r13+],$r0						\n\
+      move [$r13+],$srp							\n\
+      move $mof,$r13							\n\
+      jump $r13								\n\
+      setf"
+
+     /* No outputs.  */
+     :
+
+     /* Inputs.  */
+     : "r" (buf), "r" (val)
+     : "r13", "memory");
+
+#else /* not __arch_common_v10_v32 or __arch_v32 */
+  __asm__ __volatile__
+    ("move [%0+17*4],$ccr						\n\
+      move [%0+16*4],$srp						\n\
+      test.d %1								\n\
+      beq 0f								\n\
+      nop								\n\
+      move.d %1,[%0+6*4]	; Offset for r9.			\n\
+0:									\n\
+      movem [%0],$pc"
+
+     /* No outputs.  */
+     :
+
+     /* Inputs.  */
+     : "r" (buf), "r" (val)
+     : "memory");
+#endif /* not __arch_common_v10_v32 or __arch_v32 */
+}
--- /dev/null	Tue Oct 29 15:57:07 2002
+++ libc/machine/cris/memmove.c	Tue Jan 25 12:47:31 2005
@@ -0,0 +1,257 @@
+/* A memmove for CRIS.
+   Copyright (C) 2000-2005 Axis Communications.
+   All rights reserved.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions
+   are met:
+
+   1. Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+   2. Neither the name of Axis Communications nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+   THIS SOFTWARE IS PROVIDED BY AXIS COMMUNICATIONS AND ITS CONTRIBUTORS
+   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL AXIS
+   COMMUNICATIONS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+   INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+   IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+   POSSIBILITY OF SUCH DAMAGE.  */
+
+/* FIXME: This file should really only be used for reference, as the
+   result is somewhat depending on gcc generating what we expect rather
+   than what we describe.  An assembly file should be used instead.
+
+   Even worse, we base it on memcpy, on the assumption that overlapping
+   moves are rare, and we will do no worse than the generic memmove.  */
+
+#include <stddef.h>
+
+/* Break even between movem and move16 is really at 38.7 * 2, but
+   modulo 44, so up to the next multiple of 44, we use ordinary code.  */
+#define MEMMOVE_BY_BLOCK_THRESHOLD (44 * 2)
+
+/* No name ambiguities in this file.  */
+__asm__ (".syntax no_register_prefix");
+
+void *
+memmove(void *pdst, const void *psrc, size_t pn)
+{
+  /* Now we want the parameters put in special registers.
+     Make sure the compiler is able to make something useful of this.
+     As it is now: r10 -> r13; r11 -> r11 (nop); r12 -> r12 (nop).
+
+     If gcc was allright, it really would need no temporaries, and no
+     stack space to save stuff on.  */
+
+  register void *return_dst __asm__ ("r10") = pdst;
+  register unsigned char *dst __asm__ ("r13") = pdst;
+  register unsigned const char *src __asm__ ("r11") = psrc;
+  register int n __asm__ ("r12") = pn;
+
+  /* Check and handle overlap.  */
+  if (src < dst && dst < src + n)
+    {
+      /* Destructive overlap.  We could optimize this, but we don't (for
+	 the moment).  */
+      src += n;
+      dst += n;
+      while (n--)
+	{
+	  *--dst = *--src;
+	}
+
+      return return_dst;
+    }
+  /* Whew, no overlap.  Proceed as with mempcy.  We could call it instead
+     of having a copy here.  That would spoil some of the optimization, so
+     we take the trouble with having two copies.  */
+
+  /* When src is aligned but not dst, this makes a few extra needless
+     cycles.  I believe it would take as many to check that the
+     re-alignment was unnecessary.  */
+  if (((unsigned long) dst & 3) != 0
+      /* Don't align if we wouldn't copy more than a few bytes; so we
+	 don't have to check further for overflows.  */
+      && n >= 3)
+  {
+    if ((unsigned long) dst & 1)
+      {
+	n--;
+	*dst = *src;
+	src++;
+	dst++;
+      }
+
+    if ((unsigned long) dst & 2)
+      {
+	n -= 2;
+	*(short *) dst = *(short *) src;
+	src += 2;
+	dst += 2;
+      }
+  }
+
+  /* Decide which copying method to use.  */
+  if (n >= MEMMOVE_BY_BLOCK_THRESHOLD)
+    {
+      /* It is not optimal to tell the compiler about clobbering any
+	 registers; that will move the saving/restoring of those registers
+	 to the function prologue/epilogue, and make non-movem sizes
+	 suboptimal.  */
+      __asm__ volatile
+	("\
+	 ;; GCC does promise correct register allocations, but let's	\n\
+	 ;; make sure it keeps its promises.				\n\
+	 .ifnc %0-%1-%2,$r13-$r11-$r12					\n\
+	 .error \"GCC reg alloc bug: %0-%1-%4 != $r13-$r12-$r11\"	\n\
+	 .endif								\n\
+									\n\
+	 ;; Save the registers we'll use in the movem process		\n\
+	 ;; on the stack.						\n\
+	 subq	11*4,sp							\n\
+	 movem	r10,[sp]						\n\
+									\n\
+	 ;; Now we've got this:						\n\
+	 ;; r11 - src							\n\
+	 ;; r13 - dst							\n\
+	 ;; r12 - n							\n\
+									\n\
+	 ;; Update n for the first loop.				\n\
+	 subq	 44,r12							\n\
+0:									\n\
+"
+#ifdef __arch_common_v10_v32
+	 /* Cater to branch offset difference between v32 and v10.  We
+	    assume the branch below has an 8-bit offset.  */
+"	 setf\n"
+#endif
+"	 movem	[r11+],r10						\n\
+	 subq	44,r12							\n\
+	 bge	 0b							\n\
+	 movem	r10,[r13+]						\n\
+									\n\
+	 ;; Compensate for last loop underflowing n.			\n\
+	 addq	44,r12							\n\
+									\n\
+	 ;; Restore registers from stack.				\n\
+	 movem [sp+],r10"
+
+	 /* Outputs.  */
+	 : "=r" (dst), "=r" (src), "=r" (n)
+
+	 /* Inputs.  */
+	 : "0" (dst), "1" (src), "2" (n));
+    }
+
+  while (n >= 16)
+    {
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+
+      n -= 16;
+    }
+
+  switch (n)
+    {
+    case 0:
+      break;
+
+    case 1:
+      *dst = *src;
+      break;
+
+    case 2:
+      *(short *) dst = *(short *) src;
+      break;
+
+    case 3:
+      *(short *) dst = *(short *) src; dst += 2; src += 2;
+      *dst = *src;
+      break;
+
+    case 4:
+      *(long *) dst = *(long *) src;
+      break;
+
+    case 5:
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *dst = *src;
+      break;
+
+    case 6:
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *dst = *src;
+      break;
+
+    case 7:
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(short *) dst = *(short *) src; dst += 2; src += 2;
+      *dst = *src;
+      break;
+
+    case 8:
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src;
+      break;
+
+    case 9:
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *dst = *src;
+      break;
+
+    case 10:
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *dst = *src;
+      break;
+
+    case 11:
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(short *) dst = *(short *) src; dst += 4; src += 4;
+      *dst = *src;
+      break;
+
+    case 12:
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src;
+      break;
+
+    case 13:
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *dst = *src;
+      break;
+
+    case 14:
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(short *) dst = *(short *) src;
+      break;
+
+    case 15:
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(short *) dst = *(short *) src; dst += 4; src += 4;
+      *dst = *src;
+      break;
+    }
+
+  return return_dst;
+}
--- /dev/null	Tue Oct 29 15:57:07 2002
+++ libc/machine/cris/memcpy.c	Tue Jan 25 12:46:38 2005
@@ -0,0 +1,236 @@
+/* A memcpy for CRIS.
+   Copyright (C) 1994-2005 Axis Communications.
+   All rights reserved.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions
+   are met:
+
+   1. Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+   2. Neither the name of Axis Communications nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+   THIS SOFTWARE IS PROVIDED BY AXIS COMMUNICATIONS AND ITS CONTRIBUTORS
+   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL AXIS
+   COMMUNICATIONS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+   INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+   IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+   POSSIBILITY OF SUCH DAMAGE.  */
+
+/* FIXME: This file should really only be used for reference, as the
+   result is somewhat depending on gcc generating what we expect rather
+   than what we describe.  An assembly file should be used instead.  */
+
+#include <stddef.h>
+
+/* Break even between movem and move16 is really at 38.7 * 2, but
+   modulo 44, so up to the next multiple of 44, we use ordinary code.  */
+#define MEMCPY_BY_BLOCK_THRESHOLD (44 * 2)
+
+/* No name ambiguities in this file.  */
+__asm__ (".syntax no_register_prefix");
+
+void *
+memcpy(void *pdst, const void *psrc, size_t pn)
+{
+  /* Now we want the parameters put in special registers.
+     Make sure the compiler is able to make something useful of this.
+     As it is now: r10 -> r13; r11 -> r11 (nop); r12 -> r12 (nop).
+
+     If gcc was allright, it really would need no temporaries, and no
+     stack space to save stuff on.  */
+
+  register void *return_dst __asm__ ("r10") = pdst;
+  register unsigned char *dst __asm__ ("r13") = pdst;
+  register unsigned const char *src __asm__ ("r11") = psrc;
+  register int n __asm__ ("r12") = pn;
+
+  /* When src is aligned but not dst, this makes a few extra needless
+     cycles.  I believe it would take as many to check that the
+     re-alignment was unnecessary.  */
+  if (((unsigned long) dst & 3) != 0
+      /* Don't align if we wouldn't copy more than a few bytes; so we
+	 don't have to check further for overflows.  */
+      && n >= 3)
+  {
+    if ((unsigned long) dst & 1)
+      {
+	n--;
+	*dst = *src;
+	src++;
+	dst++;
+      }
+
+    if ((unsigned long) dst & 2)
+      {
+	n -= 2;
+	*(short *) dst = *(short *) src;
+	src += 2;
+	dst += 2;
+      }
+  }
+
+  /* Decide which copying method to use.  */
+  if (n >= MEMCPY_BY_BLOCK_THRESHOLD)
+    {
+      /* It is not optimal to tell the compiler about clobbering any
+	 registers; that will move the saving/restoring of those registers
+	 to the function prologue/epilogue, and make non-movem sizes
+	 suboptimal.  */
+      __asm__ volatile
+	("\
+	 ;; GCC does promise correct register allocations, but let's	\n\
+	 ;; make sure it keeps its promises.				\n\
+	 .ifnc %0-%1-%2,$r13-$r11-$r12					\n\
+	 .error \"GCC reg alloc bug: %0-%1-%4 != $r13-$r12-$r11\"	\n\
+	 .endif								\n\
+									\n\
+	 ;; Save the registers we'll use in the movem process		\n\
+	 ;; on the stack.						\n\
+	 subq	11*4,sp							\n\
+	 movem	r10,[sp]						\n\
+									\n\
+	 ;; Now we've got this:						\n\
+	 ;; r11 - src							\n\
+	 ;; r13 - dst							\n\
+	 ;; r12 - n							\n\
+									\n\
+	 ;; Update n for the first loop.				\n\
+	 subq	 44,r12							\n\
+0:									\n\
+"
+#ifdef __arch_common_v10_v32
+	 /* Cater to branch offset difference between v32 and v10.  We
+	    assume the branch below has an 8-bit offset.  */
+"	 setf\n"
+#endif
+"	 movem	[r11+],r10						\n\
+	 subq	44,r12							\n\
+	 bge	 0b							\n\
+	 movem	r10,[r13+]						\n\
+									\n\
+	 ;; Compensate for last loop underflowing n.			\n\
+	 addq	44,r12							\n\
+									\n\
+	 ;; Restore registers from stack.				\n\
+	 movem [sp+],r10"
+
+	 /* Outputs.  */
+	 : "=r" (dst), "=r" (src), "=r" (n)
+
+	 /* Inputs.  */
+	 : "0" (dst), "1" (src), "2" (n));
+    }
+
+  while (n >= 16)
+    {
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+
+      n -= 16;
+    }
+
+  switch (n)
+    {
+    case 0:
+      break;
+
+    case 1:
+      *dst = *src;
+      break;
+
+    case 2:
+      *(short *) dst = *(short *) src;
+      break;
+
+    case 3:
+      *(short *) dst = *(short *) src; dst += 2; src += 2;
+      *dst = *src;
+      break;
+
+    case 4:
+      *(long *) dst = *(long *) src;
+      break;
+
+    case 5:
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *dst = *src;
+      break;
+
+    case 6:
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(short *) dst = *(short *) src;
+      break;
+
+    case 7:
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(short *) dst = *(short *) src; dst += 2; src += 2;
+      *dst = *src;
+      break;
+
+    case 8:
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src;
+      break;
+
+    case 9:
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *dst = *src;
+      break;
+
+    case 10:
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(short *) dst = *(short *) src;
+      break;
+
+    case 11:
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(short *) dst = *(short *) src; dst += 2; src += 2;
+      *dst = *src;
+      break;
+
+    case 12:
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src;
+      break;
+
+    case 13:
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *dst = *src;
+      break;
+
+    case 14:
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(short *) dst = *(short *) src;
+      break;
+
+    case 15:
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(short *) dst = *(short *) src; dst += 2; src += 2;
+      *dst = *src;
+      break;
+    }
+
+  return return_dst;
+}
--- /dev/null	Tue Oct 29 15:57:07 2002
+++ libc/machine/cris/memset.c	Tue Jan 25 12:47:43 2005
@@ -0,0 +1,259 @@
+/* A memset for CRIS.
+   Copyright (C) 1999-2005 Axis Communications.
+   All rights reserved.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions
+   are met:
+
+   1. Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+   2. Neither the name of Axis Communications nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+   THIS SOFTWARE IS PROVIDED BY AXIS COMMUNICATIONS AND ITS CONTRIBUTORS
+   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL AXIS
+   COMMUNICATIONS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+   INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+   IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+   POSSIBILITY OF SUCH DAMAGE.  */
+
+/* FIXME: This file should really only be used for reference, as the
+   result is somewhat depending on gcc generating what we expect rather
+   than what we describe.  An assembly file should be used instead.  */
+
+/* Note the multiple occurrence of the expression "12*4", including the
+   asm.  It is hard to get it into the asm in a good way.  Thus better to
+   expose the problem everywhere: no macro.  */
+
+/* Assuming one cycle per dword written or read (ok, not really true; the
+   world is not ideal), and one cycle per instruction, then 43+3*(n/48-1)
+   <= 24+24*(n/48-1) so n >= 45.7; n >= 0.9; we win on the first full
+   48-byte block to set.  */
+
+#define MEMSET_BY_BLOCK_THRESHOLD (1 * 48)
+
+/* No name ambiguities in this file.  */
+__asm__ (".syntax no_register_prefix");
+
+void *memset(void *pdst, int c, unsigned int plen)
+{
+  /* Now we want the parameters in special registers.  Make sure the
+     compiler does something usable with this.  */
+
+  register char *return_dst __asm__ ("r10") = pdst;
+  register int n __asm__ ("r12") = plen;
+  register int lc __asm__ ("r11") = c;
+
+  /* Most apps use memset sanely.  Memsetting about 3..4 bytes or less get
+     penalized here compared to the generic implementation.  */
+
+  /* This is fragile performancewise at best.  Check with newer GCC
+     releases, if they compile cascaded "x |= x << 8" to sane code.  */
+  __asm__("movu.b %0,r13						\n\
+	   lslq 8,r13							\n\
+	   move.b %0,r13						\n\
+	   move.d r13,%0						\n\
+	   lslq 16,r13							\n\
+	   or.d r13,%0"
+          : "=r" (lc)		/* Inputs.  */
+	  : "0" (lc)		/* Outputs.  */
+	  : "r13");		/* Trash.  */
+
+  {
+    register char *dst __asm__ ("r13") = pdst;
+
+    if (((unsigned long) pdst & 3) != 0
+	/* Oops! n = 0 must be a valid call, regardless of alignment.  */
+	&& n >= 3)
+      {
+	if ((unsigned long) dst & 1)
+	  {
+	    *dst = (char) lc;
+	    n--;
+	    dst++;
+	  }
+
+	if ((unsigned long) dst & 2)
+	  {
+	    *(short *) dst = lc;
+	    n -= 2;
+	    dst += 2;
+	  }
+      }
+
+    /* Decide which setting method to use.  */
+    if (n >= MEMSET_BY_BLOCK_THRESHOLD)
+      {
+	/* It is not optimal to tell the compiler about clobbering any
+	   registers; that will move the saving/restoring of those registers
+	   to the function prologue/epilogue, and make non-block sizes
+	   suboptimal.  */
+	__asm__ volatile
+	  ("\
+	   ;; GCC does promise correct register allocations, but let's	\n\
+	   ;; make sure it keeps its promises.				\n\
+	   .ifnc %0-%1-%4,$r13-$r12-$r11				\n\
+	   .error \"GCC reg alloc bug: %0-%1-%4 != $r13-$r12-$r11\"	\n\
+	   .endif							\n\
+									\n\
+	   ;; Save the registers we'll clobber in the movem process	\n\
+	   ;; on the stack.  Don't mention them to gcc, it will only be	\n\
+	   ;; upset.							\n\
+	   subq	   11*4,sp						\n\
+	   movem   r10,[sp]						\n\
+									\n\
+	   move.d  r11,r0						\n\
+	   move.d  r11,r1						\n\
+	   move.d  r11,r2						\n\
+	   move.d  r11,r3						\n\
+	   move.d  r11,r4						\n\
+	   move.d  r11,r5						\n\
+	   move.d  r11,r6						\n\
+	   move.d  r11,r7						\n\
+	   move.d  r11,r8						\n\
+	   move.d  r11,r9						\n\
+	   move.d  r11,r10						\n\
+									\n\
+	   ;; Now we've got this:					\n\
+	   ;; r13 - dst							\n\
+	   ;; r12 - n							\n\
+									\n\
+	   ;; Update n for the first loop				\n\
+	   subq	   12*4,r12						\n\
+0:									\n\
+"
+#ifdef __arch_common_v10_v32
+	   /* Cater to branch offset difference between v32 and v10.  We
+	      assume the branch below has an 8-bit offset.  */
+"	   setf\n"
+#endif
+"	   subq	  12*4,r12						\n\
+	   bge	   0b							\n\
+	   movem	r11,[r13+]					\n\
+									\n\
+	   ;; Compensate for last loop underflowing n.			\n\
+	   addq	  12*4,r12						\n\
+									\n\
+	   ;; Restore registers from stack.				\n\
+	   movem [sp+],r10"
+
+	   /* Outputs.	*/
+	   : "=r" (dst), "=r" (n)
+
+	   /* Inputs.  */
+	   : "0" (dst), "1" (n), "r" (lc));
+      }
+
+    /* An ad-hoc unroll, used for 4*12-1..16 bytes. */
+    while (n >= 16)
+      {
+	*(long *) dst = lc; dst += 4;
+	*(long *) dst = lc; dst += 4;
+	*(long *) dst = lc; dst += 4;
+	*(long *) dst = lc; dst += 4;
+	n -= 16;
+      }
+
+    switch (n)
+      {
+      case 0:
+        break;
+
+      case 1:
+        *dst = (char) lc;
+        break;
+
+      case 2:
+        *(short *) dst = (short) lc;
+        break;
+
+      case 3:
+        *(short *) dst = (short) lc; dst += 2;
+        *dst = (char) lc;
+        break;
+
+      case 4:
+        *(long *) dst = lc;
+        break;
+
+      case 5:
+        *(long *) dst = lc; dst += 4;
+        *dst = (char) lc;
+        break;
+
+      case 6:
+        *(long *) dst = lc; dst += 4;
+        *(short *) dst = (short) lc;
+        break;
+
+      case 7:
+        *(long *) dst = lc; dst += 4;
+        *(short *) dst = (short) lc; dst += 2;
+        *dst = (char) lc;
+        break;
+
+      case 8:
+        *(long *) dst = lc; dst += 4;
+        *(long *) dst = lc;
+        break;
+
+      case 9:
+        *(long *) dst = lc; dst += 4;
+        *(long *) dst = lc; dst += 4;
+        *dst = (char) lc;
+        break;
+
+      case 10:
+        *(long *) dst = lc; dst += 4;
+        *(long *) dst = lc; dst += 4;
+        *(short *) dst = (short) lc;
+        break;
+
+      case 11:
+        *(long *) dst = lc; dst += 4;
+        *(long *) dst = lc; dst += 4;
+        *(short *) dst = (short) lc; dst += 2;
+        *(char*) dst = (char) lc;
+        break;
+
+      case 12:
+        *(long *) dst = lc; dst += 4;
+        *(long *) dst = lc; dst += 4;
+        *(long *) dst = lc;
+        break;
+
+      case 13:
+        *(long *) dst = lc; dst += 4;
+        *(long *) dst = lc; dst += 4;
+        *(long *) dst = lc; dst += 4;
+        *dst = (char) lc;
+        break;
+
+      case 14:
+        *(long *) dst = lc; dst += 4;
+        *(long *) dst = lc; dst += 4;
+        *(long *) dst = lc; dst += 4;
+        *(short *) dst = (short) lc;
+        break;
+
+      case 15:
+        *(long *) dst = lc; dst += 4;
+        *(long *) dst = lc; dst += 4;
+        *(long *) dst = lc; dst += 4;
+        *(short *) dst = (short) lc; dst += 2;
+        *dst = (char) lc;
+        break;
+      }
+  }
+
+  return return_dst;
+}
--- /dev/null	Tue Oct 29 15:57:07 2002
+++ libc/sys/cris/sys/signal.h	Mon Jan 24 01:44:18 2005
@@ -0,0 +1,89 @@
+/* This file is to be kept in sync (well, reasonably so, it's quite
+   different) with newlib/libc/include/sys/signal.h on which it is
+   based, except values used or returned by syscalls must be those of
+   the Linux/CRIS kernel.  */
+
+/* sys/signal.h */
+
+#ifndef _SYS_SIGNAL_H
+#define _SYS_SIGNAL_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "_ansi.h"
+
+typedef unsigned long sigset_t;
+
+/* Adjusted to linux, has unused sa_restorer field and unsigned long
+   sa_flags; relatively unimportant though.  */
+/* Type of a signal handler.  */
+typedef void (*__sighandler_t)(int);
+
+/* The type used in newlib sources.  */
+typedef __sighandler_t _sig_func_ptr;
+
+struct sigaction {
+	__sighandler_t sa_handler;
+	sigset_t sa_mask;
+	unsigned long sa_flags;
+	void (*sa_restorer)(void);
+};
+
+/* Adjusted to glibc; other values.  */
+#define SA_NOCLDSTOP 1	/* only value supported now for sa_flags */
+#define SIG_SETMASK 2	/* set mask with sigprocmask() */
+#define SIG_BLOCK 0	/* set of signals to block */
+#define SIG_UNBLOCK 1	/* set of signals to, well, unblock */
+
+/* These depend upon the type of sigset_t, which right now
+   is always a long.. They're in the POSIX namespace, but
+   are not ANSI. */
+#define sigaddset(what,sig) (*(what) |= (1<<(sig)))
+#define sigemptyset(what)   (*(what) = 0)
+
+int sigprocmask (int __how, const sigset_t *__a, sigset_t *__b);
+
+#define SIGHUP		 1
+#define SIGINT		 2
+#define SIGQUIT		 3
+#define SIGILL		 4
+#define SIGTRAP		 5
+#define SIGABRT		 6
+#define SIGIOT		 6
+#define SIGBUS		 7
+#define SIGFPE		 8
+#define SIGKILL		 9
+#define SIGUSR1		10
+#define SIGSEGV		11
+#define SIGUSR2		12
+#define SIGPIPE		13
+#define SIGALRM		14
+#define SIGTERM		15
+#define SIGSTKFLT	16
+#define SIGCHLD		17
+#define SIGCONT		18
+#define SIGSTOP		19
+#define SIGTSTP		20
+#define SIGTTIN		21
+#define SIGTTOU		22
+#define SIGURG		23
+#define SIGXCPU		24
+#define SIGXFSZ		25
+#define SIGVTALRM	26
+#define SIGPROF		27
+#define SIGWINCH	28
+#define SIGIO		29
+#define SIGPOLL		SIGIO
+#define SIGPWR		30
+#define	NSIG 31
+
+#ifdef __cplusplus
+}
+#endif
+#ifndef _SIGNAL_H_
+/* Some applications take advantage of the fact that <sys/signal.h>
+ * and <signal.h> are equivalent in glibc.  Allow for that here.  */
+#include <signal.h>
+#endif
+#endif /* _SYS_SIGNAL_H */
--- /dev/null	Tue Oct 29 15:57:07 2002
+++ libc/sys/cris/sys/fcntl.h	Mon Jan 24 01:41:29 2005
@@ -0,0 +1,163 @@
+/* This file is to be kept in sync with newlib/libc/include/sys/fcntl.h,
+   on which it is based, except values used or returned by syscalls must
+   be those of the Linux/CRIS kernel.  */
+
+#ifndef	_FCNTL_
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define	_FCNTL_
+#include <_ansi.h>
+#define	_FOPEN		(-1)	/* from sys/file.h, kernel use only */
+#define	_FREAD		0x0001	/* read enabled */
+#define	_FWRITE		0x0002	/* write enabled */
+#define	_FNDELAY	0x0800	/* non blocking I/O (4.2 style) */
+#define	_FAPPEND	0x0400	/* append (writes guaranteed at the end) */
+#define	_FMARK		0x0010	/* internal; mark during gc() */
+#define	_FDEFER		0x0020	/* internal; defer for next gc pass */
+#define	_FASYNC		0x2000	/* signal pgrp when data ready */
+#define	_FCREAT		0x0040	/* open with file create */
+#define	_FTRUNC		0x0200	/* open with truncation */
+#define	_FEXCL		0x0080	/* error on open if file exists */
+#define	_FNBIO	    _FNONBLOCK	/* non blocking I/O (sys5 style) */
+#define	_FSYNC		0x1000	/* do all writes synchronously */
+#define	_FNONBLOCK	0x0800	/* non blocking I/O (POSIX style) */
+#define	_FNOCTTY	0x0100	/* don't assign a ctty on this open */
+
+#define	O_ACCMODE	(O_RDONLY|O_WRONLY|O_RDWR)
+
+/*
+ * Flag values for open(2) and fcntl(2)
+ * The kernel adds 1 to the open modes to turn it into some
+ * combination of FREAD and FWRITE.
+ */
+#define	O_RDONLY	0		/* +1 == FREAD */
+#define	O_WRONLY	1		/* +1 == FWRITE */
+#define	O_RDWR		2		/* +1 == FREAD|FWRITE */
+#define	O_APPEND	_FAPPEND
+#define	O_CREAT		_FCREAT
+#define	O_TRUNC		_FTRUNC
+#define	O_EXCL		_FEXCL
+/*	O_SYNC		_FSYNC		not posix, defined below */
+/*	O_NDELAY	_FNDELAY 	set in include/fcntl.h */
+/*	O_NDELAY	_FNBIO 		set in 5include/fcntl.h */
+#define	O_NONBLOCK	_FNONBLOCK
+#define	O_NOCTTY	_FNOCTTY
+
+#ifndef	_POSIX_SOURCE
+
+#define	O_SYNC		_FSYNC
+
+/*
+ * Flags that work for fcntl(fd, F_SETFL, FXXXX)
+ */
+#define	FAPPEND		_FAPPEND
+#define	FSYNC		_FSYNC
+#define	FASYNC		_FASYNC
+#define	FNBIO		_FNBIO
+#define	FNONBIO		_FNONBLOCK	/* XXX fix to be NONBLOCK everywhere */
+#define	FNDELAY		_FNDELAY
+
+/*
+ * Flags that are disallowed for fcntl's (FCNTLCANT);
+ * used for opens, internal state, or locking.
+ */
+#define	FREAD		_FREAD
+#define	FWRITE		_FWRITE
+#define	FMARK		_FMARK
+#define	FDEFER		_FDEFER
+#define	FSHLOCK		_FSHLOCK
+#define	FEXLOCK		_FEXLOCK
+
+/*
+ * The rest of the flags, used only for opens
+ */
+#define	FOPEN		_FOPEN
+#define	FCREAT		_FCREAT
+#define	FTRUNC		_FTRUNC
+#define	FEXCL		_FEXCL
+#define	FNOCTTY		_FNOCTTY
+
+#endif	/* !_POSIX_SOURCE */
+
+/* XXX close on exec request; must match UF_EXCLOSE in user.h */
+#define	FD_CLOEXEC	1	/* posix */
+
+/* fcntl(2) requests */
+#define F_DUPFD		0	/* dup */
+#define F_GETFD		1	/* get f_flags */
+#define F_SETFD		2	/* set f_flags */
+#define F_GETFL		3	/* more flags (cloexec) */
+#define F_SETFL		4
+#define F_GETLK		5
+#define F_SETLK		6
+#define F_SETLKW	7
+
+#define F_SETOWN	8	/*  for sockets. */
+#define F_GETOWN	9	/*  for sockets. */
+
+/* for F_[GET|SET]FL */
+#define FD_CLOEXEC	1	/* actually anything with low bit set goes */
+
+/* for posix fcntl() and lockf() */
+#define F_RDLCK		0
+#define F_WRLCK		1
+#define F_UNLCK		2
+
+/* for old implementation of bsd flock () */
+#define F_EXLCK		4	/* or 3 */
+#define F_SHLCK		8	/* or 4 */
+
+/* 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 */
+
+/* file segment locking set data type - information passed to system by user */
+struct flock {
+	short	l_type;		/* F_RDLCK, F_WRLCK, or F_UNLCK */
+	short	l_whence;	/* flag to choose starting offset */
+	long	l_start;	/* relative offset, in bytes */
+	long	l_len;		/* length, in bytes; 0 means lock to EOF */
+	short	l_pid;		/* returned with F_GETLK */
+	short	l_xxx;		/* reserved for future use */
+};
+
+#ifndef	_POSIX_SOURCE
+/* extended file segment locking set data type */
+struct eflock {
+	short	l_type;		/* F_RDLCK, F_WRLCK, or F_UNLCK */
+	short	l_whence;	/* flag to choose starting offset */
+	long	l_start;	/* relative offset, in bytes */
+	long	l_len;		/* length, in bytes; 0 means lock to EOF */
+	short	l_pid;		/* returned with F_GETLK */
+	short	l_xxx;		/* reserved for future use */
+	long	l_rpid;		/* Remote process id wanting this lock */
+	long	l_rsys;		/* Remote system id wanting this lock */
+};
+#endif	/* !_POSIX_SOURCE */
+
+
+#include <sys/types.h>
+#include <sys/stat.h>		/* sigh. for the mode bits for open/creat */
+
+extern int open _PARAMS ((const char *, int, ...));
+extern int creat _PARAMS ((const char *, mode_t));
+extern int fcntl _PARAMS ((int, int, ...));
+
+/* Provide _<systemcall> prototypes for functions provided by some versions
+   of newlib.  */
+#ifdef _COMPILING_NEWLIB
+extern int _open _PARAMS ((const char *, int, ...));
+extern int _fcntl _PARAMS ((int, int, ...));
+#ifdef __LARGE64_FILES
+extern int _open64 _PARAMS ((const char *, int, ...));
+#endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif	/* !_FCNTL_ */
--- /dev/null	Tue Oct 29 15:57:07 2002
+++ libc/sys/cris/sys/errno.h	Mon Jan 24 01:40:17 2005
@@ -0,0 +1,166 @@
+/* This file is to be kept in sync with newlib/libc/include/sys/errno.h
+   on which it is based, except values used or returned by syscalls must
+   be those of the Linux/CRIS kernel.  */
+
+/* errno is not a global variable, because that would make using it
+   non-reentrant.  Instead, its address is returned by the function
+   __errno.  */
+
+#ifndef _SYS_ERRNO_H_
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define _SYS_ERRNO_H_
+
+#include <sys/reent.h>
+
+#ifndef _REENT_ONLY
+#define errno (*__errno())
+extern int *__errno _PARAMS ((void));
+#endif
+
+/* Please don't use these variables directly.
+   Use strerror instead. */
+extern _CONST char * _CONST _sys_errlist[];
+extern int _sys_nerr;
+
+#define __errno_r(ptr) ((ptr)->_errno)
+
+/* Adjusted to the linux asm/errno.h */
+#define	EPERM		 1	/* Operation not permitted */
+#define	ENOENT		 2	/* No such file or directory */
+#define	ESRCH		 3	/* No such process */
+#define	EINTR		 4	/* Interrupted system call */
+#define	EIO		 5	/* I/O error */
+#define	ENXIO		 6	/* No such device or address */
+#define	E2BIG		 7	/* Arg list too long */
+#define	ENOEXEC		 8	/* Exec format error */
+#define	EBADF		 9	/* Bad file number */
+#define	ECHILD		10	/* No child processes */
+#define	EAGAIN		11	/* Try again */
+#define	ENOMEM		12	/* Out of memory */
+#define	EACCES		13	/* Permission denied */
+#define	EFAULT		14	/* Bad address */
+#define	ENOTBLK		15	/* Block device required */
+#define	EBUSY		16	/* Device or resource busy */
+#define	EEXIST		17	/* File exists */
+#define	EXDEV		18	/* Cross-device link */
+#define	ENODEV		19	/* No such device */
+#define	ENOTDIR		20	/* Not a directory */
+#define	EISDIR		21	/* Is a directory */
+#define	EINVAL		22	/* Invalid argument */
+#define	ENFILE		23	/* File table overflow */
+#define	EMFILE		24	/* Too many open files */
+#define	ENOTTY		25	/* Not a typewriter */
+#define	ETXTBSY		26	/* Text file busy */
+#define	EFBIG		27	/* File too large */
+#define	ENOSPC		28	/* No space left on device */
+#define	ESPIPE		29	/* Illegal seek */
+#define	EROFS		30	/* Read-only file system */
+#define	EMLINK		31	/* Too many links */
+#define	EPIPE		32	/* Broken pipe */
+#define	EDOM		33	/* Math argument out of domain of func */
+#define	ERANGE		34	/* Math result not representable */
+#define	EDEADLK		35	/* Resource deadlock would occur */
+#define	ENAMETOOLONG	36	/* File name too long */
+#define	ENOLCK		37	/* No record locks available */
+#define	ENOSYS		38	/* Function not implemented */
+#define	ENOTEMPTY	39	/* Directory not empty */
+#define	ELOOP		40	/* Too many symbolic links encountered */
+#define	EWOULDBLOCK	EAGAIN	/* Operation would block */
+#define	ENOMSG		42	/* No message of desired type */
+#define	EIDRM		43	/* Identifier removed */
+#define	ECHRNG		44	/* Channel number out of range */
+#define	EL2NSYNC	45	/* Level 2 not synchronized */
+#define	EL3HLT		46	/* Level 3 halted */
+#define	EL3RST		47	/* Level 3 reset */
+#define	ELNRNG		48	/* Link number out of range */
+#define	EUNATCH		49	/* Protocol driver not attached */
+#define	ENOCSI		50	/* No CSI structure available */
+#define	EL2HLT		51	/* Level 2 halted */
+#define	EBADE		52	/* Invalid exchange */
+#define	EBADR		53	/* Invalid request descriptor */
+#define	EXFULL		54	/* Exchange full */
+#define	ENOANO		55	/* No anode */
+#define	EBADRQC		56	/* Invalid request code */
+#define	EBADSLT		57	/* Invalid slot */
+
+#define	EDEADLOCK	EDEADLK
+
+#define	EBFONT		59	/* Bad font file format */
+/* This is only used internally in newlib; not returned by the kernel.
+   EBFONT seems the closest match for a "bad file format" error.  */
+#define EFTYPE		EBFONT	/* Inappropriate file type or format */
+#define	ENOSTR		60	/* Device not a stream */
+#define	ENODATA		61	/* No data available */
+#define	ETIME		62	/* Timer expired */
+#define	ENOSR		63	/* Out of streams resources */
+#define	ENONET		64	/* Machine is not on the network */
+#define	ENOPKG		65	/* Package not installed */
+#define	EREMOTE		66	/* Object is remote */
+#define	ENOLINK		67	/* Link has been severed */
+#define	EADV		68	/* Advertise error */
+#define	ESRMNT		69	/* Srmount error */
+#define	ECOMM		70	/* Communication error on send */
+#define	EPROTO		71	/* Protocol error */
+#define	EMULTIHOP	72	/* Multihop attempted */
+#define	EDOTDOT		73	/* RFS specific error */
+#define	EBADMSG		74	/* Not a data message */
+#define	EOVERFLOW	75	/* Value too large for defined data type */
+#define	ENOTUNIQ	76	/* Name not unique on network */
+#define	EBADFD		77	/* File descriptor in bad state */
+#define	EREMCHG		78	/* Remote address changed */
+#define	ELIBACC		79	/* Can not access a needed shared library */
+#define	ELIBBAD		80	/* Accessing a corrupted shared library */
+#define	ELIBSCN		81	/* .lib section in a.out corrupted */
+#define	ELIBMAX		82	/* Attempting to link in too many shared libraries */
+#define	ELIBEXEC	83	/* Cannot exec a shared library directly */
+#define	EILSEQ		84	/* Illegal byte sequence */
+#define	ERESTART	85	/* Interrupted system call should be restarted */
+#define	ESTRPIPE	86	/* Streams pipe error */
+#define	EUSERS		87	/* Too many users */
+#define	ENOTSOCK	88	/* Socket operation on non-socket */
+#define	EDESTADDRREQ	89	/* Destination address required */
+#define	EMSGSIZE	90	/* Message too long */
+#define	EPROTOTYPE	91	/* Protocol wrong type for socket */
+#define	ENOPROTOOPT	92	/* Protocol not available */
+#define	EPROTONOSUPPORT	93	/* Protocol not supported */
+#define	ESOCKTNOSUPPORT	94	/* Socket type not supported */
+#define	EOPNOTSUPP	95	/* Operation not supported on transport endpoint */
+#define	EPFNOSUPPORT	96	/* Protocol family not supported */
+#define	EAFNOSUPPORT	97	/* Address family not supported by protocol */
+#define	EADDRINUSE	98	/* Address already in use */
+#define	EADDRNOTAVAIL	99	/* Cannot assign requested address */
+#define	ENETDOWN	100	/* Network is down */
+#define	ENETUNREACH	101	/* Network is unreachable */
+#define	ENETRESET	102	/* Network dropped connection because of reset */
+#define	ECONNABORTED	103	/* Software caused connection abort */
+#define	ECONNRESET	104	/* Connection reset by peer */
+#define	ENOBUFS		105	/* No buffer space available */
+#define	EISCONN		106	/* Transport endpoint is already connected */
+#define	ENOTCONN	107	/* Transport endpoint is not connected */
+#define	ESHUTDOWN	108	/* Cannot send after transport endpoint shutdown */
+#define	ETOOMANYREFS	109	/* Too many references: cannot splice */
+#define	ETIMEDOUT	110	/* Connection timed out */
+#define	ECONNREFUSED	111	/* Connection refused */
+#define	EHOSTDOWN	112	/* Host is down */
+#define	EHOSTUNREACH	113	/* No route to host */
+#define	EALREADY	114	/* Operation already in progress */
+#define	EINPROGRESS	115	/* Operation now in progress */
+#define	ESTALE		116	/* Stale NFS file handle */
+#define	EUCLEAN		117	/* Structure needs cleaning */
+#define	ENOTNAM		118	/* Not a XENIX named type file */
+#define	ENAVAIL		119	/* No XENIX semaphores available */
+#define	EISNAM		120	/* Is a named type file */
+#define	EREMOTEIO	121	/* Remote I/O error */
+#define	EDQUOT		122	/* Quota exceeded */
+
+#define	ENOMEDIUM	123	/* No medium found */
+#define	EMEDIUMTYPE	124	/* Wrong medium type */
+
+#define __ELASTERROR 2000	/* Users can add values starting here */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* _SYS_ERRNO_H */
--- /dev/null	Tue Oct 29 15:57:07 2002
+++ libc/sys/cris/configure.in	Tue May  2 18:10:00 2000
@@ -0,0 +1,12 @@
+dnl This is the newlib/libc/sys/cris configure.in file.
+dnl Process this file with autoconf to produce a configure script.
+
+AC_PREREQ(2.5)
+AC_INIT(crt0.c)
+
+dnl Can't be done in NEWLIB_CONFIGURE because that confuses automake. 
+AC_CONFIG_AUX_DIR(../../../..)
+
+NEWLIB_CONFIGURE(../../..)
+
+AC_OUTPUT(Makefile)
--- /dev/null	Tue Oct 29 15:57:07 2002
+++ libc/sys/cris/crt0.c	Mon Jan 10 17:25:05 2005
@@ -0,0 +1,7 @@
+/* A dummy.
+   This should not be installed, but it is needed by higher levels as a
+   generic target built by this directory; a design flaw, as the real
+   crt0 is the responsibility of libgloss.
+   What we really want, are the include files.  */
+
+const int _Crt0_dummy = 0;
--- /dev/null	Tue Oct 29 15:57:07 2002
+++ libc/sys/cris/Makefile.am	Tue May  2 18:10:00 2000
@@ -0,0 +1,19 @@
+## Process this file with automake to generate Makefile.in
+
+AUTOMAKE_OPTIONS = cygnus
+
+INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS)
+
+noinst_LIBRARIES = lib.a
+
+lib_a_SOURCES = 
+
+# This is a hack to force automake to include a definition for
+# COMPILE.
+EXTRA_LIBRARIES = libfoo.a
+libfoo_a_SOURCES = crt0.c
+
+all: crt0.o
+
+ACLOCAL_AMFLAGS = -I ../../..
+CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host
--- /dev/null	Tue Oct 29 15:57:07 2002
+++ libc/sys/cris/include/pthread.h	Tue Jan 25 12:48:31 2005
@@ -0,0 +1,93 @@
+/* pthread.h dummy.
+   Copyright (C) 2001, 2004, 2005 Axis Communications AB.
+   All rights reserved.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions
+   are met:
+
+   1. Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+   2. Neither the name of Axis Communications nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+   THIS SOFTWARE IS PROVIDED BY AXIS COMMUNICATIONS AND ITS CONTRIBUTORS
+   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL AXIS
+   COMMUNICATIONS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+   INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+   IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+   POSSIBILITY OF SUCH DAMAGE.  */
+
+/* Simple fallback-include to enable thread-enabled exception support
+   for libgcc, but with posix-interface to a default-dummy, so a posix
+   library can optionally be linked in, which isn't possible if
+   gthr-single.h is used.  No other use is supported; *DO NOT* think
+   this gives you a valid pthread interface to use in your applications.  */
+
+#ifndef _PTHREAD_FAKE
+#define _PTHREAD_FAKE
+
+#ifdef __cplusplus
+extern "C" {
+# ifndef __THROW
+#  define __THROW throw ()
+# endif
+#else
+# ifndef __THROW
+#  define __THROW
+# endif
+#endif
+
+typedef int pthread_once_t;
+typedef unsigned int pthread_key_t;
+
+/* This must be layout-compatible with the linuxthreads type.  */
+typedef struct
+{
+  int a, b;
+  void *c;
+  int d;
+  struct { long int e; int f; } g;
+} pthread_mutex_t;
+
+/* This give bits equal to the linuxthreads initializer.  */
+#define PTHREAD_MUTEX_INITIALIZER \
+  {0, 0, 0, 0, {0, 0}}
+
+#define PTHREAD_ONCE_INIT 0
+
+/* This isn't the right prototype, but it let's us get away with not
+   defining a lot of datatypes.  */
+extern int pthread_create (void) __THROW;
+
+extern int pthread_once (pthread_once_t *, void (*) (void)) __THROW;
+
+extern int pthread_key_create (pthread_key_t *, void (*) (void *)) __THROW;
+
+extern int pthread_setspecific (pthread_key_t, const void *) __THROW;
+
+extern void *pthread_getspecific (pthread_key_t) __THROW;
+
+extern int pthread_mutex_lock (pthread_mutex_t *) __THROW;
+
+extern int pthread_key_delete (pthread_key_t) __THROW;
+
+extern int pthread_mutex_trylock (pthread_mutex_t *) __THROW;
+
+extern int pthread_mutex_unlock (pthread_mutex_t *) __THROW;
+
+#ifdef __cplusplus
+}
+#endif
+
+#undef __THROW
+
+#endif /* not _PTHREAD_FAKE */

brgds, H-P


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