This is the mail archive of the
newlib@sourceware.org
mailing list for the newlib project.
[PATCH] Add Blackfin support in newlib (try 2)
- From: Jie Zhang <jzhang918 at gmail dot com>
- To: newlib at sources dot redhat dot com
- Cc: Jeff Johnston <jjohnstn at redhat dot com>, Joel Sherrill <joel dot sherrill at oarcorp dot com>, Robin Getz <robin dot getz at analog dot com>, Ralf Corsepius <ralf dot corsepius at rtems dot org>, Bernd Schmidt <bernds_cb1 at t-online dot de>, Alain Schaefer <alani at easc dot ch>, Michael Ambrus <ambrmi09 at gmail dot com>, fitzsim at redhat dot com
- Date: Sat, 21 Oct 2006 02:27:53 +0800
- Subject: [PATCH] Add Blackfin support in newlib (try 2)
Hi all,
I'm going to answer all of your emails in one instead of one for each.:-)
If there are anythings I forgot to reply, please raise it up again.
This is a (partially) revised patch, not all of your comments get
addressed in this one. Since I cannot access to my computer during this
weekend, I'd like to send out my partial work for further comments. I'll
finally address all of your comments and suggestions.
These two issues have been fixed in this patch:
* License for new created files has been changed to a BSD-like one.
Jeff Johnston wrote:
First, please put the syscalls and crt0.S into libgloss instead of
newlib/libc/sys/bfin. New ports no longer put syscall and startup files
in libc/sys. Using libgloss allows you flexibility in the future to add
additional bsp libraries (e.g. simulator vs real processor).
Done.
These issues have not been addressed, either since my lack of knowledge
or time.
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.
Compared with fr30, bfin has lib_a_SOURCES, bug lack of AM_CCASFLAGS,
lib_a_CCASFLAGS and lib_a_CFLAGS. I ever added them, but I encountered
some difficulty in generating Makefile.in. I cannot reproduce them since
I have not automake 1.9.5 on my notebook.
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.
Currently, it works properly for building newlib in gcc source code tree
on all Suse hosts we are using (9.2, 10.1, and maybe some others) and
Debian amd64 testing and Ubuntu dapper and edgy. I never observed that
issue. Maybe because I never build newlib outside of gcc source tree.
I'll investigate this issue further next week.
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.
I have not looked this. I'll do it next week.
Thanks,
Jie
* Our CVS is located at <http://blackfin.uclinux.org/>.
A lot of projects are hosted there, include toolchain, uClinux, jtagtools,
hardware design, wiki form documents and many others.
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/sys/syscall.h: New.
* libc/machine/configure.in: Add bfin support.
* libc/machine/configure: Generate.
diff -u -r -N -p 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-20 14:34:11.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 -u -r -N -p 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-20 22:52:36.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 -u -r -N -p 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 01:05:50.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 -u -r -N -p 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-20 23:22:07.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 -u -r -N -p 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 01:06:55.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 -u -r -N -p 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-20 14:29:00.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 -u -r -N -p 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-20 14:50:52.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 -u -r -N -p 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-11 01:25:19.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 -u -r -N -p 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-11 01:25:19.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 -u -r -N -p 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-11 01:25:19.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 -u -r -N -p 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-11 12:08:03.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 -u -r -N -p 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-19 09:17:54.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 access.c
+
+ACLOCAL_AMFLAGS = -I ../../..
+CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host
diff -u -r -N -p 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-21 01:07:49.000000000 +0800
@@ -0,0 +1,110 @@
+/*
+ * 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
+
+.globl ___sigsetjmp;
+.align 4;
+
+___sigsetjmp:
+ [--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 = [P0 + 0x20];
+ CC = R1 == 1;
+ IF CC JUMP L$L$finished;
+ CALL ___sigjmp_save;
+L$L$finished:
+ R0 = 0;
+ RTS;
+___sigsetjmp.end:
diff -u -r -N -p 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 01:08:28.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 -u -r -N -p 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-11 14:07:56.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) ;;