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

Jeff Johnston jjohnstn@redhat.com
Thu Nov 9 16:27:00 GMT 2006


Hello Jie,

   The patch has been checked in.  Thanks for addressing all the issues.

-- Jeff J.

Jie Zhang wrote:
> Jie Zhang wrote:
>> Joel Sherrill wrote:
>>>> This patch has fixed these more issues:
>>>>
>>> It looks like it is getting there.  The license is OK for newlib now 
>>> and you have setjmp/longjmp.
>>> AFAIK machine/bfin should not have access.c or sys/syscall.h.  Those 
>>> are part of the target OS
>>> which in your case is libgloss.  For RTEMS, we could use 
>>> setjmp/longjmp but would
>>> avoid those since we really have a functional access and those 
>>> syscall's are meaningless.
>>>
>> So is it OK to move syscall.h into libgloss and remove access.c?
>>
>> And further, is it a good idea to reuse the common syscall.h in 
>> libgloss? I did some work in the last week to do so. And I found we 
>> need three new syscalls to be added into the common syscall.h to 
>> support argc and argv: SYS_argc, SYS_argnlen and SYS_argn. Is it OK to 
>> add them to the common libgloss syscall.h?
>>
> This is the fourth revised patch. It solves the issues raised by Joel by 
> removing newlib/libc/machine/bfin/sys/syscall.h and reusing the common 
> syscall.h in libgloss. Three new syscalls are added into the common 
> syscall.h to support argc and argv. It also removes 
> newlib/libc/machine/bfin/access.c.
> 
> It also defines AM_CCASFLAGS, lib_a_CCASFLAGS and lib_a_CFLAGS in 
> newlib/libc/machine/bfin/Makefile.am as fr30.
> 
> Any further comment?
> 
> 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.
> 	* syscall.h (SYS_argc): Define.
> 	(SYS_argnlen): Define.
> 	(SYS_argn): Define.
> 
> 	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/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/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-11-01 01:07:30.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 "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/libgloss/syscall.h newlib/src/libgloss/syscall.h
> --- newlib-orig/src/libgloss/syscall.h	2001-11-01 03:19:07.000000000 +0800
> +++ newlib/src/libgloss/syscall.h	2006-11-01 01:10:28.000000000 +0800
> @@ -46,4 +46,9 @@
>  #define SYS_gettimeofday 19
>  #define SYS_times	 20
>  #define SYS_link	 21
> +
> +/* New ARGV support.  */
> +#define SYS_argc	 22
> +#define SYS_argnlen	 23
> +#define SYS_argn	 24
>  #endif
> 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/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-11-07 17:33:59.000000000 +0800
> @@ -0,0 +1,16 @@
> +## Process this file with automake to generate Makefile.in
> +
> +AUTOMAKE_OPTIONS = cygnus
> +
> +INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS)
> +
> +AM_CCASFLAGS = $(INCLUDES)
> +
> +noinst_LIBRARIES = lib.a
> +
> +lib_a_SOURCES = setjmp.S longjmp.S
> +lib_a_CCASFLAGS=$(AM_CCASFLAGS)
> +lib_a_CFLAGS=$(AM_CFLAGS)
> +
> +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/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) ;;



More information about the Newlib mailing list