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) ;;