This is the mail archive of the newlib@sourceware.org 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]

[PATCH] Add Blackfin support in newlib (try 3) (was Re: [PATCH] Add Blackfin support in newlib (try 2))


Hi all,

Here is a third patch for adding Blackfin support in newlib. I should send it out sooner. But I was waiting for Bernd's opinion without knowing he's on vocation.

This patch has fixed these more issues:

Michael Ambrus wrote:
> Jeff Johnston wrote:
>> I forgot another issue. The bfin processor should be using
>> underscored cpu macros from the compiler. That is, you should be
>> looking for __BFIN__ or __bfin__ inside newlib header files: not "BFIN"
>> or "bfin". The latter two are in the user's namespace.
>
> Michael Ambrus wrote:
>>
>> - The usage of the predefined BFIN macro in machine/ieeefp.h will lead
>> to the same compiling issues as mentioned in:
>> http://sourceware.org/ml/newlib/2006/msg00787.html
>> http://sourceware.org/ml/newlib/2006/msg00791.html
>
> As for these two macros, they were in our CVS(*) long long ago. I admit
> they look weird and uncommon. But considering they have been used in
> many code in such long time, we have to estimate its impact before doing
> any change.

In private emails, Michael helped me to reproduce it on my machine. So I can take a close look at it. The fix is to use builtin_define_std instead of builtin_define for bfin and BFIN. The patch:

<http://gcc.gnu.org/ml/gcc-patches/2006-10/msg01349.html>

It's still waiting for Bernd's OK to go into GCC SVN. (He's on a two weeks vocation now.)

> Michael Ambrus wrote:
>>
>> - Both setjmp and longjmp are lacking (or according to the current gcc
>> release, it's rather _setjmp and _longjmp). If your application or
>> Newlib (or other libraries) don't need them, the build will pass
>> however.
>>
>> - The implementation of ___sigsetjmp is not needed. If I'm not
>> mistaken, sigsetjmp and siglongjmp are wrapped around setjmp and
>> longjmp macros in machine/setjmp.h.
>
Done! _setjmp and _longjmp have been defined. ___sigsetjmp has been removed.


So the the only one comment I have not done is


Jeff Johnston wrote:
>   For your libc/machine/bfin Makefile.am, please look at the
> libc/machine/fr30 directory.  You should base your Makefile.am on that
> (adding any other files to lib_a_SOURCES).  This sets some flags needed
> to ensure compilation flags are passed properly down from the top-level.

Jeff,

Do you means define AM_CCASFLAGS, lib_a_CCASFLAGS and lib_a_CFLAGS as in fr30?

I found I need automake 1.9.5 to generate Makefile.in. Is it in plan to update newlib to use automake 1.9.6?


Thanks, Jie
	toplevel/
	* configure.in: Remove target-libgloss from noconfigdirs for
	bfin-*-*.

	libgloss/
	* bfin/aclocal.m4: Generate.
	* bfin/configure.in: New.
	* bfin/configure: Generate.
	* bfin/crt0.S: New.
	* bfin/Makefile.in: New.
	* bfin/syscalls.c: New.
	* configure.in: Add support for bfin-*-*.
	* configure: Regenerate.

	newlib/
	* configure.host: Add support for bfin.
	* libc/include/machine/ieeefp.h: Define __IEEE_LITTLE_ENDIAN for bfin.
	* libc/include/machine/setjmp.h: Define _JBLEN for bfin.
	* libc/machine/bfin/access.c: New.
	* libc/machine/bfin/aclocal.m4: Generate.
	* libc/machine/bfin/configure.in: New.
	* libc/machine/bfin/configure: Generate.
	* libc/machine/bfin/Makefile.am: New.
	* libc/machine/bfin/Makefile.in: Generate.
	* libc/machine/bfin/setjmp.S: New.
	* libc/machine/bfin/longjmp.S: New.
	* libc/machine/bfin/sys/syscall.h: New.
	* libc/machine/configure.in: Add bfin support.
	* libc/machine/configure: Generate.

diff -r -u -p -N -x CVS newlib-orig/src/configure.in newlib/src/configure.in
--- newlib-orig/src/configure.in	2006-10-11 00:50:34.000000000 +0800
+++ newlib/src/configure.in	2006-10-21 02:43:05.000000000 +0800
@@ -507,7 +507,7 @@ case "${target}" in
     noconfigdirs="$noconfigdirs target-libiberty target-libstdc++-v3 ${libgcj}"
     ;;
   bfin-*-*)
-    noconfigdirs="$noconfigdirs target-libgloss gdb"
+    noconfigdirs="$noconfigdirs gdb"
     if test x${is_cross_compiler} != xno ; then
       target_configdirs="${target_configdirs} target-bsp target-cygmon"
     fi
diff -r -u -p -N -x CVS newlib-orig/src/libgloss/bfin/configure.in newlib/src/libgloss/bfin/configure.in
--- newlib-orig/src/libgloss/bfin/configure.in	1970-01-01 08:00:00.000000000 +0800
+++ newlib/src/libgloss/bfin/configure.in	2006-10-21 02:43:05.000000000 +0800
@@ -0,0 +1,54 @@
+dnl Process this file with autoconf to produce a configure script.
+AC_PREREQ(2.59)
+AC_INIT(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
+LIB_AM_PROG_AS
+
+host_makefile_frag=${srcdir}/../config/default.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 -r -u -p -N -x CVS newlib-orig/src/libgloss/bfin/crt0.S newlib/src/libgloss/bfin/crt0.S
--- newlib-orig/src/libgloss/bfin/crt0.S	1970-01-01 08:00:00.000000000 +0800
+++ newlib/src/libgloss/bfin/crt0.S	2006-10-21 02:43:05.000000000 +0800
@@ -0,0 +1,72 @@
+/*
+ * crt0.S for the Blackfin processor
+ *
+ * Copyright (C) 2006 Analog Devices, Inc.
+ *
+ * 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.
+ */
+
+	.text
+	.align 	2
+
+	.global	__start
+__start:
+
+	/* Start by setting up a stack */
+	link 0xc;
+	/* Zero the memory in the .bss section.  */
+
+	p0.l = __edata;
+	p0.h = __edata;
+	p1.l = __end;
+	p1.h = __end;
+	p1 -= p0;
+	r0 = 0;
+	lsetup (L$L$clear_bss, L$L$clear_bss) lc0 = p1;
+L$L$clear_bss:
+	B [p0++] = r0;
+
+#ifdef __BFIN_FDPIC__
+	/* Set up GOT pointer.  */
+	P0.L = __ROFIXUP_END__;
+	P0.H = __ROFIXUP_END__;
+	P4 = [P0 - 4];
+#endif
+
+	/* Need to set up standard file handles */
+	/*  Parse string at r1 */
+
+	p0.l = __init;
+	p0.h = __init; 
+	P3 = P4; 
+	call	(p0)
+
+	p0.l = _atexit;
+	p0.h = _atexit;
+#ifdef __BFIN_FDPIC__
+	r0 = [P4 + __fini@FUNCDESC_GOT17M4]  ; 
+	P3 = P4; 
+#else
+	r0.l = __fini;
+	r0.h = __fini;
+#endif
+	call	(p0)
+
+	p0.l = ___setup_argv_and_call_main;
+	p0.h = ___setup_argv_and_call_main; 
+	P3 = P4; 
+	call	(p0)
+
+	p0.l = _exit;
+	p0.h = _exit; 
+	P3 = P4; 
+	jump	(p0)		/* Should not return.  */
+	nop;
diff -r -u -p -N -x CVS newlib-orig/src/libgloss/bfin/Makefile.in newlib/src/libgloss/bfin/Makefile.in
--- newlib-orig/src/libgloss/bfin/Makefile.in	1970-01-01 08:00:00.000000000 +0800
+++ newlib/src/libgloss/bfin/Makefile.in	2006-10-21 02:43:05.000000000 +0800
@@ -0,0 +1,102 @@
+#
+#
+
+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)
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+
+# Multilib support variables.
+# TOP is used instead of MULTI{BUILD,SRC}TOP.
+MULTIDIRS =
+MULTISUBDIR =
+
+SHELL =	/bin/sh
+
+CC = @CC@
+
+AS = @AS@
+AR = @AR@
+LD = @LD@
+RANLIB = @RANLIB@
+
+OBJDUMP = `if [ -f ${objroot}/../binutils/objdump ] ; \
+	then echo ${objroot}/../binutils/objdump ; \
+	else t='$(program_transform_name)'; echo objdump | sed -e $$t ; fi`
+OBJCOPY = `if [ -f ${objroot}/../binutils/objcopy ] ; \
+	then echo ${objroot}/../binutils/objcopy ; \
+	else t='$(program_transform_name)'; echo objcopy | sed -e $$t ; fi`
+
+OBJS		=
+CFLAGS		=
+SCRIPTS		=
+
+# Here is all of the simulator stuff
+SIM_SCRIPTS	=
+SIM_LDFLAGS	=
+SIM_BSP		= libsim.a
+SIM_CRT0	= crt0.o
+SIM_OBJS	= syscalls.o
+SIM_TEST	= sim-test
+SIM_INSTALL	= install-sim
+
+# Host specific makefile fragment comes in here.
+@host_makefile_frag@
+
+#
+# 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: ${SIM_CRT0} ${SIM_BSP}
+
+#
+# here's where we build the board support packages for each target
+#
+${SIM_BSP}: ${OBJS} ${SIM_OBJS}
+	${AR} ${ARFLAGS} ${SIM_BSP} ${SIM_OBJS} ${OBJS}
+	${RANLIB} ${SIM_BSP}
+
+#
+#
+#
+.c.S:
+	${CC} ${CFLAGS_FOR_TARGET} -c $<
+
+clean mostlyclean:
+	rm -f a.out core *.i *.o $(SIM_BSP)
+
+distclean maintainer-clean realclean: clean
+	rm -f Makefile config.status *~
+
+.PHONY: install info install-info clean-info
+install: ${SIM_INSTALL}
+
+install-sim:
+	set -e; for x in ${SIM_CRT0} ${SIM_BSP} ${SIM_SCRIPTS}; 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 -r -u -p -N -x CVS newlib-orig/src/libgloss/bfin/syscalls.c newlib/src/libgloss/bfin/syscalls.c
--- newlib-orig/src/libgloss/bfin/syscalls.c	1970-01-01 08:00:00.000000000 +0800
+++ newlib/src/libgloss/bfin/syscalls.c	2006-10-21 02:43:05.000000000 +0800
@@ -0,0 +1,264 @@
+/*
+ * C library support files for the Blackfin processor
+ *
+ * Copyright (C) 2006 Analog Devices, Inc.
+ *
+ * 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 <_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 "sys/syscall.h"
+#include <errno.h>
+#include <reent.h>
+#include <unistd.h>
+
+register char *stack_ptr asm ("SP");
+
+static inline int
+do_syscall (int reason, void *arg)
+{
+  int result;
+  asm volatile ("[--sp] = %1; [--sp] = %2; \
+		r1 = [sp++]; r0 = [sp++]; \
+		raise 0; %0 = r0;"
+		: "=r" (result)
+		: "r" (reason), "r" (arg)
+		: "R0", "R1", "memory", "cc");
+  return result;
+}
+
+int
+_read (int file, char *ptr, int len)
+{
+  int block[3];
+
+  block[0] = file;
+  block[1] = (int) ptr;
+  block[2] = len;
+  
+  return do_syscall (SYS_read, block);
+}
+
+int
+_lseek (int file, int ptr, int dir)
+{
+  int block[2];
+
+  block[0] = file;
+  block[1] = ptr;
+
+  return do_syscall (SYS_lseek, block);
+}
+
+int
+_write (int file, char *ptr, int len)
+{
+  int block[3];
+  
+  block[0] = file;
+  block[1] = (int) ptr;
+  block[2] = len;
+  
+  return do_syscall (SYS_write, block);
+}
+
+int
+_open (const char *path, int flags)
+{
+  int block[2];
+
+  block[0] = (int) path;
+  block[1] = flags;
+
+  return do_syscall (SYS_open, block);
+}
+
+int
+_close (int file)
+{
+  return do_syscall (SYS_close, &file);
+}
+
+void
+_exit (int n)
+{
+  do_syscall (SYS_exit, &n);
+}
+
+int
+_kill (int n, int m)
+{
+  int block[2];
+
+  block[0] = n;
+  block[1] = m;
+
+  return do_syscall (SYS_kill, block);
+}
+
+int
+_getpid (int n)
+{
+  return 1;
+}
+
+caddr_t
+_sbrk (int incr)
+{
+  extern char 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;
+}
+
+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;
+  _close (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 *tv, struct timezone *tz)
+{
+  tv->tv_usec = 0;
+  tv->tv_sec = do_syscall (SYS_time, 0);
+  return 0;
+}
+
+/* Return a clock that ticks at 100Hz.  */
+clock_t 
+_times (struct tms * tp)
+{
+  return -1;
+}
+
+int
+isatty (int fd)
+{
+  return 1;
+}
+
+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;
+}
+
+static inline int
+__setup_argv_for_main (int argc)
+{
+  int block[2];
+  char **argv;
+  int i = argc;
+
+  argv = __builtin_alloca ((1 + argc) * sizeof (*argv));
+
+  argv[i] = NULL;
+  while (i--) {
+    block[0] = i;
+    argv[i] = __builtin_alloca (1 + do_syscall (SYS_argnlen, (void *)block));
+    block[1] = (int) argv[i];
+    do_syscall (SYS_argn, (void *)block);
+  }
+
+  return main (argc, argv);
+}
+
+int
+__setup_argv_and_call_main ()
+{
+  int argc = do_syscall (SYS_argc, 0);
+
+  if (argc <= 0)
+    return main (argc, NULL);
+  else
+    return __setup_argv_for_main (argc);
+}
diff -r -u -p -N -x CVS newlib-orig/src/libgloss/configure.in newlib/src/libgloss/configure.in
--- newlib-orig/src/libgloss/configure.in	2006-10-11 00:50:02.000000000 +0800
+++ newlib/src/libgloss/configure.in	2006-10-21 02:43:05.000000000 +0800
@@ -77,6 +77,10 @@ case "${target}" in
 	AC_CONFIG_SUBDIRS(mn10300)
 	config_testsuite = true;
 	;;
+  bfin-*-*)
+	AC_CONFIG_SUBDIRS(bfin)
+	config_testsuite = true;
+	;;
   cris-*-* | crisv32-*-*)
 	AC_CONFIG_SUBDIRS(cris)
 	config_testsuite = true;
diff -r -u -p -N -x CVS newlib-orig/src/newlib/configure.host newlib/src/newlib/configure.host
--- newlib-orig/src/newlib/configure.host	2006-10-11 00:50:06.000000000 +0800
+++ newlib/src/newlib/configure.host	2006-10-21 02:43:05.000000000 +0800
@@ -99,6 +99,9 @@ case "${host_cpu}" in
   avr*)
 	newlib_cflags="${newlib_cflags} -DPREFER_SIZE_OVER_SPEED -mcall-prologues"
 	;;
+  bfin)
+	machine_dir=bfin
+	;;
   cris | crisv32)
 	machine_dir=cris
 	;;
@@ -334,6 +337,9 @@ case "${host}" in
 	  have_crt0="no"
 	fi
 	;;
+  bfin-*-*)
+	sys_dir=
+	;;
   crx*)
 	sys_dir=
 	;;
@@ -539,6 +545,9 @@ case "${host}" in
   avr*)
 	newlib_cflags="${newlib_cflags} -DNO_EXEC -DSMALL_MEMORY -DMISSING_SYSCALL_NAMES"
 	;;
+  bfin*)
+	syscall_dir=syscalls
+	;;
   cris-*-* | crisv32-*-*)
 	default_newlib_io_long_long="yes"
 	newlib_cflags="${newlib_cflags} -DHAVE_RENAME -D_USE_WRITE -DCOMPACT_CTYPE"
diff -r -u -p -N -x CVS newlib-orig/src/newlib/libc/include/machine/ieeefp.h newlib/src/newlib/libc/include/machine/ieeefp.h
--- newlib-orig/src/newlib/libc/include/machine/ieeefp.h	2006-10-11 00:50:07.000000000 +0800
+++ newlib/src/newlib/libc/include/machine/ieeefp.h	2006-10-26 17:43:13.000000000 +0800
@@ -283,6 +283,10 @@
 #define __IEEE_LITTLE_ENDIAN
 #endif
 
+#ifdef __BFIN__
+#define __IEEE_LITTLE_ENDIAN
+#endif
+
 #ifndef __IEEE_BIG_ENDIAN
 #ifndef __IEEE_LITTLE_ENDIAN
 #error Endianess not declared!!
diff -r -u -p -N -x CVS newlib-orig/src/newlib/libc/include/machine/setjmp.h newlib/src/newlib/libc/include/machine/setjmp.h
--- newlib-orig/src/newlib/libc/include/machine/setjmp.h	2006-10-11 00:50:07.000000000 +0800
+++ newlib/src/newlib/libc/include/machine/setjmp.h	2006-10-26 17:43:33.000000000 +0800
@@ -21,6 +21,10 @@ _BEGIN_STD_C
 #define	_JBLEN	13
 #endif
 
+#ifdef __BFIN__
+#define _JBLEN  40
+#endif
+
 /* necv70 was 9 as well. */
 
 #ifdef __mc68000__
diff -r -u -p -N -x CVS newlib-orig/src/newlib/libc/machine/bfin/access.c newlib/src/newlib/libc/machine/bfin/access.c
--- newlib-orig/src/newlib/libc/machine/bfin/access.c	1970-01-01 08:00:00.000000000 +0800
+++ newlib/src/newlib/libc/machine/bfin/access.c	2006-10-21 02:43:05.000000000 +0800
@@ -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;
+}
+	
diff -r -u -p -N -x CVS newlib-orig/src/newlib/libc/machine/bfin/configure.in newlib/src/newlib/libc/machine/bfin/configure.in
--- newlib-orig/src/newlib/libc/machine/bfin/configure.in	1970-01-01 08:00:00.000000000 +0800
+++ newlib/src/newlib/libc/machine/bfin/configure.in	2006-10-21 02:43:05.000000000 +0800
@@ -0,0 +1,14 @@
+dnl This is the newlib/libc/machine/bfin configure.in file.
+dnl Process this file with autoconf to produce a configure script.
+
+AC_PREREQ(2.59)
+AC_INIT([newlib],[NEWLIB_VERSION])
+AC_CONFIG_SRCDIR([Makefile.am])
+
+dnl Can't be done in NEWLIB_CONFIGURE because that confuses automake. 
+AC_CONFIG_AUX_DIR(../../../..)
+
+NEWLIB_CONFIGURE(../../..)
+
+AC_CONFIG_FILES([Makefile])
+AC_OUTPUT
diff -r -u -p -N -x CVS newlib-orig/src/newlib/libc/machine/bfin/longjmp.S newlib/src/newlib/libc/machine/bfin/longjmp.S
--- newlib-orig/src/newlib/libc/machine/bfin/longjmp.S	1970-01-01 08:00:00.000000000 +0800
+++ newlib/src/newlib/libc/machine/bfin/longjmp.S	2006-10-23 15:33:26.000000000 +0800
@@ -0,0 +1,115 @@
+/*
+ * longjmp for the Blackfin processor
+ *
+ * Copyright (C) 2006 Analog Devices, Inc.
+ *
+ * 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.
+ */
+
+#define _ASM
+#define _SETJMP_H
+
+
+.text;
+.align 4;
+.globl _longjmp;
+.type _longjmp, STT_FUNC;
+_longjmp:
+	P0 = R0;
+	R0 = [P0 + 0x00];
+	[--SP] = R0;		/* Put P0 on the stack */
+	
+	P1 = [P0 + 0x04];
+	P2 = [P0 + 0x08];
+	P3 = [P0 + 0x0C];
+	P4 = [P0 + 0x10];
+	P5 = [P0 + 0x14];
+	
+	FP = [P0 + 0x18];
+	R0 = [SP++];		/* Grab P0 from old stack */
+	SP = [P0 + 0x1C];	/* Update Stack Pointer */
+	[--SP] = R0;		/* Put P0 on new stack */
+	[--SP] = R1;		/* Put VAL arg on new stack */
+
+	R0 = [P0 + 0x20];	/* Data Registers */
+	R1 = [P0 + 0x24];
+	R2 = [P0 + 0x28];
+	R3 = [P0 + 0x2C];
+	R4 = [P0 + 0x30];
+	R5 = [P0 + 0x34];
+	R6 = [P0 + 0x38];
+	R7 = [P0 + 0x3C];
+
+	R0 = [P0 + 0x40];
+	ASTAT = R0;
+
+	R0 = [P0 + 0x44];	/* Loop Counters */
+	LC0 = R0;
+	R0 = [P0 + 0x48];
+	LC1 = R0;
+
+	R0 = [P0 + 0x4C];	/* Accumulators */
+	A0.W = R0;
+	R0 = [P0 + 0x50];
+	A0.X = R0;
+	R0 = [P0 + 0x54];
+	A1.W = R0;
+	R0 = [P0 + 0x58];
+	A1.X = R0;
+
+	R0 = [P0 + 0x5C];	/* Index Registers */
+	I0 = R0;
+	R0 = [P0 + 0x60];
+	I1 = R0;
+	R0 = [P0 + 0x64];
+	I2 = R0;
+	R0 = [P0 + 0x68];
+	I3 = R0;
+
+	R0 = [P0 + 0x6C];	/* Modifier Registers */
+	M0 = R0;
+	R0 = [P0 + 0x70];
+	M1 = R0;
+	R0 = [P0 + 0x74];
+	M2 = R0;
+	R0 = [P0 + 0x78];
+	M3 = R0;
+
+	R0 = [P0 + 0x7C];	/* Length Registers */
+	L0 = R0;
+	R0 = [P0 + 0x80];
+	L1 = R0;
+	R0 = [P0 + 0x84];
+	L2 = R0;
+	R0 = [P0 + 0x88];
+	L3 = R0;
+
+	R0 = [P0 + 0x8C];	/* Base Registers */
+	B0 = R0;
+	R0 = [P0 + 0x90];
+	B1 = R0;
+	R0 = [P0 + 0x94];
+	B2 = R0;
+	R0 = [P0 + 0x98];
+	B3 = R0;
+
+	R0 = [P0 + 0x9C];	/* Return Address (PC) */
+	RETS = R0;
+	
+	R0 = [SP++];
+	P0 = [SP++];
+
+	CC = R0 == 0;
+	IF !CC JUMP 1f;
+	R0 = 1;
+1:
+	RTS;
+.size _longjmp, .-_longjmp;
diff -r -u -p -N -x CVS newlib-orig/src/newlib/libc/machine/bfin/Makefile.am newlib/src/newlib/libc/machine/bfin/Makefile.am
--- newlib-orig/src/newlib/libc/machine/bfin/Makefile.am	1970-01-01 08:00:00.000000000 +0800
+++ newlib/src/newlib/libc/machine/bfin/Makefile.am	2006-10-23 15:33:43.000000000 +0800
@@ -0,0 +1,12 @@
+## Process this file with automake to generate Makefile.in
+
+AUTOMAKE_OPTIONS = cygnus
+
+INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS)
+
+noinst_LIBRARIES = lib.a
+
+lib_a_SOURCES = setjmp.S longjmp.S access.c
+
+ACLOCAL_AMFLAGS = -I ../../..
+CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host
diff -r -u -p -N -x CVS newlib-orig/src/newlib/libc/machine/bfin/setjmp.S newlib/src/newlib/libc/machine/bfin/setjmp.S
--- newlib-orig/src/newlib/libc/machine/bfin/setjmp.S	1970-01-01 08:00:00.000000000 +0800
+++ newlib/src/newlib/libc/machine/bfin/setjmp.S	2006-10-23 15:31:57.000000000 +0800
@@ -0,0 +1,108 @@
+/*
+ * setjmp for the Blackfin processor
+ *
+ * Copyright (C) 2006 Analog Devices, Inc.
+ *
+ * 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.
+ */
+
+
+#define _ASM
+#define _SETJMP_H
+
+.text;
+.align 4;
+.globl _setjmp;
+.type _setjmp, STT_FUNC;
+
+_setjmp:
+	[--SP] = P0;		/* Save P0 */
+	P0 = R0;
+	R0 = [SP++];	
+	[P0 + 0x00] = R0;	/* Save saved P0 */
+	[P0 + 0x04] = P1;
+	[P0 + 0x08] = P2;
+	[P0 + 0x0C] = P3;
+	[P0 + 0x10] = P4;
+	[P0 + 0x14] = P5;
+
+	[P0 + 0x18] = FP;	/* Frame Pointer */
+	[P0 + 0x1C] = SP;	/* Stack Pointer */
+
+	[P0 + 0x20] = P0;	/* Data Registers */
+	[P0 + 0x24] = R1;
+	[P0 + 0x28] = R2;
+	[P0 + 0x2C] = R3;
+	[P0 + 0x30] = R4;
+	[P0 + 0x34] = R5;
+	[P0 + 0x38] = R6;
+	[P0 + 0x3C] = R7;
+
+	R0 = ASTAT;
+	[P0 + 0x40] = R0;
+
+	R0 = LC0;		/* Loop Counters */
+	[P0 + 0x44] = R0;
+	R0 = LC1;
+	[P0 + 0x48] = R0;
+
+	R0 = A0.W;		/* Accumulators */
+	[P0 + 0x4C] = R0;
+	R0 = A0.X;
+	[P0 + 0x50] = R0;
+	R0 = A1.W;
+	[P0 + 0x54] = R0;
+	R0 = A1.X;
+	[P0 + 0x58] = R0;
+
+	R0 = I0;		/* Index Registers */
+	[P0 + 0x5C] = R0;
+	R0 = I1;
+	[P0 + 0x60] = R0;
+	R0 = I2;
+	[P0 + 0x64] = R0;
+	R0 = I3;
+	[P0 + 0x68] = R0;
+
+	R0 = M0;		/* Modifier Registers */
+	[P0 + 0x6C] = R0;
+	R0 = M1;
+	[P0 + 0x70] = R0;
+	R0 = M2;
+	[P0 + 0x74] = R0;
+	R0 = M3;
+	[P0 + 0x78] = R0;
+
+	R0 = L0;		/* Length Registers */
+	[P0 + 0x7c] = R0;
+	R0 = L1;
+	[P0 + 0x80] = R0;
+	R0 = L2;
+	[P0 + 0x84] = R0;
+	R0 = L3;
+	[P0 + 0x88] = R0;
+
+	R0 = B0;		/* Base Registers */
+	[P0 + 0x8C] = R0;
+	R0 = B1;
+	[P0 + 0x90] = R0;
+	R0 = B2;
+	[P0 + 0x94] = R0;
+	R0 = B3;
+	[P0 + 0x98] = R0;
+
+	R0 = RETS;
+	[P0 + 0x9C] = R0;
+
+	R0 = 0;
+
+	RTS;
+.size _setjmp, .-_setjmp;
diff -r -u -p -N -x CVS newlib-orig/src/newlib/libc/machine/bfin/sys/syscall.h newlib/src/newlib/libc/machine/bfin/sys/syscall.h
--- newlib-orig/src/newlib/libc/machine/bfin/sys/syscall.h	1970-01-01 08:00:00.000000000 +0800
+++ newlib/src/newlib/libc/machine/bfin/sys/syscall.h	2006-10-21 02:43:05.000000000 +0800
@@ -0,0 +1,56 @@
+/*
+ * System call number for the Blackfin processor
+ *
+ * Copyright (C) 2006 Analog Devices, Inc.
+ *
+ * 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.
+ */
+
+
+#define SYS_exit	1
+#define SYS_fork	2
+#define SYS_read	3
+#define SYS_write	4
+#define SYS_open	5
+#define SYS_close	6
+#define SYS_wait4	7
+#define SYS_creat	8
+#define SYS_link	9
+#define SYS_unlink	10
+#define SYS_execv	11
+#define SYS_chdir	12
+
+#define SYS_mknod	14
+#define SYS_chmod	15
+#define SYS_chown	16
+
+#define SYS_lseek	19
+#define SYS_getpid	20
+#define SYS_isatty	21
+#define SYS_fstat	22
+#define SYS_time	23
+#define SYS_kill	24
+
+#define SYS_stat	38
+
+#define SYS_pipe	42
+
+#define SYS_execve	59
+
+#define SYS_truncate	129
+#define SYS_ftruncate	130
+
+#define SYS_argc	172
+#define SYS_argnlen	173
+#define SYS_argn	174
+
+#define SYS_utime	201
+#define SYS_wait	202
diff -r -u -p -N -x CVS newlib-orig/src/newlib/libc/machine/configure.in newlib/src/newlib/libc/machine/configure.in
--- newlib-orig/src/newlib/libc/machine/configure.in	2006-10-11 00:50:07.000000000 +0800
+++ newlib/src/newlib/libc/machine/configure.in	2006-10-21 02:43:05.000000000 +0800
@@ -24,6 +24,7 @@ if test -n "${machine_dir}"; then
   case ${machine_dir} in
 	a29k) AC_CONFIG_SUBDIRS(a29k) ;;
 	arm) AC_CONFIG_SUBDIRS(arm) ;;
+	bfin) AC_CONFIG_SUBDIRS(bfin) ;;
 	cris) AC_CONFIG_SUBDIRS(cris) ;;
 	crx) AC_CONFIG_SUBDIRS(crx) ;;
 	d10v) AC_CONFIG_SUBDIRS(d10v) ;;

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