forked from Imagelibrary/rtems
v850 port: Initial addition with BSP for simulator in GDB
Port
+ v850 does not have appear to have any optimized bit scan instructions
+ v850 does have single instructions for wap u16 and u32
+ Code path optimization preferences set
+ Add BSP variants for each GCC CPU model flag and a README
- v850e1 variant does not work (fails during BSP initialization)
BSP for GDB v850 Simulator
+ linkcmds matches defaults in GDB simulator with RTEMS mods
+ crt1.c added from v850 newlib port for __main()
+ BSP exits cleanly
+ printk and console I/O work
+ uses clock tick from IDLE task
+ Tests not requiring real clock ISR work
Documentation
+ CPU Supplment chapter for v850 added
This commit is contained in:
@@ -26,6 +26,7 @@ _RTEMS_CPU_SUBDIR([powerpc],[$1]);;
|
|||||||
_RTEMS_CPU_SUBDIR([sh],[$1]);;
|
_RTEMS_CPU_SUBDIR([sh],[$1]);;
|
||||||
_RTEMS_CPU_SUBDIR([sparc],[$1]);;
|
_RTEMS_CPU_SUBDIR([sparc],[$1]);;
|
||||||
_RTEMS_CPU_SUBDIR([sparc64],[$1]);;
|
_RTEMS_CPU_SUBDIR([sparc64],[$1]);;
|
||||||
|
_RTEMS_CPU_SUBDIR([v850],[$1]);;
|
||||||
*) AC_MSG_ERROR([Invalid RTEMS_CPU <[$]{RTEMS_CPU}>])
|
*) AC_MSG_ERROR([Invalid RTEMS_CPU <[$]{RTEMS_CPU}>])
|
||||||
esac
|
esac
|
||||||
])
|
])
|
||||||
|
|||||||
15
c/src/lib/libbsp/v850/Makefile.am
Normal file
15
c/src/lib/libbsp/v850/Makefile.am
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
##
|
||||||
|
##
|
||||||
|
|
||||||
|
ACLOCAL_AMFLAGS = -I ../../../aclocal
|
||||||
|
|
||||||
|
## Descend into the @RTEMS_BSP_FAMILY@ directory
|
||||||
|
## Currently, the shared directory is not explicitly
|
||||||
|
## added but it is present in the source tree.
|
||||||
|
SUBDIRS = @RTEMS_BSP_FAMILY@
|
||||||
|
|
||||||
|
EXTRA_DIST =
|
||||||
|
|
||||||
|
include $(srcdir)/preinstall.am
|
||||||
|
include $(top_srcdir)/../../../automake/subdirs.am
|
||||||
|
include $(top_srcdir)/../../../automake/local.am
|
||||||
10
c/src/lib/libbsp/v850/acinclude.m4
Normal file
10
c/src/lib/libbsp/v850/acinclude.m4
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# RTEMS_CHECK_BSPDIR(RTEMS_BSP_FAMILY)
|
||||||
|
AC_DEFUN([RTEMS_CHECK_BSPDIR],
|
||||||
|
[
|
||||||
|
case "$1" in
|
||||||
|
gdbv850sim )
|
||||||
|
AC_CONFIG_SUBDIRS([gdbv850sim]);;
|
||||||
|
*)
|
||||||
|
AC_MSG_ERROR([Invalid BSP]);;
|
||||||
|
esac
|
||||||
|
])
|
||||||
20
c/src/lib/libbsp/v850/configure.ac
Normal file
20
c/src/lib/libbsp/v850/configure.ac
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
## Process this file with autoconf to produce a configure script.
|
||||||
|
##
|
||||||
|
|
||||||
|
AC_PREREQ([2.68])
|
||||||
|
AC_INIT([rtems-c-src-lib-libbsp-v850],[_RTEMS_VERSION],[http://www.rtems.org/bugzilla])
|
||||||
|
AC_CONFIG_SRCDIR([gdbv850sim])
|
||||||
|
RTEMS_TOP(../../../../..)
|
||||||
|
|
||||||
|
RTEMS_CANONICAL_TARGET_CPU
|
||||||
|
AM_INIT_AUTOMAKE([no-define foreign 1.11.1])
|
||||||
|
AM_MAINTAINER_MODE
|
||||||
|
|
||||||
|
RTEMS_ENV_RTEMSBSP
|
||||||
|
RTEMS_PROJECT_ROOT
|
||||||
|
|
||||||
|
RTEMS_CHECK_BSPDIR([$RTEMS_BSP_FAMILY])
|
||||||
|
|
||||||
|
# Explicitly list all Makefiles here
|
||||||
|
AC_CONFIG_FILES([Makefile])
|
||||||
|
AC_OUTPUT
|
||||||
53
c/src/lib/libbsp/v850/gdbv850sim/Makefile.am
Normal file
53
c/src/lib/libbsp/v850/gdbv850sim/Makefile.am
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
##
|
||||||
|
##
|
||||||
|
|
||||||
|
ACLOCAL_AMFLAGS = -I ../../../../aclocal
|
||||||
|
|
||||||
|
include $(top_srcdir)/../../../../automake/compile.am
|
||||||
|
include $(top_srcdir)/../../bsp.am
|
||||||
|
|
||||||
|
include_bspdir = $(includedir)/bsp
|
||||||
|
|
||||||
|
dist_project_lib_DATA = bsp_specs
|
||||||
|
|
||||||
|
include_HEADERS = include/bsp.h
|
||||||
|
include_HEADERS += ../../shared/include/tm27.h
|
||||||
|
include_bsp_HEADERS = include/syscall.h
|
||||||
|
|
||||||
|
nodist_include_HEADERS = include/bspopts.h
|
||||||
|
nodist_include_bsp_HEADERS = ../../shared/include/bootcard.h
|
||||||
|
DISTCLEANFILES = include/bspopts.h
|
||||||
|
noinst_PROGRAMS =
|
||||||
|
|
||||||
|
nodist_include_HEADERS += ../../shared/include/coverhd.h
|
||||||
|
|
||||||
|
EXTRA_DIST = start/start.S
|
||||||
|
start.$(OBJEXT): start/start.S
|
||||||
|
$(CPPASCOMPILE) -o $@ -c $<
|
||||||
|
project_lib_DATA = start.$(OBJEXT)
|
||||||
|
|
||||||
|
dist_project_lib_DATA += startup/linkcmds
|
||||||
|
|
||||||
|
libbsp_a_SOURCES = ../../shared/bspclean.c
|
||||||
|
libbsp_a_SOURCES += ../../shared/bsplibc.c
|
||||||
|
libbsp_a_SOURCES += ../../shared/bsppredriverhook.c
|
||||||
|
libbsp_a_SOURCES += ../../shared/bsppretaskinghook.c
|
||||||
|
libbsp_a_SOURCES += ../../shared/bspgetworkarea.c
|
||||||
|
libbsp_a_SOURCES += ../../shared/bsppost.c
|
||||||
|
libbsp_a_SOURCES += ../../shared/bspstart.c
|
||||||
|
libbsp_a_SOURCES += ../../shared/bootcard.c
|
||||||
|
libbsp_a_SOURCES += ../../shared/sbrk.c
|
||||||
|
libbsp_a_SOURCES += ../../shared/gnatinstallhandler.c
|
||||||
|
libbsp_a_SOURCES += startup/bspreset.c
|
||||||
|
libbsp_a_SOURCES += ../../v850/shared/crt1.c
|
||||||
|
libbsp_a_SOURCES += startup/trap.S
|
||||||
|
|
||||||
|
libbsp_a_SOURCES += ../../shared/clock_driver_simidle.c
|
||||||
|
libbsp_a_SOURCES += ../../shared/console-polled.c
|
||||||
|
libbsp_a_SOURCES += console/console-io.c
|
||||||
|
libbsp_a_SOURCES += ../../shared/timerstub.c
|
||||||
|
|
||||||
|
noinst_LIBRARIES = libbsp.a
|
||||||
|
|
||||||
|
include $(srcdir)/preinstall.am
|
||||||
|
include $(top_srcdir)/../../../../automake/local.am
|
||||||
7
c/src/lib/libbsp/v850/gdbv850sim/README
Normal file
7
c/src/lib/libbsp/v850/gdbv850sim/README
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
This directory contains a family of BSPs for the v850 simulator
|
||||||
|
found in the GNU Debugger. A variant is provided for each CPU
|
||||||
|
model option flag found in the GCC SVN head as of 30 May 2012.
|
||||||
|
|
||||||
|
This simulator is an instruction simulator and does not include
|
||||||
|
devices for a clock tick or benchmark timer driver. Traps are used
|
||||||
|
to provide console I/O.
|
||||||
15
c/src/lib/libbsp/v850/gdbv850sim/bsp_specs
Normal file
15
c/src/lib/libbsp/v850/gdbv850sim/bsp_specs
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
%rename endfile old_endfile
|
||||||
|
%rename startfile old_startfile
|
||||||
|
%rename link old_link
|
||||||
|
|
||||||
|
*startfile:
|
||||||
|
%{!qrtems: %(old_startfile)} \
|
||||||
|
%{!nostdlib: %{qrtems: start.o%s -e _start}}
|
||||||
|
|
||||||
|
*endfile:
|
||||||
|
%{!qrtems: %(old_endfile)} %{qrtems: %(old_endfile)} \
|
||||||
|
%{!nostdlib: %{qrtems:}}
|
||||||
|
|
||||||
|
*link:
|
||||||
|
%(old_link) %{!qrtems: %(old_link)} %{qrtems: %(old_link)}
|
||||||
|
|
||||||
20
c/src/lib/libbsp/v850/gdbv850sim/configure.ac
Normal file
20
c/src/lib/libbsp/v850/gdbv850sim/configure.ac
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
## Process this file with autoconf to produce a configure script.
|
||||||
|
|
||||||
|
AC_PREREQ([2.68])
|
||||||
|
AC_INIT([rtems-c-src-lib-libbsp-v850-gdbv850sim],[_RTEMS_VERSION],[http://www.rtems.org/bugzilla])
|
||||||
|
AC_CONFIG_SRCDIR([bsp_specs])
|
||||||
|
RTEMS_TOP(../../../../../..)
|
||||||
|
|
||||||
|
RTEMS_CANONICAL_TARGET_CPU
|
||||||
|
AM_INIT_AUTOMAKE([no-define nostdinc foreign 1.11.1])
|
||||||
|
RTEMS_BSP_CONFIGURE
|
||||||
|
|
||||||
|
RTEMS_PROG_CC_FOR_TARGET
|
||||||
|
RTEMS_CANONICALIZE_TOOLS
|
||||||
|
RTEMS_PROG_CCAS
|
||||||
|
|
||||||
|
RTEMS_BSP_CLEANUP_OPTIONS(0, 1)
|
||||||
|
|
||||||
|
# Explicitly list all Makefiles here
|
||||||
|
AC_CONFIG_FILES([Makefile])
|
||||||
|
AC_OUTPUT
|
||||||
61
c/src/lib/libbsp/v850/gdbv850sim/console/console-io.c
Normal file
61
c/src/lib/libbsp/v850/gdbv850sim/console/console-io.c
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* COPYRIGHT (c) 1989-2012.
|
||||||
|
* 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.rtems.com/license/LICENSE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <bsp.h>
|
||||||
|
#include <rtems/libio.h>
|
||||||
|
#include <bsp/syscall.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* console_initialize_hardware
|
||||||
|
*
|
||||||
|
* This routine initializes the console hardware.
|
||||||
|
*/
|
||||||
|
void console_initialize_hardware(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* console_outbyte_polled
|
||||||
|
*
|
||||||
|
* This routine transmits a character using polling.
|
||||||
|
*/
|
||||||
|
void console_outbyte_polled(
|
||||||
|
int port,
|
||||||
|
char ch
|
||||||
|
)
|
||||||
|
{
|
||||||
|
TRAP0(SYS_write, 1, &ch, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* console_inbyte_nonblocking
|
||||||
|
*
|
||||||
|
* This routine polls for a character.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int console_inbyte_nonblocking(
|
||||||
|
int port
|
||||||
|
)
|
||||||
|
{
|
||||||
|
char ch;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
rc = TRAP0 (SYS_read, 0, &ch, 1);
|
||||||
|
|
||||||
|
if ( rc != 1 )
|
||||||
|
return -1;
|
||||||
|
return ch;
|
||||||
|
}
|
||||||
|
|
||||||
|
#include <rtems/bspIo.h>
|
||||||
|
|
||||||
|
void console_output_char(char c) { console_outbyte_polled( 0, c ); }
|
||||||
|
|
||||||
|
BSP_output_char_function_type BSP_output_char = console_output_char;
|
||||||
|
BSP_polling_getchar_function_type BSP_poll_char = NULL;
|
||||||
37
c/src/lib/libbsp/v850/gdbv850sim/include/bsp.h
Normal file
37
c/src/lib/libbsp/v850/gdbv850sim/include/bsp.h
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* This include file contains some definitions specific to the
|
||||||
|
* GDB simulator in gdb.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* COPYRIGHT (c) 1989-2012.
|
||||||
|
* 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.rtems.com/license/LICENSE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _BSP_H
|
||||||
|
#define _BSP_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <bspopts.h>
|
||||||
|
|
||||||
|
#include <rtems.h>
|
||||||
|
#include <rtems/iosupp.h>
|
||||||
|
#include <rtems/console.h>
|
||||||
|
#include <rtems/clockdrv.h>
|
||||||
|
|
||||||
|
/* support for simulated clock tick */
|
||||||
|
Thread clock_driver_sim_idle_body(uintptr_t);
|
||||||
|
#define BSP_IDLE_TASK_BODY clock_driver_sim_idle_body
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
31
c/src/lib/libbsp/v850/gdbv850sim/include/bspopts.h.in
Normal file
31
c/src/lib/libbsp/v850/gdbv850sim/include/bspopts.h.in
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
/* include/bspopts.h.in. Generated from configure.ac by autoheader. */
|
||||||
|
|
||||||
|
/* If defined, then the BSP Framework will put a non-zero pattern into the
|
||||||
|
RTEMS Workspace and C program heap. This should assist in finding code that
|
||||||
|
assumes memory starts set to zero. */
|
||||||
|
#undef BSP_DIRTY_MEMORY
|
||||||
|
|
||||||
|
/* If defined, print a message and wait until pressed before resetting board
|
||||||
|
when application exits. */
|
||||||
|
#undef BSP_PRESS_KEY_FOR_RESET
|
||||||
|
|
||||||
|
/* If defined, reset the board when the application exits. */
|
||||||
|
#undef BSP_RESET_BOARD_AT_EXIT
|
||||||
|
|
||||||
|
/* Define to the address where bug reports for this package should be sent. */
|
||||||
|
#undef PACKAGE_BUGREPORT
|
||||||
|
|
||||||
|
/* Define to the full name of this package. */
|
||||||
|
#undef PACKAGE_NAME
|
||||||
|
|
||||||
|
/* Define to the full name and version of this package. */
|
||||||
|
#undef PACKAGE_STRING
|
||||||
|
|
||||||
|
/* Define to the one symbol short name of this package. */
|
||||||
|
#undef PACKAGE_TARNAME
|
||||||
|
|
||||||
|
/* Define to the home page for this package. */
|
||||||
|
#undef PACKAGE_URL
|
||||||
|
|
||||||
|
/* Define to the version of this package. */
|
||||||
|
#undef PACKAGE_VERSION
|
||||||
47
c/src/lib/libbsp/v850/gdbv850sim/include/syscall.h
Normal file
47
c/src/lib/libbsp/v850/gdbv850sim/include/syscall.h
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
/* from libgloss/v850 */
|
||||||
|
#ifndef _SYS_SYSCALL_H_
|
||||||
|
#define _SYS_SYSCALL_H_
|
||||||
|
|
||||||
|
#ifndef ASM
|
||||||
|
extern int __trap0 (int function, int p1, int p2, int p3);
|
||||||
|
|
||||||
|
#define TRAP0(f, p1, p2, p3) __trap0(f, (int)(p1), (int)(p2), (int)(p3))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#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_ARG 24
|
||||||
|
#define SYS_stat 38
|
||||||
|
|
||||||
|
|
||||||
|
#define SYS_pipe 42
|
||||||
|
#define SYS_execve 59
|
||||||
|
#define SYS_times 43
|
||||||
|
#define SYS_gettimeofday 116
|
||||||
|
#define SYS_rename 134
|
||||||
|
|
||||||
|
#define SYS_utime 201 /* not really a system call */
|
||||||
|
#define SYS_wait 202 /* nor is this */
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
#
|
||||||
|
# Base Config file for the v850 GDB Simulator as v850e1
|
||||||
|
#
|
||||||
|
|
||||||
|
CPU_CFLAGS = -mv850e1
|
||||||
|
|
||||||
|
include $(RTEMS_ROOT)/make/custom/v850sim.inc
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
#
|
||||||
|
# Base Config file for the v850 GDB Simulator as v850e2
|
||||||
|
#
|
||||||
|
|
||||||
|
CPU_CFLAGS = -mv850e2
|
||||||
|
|
||||||
|
include $(RTEMS_ROOT)/make/custom/v850sim.inc
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
#
|
||||||
|
# Base Config file for the v850 GDB Simulator as v850e2v3
|
||||||
|
#
|
||||||
|
|
||||||
|
CPU_CFLAGS = -mv850e2v3
|
||||||
|
|
||||||
|
include $(RTEMS_ROOT)/make/custom/v850sim.inc
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
#
|
||||||
|
# Base Config file for the v850 GDB Simulator as v850e
|
||||||
|
#
|
||||||
|
|
||||||
|
CPU_CFLAGS = -mv850e
|
||||||
|
|
||||||
|
include $(RTEMS_ROOT)/make/custom/v850sim.inc
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
#
|
||||||
|
# Base Config file for the v850 GDB Simulator as v850es
|
||||||
|
#
|
||||||
|
|
||||||
|
CPU_CFLAGS = -mv850es
|
||||||
|
|
||||||
|
include $(RTEMS_ROOT)/make/custom/v850sim.inc
|
||||||
8
c/src/lib/libbsp/v850/gdbv850sim/make/custom/v850sim.cfg
Normal file
8
c/src/lib/libbsp/v850/gdbv850sim/make/custom/v850sim.cfg
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#
|
||||||
|
# Base Config file for the v850 GDB Simulator as v850
|
||||||
|
#
|
||||||
|
|
||||||
|
# This is the same as not specifying a CPU model flag.
|
||||||
|
CPU_CFLAGS = -mv850
|
||||||
|
|
||||||
|
include $(RTEMS_ROOT)/make/custom/v850sim.inc
|
||||||
12
c/src/lib/libbsp/v850/gdbv850sim/make/custom/v850sim.inc
Normal file
12
c/src/lib/libbsp/v850/gdbv850sim/make/custom/v850sim.inc
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
#
|
||||||
|
# Shared config file for the v850 GDB Simulator
|
||||||
|
#
|
||||||
|
# CPU_CFLAGS is set by each specific variant.
|
||||||
|
|
||||||
|
include $(RTEMS_ROOT)/make/custom/default.cfg
|
||||||
|
|
||||||
|
RTEMS_CPU=v850
|
||||||
|
RTEMS_CPU_MODEL=v850
|
||||||
|
|
||||||
|
# optimize flag: typically -O2
|
||||||
|
CFLAGS_OPTIMIZE_V = -O2 -g
|
||||||
71
c/src/lib/libbsp/v850/gdbv850sim/preinstall.am
Normal file
71
c/src/lib/libbsp/v850/gdbv850sim/preinstall.am
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
## Automatically generated by ampolish3 - Do not edit
|
||||||
|
|
||||||
|
if AMPOLISH3
|
||||||
|
$(srcdir)/preinstall.am: Makefile.am
|
||||||
|
$(AMPOLISH3) $(srcdir)/Makefile.am > $(srcdir)/preinstall.am
|
||||||
|
endif
|
||||||
|
|
||||||
|
PREINSTALL_DIRS =
|
||||||
|
DISTCLEANFILES += $(PREINSTALL_DIRS)
|
||||||
|
|
||||||
|
all-local: $(TMPINSTALL_FILES)
|
||||||
|
|
||||||
|
TMPINSTALL_FILES =
|
||||||
|
CLEANFILES = $(TMPINSTALL_FILES)
|
||||||
|
|
||||||
|
all-am: $(PREINSTALL_FILES)
|
||||||
|
|
||||||
|
PREINSTALL_FILES =
|
||||||
|
CLEANFILES += $(PREINSTALL_FILES)
|
||||||
|
|
||||||
|
$(PROJECT_LIB)/$(dirstamp):
|
||||||
|
@$(MKDIR_P) $(PROJECT_LIB)
|
||||||
|
@: > $(PROJECT_LIB)/$(dirstamp)
|
||||||
|
PREINSTALL_DIRS += $(PROJECT_LIB)/$(dirstamp)
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/$(dirstamp):
|
||||||
|
@$(MKDIR_P) $(PROJECT_INCLUDE)
|
||||||
|
@: > $(PROJECT_INCLUDE)/$(dirstamp)
|
||||||
|
PREINSTALL_DIRS += $(PROJECT_INCLUDE)/$(dirstamp)
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/bsp/$(dirstamp):
|
||||||
|
@$(MKDIR_P) $(PROJECT_INCLUDE)/bsp
|
||||||
|
@: > $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
||||||
|
PREINSTALL_DIRS += $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
||||||
|
|
||||||
|
$(PROJECT_LIB)/bsp_specs: bsp_specs $(PROJECT_LIB)/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_LIB)/bsp_specs
|
||||||
|
PREINSTALL_FILES += $(PROJECT_LIB)/bsp_specs
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/bsp.h: include/bsp.h $(PROJECT_INCLUDE)/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp.h
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp.h
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/tm27.h: ../../shared/include/tm27.h $(PROJECT_INCLUDE)/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/tm27.h
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/tm27.h
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/bsp/syscall.h: include/syscall.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/syscall.h
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/syscall.h
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/bspopts.h: include/bspopts.h $(PROJECT_INCLUDE)/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bspopts.h
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bspopts.h
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/bsp/bootcard.h: ../../shared/include/bootcard.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/bootcard.h
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/bootcard.h
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/coverhd.h: ../../shared/include/coverhd.h $(PROJECT_INCLUDE)/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/coverhd.h
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/coverhd.h
|
||||||
|
|
||||||
|
$(PROJECT_LIB)/start.$(OBJEXT): start.$(OBJEXT) $(PROJECT_LIB)/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_LIB)/start.$(OBJEXT)
|
||||||
|
TMPINSTALL_FILES += $(PROJECT_LIB)/start.$(OBJEXT)
|
||||||
|
|
||||||
|
$(PROJECT_LIB)/linkcmds: startup/linkcmds $(PROJECT_LIB)/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds
|
||||||
|
PREINSTALL_FILES += $(PROJECT_LIB)/linkcmds
|
||||||
|
|
||||||
78
c/src/lib/libbsp/v850/gdbv850sim/start/start.S
Normal file
78
c/src/lib/libbsp/v850/gdbv850sim/start/start.S
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
# NEC V850 startup code
|
||||||
|
|
||||||
|
.section .text
|
||||||
|
.global _start
|
||||||
|
|
||||||
|
_start:
|
||||||
|
|
||||||
|
#if defined(__v850e__) || defined(__v850e2__) || defined(__v850e2v3__)
|
||||||
|
|
||||||
|
movea 255, r0, r20
|
||||||
|
mov 65535, r21
|
||||||
|
mov hilo(_stack), sp
|
||||||
|
mov hilo(__ep), ep
|
||||||
|
mov hilo(__gp), gp
|
||||||
|
mov hilo(__ctbp), r6
|
||||||
|
ldsr r6, ctbp
|
||||||
|
mov hilo(_edata), r6
|
||||||
|
mov hilo(_end), r7
|
||||||
|
.L0:
|
||||||
|
st.w r0, 0[r6]
|
||||||
|
addi 4, r6, r6
|
||||||
|
cmp r7, r6
|
||||||
|
bl .L0
|
||||||
|
.L1:
|
||||||
|
jarl ___main, r31
|
||||||
|
addi -16, sp, sp
|
||||||
|
mov 0, r6
|
||||||
|
mov 0, r7
|
||||||
|
mov 0, r8
|
||||||
|
/* jarl _main, r31 */
|
||||||
|
jarl _boot_card, r31
|
||||||
|
mov r10, r6
|
||||||
|
jarl _exit, r31
|
||||||
|
|
||||||
|
# else
|
||||||
|
movea 255, r0, r20
|
||||||
|
mov r0, r21
|
||||||
|
ori 65535, r0, r21
|
||||||
|
movhi hi(_stack), r0, sp
|
||||||
|
movea lo(_stack), sp, sp
|
||||||
|
movhi hi(__ep), r0, ep
|
||||||
|
movea lo(__ep), ep, ep
|
||||||
|
movhi hi(__gp), r0, gp
|
||||||
|
movea lo(__gp), gp, gp
|
||||||
|
|
||||||
|
movhi hi(_edata), r0, r6
|
||||||
|
movea lo(_edata), r6, r6
|
||||||
|
movhi hi(_end), r0, r7
|
||||||
|
movea lo(_end), r7, r7
|
||||||
|
.L0:
|
||||||
|
st.b r0, 0[r6]
|
||||||
|
addi 1, r6, r6
|
||||||
|
cmp r7, r6
|
||||||
|
bl .L0
|
||||||
|
.L1:
|
||||||
|
/* jarl ___main, r31 */
|
||||||
|
addi -16, sp, sp
|
||||||
|
mov 0, r6
|
||||||
|
mov 0, r7
|
||||||
|
mov 0, r8
|
||||||
|
/* jarl _main, r31 */
|
||||||
|
jarl _boot_card, r31
|
||||||
|
mov r10, r6
|
||||||
|
.L2:
|
||||||
|
br .L2
|
||||||
|
/* jarl _exit, r31 */
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
.section .stack
|
||||||
|
_stack: .long 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
.section .data
|
||||||
|
.global ___dso_handle
|
||||||
|
.weak ___dso_handle
|
||||||
|
___dso_handle:
|
||||||
|
.long 0
|
||||||
23
c/src/lib/libbsp/v850/gdbv850sim/startup/bspreset.c
Normal file
23
c/src/lib/libbsp/v850/gdbv850sim/startup/bspreset.c
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/**
|
||||||
|
* @file
|
||||||
|
*
|
||||||
|
* This routine exits the simulator.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* COPYRIGHT (c) 1989-2012.
|
||||||
|
* 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.rtems.com/license/LICENSE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <rtems.h>
|
||||||
|
#include <bsp/bootcard.h>
|
||||||
|
#include <bsp/syscall.h>
|
||||||
|
|
||||||
|
void bsp_reset( void )
|
||||||
|
{
|
||||||
|
TRAP0 (SYS_exit, 0, 0, 0);
|
||||||
|
}
|
||||||
214
c/src/lib/libbsp/v850/gdbv850sim/startup/linkcmds
Normal file
214
c/src/lib/libbsp/v850/gdbv850sim/startup/linkcmds
Normal file
@@ -0,0 +1,214 @@
|
|||||||
|
/*
|
||||||
|
* Declare some sizes.
|
||||||
|
*/
|
||||||
|
_RamBase = DEFINED(_RamBase) ? _RamBase : 0x100000; /* RAM starts at 1MB */
|
||||||
|
_RamSize = DEFINED(_RamSize) ? _RamSize : 0x100000; /* default is 1MB */
|
||||||
|
_HeapSize = DEFINED(_HeapSize) ? _HeapSize : 0x0;
|
||||||
|
_StackSize = DEFINED(_StackSize) ? _StackSize : 0x1000;
|
||||||
|
|
||||||
|
/* Default linker script, for normal executables */
|
||||||
|
OUTPUT_FORMAT("elf32-v850", "elf32-v850",
|
||||||
|
"elf32-v850")
|
||||||
|
OUTPUT_ARCH(v850)
|
||||||
|
ENTRY(_start)
|
||||||
|
/* GROUP(-lc -lsim -lgcc) */
|
||||||
|
SEARCH_DIR(.);
|
||||||
|
EXTERN(__ctbp __ep __gp);
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
/* This saves a little space in the ELF file, since the zda starts
|
||||||
|
at a higher location that the ELF headers take up. */
|
||||||
|
.zdata 0x160 :
|
||||||
|
{
|
||||||
|
*(.zdata)
|
||||||
|
*(.zbss)
|
||||||
|
*(reszdata)
|
||||||
|
*(.zcommon)
|
||||||
|
}
|
||||||
|
/* This is the read only part of the zero data area.
|
||||||
|
Having it as a seperate section prevents its
|
||||||
|
attributes from being inherited by the zdata
|
||||||
|
section. Specifically it prevents the zdata
|
||||||
|
section from being marked READONLY. */
|
||||||
|
.rozdata ALIGN (4) :
|
||||||
|
{
|
||||||
|
*(.rozdata)
|
||||||
|
*(romzdata)
|
||||||
|
*(romzbss)
|
||||||
|
}
|
||||||
|
/* Read-only sections, merged into text segment. */
|
||||||
|
. = 0x100000;
|
||||||
|
.interp : { *(.interp) }
|
||||||
|
.hash : { *(.hash) }
|
||||||
|
.dynsym : { *(.dynsym) }
|
||||||
|
.dynstr : { *(.dynstr) }
|
||||||
|
.rel.text : { *(.rel.text) }
|
||||||
|
.rela.text : { *(.rela.text) }
|
||||||
|
.rel.data : { *(.rel.data) }
|
||||||
|
.rela.data : { *(.rela.data) }
|
||||||
|
.rel.rodata : { *(.rel.rodata) }
|
||||||
|
.rela.rodata : { *(.rela.rodata) }
|
||||||
|
.rel.gcc_except_table : { *(.rel.gcc_except_table) }
|
||||||
|
.rela.gcc_except_table : { *(.rela.gcc_except_table) }
|
||||||
|
.rel.got : { *(.rel.got) }
|
||||||
|
.rela.got : { *(.rela.got) }
|
||||||
|
.rel.ctors : { *(.rel.ctors) }
|
||||||
|
.rela.ctors : { *(.rela.ctors) }
|
||||||
|
.rel.dtors : { *(.rel.dtors) }
|
||||||
|
.rela.dtors : { *(.rela.dtors) }
|
||||||
|
.rel.init : { *(.rel.init) }
|
||||||
|
.rela.init : { *(.rela.init) }
|
||||||
|
.rel.fini : { *(.rel.fini) }
|
||||||
|
.rela.fini : { *(.rela.fini) }
|
||||||
|
.rel.bss : { *(.rel.bss) }
|
||||||
|
.rela.bss : { *(.rela.bss) }
|
||||||
|
.rel.plt : { *(.rel.plt) }
|
||||||
|
.rela.plt : { *(.rela.plt) }
|
||||||
|
.init : { KEEP (*(.init)) } =0
|
||||||
|
.plt : { *(.plt) }
|
||||||
|
.text :
|
||||||
|
{
|
||||||
|
*(.text)
|
||||||
|
*(.text.*)
|
||||||
|
/* .gnu.warning sections are handled specially by elf32.em. */
|
||||||
|
*(.gnu.warning)
|
||||||
|
*(.gnu.linkonce.t*)
|
||||||
|
} =0
|
||||||
|
_etext = .;
|
||||||
|
PROVIDE (etext = .);
|
||||||
|
/* This is special code area at the end of the normal text section.
|
||||||
|
It contains a small lookup table at the start followed by the
|
||||||
|
code pointed to by entries in the lookup table. */
|
||||||
|
.call_table_data ALIGN (4) :
|
||||||
|
{
|
||||||
|
PROVIDE(__ctbp = .);
|
||||||
|
*(.call_table_data)
|
||||||
|
} = 0xff /* Fill gaps with 0xff. */
|
||||||
|
.call_table_text :
|
||||||
|
{
|
||||||
|
*(.call_table_text)
|
||||||
|
}
|
||||||
|
.fini : { KEEP (*(.fini)) } =0
|
||||||
|
.rodata : { *(.rodata) *(.rodata.*) *(.gnu.linkonce.r*) }
|
||||||
|
.rodata1 : { *(.rodata1) }
|
||||||
|
.data :
|
||||||
|
{
|
||||||
|
*(.data)
|
||||||
|
*(.data.*)
|
||||||
|
*(.gnu.linkonce.d*)
|
||||||
|
CONSTRUCTORS
|
||||||
|
}
|
||||||
|
.data1 : { *(.data1) }
|
||||||
|
.ctors :
|
||||||
|
{
|
||||||
|
___ctors = .;
|
||||||
|
KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
|
||||||
|
KEEP (*(SORT(.ctors.*)))
|
||||||
|
KEEP (*crtend(.ctors))
|
||||||
|
___ctors_end = .;
|
||||||
|
}
|
||||||
|
.dtors :
|
||||||
|
{
|
||||||
|
___dtors = .;
|
||||||
|
KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
|
||||||
|
KEEP (*(SORT(.dtors.*)))
|
||||||
|
KEEP (*crtend.o(.dtors))
|
||||||
|
___dtors_end = .;
|
||||||
|
}
|
||||||
|
.jcr :
|
||||||
|
{
|
||||||
|
KEEP (*(.jcr))
|
||||||
|
}
|
||||||
|
.gcc_except_table : { *(.gcc_except_table) }
|
||||||
|
.got : { *(.got.plt) *(.got) }
|
||||||
|
.dynamic : { *(.dynamic) }
|
||||||
|
.tdata ALIGN (4) :
|
||||||
|
{
|
||||||
|
PROVIDE (__ep = .);
|
||||||
|
*(.tbyte)
|
||||||
|
*(.tcommon_byte)
|
||||||
|
*(.tdata)
|
||||||
|
*(.tbss)
|
||||||
|
*(.tcommon)
|
||||||
|
}
|
||||||
|
/* We want the small data sections together, so single-instruction offsets
|
||||||
|
can access them all, and initialized data all before uninitialized, so
|
||||||
|
we can shorten the on-disk segment size. */
|
||||||
|
.sdata ALIGN (4) :
|
||||||
|
{
|
||||||
|
PROVIDE (__gp = . + 0x8000);
|
||||||
|
*(.sdata)
|
||||||
|
}
|
||||||
|
/* See comment about .rozdata. */
|
||||||
|
.rosdata ALIGN (4) :
|
||||||
|
{
|
||||||
|
*(.rosdata)
|
||||||
|
}
|
||||||
|
/* We place the .sbss data section AFTER the .rosdata section, so that
|
||||||
|
it can directly preceed the .bss section. This allows runtime startup
|
||||||
|
code to initialise all the zero-data sections by simply taking the
|
||||||
|
value of '_edata' and zeroing until it reaches '_end'. */
|
||||||
|
.sbss :
|
||||||
|
{
|
||||||
|
__sbss_start = .;
|
||||||
|
*(.sbss)
|
||||||
|
*(.scommon)
|
||||||
|
}
|
||||||
|
_edata = DEFINED (__sbss_start) ? __sbss_start : . ;
|
||||||
|
PROVIDE (edata = _edata);
|
||||||
|
.bss :
|
||||||
|
{
|
||||||
|
__bss_start = DEFINED (__sbss_start) ? __sbss_start : . ;
|
||||||
|
__real_bss_start = . ;
|
||||||
|
*(.dynbss)
|
||||||
|
*(.bss)
|
||||||
|
*(COMMON)
|
||||||
|
}
|
||||||
|
. += _StackSize;
|
||||||
|
_stack = .;
|
||||||
|
_WorkAreaBase = .;
|
||||||
|
_end = . ;
|
||||||
|
PROVIDE (end = .);
|
||||||
|
/* Stabs debugging sections. */
|
||||||
|
.stab 0 : { *(.stab) }
|
||||||
|
.stabstr 0 : { *(.stabstr) }
|
||||||
|
.stab.excl 0 : { *(.stab.excl) }
|
||||||
|
.stab.exclstr 0 : { *(.stab.exclstr) }
|
||||||
|
.stab.index 0 : { *(.stab.index) }
|
||||||
|
.stab.indexstr 0 : { *(.stab.indexstr) }
|
||||||
|
.comment 0 : { *(.comment) }
|
||||||
|
/* DWARF debug sections.
|
||||||
|
Symbols in the DWARF debugging sections are relative to the beginning
|
||||||
|
of the section so we begin them at 0. */
|
||||||
|
/* DWARF 1 */
|
||||||
|
.debug 0 : { *(.debug) }
|
||||||
|
.line 0 : { *(.line) }
|
||||||
|
/* GNU DWARF 1 extensions */
|
||||||
|
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
||||||
|
.debug_sfnames 0 : { *(.debug_sfnames) }
|
||||||
|
/* DWARF 1.1 and DWARF 2 */
|
||||||
|
.debug_aranges 0 : { *(.debug_aranges) }
|
||||||
|
.debug_pubnames 0 : { *(.debug_pubnames) }
|
||||||
|
/* DWARF 2 */
|
||||||
|
.debug_info 0 : { *(.debug_info) *(.gnu.linkonce.wi.*) }
|
||||||
|
.debug_abbrev 0 : { *(.debug_abbrev) }
|
||||||
|
.debug_line 0 : { *(.debug_line) }
|
||||||
|
.debug_frame 0 : { *(.debug_frame) }
|
||||||
|
.debug_str 0 : { *(.debug_str) }
|
||||||
|
.debug_loc 0 : { *(.debug_loc) }
|
||||||
|
.debug_macinfo 0 : { *(.debug_macinfo) }
|
||||||
|
/* SGI/MIPS DWARF 2 extensions. */
|
||||||
|
.debug_weaknames 0 : { *(.debug_weaknames) }
|
||||||
|
.debug_funcnames 0 : { *(.debug_funcnames) }
|
||||||
|
.debug_typenames 0 : { *(.debug_typenames) }
|
||||||
|
.debug_varnames 0 : { *(.debug_varnames) }
|
||||||
|
/* libgloss - User stack. */
|
||||||
|
/*
|
||||||
|
.stack 0x200000 :
|
||||||
|
{
|
||||||
|
__stack = .;
|
||||||
|
*(.stack)
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
14
c/src/lib/libbsp/v850/gdbv850sim/startup/trap.S
Normal file
14
c/src/lib/libbsp/v850/gdbv850sim/startup/trap.S
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
/* from libgloss/v850 */
|
||||||
|
.text
|
||||||
|
.global ___trap0
|
||||||
|
___trap0:
|
||||||
|
trap 31
|
||||||
|
tst r10,r10
|
||||||
|
bz .L0
|
||||||
|
/*
|
||||||
|
* Libgloss cares about the errno from this. We don't
|
||||||
|
movhi hi(_errno),r0,r6
|
||||||
|
st.w r10,lo(_errno)[r6]
|
||||||
|
*/
|
||||||
|
.L0:
|
||||||
|
jmp [r31]
|
||||||
7
c/src/lib/libbsp/v850/preinstall.am
Normal file
7
c/src/lib/libbsp/v850/preinstall.am
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
## Automatically generated by ampolish3 - Do not edit
|
||||||
|
|
||||||
|
if AMPOLISH3
|
||||||
|
$(srcdir)/preinstall.am: Makefile.am
|
||||||
|
$(AMPOLISH3) $(srcdir)/Makefile.am > $(srcdir)/preinstall.am
|
||||||
|
endif
|
||||||
|
|
||||||
21
c/src/lib/libbsp/v850/shared/crt1.c
Normal file
21
c/src/lib/libbsp/v850/shared/crt1.c
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* From newlib ==> libc/sys/sysnecv850/crt1.c
|
||||||
|
*
|
||||||
|
* Obtained newlib 29 May 2012
|
||||||
|
*/
|
||||||
|
void __main ()
|
||||||
|
{
|
||||||
|
static int initialized;
|
||||||
|
if (! initialized)
|
||||||
|
{
|
||||||
|
typedef void (*pfunc) ();
|
||||||
|
extern pfunc __ctors[];
|
||||||
|
extern pfunc __ctors_end[];
|
||||||
|
pfunc *p;
|
||||||
|
|
||||||
|
initialized = 1;
|
||||||
|
for (p = __ctors_end; p > __ctors; )
|
||||||
|
(*--p) ();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -366,6 +366,7 @@ score/cpu/powerpc/Makefile
|
|||||||
score/cpu/sh/Makefile
|
score/cpu/sh/Makefile
|
||||||
score/cpu/sparc/Makefile
|
score/cpu/sparc/Makefile
|
||||||
score/cpu/sparc64/Makefile
|
score/cpu/sparc64/Makefile
|
||||||
|
score/cpu/v850/Makefile
|
||||||
score/cpu/no_cpu/Makefile
|
score/cpu/no_cpu/Makefile
|
||||||
posix/Makefile
|
posix/Makefile
|
||||||
libblock/Makefile
|
libblock/Makefile
|
||||||
|
|||||||
@@ -75,7 +75,8 @@ static char *rcsid = "$FreeBSD: src/lib/libc/xdr/xdr_float.c,v 1.7 1999/08/28 00
|
|||||||
defined(__AVR__) || \
|
defined(__AVR__) || \
|
||||||
defined(__BFIN__) || \
|
defined(__BFIN__) || \
|
||||||
defined(__m32c__) || \
|
defined(__m32c__) || \
|
||||||
defined(__M32R__)
|
defined(__M32R__) || \
|
||||||
|
defined(__v850)
|
||||||
|
|
||||||
#include <rtems/endian.h>
|
#include <rtems/endian.h>
|
||||||
#if !defined(IEEEFP)
|
#if !defined(IEEEFP)
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ DIST_SUBDIRS += powerpc
|
|||||||
DIST_SUBDIRS += sh
|
DIST_SUBDIRS += sh
|
||||||
DIST_SUBDIRS += sparc
|
DIST_SUBDIRS += sparc
|
||||||
DIST_SUBDIRS += sparc64
|
DIST_SUBDIRS += sparc64
|
||||||
|
DIST_SUBDIRS += v850
|
||||||
|
|
||||||
include $(top_srcdir)/automake/subdirs.am
|
include $(top_srcdir)/automake/subdirs.am
|
||||||
include $(top_srcdir)/automake/local.am
|
include $(top_srcdir)/automake/local.am
|
||||||
|
|||||||
17
cpukit/score/cpu/v850/Makefile.am
Normal file
17
cpukit/score/cpu/v850/Makefile.am
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
include $(top_srcdir)/automake/compile.am
|
||||||
|
|
||||||
|
include_rtemsdir = $(includedir)/rtems
|
||||||
|
include_rtems_HEADERS = rtems/asm.h
|
||||||
|
|
||||||
|
include_rtems_scoredir = $(includedir)/rtems/score
|
||||||
|
include_rtems_score_HEADERS = rtems/score/cpu.h
|
||||||
|
include_rtems_score_HEADERS += rtems/score/v850.h
|
||||||
|
include_rtems_score_HEADERS += rtems/score/cpu_asm.h rtems/score/types.h
|
||||||
|
|
||||||
|
noinst_LIBRARIES = libscorecpu.a
|
||||||
|
libscorecpu_a_SOURCES = cpu.c
|
||||||
|
libscorecpu_a_SOURCES += cpu_asm.S
|
||||||
|
libscorecpu_a_CPPFLAGS = $(AM_CPPFLAGS)
|
||||||
|
|
||||||
|
include $(srcdir)/preinstall.am
|
||||||
|
include $(top_srcdir)/automake/local.am
|
||||||
98
cpukit/score/cpu/v850/cpu.c
Normal file
98
cpukit/score/cpu/v850/cpu.c
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
/**
|
||||||
|
* @file
|
||||||
|
*
|
||||||
|
* v850 CPU Dependent Source
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* COPYRIGHT (c) 1989-2012.
|
||||||
|
* 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.rtems.com/license/LICENSE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <rtems/system.h>
|
||||||
|
#include <rtems/score/isr.h>
|
||||||
|
#include <rtems/score/wkspace.h>
|
||||||
|
|
||||||
|
#include <string.h> /* for memset */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* v850 Specific Information:
|
||||||
|
*
|
||||||
|
* So far nothing known to be needed at this point during initialization.
|
||||||
|
*/
|
||||||
|
void _CPU_Initialize(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* v850 Specific Information:
|
||||||
|
*
|
||||||
|
* This method returns 0 if interrupts are enabled and 1 if they are disabled.
|
||||||
|
* The v850 only has two interrupt levels (on and off).
|
||||||
|
*/
|
||||||
|
uint32_t _CPU_ISR_Get_level( void )
|
||||||
|
{
|
||||||
|
unsigned int psw;
|
||||||
|
|
||||||
|
v850_get_psw( psw );
|
||||||
|
|
||||||
|
if ( (psw & V850_PSW_INTERRUPT_DISABLE_MASK) == V850_PSW_INTERRUPT_DISABLE )
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* v850 Specific Information:
|
||||||
|
*
|
||||||
|
* This method initializes a v850 context control structure.
|
||||||
|
*/
|
||||||
|
void _CPU_Context_Initialize(
|
||||||
|
Context_Control *the_context,
|
||||||
|
uint32_t *stack_base,
|
||||||
|
uint32_t size,
|
||||||
|
uint32_t new_level,
|
||||||
|
void *entry_point,
|
||||||
|
bool is_fp
|
||||||
|
)
|
||||||
|
{
|
||||||
|
uint32_t stack_high; /* highest "stack aligned" address */
|
||||||
|
uint32_t psw; /* highest "stack aligned" address */
|
||||||
|
|
||||||
|
memset( the_context, 0, sizeof(Context_Control) );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* On CPUs with stacks which grow down, we build the stack
|
||||||
|
* based on the stack_high address.
|
||||||
|
*/
|
||||||
|
stack_high = ((uint32_t)(stack_base) + size);
|
||||||
|
stack_high &= ~(CPU_STACK_ALIGNMENT - 1);
|
||||||
|
|
||||||
|
v850_get_psw( psw );
|
||||||
|
psw &= ~V850_PSW_INTERRUPT_DISABLE_MASK;
|
||||||
|
if ( new_level )
|
||||||
|
psw |= V850_PSW_INTERRUPT_DISABLE;
|
||||||
|
else
|
||||||
|
psw |= V850_PSW_INTERRUPT_ENABLE;
|
||||||
|
|
||||||
|
the_context->r31 = (uint32_t) entry_point;
|
||||||
|
the_context->r3_stack_pointer = stack_high;
|
||||||
|
the_context->psw = psw;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
printk( "the_context = %p\n", the_context );
|
||||||
|
printk( "stack base = 0x%08x\n", stack_base );
|
||||||
|
printk( "stack size = 0x%08x\n", size );
|
||||||
|
printk( "sp = 0x%08x\n", the_context->r3_stack_pointer );
|
||||||
|
printk( "psw = 0x%08x\n", the_context->psw );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
213
cpukit/score/cpu/v850/cpu_asm.S
Normal file
213
cpukit/score/cpu/v850/cpu_asm.S
Normal file
@@ -0,0 +1,213 @@
|
|||||||
|
/**
|
||||||
|
* @file
|
||||||
|
*
|
||||||
|
* This file contains the basic algorithms for all assembly code used
|
||||||
|
* in an specific CPU port of RTEMS. These algorithms must be implemented
|
||||||
|
* in assembly language
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* COPYRIGHT (c) 1989-2012.
|
||||||
|
* 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.rtems.com/license/LICENSE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/**
|
||||||
|
* This routine is responsible for saving the FP context
|
||||||
|
* at *fp_context_ptr. If the point to load the FP context
|
||||||
|
* from is changed then the pointer is modified by this routine.
|
||||||
|
*
|
||||||
|
* Sometimes a macro implementation of this is in cpu.h which dereferences
|
||||||
|
* the ** and a similarly named routine in this file is passed something
|
||||||
|
* like a (Context_Control_fp *). The general rule on making this decision
|
||||||
|
* is to avoid writing assembly language.
|
||||||
|
*
|
||||||
|
* v850 Specific Information:
|
||||||
|
*
|
||||||
|
* The v850 appears to always have soft float.
|
||||||
|
*/
|
||||||
|
void _CPU_Context_save_fp(
|
||||||
|
Context_Control_fp **fp_context_ptr
|
||||||
|
)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This routine is responsible for restoring the FP context
|
||||||
|
* at *fp_context_ptr. If the point to load the FP context
|
||||||
|
* from is changed then the pointer is modified by this routine.
|
||||||
|
*
|
||||||
|
* Sometimes a macro implementation of this is in cpu.h which dereferences
|
||||||
|
* the ** and a similarly named routine in this file is passed something
|
||||||
|
* like a (Context_Control_fp *). The general rule on making this decision
|
||||||
|
* is to avoid writing assembly language.
|
||||||
|
*
|
||||||
|
* v850 Specific Information:
|
||||||
|
*
|
||||||
|
* XXX document implementation including references if appropriate
|
||||||
|
*/
|
||||||
|
void _CPU_Context_restore_fp(
|
||||||
|
Context_Control_fp **fp_context_ptr
|
||||||
|
)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This routine performs a normal non-FP context switch.
|
||||||
|
*
|
||||||
|
* v850 Specific Information:
|
||||||
|
*
|
||||||
|
* + r6 - running thread
|
||||||
|
* + r7 - heir thread
|
||||||
|
*/
|
||||||
|
#define V850_CONTEXT_CONTROL_R1_OFFSET 0
|
||||||
|
#define V850_CONTEXT_CONTROL_R3_OFFSET 4
|
||||||
|
#define V850_CONTEXT_CONTROL_R20_OFFSET 8
|
||||||
|
#define V850_CONTEXT_CONTROL_R21_OFFSET 12
|
||||||
|
#define V850_CONTEXT_CONTROL_R22_OFFSET 16
|
||||||
|
#define V850_CONTEXT_CONTROL_R23_OFFSET 20
|
||||||
|
#define V850_CONTEXT_CONTROL_R24_OFFSET 24
|
||||||
|
#define V850_CONTEXT_CONTROL_R25_OFFSET 28
|
||||||
|
#define V850_CONTEXT_CONTROL_R26_OFFSET 32
|
||||||
|
#define V850_CONTEXT_CONTROL_R27_OFFSET 36
|
||||||
|
#define V850_CONTEXT_CONTROL_R28_OFFSET 40
|
||||||
|
#define V850_CONTEXT_CONTROL_R29_OFFSET 44
|
||||||
|
#define V850_CONTEXT_CONTROL_R31_OFFSET 48
|
||||||
|
#define V850_CONTEXT_CONTROL_PSW_OFFSET 52
|
||||||
|
|
||||||
|
.section .text
|
||||||
|
.global __CPU_Context_switch
|
||||||
|
.type __CPU_Context_switch, @function
|
||||||
|
__CPU_Context_switch:
|
||||||
|
st.w r1,V850_CONTEXT_CONTROL_R1_OFFSET[r6]
|
||||||
|
st.w r3,V850_CONTEXT_CONTROL_R3_OFFSET[r6]
|
||||||
|
st.w r20,V850_CONTEXT_CONTROL_R20_OFFSET[r6]
|
||||||
|
st.w r21,V850_CONTEXT_CONTROL_R21_OFFSET[r6]
|
||||||
|
st.w r22,V850_CONTEXT_CONTROL_R22_OFFSET[r6]
|
||||||
|
st.w r23,V850_CONTEXT_CONTROL_R23_OFFSET[r6]
|
||||||
|
st.w r24,V850_CONTEXT_CONTROL_R24_OFFSET[r6]
|
||||||
|
st.w r25,V850_CONTEXT_CONTROL_R25_OFFSET[r6]
|
||||||
|
st.w r26,V850_CONTEXT_CONTROL_R27_OFFSET[r6]
|
||||||
|
st.w r27,V850_CONTEXT_CONTROL_R27_OFFSET[r6]
|
||||||
|
st.w r28,V850_CONTEXT_CONTROL_R28_OFFSET[r6]
|
||||||
|
st.w r29,V850_CONTEXT_CONTROL_R29_OFFSET[r6]
|
||||||
|
st.w r31,V850_CONTEXT_CONTROL_R31_OFFSET[r6]
|
||||||
|
stsr psw,r21
|
||||||
|
st.w r21,V850_CONTEXT_CONTROL_PSW_OFFSET[r6]
|
||||||
|
restore:
|
||||||
|
ld.w V850_CONTEXT_CONTROL_R1_OFFSET[r7],r1
|
||||||
|
ld.w V850_CONTEXT_CONTROL_R3_OFFSET[r7],r3
|
||||||
|
ld.w V850_CONTEXT_CONTROL_R20_OFFSET[r7],r20
|
||||||
|
ld.w V850_CONTEXT_CONTROL_R21_OFFSET[r7],r21
|
||||||
|
ld.w V850_CONTEXT_CONTROL_R22_OFFSET[r7],r22
|
||||||
|
ld.w V850_CONTEXT_CONTROL_R23_OFFSET[r7],r23
|
||||||
|
ld.w V850_CONTEXT_CONTROL_R24_OFFSET[r7],r24
|
||||||
|
ld.w V850_CONTEXT_CONTROL_R25_OFFSET[r7],r25
|
||||||
|
ld.w V850_CONTEXT_CONTROL_R27_OFFSET[r7],r26
|
||||||
|
ld.w V850_CONTEXT_CONTROL_R27_OFFSET[r7],r27
|
||||||
|
ld.w V850_CONTEXT_CONTROL_R28_OFFSET[r7],r28
|
||||||
|
ld.w V850_CONTEXT_CONTROL_R29_OFFSET[r7],r29
|
||||||
|
ld.w V850_CONTEXT_CONTROL_R31_OFFSET[r7],r31
|
||||||
|
ld.w V850_CONTEXT_CONTROL_PSW_OFFSET[r7],r7
|
||||||
|
ldsr r7,psw
|
||||||
|
jmp [r31]
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This routine is generally used only to restart self in an
|
||||||
|
* efficient manner. It may simply be a label in _CPU_Context_switch.
|
||||||
|
*
|
||||||
|
* NOTE: May be unnecessary to reload some registers.
|
||||||
|
*
|
||||||
|
* v850 Specific Information:
|
||||||
|
*
|
||||||
|
* Move second parameter to first and jump to normal restore
|
||||||
|
*/
|
||||||
|
.section .text
|
||||||
|
.global __CPU_Context_restore
|
||||||
|
.type __CPU_Context_restore, @function
|
||||||
|
__CPU_Context_restore:
|
||||||
|
mov r6, r7 /* move to second parameter register */
|
||||||
|
br restore
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/**
|
||||||
|
* This routine provides the RTEMS interrupt management.
|
||||||
|
*
|
||||||
|
* v850 Specific Information:
|
||||||
|
*
|
||||||
|
* XXX document implementation including references if appropriate
|
||||||
|
*/
|
||||||
|
void _ISR_Handler(void); /* C warning avoidance */
|
||||||
|
void _ISR_Handler(void)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* This discussion ignores a lot of the ugly details in a real
|
||||||
|
* implementation such as saving enough registers/state to be
|
||||||
|
* able to do something real. Keep in mind that the goal is
|
||||||
|
* to invoke a user's ISR handler which is written in C and
|
||||||
|
* uses a certain set of registers.
|
||||||
|
*
|
||||||
|
* Also note that the exact order is to a large extent flexible.
|
||||||
|
* Hardware will dictate a sequence for a certain subset of
|
||||||
|
* _ISR_Handler while requirements for setting
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* At entry to "common" _ISR_Handler, the vector number must be
|
||||||
|
* available. On some CPUs the hardware puts either the vector
|
||||||
|
* number or the offset into the vector table for this ISR in a
|
||||||
|
* known place. If the hardware does not give us this information,
|
||||||
|
* then the assembly portion of RTEMS for this port will contain
|
||||||
|
* a set of distinct interrupt entry points which somehow place
|
||||||
|
* the vector number in a known place (which is safe if another
|
||||||
|
* interrupt nests this one) and branches to _ISR_Handler.
|
||||||
|
*
|
||||||
|
* save some or all context on stack
|
||||||
|
* may need to save some special interrupt information for exit
|
||||||
|
*
|
||||||
|
* #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
|
||||||
|
* if ( _ISR_Nest_level == 0 )
|
||||||
|
* switch to software interrupt stack
|
||||||
|
* #endif
|
||||||
|
*
|
||||||
|
* _ISR_Nest_level++;
|
||||||
|
*
|
||||||
|
* _Thread_Dispatch_disable_level++;
|
||||||
|
*
|
||||||
|
* (*_ISR_Vector_table[ vector ])( vector );
|
||||||
|
*
|
||||||
|
* _Thread_Dispatch_disable_level--;
|
||||||
|
*
|
||||||
|
* --_ISR_Nest_level;
|
||||||
|
*
|
||||||
|
* if ( _ISR_Nest_level )
|
||||||
|
* goto the label "exit interrupt (simple case)"
|
||||||
|
*
|
||||||
|
* if ( _Thread_Dispatch_disable_level )
|
||||||
|
* goto the label "exit interrupt (simple case)"
|
||||||
|
*
|
||||||
|
* if ( _Thread_Dispatch_necessary ) {
|
||||||
|
* call _Thread_Dispatch() or prepare to return to _ISR_Dispatch
|
||||||
|
* prepare to get out of interrupt
|
||||||
|
* return from interrupt (maybe to _ISR_Dispatch)
|
||||||
|
*
|
||||||
|
* LABEL "exit interrupt (simple case):
|
||||||
|
* #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
|
||||||
|
* if outermost interrupt
|
||||||
|
* restore stack
|
||||||
|
* #endif
|
||||||
|
* prepare to get out of interrupt
|
||||||
|
* return from interrupt
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
#endif
|
||||||
45
cpukit/score/cpu/v850/preinstall.am
Normal file
45
cpukit/score/cpu/v850/preinstall.am
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
## Automatically generated by ampolish3 - Do not edit
|
||||||
|
|
||||||
|
if AMPOLISH3
|
||||||
|
$(srcdir)/preinstall.am: Makefile.am
|
||||||
|
$(AMPOLISH3) $(srcdir)/Makefile.am > $(srcdir)/preinstall.am
|
||||||
|
endif
|
||||||
|
|
||||||
|
PREINSTALL_DIRS =
|
||||||
|
DISTCLEANFILES = $(PREINSTALL_DIRS)
|
||||||
|
|
||||||
|
all-am: $(PREINSTALL_FILES)
|
||||||
|
|
||||||
|
PREINSTALL_FILES =
|
||||||
|
CLEANFILES = $(PREINSTALL_FILES)
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/rtems/$(dirstamp):
|
||||||
|
@$(MKDIR_P) $(PROJECT_INCLUDE)/rtems
|
||||||
|
@: > $(PROJECT_INCLUDE)/rtems/$(dirstamp)
|
||||||
|
PREINSTALL_DIRS += $(PROJECT_INCLUDE)/rtems/$(dirstamp)
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/rtems/asm.h: rtems/asm.h $(PROJECT_INCLUDE)/rtems/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/asm.h
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/asm.h
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/rtems/score/$(dirstamp):
|
||||||
|
@$(MKDIR_P) $(PROJECT_INCLUDE)/rtems/score
|
||||||
|
@: > $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
|
||||||
|
PREINSTALL_DIRS += $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/rtems/score/cpu.h: rtems/score/cpu.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/cpu.h
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/cpu.h
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/rtems/score/v850.h: rtems/score/v850.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/v850.h
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/v850.h
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/rtems/score/cpu_asm.h: rtems/score/cpu_asm.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/cpu_asm.h
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/cpu_asm.h
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/rtems/score/types.h: rtems/score/types.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/types.h
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/types.h
|
||||||
|
|
||||||
125
cpukit/score/cpu/v850/rtems/asm.h
Normal file
125
cpukit/score/cpu/v850/rtems/asm.h
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
/**
|
||||||
|
* @file rtems/asm.h
|
||||||
|
*
|
||||||
|
* This include file attempts to address the problems
|
||||||
|
* caused by incompatible flavors of assemblers and
|
||||||
|
* toolsets. It primarily addresses variations in the
|
||||||
|
* use of leading underscores on symbols and the requirement
|
||||||
|
* that register names be preceded by a %.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NOTE: The spacing in the use of these macros
|
||||||
|
* is critical to them working as advertised.
|
||||||
|
*
|
||||||
|
* COPYRIGHT:
|
||||||
|
*
|
||||||
|
* This file is based on similar code found in newlib available
|
||||||
|
* from ftp.cygnus.com. The file which was used had no copyright
|
||||||
|
* notice. This file is freely distributable as long as the source
|
||||||
|
* of the file is noted. This file is:
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* COPYRIGHT (c) 1994-2012.
|
||||||
|
* On-Line Applications Research Corporation (OAR).
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _RTEMS_ASM_H
|
||||||
|
#define _RTEMS_ASM_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Indicate we are in an assembly file and get the basic CPU definitions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ASM
|
||||||
|
#define ASM
|
||||||
|
#endif
|
||||||
|
#include <rtems/score/cpuopts.h>
|
||||||
|
#include <rtems/score/no_cpu.h>
|
||||||
|
|
||||||
|
#ifndef __USER_LABEL_PREFIX__
|
||||||
|
/**
|
||||||
|
* Recent versions of GNU cpp define variables which indicate the
|
||||||
|
* need for underscores and percents. If not using GNU cpp or
|
||||||
|
* the version does not support this, then you will obviously
|
||||||
|
* have to define these as appropriate.
|
||||||
|
*
|
||||||
|
* This symbol is prefixed to all C program symbols.
|
||||||
|
*/
|
||||||
|
#define __USER_LABEL_PREFIX__ _
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __REGISTER_PREFIX__
|
||||||
|
/**
|
||||||
|
* Recent versions of GNU cpp define variables which indicate the
|
||||||
|
* need for underscores and percents. If not using GNU cpp or
|
||||||
|
* the version does not support this, then you will obviously
|
||||||
|
* have to define these as appropriate.
|
||||||
|
*
|
||||||
|
* This symbol is prefixed to all register names.
|
||||||
|
*/
|
||||||
|
#define __REGISTER_PREFIX__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <rtems/concat.h>
|
||||||
|
|
||||||
|
/** Use the right prefix for global labels. */
|
||||||
|
#define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
|
||||||
|
|
||||||
|
/** Use the right prefix for registers. */
|
||||||
|
#define REG(x) CONCAT1 (__REGISTER_PREFIX__, x)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* define macros for all of the registers on this CPU
|
||||||
|
*
|
||||||
|
* EXAMPLE: #define d0 REG (d0)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Define macros to handle section beginning and ends.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** This macro is used to denote the beginning of a code declaration. */
|
||||||
|
#define BEGIN_CODE_DCL .text
|
||||||
|
/** This macro is used to denote the end of a code declaration. */
|
||||||
|
#define END_CODE_DCL
|
||||||
|
/** This macro is used to denote the beginning of a data declaration section. */
|
||||||
|
#define BEGIN_DATA_DCL .data
|
||||||
|
/** This macro is used to denote the end of a data declaration section. */
|
||||||
|
#define END_DATA_DCL
|
||||||
|
/** This macro is used to denote the beginning of a code section. */
|
||||||
|
#define BEGIN_CODE .text
|
||||||
|
/** This macro is used to denote the end of a code section. */
|
||||||
|
#define END_CODE
|
||||||
|
/** This macro is used to denote the beginning of a data section. */
|
||||||
|
#define BEGIN_DATA
|
||||||
|
/** This macro is used to denote the end of a data section. */
|
||||||
|
#define END_DATA
|
||||||
|
/** This macro is used to denote the beginning of the
|
||||||
|
* unitialized data section.
|
||||||
|
*/
|
||||||
|
#define BEGIN_BSS
|
||||||
|
/** This macro is used to denote the end of the unitialized data section. */
|
||||||
|
#define END_BSS
|
||||||
|
/** This macro is used to denote the end of the assembly file. */
|
||||||
|
#define END
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This macro is used to declare a public global symbol.
|
||||||
|
*
|
||||||
|
* @note This must be tailored for a particular flavor of the C compiler.
|
||||||
|
* They may need to put underscores in front of the symbols.
|
||||||
|
*/
|
||||||
|
#define PUBLIC(sym) .globl SYM (sym)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This macro is used to prototype a public global symbol.
|
||||||
|
*
|
||||||
|
* @note This must be tailored for a particular flavor of the C compiler.
|
||||||
|
* They may need to put underscores in front of the symbols.
|
||||||
|
*/
|
||||||
|
#define EXTERN(sym) .globl SYM (sym)
|
||||||
|
|
||||||
|
#endif
|
||||||
1188
cpukit/score/cpu/v850/rtems/score/cpu.h
Normal file
1188
cpukit/score/cpu/v850/rtems/score/cpu.h
Normal file
File diff suppressed because it is too large
Load Diff
71
cpukit/score/cpu/v850/rtems/score/cpu_asm.h
Normal file
71
cpukit/score/cpu/v850/rtems/score/cpu_asm.h
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
/**
|
||||||
|
* @file rtems/score/cpu_asm.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Very loose template for an include file for the cpu_asm.? file
|
||||||
|
* if it is implemented as a ".S" file (preprocessed by cpp) instead
|
||||||
|
* of a ".s" file (preprocessed by gm4 or gasp).
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* COPYRIGHT (c) 1989-2012.
|
||||||
|
* 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.rtems.com/license/LICENSE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _RTEMS_SCORE_CPU_ASM_H
|
||||||
|
#define _RTEMS_SCORE_CPU_ASM_H
|
||||||
|
|
||||||
|
/* pull in the generated offsets */
|
||||||
|
|
||||||
|
#include <rtems/score/offsets.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Hardware General Registers
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* put something here */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Hardware Floating Point Registers
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* put something here */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Hardware Control Registers
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* put something here */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Calling Convention
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* put something here */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Temporary registers
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* put something here */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Floating Point Registers - SW Conventions
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* put something here */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Temporary floating point registers
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* put something here */
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* end of file */
|
||||||
41
cpukit/score/cpu/v850/rtems/score/types.h
Normal file
41
cpukit/score/cpu/v850/rtems/score/types.h
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
/**
|
||||||
|
* @file rtems/score/types.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This include file contains type definitions pertaining to the
|
||||||
|
* v850 processor family.
|
||||||
|
*
|
||||||
|
* COPYRIGHT (c) 1989-2011.
|
||||||
|
* 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.rtems.com/license/LICENSE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _RTEMS_SCORE_TYPES_H
|
||||||
|
#define _RTEMS_SCORE_TYPES_H
|
||||||
|
|
||||||
|
#include <rtems/score/basedefs.h>
|
||||||
|
|
||||||
|
#ifndef ASM
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This section defines the basic types for this processor.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** This defines the type for a priority bit map entry. */
|
||||||
|
typedef uint16_t Priority_bit_map_Control;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* !ASM */
|
||||||
|
|
||||||
|
#endif
|
||||||
126
cpukit/score/cpu/v850/rtems/score/v850.h
Normal file
126
cpukit/score/cpu/v850/rtems/score/v850.h
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
/*
|
||||||
|
* This file sets up basic CPU dependency settings based on
|
||||||
|
* compiler settings. For example, it can determine if
|
||||||
|
* floating point is available. This particular implementation
|
||||||
|
* is specified to the Renesas v850 port.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* COPYRIGHT (c) 1989-2012.
|
||||||
|
* 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.rtems.com/license/LICENSE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _RTEMS_SCORE_V850_H
|
||||||
|
#define _RTEMS_SCORE_V850_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file contains the information required to build
|
||||||
|
* RTEMS for a particular member of the NO CPU family.
|
||||||
|
* It does this by setting variables to indicate which
|
||||||
|
* implementation dependent features are present in a particular
|
||||||
|
* member of the family.
|
||||||
|
*
|
||||||
|
* This is a good place to list all the known CPU models
|
||||||
|
* that this port supports and which RTEMS CPU model they correspond
|
||||||
|
* to.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(rtems_multilib)
|
||||||
|
/*
|
||||||
|
* Figure out all CPU Model Feature Flags based upon compiler
|
||||||
|
* predefines.
|
||||||
|
*/
|
||||||
|
#define CPU_MODEL_NAME "rtems_multilib"
|
||||||
|
#define V850_HAS_FPU 0
|
||||||
|
|
||||||
|
#elif defined(__v850e2v3__)
|
||||||
|
#define CPU_MODEL_NAME "v850e2v3"
|
||||||
|
#define V850_HAS_FPU 1
|
||||||
|
|
||||||
|
#elif defined(__v850e2__)
|
||||||
|
#define CPU_MODEL_NAME "v850e2"
|
||||||
|
#define V850_HAS_FPU 0
|
||||||
|
|
||||||
|
#elif defined(__v850es__)
|
||||||
|
#define CPU_MODEL_NAME "v850es"
|
||||||
|
#define V850_HAS_FPU 0
|
||||||
|
|
||||||
|
#elif defined(__v850e1__)
|
||||||
|
#define CPU_MODEL_NAME "v850e1"
|
||||||
|
#define V850_HAS_FPU 0
|
||||||
|
|
||||||
|
#elif defined(__v850e__)
|
||||||
|
#define CPU_MODEL_NAME "v850e"
|
||||||
|
#define V850_HAS_FPU 0
|
||||||
|
|
||||||
|
#else
|
||||||
|
#define CPU_MODEL_NAME "v850"
|
||||||
|
#define V850_HAS_FPU 0
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Define the name of the CPU family.
|
||||||
|
*/
|
||||||
|
#define CPU_NAME "v850 CPU"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Method to set the Program Status Word (PSW)
|
||||||
|
*/
|
||||||
|
#define v850_set_psw( _psw ) \
|
||||||
|
__asm__ __volatile__( "ldsr %0, psw" : : "r" (_psw) )
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Method to obtain the Program Status Word (PSW)
|
||||||
|
*/
|
||||||
|
#define v850_get_psw( _psw ) \
|
||||||
|
__asm__ __volatile__( "stsr psw, %0" : "=&r" (_psw) )
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Masks and bits in the Program Status Word (PSW)
|
||||||
|
*/
|
||||||
|
#define V850_PSW_ZERO_MASK 0x01
|
||||||
|
#define V850_PSW_IS_ZERO 0x01
|
||||||
|
#define V850_PSW_IS_NOT 0x00
|
||||||
|
|
||||||
|
#define V850_PSW_SIGN_MASK 0x02
|
||||||
|
#define V850_PSW_SIGN_IS_NEGATIVE 0x02
|
||||||
|
#define V850_PSW_SIGN_IS_ZERO_OR_POSITIVE 0x00
|
||||||
|
|
||||||
|
#define V850_PSW_OVERFLOW_MASK 0x02
|
||||||
|
#define V850_PSW_OVERFLOW_OCCURRED 0x02
|
||||||
|
#define V850_PSW_OVERFLOW_DID_NOT_OCCUR 0x00
|
||||||
|
|
||||||
|
#define V850_PSW_CARRY_OR_BORROW_MASK 0x04
|
||||||
|
#define V850_PSW_CARRY_OR_BORROW_OCCURRED 0x04
|
||||||
|
#define V850_PSW_CARRY_OR_BORROW_DID_NOT_OCCUR 0x00
|
||||||
|
|
||||||
|
#define V850_PSW_SATURATION_MASK 0x10
|
||||||
|
#define V850_PSW_SATURATION_OCCURRED 0x10
|
||||||
|
#define V850_PSW_SATURATION_DID_NOT_OCCUR 0x00
|
||||||
|
|
||||||
|
#define V850_PSW_INTERRUPT_DISABLE_MASK 0x20
|
||||||
|
#define V850_PSW_INTERRUPT_DISABLE 0x20
|
||||||
|
#define V850_PSW_INTERRUPT_ENABLE 0x00
|
||||||
|
|
||||||
|
#define V850_PSW_EXCEPTION_IN_PROCESS_MASK 0x40
|
||||||
|
#define V850_PSW_EXCEPTION_IN_PROCESS 0x40
|
||||||
|
#define V850_PSW_EXCEPTION_NOT_IN_PROCESS 0x00
|
||||||
|
|
||||||
|
#define V850_PSW_NMI_IN_PROCESS_MASK 0x80
|
||||||
|
#define V850_PSW_NMI_IN_PROCESS 0x80
|
||||||
|
#define V850_PSW_NMI_NOT_IN_PROCESS 0x00
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _RTEMS_SCORE_V850_H */
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# COPYRIGHT (c) 1988-2002.
|
# COPYRIGHT (c) 1988-2012.
|
||||||
# On-Line Applications Research Corporation (OAR).
|
# On-Line Applications Research Corporation (OAR).
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
|
||||||
@@ -11,7 +11,7 @@ include $(top_srcdir)/main.am
|
|||||||
REPLACE2 = $(PERL) $(top_srcdir)/tools/word-replace2
|
REPLACE2 = $(PERL) $(top_srcdir)/tools/word-replace2
|
||||||
|
|
||||||
GENERATED_FILES = general.texi arm.texi avr.texi bfin.texi i386.texi lm32.texi \
|
GENERATED_FILES = general.texi arm.texi avr.texi bfin.texi i386.texi lm32.texi \
|
||||||
m68k.texi mips.texi powerpc.texi sh.texi sparc.texi sparc64.texi
|
m68k.texi mips.texi powerpc.texi sh.texi sparc.texi sparc64.texi v850.texi
|
||||||
|
|
||||||
COMMON_FILES += $(top_srcdir)/common/cpright.texi
|
COMMON_FILES += $(top_srcdir)/common/cpright.texi
|
||||||
|
|
||||||
@@ -84,6 +84,11 @@ sparc64.texi: sparc64.t
|
|||||||
-u "Top" \
|
-u "Top" \
|
||||||
-n "" < $< > $@
|
-n "" < $< > $@
|
||||||
|
|
||||||
|
v850.texi: v850.t
|
||||||
|
$(BMENU2) -p "" \
|
||||||
|
-u "Top" \
|
||||||
|
-n "" < $< > $@
|
||||||
|
|
||||||
CLEANFILES += cpu_supplement.info
|
CLEANFILES += cpu_supplement.info
|
||||||
CLEANFILES += cpu_supplement.info-1
|
CLEANFILES += cpu_supplement.info-1
|
||||||
CLEANFILES += cpu_supplement.info-2
|
CLEANFILES += cpu_supplement.info-2
|
||||||
|
|||||||
104
doc/cpu_supplement/v850.t
Normal file
104
doc/cpu_supplement/v850.t
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
@c
|
||||||
|
@c COPYRIGHT (c) 1988-2002.
|
||||||
|
@c On-Line Applications Research Corporation (OAR).
|
||||||
|
@c All rights reserved.
|
||||||
|
|
||||||
|
@ifinfo
|
||||||
|
@end ifinfo
|
||||||
|
@chapter V850 Specific Information
|
||||||
|
|
||||||
|
This chapter discusses the
|
||||||
|
@uref{http://en.wikipedia.org/wiki/V850,V850 architecture}
|
||||||
|
dependencies in this port of RTEMS. The V850 was originally manufactured
|
||||||
|
by NEC but is now part of the Renesas Electronics product line.
|
||||||
|
|
||||||
|
@subheading Architecture Documents
|
||||||
|
|
||||||
|
For information on the V850 architecture refer to the
|
||||||
|
@uref{http://am.renesas.com/products/mpumcu/v850/index.jsp,Renesas v850 product page}.
|
||||||
|
|
||||||
|
@section CPU Model Dependent Features
|
||||||
|
|
||||||
|
This section presents the set of features which vary across V850 implementations and are of importance to RTEMS. The set of CPU model feature macros are defined in the file @file{cpukit/score/cpu/v850/rtems/score/v850.h} based upon the particular CPU
|
||||||
|
model flags specified on the compilation command line.
|
||||||
|
|
||||||
|
@subsection CPU Model Name
|
||||||
|
|
||||||
|
The macro @code{CPU_MODEL_NAME} is a string which designates
|
||||||
|
the architectural level of this CPU model. See in
|
||||||
|
@file{cpukit/score/cpu/v850/rtems/score/v850.h} for the values.
|
||||||
|
|
||||||
|
@subsection Count Leading Zeroes Instruction
|
||||||
|
|
||||||
|
The V850v5 and later has the count leading zeroes @code{clz} instruction which
|
||||||
|
could be used to speed up the find first bit operation. The use of this
|
||||||
|
instruction should significantly speed up the scheduling associated with a
|
||||||
|
thread blocking. This is currently not used.
|
||||||
|
|
||||||
|
@subsection Floating Point Unit
|
||||||
|
|
||||||
|
A floating point unit is currently not supported.
|
||||||
|
|
||||||
|
@section Calling Conventions
|
||||||
|
|
||||||
|
Please refer to the
|
||||||
|
@uref{http://www.filibeto.org/unix/tru64/lib/ossc/doc/cygnus_doc-99r1/html/6_embed/embV850.html,
|
||||||
|
Procedure Call Standard for the V850 Architecture} or the GCC source
|
||||||
|
code for detailed information on the calling conventions.
|
||||||
|
|
||||||
|
@subsection Register Usage
|
||||||
|
|
||||||
|
Fixed registers are never available for register allocation in the
|
||||||
|
compiler. By default the following registers are fixed in GCC:
|
||||||
|
|
||||||
|
@itemize @bullet
|
||||||
|
@item r0 (zero)
|
||||||
|
@item r3 (sp)
|
||||||
|
@item r4 (gp)
|
||||||
|
@item r30 (ep)
|
||||||
|
@end itemize
|
||||||
|
|
||||||
|
@c r1 is mentioned as special purpose but I do not see a purpose
|
||||||
|
|
||||||
|
Caller saved registers can be used by the compiler to hold values that
|
||||||
|
do not live across function calls. The caller saved registers are r2,
|
||||||
|
r5 through r19, and r31.
|
||||||
|
|
||||||
|
Callee saved registers retain their value across function calls. The
|
||||||
|
callee saved registers are r20 through r29.
|
||||||
|
|
||||||
|
r6 through r9 are parameter registers while r10 and r11 are function return registers. r31 is the return pointer.
|
||||||
|
|
||||||
|
r29 is used as the frame pointer in some functions.
|
||||||
|
|
||||||
|
@section Memory Model
|
||||||
|
|
||||||
|
A flat 32-bit memory model is supported.
|
||||||
|
|
||||||
|
@section Interrupt Processing
|
||||||
|
|
||||||
|
The V850 architecture has ...
|
||||||
|
|
||||||
|
@subsection Interrupt Levels
|
||||||
|
|
||||||
|
The RTEMS interrupt level mapping scheme for the V850 is very simple. If
|
||||||
|
the requested interrupt level is 1, then interrupts are disabled in the
|
||||||
|
PSW register using the @code{di} instruction. If the requested interrupt
|
||||||
|
level is 0, then interrupts are enabled in the PSW register using the
|
||||||
|
@code{ei} instruction or restoring the previous value of the PSW register.
|
||||||
|
|
||||||
|
@subsection Interrupt Stack
|
||||||
|
|
||||||
|
The board support package must initialize the interrupt stack. The memory for
|
||||||
|
the stacks is usually reserved in the linker script.
|
||||||
|
|
||||||
|
@section Default Fatal Error Processing
|
||||||
|
|
||||||
|
The default fatal error handler for this architecture performs the
|
||||||
|
following actions:
|
||||||
|
|
||||||
|
@itemize @bullet
|
||||||
|
@item disables operating system supported interrupts (IRQ),
|
||||||
|
@item places the error code in @code{r10}, and
|
||||||
|
@item executes a halt processor instruction.
|
||||||
|
@end itemize
|
||||||
Reference in New Issue
Block a user