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:
Joel Sherrill
2012-06-11 13:37:29 -05:00
parent 9da42fb87a
commit 2d7ae960bb
40 changed files with 2839 additions and 3 deletions

View File

@@ -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
])

View 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

View 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
])

View 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

View 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

View 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.

View 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)}

View 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

View 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;

View 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

View 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

View 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

View File

@@ -0,0 +1,7 @@
#
# Base Config file for the v850 GDB Simulator as v850e1
#
CPU_CFLAGS = -mv850e1
include $(RTEMS_ROOT)/make/custom/v850sim.inc

View File

@@ -0,0 +1,7 @@
#
# Base Config file for the v850 GDB Simulator as v850e2
#
CPU_CFLAGS = -mv850e2
include $(RTEMS_ROOT)/make/custom/v850sim.inc

View File

@@ -0,0 +1,7 @@
#
# Base Config file for the v850 GDB Simulator as v850e2v3
#
CPU_CFLAGS = -mv850e2v3
include $(RTEMS_ROOT)/make/custom/v850sim.inc

View File

@@ -0,0 +1,7 @@
#
# Base Config file for the v850 GDB Simulator as v850e
#
CPU_CFLAGS = -mv850e
include $(RTEMS_ROOT)/make/custom/v850sim.inc

View File

@@ -0,0 +1,7 @@
#
# Base Config file for the v850 GDB Simulator as v850es
#
CPU_CFLAGS = -mv850es
include $(RTEMS_ROOT)/make/custom/v850sim.inc

View 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

View 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

View 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

View 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

View 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);
}

View 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)
}
*/
}

View 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]

View 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

View 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) ();
}
}

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View 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

View 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
}

View 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

View 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

View 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

File diff suppressed because it is too large Load Diff

View 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 */

View 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

View 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 */

View File

@@ -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
View 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