Ping Re: TI C6X port of newlib
Jeff Johnston
jjohnstn@redhat.com
Tue Oct 12 14:24:00 GMT 2010
Patch checked in.
-- Jeff J.
On 10/08/2010 04:05 PM, Joseph S. Myers wrote:
> On Fri, 8 Oct 2010, Bernd Schmidt wrote:
>
>> On 10/08/2010 06:38 PM, Joseph S. Myers wrote:
>>
>>>> 1. crt0.S doesn't have a license
>>>> 2. there is a National Semiconductor license in one of the files that needs
>>>> to be mentioned in COPYING.LIBGLOSS
>>> Bernd, where did these files come from?
>> I don't recall entirely but think I copied the Blackfin crt0.S and
>> replaced the code with C6X assembler code.
>>
>> The sbrk implementation is also copied from another port. It must have
>> been crx.
> Thanks. In this revised patch (again, generated files not included) I've
> added the National Semiconductor notice from crx to COPYING.LIBGLOSS, and
> put the CodeSourcery notice on crt0.S since it's essentially just the
> assembly code and nothing else.
>
> 2010-10-08 Bernd Schmidt<bernds@codesourcery.com>
> Joseph Myers<joseph@codesourcery.com>
>
> * COPYING.LIBGLOSS: Add National Semiconductor and CodeSourcery
> notices.
> * COPYING.NEWLIB: Add Texas Instruments notice.
>
> libgloss:
> 2010-10-08 Bernd Schmidt<bernds@codesourcery.com>
> Joseph Myers<joseph@codesourcery.com>
>
> * configure.in: Handle tic6x targets.
> * configure: Regenerate.
> * tic6x/Makefile.in, tic6x/configure.in, tic6x/crt0.S,
> tic6x/getpid.c, tic6x/kill.c, tic6x/sbrk.c, tic6x/syscalls.c: New.
> * tic6x/configure: New (generated).
>
> newlib:
> 2010-10-08 Bernd Schmidt<bernds@codesourcery.com>
> Joseph Myers<joseph@codesourcery.com>
>
> * configure.host: Handle tic6x targets.
> * libc/include/machine/ieeefp.h: Define endianness for C6X.
> * libc/include/machine/setjmp.h: Add __TMS320C6X__ case.
> * libc/machine/configure.in: Handle tic6x targets.
> * libc/machine/configure: Regenerate.
> * libc/machine/tic6x/Makefile.am, libc/machine/tic6x/configure.in,
> libc/machine/tic6x/setjmp.S: New.
> * libc/machine/tic6x/Makefile.in, libc/machine/tic6x/aclocal.m4,
> libc/machine/tic6x/configure: New (generated).
>
> diff -ruN newlib.orig/COPYING.LIBGLOSS newlib-c6x/COPYING.LIBGLOSS
> --- newlib.orig/COPYING.LIBGLOSS 2009-12-17 13:12:49.000000000 -0800
> +++ newlib-c6x/COPYING.LIBGLOSS 2010-10-08 12:34:50.000000000 -0700
> @@ -260,3 +260,45 @@
> NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
> SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
>
> +
> +(14) - National Semiconductor Corporation
> +
> +Copyright (c) 2004 National Semiconductor Corporation
> +
> +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.
> +
> +
> +(15) - CodeSourcery, Inc. (tic6x-* targets)
> +
> +Copyright (c) 2010 CodeSourcery, Inc.
> +All rights reserved.
> +
> +Redistribution and use in source and binary forms, with or without
> +modification, are permitted provided that the following conditions are met:
> + * Redistributions of source code must retain the above copyright
> + notice, this list of conditions and the following disclaimer.
> + * Redistributions in binary form must reproduce the above copyright
> + notice, this list of conditions and the following disclaimer in the
> + documentation and/or other materials provided with the distribution.
> + * Neither the name of CodeSourcery nor the
> + names of its contributors may be used to endorse or promote products
> + derived from this software without specific prior written permission.
> +
> +THIS SOFTWARE IS PROVIDED BY CODESOURCERY, INC. ``AS IS'' AND ANY
> +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
> +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
> +DISCLAIMED. IN NO EVENT SHALL CODESOURCERY BE LIABLE FOR ANY
> +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
> +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
> +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
> +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
> +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> diff -ruN newlib.orig/COPYING.NEWLIB newlib-c6x/COPYING.NEWLIB
> --- newlib.orig/COPYING.NEWLIB 2009-12-17 13:12:49.000000000 -0800
> +++ newlib-c6x/COPYING.NEWLIB 2010-10-01 16:00:04.000000000 -0700
> @@ -828,3 +828,37 @@
> NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
> SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
>
> +
> +(37) Texas Instruments Incorporated (tic6x-* targets)
> +
> +Copyright (c) 1996-2010 Texas Instruments Incorporated
> +http://www.ti.com/
> +
> + Redistribution and use in source and binary forms, with or without
> + modification, are permitted provided that the following conditions
> + are met:
> +
> + Redistributions of source code must retain the above copyright
> + notice, this list of conditions and the following disclaimer.
> +
> + Redistributions in binary form must reproduce the above copyright
> + notice, this list of conditions and the following disclaimer in
> + the documentation and/or other materials provided with the
> + distribution.
> +
> + Neither the name of Texas Instruments Incorporated nor the names
> + of its contributors may be used to endorse or promote products
> + derived from this software without specific prior written
> + permission.
> +
> + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
> + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
> + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
> + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
> + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> diff -ruN newlib.orig/libgloss/configure.in newlib-c6x/libgloss/configure.in
> --- newlib.orig/libgloss/configure.in 2010-07-23 10:52:36.000000000 -0700
> +++ newlib-c6x/libgloss/configure.in 2010-10-01 15:47:12.000000000 -0700
> @@ -129,6 +129,10 @@
> config_testsuite=false
> config_libnosys=false
> ;;
> + tic6x-*-*)
> + AC_CONFIG_SUBDIRS(tic6x)
> + config_testsuite=false
> + ;;
> iq2000-*-*)
> AC_CONFIG_SUBDIRS([iq2000])
> ;;
> diff -ruN newlib.orig/libgloss/tic6x/Makefile.in newlib-c6x/libgloss/tic6x/Makefile.in
> --- newlib.orig/libgloss/tic6x/Makefile.in 1969-12-31 16:00:00.000000000 -0800
> +++ newlib-c6x/libgloss/tic6x/Makefile.in 2010-10-01 15:47:12.000000000 -0700
> @@ -0,0 +1,126 @@
> +#
> +#
> +
> +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`
> +
> +CFLAGS = -g
> +SCRIPTS =
> +
> +# Here is all of the simulator stuff
> +SIM_SCRIPTS =
> +SIM_LDFLAGS =
> +SIM_BSP = libsim.a
> +SIM_CRT0 = crt0.o
> +SIM_OBJS = sbrk.o putnum.o getpid.o kill.o 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}
> +
> +
> +#
> +# here's where we build the test programs for each target
> +#
> +.PHONY: test
> +test: ${SIM_TEST}
> +
> +sim-test: sim-test.x sim-test.dis
> +
> +sim-test.x: test.o ${SIM_CRT0} ${SIM_BSP}
> + ${CC} ${LDFLAGS_FOR_TARGET} -L${objdir} \
> + ${SIM_CRT0} test.o \
> + -o sim-test.x ${LIBS_FOR_TARGET} -lc ${SIM_BSP}
> +
> +sim-test.dis: sim-test.x
> + ${OBJDUMP} -d sim-test.x> sim-test.dis
> +
> +
> +#
> +#
> +#
> +.c.S:
> + ${CC} ${CFLAGS_FOR_TARGET} -c $<
> +
> +clean mostlyclean:
> + rm -f a.out core *.i *.o *-test *.srec *.dis *.x $(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}; do\
> + ${INSTALL_DATA} $$x $(DESTDIR)${tooldir}/lib${MULTISUBDIR}/$$x;\
> + done
> + for x in ${SIM_SCRIPTS}; do\
> + ${INSTALL_DATA} ${srcdir}/$${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 -ruN newlib.orig/libgloss/tic6x/configure.in newlib-c6x/libgloss/tic6x/configure.in
> --- newlib.orig/libgloss/tic6x/configure.in 1969-12-31 16:00:00.000000000 -0800
> +++ newlib-c6x/libgloss/tic6x/configure.in 2010-10-01 15:47:12.000000000 -0700
> @@ -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 -ruN newlib.orig/libgloss/tic6x/crt0.S newlib-c6x/libgloss/tic6x/crt0.S
> --- newlib.orig/libgloss/tic6x/crt0.S 1969-12-31 16:00:00.000000000 -0800
> +++ newlib-c6x/libgloss/tic6x/crt0.S 2010-10-08 12:36:00.000000000 -0700
> @@ -0,0 +1,63 @@
> +/* crt0.S for the TI C6X series of processors
> +
> + Copyright (c) 2010 CodeSourcery, Inc.
> + All rights reserved.
> +
> + Redistribution and use in source and binary forms, with or without
> + modification, are permitted provided that the following conditions are met:
> + * Redistributions of source code must retain the above copyright
> + notice, this list of conditions and the following disclaimer.
> + * Redistributions in binary form must reproduce the above copyright
> + notice, this list of conditions and the following disclaimer in the
> + documentation and/or other materials provided with the distribution.
> + * Neither the name of CodeSourcery nor the
> + names of its contributors may be used to endorse or promote products
> + derived from this software without specific prior written permission.
> +
> + THIS SOFTWARE IS PROVIDED BY CODESOURCERY, INC. ``AS IS'' AND ANY
> + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
> + PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CODESOURCERY BE LIABLE
> + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
> + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
> + OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
> + BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
> + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
> + USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
> + DAMAGE. */
> +
> + .text
> + .align 2
> +
> + .global _start
> +_start:
> + /* Start by setting up a stack */
> + mvkl .s2 _STACK_START - 4, B15
> + mvkh .s2 _STACK_START - 4, B15
> + and .s2 -8, B15, B15
> +
> + mvkl .s2 __c6xabi_DSBT_BASE, B14
> + mvkh .s2 __c6xabi_DSBT_BASE, B14
> +
> +#ifdef __DSBT__
> + stw .d2t2 B14, *B14
> +#endif
> + /* Zero the memory in the .bss section. */
> +
> + /* Set up GOT pointer. */
> +
> + mvkl .s2 1f, B3
> + mvkh .s2 1f, B3
> + call .s2 _init
> + nop 5
> +1:
> +
> + mvkl .s2 1f, B3
> + mvkh .s2 1f, B3
> + call .s2 main
> + nop 5
> +1:
> +
> + b .s2 exit
> + nop 5
> diff -ruN newlib.orig/libgloss/tic6x/getpid.c newlib-c6x/libgloss/tic6x/getpid.c
> --- newlib.orig/libgloss/tic6x/getpid.c 1969-12-31 16:00:00.000000000 -0800
> +++ newlib-c6x/libgloss/tic6x/getpid.c 2010-10-01 15:47:12.000000000 -0700
> @@ -0,0 +1,26 @@
> +/* getpid.c -- get the current process id.
> + *
> + * Copyright (c) 1995 Cygnus Support
> + *
> + * 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>
> +#define __MYPID 1
> +
> +/*
> + * getpid -- only one process, so just return 1.
> + */
> +int
> +_DEFUN (getpid, (),
> + )
> +{
> + return __MYPID;
> +}
> diff -ruN newlib.orig/libgloss/tic6x/kill.c newlib-c6x/libgloss/tic6x/kill.c
> --- newlib.orig/libgloss/tic6x/kill.c 1969-12-31 16:00:00.000000000 -0800
> +++ newlib-c6x/libgloss/tic6x/kill.c 2010-10-01 15:47:12.000000000 -0700
> @@ -0,0 +1,29 @@
> +/* kill.c -- remove a process.
> + *
> + * Copyright (c) 1995 Cygnus Support
> + *
> + * 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>
> +#define __MYPID 1
> +
> +/*
> + * kill -- go out via exit...
> + */
> +int
> +_DEFUN (kill, (pid, sig),
> + int pid _AND
> + int sig)
> +{
> + if(pid == __MYPID)
> + _exit(sig);
> + return 0;
> +}
> diff -ruN newlib.orig/libgloss/tic6x/sbrk.c newlib-c6x/libgloss/tic6x/sbrk.c
> --- newlib.orig/libgloss/tic6x/sbrk.c 1969-12-31 16:00:00.000000000 -0800
> +++ newlib-c6x/libgloss/tic6x/sbrk.c 2010-10-01 15:47:12.000000000 -0700
> @@ -0,0 +1,59 @@
> +/* sbrk.c -- Implementation of the low-level sbrk() routine
> + *
> + * Copyright (c) 2004 National Semiconductor Corporation
> + *
> + * 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<errno.h>
> +#include<stddef.h> /* where ptrdiff_t is defined */
> +#include<stdlib.h>
> +
> +/* Start of the heap. */
> +extern const char _HEAP_START __attribute__((section(".heap")));
> +/* End of the heap (maximum value of heap_ptr). */
> +extern const char _HEAP_MAX __attribute__((section(".heap")));
> +
> +/* Extend heap space by size bytes.
> + Return start of new space allocated, or -1 for errors
> + Error cases:
> + 1. Allocation is not within heap range */
> +
> +void * sbrk (ptrdiff_t size)
> +{
> + /*
> + * The following two memory locations should be defined in the linker script file
> + */
> +
> + static const char * heap_ptr; /* pointer to head of heap */
> + const char * old_heap_ptr;
> + static unsigned char init_sbrk = 0;
> +
> + /* heap_ptr is initialized to HEAP_START */
> + if (init_sbrk == 0)
> + {
> + heap_ptr =&_HEAP_START;
> + init_sbrk = 1;
> + }
> +
> + old_heap_ptr = heap_ptr;
> +
> + if ((heap_ptr + size)> &_HEAP_MAX)
> + {
> + /* top of heap is bigger than _HEAP_MAX */
> + errno = ENOMEM;
> + return (void *) -1;
> + }
> +
> + /* success: update heap_ptr and return previous value */
> + heap_ptr += size;
> + return (void *)old_heap_ptr;
> +}
> diff -ruN newlib.orig/libgloss/tic6x/syscalls.c newlib-c6x/libgloss/tic6x/syscalls.c
> --- newlib.orig/libgloss/tic6x/syscalls.c 1969-12-31 16:00:00.000000000 -0800
> +++ newlib-c6x/libgloss/tic6x/syscalls.c 2010-10-01 15:47:12.000000000 -0700
> @@ -0,0 +1,361 @@
> +/* Copyright (c) 2010 CodeSourcery, Inc.
> + All rights reserved.
> +
> + Redistribution and use in source and binary forms, with or without
> + modification, are permitted provided that the following conditions are met:
> + * Redistributions of source code must retain the above copyright
> + notice, this list of conditions and the following disclaimer.
> + * Redistributions in binary form must reproduce the above copyright
> + notice, this list of conditions and the following disclaimer in the
> + documentation and/or other materials provided with the distribution.
> + * Neither the name of CodeSourcery nor the
> + names of its contributors may be used to endorse or promote products
> + derived from this software without specific prior written permission.
> +
> + THIS SOFTWARE IS PROVIDED BY CODESOURCERY, INC. ``AS IS'' AND ANY
> + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
> + PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CODESOURCERY BE LIABLE
> + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
> + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
> + OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
> + BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
> + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
> + USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
> + DAMAGE. */
> +
> +#include<stdio.h>
> +#include<string.h>
> +#include<time.h>
> +#include<sys/time.h>
> +#include<sys/stat.h>
> +#include<errno.h>
> +
> +#define _DTOPEN 0xf0
> +#define _DTCLOSE 0xf1
> +#define _DTREAD 0xf2
> +#define _DTWRITE 0xf3
> +#define _DTLSEEK 0xf4
> +#define _DTUNLINK 0xf5
> +#define _DTGETENV 0xf6
> +#define _DTRENAME 0xf7
> +#define _DTGETTIME 0xf8
> +#define _DTGETCLK 0xf9
> +#define _DTSYNC 0xff
> +
> +#define CIOBUFSIZ (BUFSIZ + 32)
> +
> +struct __attribute__((packed)) cio_open_to_host
> +{
> + /* Suggested file descriptor (little endian). */
> + short fd;
> + /* Flags (little endian). */
> + short flags;
> +};
> +
> +struct __attribute__((packed)) cio_open_from_host
> +{
> + /* File descriptor (little endian). */
> + short fd;
> +};
> +
> +struct __attribute__((packed)) cio_close_to_host
> +{
> + /* File descriptor (little endian). */
> + short fd;
> +};
> +
> +struct __attribute__((packed)) cio_close_from_host
> +{
> + /* Result (little endian). */
> + short result;
> +};
> +
> +struct __attribute__((packed)) cio_read_to_host
> +{
> + /* File descriptor (little endian). */
> + short fd;
> + /* Length (little endian). */
> + short length;
> +};
> +
> +struct __attribute__((packed)) cio_read_from_host
> +{
> + /* Result (little endian). */
> + short result;
> +};
> +
> +struct __attribute__((packed)) cio_write_to_host
> +{
> + /* File descriptor (little endian). */
> + short fd;
> + /* Length (little endian). */
> + short length;
> +};
> +
> +struct __attribute__((packed)) cio_write_from_host
> +{
> + /* Result (little endian). */
> + short result;
> +};
> +
> +struct __attribute__((packed)) cio_lseek_to_host
> +{
> + /* File descriptor (little endian). */
> + short fd;
> + /* Offset (little endian). */
> + int offset;
> + /* Whence (little endian). */
> + short whence;
> +};
> +
> +struct __attribute__((packed)) cio_lseek_from_host
> +{
> + /* Result (little endian). */
> + int result;
> +};
> +
> +struct __attribute__((packed)) cio_unlink_to_host
> +{
> + /* Empty. */
> +};
> +
> +struct __attribute__((packed)) cio_unlink_from_host
> +{
> + /* Result (little endian). */
> + short result;
> +};
> +
> +struct __attribute__((packed)) cio_rename_to_host
> +{
> + /* Empty. */
> +};
> +
> +struct __attribute__((packed)) cio_rename_from_host
> +{
> + /* Result (little endian). */
> + short result;
> +};
> +
> +struct __attribute__((packed)) cio_gettime_to_host
> +{
> + /* Empty. */
> +};
> +
> +struct __attribute__((packed)) cio_gettime_from_host
> +{
> + /* Time (little endian). */
> + int time;
> +};
> +
> +struct __attribute__((packed)) cio_to_host
> +{
> + /* Data length (target endian). */
> + unsigned int length;
> + /* Command. */
> + unsigned char command;
> + /* Parameters. */
> + union
> + {
> + unsigned char buf[8];
> + struct cio_open_to_host open;
> + struct cio_close_to_host close;
> + struct cio_read_to_host read;
> + struct cio_write_to_host write;
> + struct cio_lseek_to_host lseek;
> + struct cio_unlink_to_host unlink;
> + struct cio_rename_to_host rename;
> + struct cio_gettime_to_host gettime;
> + } parms;
> + /* Variable-length data. */
> + unsigned char data[];
> +};
> +
> +struct __attribute__((packed)) cio_from_host
> +{
> + /* Length (target endian). */
> + unsigned int length;
> + /* Parameters. */
> + union
> + {
> + unsigned char buf[8];
> + struct cio_open_from_host open;
> + struct cio_close_from_host close;
> + struct cio_read_from_host read;
> + struct cio_write_from_host write;
> + struct cio_lseek_from_host lseek;
> + struct cio_unlink_from_host unlink;
> + struct cio_rename_from_host rename;
> + struct cio_gettime_from_host gettime;
> + } parms;
> + /* Data. */
> + unsigned char data[];
> +};
> +
> +union
> +{
> + unsigned char buf[CIOBUFSIZ];
> + int align;
> + union
> + {
> + struct cio_to_host to_host;
> + struct cio_from_host from_host;
> + } u;
> +} _CIOBUF_ __attribute__((section(".cio")));
> +
> +#ifdef _BIG_ENDIAN
> +#define SWAPSHORT(s) ((short)((((s)& 0xff)<< 8) | (((s)& 0xff00)>> 8)))
> +#define SWAPINT(i) (__builtin_bswap32 (i))
> +#else
> +#define SWAPSHORT(s) (s)
> +#define SWAPINT(i) (i)
> +#endif
> +
> +static void __attribute__((noinline))
> +do_semi_call (void)
> +{
> + asm volatile (".globl C$$IO$$\nnop\nC$$IO$$:nop" : "+m" (_CIOBUF_));
> +}
> +
> +static inline void
> +semi_call_wrapper (unsigned char command, const char *data,
> + unsigned int length)
> +{
> + _CIOBUF_.u.to_host.length = length;
> + _CIOBUF_.u.to_host.command = command;
> + if (data != NULL)
> + memcpy (_CIOBUF_.u.to_host.data, data, length);
> + do_semi_call ();
> +}
> +
> +static inline void
> +semi_call_wrapper2 (unsigned char command, const char *data1,
> + unsigned int length1, const char *data2,
> + unsigned int length2)
> +{
> + _CIOBUF_.u.to_host.length = length1 + length2;
> + _CIOBUF_.u.to_host.command = command;
> + if (data1 != NULL)
> + memcpy (_CIOBUF_.u.to_host.data, data1, length1);
> + if (data2 != NULL)
> + memcpy (_CIOBUF_.u.to_host.data + length1, data2, length2);
> + do_semi_call ();
> +}
> +
> +void
> +_exit (int status)
> +{
> + /* The semihosting interface appears to provide no way to return an
> + exit status. */
> + asm volatile (".globl C$$EXIT\nnop\nC$$EXIT:nop");
> +}
> +
> +int
> +open (const char *path, int flags, ...)
> +{
> + /* ??? It's not clear what the suggested fd is for. */
> + static short suggest_fd = 3;
> + short ret_fd;
> + ++suggest_fd;
> + _CIOBUF_.u.to_host.parms.open.fd = SWAPSHORT (suggest_fd);
> + _CIOBUF_.u.to_host.parms.open.flags = SWAPSHORT (flags);
> + semi_call_wrapper (_DTOPEN, path, strlen (path) + 1);
> + ret_fd = SWAPSHORT (_CIOBUF_.u.from_host.parms.open.fd);
> + if (ret_fd == -1)
> + return -1;
> + return suggest_fd;
> +}
> +
> +int
> +close (int fd)
> +{
> + _CIOBUF_.u.to_host.parms.close.fd = SWAPSHORT (fd);
> + semi_call_wrapper (_DTCLOSE, NULL, 0);
> + return SWAPSHORT (_CIOBUF_.u.from_host.parms.close.result);
> +}
> +
> +int
> +read (int fd, char *ptr, int len)
> +{
> + if (len> BUFSIZ)
> + len = BUFSIZ;
> + _CIOBUF_.u.to_host.parms.read.fd = SWAPSHORT (fd);
> + _CIOBUF_.u.to_host.parms.read.length = SWAPSHORT (len);
> + semi_call_wrapper (_DTREAD, NULL, 0);
> + memcpy (ptr, _CIOBUF_.u.from_host.data, _CIOBUF_.u.from_host.length);
> + return SWAPSHORT (_CIOBUF_.u.from_host.parms.read.result);
> +}
> +
> +int
> +write (int fd, char *ptr, int len)
> +{
> + if (len> BUFSIZ)
> + len = BUFSIZ;
> + _CIOBUF_.u.to_host.parms.write.fd = SWAPSHORT (fd);
> + _CIOBUF_.u.to_host.parms.write.length = SWAPSHORT (len);
> + semi_call_wrapper (_DTWRITE, ptr, len);
> + return SWAPSHORT (_CIOBUF_.u.from_host.parms.write.result);
> +}
> +
> +int
> +lseek (int fd, int offset, int whence)
> +{
> + _CIOBUF_.u.to_host.parms.lseek.fd = SWAPSHORT (fd);
> + _CIOBUF_.u.to_host.parms.lseek.offset = SWAPINT (offset);
> + _CIOBUF_.u.to_host.parms.lseek.whence = SWAPSHORT (whence);
> + semi_call_wrapper (_DTLSEEK, NULL, 0);
> + return SWAPINT (_CIOBUF_.u.from_host.parms.lseek.result);
> +}
> +
> +int
> +unlink (const char *path)
> +{
> + semi_call_wrapper (_DTUNLINK, path, strlen (path) + 1);
> + return SWAPSHORT (_CIOBUF_.u.from_host.parms.unlink.result);
> +}
> +
> +int
> +rename (const char *oldpath, const char *newpath)
> +{
> + semi_call_wrapper2 (_DTRENAME, oldpath, strlen (oldpath) + 1,
> + newpath, strlen (newpath) + 1);
> + return SWAPSHORT (_CIOBUF_.u.from_host.parms.rename.result);
> +}
> +
> +int
> +gettimeofday (struct timeval *tp, void *tzvp)
> +{
> + struct timezone *tzp = tzvp;
> +
> + if (tp)
> + {
> + semi_call_wrapper (_DTGETTIME, NULL, 0);
> + tp->tv_sec = SWAPINT (_CIOBUF_.u.from_host.parms.gettime.time);
> + tp->tv_usec = 0;
> + }
> +
> + if (tzp)
> + {
> + tzp->tz_minuteswest = 0;
> + tzp->tz_dsttime = 0;
> + }
> +
> + return 0;
> +}
> +
> +int
> +isatty (int file __attribute__((unused)))
> +{
> + errno = ENOSYS;
> + return 0;
> +}
> +
> +int
> +fstat (int fd, struct stat *buf)
> +{
> + buf->st_mode = S_IFCHR; /* Always pretend to be a tty */
> + buf->st_blksize = 0;
> +
> + return (0);
> +}
> diff -ruN newlib.orig/newlib/configure.host newlib-c6x/newlib/configure.host
> --- newlib.orig/newlib/configure.host 2010-07-23 11:11:26.000000000 -0700
> +++ newlib-c6x/newlib/configure.host 2010-10-01 15:47:12.000000000 -0700
> @@ -249,6 +249,9 @@
> tic4x|c4x)
> machine_dir=tic4x
> ;;
> + tic6x)
> + machine_dir=tic6x
> + ;;
> tic80*)
> machine_dir=tic80
> ;;
> @@ -496,6 +499,10 @@
> have_crt0="no"
> fi
> ;;
> + tic6x*)
> + newlib_cflags="${newlib_cflags} -DMISSING_SYSCALL_NAMES"
> + have_crt0="no"
> + ;;
> tic80*)
> sys_dir=tic80
> ;;
> @@ -762,6 +769,9 @@
> newlib_cflags="${newlib_cflags} -DARM_RDI_MONITOR"
> fi
> ;;
> + tic6x*)
> + syscall_dir=
> + ;;
> tic80*)
> syscall_dir=syscalls
> ;;
> diff -ruN newlib.orig/newlib/libc/include/machine/ieeefp.h newlib-c6x/newlib/libc/include/machine/ieeefp.h
> --- newlib.orig/newlib/libc/include/machine/ieeefp.h 2010-06-18 09:26:25.000000000 -0700
> +++ newlib-c6x/newlib/libc/include/machine/ieeefp.h 2010-10-01 15:47:12.000000000 -0700
> @@ -166,6 +166,14 @@
> #define _DOUBLE_IS_32BITS
> #endif
>
> +#ifdef __TMS320C6X__
> +#ifdef _BIG_ENDIAN
> +#define __IEEE_BIG_ENDIAN
> +#else
> +#define __IEEE_LITTLE_ENDIAN
> +#endif
> +#endif
> +
> #ifdef __TIC80__
> #define __IEEE_LITTLE_ENDIAN
> #endif
> diff -ruN newlib.orig/newlib/libc/include/machine/setjmp.h newlib-c6x/newlib/libc/include/machine/setjmp.h
> --- newlib.orig/newlib/libc/include/machine/setjmp.h 2009-12-17 11:24:22.000000000 -0800
> +++ newlib-c6x/newlib/libc/include/machine/setjmp.h 2010-10-01 15:47:12.000000000 -0700
> @@ -174,6 +174,10 @@
> #define _JBLEN 9
> #endif
>
> +#ifdef __TMS320C6X__
> +#define _JBLEN 13
> +#endif
> +
> #ifdef __TIC80__
> #define _JBLEN 13
> #endif
> diff -ruN newlib.orig/newlib/libc/machine/configure.in newlib-c6x/newlib/libc/machine/configure.in
> --- newlib.orig/newlib/libc/machine/configure.in 2010-02-24 12:59:48.000000000 -0800
> +++ newlib-c6x/newlib/libc/machine/configure.in 2010-10-01 15:47:12.000000000 -0700
> @@ -58,6 +58,7 @@
> sparc) AC_CONFIG_SUBDIRS(sparc) ;;
> spu) AC_CONFIG_SUBDIRS(spu) ;;
> tic4x) AC_CONFIG_SUBDIRS(tic4x) ;;
> + tic6x) AC_CONFIG_SUBDIRS(tic6x) ;;
> tic80) AC_CONFIG_SUBDIRS(tic80) ;;
> v850) AC_CONFIG_SUBDIRS(v850) ;;
> w65) AC_CONFIG_SUBDIRS(w65) ;;
> diff -ruN newlib.orig/newlib/libc/machine/tic6x/Makefile.am newlib-c6x/newlib/libc/machine/tic6x/Makefile.am
> --- newlib.orig/newlib/libc/machine/tic6x/Makefile.am 1969-12-31 16:00:00.000000000 -0800
> +++ newlib-c6x/newlib/libc/machine/tic6x/Makefile.am 2010-10-01 15:47:12.000000000 -0700
> @@ -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
> +lib_a_CCASFLAGS=$(AM_CCASFLAGS)
> +lib_a_CFLAGS=$(AM_CFLAGS)
> +
> +ACLOCAL_AMFLAGS = -I ../../.. -I ../../../..
> +CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host
> diff -ruN newlib.orig/newlib/libc/machine/tic6x/configure.in newlib-c6x/newlib/libc/machine/tic6x/configure.in
> --- newlib.orig/newlib/libc/machine/tic6x/configure.in 1969-12-31 16:00:00.000000000 -0800
> +++ newlib-c6x/newlib/libc/machine/tic6x/configure.in 2010-10-01 15:47:12.000000000 -0700
> @@ -0,0 +1,14 @@
> +dnl This is the newlib/libc/machine/tic6x 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([setjmp.S])
> +
> +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 -ruN newlib.orig/newlib/libc/machine/tic6x/setjmp.S newlib-c6x/newlib/libc/machine/tic6x/setjmp.S
> --- newlib.orig/newlib/libc/machine/tic6x/setjmp.S 1969-12-31 16:00:00.000000000 -0800
> +++ newlib-c6x/newlib/libc/machine/tic6x/setjmp.S 2010-10-01 15:47:12.000000000 -0700
> @@ -0,0 +1,96 @@
> +;******************************************************************************
> +;* SETJMP v7.2.0I10181 *
> +;* *
> +;* Copyright (c) 1996-2010 Texas Instruments Incorporated *
> +;* http://www.ti.com/ *
> +;* *
> +;* Redistribution and use in source and binary forms, with or without *
> +;* modification, are permitted provided that the following conditions *
> +;* are met: *
> +;* *
> +;* Redistributions of source code must retain the above copyright *
> +;* notice, this list of conditions and the following disclaimer. *
> +;* *
> +;* Redistributions in binary form must reproduce the above copyright *
> +;* notice, this list of conditions and the following disclaimer in *
> +;* the documentation and/or other materials provided with the *
> +;* distribution. *
> +;* *
> +;* Neither the name of Texas Instruments Incorporated nor the names *
> +;* of its contributors may be used to endorse or promote products *
> +;* derived from this software without specific prior written *
> +;* permission. *
> +;* *
> +;* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
> +;* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT *
> +;* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR *
> +;* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT *
> +;* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, *
> +;* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT *
> +;* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
> +;* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY *
> +;* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT *
> +;* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE *
> +;* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
> +;* *
> +;******************************************************************************
> +
> +.text
> +.globl setjmp
> +.type setjmp,%function
> +setjmp:
> + MV .L2X A4, B4
> +|| STW .D1T2 B3, *+A4(48)
> +
> + STW .D1T1 A10, *+A4(0)
> +|| STW .D2T2 B10, *+B4(4)
> +|| RET .S2 B3
> +
> + STW .D1T1 A11, *+A4(8)
> +|| STW .D2T2 B11, *+B4(12)
> +
> + STW .D1T1 A12, *+A4(16)
> +|| STW .D2T2 B12, *+B4(20)
> +
> + STW .D1T1 A13, *+A4(24)
> +|| STW .D2T2 B13, *+B4(28)
> +
> + STW .D1T1 A14, *+A4(32)
> +|| STW .D2T2 B14, *+B4(36)
> +
> + STW .D1T1 A15, *+A4(40)
> +|| STW .D2T2 B15, *+B4(44)
> +|| ZERO .S1 A4
> +.size setjmp, . - setjmp
> +
> +.globl longjmp
> +.type longjmp,%function
> +longjmp:
> + LDW .D1T1 *+A4(48), A3
> +
> + MV .L2X A4, B6
> +|| MV .S1 A4, A6
> +|| MV .D2 B4, B2
> +
> + LDW .D1T1 *+A6(0), A10
> +|| LDW .D2T2 *+B6(4), B10
> +|| [B2] MV .L1X B4, A4
> +|| [!B2] MVK .S1 1, A4
> +
> + LDW .D1T1 *+A6(8), A11
> +|| LDW .D2T2 *+B6(12), B11
> +
> + LDW .D1T1 *+A6(16), A12
> +|| LDW .D2T2 *+B6(20), B12
> +
> + LDW .D1T1 *+A6(24), A13
> +|| LDW .D2T2 *+B6(28), B13
> +
> + LDW .D1T1 *+A6(32), A14
> +|| LDW .D2T2 *+B6(36), B14
> +
> + LDW .D1T1 *+A6(40), A15
> +|| LDW .D2T2 *+B6(44), B15
> +|| RET .S2X A3
> + NOP 5
> +.size longjmp, . - longjmp
>
More information about the Newlib
mailing list