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([sparc],[$1]);;
|
||||
_RTEMS_CPU_SUBDIR([sparc64],[$1]);;
|
||||
_RTEMS_CPU_SUBDIR([v850],[$1]);;
|
||||
*) AC_MSG_ERROR([Invalid RTEMS_CPU <[$]{RTEMS_CPU}>])
|
||||
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/sparc/Makefile
|
||||
score/cpu/sparc64/Makefile
|
||||
score/cpu/v850/Makefile
|
||||
score/cpu/no_cpu/Makefile
|
||||
posix/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(__BFIN__) || \
|
||||
defined(__m32c__) || \
|
||||
defined(__M32R__)
|
||||
defined(__M32R__) || \
|
||||
defined(__v850)
|
||||
|
||||
#include <rtems/endian.h>
|
||||
#if !defined(IEEEFP)
|
||||
|
||||
@@ -17,6 +17,7 @@ DIST_SUBDIRS += powerpc
|
||||
DIST_SUBDIRS += sh
|
||||
DIST_SUBDIRS += sparc
|
||||
DIST_SUBDIRS += sparc64
|
||||
DIST_SUBDIRS += v850
|
||||
|
||||
include $(top_srcdir)/automake/subdirs.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).
|
||||
# All rights reserved.
|
||||
|
||||
@@ -11,7 +11,7 @@ include $(top_srcdir)/main.am
|
||||
REPLACE2 = $(PERL) $(top_srcdir)/tools/word-replace2
|
||||
|
||||
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
|
||||
|
||||
@@ -84,6 +84,11 @@ sparc64.texi: sparc64.t
|
||||
-u "Top" \
|
||||
-n "" < $< > $@
|
||||
|
||||
v850.texi: v850.t
|
||||
$(BMENU2) -p "" \
|
||||
-u "Top" \
|
||||
-n "" < $< > $@
|
||||
|
||||
CLEANFILES += cpu_supplement.info
|
||||
CLEANFILES += cpu_supplement.info-1
|
||||
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