[patch] libgloss port to PowerPC in Xilinx FPGAs

Michael Geng gcc@michaelgeng.de
Fri Aug 24 16:29:00 GMT 2007


Hi,

attached is a patch which adds support for the PowerPC 405 hard core in
Xilinx Virtex2-Pro and Virtex4 FPGAs. It is not targeted to a specific
board. The only assumption on hardware is that the FPGA design implements
the Xilinx UARTLITE IP core.

You can download the full patch from http://www.michaelgeng.de/newlib/xilinx-powerpc.patch.
Attached is a the same patch with the changes on the configure and 
aclocal.m4 files removed. 

Any comments welcome!

Michael
-------------- next part --------------
diff -u -N -r newlib-1.15.0/libgloss/README newlib/libgloss/README
--- newlib-1.15.0/libgloss/README	2002-07-23 23:56:26.000000000 +0200
+++ newlib/libgloss/README	2007-08-16 13:04:45.155338900 +0200
@@ -4,3 +4,4 @@
 m68k	- Motorola MVME135 and IDP board. For CPU32 systems.
 pa	- WinBond and Oki boards with a PA.
 mips	- R3000 support. Array Tech LSI33k based RAID disk controller.
+xilinx-powerpc - PowerPC 405 hard core in a Xilinx Virtex2-Pro of Virtex4 FPGA
diff -u -N -r newlib-1.15.0/libgloss/configure.in newlib/libgloss/configure.in
--- newlib-1.15.0/libgloss/configure.in	2006-12-18 22:48:18.000000000 +0100
+++ newlib/libgloss/configure.in	2007-08-17 13:17:44.628346000 +0200
@@ -67,6 +67,7 @@
 	;;
   powerpc-*-*|powerpcle-*-*)
 	AC_CONFIG_SUBDIRS(rs6000)
+	AC_CONFIG_SUBDIRS(xilinx-powerpc)
 	config_testsuite=true
 	;;
   mn10200-*-*)
diff -u -N -r newlib-1.15.0/libgloss/doc/porting.texi newlib/libgloss/doc/porting.texi
--- newlib-1.15.0/libgloss/doc/porting.texi	2006-04-18 18:14:57.000000000 +0200
+++ newlib/libgloss/doc/porting.texi	2007-08-17 07:44:42.328585100 +0200
@@ -143,6 +143,7 @@
 * CPU32::                       Various m68k based targets.
 * Mips::                        Mips code based targets.
 * PA-RISC::                     Precision Risc Organization..
+* Xilinx-PowerPC::              PowerPC 405 hard core in a Xilinx Virtex2-Pro of Virtex4 FPGA
 @end menu
 
 @node Sparclite, CPU32, , Supported targets
@@ -206,7 +207,7 @@
 and should easily port to other versions of the pmon monitor. Pmon is
 distributed in source by LSI.
 
-@node PA-RISC, , Mips, Supported targets
+@node PA-RISC, Xilinx-PowerPC, Mips, Supported targets
 @subsection PA-RISC Targets Supported
 This supports the various boards manufactured by the HP-PRO consortium.
 This is a group of companies all making variations on the PA-RISC
@@ -232,6 +233,12 @@
 has never been tested with the output of GNU SOM, as this manual is
 mostly for Unix based systems. 
 
+@node Xilinx-PowerPC, , PA-RISC, Supported targets
+@subsection Xilinx-PowerPC Targets Supported
+Supports the PowerPC 405 hard core in Xilinx Virtex2-Pro and Virtex4
+FPGAs generally, not limited to a specific board. Read and write
+functions are available for the Xilinx UARTLITE IP core.
+
 @node Building libgloss, Board support, Supported targets, Libgloss
 @subsection Configuring and building libgloss.
 
diff -u -N -r newlib-1.15.0/libgloss/xilinx-powerpc/Makefile.in newlib/libgloss/xilinx-powerpc/Makefile.in
--- newlib-1.15.0/libgloss/xilinx-powerpc/Makefile.in	1970-01-01 01:00:00.000000000 +0100
+++ newlib/libgloss/xilinx-powerpc/Makefile.in	2007-08-17 12:09:54.000000000 +0200
@@ -0,0 +1,148 @@
+# Copyright (C) 2007 Michael Geng (gcc@michaelgeng.de)
+#
+# The authors hereby grant permission to use, copy, modify, distribute,
+# and license this software and its documentation for any purpose, provided
+# that existing copyright notices are retained in all copies and that this
+# notice is included verbatim in any distributions. No written agreement,
+# license, or royalty fee is required for any of the authorized uses.
+# Modifications to this software may be copyrighted by their authors
+# and need not follow the licensing terms described here, provided that
+# the new terms are clearly indicated on the first page of each file where
+# they apply.
+#
+
+DESTDIR =
+VPATH = @srcdir@:@srcdir@/..
+srcdir = @srcdir@
+objdir = .
+srcroot = $(srcdir)/../..
+objroot = $(objdir)/../..
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+host_alias = @host_alias@
+target_alias = @target_alias@
+
+bindir = @bindir@
+libdir = @libdir@
+tooldir = $(exec_prefix)/$(target_alias)
+
+# Multilib support variables.
+# TOP is used instead of MULTI{BUILD,SRC}TOP.
+MULTIDIRS =
+MULTISUBDIR =
+MULTIDO = true
+MULTICLEAN = true
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+
+SHELL =	/bin/sh
+
+CC = @CC@
+
+AS = @AS@
+AR = @AR@
+LD = @LD@
+RANLIB = @RANLIB@
+OBJDUMP = @OBJDUMP@
+OBJCOPY = @OBJCOPY@
+
+OBJS	  = _exit.o close.o errno.o fstat.o isatty.o lseek.o sbrk.o read.o write.o \
+            getpid.o kill.o unlink.o print.o putnum.o debug.o
+CFLAGS	  = -g -mcpu=405
+
+UARTLITE_SCRIPTS = uartlite.ld
+UARTLITE_CRT0    = xilinx-powerpc-crt0.o
+UARTLITE_BSP	 = libuartlite.a
+UARTLITE_OBJS	 = uartlite-inbyte.o uartlite-outbyte.o
+UARTLITE_TEST	 = uartlite-test
+UARTLITE_INSTALL = install-uartlite
+
+# Host specific makefile fragment comes in here.
+@host_makefile_frag@
+
+all:	${UARTLITE_CRT0} ${UARTLITE_BSP}
+
+${UARTLITE_BSP}: ${OBJS} ${UARTLITE_OBJS}
+	${AR} ${ARFLAGS} $@ ${OBJS} ${UARTLITE_OBJS}
+	${RANLIB} $@
+
+#
+# here's where we build the test programs for each target
+#
+.PHONY: test
+test:	${UARTLITE_TEST}
+
+uartlite-test: uartlite-test.x uartlite-test.dis uartlite-test.srec
+
+uartlite-test.x: test.o __init.o ${UARTLITE_CRT0} ${UARTLITE_BSP}
+	${CC} ${LDFLAGS_FOR_TARGET} ${UARTLITE_LDFLAGS} -L${objdir} \
+	test.o __init.o ${UARTLITE_CRT0} ${LIBS_FOR_TARGET} -lc ${UARTLITE_BSP} \
+	-T${srcdir}/uartlite.ld \
+	-o uartlite-test.x
+
+uartlite-test.dis: uartlite-test.x
+	${OBJDUMP} -d uartlite-test.x > uartlite-test.dis
+
+uartlite-test.srec: uartlite-test.x
+	${OBJCOPY} -O srec uartlite-test.x uartlite-test.srec
+
+#
+#
+#
+
+xilinx-powerpc-crt0.o: xilinx-powerpc-crt0.S
+
+uartlite-inbyte.o:  uartlite-inbyte.c  uartlite.h
+uartlite-outbyte.o: uartlite-outbyte.c uartlite.h
+
+sbrk.o:   sbrk.c
+errno.o:  errno.c
+_exit.o:  _exit.c
+__init.o: __init.c
+read.o:   ../read.c
+write.o:  ../write.c
+close.o:  ../close.c
+fstat.o:  ../fstat.c
+isatty.o: ../isatty.c
+lseek.o:  ../lseek.c
+getpid.o: ../getpid.c
+kill.o:   ../kill.c
+unlink.o: ../unlink.c
+print.o:  ../print.c
+putnum.o: ../putnum.c
+debug.o:  ../debug.c
+
+# Don't optimize when compiling the test program, makes confusion in
+# the debugger.
+
+test.o:	$(srcdir)/test.c
+	$(CC) -g $(CFLAGS_MRELOCATABLE) $(INCLUDES) -c $(CFLAGS) $<
+
+clean mostlyclean:
+	rm -f a.out core *.i *.o *-test *.srec *.dis *.x
+
+distclean maintainer-clean realclean: clean
+	rm -f Makefile config.status *~
+
+.PHONY: install info install-info clean-info
+install: ${UARTLITE_INSTALL}
+
+install-uartlite:
+	set -e; for x in ${UARTLITE_BSP}; do ${INSTALL_DATA} $$x $(DESTDIR)${tooldir}/lib${MULTISUBDIR}/$$x; done
+	set -e; for x in ${UARTLITE_SCRIPTS}; do ${INSTALL_DATA} $(srcdir)/$$x $(DESTDIR)${tooldir}/lib${MULTISUBDIR}/$$x; done
+	set -e; for x in ${UARTLITE_CRT0}; do ${INSTALL_DATA} $$x $(DESTDIR)${tooldir}/lib${MULTISUBDIR}/$$x; done
+
+doc:
+info:
+install-info:
+clean-info:
+
+Makefile: Makefile.in config.status @host_makefile_frag_path@
+	$(SHELL) config.status
+
+config.status: configure
+	$(SHELL) config.status --recheck
diff -u -N -r newlib-1.15.0/libgloss/xilinx-powerpc/README newlib/libgloss/xilinx-powerpc/README
--- newlib-1.15.0/libgloss/xilinx-powerpc/README	1970-01-01 01:00:00.000000000 +0100
+++ newlib/libgloss/xilinx-powerpc/README	2007-08-17 11:25:39.000000000 +0200
@@ -0,0 +1,20 @@
+Introduction
+============
+
+This is a port to the PowerPC 405 hard core in Xilinx Virtex2-Pro of Virtex4 FPGAs.
+
+Requirements on the FPGA design
+===============================
+
+You must have a UARTLITE IP core implemented in your FPGA design. Its base address 
+must match the _uartlite_start definition in the linker script.
+
+Low level read/write
+====================
+
+Low level read and write functions are available for the Xilinx UARTLITE IP core.
+They are as simple as possible, no complicated buffers, simply blocking read and 
+write functions. Baud rate, parity etc. are hard coded and configured in the FPGA 
+design, the software can't change it.
+
+Michael (gcc@michaelgeng.de)
diff -u -N -r newlib-1.15.0/libgloss/xilinx-powerpc/__init.c newlib/libgloss/xilinx-powerpc/__init.c
--- newlib-1.15.0/libgloss/xilinx-powerpc/__init.c	1970-01-01 01:00:00.000000000 +0100
+++ newlib/libgloss/xilinx-powerpc/__init.c	2007-08-16 14:22:36.000000000 +0200
@@ -0,0 +1,5 @@
+/* eabi.S calls __init() in order to do any C++ global constructors. No need to do anything
+   in a C program. Provide a dummy function in order to satisfy the linker. */
+void __init(void)
+{
+}
diff -u -N -r newlib-1.15.0/libgloss/xilinx-powerpc/_exit.c newlib/libgloss/xilinx-powerpc/_exit.c
--- newlib-1.15.0/libgloss/xilinx-powerpc/_exit.c	1970-01-01 01:00:00.000000000 +0100
+++ newlib/libgloss/xilinx-powerpc/_exit.c	2007-08-16 14:22:36.000000000 +0200
@@ -0,0 +1,26 @@
+/* 
+ * Copyright (C) 2007 Michael Geng (gcc@michaelgeng.de)
+ *
+ * The authors hereby grant permission to use, copy, modify, distribute,
+ * and license this software and its documentation for any purpose, provided
+ * that existing copyright notices are retained in all copies and that this
+ * notice is included verbatim in any distributions. No written agreement,
+ * license, or royalty fee is required for any of the authorized uses.
+ * Modifications to this software may be copyrighted by their authors
+ * and need not follow the licensing terms described here, provided that
+ * the new terms are clearly indicated on the first page of each file where
+ * they apply.
+ */
+
+#include <limits.h>
+
+void _exit(int rc)
+{
+  /* Default stub just causes a divide by 0 exception.  */
+  int x = rc / INT_MAX;
+  x = 4 / x;
+
+  /* Convince GCC that this function never returns.  */
+  for (;;)
+    ;
+}
diff -u -N -r newlib-1.15.0/libgloss/xilinx-powerpc/configure.ac newlib/libgloss/xilinx-powerpc/configure.ac
--- newlib-1.15.0/libgloss/xilinx-powerpc/configure.ac	1970-01-01 01:00:00.000000000 +0100
+++ newlib/libgloss/xilinx-powerpc/configure.ac	2007-08-17 11:09:10.000000000 +0200
@@ -0,0 +1,73 @@
+/* 
+ * Copyright (C) 2007 Michael Geng (gcc@michaelgeng.de)
+ *
+ * The authors hereby grant permission to use, copy, modify, distribute,
+ * and license this software and its documentation for any purpose, provided
+ * that existing copyright notices are retained in all copies and that this
+ * notice is included verbatim in any distributions. No written agreement,
+ * license, or royalty fee is required for any of the authorized uses.
+ * Modifications to this software may be copyrighted by their authors
+ * and need not follow the licensing terms described here, provided that
+ * the new terms are clearly indicated on the first page of each file where
+ * they apply.
+ */
+
+dnl Process this file with autoconf to produce a configure script.
+AC_PREREQ(2.61)
+AC_INIT(xilinx-powerpc-crt0.S)
+
+if test "${enable_shared}" = "yes" ; then
+	echo "Shared libraries not supported for cross compiling, ignored"
+fi
+
+if test "$srcdir" = "." ; then
+	if test "${with_target_subdir}" != "." ; then
+		libgloss_topdir="${srcdir}/${with_multisrctop}../../.."
+	else
+		libgloss_topdir="${srcdir}/${with_multisrctop}../.."
+	fi
+else
+	libgloss_topdir="${srcdir}/../.."
+fi
+AC_CONFIG_AUX_DIR($libgloss_topdir)
+
+AC_CANONICAL_SYSTEM
+AC_ARG_PROGRAM
+
+AC_PROG_INSTALL
+
+LIB_AC_PROG_CC
+
+AS=${AS-as}
+AC_SUBST(AS)
+AR=${AR-ar}
+AC_SUBST(AR)
+LD=${LD-ld}
+AC_SUBST(LD)
+AC_PROG_RANLIB
+OBJCOPY=${OBJCOPY-objcopy}
+AC_SUBST(OBJCOPY)
+OBJDUMP=${OBJDUMP-objdump}
+AC_SUBST(OBJDUMP)
+LIB_AM_PROG_AS
+
+host_makefile_frag=${srcdir}/../config/ppc.mh
+
+dnl We have to assign the same value to other variables because autoconf
+dnl doesn't provide a mechanism to substitute a replacement keyword with
+dnl arbitrary data or pathnames.
+dnl
+host_makefile_frag_path=$host_makefile_frag
+AC_SUBST(host_makefile_frag_path)
+AC_SUBST_FILE(host_makefile_frag)
+
+AC_CONFIG_FILES(Makefile,
+. ${libgloss_topdir}/config-ml.in,
+srcdir=${srcdir}
+target=${target}
+with_multisubdir=${with_multisubdir}
+ac_configure_args="${ac_configure_args} --enable-multilib"
+CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+libgloss_topdir=${libgloss_topdir}
+)
+AC_OUTPUT
diff -u -N -r newlib-1.15.0/libgloss/xilinx-powerpc/errno.c newlib/libgloss/xilinx-powerpc/errno.c
--- newlib-1.15.0/libgloss/xilinx-powerpc/errno.c	1970-01-01 01:00:00.000000000 +0100
+++ newlib/libgloss/xilinx-powerpc/errno.c	2007-08-16 14:22:36.000000000 +0200
@@ -0,0 +1 @@
+int __errno;
diff -u -N -r newlib-1.15.0/libgloss/xilinx-powerpc/sbrk.c newlib/libgloss/xilinx-powerpc/sbrk.c
--- newlib-1.15.0/libgloss/xilinx-powerpc/sbrk.c	1970-01-01 01:00:00.000000000 +0100
+++ newlib/libgloss/xilinx-powerpc/sbrk.c	2007-08-16 14:22:36.000000000 +0200
@@ -0,0 +1,41 @@
+/* 
+ * Copyright (C) 2007 Michael Geng (gcc@michaelgeng.de)
+ *
+ * The authors hereby grant permission to use, copy, modify, distribute,
+ * and license this software and its documentation for any purpose, provided
+ * that existing copyright notices are retained in all copies and that this
+ * notice is included verbatim in any distributions. No written agreement,
+ * license, or royalty fee is required for any of the authorized uses.
+ * Modifications to this software may be copyrighted by their authors
+ * and need not follow the licensing terms described here, provided that
+ * the new terms are clearly indicated on the first page of each file where
+ * they apply.
+ */
+
+#include <errno.h>
+#include <sys/stat.h>
+
+void *sbrk (ptrdiff_t size)
+{
+  /*
+  * The following two memory locations should be defined in the linker script file
+  */
+  extern const char _heap_start; /* start of heap */
+  extern const char _heap_max;   /* end of heap (maximum value of heap_ptr) */
+
+  static const char * heap_ptr = &_heap_start;  /* pointer to head of heap */
+  const char * old_heap_ptr;
+
+  old_heap_ptr = heap_ptr;
+
+  if ((heap_ptr + size) > &_heap_max)
+  { 
+    /* top of heap is bigger than _heap_max */
+    errno = ENOMEM;
+    return (void *) -1;
+  }
+
+  /* success: update heap_ptr and return previous value */
+  heap_ptr += size;
+  return (void *)old_heap_ptr;
+}
diff -u -N -r newlib-1.15.0/libgloss/xilinx-powerpc/test.c newlib/libgloss/xilinx-powerpc/test.c
--- newlib-1.15.0/libgloss/xilinx-powerpc/test.c	1970-01-01 01:00:00.000000000 +0100
+++ newlib/libgloss/xilinx-powerpc/test.c	2007-08-16 14:22:36.000000000 +0200
@@ -0,0 +1,25 @@
+/* 
+ * Copyright (C) 2007 Michael Geng (gcc@michaelgeng.de)
+ *
+ * The authors hereby grant permission to use, copy, modify, distribute,
+ * and license this software and its documentation for any purpose, provided
+ * that existing copyright notices are retained in all copies and that this
+ * notice is included verbatim in any distributions. No written agreement,
+ * license, or royalty fee is required for any of the authorized uses.
+ * Modifications to this software may be copyrighted by their authors
+ * and need not follow the licensing terms described here, provided that
+ * the new terms are clearly indicated on the first page of each file where
+ * they apply.
+ */
+
+#include <stdio.h>
+
+main()
+{
+  char buf[100];
+
+  printf("Enter a string and press return: ");
+  scanf("%s", buf);
+  printf("\nYou entered %s\n", buf);
+  printf("Good bye!\n", buf);
+}
diff -u -N -r newlib-1.15.0/libgloss/xilinx-powerpc/uartlite-inbyte.c newlib/libgloss/xilinx-powerpc/uartlite-inbyte.c
--- newlib-1.15.0/libgloss/xilinx-powerpc/uartlite-inbyte.c	1970-01-01 01:00:00.000000000 +0100
+++ newlib/libgloss/xilinx-powerpc/uartlite-inbyte.c	2007-08-16 14:22:36.000000000 +0200
@@ -0,0 +1,31 @@
+/* 
+ * Copyright (C) 2007 Michael Geng (gcc@michaelgeng.de)
+ *
+ * The authors hereby grant permission to use, copy, modify, distribute,
+ * and license this software and its documentation for any purpose, provided
+ * that existing copyright notices are retained in all copies and that this
+ * notice is included verbatim in any distributions. No written agreement,
+ * license, or royalty fee is required for any of the authorized uses.
+ * Modifications to this software may be copyrighted by their authors
+ * and need not follow the licensing terms described here, provided that
+ * the new terms are clearly indicated on the first page of each file where
+ * they apply.
+ */
+
+#include "uartlite.h"
+
+/**
+reads one single character from the receive fifo of the Xilinx UARTLITE. Waits forever if
+it is empty.
+*
+* @return Received character converted to an int.
+*/
+int inbyte(void)
+{
+  /* Wait until valid data is available from the receive fifo.
+     This is a simple implementation it this makes this a blocking function. */
+  while ((*(volatile int *)(&_uartlite_start + STATUS_REG_OFFSET) & RX_FIFO_VALID_DATA) == 0);
+
+  /* Read one character from the receive fifo and pass it as a return value. */
+  return *(int *)(&_uartlite_start + RX_FIFO_OFFSET);
+}
diff -u -N -r newlib-1.15.0/libgloss/xilinx-powerpc/uartlite-outbyte.c newlib/libgloss/xilinx-powerpc/uartlite-outbyte.c
--- newlib-1.15.0/libgloss/xilinx-powerpc/uartlite-outbyte.c	1970-01-01 01:00:00.000000000 +0100
+++ newlib/libgloss/xilinx-powerpc/uartlite-outbyte.c	2007-08-16 14:22:36.000000000 +0200
@@ -0,0 +1,33 @@
+/* 
+ * Copyright (C) 2007 Michael Geng (gcc@michaelgeng.de)
+ *
+ * The authors hereby grant permission to use, copy, modify, distribute,
+ * and license this software and its documentation for any purpose, provided
+ * that existing copyright notices are retained in all copies and that this
+ * notice is included verbatim in any distributions. No written agreement,
+ * license, or royalty fee is required for any of the authorized uses.
+ * Modifications to this software may be copyrighted by their authors
+ * and need not follow the licensing terms described here, provided that
+ * the new terms are clearly indicated on the first page of each file where
+ * they apply.
+ */
+
+#include "uartlite.h"
+
+/**
+Writes one single character to the transmit fifo of the Xilinx UARTLITE. 
+*
+* @return Always 0 
+*/
+int outbyte(char c)
+{
+  /* Wait until transmit fifo is not full.
+     This is a simple implementation because it avoids the requirement to implement a software
+     buffer but this makes it a blocking function. */
+  while (*(volatile int *)(&_uartlite_start + STATUS_REG_OFFSET) & TX_FIFO_FULL);
+
+  /* Write character to TX fifo */
+  *(char *)(&_uartlite_start + TX_FIFO_OFFSET) = c;
+
+  return(0);
+}
diff -u -N -r newlib-1.15.0/libgloss/xilinx-powerpc/uartlite.h newlib/libgloss/xilinx-powerpc/uartlite.h
--- newlib-1.15.0/libgloss/xilinx-powerpc/uartlite.h	1970-01-01 01:00:00.000000000 +0100
+++ newlib/libgloss/xilinx-powerpc/uartlite.h	2007-08-16 14:22:36.000000000 +0200
@@ -0,0 +1,24 @@
+/* 
+ * Copyright (C) 2007 Michael Geng (gcc@michaelgeng.de)
+ *
+ * The authors hereby grant permission to use, copy, modify, distribute,
+ * and license this software and its documentation for any purpose, provided
+ * that existing copyright notices are retained in all copies and that this
+ * notice is included verbatim in any distributions. No written agreement,
+ * license, or royalty fee is required for any of the authorized uses.
+ * Modifications to this software may be copyrighted by their authors
+ * and need not follow the licensing terms described here, provided that
+ * the new terms are clearly indicated on the first page of each file where
+ * they apply.
+ */
+
+/* register offsets */
+#define RX_FIFO_OFFSET      0
+#define TX_FIFO_OFFSET      4
+#define STATUS_REG_OFFSET   8
+#define CONTROL_REG_OFFSET 12
+
+/* status register bit positions */
+#define TX_FIFO_FULL       0x08
+#define RX_FIFO_VALID_DATA 0x01
+extern const char _uartlite_start;  /* UARTLITE start address, define it in your linker script */
diff -u -N -r newlib-1.15.0/libgloss/xilinx-powerpc/uartlite.ld newlib/libgloss/xilinx-powerpc/uartlite.ld
--- newlib-1.15.0/libgloss/xilinx-powerpc/uartlite.ld	1970-01-01 01:00:00.000000000 +0100
+++ newlib/libgloss/xilinx-powerpc/uartlite.ld	2007-08-17 09:36:49.000000000 +0200
@@ -0,0 +1,128 @@
+/* 
+ * Copyright (C) 2007 Michael Geng (gcc@michaelgeng.de)
+ *
+ * The authors hereby grant permission to use, copy, modify, distribute,
+ * and license this software and its documentation for any purpose, provided
+ * that existing copyright notices are retained in all copies and that this
+ * notice is included verbatim in any distributions. No written agreement,
+ * license, or royalty fee is required for any of the authorized uses.
+ * Modifications to this software may be copyrighted by their authors
+ * and need not follow the licensing terms described here, provided that
+ * the new terms are clearly indicated on the first page of each file where
+ * they apply.
+ *
+ * Example linker script for a PowerPC 405 in a Xilinx Virtex2-Pro or Virtex4 FPGA design
+ * with a Xilinx UARTLITE
+ */
+
+STACK_SIZE = 4k;
+HEAP_SIZE = 256k;
+
+MEMORY
+{
+   /* FPGA external asynchronous static RAM */
+   sram  : ORIGIN = 0x00000000, LENGTH = 256k
+
+   /* FPGA internal block RAM */
+   bram  : ORIGIN = 0xfffa0000, LENGTH = 256k + 128k - 4
+   boot  : ORIGIN = 0xfffffffc, LENGTH = 4
+
+   /* UART (serial port hardware) */
+   uartlite : ORIGIN = 0xA0000000, LENGTH = 16
+
+   /* debug symbols */
+   debug : ORIGIN = 0x10000000, LENGTH = 1M
+}
+
+SECTIONS
+{
+   .text  : { *(.text)  } > bram
+
+   .sdata : 
+   {
+      PROVIDE (_SDA_BASE_ = 32768);
+      *(.data*)
+   } > bram
+
+   .sbss :
+   {
+      PROVIDE (__sbss_start = .);
+      *(.sbss)
+      PROVIDE (__sbss_end = .);
+   } > bram
+   _end = . ;
+   PROVIDE (__SBSS_END__ = .);
+
+   .sbss2 :
+   {
+      PROVIDE (__sbss2_start = .);
+      *(.sbss)
+      PROVIDE (__sbss2_end = .);
+   } > bram
+   PROVIDE (__SBSS2_END__ = .);
+
+   .bss  : 
+   { 
+      PROVIDE (__bss_start = .);
+      *(.bss) 
+      PROVIDE (__bss_end = .);
+
+      . = . + STACK_SIZE;
+      PROVIDE(__stack = .);
+   } > bram
+
+   PROVIDE (__SDATA_START__ = .);
+   .sdata : { 
+      *(.sdata) 
+   } > bram
+
+   PROVIDE (__SDATA2_START__ = .);
+   .sdata2 : { 
+      PROVIDE (_SDA2_BASE_ = 32768);
+      *(.sdata2) 
+   } > bram
+
+   PROVIDE (__GOT_START__ = .);
+   .got : { *(.got) } > bram
+   PROVIDE (__GOT_END__ = .);
+
+   PROVIDE (__GOT2_START__ = .);
+   .got2 : { *(.got2) } > bram
+   PROVIDE (__GOT2_END__ = .);
+
+   PROVIDE (__FIXUP_START__ = .);
+   .fixup : { *(.fixup) } > bram
+   PROVIDE (__FIXUP_END__ = .);
+
+   PROVIDE (__CTOR_LIST__ = .);
+   .ctors : { *(.ctors) } > bram
+   PROVIDE (__CTOR_END__ = .);
+
+   PROVIDE (__DTOR_LIST__ = .);
+   .dtors : { *(.dtors) } > bram
+   PROVIDE (__DTOR_END__ = .);
+
+   PROVIDE (__EXCEPT_START__ = .);
+   .gcc_except_table : { *(.gcc_except_table) } > bram
+   PROVIDE (__EXCEPT_END__ = .);
+
+   .eh_frame : { *(.eh_frame) } > bram
+   .rela     : { *(.rela*)    } > bram
+   .rodata   : { *(.rodata*)  } > bram
+
+   .boot     : { *(.boot)     } > boot
+
+   sram :
+   { 
+      PROVIDE(_heap_start = .);
+      . = . + HEAP_SIZE - 1;
+      PROVIDE(_heap_max = .);
+   } > sram
+
+   uartlite : 
+   { 
+      PROVIDE(_uartlite_start = .);
+   } > uartlite
+
+   .debug : { *(.stabstr) *(.comment) *(.stab) } > debug
+}
diff -u -N -r newlib-1.15.0/libgloss/xilinx-powerpc/xilinx-powerpc-crt0.S newlib/libgloss/xilinx-powerpc/xilinx-powerpc-crt0.S
--- newlib-1.15.0/libgloss/xilinx-powerpc/xilinx-powerpc-crt0.S	1970-01-01 01:00:00.000000000 +0100
+++ newlib/libgloss/xilinx-powerpc/xilinx-powerpc-crt0.S	2007-08-17 10:52:31.000000000 +0200
@@ -0,0 +1,127 @@
+/* 
+ * Copyright (C) 2007 Michael Geng (gcc@michaelgeng.de)
+ *
+ * The authors hereby grant permission to use, copy, modify, distribute,
+ * and license this software and its documentation for any purpose, provided
+ * that existing copyright notices are retained in all copies and that this
+ * notice is included verbatim in any distributions. No written agreement,
+ * license, or royalty fee is required for any of the authorized uses.
+ * Modifications to this software may be copyrighted by their authors
+ * and need not follow the licensing terms described here, provided that
+ * the new terms are clearly indicated on the first page of each file where
+ * they apply.
+ *
+ * startup file for a PowerPC 405 hard core in a Xilinx Virtex2-Pro or Virtex4 FPGA
+ */
+
+#include "ppc-asm.h"
+
+	.section ".got2","aw"
+
+.LCTOC1 = .+32768
+
+	.extern	FUNC_NAME(atexit)
+	.globl	FUNC_NAME(__atexit)
+	.section ".sdata","aw"
+FUNC_NAME(__atexit):			/* tell C's eabi-ctor's we have an atexit function */
+	.long	FUNC_NAME(atexit)@fixup	/* and that it is to register __do_global_dtors */
+
+	.section ".fixup","aw"
+	.long	FUNC_NAME(__atexit)
+
+	.section ".got2","aw"
+.Ltable = .-.LCTOC1
+	.long	.LCTOC1			/* address we think .LCTOC1 is loaded at */
+
+.Lsbss_start = .-.LCTOC1
+	.long	__sbss_start
+
+.Lsbss_end = .-.LCTOC1
+	.long	__sbss_end
+
+.Lbss_start = .-.LCTOC1
+	.long	__bss_start
+
+.Lend = .-.LCTOC1
+	.long	_end
+
+.Lstack = .-.LCTOC1			/* stack address if set by user */
+	.long	__stack
+
+	.text
+.Lptr:
+	.long .LCTOC1-.Laddr
+
+_start:
+	bl	.Laddr			/* get current address */
+.Laddr:
+	mflr	r4			/* real address of .Laddr */
+	lwz	r5,(.Lptr-.Laddr)(r4)	/* linker generated address of .LCTOC1 */
+	add	r5,r5,r4		/* correct to real pointer */
+	lwz	r4,.Ltable(r5)		/* get linker's idea of where .Laddr is */
+	subf	r4,r4,r5		/* calculate difference between where linked and current */
+
+	/* clear bss and sbss */
+	lwz	r6,.Lbss_start(r5)	/* calculate beginning of the BSS */
+	lwz	r7,.Lend(r5)		/* calculate end of the BSS */
+	add	r6,r6,r4		/* adjust pointers */
+	add	r7,r7,r4
+
+	cmplw	1,r6,r7
+	bc	4,4,.Ldone1
+
+	subf	r8,r6,r7		/* number of bytes to zero */
+	srwi	r9,r8,2			/* number of words to zero */
+	mtctr	r9
+	li	r0,0			/* zero to clear memory */
+	addi	r6,r6,-4		/* adjust so we can use stwu */
+.Lloop:
+	stwu	r0,4(r6)		/* zero bss */
+	bdnz	.Lloop
+
+.Ldone1:
+
+	lwz	r6,.Lsbss_start(r5)	/* calculate beginning of the SBSS */
+	lwz	r7,.Lsbss_end(r5)	/* calculate end of the SBSS */
+	add	r6,r6,r4		/* adjust pointers */
+	add	r7,r7,r4
+
+	cmplw	1,r6,r7
+	bc	4,4,.Ldone
+
+	subf	r8,r6,r7		/* number of bytes to zero */
+	srwi	r9,r8,2			/* number of words to zero */
+	mtctr	r9
+	li	r0,0			/* zero to clear memory */
+	addi	r6,r6,-4		/* adjust so we can use stwu */
+.Lloop2:
+	stwu	r0,4(r6)		/* zero bss */
+	bdnz	.Lloop2
+
+.Ldone:
+
+	lwz	r0,.Lstack(r5)		/* stack address or 0 */
+	cmplwi	1,r0,0			/* equal to 0? */
+	bc	12,6,.Lnostack		/* use default stack if == 0 */
+	mr	sp,r0			/* use user defined stack */
+
+.Lnostack:
+	/* set up initial stack frame */
+	addi	sp,sp,-4		/* make sure we don't overwrite debug mem */
+	lis	r0,0
+	stw	r0,0(sp)		/* clear back chain */
+	stwu	sp,-64(sp)		/* push another stack frame */
+
+	/* Let her rip */
+	bl	FUNC_NAME(main)
+
+	/* return value from main is argument to exit */
+	bl	FUNC_NAME(exit)
+	trap
+.Lstart:
+	.size	_start,.Lstart-_start
+
+.section .boot,"ax"
+_boot:
+	/* this is the very first instruction after power up */
+	b _start


More information about the Newlib mailing list