[PATCH] Add Blackfin support in newlib
Joel Sherrill
joel.sherrill@oarcorp.com
Thu Oct 19 21:33:00 GMT 2006
I think the license on at least setjmp.S, crt0.S, and syscalls.[ch] is
incompatible with newlib's licensing.
These files are LGPL. I thought newlib only accept BSD (w/o
advertising) and public domain
code for truly embedded targets.
+/* 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. */
--joel
Jeff Johnston wrote:
> Hello Jie,
>
> Looks good, but I have a couple of issues.
>
> 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).
>
> For your libc/machine/bfin Makefile.am, please look at the
> libc/machine/fr30 directory. You should base your Makefile.am on that
> (adding any other files to lib_a_SOURCES). This sets some flags
> needed to ensure compilation flags are passed properly down from the
> top-level.
>
> -- Jeff J.
>
> Jie Zhang wrote:
>> 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) ;;
>
More information about the Newlib
mailing list