From 61ba976360804d85f9203821518bb4b132852188 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Tue, 22 Feb 2000 18:39:52 +0000 Subject: New port of RTEMS to TI C3x and C4x. --- c/src/lib/libbsp/c4x/c4xsim/Makefile.am | 17 ++ c/src/lib/libbsp/c4x/c4xsim/README | 46 +++ c/src/lib/libbsp/c4x/c4xsim/bsp_specs | 23 ++ c/src/lib/libbsp/c4x/c4xsim/clock/Makefile.am | 32 ++ c/src/lib/libbsp/c4x/c4xsim/clock/clock.c | 225 ++++++++++++++ c/src/lib/libbsp/c4x/c4xsim/configure.in | 35 +++ c/src/lib/libbsp/c4x/c4xsim/console/Makefile.am | 34 +++ c/src/lib/libbsp/c4x/c4xsim/console/console.c | 155 ++++++++++ .../c4x/c4xsim/console/consolereserveresources.c | 26 ++ c/src/lib/libbsp/c4x/c4xsim/console/debugio.c | 57 ++++ c/src/lib/libbsp/c4x/c4xsim/console/simio.c | 308 +++++++++++++++++++ c/src/lib/libbsp/c4x/c4xsim/include/Makefile.am | 32 ++ c/src/lib/libbsp/c4x/c4xsim/include/bsp.h | 118 ++++++++ c/src/lib/libbsp/c4x/c4xsim/include/simio.h | 25 ++ c/src/lib/libbsp/c4x/c4xsim/start/Makefile.am | 32 ++ c/src/lib/libbsp/c4x/c4xsim/start/start.S | 71 +++++ c/src/lib/libbsp/c4x/c4xsim/startup/Makefile.am | 43 +++ c/src/lib/libbsp/c4x/c4xsim/startup/bspstart.c | 124 ++++++++ c/src/lib/libbsp/c4x/c4xsim/startup/linkcmds | 76 +++++ c/src/lib/libbsp/c4x/c4xsim/startup/spurious.c | 33 ++ c/src/lib/libbsp/c4x/c4xsim/timer/Makefile.am | 32 ++ c/src/lib/libbsp/c4x/c4xsim/timer/timer.c | 117 ++++++++ c/src/lib/libbsp/c4x/c4xsim/tools/Makefile.am | 15 + c/src/lib/libbsp/c4x/c4xsim/tools/configure.in | 23 ++ c/src/lib/libbsp/c4x/c4xsim/tools/runtest.in | 331 +++++++++++++++++++++ c/src/lib/libbsp/c4x/c4xsim/wrapup/Makefile.am | 35 +++ 26 files changed, 2065 insertions(+) create mode 100644 c/src/lib/libbsp/c4x/c4xsim/Makefile.am create mode 100644 c/src/lib/libbsp/c4x/c4xsim/README create mode 100644 c/src/lib/libbsp/c4x/c4xsim/bsp_specs create mode 100644 c/src/lib/libbsp/c4x/c4xsim/clock/Makefile.am create mode 100644 c/src/lib/libbsp/c4x/c4xsim/clock/clock.c create mode 100644 c/src/lib/libbsp/c4x/c4xsim/configure.in create mode 100644 c/src/lib/libbsp/c4x/c4xsim/console/Makefile.am create mode 100644 c/src/lib/libbsp/c4x/c4xsim/console/console.c create mode 100644 c/src/lib/libbsp/c4x/c4xsim/console/consolereserveresources.c create mode 100644 c/src/lib/libbsp/c4x/c4xsim/console/debugio.c create mode 100644 c/src/lib/libbsp/c4x/c4xsim/console/simio.c create mode 100644 c/src/lib/libbsp/c4x/c4xsim/include/Makefile.am create mode 100644 c/src/lib/libbsp/c4x/c4xsim/include/bsp.h create mode 100644 c/src/lib/libbsp/c4x/c4xsim/include/simio.h create mode 100644 c/src/lib/libbsp/c4x/c4xsim/start/Makefile.am create mode 100644 c/src/lib/libbsp/c4x/c4xsim/start/start.S create mode 100644 c/src/lib/libbsp/c4x/c4xsim/startup/Makefile.am create mode 100644 c/src/lib/libbsp/c4x/c4xsim/startup/bspstart.c create mode 100644 c/src/lib/libbsp/c4x/c4xsim/startup/linkcmds create mode 100644 c/src/lib/libbsp/c4x/c4xsim/startup/spurious.c create mode 100644 c/src/lib/libbsp/c4x/c4xsim/timer/Makefile.am create mode 100644 c/src/lib/libbsp/c4x/c4xsim/timer/timer.c create mode 100644 c/src/lib/libbsp/c4x/c4xsim/tools/Makefile.am create mode 100644 c/src/lib/libbsp/c4x/c4xsim/tools/configure.in create mode 100644 c/src/lib/libbsp/c4x/c4xsim/tools/runtest.in create mode 100644 c/src/lib/libbsp/c4x/c4xsim/wrapup/Makefile.am (limited to 'c/src/lib/libbsp/c4x/c4xsim') diff --git a/c/src/lib/libbsp/c4x/c4xsim/Makefile.am b/c/src/lib/libbsp/c4x/c4xsim/Makefile.am new file mode 100644 index 0000000000..f6239d217d --- /dev/null +++ b/c/src/lib/libbsp/c4x/c4xsim/Makefile.am @@ -0,0 +1,17 @@ +## +## $Id$ +## + +AUTOMAKE_OPTIONS = foreign 1.4 +ACLOCAL_AMFLAGS = -I $(RTEMS_TOPdir)/aclocal + +# wrapup is the one that actually builds and installs the library +# from the individual .rel files built in other directories +SUBDIRS = . start include startup console clock timer wrapup tools + +include $(top_srcdir)/../../bsp.am + +EXTRA_DIST = bsp_specs times + +include $(top_srcdir)/../../../../../../automake/subdirs.am +include $(top_srcdir)/../../../../../../automake/local.am diff --git a/c/src/lib/libbsp/c4x/c4xsim/README b/c/src/lib/libbsp/c4x/c4xsim/README new file mode 100644 index 0000000000..8bb3beda0d --- /dev/null +++ b/c/src/lib/libbsp/c4x/c4xsim/README @@ -0,0 +1,46 @@ +# +# $Id$ +# + +BSP NAME: c4xsim +BOARD: Simulator in GDB +BUS: N/A +CPU FAMILY: ppc +CPU: C32 and others +COPROCESSORS: N/A +MODE: 32 bit mode + +DEBUG MONITOR: gdb simulator + +PERIPHERALS +=========== +TIMERS: PPC internal Timebase register + RESOLUTION: ??? +SERIAL PORTS: simulated via +REAL-TIME CLOCK: ??? +DMA: none +VIDEO: none +SCSI: none +NETWORKING: none + +DRIVER INFORMATION +================== +CLOCK DRIVER: ??? +IOSUPP DRIVER: N/A +SHMSUPP: N/A +TIMER DRIVER: ??? +TTY DRIVER: ??? + +STDIO +===== +PORT: Console port 0 +ELECTRICAL: na +BAUD: na +BITS PER CHARACTER: na +PARITY: na +STOP BITS: na + +Notes +===== + +NONE diff --git a/c/src/lib/libbsp/c4x/c4xsim/bsp_specs b/c/src/lib/libbsp/c4x/c4xsim/bsp_specs new file mode 100644 index 0000000000..61dac86b53 --- /dev/null +++ b/c/src/lib/libbsp/c4x/c4xsim/bsp_specs @@ -0,0 +1,23 @@ +%rename cpp old_cpp +%rename lib old_lib +%rename endfile old_endfile +%rename startfile old_startfile +%rename link old_link + +*cpp: +%(old_cpp) %{qrtems: -D__embedded__} -Asystem(embedded) + +*lib: +%{!qrtems: %(old_lib)} %{qrtems: --start-group \ +%{!qrtems_debug: -lrtemsall} %{qrtems_debug: -lrtemsall_g} \ +-lc -lgcc --end-group \ +%{!qnolinkcmds: -T linkcmds%s}} + +*startfile: +%{!qrtems: %(old_startfile)} %{qrtems: \ +%{!qrtems_debug: start.o%s} \ +%{qrtems_debug: start_g.o%s}} + +*link: +%{!qrtems: %(old_link)} %{qrtems: -dc -dp -N -e start} + diff --git a/c/src/lib/libbsp/c4x/c4xsim/clock/Makefile.am b/c/src/lib/libbsp/c4x/c4xsim/clock/Makefile.am new file mode 100644 index 0000000000..1f2b57d4c5 --- /dev/null +++ b/c/src/lib/libbsp/c4x/c4xsim/clock/Makefile.am @@ -0,0 +1,32 @@ +## +## $Id$ +## + +AUTOMAKE_OPTIONS = foreign 1.4 + +PGM = $(ARCH)/clock.rel + +C_FILES = clock.c +C_O_FILES = $(C_FILES:%.c=$(ARCH)/%.o) + +OBJS = $(C_O_FILES) + +include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg +include $(top_srcdir)/../../../../../../automake/lib.am + +# +# (OPTIONAL) Add local stuff here using += +# + +$(PGM): $(OBJS) + $(make-rel) + +# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile + +all-local: $(ARCH) $(OBJS) $(PGM) + +.PRECIOUS: $(PGM) + +EXTRA_DIST = ckinit.c + +include $(top_srcdir)/../../../../../../automake/local.am diff --git a/c/src/lib/libbsp/c4x/c4xsim/clock/clock.c b/c/src/lib/libbsp/c4x/c4xsim/clock/clock.c new file mode 100644 index 0000000000..7b36ebb359 --- /dev/null +++ b/c/src/lib/libbsp/c4x/c4xsim/clock/clock.c @@ -0,0 +1,225 @@ +/* ckinit.c + * + * This file provides a template for the clock device driver initialization. + * + * COPYRIGHT (c) 1989-1999. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include + +#include +#include +#include +#include + +void Clock_exit( void ); +rtems_isr Clock_isr( rtems_vector_number vector ); + +rtems_unsigned32 Clock_counter_register_value; + +/* + * The interrupt vector number associated with the clock tick device + * driver. + */ + +#define CLOCK_VECTOR 9 + +/* + * Clock_driver_ticks is a monotonically increasing counter of the + * number of clock ticks since the driver was initialized. + */ + +volatile rtems_unsigned32 Clock_driver_ticks; + +/* + * These are set by clock driver during its init + */ + +rtems_device_major_number rtems_clock_major = ~0; +rtems_device_minor_number rtems_clock_minor; + +/* + * The previous ISR on this clock tick interrupt vector. + */ + +rtems_isr_entry Old_ticker; + +void Clock_exit( void ); + + +/* + * Isr Handler + */ + +#define FAST_IDLE 1 +#if FAST_IDLE +int Clock_in_fast_idle_mode = 0; +#endif + +rtems_isr Clock_isr( + rtems_vector_number vector +) +{ + /* + * The counter register gets reset automatically as well as the + * interrupt occurred flag so we should not have to do anything + * with the hardware. + */ + + /* + * Bump the number of clock driver ticks since initialization + */ + + Clock_driver_ticks += 1; + + rtems_clock_tick(); + +#if FAST_IDLE + if ( Clock_in_fast_idle_mode ) { + if ( _Thread_Executing == _Thread_Idle && _Thread_Heir != _Thread_Idle ) { + c4x_timer_stop( C4X_TIMER_0 ); + c4x_timer_set_counter( C4X_TIMER_0, 0 ); + c4x_timer_set_period( C4X_TIMER_0, Clock_counter_register_value ); + c4x_timer_start( C4X_TIMER_0 ); + Clock_in_fast_idle_mode = 0; + } + } else { + if ( _Thread_Executing == _Thread_Idle && _Thread_Heir == _Thread_Idle ) { + c4x_timer_stop( C4X_TIMER_0 ); + c4x_timer_set_counter( C4X_TIMER_0, 0 ); + c4x_timer_set_period( C4X_TIMER_0, Clock_counter_register_value >> 5 ); + c4x_timer_start( C4X_TIMER_0 ); + } + } +#endif +} + +/* + * Install_clock + * + * Install a clock tick handler and reprograms the chip. This + * is used to initially establish the clock tick. + */ + +void Install_clock( + rtems_isr_entry clock_isr +) +{ + extern int _ClockFrequency; + float tmp; + int tmpi; + /* + * Initialize the clock tick device driver variables + */ + + Clock_driver_ticks = 0; + + tmpi = ((int) &_ClockFrequency) * 1000000; /* ClockFrequency is in Mhz */ + tmp = (float) tmpi / 2.0; + tmp = ((float) BSP_Configuration.microseconds_per_tick / 1000000.0) * (tmp); + + Clock_counter_register_value = (unsigned int) tmp; +#if 0 + Clock_counter_register_value = + (unsigned32) ((float) BSP_Configuration.microseconds_per_tick / + ((float)_ClockFrequency / 2.0))); +#endif + c4x_timer_stop( C4X_TIMER_0 ); + c4x_timer_set_counter( C4X_TIMER_0, 0 ); + c4x_timer_set_period( C4X_TIMER_0, Clock_counter_register_value ); + c4x_timer_start( C4X_TIMER_0 ); + + c3x_set_ie( c3x_get_ie() | 0x100 ); + + /* + * If ticks_per_timeslice is configured as non-zero, then the user + * wants a clock tick. + */ + + Old_ticker = (rtems_isr_entry) set_vector( clock_isr, CLOCK_VECTOR, 1 ); + /* + * Hardware specific initialize goes here + */ + + /* XXX */ + + /* + * Schedule the clock cleanup routine to execute if the application exits. + */ + + atexit( Clock_exit ); +} + +/* + * Clean up before the application exits + */ + +void Clock_exit( void ) +{ + /* XXX: turn off the timer interrupts */ + + /* XXX: If necessary, restore the old vector */ +} + +/* + * Clock_initialize + * + * Device driver entry point for clock tick driver initialization. + */ + +rtems_device_driver Clock_initialize( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *pargp +) +{ + Install_clock( Clock_isr ); + + /* + * make major/minor avail to others such as shared memory driver + */ + + rtems_clock_major = major; + rtems_clock_minor = minor; + + return RTEMS_SUCCESSFUL; +} + +rtems_device_driver Clock_control( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *pargp +) +{ + rtems_unsigned32 isrlevel; + rtems_libio_ioctl_args_t *args = pargp; + + if (args == 0) + goto done; + + /* + * This is hokey, but until we get a defined interface + * to do this, it will just be this simple... + */ + + if (args->command == rtems_build_name('I', 'S', 'R', ' ')) + { + Clock_isr(CLOCK_VECTOR); + } + else if (args->command == rtems_build_name('N', 'E', 'W', ' ')) + { + rtems_interrupt_disable( isrlevel ); + (void) set_vector( args->buffer, CLOCK_VECTOR, 1 ); + rtems_interrupt_enable( isrlevel ); + } + +done: + return RTEMS_SUCCESSFUL; +} diff --git a/c/src/lib/libbsp/c4x/c4xsim/configure.in b/c/src/lib/libbsp/c4x/c4xsim/configure.in new file mode 100644 index 0000000000..c5e0f5558a --- /dev/null +++ b/c/src/lib/libbsp/c4x/c4xsim/configure.in @@ -0,0 +1,35 @@ +dnl Process this file with autoconf to produce a configure script. +dnl +dnl $Id$ + +AC_PREREQ(2.13) +AC_INIT(bsp_specs) +RTEMS_TOP(../../../../../..) +AC_CONFIG_AUX_DIR(../../../../../..) + +RTEMS_CANONICAL_TARGET_CPU +AM_INIT_AUTOMAKE(rtems-c-src-lib-libbsp-sparc-erc32,$RTEMS_VERSION,no) +AM_MAINTAINER_MODE + +RTEMS_PROG_CC_FOR_TARGET +RTEMS_CANONICALIZE_TOOLS + +RTEMS_ENV_RTEMSBSP +RTEMS_CHECK_CUSTOM_BSP(RTEMS_BSP) +RTEMS_CHECK_BSP_CACHE(RTEMS_BSP) +RTEMS_CANONICAL_HOST + +AC_CONFIG_SUBDIRS(tools) + +RTEMS_PROJECT_ROOT + +# Explicitly list all Makefiles here +AC_OUTPUT( +Makefile +clock/Makefile +console/Makefile +include/Makefile +start/Makefile +startup/Makefile +timer/Makefile +wrapup/Makefile) diff --git a/c/src/lib/libbsp/c4x/c4xsim/console/Makefile.am b/c/src/lib/libbsp/c4x/c4xsim/console/Makefile.am new file mode 100644 index 0000000000..b05928ea32 --- /dev/null +++ b/c/src/lib/libbsp/c4x/c4xsim/console/Makefile.am @@ -0,0 +1,34 @@ +## +## $Id$ +## + +AUTOMAKE_OPTIONS = foreign 1.4 + +PGM = $(ARCH)/console.rel + +VPATH = @srcdir@:@srcdir@/../../../shared + +C_FILES = console.c consolereserveresources.c debugio.c simio.c printk.c +C_O_FILES = $(C_FILES:%.c=$(ARCH)/%.o) + +OBJS = $(C_O_FILES) + +include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg +include $(top_srcdir)/../../../../../../automake/lib.am + +# +# (OPTIONAL) Add local stuff here using += +# + +$(PGM): $(OBJS) + $(make-rel) + +# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile + +all-local: $(ARCH) $(OBJS) $(PGM) + +.PRECIOUS: $(PGM) + +EXTRA_DIST = console.c consolereserveresources.c debugputs.c + +include $(top_srcdir)/../../../../../../automake/local.am diff --git a/c/src/lib/libbsp/c4x/c4xsim/console/console.c b/c/src/lib/libbsp/c4x/c4xsim/console/console.c new file mode 100644 index 0000000000..08fad800ea --- /dev/null +++ b/c/src/lib/libbsp/c4x/c4xsim/console/console.c @@ -0,0 +1,155 @@ +/* + * This file contains the hardware specific portions of the TTY driver + * for the serial ports on the erc32. + * + * COPYRIGHT (c) 1989-1997. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include +#include +#include +#include + +#include + +/* + * console_outbyte_polled + * + * This routine transmits a character using polling. + */ + +void console_outbyte_polled( + int port, + char ch +); + +/* + * console_inbyte_nonblocking + * + * This routine polls for a character. + */ + +int console_inbyte_nonblocking( + int port +); + +/* + * Console Termios Support Entry Points + * + */ + +int console_write_support ( + int minor, + const char *bufarg, + int len +) +{ + int nwrite = 0; + const char *buf = bufarg; + + while (nwrite < len) { + if ( *buf ) + console_outbyte_polled( minor, *buf & 0x7f ); + buf++; + nwrite++; + } + return nwrite; +} + +/* + * Console Device Driver Entry Points + * + */ + +rtems_device_driver console_initialize( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *arg +) +{ + rtems_status_code status; + + rtems_termios_initialize(); + + /* + * Register Device Names + */ + + status = rtems_io_register_name( "/dev/console", major, 0 ); + if (status != RTEMS_SUCCESSFUL) + rtems_fatal_error_occurred(status); + + return RTEMS_SUCCESSFUL; +} + +rtems_device_driver console_open( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + rtems_status_code sc; + static const rtems_termios_callbacks pollCallbacks = { + NULL, /* firstOpen */ + NULL, /* lastClose */ + console_inbyte_nonblocking, /* pollRead */ + console_write_support, /* write */ + NULL, /* setAttributes */ + NULL, /* stopRemoteTx */ + NULL, /* startRemoteTx */ + 0 /* outputUsesInterrupts */ + }; + + + assert( minor <= 1 ); + if ( minor > 2 ) + return RTEMS_INVALID_NUMBER; + + sc = rtems_termios_open (major, minor, arg, &pollCallbacks ); + + return RTEMS_SUCCESSFUL; +} + +rtems_device_driver console_close( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return rtems_termios_close (arg); +} + +rtems_device_driver console_read( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return rtems_termios_read (arg); +} + +rtems_device_driver console_write( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return rtems_termios_write (arg); +} + +rtems_device_driver console_control( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return rtems_termios_ioctl (arg); +} diff --git a/c/src/lib/libbsp/c4x/c4xsim/console/consolereserveresources.c b/c/src/lib/libbsp/c4x/c4xsim/console/consolereserveresources.c new file mode 100644 index 0000000000..40a65de7c5 --- /dev/null +++ b/c/src/lib/libbsp/c4x/c4xsim/console/consolereserveresources.c @@ -0,0 +1,26 @@ +/* + * This file contains the TTY driver for the serial ports on the erc32. + * + * This driver uses the termios pseudo driver. + * + * COPYRIGHT (c) 1989-1999. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include +#include +#include +#include + +void console_reserve_resources( + rtems_configuration_table *configuration +) +{ + rtems_termios_reserve_resources( configuration, 2 ); +} diff --git a/c/src/lib/libbsp/c4x/c4xsim/console/debugio.c b/c/src/lib/libbsp/c4x/c4xsim/console/debugio.c new file mode 100644 index 0000000000..5c066bcad0 --- /dev/null +++ b/c/src/lib/libbsp/c4x/c4xsim/console/debugio.c @@ -0,0 +1,57 @@ +/* + * This file contains the TTY driver for the serial ports on the erc32. + * + * This driver uses the termios pseudo driver. + * + * COPYRIGHT (c) 1989-1999. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include +#include +#include +#include + +#include + +/* + * console_outbyte_polled + * + * This routine transmits a character using polling. + */ + +void console_outbyte_polled( + int port, + char ch +) +{ + char out[2]; + out[0] = ch; + out[1] = 0; + sim_write(1, out, 1); +} + +C4X_BSP_output_char( int c ) +{ + console_outbyte_polled( 0, (char) c ); +} + +/* + * console_inbyte_nonblocking + * + * This routine polls for a character. + */ + +int console_inbyte_nonblocking( int port ) +{ + char c; + sim_read(1, &c, 1); + return c; +} + diff --git a/c/src/lib/libbsp/c4x/c4xsim/console/simio.c b/c/src/lib/libbsp/c4x/c4xsim/console/simio.c new file mode 100644 index 0000000000..6b976737e4 --- /dev/null +++ b/c/src/lib/libbsp/c4x/c4xsim/console/simio.c @@ -0,0 +1,308 @@ +/* + * C4x simulator IO interface routines based on code provided + * by Herman ten Brugge + * + * $Id$ + */ + +#include + +#define SIM_OPEN (0xf0) +#define SIM_CLOSE (0xf1) +#define SIM_READ (0xf2) +#define SIM_WRITE (0xf3) +#define SIM_LSEEK (0xf4) +#define SIM_UNLINK (0xf5) +#define SIM_GETENV (0xf6) +#define SIM_RENAME (0xf7) +#define SIM_GETTIME (0xf8) +#define SIM_GETCLOCK (0xf9) + +typedef union _io { + struct _open { + int fd : 16; + int flags : 16; + } open; + struct _openr { + int result : 16; + } openr; + struct _close { + int fd : 16; + } close; + struct _closer { + int result : 16; + } closer; + struct _read { + int fd : 16; + int count : 16; + } read; + struct _readr { + int result : 16; + } readr; + struct _write { + int fd : 16; + int count : 16; + } write; + struct _writer { + int result : 16; + } writer; + struct _lseek { + int fd : 16; + int offsetlow : 16; + int offsethigh : 16; + int orgin : 16; + } lseek; + struct _lseekr { + int result; + } lseekr; + struct _unlinkr { + int result : 16; + } unlinkr; + struct _renamer { + int result : 16; + } renamer; + struct _getenvr { + int result : 16; + } getenvr; + struct _gettimer { + int result; + } gettimer; + struct _getclockr { + int result; + } getclockr; + struct _common { + int word1; + int word2; + } common; +} io; + +static void to_sim(int command, io *param, char *data, int length); +static void call_sim(void); +static void from_sim(io *param, char *data); + +void sim_exit(void) +{ + __asm__(" .global C$$EXIT"); + __asm__("C$$EXIT: nop"); + __asm__("nop"); +} + +int sim_open(const char *path, unsigned flags, int fno) +{ + io param; + + param.open.fd = fno; + param.open.flags = flags; + to_sim(SIM_OPEN,¶m,(char *)path,strlen(path)+1); + call_sim(); + from_sim(¶m, NULL); + return param.openr.result; +} + +int sim_close(int fno) +{ + io param; + + param.close.fd = fno; + to_sim(SIM_CLOSE,¶m,NULL,0); + call_sim(); + from_sim(¶m, NULL); + return param.closer.result; +} + +int sim_read(int fno, char *buf, unsigned count) +{ + io param; + + param.read.fd = fno; + param.read.count = count; + to_sim(SIM_READ,¶m,NULL,0); + call_sim(); + from_sim(¶m, buf); + return param.readr.result; +} + +int sim_write(int fno, const char *buf, unsigned count) +{ + io param; + + param.write.fd = fno; + param.write.count = count; + to_sim(SIM_WRITE,¶m,(char *)buf,count); + call_sim(); + from_sim(¶m, NULL); + return param.writer.result; +} + +fpos_t sim_lseek(int fno, fpos_t offset, int origin) +{ + io param; + + param.lseek.fd = fno; + param.lseek.offsetlow = offset & 0xffff; + param.lseek.offsethigh = offset >> 16; + to_sim(SIM_LSEEK,¶m,NULL,0); + call_sim(); + from_sim(¶m, NULL); + return param.lseekr.result; +} + +int sim_unlink(const char *path) +{ + io param; + + to_sim(SIM_UNLINK,NULL,(char *)path,strlen(path)+1); + call_sim(); + from_sim(¶m, NULL); + return param.unlinkr.result; +} + +int sim_rename(const char *old, const char *new) +{ + int l; + static char combined[200]; + io param; + + strcpy(combined,old); + l = strlen(old)+1; + strcpy(combined+l,new); + l += strlen(new) + 1; + to_sim(SIM_RENAME,NULL,combined,l); + call_sim(); + from_sim(¶m, NULL); + return param.renamer.result; +} + +char *sim_getenv(const char *str) +{ + io param; + static char result[200]; + + to_sim(SIM_GETENV,NULL,(char *)str,strlen(str)+1); + call_sim(); + from_sim(¶m, result); + return param.getenvr.result ? result : NULL; +} + +int sim_gettime(void) +{ + io param; + + to_sim(SIM_GETTIME,NULL,NULL,0); + call_sim(); + from_sim(¶m, NULL); + return param.gettimer.result; +} + +int sim_getclock(void) +{ + io param; + + to_sim(SIM_GETCLOCK,NULL,NULL,0); + call_sim(); + from_sim(¶m, NULL); + return param.getclockr.result; +} + +int _CIOBUF_[BUFSIZ+32]; + +static void to_sim(int command, io *param, char *data, int length) +{ + int i; + int n; + int v; + int *ip = &_CIOBUF_[0]; + + *ip++ = length; + *ip++ = command; + if (param) { + *ip++ = param->common.word1; + *ip++ = param->common.word2; + } + else { + *ip++ = 0; + *ip++ = 0; + } + n = length & ~3; + for (i = 0 ; i < n ; i += 4) { + v = *data++ & 0xff; + v |= (*data++ & 0xff) << 8; + v |= (*data++ & 0xff) << 16; + v |= (*data++ & 0xff) << 24; + *ip++ = v; + } + v = 0; + for ( ; i < length ; i++) { + v |= (*data++ & 0xff) << ((i & 3) << 3); + } + *ip = v; +} + +static void call_sim(void) +{ + __asm__(" .global C$$IO$$"); + __asm__("C$$IO$$: nop"); +} + +static void from_sim(io *param, char *data) +{ + int i; + int l; + int n; + int v; + int *ip = &_CIOBUF_[0]; + + l = *ip++; + param->common.word1 = *ip++; + param->common.word2 = *ip++; + if (data != NULL) { + n = l & ~3; + for (i = 0 ; i < n ; i += 4) { + v = *ip++; + *data++ = v & 0xff; + *data++ = (v >> 8) & 0xff; + *data++ = (v >> 16) & 0xff; + *data++ = (v >> 24) & 0xff; + } + v = *ip; + for (; i < l ; i++) { + *data++ = v >> ((i & 3) << 3); + } + } +} + +#if 0 +#include +sim_io_test() +{ +sim_write(1, "howdy\n", 6); +} +#endif + +/* + * Debug junk + */ +#if 0 +void printk_wrapper(void) +{ + __asm__(" .global _printf"); + __asm__("_printf: bu _printk"); +} +#endif + +#if 1 +#ifdef _HAVE_STDC +#include +#else +#include +#endif + +int __svfscanf( + register FILE *fp, + char const *fmt0, + va_list ap +) +{ + return 0; +} +#endif diff --git a/c/src/lib/libbsp/c4x/c4xsim/include/Makefile.am b/c/src/lib/libbsp/c4x/c4xsim/include/Makefile.am new file mode 100644 index 0000000000..4175fb0d1b --- /dev/null +++ b/c/src/lib/libbsp/c4x/c4xsim/include/Makefile.am @@ -0,0 +1,32 @@ +## +## $Id$ +## + +AUTOMAKE_OPTIONS = foreign 1.4 + +H_FILES = bsp.h simio.h + +$(PROJECT_INCLUDE): + $(mkinstalldirs) $@ + +$(PROJECT_INCLUDE)/%.h: %.h + $(INSTALL_DATA) $< $@ + +$(PROJECT_INCLUDE)/bspIo.h: $(top_srcdir)/../../shared/include/bspIo.h + $(INSTALL_DATA) $< $@ + +$(PROJECT_INCLUDE)/coverhd.h: $(top_srcdir)/../../shared/include/coverhd.h + $(INSTALL_DATA) $< $@ + +PREINSTALL_FILES += $(PROJECT_INCLUDE) $(H_FILES:%.h=$(PROJECT_INCLUDE)/%.h) \ + $(PROJECT_INCLUDE)/bspIo.h $(PROJECT_INCLUDE)/coverhd.h + +all-local: $(PREINSTALL_FILES) + +EXTRA_DIST = bsp.h + +include $(top_srcdir)/../../../../../../automake/local.am + +H_FILES = $(srcdir)/../../../shared/include/coverhd.h \ + $(srcdir)/bsp.h $(srcdir)/simio.h $(srcdir)/../../../shared/include/bspIo.h + diff --git a/c/src/lib/libbsp/c4x/c4xsim/include/bsp.h b/c/src/lib/libbsp/c4x/c4xsim/include/bsp.h new file mode 100644 index 0000000000..c5a041d853 --- /dev/null +++ b/c/src/lib/libbsp/c4x/c4xsim/include/bsp.h @@ -0,0 +1,118 @@ +/* bsp.h + * + * This include file contains all C4X Simulator IO definitions. + * + * COPYRIGHT (c) 1989-1999. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#ifndef __C4XSIM_h +#define __C4XSIM_h + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef ASM + +#else +#include +#include +#include +#include +#include + + +/* + * Define the time limits for RTEMS Test Suite test durations. + * Long test and short test duration limits are provided. These + * values are in seconds and need to be converted to ticks for the + * application. + * + */ + +#define MAX_LONG_TEST_DURATION 300 /* 5 minutes = 300 seconds */ +#define MAX_SHORT_TEST_DURATION 3 /* 3 seconds */ + + +/* + * Stuff for Time Test 27 + */ + +#include +#define MUST_WAIT_FOR_INTERRUPT 0 + +/* XXX */ +#define Install_tm27_vector( _handler ) \ + set_vector( (_handler), 0x20, 1 ) + +#define Cause_tm27_intr() \ + do { \ + __asm__ volatile ( "trapu 0" ); \ + } while (0) + +#define Clear_tm27_intr() \ + do { \ + ; \ + } while (0) + +#define Lower_tm27_intr() \ + do { \ + c4x_global_interrupts_enable(); \ + } while (0) + +/* Constants */ + +/* + * Device Driver Table Entries + */ + +/* + * NOTE: Use the standard Console driver entry + */ + +/* + * NOTE: Use the standard Clock driver entry + */ + + +/* + * Information placed in the linkcmds file. + */ + +/* functions */ + +void bsp_start( void ); + +void bsp_cleanup( void ); + +rtems_isr_entry set_vector( /* returns old vector */ + rtems_isr_entry handler, /* isr routine */ + rtems_vector_number vector, /* vector number */ + int type /* RTEMS or RAW intr */ +); + +void BSP_fatal_return( void ); + +void bsp_spurious_initialize( void ); + +extern rtems_configuration_table BSP_Configuration; /* owned by BSP */ + +extern rtems_cpu_table Cpu_table; /* owned by BSP */ + +extern rtems_unsigned32 bsp_isr_level; + +#endif /* ASM */ + +#ifdef __cplusplus +} +#endif + +#endif +/* end of include file */ diff --git a/c/src/lib/libbsp/c4x/c4xsim/include/simio.h b/c/src/lib/libbsp/c4x/c4xsim/include/simio.h new file mode 100644 index 0000000000..782e88c258 --- /dev/null +++ b/c/src/lib/libbsp/c4x/c4xsim/include/simio.h @@ -0,0 +1,25 @@ +/* + * C4x simulator IO interface routines based on code provided + * by Herman ten Brugge + * + * $Id$ + */ + +#ifndef __C4X_SIMIO_IFACE_h +#define __C4X_SIMIO_IFACE_h + +#include + +void sim_exit(void); +int sim_open(const char *path, int flags, int fno); +int sim_close(int fno); +int sim_read(int fno, char *buf, unsigned count); +int sim_write(int fno, const char *buf, unsigned count); +fpos_t sim_lseek(int fno, fpos_t offset, int origin); +int sim_unlink(const char *path); +int sim_rename(const char *old, const char *new); +char *sim_getenv(const char *str); +int sim_gettime(void); +int sim_getclock(void); + +#endif diff --git a/c/src/lib/libbsp/c4x/c4xsim/start/Makefile.am b/c/src/lib/libbsp/c4x/c4xsim/start/Makefile.am new file mode 100644 index 0000000000..824d7a22c5 --- /dev/null +++ b/c/src/lib/libbsp/c4x/c4xsim/start/Makefile.am @@ -0,0 +1,32 @@ +## +## $Id$ +## + +AUTOMAKE_OPTIONS = foreign 1.4 + +PGM = $(ARCH)/start.o + +S_FILES = start.S +S_O_FILES = $(S_FILES:%.S=$(ARCH)/%.o) + +OBJS = $(S_O_FILES) + +include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg +include $(top_srcdir)/../../../../../../automake/lib.am + +# +# (OPTIONAL) Add local stuff here using += +# + +$(PROJECT_RELEASE)/lib/start$(LIB_VARIANT).o: $(PGM) + $(INSTALL_DATA) $< $@ + +TMPINSTALL_FILES += $(PROJECT_RELEASE)/lib/start$(LIB_VARIANT).o + +all-local: $(ARCH) $(OBJS) $(PGM) $(TMPINSTALL_FILES) + +.PRECIOUS: $(PGM) + +EXTRA_DIST = start.S + +include $(top_srcdir)/../../../../../../automake/local.am diff --git a/c/src/lib/libbsp/c4x/c4xsim/start/start.S b/c/src/lib/libbsp/c4x/c4xsim/start/start.S new file mode 100644 index 0000000000..2123fc24c3 --- /dev/null +++ b/c/src/lib/libbsp/c4x/c4xsim/start/start.S @@ -0,0 +1,71 @@ +/* + * This start.S is a combination of the files boot.s and crt0.s + * provided by Herman ...XXX + */ + + ; .file "crt0.s" + .ref _c_int00 + .global start + .global _start + + .if .tms320C40 + + .sect ".const" +mem_control: + .word 000100000h +mem_data: + .word 03ef78050h + + .text +start: +_start: + ldi 0800h,st + ldp @mem_control + ldi @mem_control,ar0 + ldp @mem_data + ldi @mem_data,r0 + sti r0,*+ar0(0) + sti r0,*+ar0(4) + br _c_int00 + + .else + + .sect ".const" +mem_control: + .word 000808000h +mem_data: + .word 000001f00h + + .text +start: +_start: + ldi 0800h,st + ldp @mem_control + ldi @mem_control,ar0 + ldp @mem_data + ldi @mem_data,r0 + sti r0,*+ar0(0) + sti r0,*+ar0(4) + br _c_int00 + + .endif + ; .file "boot.s" + .global __stack + .global _c_int00 + .ref .bss + .ref _boot_card + .ref _exit + +__stack: .usect ".stack",0 + .text +stack_addr: .word __stack + +_c_int00: + ldp stack_addr + ldi @stack_addr,sp + ldi sp,ar3 + ldp .bss ; For the small model, set up the DP to .bss + ldi 0,ar2 ; make sure argc=0 with regparm + push ar2 ; and memparm + call _boot_card + call _sim_exit diff --git a/c/src/lib/libbsp/c4x/c4xsim/startup/Makefile.am b/c/src/lib/libbsp/c4x/c4xsim/startup/Makefile.am new file mode 100644 index 0000000000..e8319e2af0 --- /dev/null +++ b/c/src/lib/libbsp/c4x/c4xsim/startup/Makefile.am @@ -0,0 +1,43 @@ +## +## $Id$ +## + +AUTOMAKE_OPTIONS = foreign 1.4 + +VPATH = @srcdir@:@srcdir@/../../shared:@srcdir@/../../../shared + +PGM = $(ARCH)/startup.rel + +C_FILES = bspclean.c bsplibc.c bsppost.c bspstart.c main.c bootcard.c sbrk.c \ + setvec.c c3xspurious.c c4xspurious.c bspspuriousinit.c spurious.c \ + gnatinstallhandler.c +C_O_FILES = $(C_FILES:%.c=$(ARCH)/%.o) + +OBJS = $(C_O_FILES) + +include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg +include $(top_srcdir)/../../../../../../automake/lib.am + +# +# (OPTIONAL) Add local stuff here using += +# + +# USE_INIT_FINI tells main.c what C++ help we need. + +# AM_CPPFLAGS += -DUSE_INIT_FINI + +$(PGM): $(OBJS) + $(make-rel) + +$(PROJECT_RELEASE)/lib/linkcmds: linkcmds + $(INSTALL_DATA) $< $@ + +TMPINSTALL_FILES += $(PROJECT_RELEASE)/lib/linkcmds + +all-local: $(ARCH) $(OBJS) $(PGM) $(TMPINSTALL_FILES) + +.PRECIOUS: $(PGM) + +EXTRA_DIST = bspclean.c bspstart.c linkcmds setvec.c spurious.c + +include $(top_srcdir)/../../../../../../automake/local.am diff --git a/c/src/lib/libbsp/c4x/c4xsim/startup/bspstart.c b/c/src/lib/libbsp/c4x/c4xsim/startup/bspstart.c new file mode 100644 index 0000000000..34adabdc48 --- /dev/null +++ b/c/src/lib/libbsp/c4x/c4xsim/startup/bspstart.c @@ -0,0 +1,124 @@ +/* + * This set of routines starts the application. It includes application, + * board, and monitor specific initialization and configuration. + * The generic CPU dependent initialization has been performed + * before any of these are invoked. + * + * COPYRIGHT (c) 1989-1999. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include +#include + +#include + +#include + +/* + * The original table from the application and our copy of it with + * some changes. + */ + +extern rtems_configuration_table Configuration; +rtems_configuration_table BSP_Configuration; + +rtems_cpu_table Cpu_table; + +/* + * Use the shared implementations of the following routines + */ + +void bsp_postdriver_hook(void); +void bsp_libc_init( void *, unsigned32, int ); +extern void bsp_spurious_initialize(); + +/* + * bsp_pretasking_hook + * + * BSP pretasking hook. Called just before drivers are initialized. + * Used to setup libc and install any BSP extensions. + */ + +void bsp_pretasking_hook(void) +{ + extern void *_HeapStart; + extern rtems_unsigned32 _HeapSize; + + bsp_libc_init(&_HeapStart, (unsigned int) &_HeapSize, 0); + +#ifdef RTEMS_DEBUG + rtems_debug_enable( RTEMS_DEBUG_ALL_MASK ); +#endif + + bsp_spurious_initialize(); +} + +/* + * bsp_start + * + * This routine does the bulk of the system initialization. + */ + +#include + +BSP_output_char_function_type BSP_output_char; +BSP_polling_getchar_function_type BSP_poll_char; +extern void C4X_BSP_output_char(char c); + +void bsp_start( void ) +{ + extern void *_WorkspaceBase; + extern rtems_unsigned32 _WorkspaceMax; + /* + * Set up our hooks + * Make sure libc_init is done before drivers initialized so that + * they can use atexit() + */ + + Cpu_table.pretasking_hook = bsp_pretasking_hook; /* init libc, etc. */ + Cpu_table.postdriver_hook = bsp_postdriver_hook; + + /* + * SIS does zero out memory BUT only when IT begins execution. Thus + * if we want to have a clean slate in the workspace each time we + * begin execution of OUR application, then we must zero the workspace. + */ + Cpu_table.do_zero_of_workspace = FALSE; + + /* + * This should be enough interrupt stack. + */ + + Cpu_table.interrupt_stack_size = 0; + + BSP_Configuration.work_space_start = (void *)&_WorkspaceBase; + /* XXX check to see if satisfying small memory model */ + + if ( BSP_Configuration.work_space_size > (int) &_WorkspaceMax ) + rtems_fatal_error_occurred( 0x43218765 ); + + + /* + * Account for the console's resources + */ + + console_reserve_resources( &BSP_Configuration ); + + /* + * Add 1 extension for MPCI_fatal + */ + + if (BSP_Configuration.User_multiprocessing_table) + BSP_Configuration.maximum_extensions++; + + + BSP_output_char = C4X_BSP_output_char; + BSP_poll_char = (BSP_polling_getchar_function_type) NULL; +} diff --git a/c/src/lib/libbsp/c4x/c4xsim/startup/linkcmds b/c/src/lib/libbsp/c4x/c4xsim/startup/linkcmds new file mode 100644 index 0000000000..87f46ad7af --- /dev/null +++ b/c/src/lib/libbsp/c4x/c4xsim/startup/linkcmds @@ -0,0 +1,76 @@ +OUTPUT_FORMAT("coff-c4x") + __SYSMEM_SIZE = DEFINED(__SYSMEM_SIZE) ? __SYSMEM_SIZE : 0x4000; + __STACK_SIZE = DEFINED(__STACK_SIZE) ? __STACK_SIZE : 0x1000; + __HeapSize = DEFINED(__HeapSize) ? __HeapSize : 0x10000; + __WorkspaceMax = DEFINED(__WorkspaceMax) ? __WorkspaceMax : 256K; + __ClockFrequency = DEFINED(_ClockFrequency) ? _ClockFrequency : 50; +ENTRY(_start) +SECTIONS +{ + .vectors : { + . += 4 * 64; + } + .text 0x200 : { + *(.text) + ___CTOR_LIST__ = .; + LONG(___CTOR_END__ - ___CTOR_LIST__ - 2) + *(.ctors) + LONG(0); + ___CTOR_END__ = .; + ___DTOR_LIST__ = .; + LONG(___DTOR_END__ - ___DTOR_LIST__ - 2) + *(.dtors) + LONG(0) + ___DTOR_END__ = .; + } + .init : { *(.init) } + .fini : { *(.fini) } + .const : + { + *(.const) + } + .cinit : + { + *(.cinit) + } + .data : + { + *(.data) + } + .comms : { + *(.comms) + } + .bss : { + + .bss = .; + *(.bss) + *(COMMON) + } + .stack : + { + *(.stack) + . = . + __STACK_SIZE; + } + .heap : + { + __HeapStart = .; + . += __HeapSize; + __WorkspaceBase = .; + . += __WorkspaceMax; + } +/* + .sysmem : + { + *(.sysmem) + } +*/ + .stab 0 : + { + [ .stab ] + } + .stabstr 0 : + { + [ .stabstr ] + } +/* The TI tools sets cinit to -1 if the ram model is used. */ +} diff --git a/c/src/lib/libbsp/c4x/c4xsim/startup/spurious.c b/c/src/lib/libbsp/c4x/c4xsim/startup/spurious.c new file mode 100644 index 0000000000..60872cd54d --- /dev/null +++ b/c/src/lib/libbsp/c4x/c4xsim/startup/spurious.c @@ -0,0 +1,33 @@ +/* + * CXX Simulator Spurious Trap Handler Assistant + * + * This is just enough of a trap handler to let us know what + * the likely source of the trap was. + * + * COPYRIGHT (c) 1989-1999. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include +#include +#include + +/* + * bsp_spurious_handler_assistant + * + * We can't recover so just return to gdb. + */ + +void bsp_spurious_handler_assistant( + rtems_vector_number vector, + CPU_Interrupt_frame *isf +) +{ + sim_exit(); +} diff --git a/c/src/lib/libbsp/c4x/c4xsim/timer/Makefile.am b/c/src/lib/libbsp/c4x/c4xsim/timer/Makefile.am new file mode 100644 index 0000000000..7f16dcc233 --- /dev/null +++ b/c/src/lib/libbsp/c4x/c4xsim/timer/Makefile.am @@ -0,0 +1,32 @@ +## +## $Id$ +## + +AUTOMAKE_OPTIONS = foreign 1.4 + +PGM = $(ARCH)/timer.rel + +C_FILES = timer.c +C_O_FILES = $(C_FILES:%.c=$(ARCH)/%.o) + +OBJS = $(C_O_FILES) + +include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg +include $(top_srcdir)/../../../../../../automake/lib.am + +# +# (OPTIONAL) Add local stuff here using += +# + +$(PGM): $(OBJS) + $(make-rel) + +# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile + +all-local: $(ARCH) $(OBJS) $(PGM) + +.PRECIOUS: $(PGM) + +EXTRA_DIST = timer.c + +include $(top_srcdir)/../../../../../../automake/local.am diff --git a/c/src/lib/libbsp/c4x/c4xsim/timer/timer.c b/c/src/lib/libbsp/c4x/c4xsim/timer/timer.c new file mode 100644 index 0000000000..b32166c330 --- /dev/null +++ b/c/src/lib/libbsp/c4x/c4xsim/timer/timer.c @@ -0,0 +1,117 @@ +/* timer.c + * + * This file manages the benchmark timer used by the RTEMS Timing Test + * Suite. Each measured time period is demarcated by calls to + * Timer_initialize() and Read_timer(). Read_timer() usually returns + * the number of microseconds since Timer_initialize() exitted. + * + * NOTE: It is important that the timer start/stop overhead be + * determined when porting or modifying this code. + * + * COPYRIGHT (c) 1989-1999. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include +#include +#include + +rtems_unsigned32 Timer_interrupts; +rtems_boolean Timer_driver_Find_average_overhead; + +static unsigned32 start; + +void Timer_initialize( void ) +{ + + /* + * Timer has never overflowed. This may not be necessary on some + * implemenations of timer but .... + */ + + + c4x_timer_stop(C4X_TIMER_0); + c4x_timer_set_period(C4X_TIMER_0, 0xffffffff); /* so no interupts */ + c4x_timer_start(C4X_TIMER_0); + start = c4x_timer_get_counter(C4X_TIMER_0); + + Timer_interrupts = 0; + + /* + * Somehow start the timer + */ +} + +/* + * The following controls the behavior of Read_timer(). + * + * AVG_OVEREHAD is the overhead for starting and stopping the timer. It + * is usually deducted from the number returned. + * + * LEAST_VALID is the lowest number this routine should trust. Numbers + * below this are "noise" and zero is returned. + */ + +#define AVG_OVERHEAD 0 /* It typically takes X.X microseconds */ + /* (Y countdowns) to start/stop the timer. */ + /* This value is in microseconds. */ +#define LEAST_VALID 1 /* Don't trust a clicks value lower than this */ + +int Read_timer( void ) +{ + rtems_unsigned32 clicks; + rtems_unsigned32 total; + int tmp; + + /* + * Read the timer and see how many clicks it has been since we started. + */ + + clicks = c4x_timer_get_counter(C4X_TIMER_0); + clicks -= start; + + /* + * Total is calculated by taking into account the number of timer overflow + * interrupts since the timer was initialized and clicks since the last + * interrupts. + */ + + total = clicks * 1; + + if ( Timer_driver_Find_average_overhead == 1 ) { + return total; /* in count units where each count is */ + /* 1 / (clock frequency/2) */ + } else { + if ( total < LEAST_VALID ) + return 0; /* below timer resolution */ + /* + * Somehow convert total into microseconds + */ + tmp = (int) ((float) total * ((1.0 / 25.0))); + return (tmp - AVG_OVERHEAD); + } +} + +/* + * Empty function call used in loops to measure basic cost of looping + * in Timing Test Suite. + */ + +rtems_status_code Empty_function( void ) +{ + return RTEMS_SUCCESSFUL; +} + +void Set_find_average_overhead( + rtems_boolean find_flag +) +{ + Timer_driver_Find_average_overhead = find_flag; +} + diff --git a/c/src/lib/libbsp/c4x/c4xsim/tools/Makefile.am b/c/src/lib/libbsp/c4x/c4xsim/tools/Makefile.am new file mode 100644 index 0000000000..fd48f4ee00 --- /dev/null +++ b/c/src/lib/libbsp/c4x/c4xsim/tools/Makefile.am @@ -0,0 +1,15 @@ +## +## $Id$ +## + +AUTOMAKE_OPTIONS = foreign 1.4 +ACLOCAL_AMFLAGS = -I $(RTEMS_TOPdir)/aclocal + +noinst_SCRIPTS=runtest + +#HACK: install to build-tree +all-local: $(SCRIPTS) + $(mkinstalldirs) $(PROJECT_ROOT)/$(RTEMS_BSP)/tests + $(INSTALL_SCRIPT) runtest $(PROJECT_ROOT)/$(RTEMS_BSP)/tests/runtest + +include $(top_srcdir)/../../../../../../../automake/local.am diff --git a/c/src/lib/libbsp/c4x/c4xsim/tools/configure.in b/c/src/lib/libbsp/c4x/c4xsim/tools/configure.in new file mode 100644 index 0000000000..47f6b0417f --- /dev/null +++ b/c/src/lib/libbsp/c4x/c4xsim/tools/configure.in @@ -0,0 +1,23 @@ +dnl Process this file with autoconf to produce a configure script. +dnl +dnl $Id$ + +AC_INIT(runtest.in) +RTEMS_TOP(../../../../../../..) +AC_CONFIG_AUX_DIR(../../../../../../..) + +RTEMS_CANONICAL_TARGET_CPU + +AM_INIT_AUTOMAKE(rtems-c-src-lib-libbsp-c4x-c4xsim-tools,$RTEMS_VERSION,no) +AM_MAINTAINER_MODE + +RTEMS_PATH_KSH +RTEMS_ENV_RTEMSBSP + +RTEMS_PROJECT_ROOT +RTEMS_TOOLPATHS + +# Explicitly list all Makefiles here +AC_OUTPUT( +Makefile +runtest) diff --git a/c/src/lib/libbsp/c4x/c4xsim/tools/runtest.in b/c/src/lib/libbsp/c4x/c4xsim/tools/runtest.in new file mode 100644 index 0000000000..2814c2a1e3 --- /dev/null +++ b/c/src/lib/libbsp/c4x/c4xsim/tools/runtest.in @@ -0,0 +1,331 @@ +#!@KSH@ -p +# +# $Id$ +# +# Run rtems tests on the c4x simulator built into gdb +# This program generates a simulator script to run each test +# Typically the test is then run, although it can be generated +# and left as a file using -s +# + +# progname=`basename $0` +progname=${0##*/} # fast basename hack for ksh, bash + +USAGE=\ +"usage: $progname [ -opts ] test [ test ... ] + -o options -- specify options to be passed to simulator + -v -- verbose + -s -- generate script file (as 'test'.ss) and exit + -l logdir -- specify log directory (default is 'logdir') + + Specify test as 'test' or 'test.exe'. + All multiprocessing tests *must* be specified simply as 'mp01', etc. +" + +# export everything +set -a + +# log an error to stderr +prerr() +{ + echo "$*" >&2 +} + +fatal() { + [ "$1" ] && prerr $* + prerr "$USAGE" + exit 1 +} + +warn() { + [ "$1" ] && prerr $* +} + +# print args, 1 per line +ml_echo() +{ + for l + do + echo "$l" + done +} + +# run at normal and signalled exit +test_exit() +{ + exit_code=$1 + + rm -f ${statfile}* ${scriptfile}* ${logfile}.tmp* + [ "$sim_pid" ] && kill -9 $sim_pid + + exit $exit_code +} + +# +# process the options +# +# defaults for getopt vars +# +# max_run_time is defaulted to 5 minutes +# + +verbose="" +extra_options="" +script_and_exit="" +stdio_setup="yes" +run_to_completion="yes" +logdir=log +update_on_tick="no" +max_run_time=$((6 * 60)) # is 5 on other simulators. +using_print_buffer="yes" + +while getopts vhr12o:c:sl:t OPT +do + case "$OPT" in + v) + verbose="yes";; + s) + script_and_exit="yes" + run_to_completion="no" + stdio_setup="no";; + l) + logdir="$OPTARG";; + o) + extra_options="$OPTARG";; + *) + fatal;; + esac +done + +let $((shiftcount = $OPTIND - 1)) +shift $shiftcount + +args=$* + +# +# Run the tests +# + +tests="$args" +if [ ! "$tests" ] +then + set -- `echo *.exe` + tests="$*" +fi + +[ -d $logdir ] || + mkdir $logdir || fatal "could not create log directory ($logdir)" + +cpus=1 + +# where the tmp files go +statfile=/tmp/stats$$ +scriptfile=/tmp/script$$ + +trap "test_exit" 1 2 3 13 14 15 + +for tfile in $tests +do + + tname=`basename $tfile .exe` + TEST_TYPE="single" + + case $tname in + monitor) + if [ $run_to_completion = "yes" ] + then + warn "Skipping $tname; it is interactive" + continue + fi + ;; + *-node2*) + fatal "MP tests not supported" + warn "Skipping $tname; 'runtest' runs both nodes when for *-node1" + continue;; + *-node1*) + fatal "MP tests not supported" + warn "Running both nodes associated with $tname" + tname=`echo $tname | sed 's/-node.*//'` + TEST_TYPE="mp" + ;; + stackchk*|spfatal*|malloctest*|termio*) + warn "Skipping $tname; it locks up or takes a VERY long time to run" + continue + ;; + esac + + # Change the title bar to indicate which test we are running + # The simulator screen doesn't provide any indication + + logfile=$logdir/$tname + infofile=$logfile.info + + rm -f ${statfile}* ${scriptfile}* ${logfile}.tmp* + + date=`date` + echo "Starting $tname at $date" + + # Generate a script file to get the work done. + # The script file must do the following: + # + # load the program (programs if MP test) + # arrange for capture of output + # run the program + # produce statistics + + { + case $TEST_TYPE in + "mp") + fatal "MP tests not supported" + ;; + + # All other tests (single-processor) + *) + echo "target sim -3" + echo "sim m r 0" + echo "sim m w 0" + echo "load" + echo "" + echo "printf \"START_OF_TEST\\n\"" + echo "run" + echo "printf \"END_OF_TEST\\n\"" + echo "quit" + ;; + esac + + } > ${scriptfile} + + if [ "$script_and_exit" = "yes" ] + then + mv ${scriptfile} $tname.ss + warn "script left in $tname.ss" + test_exit 0 + fi + + # Spin off the simulator in the background + c4x-rtems-gdb $extra_options -n \ + --command ${scriptfile} ${tfile} >${logfile}.tmp 2>&1 & + sim_pid=$! + + # Make sure it won't run forever... + { + time_run=0 + while [ $time_run -lt $max_run_time ] + do + # sleep 10s at a time waiting for job to finish or timer to expire + # if job has exited, then we exit, too. + sleep 10 + if kill -0 $sim_pid 2>/dev/null + then + time_run=$((time_run + 10)) + else + exit 0 + fi + done + + kill -2 $sim_pid 2>/dev/null + { sleep 5; kill -9 $sim_pid 2>/dev/null; } & + } & + + wait $sim_pid + status=$? + if [ $status -ne 0 ] + then + ran_too_long="yes" + else + ran_too_long="no" + fi + + sim_pid="" + + # fix up the printf output from the test + case $TEST_TYPE in + mp) + fatal "MP not supported" + ;; + *) + output_it=0 + clean_exit=0 + sed -e '1,9d' \ + -e 's/ //' -e '/^$/d' < ${logfile}.tmp | + while read line + do + if [ $output_it -eq 1 ] ; then + case $line in + END_OF_TEST*) + output_it=0 + ;; + *simio.c:86*) + output_it=0 + clean_exit=1 + ;; + *) + echo "$line" + ;; + esac + else + if [ "$line" = "START_OF_TEST" ] ; then + output_it=1 + fi + fi + done > ${logfile}_1 + if [ ${clean_exit} -eq 0 ] ; then + mv ${logfile}_1 ${logfile}_1.XXX + sed -e '/^Program received signal SIGTRAP/d' \ + <${logfile}_1.XXX >${logfile}_1 + rm -f ${logfile}_1.XXX + fi + ;; + esac + + # Create the info files + for cpu in $cpus + do + { + echo "$date" + echo "Test run on: `uname -n` ( `uname -a` )" + + output_it=1 + sed -e 's/ //' < ${logfile}.tmp | + while read line + do + if [ $output_it -eq 0 ] ; then + if [ "$line" = "END_OF_TEST" ] ; then + output_it=1 + fi + else + if [ "$line" = "START_OF_TEST" ] ; then + output_it=0 + else + echo "$line" + fi + fi + done + + + if [ "$ran_too_long" = "yes" ] + then + echo "Test did NOT finish normally; killed after $max_run_time seconds" + fi + + echo + date; + } > ${infofile}_$cpu + done + + rm -f ${logfile}.tmp* + + if [ "$cpus" = "1" ] + then + mv ${infofile}_1 ${infofile} + mv ${logfile}_1 ${logfile} + fi + +done + +test_exit 0 + +# Local Variables: *** +# mode:ksh *** +# End: *** + diff --git a/c/src/lib/libbsp/c4x/c4xsim/wrapup/Makefile.am b/c/src/lib/libbsp/c4x/c4xsim/wrapup/Makefile.am new file mode 100644 index 0000000000..6e3c0f8144 --- /dev/null +++ b/c/src/lib/libbsp/c4x/c4xsim/wrapup/Makefile.am @@ -0,0 +1,35 @@ +## +## $Id$ +## + +AUTOMAKE_OPTIONS = foreign 1.4 + +BSP_PIECES = startup console clock timer +# pieces to pick up out of libcpu/sparc +CPU_PIECES = + +# bummer; have to use $foreach since % pattern subst rules only replace 1x +OBJS = $(foreach piece, $(BSP_PIECES), $(wildcard ../$(piece)/$(ARCH)/*.o)) \ + $(foreach piece, $(CPU_PIECES), ../../../../libcpu/$(RTEMS_CPU)/$(piece)/$(ARCH)/$(piece).rel) +LIB = $(ARCH)/libbsp.a + +include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg +include $(top_srcdir)/../../../../../../automake/lib.am + +# +# (OPTIONAL) Add local stuff here using += +# + +$(LIB): $(OBJS) + $(make-library) + +$(PROJECT_RELEASE)/lib/libbsp$(LIB_VARIANT).a: $(LIB) + $(INSTALL_DATA) $< $@ + +TMPINSTALL_FILES += $(PROJECT_RELEASE)/lib/libbsp$(LIB_VARIANT).a + +all-local: $(ARCH) $(OBJS) $(LIB) $(TMPINSTALL_FILES) + +.PRECIOUS: $(LIB) + +include $(top_srcdir)/../../../../../../automake/local.am -- cgit v1.2.3