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]

Re: Patch: Extended libgloss support for ARM, replacing libc/sys/arm


Jeff Johnston wrote:
Toralf Lund wrote:

Hello again,

I just tried to submit a patch via the mailing list. Unfortunately, the message got so large that the list software wouldn't accept it, so I've now uploaded the file to our FTP server instead. See:

ftp://ftp.procaptura.com/pub/newlib-libglossARM.patch


Original text:


Hi.

Here is (the first version of) a patch that will make some changes to
the ARM setup that were discussed on this list some time back. It will:

   1. Remove newlib/libc/sys/arm
   2. Add support files for RDI, RDP and "bare"/"nomon" system to
      libgloss/arm, based on the above.
   3. Set up libgloss/arm to build separate start files for nomon, RDI
      and RDP, and "BSP" libs for the latter two.
   4. Extend nomon crt0 so that it will set up stack for all execution
      modes, based on address value that may be specified externally,
      and call "init hooks" when present.

Comments are welcome. Note that as I haven't been able to test the RDI
and RDP code a lot, since I don't have boards with those debug monitors.

- Toralf


Toralf,


I noticed when I applied the patch that you left a few references to sys_dir=arm for the ep9312 and a few others. I have changed these and also changed libgloss to recognize the ep9312. I am currently building with the patch applied.

-- Jeff J.


After some discussion with an ARM maintainer, I have decided to alter the patch further to avoid extensive breakage of existing build processes. Instead of deleting libc/sys/arm I have decided to leave it up to the existing --disable-newlib-supplied-syscalls option to remove it. This will mean that the default will still be the current behavior. There will be a new machine/arm directory and there will be the new libgloss files being built. If the --disable-newlib-supplied-syscalls configure option is used, the sys/arm directory will not be built.


Torald, could you try out the attached patches to ensure your tests continue to work as expected (with the --disable-newlib-suppplied-syscalls option specified of course).

-- Jeff J.




Index: libgloss/ChangeLog
===================================================================
RCS file: /cvs/src/src/libgloss/ChangeLog,v
retrieving revision 1.86
diff -u -p -r1.86 ChangeLog
--- libgloss/ChangeLog	3 Jun 2004 22:23:10 -0000	1.86
+++ libgloss/ChangeLog	7 Jun 2004 18:47:17 -0000
@@ -1,3 +1,17 @@
+2004-06-07  Toralf Lund  <toralf@procaptura.com>
+
+	* arm/crt0.S: Copied from newlib and it now also sets up stacks for 
+	FIQ and IRQ mode, plus calls hardware_init_hook() and 
+	software_init_hook() if present.
+	* arm/libcfunc.c, arm/swi.h, arm/syscalls.c: Copied
+	from newlib.
+	* arm/Makefile.in: Build crt0.o, rdpmon-crt0.o, rdimon-crt0.o,
+	librdpmon.a, librdimon.a - support file for "bare" setup, as well
+	as "RDP" and "RDI" monitors.
+	* arm/coff-rdpmon.specs, arm/elf-rdpmon.specs,
+	arm/coff-rdimon.specs, arm/elf-rdimon.specs: gcc specs files to go
+	with above mentioned support libs and startfiles.
+
 2004-06-03  Alexandre Oliva  <aoliva@redhat.com>
 
         * mn10300/sim.ld: Start at address 4, to avoid ambiguity with NULL
Index: libgloss/configure
===================================================================
RCS file: /cvs/src/src/libgloss/configure,v
retrieving revision 1.7
diff -u -p -r1.7 configure
--- libgloss/configure	25 Oct 2002 18:35:21 -0000	1.7
+++ libgloss/configure	7 Jun 2004 18:47:17 -0000
@@ -795,6 +795,9 @@ case "${target}" in
   arm*-*-elf | arm*-*-coff)
 	configdirs="${configdirs} arm testsuite";
 	;;
+  ep9312-*-elf | ep9312-*-coff)
+	configdirs="${configdirs} arm testsuite";
+	;;
   xscale-*-elf | xscale-*-coff)
 	configdirs="${configdirs} arm testsuite";
 	;;
@@ -818,7 +821,7 @@ subdirs="$configdirs"
 # 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:822: checking for $ac_word" >&5
+echo "configure:825: 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
@@ -848,7 +851,7 @@ if test -z "$CC"; then
   # 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:852: checking for $ac_word" >&5
+echo "configure:855: 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
@@ -897,7 +900,7 @@ fi
 fi
 
 echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:901: checking whether we are using GNU C" >&5
+echo "configure:904: 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
@@ -906,7 +909,7 @@ else
   yes;
 #endif
 EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:910: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:913: \"$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
@@ -921,7 +924,7 @@ if test $ac_cv_prog_gcc = yes; then
   ac_save_CFLAGS="$CFLAGS"
   CFLAGS=
   echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:925: checking whether ${CC-cc} accepts -g" >&5
+echo "configure:928: 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
@@ -953,7 +956,7 @@ AS=${AS-as}
 # 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:957: checking for $ac_word" >&5
+echo "configure:960: 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
@@ -987,7 +990,7 @@ LD=${LD-ld}
 # 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:991: checking for $ac_word" >&5
+echo "configure:994: 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
Index: libgloss/configure.in
===================================================================
RCS file: /cvs/src/src/libgloss/configure.in,v
retrieving revision 1.7
diff -u -p -r1.7 configure.in
--- libgloss/configure.in	25 Oct 2002 18:35:21 -0000	1.7
+++ libgloss/configure.in	7 Jun 2004 18:47:17 -0000
@@ -106,6 +106,9 @@ case "${target}" in
   arm*-*-elf | arm*-*-coff)
 	configdirs="${configdirs} arm testsuite";
 	;;
+  ep9312-*-elf | ep9312-*-coff)
+	configdirs="${configdirs} arm testsuite";
+	;;
   xscale-*-elf | xscale-*-coff)
 	configdirs="${configdirs} arm testsuite";
 	;;
Index: libgloss/arm/Makefile.in
===================================================================
RCS file: /cvs/src/src/libgloss/arm/Makefile.in,v
retrieving revision 1.2
diff -u -p -r1.2 Makefile.in
--- libgloss/arm/Makefile.in	7 Nov 2002 00:25:57 -0000	1.2
+++ libgloss/arm/Makefile.in	7 Jun 2004 18:47:17 -0000
@@ -47,9 +47,26 @@ OBJCOPY = `if [ -f ${objroot}/../binutil
 	then echo ${objroot}/../binutils/objcopy ; \
 	else t='$(program_transform_name)'; echo objcopy | sed -e $$t ; fi`
 
-REDBOOT_OBJS	= redboot-crt0.o  redboot-syscalls.o
+CRT0		= crt0.o
+CRT0_INSTALL	= install-crt0
+
+REDBOOT_CRT0	= redboot-crt0.o 
+REDBOOT_OBJS	= redboot-syscalls.o
 REDBOOT_SCRIPTS	= redboot.ld redboot.specs
 REDBOOT_INSTALL	= install-redboot
+
+RDPMON_CRT0	= rdpmon-crt0.o
+RDPMON_BSP	= librdpmon.a
+RDPMON_OBJS	= syscalls.o libcfunc.o trap.o
+RDPMON_SCRIPTS	= rdpmon.specs
+RDPMON_INSTALL	= install-rdpmon
+
+RDIMON_CRT0	= rdimon-crt0.o
+RDIMON_BSP	= librdimon.a
+RDIMON_OBJS	= rdimon-syscalls.o rdimon-libcfunc.o rdimon-trap.o
+RDIMON_SCRIPTS	= rdimon.specs
+RDIMON_INSTALL	= install-rdimon
+
 CFLAGS		= -g
 
 # Here is all of the eval board stuff
@@ -67,7 +84,7 @@ IQ80310_INSTALL	= install-iq80310
 # build a test program for each target board. Just trying to get
 # it to link is a good test, so we ignore all the errors for now.
 #
-all: ${REDBOOT_OBJS}
+all: ${CRT0} ${REDBOOT_CRT0} ${REDBOOT_OBJS} ${RDPMON_CRT0} ${RDPMON_BSP} ${RDIMON_CRT0} ${RDIMON_BSP}
 
 #
 # here's where we build the test programs for each target
@@ -76,9 +93,33 @@ all: ${REDBOOT_OBJS}
 test:
 
 #
+crt0.o: crt0.S
 redboot-crt0.o: redboot-crt0.S
 redboot-syscalls.o: redboot-syscalls.c $(srcdir)/../syscall.h
 
+rdpmon-crt0.o: crt0.S
+	$(CC) $(CFLAGS_FOR_TARGET) $(INCLUDES) -DARM_RDP_MONITOR -o $@ -c $<
+
+rdimon-crt0.o: crt0.S
+	$(CC) $(CFLAGS_FOR_TARGET) $(INCLUDES) -DARM_RDI_MONITOR -o $@ -c $<
+
+rdimon-trap.o: trap.S
+	$(CC) $(CFLAGS_FOR_TARGET) $(INCLUDES) -DARM_RDI_MONITOR -o $@ -c $<
+
+rdimon-syscalls.o: syscalls.c
+	$(CC) $(CFLAGS_FOR_TARGET) $(INCLUDES) -DARM_RDI_MONITOR -o $@ -c $<
+
+rdimon-libcfunc.o: libcfunc.c
+	$(CC) $(CFLAGS_FOR_TARGET) $(INCLUDES) -DARM_RDI_MONITOR -o $@ -c $<
+
+$(RDPMON_BSP): $(RDPMON_OBJS)
+	${AR} ${ARFLAGS} $@ $(IDTOBJS)
+	${RANLIB} $@
+
+$(RDIMON_BSP): $(RDIMON_OBJS)
+	${AR} ${ARFLAGS} $@ $(IDTOBJS)
+	${RANLIB} $@
+
 clean mostlyclean:
 	rm -f a.out core *.i *.o *-test *.srec *.dis *.x $(SIM_BSP) $(IQ80310_BSP)
 
@@ -86,13 +127,24 @@ distclean maintainer-clean realclean: cl
 	rm -f Makefile config.status *~
 
 .PHONY: install info install-info clean-info
-install: ${REDBOOT_INSTALL} ${IQ80310_INSTALL}  ${PID_INSTALL}
+install: ${CRT0_INSTALL} ${REDBOOT_INSTALL} ${RDPMON_INSTALL} ${RDIMON_INSTALL} ${IQ80310_INSTALL}  ${PID_INSTALL}
 
+install-crt0:
+	${INSTALL_DATA} ${CRT0} ${tooldir}/lib${MULTISUBDIR}/$$x
 
 install-redboot:
-	set -e; for x in ${REDBOOT_OBJS}; do ${INSTALL_DATA} $$x ${tooldir}/lib${MULTISUBDIR}/$$x; done
+	set -e; for x in ${REDBOOT_CRT0} ${REDBOOT_OBJS}; do ${INSTALL_DATA} $$x ${tooldir}/lib${MULTISUBDIR}/$$x; done
 	set -e; for x in ${REDBOOT_SCRIPTS}; do ${INSTALL_DATA} ${srcdir}/${objtype}$$x ${tooldir}/lib${MULTISUBDIR}/$$x; done
 
+install-rdpmon:
+	set -e; for x in ${RDPMON_CRT0} ${RDPMON_BSP}; do ${INSTALL_DATA} $$x ${tooldir}/lib${MULTISUBDIR}/$$x; done
+	set -e; for x in ${RDPMON_SCRIPTS}; do ${INSTALL_DATA} ${srcdir}/${objtype}$$x ${tooldir}/lib${MULTISUBDIR}/$$x; done
+
+install-rdimon:
+	set -e; for x in ${RDIMON_CRT0} ${RDIMON_BSP}; do ${INSTALL_DATA} $$x ${tooldir}/lib${MULTISUBDIR}/$$x; done
+	set -e; for x in ${RDIMON_SCRIPTS}; do ${INSTALL_DATA} ${srcdir}/${objtype}$$x ${tooldir}/lib${MULTISUBDIR}/$$x; done
+
+
 install-pid:
 	set -e; for x in ${PID_SCRIPTS}; do ${INSTALL_DATA} ${srcdir}/${objtype}$$x ${tooldir}/lib${MULTISUBDIR}/$$x; done
 
Index: libgloss/arm/coff-rdimon.specs
===================================================================
RCS file: libgloss/arm/coff-rdimon.specs
diff -N libgloss/arm/coff-rdimon.specs
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ libgloss/arm/coff-rdimon.specs	7 Jun 2004 18:47:17 -0000
@@ -0,0 +1,8 @@
+%rename link                old_link
+
+*link:
+%(old_link) -lrdimon
+
+*startfile:
+rdimon-crt0%O%s
+
Index: libgloss/arm/coff-rdpmon.specs
===================================================================
RCS file: libgloss/arm/coff-rdpmon.specs
diff -N libgloss/arm/coff-rdpmon.specs
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ libgloss/arm/coff-rdpmon.specs	7 Jun 2004 18:47:17 -0000
@@ -0,0 +1,8 @@
+%rename link                old_link
+
+*link:
+%(old_link) -lrdpmon
+
+*startfile:
+rdpmon-crt0%O%s
+
Index: libgloss/arm/crt0.S
===================================================================
RCS file: libgloss/arm/crt0.S
diff -N libgloss/arm/crt0.S
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ libgloss/arm/crt0.S	7 Jun 2004 18:47:17 -0000
@@ -0,0 +1,359 @@
+#include "swi.h"
+
+/* ANSI concatenation macros.  */
+#define CONCAT(a, b) CONCAT2(a, b)
+#define CONCAT2(a, b) a ## b
+
+#ifdef __USER_LABEL_PREFIX__
+#define FUNCTION( name ) CONCAT (__USER_LABEL_PREFIX__, name)
+#else
+#error __USER_LABEL_PREFIX is not defined
+#endif
+
+/* .text is used instead of .section .text so it works with arm-aout too.  */
+	.text
+	.code 32
+	.align 	0
+
+	.global	_mainCRTStartup
+	.global	_start
+	.global	start
+start:
+_start:
+_mainCRTStartup:
+
+/* Start by setting up a stack */
+#ifdef ARM_RDP_MONITOR
+	/*  Issue Demon SWI to read stack info */
+	swi	SWI_GetEnv	/*  Returns command line in r0 */
+	mov	sp,r1		/*  and the highest memory address in r1 */
+	ldr	sl, .LC2	/*  stack limit is at end of data */
+	add	sl, sl, #256	/*  allow slop for stack overflow handling */
+				/*  and small frames */
+#else
+#ifdef ARM_RDI_MONITOR
+	/*  Issue Angel SWI to read stack info */
+	mov	r0, #AngelSWI_Reason_HeapInfo
+	adr	r1, .LC0	/*  point at ptr to 4 words to receive data */
+	swi	AngelSWI_ARM	/*  We are always in ARM mode for startup */
+	ldr	r0, .LC0	/*  point at values read */
+	ldr	sp, [r0, #8]
+	ldr	sl, [r0, #12]
+	add	sl, sl, #256	/*  allow slop for stack overflow handling */
+				/*  and small frames */
+#else
+	/*  Set up the stack pointer to a fixed value */
+	/*  Changes by toralf:
+	    - Allow linker script to provide stack via __stack symbol - see
+	      defintion of .Lstack
+	    - Provide "hooks" that may be used by the application to add
+	      custom init code - see .Lhwinit and .Lswinit	
+	    - Go through all execution modes and set up stack for each of them.
+	      Loosely based on init.s from ARM/Motorola example code.
+              Note: Mode switch via CPSR is not allowed once in non-privileged
+		    mode, so we take care not to enter "User" to set up its sp,
+		    and also skip most operations if already in that mode. */
+
+	ldr	r3, .Lstack
+	cmp	r3, #0
+	ldreq	r3, .LC0
+	/* Note: This 'mov' is essential when starting in User, and ensures we
+		 always get *some* sp value for the initial mode, even if we 
+		 have somehow missed it below (in which case it gets the same
+		 value as FIQ - not ideal, but better than nothing.) */
+	mov	sp, r3
+	mrs	r2, CPSR
+	tst	r2, #0x0F	/* Test mode bits - in User of all are 0 */
+	beq	.LC23		/* "eq" means r2 AND #0x0F is 0 */
+	msr     CPSR_c, #0xD1	/* FIRQ mode, interrupts disabled */
+	mov 	sp, r3
+	sub	sl, sp, #0x1000	/* This mode also has its own sl (see below) */
+	
+	mov	r3, sl	
+	msr     CPSR_c, #0xD7	/* Abort mode, interrupts disabled */
+	mov	sp, r3
+	sub	r3, r3, #0x1000
+
+	msr     CPSR_c, #0xDB	/* Undefined mode, interrupts disabled */
+	mov	sp, r3
+	sub	r3, r3, #0x1000
+
+	msr     CPSR_c, #0xD2	/* IRQ mode, interrupts disabled */
+	mov	sp, r3
+	sub	r3, r3, #0x2000
+		
+	msr     CPSR_c, #0xD3	/* Supervisory mode, interrupts disabled */
+	mov	sp, r3
+	sub	r3, r3, #0x8000	/* Min size 32k */
+	bic	r3, r3, #0x00FF	/* Align with current 64k block */
+	bic	r3, r3, #0xFF00
+
+	str	r3, [r3, #-4]	/* Move value into user mode sp without */ 
+	ldmdb	r3, {sp}^       /* changing modes, via '^' form of ldm */ 
+	
+	orr	r2, r2, #0xC0	/* Back to original mode, presumably SVC, */
+	msr	CPSR_c, r2	/* with FIQ/IRQ disable bits forced to 1 */
+.LC23:
+	/* Setup a default stack-limit in-case the code has been
+	   compiled with "-mapcs-stack-check".  Hard-wiring this value
+	   is not ideal, since there is currently no support for
+	   checking that the heap and stack have not collided, or that
+	   this default 64k is enough for the program being executed.
+	   However, it ensures that this simple crt0 world will not
+	   immediately cause an overflow event:  */
+	sub	sl, r3, #64 << 10	/* Still assumes 256bytes below sl */
+#endif
+#endif
+	/* Zero the memory in the .bss section.  */
+	mov 	a2, #0			/* Second arg: fill value */
+	mov	fp, a2			/* Null frame pointer */
+	mov	r7, a2			/* Null frame pointer for Thumb */
+	
+	ldr	a1, .LC1		/* First arg: start of memory block */
+	ldr	a3, .LC2	
+	sub	a3, a3, a1		/* Third arg: length of block */
+	
+
+#ifdef __thumb__		/* Enter Thumb mode.... */
+
+	add	a4, pc, #1	/* Get the address of the Thumb block */
+	bx	a4		/* Go there and start Thumb decoding  */
+
+	.code 16
+	.global __change_mode
+	.thumb_func
+__change_mode:	
+#endif
+	
+	bl	FUNCTION (memset)
+#if !defined (ARM_RDP_MONITOR) && !defined (ARM_RDI_MONITOR)
+/* Changes by toralf: Taken from libgloss/m68k/crt0.S
+ * initialize target specific stuff. Only execute these
+ * functions it they exist.
+ */
+	ldr	r3, .Lhwinit
+	cmp	r3, #0
+	beq	.LC24
+	mov	lr, pc
+	mov	pc, r3
+.LC24:	
+	ldr	r3, .Lswinit
+	cmp	r3, #0
+	beq	.LC25
+	mov	lr, pc
+	mov	pc, r3
+.LC25:	
+	mov	r0, #0		/*  no arguments  */
+	mov	r1, #0		/*  no argv either */
+#else
+	/* Need to set up standard file handles */
+	bl	FUNCTION (initialise_monitor_handles)
+	
+#ifdef ARM_RDP_MONITOR
+	swi	SWI_GetEnv	/*  sets r0 to point to the command line */
+	mov	r1, r0
+#else
+	mov	r0, #AngelSWI_Reason_GetCmdLine
+	adr	r1, .LC30	/*  Space for command line */
+	swi	AngelSWI
+	ldr	r1, .LC30
+#endif
+	/*  Parse string at r1 */
+	mov	r0, #0		/*  count of arguments so far */
+	/* Push a NULL argument onto the end of the list.  */
+#ifdef __thumb__
+	push	{r0}
+#else
+	stmfd	sp!, {r0}
+#endif
+.LC10:
+/*  Skip leading blanks */
+#ifdef __thumb__
+	ldrb	r3, [r1]
+	add	r1, #1
+#else
+	ldrb	r3, [r1], #1
+#endif
+	cmp	r3, #0
+	beq	.LC12
+	cmp	r3, #' '
+	beq	.LC10
+
+/*  See whether we are scanning a string */
+	cmp	r3, #'"'
+#ifdef __thumb__
+	beq	.LC20
+	cmp	r3, #'\''
+	bne	.LC21
+.LC20:
+	mov	r2, r3
+	b	.LC22
+
+.LC21:
+	mov	r2, #' '	/*  terminator type */
+	sub	r1, r1, #1	/*  adjust back to point at start char */
+.LC22:
+#else
+	cmpne	r3, #'\''
+	moveq	r2, r3
+	movne	r2, #' '	/*  terminator type */
+	subne	r1, r1, #1	/*  adjust back to point at start char */
+#endif
+
+/*  Stack a pointer to the current argument */
+#ifdef __thumb__
+	push	{r1}
+#else
+	stmfd	sp!, {r1}
+#endif
+	add	r0, r0, #1
+.LC11:
+#ifdef __thumb__
+	ldrb	r3, [r1]
+	add	r1, #1
+#else
+	ldrb	r3, [r1], #1
+#endif
+	cmp	r3, #0
+	beq	.LC12
+	cmp	r2, r3		/*  reached terminator? */
+	bne	.LC11
+	mov	r2, #0
+	sub	r3, r1, #1
+	strb	r2, [r3]	/*  terminate the arg string */
+	b	.LC10
+
+.LC12:
+	mov	r1, sp		/*  point at stacked arg pointers */
+	/* We've now got the stacked args in order reverse the */
+#ifdef __thumb__
+	mov	r2, r0
+	lsl	r2, #2
+	add	r2, sp
+	mov	r3, sp
+.LC15:	cmp	r2, r3
+	bls	.LC14
+	sub	r2, #4
+	ldr	r4, [r2]
+	ldr	r5, [r3]
+	str	r5, [r2]
+	str	r4, [r3]
+	add	r3, #4
+	b	.LC15
+.LC14:	
+#else
+	add	r2, sp, r0, LSL #2	/* End of args */
+	mov	r3, sp			/* Start of args */
+.LC13:	cmp	r2, r3
+	ldrhi	r4,[r2, #-4]		/* Reverse ends of list */
+	ldrhi	r5, [r3]
+	strhi	r5, [r2, #-4]!
+	strhi	r4, [r3], #4
+	bhi	.LC13
+#endif
+#endif
+
+#ifdef __USES_INITFINI__
+	/* Some arm/elf targets use the .init and .fini sections
+	   to create constructors and destructors, and for these
+	   targets we need to call the _init function and arrange
+	   for _fini to be called at program exit.  */
+	mov	r4, r0
+	mov	r5, r1
+	ldr	r0, .Lfini
+	bl	FUNCTION (atexit)
+	bl	FUNCTION (_init)
+	mov	r0, r4
+	mov	r1, r5
+#endif	
+	bl	FUNCTION (main)
+
+	bl	FUNCTION (exit)		/* Should not return.  */
+
+#ifdef __thumb__
+	/* Come out of Thumb mode.  This code should be redundant.  */
+
+	mov	a4, pc
+	bx	a4
+
+	.code 32
+	.global change_back
+change_back:
+	/* Halt the execution.  This code should never be executed.  */
+	/* With no debug monitor, this probably aborts (eventually).
+	   With a Demon debug monitor, this halts cleanly.
+	   With an Angel debug monitor, this will report 'Unknown SWI'.	 */
+	swi	SWI_Exit
+#endif
+	
+	/* For Thumb, constants must be after the code since only 
+	   positive offsets are supported for PC relative addresses.  */
+	
+	.align 0
+.LC0:
+#ifdef ARM_RDI_MONITOR
+	.word	HeapBase
+#else
+#ifndef ARM_RDP_MONITOR
+	/* Changes by toralf: Provide alternative "stack" variable whose value
+	   may be defined externally; .Lstack will be used instead of .LC0 if
+	   it points to a non-0 value. Also set up references to "hooks" that
+           may be used by the application to provide additional init code. */
+	
+#ifdef __pe__
+	.word	0x800000
+#else
+	.word	0x80000			/* Top of RAM on the PIE board.  */
+#endif
+.Lstack:	
+	.word	__stack
+.Lhwinit:	
+	.word	FUNCTION (hardware_init_hook)
+.Lswinit:
+	.word	FUNCTION (software_init_hook)
+
+	/* Set up defaults for the above variables in the form of weak symbols
+	   - so that application will link correctly, and get value 0 in
+	   runtime (meaning "ignore setting") for the variables, when the user
+	   does not provide the symbols. (The linker uses a weak symbol if,
+	   and only if, a normal version of the same symbol isn't provided
+	   e.g. by a linker script or another object file.) */	
+
+	.set __stack, 0
+	.set FUNCTION (hardware_init_hook), 0
+	.set FUNCTION (software_init_hook), 0
+	
+	.weak __stack
+	.weak FUNCTION (hardware_init_hook) 
+	.weak FUNCTION (software_init_hook)
+#endif
+	
+#endif
+.LC1:
+	.word	__bss_start__
+.LC2:
+	.word	__bss_end__
+#ifdef __USES_INITFINI__
+.Lfini:
+	.word	FUNCTION(_fini)
+#endif
+#ifdef ARM_RDI_MONITOR
+.LC30:
+	.word	CommandLine
+	.word	255
+
+/*  Workspace for Angel calls.  */
+	.data
+/*  Data returned by monitor SWI.  */
+.global	__stack_base__
+HeapBase:	.word	0
+HeapLimit:	.word	0
+__stack_base__:	.word	0
+StackLimit:	.word	0
+CommandLine:	.space	256,0	/*  Maximum length of 255 chars handled.  */
+#endif
+	
+#ifdef __pe__
+	.section .idata$3
+	.long	0,0,0,0,0,0,0,0
+#endif
Index: libgloss/arm/elf-rdimon.specs
===================================================================
RCS file: libgloss/arm/elf-rdimon.specs
diff -N libgloss/arm/elf-rdimon.specs
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ libgloss/arm/elf-rdimon.specs	7 Jun 2004 18:47:17 -0000
@@ -0,0 +1,8 @@
+%rename link                old_link
+
+*link:
+%(old_link) -lrdimon
+
+*startfile:
+crti%O%s crtbegin%O%s %{!pg:rdimon-crt0%O%s} %{pg:rdimon-crt0%O%s}
+
Index: libgloss/arm/elf-rdpmon.specs
===================================================================
RCS file: libgloss/arm/elf-rdpmon.specs
diff -N libgloss/arm/elf-rdpmon.specs
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ libgloss/arm/elf-rdpmon.specs	7 Jun 2004 18:47:17 -0000
@@ -0,0 +1,8 @@
+%rename link                old_link
+
+*link:
+%(old_link) -lrdpmon
+
+*startfile:
+crti%O%s crtbegin%O%s %{!pg:rdpmon-crt0%O%s} %{pg:rdpmon-crt0%O%s}
+
Index: libgloss/arm/libcfunc.c
===================================================================
RCS file: libgloss/arm/libcfunc.c
diff -N libgloss/arm/libcfunc.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ libgloss/arm/libcfunc.c	7 Jun 2004 18:47:17 -0000
@@ -0,0 +1,40 @@
+/* Support files for GNU libc.  Files in the C namespace go here.
+   Files in the system namespace (ie those that start with an underscore)
+   go in syscalls.c.
+   
+   Note: These functions are in a seperate file so that OS providers can
+   overrride the system call stubs (defined in syscalls.c) without having
+   to provide libc funcitons as well.  */
+#include "swi.h"
+
+#ifdef ARM_RDI_MONITOR
+
+static inline int
+do_AngelSWI (int reason, void * arg)
+{
+  int value;
+  asm volatile ("mov r0, %1; mov r1, %2; swi %a3; mov %0, r0"
+       : "=r" (value) /* Outputs */
+       : "r" (reason), "r" (arg), "i" (AngelSWI) /* Inputs */
+       : "r0", "r1", "lr"
+		/* Clobbers r0 and r1, and lr if in supervisor mode */);
+  return value;
+}
+#endif /* ARM_RDI_MONITOR */
+
+
+void
+abort (void)
+{
+#ifdef ARM_RDI_MONITOR
+  do_AngelSWI (AngelSWI_Reason_ReportException,
+	      (void *) ADP_Stopped_RunTimeError);
+#else
+ asm ("mov r0,#17\nswi %a0" :: "i" (SWI_Exit));
+#endif
+}
+
+void
+alarm (void)
+{
+}
Index: libgloss/arm/swi.h
===================================================================
RCS file: libgloss/arm/swi.h
diff -N libgloss/arm/swi.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ libgloss/arm/swi.h	7 Jun 2004 18:47:17 -0000
@@ -0,0 +1,60 @@
+/* SWI numbers for RDP (Demon) monitor.  */
+#define SWI_WriteC                 0x0
+#define SWI_Write0                 0x2
+#define SWI_ReadC                  0x4
+#define SWI_CLI                    0x5
+#define SWI_GetEnv                 0x10
+#define SWI_Exit                   0x11
+#define SWI_EnterOS                0x16
+
+#define SWI_GetErrno               0x60
+#define SWI_Clock                  0x61
+#define SWI_Time                   0x63
+#define SWI_Remove                 0x64
+#define SWI_Rename                 0x65
+#define SWI_Open                   0x66
+
+#define SWI_Close                  0x68
+#define SWI_Write                  0x69
+#define SWI_Read                   0x6a
+#define SWI_Seek                   0x6b
+#define SWI_Flen                   0x6c
+
+#define SWI_IsTTY                  0x6e
+#define SWI_TmpNam                 0x6f
+#define SWI_InstallHandler         0x70
+#define SWI_GenerateError          0x71
+
+
+/* Now the SWI numbers and reason codes for RDI (Angel) monitors.  */
+#define AngelSWI_ARM 			0x123456
+#ifdef __thumb__
+#define AngelSWI 			0xAB
+#else
+#define AngelSWI 			AngelSWI_ARM
+#endif
+
+/* The reason codes:  */
+#define AngelSWI_Reason_Open		0x01
+#define AngelSWI_Reason_Close		0x02
+#define AngelSWI_Reason_WriteC		0x03
+#define AngelSWI_Reason_Write0		0x04
+#define AngelSWI_Reason_Write		0x05
+#define AngelSWI_Reason_Read		0x06
+#define AngelSWI_Reason_ReadC		0x07
+#define AngelSWI_Reason_IsTTY		0x09
+#define AngelSWI_Reason_Seek		0x0A
+#define AngelSWI_Reason_FLen		0x0C
+#define AngelSWI_Reason_TmpNam		0x0D
+#define AngelSWI_Reason_Remove		0x0E
+#define AngelSWI_Reason_Rename		0x0F
+#define AngelSWI_Reason_Clock		0x10
+#define AngelSWI_Reason_Time		0x11
+#define AngelSWI_Reason_System		0x12
+#define AngelSWI_Reason_Errno		0x13
+#define AngelSWI_Reason_GetCmdLine 	0x15
+#define AngelSWI_Reason_HeapInfo 	0x16
+#define AngelSWI_Reason_EnterSVC 	0x17
+#define AngelSWI_Reason_ReportException 0x18
+#define ADP_Stopped_ApplicationExit 	((2 << 16) + 38)
+#define ADP_Stopped_RunTimeError 	((2 << 16) + 35)
Index: libgloss/arm/syscalls.c
===================================================================
RCS file: libgloss/arm/syscalls.c
diff -N libgloss/arm/syscalls.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ libgloss/arm/syscalls.c	7 Jun 2004 18:47:17 -0000
@@ -0,0 +1,630 @@
+/* Support files for GNU libc.  Files in the system namespace go here.
+   Files in the C namespace (ie those that do not start with an
+   underscore) go in .c.  */
+
+#include <_ansi.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/fcntl.h>
+#include <stdio.h>
+#include <time.h>
+#include <sys/time.h>
+#include <sys/times.h>
+#include <errno.h>
+#include <reent.h>
+#include <unistd.h>
+#include "swi.h"
+
+/* Forward prototypes.  */
+int     _system     _PARAMS ((const char *));
+int     _rename     _PARAMS ((const char *, const char *));
+int     isatty		_PARAMS ((int));
+clock_t _times		_PARAMS ((struct tms *));
+int     _gettimeofday	_PARAMS ((struct timeval *, struct timezone *));
+void    _raise 		_PARAMS ((void));
+int     _unlink		_PARAMS ((void));
+int     _link 		_PARAMS ((void));
+int     _stat 		_PARAMS ((const char *, struct stat *));
+int     _fstat 		_PARAMS ((int, struct stat *));
+caddr_t _sbrk		_PARAMS ((int));
+int     _getpid		_PARAMS ((int));
+int     _kill		_PARAMS ((int, int));
+void    _exit		_PARAMS ((int));
+int     _close		_PARAMS ((int));
+int     _swiclose	_PARAMS ((int));
+int     _open		_PARAMS ((const char *, int, ...));
+int     _swiopen	_PARAMS ((const char *, int));
+int     _write 		_PARAMS ((int, char *, int));
+int     _swiwrite	_PARAMS ((int, char *, int));
+int     _lseek		_PARAMS ((int, int, int));
+int     _swilseek	_PARAMS ((int, int, int));
+int     _read		_PARAMS ((int, char *, int));
+int     _swiread	_PARAMS ((int, char *, int));
+void    initialise_monitor_handles _PARAMS ((void));
+
+static int	wrap		_PARAMS ((int));
+static int	error		_PARAMS ((int));
+static int	get_errno	_PARAMS ((void));
+static int	remap_handle	_PARAMS ((int));
+static int	do_AngelSWI	_PARAMS ((int, void *));
+static int 	findslot	_PARAMS ((int));
+
+/* Register name faking - works in collusion with the linker.  */
+register char * stack_ptr asm ("sp");
+
+
+/* following is copied from libc/stdio/local.h to check std streams */
+extern void   _EXFUN(__sinit,(struct _reent *));
+#define CHECK_INIT(fp) \
+  do                                    \
+    {                                   \
+      if ((fp)->_data == 0)             \
+        (fp)->_data = _REENT;           \
+      if (!(fp)->_data->__sdidinit)     \
+        __sinit ((fp)->_data);          \
+    }                                   \
+  while (0)
+
+/* Adjust our internal handles to stay away from std* handles.  */
+#define FILE_HANDLE_OFFSET (0x20)
+
+static int std_files_checked;
+static int monitor_stdin;
+static int monitor_stdout;
+static int monitor_stderr;
+
+/* Struct used to keep track of the file position, just so we
+   can implement fseek(fh,x,SEEK_CUR).  */
+typedef struct
+{
+  int handle;
+  int pos;
+}
+poslog;
+
+#define MAX_OPEN_FILES 20
+static poslog openfiles [MAX_OPEN_FILES];
+
+static int
+findslot (int fh)
+{
+  int i;
+  for (i = 0; i < MAX_OPEN_FILES; i ++)
+    if (openfiles[i].handle == fh)
+      break;
+  return i;
+}
+
+#ifdef ARM_RDI_MONITOR
+
+static inline int
+do_AngelSWI (int reason, void * arg)
+{
+  int value;
+  asm volatile ("mov r0, %1; mov r1, %2; swi %a3; mov %0, r0"
+       : "=r" (value) /* Outputs */
+       : "r" (reason), "r" (arg), "i" (AngelSWI) /* Inputs */
+       : "r0", "r1", "r2", "r3", "ip", "lr", "memory", "cc"
+		/* Clobbers r0 and r1, and lr if in supervisor mode */);
+                /* Accordingly to page 13-77 of ARM DUI 0040D other registers
+                   can also be clobbered.  Some memory positions may also be
+                   changed by a system call, so they should not be kept in
+                   registers. Note: we are assuming the manual is right and
+                   Angel is respecting the APCS.  */
+  return value;
+}
+#endif /* ARM_RDI_MONITOR */
+
+/* Function to convert std(in|out|err) handles to internal versions.  */
+static int
+remap_handle (int fh)
+{
+  if (!std_files_checked)
+    {
+       CHECK_INIT(stdin);
+       CHECK_INIT(stdout);
+       CHECK_INIT(stderr);
+       std_files_checked = 1;
+    }
+  if (fh == STDIN_FILENO)
+    return monitor_stdin;
+  if (fh == STDOUT_FILENO)
+    return monitor_stdout;
+  if (fh == STDERR_FILENO)
+    return monitor_stderr;
+
+  return fh - FILE_HANDLE_OFFSET;
+}
+
+void
+initialise_monitor_handles (void)
+{
+  int i;
+  
+#ifdef ARM_RDI_MONITOR
+  int volatile block[3];
+  
+  block[0] = (int) ":tt";
+  block[2] = 3;     /* length of filename */
+  block[1] = 0;     /* mode "r" */
+  monitor_stdin = do_AngelSWI (AngelSWI_Reason_Open, (void *) block);
+
+  block[0] = (int) ":tt";
+  block[2] = 3;     /* length of filename */
+  block[1] = 4;     /* mode "w" */
+  monitor_stdout = monitor_stderr = do_AngelSWI (AngelSWI_Reason_Open, (void *) block);
+#else
+  int fh;
+  const char * name;
+
+  name = ":tt";
+  asm ("mov r0,%2; mov r1, #0; swi %a1; mov %0, r0"
+       : "=r"(fh)
+       : "i" (SWI_Open),"r"(name)
+       : "r0","r1");
+  monitor_stdin = fh;
+
+  name = ":tt";
+  asm ("mov r0,%2; mov r1, #4; swi %a1; mov %0, r0"
+       : "=r"(fh)
+       : "i" (SWI_Open),"r"(name)
+       : "r0","r1");
+  monitor_stdout = monitor_stderr = fh;
+#endif
+
+  for (i = 0; i < MAX_OPEN_FILES; i ++)
+    openfiles[i].handle = -1;
+
+  openfiles[0].handle = monitor_stdin;
+  openfiles[0].pos = 0;
+  openfiles[1].handle = monitor_stdout;
+  openfiles[1].pos = 0;
+}
+
+static int
+get_errno (void)
+{
+#ifdef ARM_RDI_MONITOR
+  return do_AngelSWI (AngelSWI_Reason_Errno, NULL);
+#else
+  asm ("swi %a0" :: "i" (SWI_GetErrno));
+#endif
+}
+
+static int
+error (int result)
+{
+  errno = get_errno ();
+  return result;
+}
+
+static int
+wrap (int result)
+{
+  if (result == -1)
+    return error (-1);
+  return result;
+}
+
+/* Returns # chars not! written.  */
+int
+_swiread (int file,
+	  char * ptr,
+	  int len)
+{
+  int fh = remap_handle (file);
+#ifdef ARM_RDI_MONITOR
+  int block[3];
+  
+  block[0] = fh;
+  block[1] = (int) ptr;
+  block[2] = len;
+  
+  return do_AngelSWI (AngelSWI_Reason_Read, block);
+#else
+  asm ("mov r0, %1; mov r1, %2;mov r2, %3; swi %a0"
+       : /* No outputs */
+       : "i"(SWI_Read), "r"(fh), "r"(ptr), "r"(len)
+       : "r0","r1","r2");
+#endif
+}
+
+int
+_read (int file,
+       char * ptr,
+       int len)
+{
+  int slot = findslot (remap_handle (file));
+  int x = _swiread (file, ptr, len);
+
+  if (x < 0)
+    return error (-1);
+
+  if (slot != MAX_OPEN_FILES)
+    openfiles [slot].pos += len - x;
+
+  /* x == len is not an error, at least if we want feof() to work.  */
+  return len - x;
+}
+
+int
+_swilseek (int file,
+	   int ptr,
+	   int dir)
+{
+  int res;
+  int fh = remap_handle (file);
+  int slot = findslot (fh);
+#ifdef ARM_RDI_MONITOR
+  int block[2];
+#endif
+
+  if (dir == SEEK_CUR)
+    {
+      if (slot == MAX_OPEN_FILES)
+	return -1;
+      ptr = openfiles[slot].pos + ptr;
+      dir = SEEK_SET;
+    }
+  
+#ifdef ARM_RDI_MONITOR
+  if (dir == SEEK_END)
+    {
+      block[0] = fh;
+      ptr += do_AngelSWI (AngelSWI_Reason_FLen, block);
+    }
+  
+  /* This code only does absolute seeks.  */
+  block[0] = remap_handle (file);
+  block[1] = ptr;
+  res = do_AngelSWI (AngelSWI_Reason_Seek, block);
+#else
+  if (dir == SEEK_END)
+    {
+      asm ("mov r0, %2; swi %a1; mov %0, r0"
+	   : "=r" (res)
+	   : "i" (SWI_Flen), "r" (fh)
+	   : "r0");
+      ptr += res;
+    }
+
+  /* This code only does absolute seeks.  */
+  asm ("mov r0, %2; mov r1, %3; swi %a1; mov %0, r0"
+       : "=r" (res)
+       : "i" (SWI_Seek), "r" (fh), "r" (ptr)
+       : "r0", "r1");
+#endif
+
+  if (slot != MAX_OPEN_FILES && res == 0)
+    openfiles[slot].pos = ptr;
+
+  /* This is expected to return the position in the file.  */
+  return res == 0 ? ptr : -1;
+}
+
+int
+_lseek (int file,
+	int ptr,
+	int dir)
+{
+  return wrap (_swilseek (file, ptr, dir));
+}
+
+/* Returns #chars not! written.  */
+int
+_swiwrite (
+	   int    file,
+	   char * ptr,
+	   int    len)
+{
+  int fh = remap_handle (file);
+#ifdef ARM_RDI_MONITOR
+  int block[3];
+  
+  block[0] = fh;
+  block[1] = (int) ptr;
+  block[2] = len;
+  
+  return do_AngelSWI (AngelSWI_Reason_Write, block);
+#else
+  asm ("mov r0, %1; mov r1, %2;mov r2, %3; swi %a0"
+       : /* No outputs */
+       : "i"(SWI_Write), "r"(fh), "r"(ptr), "r"(len)
+       : "r0","r1","r2");
+#endif
+}
+
+int
+_write (int    file,
+	char * ptr,
+	int    len)
+{
+  int slot = findslot (remap_handle (file));
+  int x = _swiwrite (file, ptr,len);
+
+  if (x == -1 || x == len)
+    return error (-1);
+  
+  if (slot != MAX_OPEN_FILES)
+    openfiles[slot].pos += len - x;
+  
+  return len - x;
+}
+
+extern int strlen (const char *);
+
+int
+_swiopen (const char * path,
+	  int          flags)
+{
+  int aflags = 0, fh;
+#ifdef ARM_RDI_MONITOR
+  int block[3];
+#endif
+  
+  int i = findslot (-1);
+  
+  if (i == MAX_OPEN_FILES)
+    return -1;
+
+  /* The flags are Unix-style, so we need to convert them.  */
+#ifdef O_BINARY
+  if (flags & O_BINARY)
+    aflags |= 1;
+#endif
+
+  if (flags & O_RDWR)
+    aflags |= 2;
+
+  if (flags & O_CREAT)
+    aflags |= 4;
+
+  if (flags & O_TRUNC)
+    aflags |= 4;
+
+  if (flags & O_APPEND)
+    {
+      aflags &= ~4;     /* Can't ask for w AND a; means just 'a'.  */
+      aflags |= 8;
+    }
+  
+#ifdef ARM_RDI_MONITOR
+  block[0] = (int) path;
+  block[2] = strlen (path);
+  block[1] = aflags;
+  
+  fh = do_AngelSWI (AngelSWI_Reason_Open, block);
+  
+#else
+  asm ("mov r0,%2; mov r1, %3; swi %a1; mov %0, r0"
+       : "=r"(fh)
+       : "i" (SWI_Open),"r"(path),"r"(aflags)
+       : "r0","r1");
+#endif
+  
+  if (fh >= 0)
+    {
+      openfiles[i].handle = fh;
+      openfiles[i].pos = 0;
+    }
+
+  return fh >= 0 ? fh + FILE_HANDLE_OFFSET : error (fh);
+}
+
+int
+_open (const char * path,
+       int          flags,
+       ...)
+{
+  return wrap (_swiopen (path, flags));
+}
+
+int
+_swiclose (int file)
+{
+  int myhan = remap_handle (file);
+  int slot = findslot (myhan);
+  
+  if (slot != MAX_OPEN_FILES)
+    openfiles[slot].handle = -1;
+
+#ifdef ARM_RDI_MONITOR
+  return do_AngelSWI (AngelSWI_Reason_Close, & myhan);
+#else
+  asm ("mov r0, %1; swi %a0" :: "i" (SWI_Close),"r"(myhan):"r0");
+#endif
+}
+
+int
+_close (int file)
+{
+  return wrap (_swiclose (file));
+}
+
+void
+_exit (int n)
+{
+  /* FIXME: return code is thrown away.  */
+  
+#ifdef ARM_RDI_MONITOR
+  do_AngelSWI (AngelSWI_Reason_ReportException,
+	      (void *) ADP_Stopped_ApplicationExit);
+#else
+  asm ("swi %a0" :: "i" (SWI_Exit));
+#endif
+  n = n;
+}
+
+int
+_kill (int n, int m)
+{
+#ifdef ARM_RDI_MONITOR
+  return do_AngelSWI (AngelSWI_Reason_ReportException,
+		      (void *) ADP_Stopped_ApplicationExit);
+#else
+  asm ("swi %a0" :: "i" (SWI_Exit));
+#endif
+  n = n; m = m;
+}
+
+int
+_getpid (int n)
+{
+  return 1;
+  n = n;
+}
+
+caddr_t
+_sbrk (int incr)
+{
+  extern char   end asm ("end");	/* Defined by the linker.  */
+  static char * heap_end;
+  char *        prev_heap_end;
+
+  if (heap_end == NULL)
+    heap_end = & end;
+  
+  prev_heap_end = heap_end;
+  
+  if (heap_end + incr > stack_ptr)
+    {
+      /* Some of the libstdc++-v3 tests rely upon detecting
+	 out of memory errors, so do not abort here.  */
+#if 0
+      extern void abort (void);
+
+      _write (1, "_sbrk: Heap and stack collision\n", 32);
+      
+      abort ();
+#else
+      errno = ENOMEM;
+      return (caddr_t) -1;
+#endif
+    }
+  
+  heap_end += incr;
+
+  return (caddr_t) prev_heap_end;
+}
+
+extern void memset (struct stat *, int, unsigned int);
+
+int
+_fstat (int file, struct stat * st)
+{
+  memset (st, 0, sizeof (* st));
+  st->st_mode = S_IFCHR;
+  st->st_blksize = 1024;
+  return 0;
+  file = file;
+}
+
+int _stat (const char *fname, struct stat *st)
+{
+  int file;
+
+  /* The best we can do is try to open the file readonly.  If it exists,
+     then we can guess a few things about it.  */
+  if ((file = _open (fname, O_RDONLY)) < 0)
+    return -1;
+
+  memset (st, 0, sizeof (* st));
+  st->st_mode = S_IFREG | S_IREAD;
+  st->st_blksize = 1024;
+  _swiclose (file); /* Not interested in the error.  */
+  return 0;
+}
+
+int
+_link (void)
+{
+  return -1;
+}
+
+int
+_unlink (void)
+{
+  return -1;
+}
+
+void
+_raise (void)
+{
+  return;
+}
+
+int
+_gettimeofday (struct timeval * tp, struct timezone * tzp)
+{
+
+  if (tp)
+    {
+    /* Ask the host for the seconds since the Unix epoch.  */
+#ifdef ARM_RDI_MONITOR
+      tp->tv_sec = do_AngelSWI (AngelSWI_Reason_Time,NULL);
+#else
+      {
+        int value;
+        asm ("swi %a1; mov %0, r0" : "=r" (value): "i" (SWI_Time) : "r0");
+        tp->tv_sec = value;
+      }
+#endif
+      tp->tv_usec = 0;
+    }
+
+  /* Return fixed data for the timezone.  */
+  if (tzp)
+    {
+      tzp->tz_minuteswest = 0;
+      tzp->tz_dsttime = 0;
+    }
+
+  return 0;
+}
+
+/* Return a clock that ticks at 100Hz.  */
+clock_t 
+_times (struct tms * tp)
+{
+  clock_t timeval;
+
+#ifdef ARM_RDI_MONITOR
+  timeval = do_AngelSWI (AngelSWI_Reason_Clock,NULL);
+#else
+  asm ("swi %a1; mov %0, r0" : "=r" (timeval): "i" (SWI_Clock) : "r0");
+#endif
+
+  if (tp)
+    {
+      tp->tms_utime  = timeval;	/* user time */
+      tp->tms_stime  = 0;	/* system time */
+      tp->tms_cutime = 0;	/* user time, children */
+      tp->tms_cstime = 0;	/* system time, children */
+    }
+  
+  return timeval;
+};
+
+
+int
+isatty (int fd)
+{
+  return 1;
+  fd = fd;
+}
+
+int
+_system (const char *s)
+{
+  if (s == NULL)
+    return 0;
+  errno = ENOSYS;
+  return -1;
+}
+
+int
+_rename (const char * oldpath, const char * newpath)
+{
+  errno = ENOSYS;
+  return -1;
+}
Index: libgloss/arm/trap.S
===================================================================
RCS file: libgloss/arm/trap.S
diff -N libgloss/arm/trap.S
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ libgloss/arm/trap.S	7 Jun 2004 18:47:17 -0000
@@ -0,0 +1,93 @@
+        /* Run-time exception support */
+#include "swi.h"
+
+/* .text is used instead of .section .text so it works with arm-aout too.  */
+	.text
+        .align 0
+        .global __rt_stkovf_split_big
+        .global __rt_stkovf_split_small
+
+/* The following functions are provided for software stack checking.
+   If hardware stack-checking is being used then the code can be
+   compiled without the PCS entry checks, and simply rely on VM
+   management to extend the stack for a thread.
+
+   The stack extension event occurs when the PCS function entry code
+   would result in a stack-pointer beneath the stack-limit register
+   value.  The system relies on the following map:
+
+        +-----------------------------------+ <-- end of stack block
+        | ...                               |
+        | ...                               |
+        | active stack                      |
+        | ...                               | <-- sp (stack-pointer) somewhere in here
+        | ...                               |
+        +-----------------------------------+ <-- sl (stack-limit)
+        | stack-extension handler workspace |
+        +-----------------------------------+ <-- base of stack block
+
+   The "stack-extension handler workspace" is an amount of memory in
+   which the stack overflow support code must execute.  It must be
+   large enough to deal with the worst case path through the extension
+   code.  At the moment the compiler expects this to be AT LEAST
+   256bytes.  It uses this fact to code functions with small local
+   data usage within the overflow space.
+
+   In a true target environment We may need to increase the space
+   between sl and the true limit to allow for the stack extension
+   code, SWI handlers and for undefined instruction handlers of the
+   target environment.  */
+
+__rt_stkovf_split_small:
+        mov     ip,sp   @ Ensure we can calculate the stack required
+        @ and fall through to...
+__rt_stkovf_split_big:
+        @ in:   sp = current stack-pointer (beneath stack-limit)
+        @       sl = current stack-limit
+        @       ip = low stack point we require for the current function
+        @       lr = return address into the current function
+        @       fp = frame-pointer
+        @               original sp --> +----------------------------------+
+        @                               | pc (12 ahead of PCS entry store) |
+        @               current fp ---> +----------------------------------+
+        @                               | lr (on entry) pc (on exit)       |
+        @                               +----------------------------------+
+        @                               | sp ("original sp" on entry)      |
+        @                               +----------------------------------+
+        @                               | fp (on entry to function)        |
+        @                               +----------------------------------+
+        @                               |                                  |
+        @                               | ..argument and work registers..  |
+        @                               |                                  |
+        @               current sp ---> +----------------------------------+
+        @
+        @ The "current sl" is somewhere between "original sp" and "current sp"
+        @ but above "true sl". The "current sl" should be at least 256bytes
+        @ above the "true sl". The 256byte stack guard should be large enough
+        @ to deal with the worst case function entry stacking (160bytes) plus
+        @ the stack overflow handler stacking requirements, plus the stack
+        @ required for the memory allocation routines.
+        @
+        @ Normal PCS entry (before stack overflow check) can stack 16
+        @ standard registers (64bytes) and 8 floating point registers
+        @ (96bytes). This gives a minimum stack guard of 160bytes (excluding
+        @ the stack required for the code). (Actually only a maximum of
+        @ 14standard registers are ever stacked on entry to a function).
+        @
+        @ NOTE: Structure returns are performed by the caller allocating a
+        @       dummy space on the stack and passing in a "phantom" arg1 into
+        @       the function. This means that we do not need to worry about
+        @       preserving the stack under "sp" even on function return.
+        @ 
+        @        Code should never poke values beneath sp. The sp register
+        @        should always be "dropped" first to cover the data. This
+        @        protects the data against any events that may try and use
+        @        the stack.
+
+        SUB     ip, sp, ip      @ extra stack required for function
+        @ Add stack extension code here.  If desired a new stack chunk
+        @ can be allocated, and the register state updated suitably.
+
+        @ We now know how much extra stack the function requires.
+        @ Terminate the program for the moment:
+        swi     SWI_Exit
Index: newlib/ChangeLog
===================================================================
RCS file: /cvs/src/src/newlib/ChangeLog,v
retrieving revision 1.673
diff -u -p -r1.673 ChangeLog
--- newlib/ChangeLog	2 Jun 2004 19:22:14 -0000	1.673
+++ newlib/ChangeLog	7 Jun 2004 18:47:27 -0000
@@ -1,3 +1,15 @@
+2004-06-07  Toralf Lund  <toralf@procaptura.com>
+
+	* libc/sys/arm/setjmp.S, libc/sys/arm/access.c: Move
+	files from libc/sys/arm to libc/machine/arm.
+	* libc/machine/arm/Makefile.am, libc/machine/arm/Makefile.in: Add
+	library build support for files moved from libc/sys/arm.
+	* libc/sys/arm/Makefile.am, libc/sys/arm/Makefile.in:  Remove
+	references to access and setjmp.
+	* configure.host: Add checks for newlib_may_supply_syscalls to
+	determine whether or not to use sys/arm directory and use
+	special compiler flags: ARM_RDI_MONITOR and ARM_RDP_MONITOR.
+       
 2004-06-02  Jeff Johnston  <jjohnstn@redhat.com>
 
 	* libc/stdio/vfscanf.c (__svfscanf_r): For CT_INT conversions,
Index: newlib/configure.host
===================================================================
RCS file: /cvs/src/src/newlib/configure.host,v
retrieving revision 1.59
diff -u -p -r1.59 configure.host
--- newlib/configure.host	26 May 2004 00:19:14 -0000	1.59
+++ newlib/configure.host	7 Jun 2004 18:47:27 -0000
@@ -302,7 +302,9 @@ case "${host}" in
 	sys_dir=arc
 	;;
   arm-*-*)
-	sys_dir=arm 
+	if [ "x${newlib_may_supply_syscalls}" = "xyes" ] ; then
+	  sys_dir=arm
+	fi
 	;;
   d10v*)
 	sys_dir=d10v
@@ -311,8 +313,13 @@ case "${host}" in
 	sys_dir=
 	;;
   ep9312-*-*)
-	sys_dir=arm
+	if [ "x${newlib_may_supply_syscalls}" = "xyes" ] ; then
+	  sys_dir=arm
+	fi
 	;;
+  frv*)
+        sys_dir=
+        ;;
   h8300-*-hms*)
 	sys_dir=h8300hms
 	;;
@@ -387,13 +394,14 @@ case "${host}" in
 	unix_dir=unix
 	;;
   strongarm-*-*)
-	sys_dir=arm 
-	;;
-  xscale-*-*)
-	sys_dir=arm 
+	if [ "x${newlib_may_supply_syscalls}" = "xyes" ] ; then
+	  sys_dir=arm
+	fi
 	;;
   thumb-*-*)
-	sys_dir=arm 
+	if [ "x${newlib_may_supply_syscalls}" = "xyes" ] ; then
+	  sys_dir=arm
+	fi
 	;;
   tic80*)
 	sys_dir=tic80
@@ -413,12 +421,14 @@ case "${host}" in
   v850ea-*-*)
 	sys_dir=sysnecv850
 	;;
-  frv*)
-        sys_dir=
-        ;;
   w65-*-*)
 	sys_dir=w65
 	;;
+  xscale-*-*)
+	if [ "x${newlib_may_supply_syscalls}" = "xyes" ] ; then
+	  sys_dir=arm
+	fi
+	;;
   z8k-*-coff)
 	sys_dir=z8ksim
 	;;
@@ -465,19 +475,22 @@ case "${host}" in
   arm-*-pe)
 	syscall_dir=syscalls
 	newlib_cflags="${newlib_cflags} -DABORT_PROVIDED -DHAVE_GETTIMEOFDAY"
-# Don't use the debugging protocols just yet.
 	;;
   arm-*-*)
 	syscall_dir=syscalls
 	newlib_cflags="${newlib_cflags} -DABORT_PROVIDED -DHAVE_GETTIMEOFDAY"
-# Select which debug protocol is being used.
+# If newlib is supplying syscalls, select which debug protocol is being used.
 # ARM_RDP_MONITOR selects the Demon monitor.
 # ARM_RDI_MONITOR selects the Angel monitor.
 # If neither are defined, then hard coded defaults will be used
 # to create the program's environment.
+# If --disable-newlib-supplied-syscalls is specified, then the end-user
+# may specify the protocol via gcc spec files supplied by libgloss.
 # See also thumb below.
-#	newlib_cflags="${newlib_cflags} -DARM_RDP_MONITOR"
-	newlib_cflags="${newlib_cflags} -DARM_RDI_MONITOR"
+	if [ "x${newlib_may_supply_syscalls}" = "xyes" ] ; then
+#         newlib_cflags="${newlib_cflags} -DARM_RDP_MONITOR"
+	  newlib_cflags="${newlib_cflags} -DARM_RDI_MONITOR"
+	fi
 	;;
   avr*)
 	newlib_cflags="${newlib_cflags} -DNO_EXEC -DSMALL_MEMORY -DMISSING_SYSCALL_NAMES"
@@ -493,7 +506,9 @@ case "${host}" in
   ep9312-*-*)
 	syscall_dir=syscalls
 	newlib_cflags="${newlib_cflags} -DABORT_PROVIDED -DHAVE_GETTIMEOFDAY"
-	newlib_cflags="${newlib_cflags} -DARM_RDI_MONITOR"
+	if [ "x${newlib_may_supply_syscalls}" = "xyes" ] ; then
+	  newlib_cflags="${newlib_cflags} -DARM_RDI_MONITOR"
+	fi
 	;;
   fr30-*-*)
 	syscall_dir=syscalls
@@ -593,13 +608,6 @@ case "${host}" in
   strongarm-*-*)
 	syscall_dir=syscalls
 	newlib_cflags="${newlib_cflags} -DABORT_PROVIDED -DHAVE_GETTIMEOFDAY"
-	newlib_cflags="${newlib_cflags} -DARM_RDI_MONITOR"
-	;;
-  xscale-*-*)
-	syscall_dir=syscalls
-	newlib_cflags="${newlib_cflags} -DABORT_PROVIDED -DHAVE_GETTIMEOFDAY"
-	newlib_cflags="${newlib_cflags} -DARM_RDI_MONITOR"
-	newlib_cflags="${newlib_cflags} -DHAVE_SYSTEM -DHAVE_RENAME"
 	;;
   thumb-*-pe)
 	syscall_dir=syscalls
@@ -609,14 +617,17 @@ case "${host}" in
   thumb-*-*)
 	syscall_dir=syscalls
 	newlib_cflags="${newlib_cflags} -DABORT_PROVIDED -DHAVE_GETTIMEOFDAY"
-# Select which debug protocol is being used.
+# If newlib is supplying syscalls, select which debug protocol is being used.
 # ARM_RDP_MONITOR selects the Demon monitor.
 # ARM_RDI_MONITOR selects the Angel monitor.
 # If neither are defined, then hard coded defaults will be used
 # to create the program's environment.
-# See also arm and strongarm above.
-#	newlib_cflags="${newlib_cflags} -DARM_RDP_MONITOR"
-	newlib_cflags="${newlib_cflags} -DARM_RDI_MONITOR"
+# If --disable-newlib-supplied-syscalls is specified, then the end-user
+# may specify the protocol via gcc spec files supplied by libgloss.
+	if [ "x${newlib_may_supply_syscalls}" = "xyes" ] ; then
+#         newlib_cflags="${newlib_cflags} -DARM_RDP_MONITOR"
+	  newlib_cflags="${newlib_cflags} -DARM_RDI_MONITOR"
+	fi
 	;;
   tic80*)
 	syscall_dir=syscalls
@@ -634,6 +645,14 @@ case "${host}" in
 	syscall_dir=syscalls	
 	newlib_cflags="${newlib_cflags} -DSMALL_DTOA -DSMALL_MEMORY"
 	;;	
+  xscale-*-*)
+	syscall_dir=syscalls
+	newlib_cflags="${newlib_cflags} -DABORT_PROVIDED -DHAVE_GETTIMEOFDAY"
+	newlib_cflags="${newlib_cflags} -DHAVE_SYSTEM -DHAVE_RENAME"
+	if [ "x${newlib_may_supply_syscalls}" = "xyes" ] ; then
+	  newlib_cflags="${newlib_cflags} -DARM_RDI_MONITOR"
+	fi
+	;;
   xstormy16-*-*)
 	newlib_cflags="${newlib_cflags} -DHAVE_GETTIMEOFDAY"
 	syscall_dir=syscalls
Index: newlib/libc/machine/arm/Makefile.am
===================================================================
RCS file: /cvs/src/src/newlib/libc/machine/arm/Makefile.am,v
retrieving revision 1.1.1.1
diff -u -p -r1.1.1.1 Makefile.am
--- newlib/libc/machine/arm/Makefile.am	17 Feb 2000 19:39:46 -0000	1.1.1.1
+++ newlib/libc/machine/arm/Makefile.am	7 Jun 2004 18:47:27 -0000
@@ -6,7 +6,7 @@ INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLA
 
 noinst_LIBRARIES = lib.a
 
-lib_a_SOURCES =
+lib_a_SOURCES = setjmp.S access.c
 
 ACLOCAL_AMFLAGS = -I ../../..
 CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host
Index: newlib/libc/machine/arm/Makefile.in
===================================================================
RCS file: /cvs/src/src/newlib/libc/machine/arm/Makefile.in,v
retrieving revision 1.6
diff -u -p -r1.6 Makefile.in
--- newlib/libc/machine/arm/Makefile.in	23 Jan 2004 21:37:29 -0000	1.6
+++ newlib/libc/machine/arm/Makefile.in	7 Jun 2004 18:47:28 -0000
@@ -89,7 +89,7 @@ INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLA
 
 noinst_LIBRARIES = lib.a
 
-lib_a_SOURCES = 
+lib_a_SOURCES = setjmp.S access.c
 
 ACLOCAL_AMFLAGS = -I ../../..
 CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host
@@ -103,7 +103,11 @@ DEFS = @DEFS@ -I. -I$(srcdir) 
 CPPFLAGS = @CPPFLAGS@
 LIBS = @LIBS@
 lib_a_LIBADD = 
-lib_a_OBJECTS = 
+lib_a_OBJECTS =  setjmp.o access.o
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
 DIST_COMMON =  Makefile.am Makefile.in aclocal.m4 configure configure.in
 
 
@@ -166,9 +170,35 @@ lib.a: $(lib_a_OBJECTS) $(lib_a_DEPENDEN
 	-rm -f lib.a
 	$(AR) cru lib.a $(lib_a_OBJECTS) $(lib_a_LIBADD)
 	$(RANLIB) lib.a
+
 tags: TAGS
-TAGS:
 
+ID: $(HEADERS) $(SOURCES) $(LISP)
+	list='$(SOURCES) $(HEADERS)'; \
+	unique=`for i in $$list; do echo $$i; done | \
+	  awk '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	here=`pwd` && cd $(srcdir) \
+	  && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)'; \
+	unique=`for i in $$list; do echo $$i; done | \
+	  awk '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+	  || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags  $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+	-rm -f TAGS ID
+
+maintainer-clean-tags:
 
 distdir = $(PACKAGE)-$(VERSION)
 top_distdir = $(distdir)
@@ -256,24 +286,24 @@ distclean-generic:
 
 maintainer-clean-generic:
 mostlyclean-am:  mostlyclean-noinstLIBRARIES mostlyclean-compile \
-		mostlyclean-generic
+		mostlyclean-tags mostlyclean-generic
 
 mostlyclean: mostlyclean-am
 
-clean-am:  clean-noinstLIBRARIES clean-compile clean-generic \
+clean-am:  clean-noinstLIBRARIES clean-compile clean-tags clean-generic \
 		mostlyclean-am
 
 clean: clean-am
 
 distclean-am:  distclean-noinstLIBRARIES distclean-compile \
-		distclean-generic clean-am
+		distclean-tags distclean-generic clean-am
 
 distclean: distclean-am
 	-rm -f config.status
 
 maintainer-clean-am:  maintainer-clean-noinstLIBRARIES \
-		maintainer-clean-compile maintainer-clean-generic \
-		distclean-am
+		maintainer-clean-compile maintainer-clean-tags \
+		maintainer-clean-generic distclean-am
 	@echo "This command is intended for maintainers to use;"
 	@echo "it deletes files that may require special tools to rebuild."
 
@@ -283,7 +313,8 @@ maintainer-clean: maintainer-clean-am
 .PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \
 clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \
 mostlyclean-compile distclean-compile clean-compile \
-maintainer-clean-compile tags distdir info-am info dvi-am dvi check \
+maintainer-clean-compile tags mostlyclean-tags distclean-tags \
+clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \
 check-am installcheck-am installcheck install-info-am install-info \
 install-exec-am install-exec install-data-am install-data install-am \
 install uninstall-am uninstall all-redirect all-am all installdirs \
Index: newlib/libc/machine/arm/access.c
===================================================================
RCS file: newlib/libc/machine/arm/access.c
diff -N newlib/libc/machine/arm/access.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ newlib/libc/machine/arm/access.c	7 Jun 2004 18:47:28 -0000
@@ -0,0 +1,33 @@
+/* This is file ACCESS.C */
+/*
+ * Copyright (C) 1993 DJ Delorie
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms is permitted
+ * provided that the above copyright notice and following paragraph are
+ * duplicated in all such forms.
+ *
+ * This file is distributed WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+int access(const char *fn, int flags)
+{
+  struct stat s;
+  if (stat(fn, &s))
+    return -1;
+  if (s.st_mode & S_IFDIR)
+    return 0;
+  if (flags & W_OK)
+  {
+    if (s.st_mode & S_IWRITE)
+      return 0;
+    return -1;
+  }
+  return 0;
+}
+	
Index: newlib/libc/machine/arm/setjmp.S
===================================================================
RCS file: newlib/libc/machine/arm/setjmp.S
diff -N newlib/libc/machine/arm/setjmp.S
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ newlib/libc/machine/arm/setjmp.S	7 Jun 2004 18:47:28 -0000
@@ -0,0 +1,137 @@
+/* This is a simple version of setjmp and longjmp.
+
+   Nick Clifton, Cygnus Solutions, 13 June 1997.  */
+
+/* ANSI concatenation macros.  */
+#define CONCAT(a, b)  CONCAT2(a, b)
+#define CONCAT2(a, b) a##b
+
+#ifndef __USER_LABEL_PREFIX__
+#error  __USER_LABEL_PREFIX__ not defined
+#endif
+
+#define SYM(x) CONCAT (__USER_LABEL_PREFIX__, x)
+
+#ifdef __ELF__
+#define TYPE(x) .type SYM(x),function
+#define SIZE(x) .size SYM(x), . - SYM(x)
+#else
+#define TYPE(x)
+#define SIZE(x)
+#endif
+
+/* Arm/Thumb interworking support:
+
+   The interworking scheme expects functions to use a BX instruction
+   to return control to their parent.  Since we need this code to work
+   in both interworked and non-interworked environments as well as with
+   older processors which do not have the BX instruction we do the 
+   following:
+	Test the return address.
+	If the bottom bit is clear perform an "old style" function exit.
+	(We know that we are in ARM mode and returning to an ARM mode caller).
+	Otherwise use the BX instruction to perform the function exit.
+
+   We know that we will never attempt to perform the BX instruction on 
+   an older processor, because that kind of processor will never be 
+   interworked, and a return address with the bottom bit set will never 
+   be generated.
+
+   In addition, we do not actually assemble the BX instruction as this would
+   require us to tell the assembler that the processor is an ARM7TDMI and
+   it would store this information in the binary.  We want this binary to be
+   able to be linked with binaries compiled for older processors however, so
+   we do not want such information stored there.  
+
+   If we are running using the APCS-26 convention however, then we never
+   test the bottom bit, because this is part of the processor status.  
+   Instead we just do a normal return, since we know that we cannot be 
+   returning to a Thumb caller - the Thumb does not support APCS-26.
+	
+   Function entry is much simpler.  If we are compiling for the Thumb we 
+   just switch into ARM mode and then drop through into the rest of the
+   function.  The function exit code will take care of the restore to
+   Thumb mode.  */
+
+#ifdef __APCS_26__
+#define RET	movs		pc, lr
+#else
+#define RET	tst		lr, #1; \
+	        moveq		pc, lr ; \
+.word           0xe12fff1e	/* bx lr */
+#endif
+
+#ifdef __thumb__
+#define	MODE		.thumb_func
+.macro PROLOGUE name
+	.code 16
+	bx	pc
+	nop	
+	.code 32
+SYM (.arm_start_of.\name):
+.endm
+#else
+#define	MODE		.code 32
+.macro PROLOGUE name
+.endm
+#endif
+	
+.macro FUNC_START name
+	.text
+	.align 2
+	MODE
+	.globl SYM (\name)
+	TYPE (\name)
+SYM (\name):
+	PROLOGUE \name
+.endm
+
+.macro FUNC_END name
+	RET
+	SIZE (\name)
+.endm
+	
+/* --------------------------------------------------------------------
+                 int setjmp (jmp_buf); 
+   -------------------------------------------------------------------- */
+	
+	FUNC_START setjmp
+
+	/* Save all the callee-preserved registers into the jump buffer.  */
+	stmea		a1!, { v1-v7, fp, ip, sp, lr }
+	
+#if 0	/* Simulator does not cope with FP instructions yet.  */
+#ifndef __SOFTFP__
+	/* Save the floating point registers.  */
+	sfmea		f4, 4, [a1]
+#endif
+#endif		
+	/* When setting up the jump buffer return 0.  */
+	mov		a1, #0
+
+	FUNC_END setjmp
+	
+/* --------------------------------------------------------------------
+		volatile void longjmp (jmp_buf, int);
+   -------------------------------------------------------------------- */
+	
+	FUNC_START longjmp
+
+	/* If we have stack extension code it ought to be handled here.  */
+	
+	/* Restore the registers, retrieving the state when setjmp() was called.  */
+	ldmfd		a1!, { v1-v7, fp, ip, sp, lr }
+	
+#if 0	/* Simulator does not cope with FP instructions yet.  */
+#ifndef __SOFTFP__
+	/* Restore floating point registers as well.  */
+	lfmfd		f4, 4, [a1]
+#endif
+#endif	
+	/* Put the return value into the integer result register.
+	   But if it is zero then return 1 instead.  */	
+	movs		a1, a2
+	moveq		a1, #1
+
+	FUNC_END longjmp
+
Index: newlib/libc/sys/arm/Makefile.am
===================================================================
RCS file: /cvs/src/src/newlib/libc/sys/arm/Makefile.am,v
retrieving revision 1.3
diff -u -p -r1.3 Makefile.am
--- newlib/libc/sys/arm/Makefile.am	8 Feb 2003 04:29:10 -0000	1.3
+++ newlib/libc/sys/arm/Makefile.am	7 Jun 2004 18:47:28 -0000
@@ -12,7 +12,7 @@ else
 extra_objs =
 endif
 
-lib_a_SOURCES = access.c libcfunc.c trap.S setjmp.S
+lib_a_SOURCES = libcfunc.c trap.S
 lib_a_LIBADD = $(extra_objs)
 lib_a_DEPENDENCIES = $(extra_objs)
 
Index: newlib/libc/sys/arm/Makefile.in
===================================================================
RCS file: /cvs/src/src/newlib/libc/sys/arm/Makefile.in,v
retrieving revision 1.8
diff -u -p -r1.8 Makefile.in
--- newlib/libc/sys/arm/Makefile.in	23 Jan 2004 21:37:37 -0000	1.8
+++ newlib/libc/sys/arm/Makefile.in	7 Jun 2004 18:47:28 -0000
@@ -91,7 +91,7 @@ noinst_LIBRARIES = lib.a
 @MAY_SUPPLY_SYSCALLS_TRUE@extra_objs = syscalls.o
 @MAY_SUPPLY_SYSCALLS_FALSE@extra_objs = 
 
-lib_a_SOURCES = access.c libcfunc.c trap.S setjmp.S
+lib_a_SOURCES = libcfunc.c trap.S
 lib_a_LIBADD = $(extra_objs)
 lib_a_DEPENDENCIES = $(extra_objs)
 
@@ -106,7 +106,7 @@ LIBRARIES =  $(noinst_LIBRARIES)
 DEFS = @DEFS@ -I. -I$(srcdir) 
 CPPFLAGS = @CPPFLAGS@
 LIBS = @LIBS@
-lib_a_OBJECTS =  access.o libcfunc.o trap.o setjmp.o
+lib_a_OBJECTS =  libcfunc.o trap.o
 CFLAGS = @CFLAGS@
 COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
 CCLD = $(CC)
Index: newlib/libc/sys/arm/access.c
===================================================================
RCS file: newlib/libc/sys/arm/access.c
diff -N newlib/libc/sys/arm/access.c
--- newlib/libc/sys/arm/access.c	12 Mar 2002 21:25:12 -0000	1.1
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,33 +0,0 @@
-/* This is file ACCESS.C */
-/*
- * Copyright (C) 1993 DJ Delorie
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms is permitted
- * provided that the above copyright notice and following paragraph are
- * duplicated in all such forms.
- *
- * This file is distributed WITHOUT ANY WARRANTY; without even the implied
- * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-#include <fcntl.h>
-#include <sys/stat.h>
-#include <unistd.h>
-
-int access(const char *fn, int flags)
-{
-  struct stat s;
-  if (stat(fn, &s))
-    return -1;
-  if (s.st_mode & S_IFDIR)
-    return 0;
-  if (flags & W_OK)
-  {
-    if (s.st_mode & S_IWRITE)
-      return 0;
-    return -1;
-  }
-  return 0;
-}
-	
Index: newlib/libc/sys/arm/setjmp.S
===================================================================
RCS file: newlib/libc/sys/arm/setjmp.S
diff -N newlib/libc/sys/arm/setjmp.S
--- newlib/libc/sys/arm/setjmp.S	30 Mar 2001 00:51:51 -0000	1.3
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,137 +0,0 @@
-/* This is a simple version of setjmp and longjmp.
-
-   Nick Clifton, Cygnus Solutions, 13 June 1997.  */
-
-/* ANSI concatenation macros.  */
-#define CONCAT(a, b)  CONCAT2(a, b)
-#define CONCAT2(a, b) a##b
-
-#ifndef __USER_LABEL_PREFIX__
-#error  __USER_LABEL_PREFIX__ not defined
-#endif
-
-#define SYM(x) CONCAT (__USER_LABEL_PREFIX__, x)
-
-#ifdef __ELF__
-#define TYPE(x) .type SYM(x),function
-#define SIZE(x) .size SYM(x), . - SYM(x)
-#else
-#define TYPE(x)
-#define SIZE(x)
-#endif
-
-/* Arm/Thumb interworking support:
-
-   The interworking scheme expects functions to use a BX instruction
-   to return control to their parent.  Since we need this code to work
-   in both interworked and non-interworked environments as well as with
-   older processors which do not have the BX instruction we do the 
-   following:
-	Test the return address.
-	If the bottom bit is clear perform an "old style" function exit.
-	(We know that we are in ARM mode and returning to an ARM mode caller).
-	Otherwise use the BX instruction to perform the function exit.
-
-   We know that we will never attempt to perform the BX instruction on 
-   an older processor, because that kind of processor will never be 
-   interworked, and a return address with the bottom bit set will never 
-   be generated.
-
-   In addition, we do not actually assemble the BX instruction as this would
-   require us to tell the assembler that the processor is an ARM7TDMI and
-   it would store this information in the binary.  We want this binary to be
-   able to be linked with binaries compiled for older processors however, so
-   we do not want such information stored there.  
-
-   If we are running using the APCS-26 convention however, then we never
-   test the bottom bit, because this is part of the processor status.  
-   Instead we just do a normal return, since we know that we cannot be 
-   returning to a Thumb caller - the Thumb does not support APCS-26.
-	
-   Function entry is much simpler.  If we are compiling for the Thumb we 
-   just switch into ARM mode and then drop through into the rest of the
-   function.  The function exit code will take care of the restore to
-   Thumb mode.  */
-
-#ifdef __APCS_26__
-#define RET	movs		pc, lr
-#else
-#define RET	tst		lr, #1; \
-	        moveq		pc, lr ; \
-.word           0xe12fff1e	/* bx lr */
-#endif
-
-#ifdef __thumb__
-#define	MODE		.thumb_func
-.macro PROLOGUE name
-	.code 16
-	bx	pc
-	nop	
-	.code 32
-SYM (.arm_start_of.\name):
-.endm
-#else
-#define	MODE		.code 32
-.macro PROLOGUE name
-.endm
-#endif
-	
-.macro FUNC_START name
-	.text
-	.align 2
-	MODE
-	.globl SYM (\name)
-	TYPE (\name)
-SYM (\name):
-	PROLOGUE \name
-.endm
-
-.macro FUNC_END name
-	RET
-	SIZE (\name)
-.endm
-	
-/* --------------------------------------------------------------------
-                 int setjmp (jmp_buf); 
-   -------------------------------------------------------------------- */
-	
-	FUNC_START setjmp
-
-	/* Save all the callee-preserved registers into the jump buffer.  */
-	stmea		a1!, { v1-v7, fp, ip, sp, lr }
-	
-#if 0	/* Simulator does not cope with FP instructions yet.  */
-#ifndef __SOFTFP__
-	/* Save the floating point registers.  */
-	sfmea		f4, 4, [a1]
-#endif
-#endif		
-	/* When setting up the jump buffer return 0.  */
-	mov		a1, #0
-
-	FUNC_END setjmp
-	
-/* --------------------------------------------------------------------
-		volatile void longjmp (jmp_buf, int);
-   -------------------------------------------------------------------- */
-	
-	FUNC_START longjmp
-
-	/* If we have stack extension code it ought to be handled here.  */
-	
-	/* Restore the registers, retrieving the state when setjmp() was called.  */
-	ldmfd		a1!, { v1-v7, fp, ip, sp, lr }
-	
-#if 0	/* Simulator does not cope with FP instructions yet.  */
-#ifndef __SOFTFP__
-	/* Restore floating point registers as well.  */
-	lfmfd		f4, 4, [a1]
-#endif
-#endif	
-	/* Put the return value into the integer result register.
-	   But if it is zero then return 1 instead.  */	
-	movs		a1, a2
-	moveq		a1, #1
-
-	FUNC_END longjmp
-

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