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


Hi,

We (Analog Devices, Inc.) have ported newlib to Blackfin processor and
would like to contribute back. We ported newlib mainly for testing Blackfin GCC/Binutils/GDB on simulator. We have contributed Blackfin port GCC and binutils to their respective projects. Contributing Blackfin GDB to FSF is going on.


This new port is being used in our daily toolchain testing on simulator. The results seem OK.

Is this port in a good shape to be accepted? Any comments are appreciated.

Thanks,
Jie Zhang
	* configure.host: Add bfin support.
	* 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/configure.in: Add bfin support.
	* libc/sys/bfin/aclocal.m4: Generate.
	* libc/sys/bfin/configure.in: New.
	* libc/sys/bfin/configure: Generate.
	* libc/sys/bfin/crt0.S: New.
	* libc/sys/bfin/Makefile.am: New.
	* libc/sys/bfin/Makefile.in: Generate.
	* libc/sys/bfin/sys/syscall.h: New.
	* libc/sys/bfin/sys/syscalls.c: New.
	* libc/sys/configure.in: Add bfin support.
	* libc/sys/configure: Generate.

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-11 01:25:19.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=bfin
+	;;
   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-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 -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-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 -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-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 -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-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 -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-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 -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-19 09:27:21.000000000 +0800
@@ -0,0 +1,106 @@
+/* Setjmp for the Blackfin processor
+   Copyright (C) 2006 Analog Devices, Inc.
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.  */
+
+#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 -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-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) ;;
diff -r -u -p -N -x CVS newlib-orig/src/newlib/libc/sys/bfin/configure.in newlib/src/newlib/libc/sys/bfin/configure.in
--- newlib-orig/src/newlib/libc/sys/bfin/configure.in	1970-01-01 08:00:00.000000000 +0800
+++ newlib/src/newlib/libc/sys/bfin/configure.in	2006-10-11 01:39:00.000000000 +0800
@@ -0,0 +1,14 @@
+dnl This is the newlib/libc/sys/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([syscalls.c])
+
+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/sys/bfin/crt0.S newlib/src/newlib/libc/sys/bfin/crt0.S
--- newlib-orig/src/newlib/libc/sys/bfin/crt0.S	1970-01-01 08:00:00.000000000 +0800
+++ newlib/src/newlib/libc/sys/bfin/crt0.S	2006-10-19 09:28:34.000000000 +0800
@@ -0,0 +1,69 @@
+/* Crt0.S for the Blackfin processor
+   Copyright (C) 2006 Analog Devices, Inc.
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.  */
+
+	.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/newlib/libc/sys/bfin/Makefile.am newlib/src/newlib/libc/sys/bfin/Makefile.am
--- newlib-orig/src/newlib/libc/sys/bfin/Makefile.am	1970-01-01 08:00:00.000000000 +0800
+++ newlib/src/newlib/libc/sys/bfin/Makefile.am	2006-10-19 09:32:56.000000000 +0800
@@ -0,0 +1,14 @@
+## 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 = crt0.S syscalls.c
+
+all: crt0.o
+
+ACLOCAL_AMFLAGS = -I ../../..
+CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host
diff -r -u -p -N -x CVS newlib-orig/src/newlib/libc/sys/bfin/sys/syscall.h newlib/src/newlib/libc/sys/bfin/sys/syscall.h
--- newlib-orig/src/newlib/libc/sys/bfin/sys/syscall.h	1970-01-01 08:00:00.000000000 +0800
+++ newlib/src/newlib/libc/sys/bfin/sys/syscall.h	2006-10-19 09:37:10.000000000 +0800
@@ -0,0 +1,52 @@
+/* System call number for the Blackfin processor
+   Copyright (C) 2006 Analog Devices, Inc.
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.  */
+
+#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/sys/bfin/syscalls.c newlib/src/newlib/libc/sys/bfin/syscalls.c
--- newlib-orig/src/newlib/libc/sys/bfin/syscalls.c	1970-01-01 08:00:00.000000000 +0800
+++ newlib/src/newlib/libc/sys/bfin/syscalls.c	2006-10-19 09:35:48.000000000 +0800
@@ -0,0 +1,261 @@
+/* C library support files for the Blackfin processor
+   Copyright (C) 2006 Analog Devices, Inc.
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.  */
+
+#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/newlib/libc/sys/configure.in newlib/src/newlib/libc/sys/configure.in
--- newlib-orig/src/newlib/libc/sys/configure.in	2006-10-11 00:50:16.000000000 +0800
+++ newlib/src/newlib/libc/sys/configure.in	2006-10-11 14:06:36.000000000 +0800
@@ -23,6 +23,7 @@ if test -n "${sys_dir}"; then
 	a29khif) AC_CONFIG_SUBDIRS(a29khif) ;;
 	arc) AC_CONFIG_SUBDIRS(arc) ;;
 	arm) AC_CONFIG_SUBDIRS(arm) ;;
+	bfin) AC_CONFIG_SUBDIRS(bfin) ;;
 	d10v) AC_CONFIG_SUBDIRS(d10v) ;;
 	decstation) AC_CONFIG_SUBDIRS(decstation) ;;
 	h8300hms) AC_CONFIG_SUBDIRS(h8300hms) ;;

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