summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2017-03-24 08:02:28 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2017-08-10 09:36:30 +0200
commitf49a41d7802341d40f97dcbae02ff1b875477a67 (patch)
tree16a26d73306969aec4ec911e7c1739097d1902be
parentc070af754dca62adab27753ba80ca01d1bc4ce3e (diff)
bsp/xm_tms570: New BSPxtratum-4.11
-rw-r--r--c/src/lib/libbsp/arm/acinclude.m42
-rw-r--r--c/src/lib/libbsp/arm/shared/start/start.S38
-rw-r--r--c/src/lib/libbsp/arm/shared/startup/linkcmds.base4
-rw-r--r--c/src/lib/libbsp/arm/xm-tms570/Makefile.am126
-rw-r--r--c/src/lib/libbsp/arm/xm-tms570/bsp_specs17
-rw-r--r--c/src/lib/libbsp/arm/xm-tms570/clock/clock.c113
-rw-r--r--c/src/lib/libbsp/arm/xm-tms570/configure.ac34
-rw-r--r--c/src/lib/libbsp/arm/xm-tms570/include/bsp.h37
-rw-r--r--c/src/lib/libbsp/arm/xm-tms570/include/irq.h161
-rw-r--r--c/src/lib/libbsp/arm/xm-tms570/irq/irq.c57
-rw-r--r--c/src/lib/libbsp/arm/xm-tms570/make/custom/xm_tms570.cfg16
-rw-r--r--c/src/lib/libbsp/arm/xm-tms570/preinstall.am108
-rw-r--r--c/src/lib/libbsp/arm/xm-tms570/startup/bspreset.c25
-rw-r--r--c/src/lib/libbsp/arm/xm-tms570/startup/bspstart.c23
-rw-r--r--c/src/lib/libbsp/arm/xm-tms570/startup/bspstarthooks.c26
-rw-r--r--c/src/lib/libbsp/arm/xm-tms570/startup/cpucounterread.c62
-rw-r--r--c/src/lib/libbsp/arm/xm-tms570/startup/linkcmds5
-rw-r--r--c/src/lib/libbsp/arm/xm-tms570/startup/linkcmds.xm_tms57030
-rw-r--r--c/src/lib/libbsp/arm/xm-tms570/startup/xmhdr.c27
-rw-r--r--c/src/lib/libbsp/shared/include/fatal.h1
-rw-r--r--cpukit/score/cpu/arm/arm_exc_abort.S3
-rw-r--r--cpukit/score/cpu/arm/arm_exc_interrupt.S21
-rw-r--r--cpukit/score/cpu/arm/armv4-exception-default.S18
-rw-r--r--cpukit/score/cpu/arm/cpu.c9
-rw-r--r--cpukit/score/cpu/arm/rtems/score/arm.h2
-rw-r--r--cpukit/score/cpu/arm/rtems/score/cpu.h18
26 files changed, 982 insertions, 1 deletions
diff --git a/c/src/lib/libbsp/arm/acinclude.m4 b/c/src/lib/libbsp/arm/acinclude.m4
index 327650ee13..50a19e4a82 100644
--- a/c/src/lib/libbsp/arm/acinclude.m4
+++ b/c/src/lib/libbsp/arm/acinclude.m4
@@ -44,6 +44,8 @@ AC_DEFUN([RTEMS_CHECK_BSPDIR],
AC_CONFIG_SUBDIRS([tms570]);;
xilinx-zynq )
AC_CONFIG_SUBDIRS([xilinx-zynq]);;
+ xm-tms570 )
+ AC_CONFIG_SUBDIRS([xm-tms570]);;
*)
AC_MSG_ERROR([Invalid BSP]);;
esac
diff --git a/c/src/lib/libbsp/arm/shared/start/start.S b/c/src/lib/libbsp/arm/shared/start/start.S
index cb66d82483..7cd6cdb161 100644
--- a/c/src/lib/libbsp/arm/shared/start/start.S
+++ b/c/src/lib/libbsp/arm/shared/start/start.S
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2008-2014 embedded brains GmbH. All rights reserved.
+ * Copyright (c) 2008, 2017 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
* Obere Lagerstr. 30
@@ -13,6 +13,9 @@
* Germany
* <rtems@embedded-brains.de>
*
+ * Copyright 2016 Fent Innovative Software Solutions (FENTISS).
+ * All rights reserved.
+ *
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rtems.org/license/LICENSE.
@@ -26,6 +29,14 @@
#include <bsp/irq.h>
#include <bsp/linker-symbols.h>
+#ifdef RTEMS_PARAVIRT_XTRATUM
+#define MSR_OPCODE 5
+#define MRC_OPCODE 13
+#define XM_SI(si) udf si
+#else
+#define XM_SI(si)
+#endif
+
/* External symbols */
.extern bsp_reset
.extern boot_card
@@ -171,6 +182,10 @@ bsp_start_hyp_vector_table_end:
/* Start entry */
_start:
+#ifdef RTEMS_PARAVIRT_XTRATUM
+ ldr r1, =pctrl_addr
+ str r0, [r1]
+#endif
/*
* We do not save the context since we do not return to the boot
@@ -185,6 +200,7 @@ _start:
#ifdef RTEMS_SMP
/* Read MPIDR */
+ XM_SI(MRC_OPCODE)
mrc p15, 0, r0, c0, c0, 5
/* Calculate stack offset */
@@ -196,6 +212,7 @@ _start:
mrs r4, cpsr /* save original procesor status value */
#ifdef BSP_START_IN_HYP_SUPPORT
orr r0, r4, #(ARM_PSR_I | ARM_PSR_F)
+ XM_SI(MSR_OPCODE)
msr cpsr, r4
and r0, r4, #ARM_PSR_M_MASK
@@ -215,12 +232,14 @@ bsp_start_skip_hyp_svc_switch:
* Set SVC mode, disable interrupts and enable ARM instructions.
*/
mov r0, #(ARM_PSR_M_SVC | ARM_PSR_I | ARM_PSR_F)
+ XM_SI(MSR_OPCODE)
msr cpsr, r0
/* Initialize stack pointer registers for the various modes */
/* Enter IRQ mode and set up the IRQ stack pointer */
mov r0, #(ARM_PSR_M_IRQ | ARM_PSR_I | ARM_PSR_F)
+ XM_SI(MSR_OPCODE)
msr cpsr, r0
ldr sp, =bsp_stack_irq_end
#ifdef RTEMS_SMP
@@ -229,6 +248,7 @@ bsp_start_skip_hyp_svc_switch:
/* Enter FIQ mode and set up the FIQ stack pointer */
mov r0, #(ARM_PSR_M_FIQ | ARM_PSR_I | ARM_PSR_F)
+ XM_SI(MSR_OPCODE)
msr cpsr, r0
ldr sp, =bsp_stack_fiq_end
#ifdef RTEMS_SMP
@@ -241,6 +261,7 @@ bsp_start_skip_hyp_svc_switch:
/* Enter ABT mode and set up the ABT stack pointer */
mov r0, #(ARM_PSR_M_ABT | ARM_PSR_I | ARM_PSR_F)
+ XM_SI(MSR_OPCODE)
msr cpsr, r0
ldr sp, =bsp_stack_abt_end
#ifdef RTEMS_SMP
@@ -249,6 +270,7 @@ bsp_start_skip_hyp_svc_switch:
/* Enter UND mode and set up the UND stack pointer */
mov r0, #(ARM_PSR_M_UND | ARM_PSR_I | ARM_PSR_F)
+ XM_SI(MSR_OPCODE)
msr cpsr, r0
ldr sp, =bsp_stack_und_end
#ifdef RTEMS_SMP
@@ -257,6 +279,7 @@ bsp_start_skip_hyp_svc_switch:
/* Enter SVC mode and set up the SVC stack pointer */
mov r0, #(ARM_PSR_M_SVC | ARM_PSR_I | ARM_PSR_F)
+ XM_SI(MSR_OPCODE)
msr cpsr, r0
ldr sp, =bsp_stack_svc_end
#ifdef RTEMS_SMP
@@ -267,6 +290,7 @@ bsp_start_skip_hyp_svc_switch:
#ifdef ARM_MULTILIB_VFP
/* Read CPACR */
+ XM_SI(MRC_OPCODE)
mrc p15, 0, r0, c1, c0, 2
/* Enable CP10 and CP11 */
@@ -346,6 +370,12 @@ bsp_vector_table_copy_done:
/* Branch to start hook 1 */
bl bsp_start_hook_1
+#ifdef RTEMS_PARAVIRT_XTRATUM
+ ldr r1, =pctrl_addr
+ ldr r0, [r1]
+ blx init_libxm
+#endif
+
/* Branch to boot card */
mov r0, #0
bl boot_card
@@ -436,3 +466,9 @@ twiddle:
.set bsp_start_vector_table_size, bsp_start_vector_table_end - bsp_start_vector_table_begin
.set bsp_vector_table_size, bsp_start_vector_table_size
+
+#ifdef RTEMS_PARAVIRT_XTRATUM
+.align 4
+pctrl_addr:
+ .word 0
+#endif
diff --git a/c/src/lib/libbsp/arm/shared/startup/linkcmds.base b/c/src/lib/libbsp/arm/shared/startup/linkcmds.base
index da2316a82f..68832575c6 100644
--- a/c/src/lib/libbsp/arm/shared/startup/linkcmds.base
+++ b/c/src/lib/libbsp/arm/shared/startup/linkcmds.base
@@ -80,6 +80,10 @@ SECTIONS {
. = ALIGN (bsp_section_xbarrier_align);
} > REGION_VECTOR AT > REGION_VECTOR
+ .xmImageHdr : ALIGN_WITH_INPUT {
+ KEEP (*(.xmImageHdr))
+ } > REGION_TEXT AT > REGION_TEXT_LOAD
+
.text : ALIGN_WITH_INPUT {
bsp_section_text_begin = .;
*(.text.unlikely .text.*_unlikely)
diff --git a/c/src/lib/libbsp/arm/xm-tms570/Makefile.am b/c/src/lib/libbsp/arm/xm-tms570/Makefile.am
new file mode 100644
index 0000000000..75fb78d444
--- /dev/null
+++ b/c/src/lib/libbsp/arm/xm-tms570/Makefile.am
@@ -0,0 +1,126 @@
+##
+#
+# @file makefile.am
+#
+# @brief Makefile of LibBSP for the TMS570 boards.
+#
+
+ACLOCAL_AMFLAGS = -I ../../../../aclocal
+
+include $(top_srcdir)/../../../../automake/compile.am
+
+include_libcpudir = $(includedir)/libcpu
+include_bspdir = $(includedir)/bsp
+
+dist_project_lib_DATA = bsp_specs
+
+# ----------------------------
+# ------ Headers
+# ----------------------------
+
+include_HEADERS = include/bsp.h
+
+nodist_include_HEADERS = ../../shared/include/coverhd.h
+nodist_include_HEADERS += include/bspopts.h
+
+include_libcpu_HEADERS = ../../../libcpu/arm/shared/include/arm-cp15.h
+
+nodist_include_bsp_HEADERS = ../../shared/include/bootcard.h
+
+include_bsp_HEADERS =
+include_bsp_HEADERS += ../../shared/include/utility.h
+include_bsp_HEADERS += ../../shared/include/irq-generic.h
+include_bsp_HEADERS += ../../shared/include/irq-info.h
+include_bsp_HEADERS += ../../shared/include/stackalloc.h
+include_bsp_HEADERS += ../../shared/include/uart-output-char.h
+include_bsp_HEADERS += ../shared/include/start.h
+include_bsp_HEADERS += include/irq.h
+
+include_HEADERS += ../../shared/include/tm27.h
+
+# ----------------------------
+# ------ Data
+# ----------------------------
+
+noinst_LIBRARIES = libbspstart.a
+
+libbspstart_a_SOURCES = ../shared/start/start.S
+
+project_lib_DATA = start.$(OBJEXT)
+project_lib_DATA += startup/linkcmds
+project_lib_DATA += startup/linkcmds.xm_tms570
+
+# ----------------------------
+# ------ LibBSP
+# ----------------------------
+
+noinst_LIBRARIES += libbsp.a
+
+libbsp_a_SOURCES =
+libbsp_a_CPPFLAGS = -I${XM_PATH}/include --include xm_inc/config.h --include xm_inc/arch/arch_types.h
+libbsp_a_LIBADD =
+
+# Shared
+libbsp_a_SOURCES += ../../shared/bootcard.c
+libbsp_a_SOURCES += ../../shared/bspclean.c
+libbsp_a_SOURCES += ../../shared/bspgetworkarea.c
+libbsp_a_SOURCES += ../../shared/bsplibc.c
+libbsp_a_SOURCES += ../../shared/bsppost.c
+libbsp_a_SOURCES += ../../shared/bsppredriverhook.c
+libbsp_a_SOURCES += ../../shared/bsppretaskinghook.c
+libbsp_a_SOURCES += ../../shared/gnatinstallhandler.c
+libbsp_a_SOURCES += ../../shared/sbrk.c
+libbsp_a_SOURCES += ../../shared/src/stackalloc.c
+libbsp_a_SOURCES += ../../shared/cpucounterdiff.c
+
+# Startup
+libbsp_a_SOURCES += ../shared/startup/bsp-start-memcpy.S
+libbsp_a_SOURCES += ../shared/startup/bsp-start-init-registers.S
+libbsp_a_SOURCES += ../shared/arm-cp15-set-exception-handler.c
+libbsp_a_SOURCES += ../shared/arm-cp15-set-ttb-entries.c
+libbsp_a_SOURCES += startup/bspreset.c
+libbsp_a_SOURCES += startup/bspstart.c
+libbsp_a_SOURCES += startup/cpucounterread.c
+libbsp_a_SOURCES += startup/xmhdr.c
+
+# IRQ
+libbsp_a_SOURCES += ../../shared/src/irq-default-handler.c
+libbsp_a_SOURCES += ../../shared/src/irq-generic.c
+libbsp_a_SOURCES += ../../shared/src/irq-info.c
+libbsp_a_SOURCES += ../../shared/src/irq-legacy.c
+libbsp_a_SOURCES += ../../shared/src/irq-server.c
+libbsp_a_SOURCES += ../../shared/src/irq-shell.c
+libbsp_a_SOURCES += irq/irq.c
+
+# Console
+libbsp_a_SOURCES += ../../shared/console-termios.c
+libbsp_a_SOURCES += ../../shared/xm/console-xm.c
+libbsp_a_SOURCES += ../../shared/xm/printk-support-xm.c
+
+# Clock
+libbsp_a_SOURCES += ../../shared/clockdrv_shell.h
+libbsp_a_SOURCES += clock/clock.c
+
+# RTC
+
+# Benchmark Timer
+libbsp_a_SOURCES += ../../shared/timercpucounter.c
+
+# Watchdog
+
+# Cache
+libbsp_a_SOURCES += ../../../libcpu/shared/src/cache_manager.c
+libbsp_a_SOURCES += ../../../libcpu/arm/shared/include/cache_.h
+libbsp_a_CPPFLAGS += -I$(srcdir)/../../../libcpu/arm/shared/include
+
+# Start hooks
+libbsp_a_SOURCES += startup/bspstarthooks.c
+
+# ----------------------------
+# ------ Special Rules
+# ----------------------------
+
+DISTCLEANFILES = include/bspopts.h
+
+include $(srcdir)/preinstall.am
+include $(top_srcdir)/../../../../automake/local.am
diff --git a/c/src/lib/libbsp/arm/xm-tms570/bsp_specs b/c/src/lib/libbsp/arm/xm-tms570/bsp_specs
new file mode 100644
index 0000000000..16ec911aab
--- /dev/null
+++ b/c/src/lib/libbsp/arm/xm-tms570/bsp_specs
@@ -0,0 +1,17 @@
+%rename endfile old_endfile
+%rename startfile old_startfile
+%rename link old_link
+%rename lib old_lib
+
+*startfile:
+%{!qrtems: %(old_startfile)} \
+%{!nostdlib: %{qrtems: start.o%s crti.o%s crtbegin.o%s -e _start}}
+
+*link:
+%{!qrtems: %(old_link)} %{qrtems: -dc -dp -N -EB }
+
+*endfile:
+%{!qrtems: %(old_endfiles)} %{qrtems: crtend.o%s crtn.o%s }
+
+*lib:
+--start-group %(old_lib) -lxm --end-group \ No newline at end of file
diff --git a/c/src/lib/libbsp/arm/xm-tms570/clock/clock.c b/c/src/lib/libbsp/arm/xm-tms570/clock/clock.c
new file mode 100644
index 0000000000..379376b09d
--- /dev/null
+++ b/c/src/lib/libbsp/arm/xm-tms570/clock/clock.c
@@ -0,0 +1,113 @@
+/*
+ * @file clock.c
+ *
+ * @author Miguel Masmano <mmasmano@fentiss.com>
+ *
+ * @copyright
+ * Copyright 2016 Fent Innovative Software Solutions (FENTISS).
+ * All rights reserved.
+ *
+ * Copyright 2017 embedded brains GmbH.
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#include <rtems/timecounter.h>
+
+#include <bsp.h>
+#include <bsp/irq.h>
+#include <bsp/fatal.h>
+#include <xm.h>
+
+static struct timecounter xm_tms570_tc;
+
+static uint32_t xm_tms570_clock_last;
+
+static uint32_t xm_tms570_clock_get_time(void)
+{
+ xmTime_t now;
+ XM_get_time(XM_HW_CLOCK, &now);
+ return (uint32_t) now;
+}
+
+static uint32_t xm_tms570_clock_get_timecount(struct timecounter *tc)
+{
+ (void) tc;
+ return xm_tms570_clock_get_time();
+}
+
+static void xm_tms570_clock_initialize_hardware(void)
+{
+ xmTime_t now;
+ uint32_t us_per_tick;
+
+ XM_get_time(XM_HW_CLOCK, &now);
+ us_per_tick = rtems_configuration_get_microseconds_per_tick();
+ XM_set_timer(XM_HW_CLOCK, now + us_per_tick, us_per_tick);
+ xm_tms570_clock_last = (uint32_t) now;
+
+ xm_tms570_tc.tc_get_timecount = xm_tms570_clock_get_timecount;
+ xm_tms570_tc.tc_counter_mask = 0xffffffff;
+ xm_tms570_tc.tc_frequency = 1000000;
+ xm_tms570_tc.tc_quality = RTEMS_TIMECOUNTER_QUALITY_CLOCK_DRIVER;
+ rtems_timecounter_install(&xm_tms570_tc);
+}
+
+static void xm_tms570_clock_timecounter_tick(void)
+{
+ uint32_t us_per_tick;
+ uint32_t now;
+ uint32_t last;
+
+ now = xm_tms570_clock_get_time();
+ us_per_tick = rtems_configuration_get_microseconds_per_tick();
+ last = xm_tms570_clock_last;
+
+ while ((now - last) >= us_per_tick) {
+ rtems_timecounter_tick();
+ last += us_per_tick;
+ }
+
+ xm_tms570_clock_last = last;
+}
+
+static void xm_tms570_clock_shutdown_hardware(void)
+{
+ XM_set_irqmask(0, 1U << XM_VT_EXT_HW_TIMER);
+ XM_set_timer(XM_HW_CLOCK, 0, 0);
+}
+
+static void xm_tms570_clock_install_isr(rtems_interrupt_handler handler)
+{
+ rtems_status_code sc;
+
+ sc = rtems_interrupt_handler_install(
+ XM_TMS570_IRQ_HWTIMER,
+ "Clock",
+ RTEMS_INTERRUPT_UNIQUE,
+ handler,
+ NULL
+ );
+ if (sc != RTEMS_SUCCESSFUL) {
+ bsp_fatal(XM_BSP_FATAL_TMS570_CLOCK_IRQ_INSTALL);
+ }
+}
+
+#define Clock_driver_support_initialize_hardware \
+ xm_tms570_clock_initialize_hardware
+
+#define Clock_driver_timecounter_tick() \
+ xm_tms570_clock_timecounter_tick()
+
+#define Clock_driver_support_initialize_hardware \
+ xm_tms570_clock_initialize_hardware
+
+#define Clock_driver_support_shutdown_hardware \
+ xm_tms570_clock_shutdown_hardware
+
+#define Clock_driver_support_install_isr(clock_isr, old_isr) \
+ xm_tms570_clock_install_isr(clock_isr)
+
+#include "../../../shared/clockdrv_shell.h"
diff --git a/c/src/lib/libbsp/arm/xm-tms570/configure.ac b/c/src/lib/libbsp/arm/xm-tms570/configure.ac
new file mode 100644
index 0000000000..d894c63ec5
--- /dev/null
+++ b/c/src/lib/libbsp/arm/xm-tms570/configure.ac
@@ -0,0 +1,34 @@
+##
+#
+# @file configure.ac
+#
+# @brief Configure script of LibBSP for the XM-TMS570 board.
+#
+
+AC_PREREQ([2.69])
+AC_INIT([rtems-c-src-lib-libbsp-arm-xm-tms570],[_RTEMS_VERSION],
+ [https://devel.rtems.org/newticket])
+AC_CONFIG_SRCDIR([bsp_specs])
+RTEMS_TOP(../../../../../..)
+
+RTEMS_CANONICAL_TARGET_CPU
+AM_INIT_AUTOMAKE([no-define nostdinc foreign 1.12.2])
+RTEMS_BSP_CONFIGURE
+
+RTEMS_PROG_CC_FOR_TARGET
+RTEMS_CANONICALIZE_TOOLS
+RTEMS_PROG_CCAS
+
+RTEMS_CHECK_NETWORKING
+AM_CONDITIONAL(HAS_NETWORKING,test "$HAS_NETWORKING" = "no")
+
+RTEMS_BSPOPTS_SET([XM_TMS570_GCLK],[*],[240000000])
+RTEMS_BSPOPTS_HELP([XM_TMS570_GCLK],[the GCLK frequency in Hz])
+
+RTEMS_BSPOPTS_SET([XM_TMS570_USE_PMU_FOR_CPU_COUNTER],[*],[1])
+RTEMS_BSPOPTS_HELP([XM_TMS570_USE_PMU_FOR_CPU_COUNTER],[use the Performance Monitor Unit (PMU) for the CPU counter])
+
+RTEMS_BSP_CLEANUP_OPTIONS(0, 1)
+
+AC_CONFIG_FILES([Makefile])
+AC_OUTPUT
diff --git a/c/src/lib/libbsp/arm/xm-tms570/include/bsp.h b/c/src/lib/libbsp/arm/xm-tms570/include/bsp.h
new file mode 100644
index 0000000000..4066864f41
--- /dev/null
+++ b/c/src/lib/libbsp/arm/xm-tms570/include/bsp.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2017 embedded brains GmbH. All rights reserved.
+ *
+ * embedded brains GmbH
+ * Dornierstr. 4
+ * 82178 Puchheim
+ * Germany
+ * <rtems@embedded-brains.de>
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#ifndef LIBBSP_ARM_XM_TMS570_BSP_H
+#define LIBBSP_ARM_XM_TMS570_BSP_H
+
+#include <bspopts.h>
+
+#define BSP_FEATURE_IRQ_EXTENSION
+
+#include <bspopts.h>
+#include <bsp/default-initial-extension.h>
+
+#include <rtems.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+void xm_tms570_cpu_counter_initialize(void);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* LIBBSP_ARM_XM_TMS570_BSP_H */
diff --git a/c/src/lib/libbsp/arm/xm-tms570/include/irq.h b/c/src/lib/libbsp/arm/xm-tms570/include/irq.h
new file mode 100644
index 0000000000..8b35087af8
--- /dev/null
+++ b/c/src/lib/libbsp/arm/xm-tms570/include/irq.h
@@ -0,0 +1,161 @@
+/**
+ * @file irq.h
+ *
+ * @ingroup tms570
+ *
+ * @brief TMS570 interrupt definitions.
+ */
+
+/*
+ * Copyright (c) 2014 Premysl Houdek <kom541000@gmail.com>
+ *
+ * Google Summer of Code 2014 at
+ * Czech Technical University in Prague
+ * Zikova 1903/4
+ * 166 36 Praha 6
+ * Czech Republic
+ *
+ * Based on LPC24xx and LPC1768 BSP
+ * by embedded brains GmbH and others
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#ifndef LIBBSP_ARM_TMS570_IRQ_H
+#define LIBBSP_ARM_TMS570_IRQ_H
+
+#ifndef ASM
+#include <rtems.h>
+#include <rtems/irq.h>
+#include <rtems/irq-extension.h>
+#endif
+
+#define BSP_INTERRUPT_VECTOR_MIN 0U
+#define TMS570_IRQ_ESM_HIGH 0
+#define TMS570_IRQ_RESERVED 1
+#define TMS570_IRQ_TIMER_0 2
+#define TMS570_IRQ_TIMER_1 3
+#define TMS570_IRQ_TIMER_2 4
+#define TMS570_IRQ_TIMER_3 5
+#define TMS570_IRQ_RTI_OVERFLOW_0 6
+#define TMS570_IRQ_RTI_OVERFLOW_1 7
+#define TMS570_IRQ_RTI_TIMEBASE 8
+#define TMS570_IRQ_GIO_HIGH 9
+#define TMS570_IRQ_HET_HIGH 10
+#define TMS570_IRQ_HET_TU_HIGH 11
+#define TMS570_IRQ_MIBSPI1_HIGH 12
+#define TMS570_IRQ_SCI_LEVEL_0 13
+#define TMS570_IRQ_ADC1_EVENT 14
+#define TMS570_IRQ_ADC1_GROUP_1 15
+#define TMS570_IRQ_CAN1_HIGH 16
+#define TMS570_IRQ_RESERVED 17
+#define TMS570_IRQ_FLEXRAY_HIGH 18
+#define TMS570_IRQ_CRC_1 19
+#define TMS570_IRQ_ESM_LOW 20
+#define TMS570_IRQ_SSI 21
+#define TMS570_IRQ_PMU 22
+#define TMS570_IRQ_GIO_LOW 23
+#define TMS570_IRQ_HET_LOW 24
+#define TMS570_IRQ_HET_TU_LOW 25
+#define TMS570_IRQ_MIBSPI1_LOW 26
+#define TMS570_IRQ_SCI_LEVEL_1 27
+#define TMS570_IRQ_ADC1_GROUP_2 28
+#define TMS570_IRQ_CAN1_LOW 29
+#define TMS570_IRQ_RESERVED
+#define TMS570_IRQ_ADC1_MAG 31
+#define TMS570_IRQ_FLEXRAY_LOW 32
+#define TMS570_IRQ_DMA_FTCA 33
+#define TMS570_IRQ_DMA_LFSA 34
+#define TMS570_IRQ_CAN2_HIGH 35
+#define TMS570_IRQ_DMM_HIGH 36
+#define TMS570_IRQ_MIBSPI3_HIGH 37
+#define TMS570_IRQ_MIBSPI3_LOW 38
+#define TMS570_IRQ_DMA_HBCA 39
+#define TMS570_IRQ_DMA_BTCA 40
+#define TMS570_IRQ_DMA_BERA 41
+#define TMS570_IRQ_CAN2_LOW 42
+#define TMS570_IRQ_DMM_LOW 43
+#define TMS570_IRQ_CAN1_IF3 44
+#define TMS570_IRQ_CAN3_HIGH 45
+#define TMS570_IRQ_CAN2_IF3 46
+#define TMS570_IRQ_FPU 47
+#define TMS570_IRQ_FLEXRAY_TU 48
+#define TMS570_IRQ_SPI4_HIGH 49
+#define TMS570_IRQ_ADC2_EVENT 50
+#define TMS570_IRQ_ADC2_GROUP_1 51
+#define TMS570_IRQ_FLEXRAY_T0C 52
+#define TMS570_IRQ_MIBSPIP5_HIGH 53
+#define TMS570_IRQ_SPI4_LOW 54
+#define TMS570_IRQ_CAN3_LOW 55
+#define TMS570_IRQ_MIBSPIP5_LOW 56
+#define TMS570_IRQ_ADC2_GROUP_2 57
+#define TMS570_IRQ_FLEXRAY_TU_ERROR 58
+#define TMS570_IRQ_ADC2_MAG 59
+#define TMS570_IRQ_CAN3_IF3 60
+#define TMS570_IRQ_FSM_DONE 61
+#define TMS570_IRQ_FLEXRAY_T1C 62
+#define TMS570_IRQ_HET2_LEVEL_0 63
+#define TMS570_IRQ_SCI2_LEVEL_0 64
+#define TMS570_IRQ_HET_TU2_LEVEL_0 65
+#define TMS570_IRQ_IC2_INTERRUPT 66
+#define TMS570_IRQ_HET2_LEVEL_1 73
+#define TMS570_IRQ_SCI2_LEVEL_1 74
+#define TMS570_IRQ_HET_TU2_LEVEL_1 75
+#define TMS570_IRQ_EMAC_MISC 76
+#define TMS570_IRQ_EMAC_TX 77
+#define TMS570_IRQ_EMAC_THRESH 78
+#define TMS570_IRQ_EMAC_RX 79
+#define TMS570_IRQ_HWA_INT_REQ_H 80
+#define TMS570_IRQ_HWA_INT_REQ_H 81
+#define TMS570_IRQ_DCC_DONE_INTERRUPT 82
+#define TMS570_IRQ_DCC2_DONE_INTERRUPT 83
+#define TMS570_IRQ_HWAG1_INT_REQ_L 88
+#define TMS570_IRQ_HWAG2_INT_REQ_L 89
+#define XM_TMS570_IRQ_HWTIMER 96
+#define BSP_INTERRUPT_VECTOR_MAX (96+32)
+
+#define TMS570_IRQ_PRIORITY_VALUE_MIN 0U
+#define TMS570_IRQ_PRIORITY_VALUE_MAX 0U
+
+#define TMS570_IRQ_PRIORITY_COUNT ( TMS570_IRQ_PRIORITY_VALUE_MAX + 1U )
+#define TMS570_IRQ_PRIORITY_HIGHEST TMS570_IRQ_PRIORITY_VALUE_MIN
+#define TMS570_IRQ_PRIORITY_LOWEST TMS570_IRQ_PRIORITY_VALUE_MAX
+
+#ifndef ASM
+
+/**
+ * @brief Set priority of the interrupt vector.
+ *
+ * This function is here because of compability. It should set
+ * priority of the interrupt vector.
+ * @warning It does not set any priority at HW layer. It is nearly imposible to
+ * @warning set priority of the interrupt on TMS570 in a nice way.
+ * @param[in] vector vector of isr
+ * @param[in] priority new priority assigned to the vector
+ * @return Void
+ */
+void tms570_irq_set_priority(
+ rtems_vector_number vector,
+ unsigned priority
+);
+
+/**
+ * @brief Gets priority of the interrupt vector.
+ *
+ * This function is here because of compability. It returns priority
+ * of the isr vector last set by tms570_irq_set_priority function.
+ *
+ * @warning It does not return any real priority of the HW layer.
+ * @param[in] vector vector of isr
+ * @retval 0 vector is invalid.
+ * @retval priority priority of the interrupt
+ */
+unsigned tms570_irq_get_priority( rtems_vector_number vector );
+
+#endif /* ASM */
+
+/** @} */
+
+#endif /* LIBBSP_ARM_TMS570_IRQ_H */
diff --git a/c/src/lib/libbsp/arm/xm-tms570/irq/irq.c b/c/src/lib/libbsp/arm/xm-tms570/irq/irq.c
new file mode 100644
index 0000000000..3e2e74cb79
--- /dev/null
+++ b/c/src/lib/libbsp/arm/xm-tms570/irq/irq.c
@@ -0,0 +1,57 @@
+/*
+ * @file irq.c
+ *
+ * @author Miguel Masmano <mmasmano@fentiss.com>
+ *
+ * @copyright
+ * Copyright 2016 Fent Innovative Software Solutions (FENTISS).
+ * All rights reserved.
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#include <bsp/irq-generic.h>
+#include <bsp/irq.h>
+#include <xm.h>
+
+void bsp_interrupt_dispatch(void)
+{
+ rtems_vector_number vector =XM_params_get_PCT()->irqIndex;
+
+ bsp_interrupt_handler_dispatch(vector);
+}
+
+rtems_status_code bsp_interrupt_vector_enable(
+ rtems_vector_number vector
+)
+{
+ if ((vector >= 0) && (vector < 96)) {
+ XM_clear_irqmask(1<<vector, 0);
+ } else if ((vector>=96)&&(vector<(96+32))) {
+ XM_clear_irqmask(0, 1<<(vector-96));
+ } else {
+ return RTEMS_INVALID_ID;
+ }
+ return RTEMS_SUCCESSFUL;
+}
+
+rtems_status_code bsp_interrupt_vector_disable(
+ rtems_vector_number vector
+)
+{
+ if ((vector >= 0) && (vector < 96)) {
+ XM_set_irqmask(1<<vector, 0);
+ } else if ((vector>=96)&&(vector<(96+32))) {
+ XM_set_irqmask(0, 1<<(vector-96));
+ } else {
+ return RTEMS_INVALID_ID;
+ }
+ return RTEMS_SUCCESSFUL;
+}
+
+rtems_status_code bsp_interrupt_facility_initialize(void)
+{
+ XM_set_irqmask(~0, ~0);
+ return RTEMS_SUCCESSFUL;
+}
diff --git a/c/src/lib/libbsp/arm/xm-tms570/make/custom/xm_tms570.cfg b/c/src/lib/libbsp/arm/xm-tms570/make/custom/xm_tms570.cfg
new file mode 100644
index 0000000000..9f95a4f59d
--- /dev/null
+++ b/c/src/lib/libbsp/arm/xm-tms570/make/custom/xm_tms570.cfg
@@ -0,0 +1,16 @@
+#
+# Config file for TMS570LS3137 board.
+#
+
+include $(RTEMS_ROOT)/make/custom/default.cfg
+
+RTEMS_CPU = arm
+
+CPU_CFLAGS = -march=armv7-r -mtune=cortex-r5 -mbig-endian -mthumb \
+ -mfpu=vfpv3-d16 -mfloat-abi=hard -mtp=soft -fno-short-enums -fno-common
+
+CFLAGS_OPTIMIZE_V = -O2 -g
+CFLAGS_OPTIMIZE_V += -ffunction-sections -fdata-sections
+
+LDFLAGS = -Wl,--gc-sections
+LDFLAGS += -L$(XM_PATH)/lib -lxm
diff --git a/c/src/lib/libbsp/arm/xm-tms570/preinstall.am b/c/src/lib/libbsp/arm/xm-tms570/preinstall.am
new file mode 100644
index 0000000000..802928c6de
--- /dev/null
+++ b/c/src/lib/libbsp/arm/xm-tms570/preinstall.am
@@ -0,0 +1,108 @@
+## 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)
+
+all-local: $(TMPINSTALL_FILES)
+
+TMPINSTALL_FILES =
+CLEANFILES += $(TMPINSTALL_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)/libcpu/$(dirstamp):
+ @$(MKDIR_P) $(PROJECT_INCLUDE)/libcpu
+ @: > $(PROJECT_INCLUDE)/libcpu/$(dirstamp)
+PREINSTALL_DIRS += $(PROJECT_INCLUDE)/libcpu/$(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)/coverhd.h: ../../shared/include/coverhd.h $(PROJECT_INCLUDE)/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/coverhd.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/coverhd.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)/libcpu/arm-cp15.h: ../../../libcpu/arm/shared/include/arm-cp15.h $(PROJECT_INCLUDE)/libcpu/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/libcpu/arm-cp15.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/libcpu/arm-cp15.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)/bsp/utility.h: ../../shared/include/utility.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/utility.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/utility.h
+
+$(PROJECT_INCLUDE)/bsp/irq-generic.h: ../../shared/include/irq-generic.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/irq-generic.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/irq-generic.h
+
+$(PROJECT_INCLUDE)/bsp/irq-info.h: ../../shared/include/irq-info.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/irq-info.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/irq-info.h
+
+$(PROJECT_INCLUDE)/bsp/stackalloc.h: ../../shared/include/stackalloc.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/stackalloc.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/stackalloc.h
+
+$(PROJECT_INCLUDE)/bsp/uart-output-char.h: ../../shared/include/uart-output-char.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/uart-output-char.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/uart-output-char.h
+
+$(PROJECT_INCLUDE)/bsp/start.h: ../shared/include/start.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/start.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/start.h
+
+$(PROJECT_INCLUDE)/bsp/irq.h: include/irq.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/irq.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/irq.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_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
+TMPINSTALL_FILES += $(PROJECT_LIB)/linkcmds
+
+$(PROJECT_LIB)/linkcmds.xm_tms570: startup/linkcmds.xm_tms570 $(PROJECT_LIB)/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds.xm_tms570
+TMPINSTALL_FILES += $(PROJECT_LIB)/linkcmds.xm_tms570
+
diff --git a/c/src/lib/libbsp/arm/xm-tms570/startup/bspreset.c b/c/src/lib/libbsp/arm/xm-tms570/startup/bspreset.c
new file mode 100644
index 0000000000..454ba8e225
--- /dev/null
+++ b/c/src/lib/libbsp/arm/xm-tms570/startup/bspreset.c
@@ -0,0 +1,25 @@
+/*
+ * @file bspreset.c
+ *
+ * @author Miguel Masmano <mmasmano@fentiss.com>
+ *
+ * @copyright
+ * Copyright 2016 Fent Innovative Software Solutions (FENTISS).
+ * All rights reserved.
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#include <bsp.h>
+#include <bsp/bootcard.h>
+#include <bsp/start.h>
+
+#include <xm.h>
+
+void bsp_reset(void)
+{
+ /* A reset cannot be directly done since the
+ partition's code is not restored by the bootloader */
+ XM_halt_partition(XM_PARTITION_SELF);
+}
diff --git a/c/src/lib/libbsp/arm/xm-tms570/startup/bspstart.c b/c/src/lib/libbsp/arm/xm-tms570/startup/bspstart.c
new file mode 100644
index 0000000000..8da456aab9
--- /dev/null
+++ b/c/src/lib/libbsp/arm/xm-tms570/startup/bspstart.c
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2017 embedded brains GmbH. All rights reserved.
+ *
+ * embedded brains GmbH
+ * Dornierstr. 4
+ * 82178 Puchheim
+ * Germany
+ * <rtems@embedded-brains.de>
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#include <bsp.h>
+#include <bsp/bootcard.h>
+#include <bsp/irq-generic.h>
+
+void bsp_start(void)
+{
+ bsp_interrupt_initialize();
+ xm_tms570_cpu_counter_initialize();
+}
diff --git a/c/src/lib/libbsp/arm/xm-tms570/startup/bspstarthooks.c b/c/src/lib/libbsp/arm/xm-tms570/startup/bspstarthooks.c
new file mode 100644
index 0000000000..cf9c190f28
--- /dev/null
+++ b/c/src/lib/libbsp/arm/xm-tms570/startup/bspstarthooks.c
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2017 embedded brains GmbH. All rights reserved.
+ *
+ * embedded brains GmbH
+ * Dornierstr. 4
+ * 82178 Puchheim
+ * Germany
+ * <rtems@embedded-brains.de>
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#include <bsp/start.h>
+
+BSP_START_TEXT_SECTION void bsp_start_hook_0(void)
+{
+ /* Nothing to do */
+}
+
+BSP_START_TEXT_SECTION void bsp_start_hook_1(void)
+{
+ bsp_start_copy_sections();
+ bsp_start_clear_bss();
+}
diff --git a/c/src/lib/libbsp/arm/xm-tms570/startup/cpucounterread.c b/c/src/lib/libbsp/arm/xm-tms570/startup/cpucounterread.c
new file mode 100644
index 0000000000..4549dae882
--- /dev/null
+++ b/c/src/lib/libbsp/arm/xm-tms570/startup/cpucounterread.c
@@ -0,0 +1,62 @@
+/*
+ * @file cpucounterread.c
+ *
+ * @author Miguel Masmano <mmasmano@fentiss.com>
+ *
+ * @copyright
+ * Copyright 2016 Fent Innovative Software Solutions (FENTISS).
+ * All rights reserved.
+ *
+ * Copyright 2017 embedded brains GmbH.
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#include <rtems/counter.h>
+
+#include <libcpu/arm-cp15.h>
+
+#include <bsp.h>
+#include <xm.h>
+
+#ifdef XM_TMS570_USE_PMU_FOR_CPU_COUNTER
+/* PMCCNTR */
+ARM_CP15_TEXT_SECTION static inline uint32_t
+arm_cp15_get_performance_monitors_cycle_count(void)
+{
+ ARM_SWITCH_REGISTERS;
+ uint32_t val;
+
+ __asm__ volatile (
+ ARM_SWITCH_TO_ARM
+ "mrc p15, 0, %[val], c9, c13, 0\n"
+ ARM_SWITCH_BACK
+ : [val] "=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
+ );
+
+ return val;
+}
+#endif
+
+CPU_Counter_ticks _CPU_Counter_read(void)
+{
+#ifdef XM_TMS570_USE_PMU_FOR_CPU_COUNTER
+ return arm_cp15_get_performance_monitors_cycle_count();
+#else
+ xmTime_t cTime;
+ XM_get_time(XM_HW_CLOCK, &cTime);
+
+ return (CPU_Counter_ticks)cTime;
+#endif
+}
+
+void xm_tms570_cpu_counter_initialize(void)
+{
+#ifdef XM_TMS570_USE_PMU_FOR_CPU_COUNTER
+ rtems_counter_initialize_converter(XM_TMS570_GCLK);
+#else
+ rtems_counter_initialize_converter(1000000);
+#endif
+}
diff --git a/c/src/lib/libbsp/arm/xm-tms570/startup/linkcmds b/c/src/lib/libbsp/arm/xm-tms570/startup/linkcmds
new file mode 100644
index 0000000000..7cfdcef7a3
--- /dev/null
+++ b/c/src/lib/libbsp/arm/xm-tms570/startup/linkcmds
@@ -0,0 +1,5 @@
+MEMORY {
+ PARTITION_AREA : ORIGIN = 0x80200000, LENGTH = 6M
+}
+
+INCLUDE linkcmds.xm_tms570
diff --git a/c/src/lib/libbsp/arm/xm-tms570/startup/linkcmds.xm_tms570 b/c/src/lib/libbsp/arm/xm-tms570/startup/linkcmds.xm_tms570
new file mode 100644
index 0000000000..e14467ccff
--- /dev/null
+++ b/c/src/lib/libbsp/arm/xm-tms570/startup/linkcmds.xm_tms570
@@ -0,0 +1,30 @@
+REGION_ALIAS ("REGION_START", PARTITION_AREA);
+REGION_ALIAS ("REGION_VECTOR", PARTITION_AREA);
+REGION_ALIAS ("REGION_TEXT", PARTITION_AREA);
+REGION_ALIAS ("REGION_TEXT_LOAD", PARTITION_AREA);
+REGION_ALIAS ("REGION_RODATA", PARTITION_AREA);
+REGION_ALIAS ("REGION_RODATA_LOAD", PARTITION_AREA);
+REGION_ALIAS ("REGION_DATA", PARTITION_AREA);
+REGION_ALIAS ("REGION_DATA_LOAD", PARTITION_AREA);
+REGION_ALIAS ("REGION_FAST_TEXT", PARTITION_AREA);
+REGION_ALIAS ("REGION_FAST_TEXT_LOAD", PARTITION_AREA);
+REGION_ALIAS ("REGION_FAST_DATA", PARTITION_AREA);
+REGION_ALIAS ("REGION_FAST_DATA_LOAD", PARTITION_AREA);
+REGION_ALIAS ("REGION_BSS", PARTITION_AREA);
+REGION_ALIAS ("REGION_WORK", PARTITION_AREA);
+REGION_ALIAS ("REGION_STACK", PARTITION_AREA);
+REGION_ALIAS ("REGION_NOCACHE", PARTITION_AREA);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", PARTITION_AREA);
+
+bsp_stack_main_size = DEFINED (bsp_stack_main_size) ? bsp_stack_main_size : 1024;
+bsp_stack_main_size = ALIGN (bsp_stack_main_size, bsp_stack_align);
+
+/*
+ * This is an ugly hack to make the xmImageHdr placement a bit more resilient
+ * to start section size changes.
+ */
+bsp_section_xbarrier_align = DEFINED (bsp_section_xbarrier_align) ? bsp_section_xbarrier_align : 256;
+
+EXTERN(xmImageHdr)
+
+INCLUDE linkcmds.armv4
diff --git a/c/src/lib/libbsp/arm/xm-tms570/startup/xmhdr.c b/c/src/lib/libbsp/arm/xm-tms570/startup/xmhdr.c
new file mode 100644
index 0000000000..20e5abfb09
--- /dev/null
+++ b/c/src/lib/libbsp/arm/xm-tms570/startup/xmhdr.c
@@ -0,0 +1,27 @@
+/*
+ * @file xmhdr.c
+ *
+ * @author Miguel Masmano <mmasmano@fentiss.com>
+ *
+ * @copyright
+ * Copyright 2016 Fent Innovative Software Solutions (FENTISS).
+ * All rights reserved.
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#include <xm.h>
+
+/*
+ This header must be included within the partition
+ in order to be loaded by XtratuM
+*/
+
+struct xmImageHdr xmImageHdr __XMIHDR = {
+ .sSignature=XMEF_PARTITION_MAGIC,
+ .compilationXmAbiVersion=XM_SET_VERSION(XM_ABI_VERSION, XM_ABI_SUBVERSION, XM_ABI_REVISION),
+ .compilationXmApiVersion=XM_SET_VERSION(XM_API_VERSION, XM_API_SUBVERSION, XM_API_REVISION),
+ .noCustomFiles=0,
+ .eSignature=XMEF_PARTITION_MAGIC,
+};
diff --git a/c/src/lib/libbsp/shared/include/fatal.h b/c/src/lib/libbsp/shared/include/fatal.h
index 81df3bc1be..b4ad252828 100644
--- a/c/src/lib/libbsp/shared/include/fatal.h
+++ b/c/src/lib/libbsp/shared/include/fatal.h
@@ -43,6 +43,7 @@ typedef enum {
/* XtratuM fatal codes */
XM_BSP_FATAL_CONSOLE_DEVICE_INSTALL_XM = BSP_FATAL_CODE_BLOCK(7949),
+ XM_BSP_FATAL_TMS570_CLOCK_IRQ_INSTALL,
/* ARM fatal codes */
BSP_ARM_A9MPCORE_FATAL_CLOCK_IRQ_INSTALL = BSP_FATAL_CODE_BLOCK(1),
diff --git a/cpukit/score/cpu/arm/arm_exc_abort.S b/cpukit/score/cpu/arm/arm_exc_abort.S
index 0f5d414c42..45c86a042f 100644
--- a/cpukit/score/cpu/arm/arm_exc_abort.S
+++ b/cpukit/score/cpu/arm/arm_exc_abort.S
@@ -129,6 +129,9 @@ save_more_context:
add sp, #20
/* Return from interrupt */
+#ifdef RTEMS_PARAVIRT_XTRATUM
+ udf #10
+#endif
subs pc, lr, #8
#ifdef __thumb__
diff --git a/cpukit/score/cpu/arm/arm_exc_interrupt.S b/cpukit/score/cpu/arm/arm_exc_interrupt.S
index fcb1510b95..2a3a3723bd 100644
--- a/cpukit/score/cpu/arm/arm_exc_interrupt.S
+++ b/cpukit/score/cpu/arm/arm_exc_interrupt.S
@@ -57,12 +57,21 @@ _ARMV4_Exception_interrupt:
/* Set exchange registers */
mov EXCHANGE_LR, lr
+#ifdef RTEMS_PARAVIRT_XTRATUM
+ udf #4
+#endif
mrs EXCHANGE_SPSR, SPSR
+#ifdef RTEMS_PARAVIRT_XTRATUM
+ udf #4
+#endif
mrs EXCHANGE_CPSR, CPSR
sub EXCHANGE_INT_SP, sp, #EXCHANGE_SIZE
/* Switch to SVC mode */
orr EXCHANGE_CPSR, EXCHANGE_CPSR, #0x1
+#ifdef RTEMS_PARAVIRT_XTRATUM
+ udf #5
+#endif
msr CPSR_c, EXCHANGE_CPSR
/*
@@ -190,10 +199,16 @@ thread_dispatch_done:
add sp, #CONTEXT_SIZE
/* Get INT mode program status register */
+#ifdef RTEMS_PARAVIRT_XTRATUM
+ udf #4
+#endif
mrs r1, CPSR
bic r1, r1, #0x1
/* Switch to INT mode */
+#ifdef RTEMS_PARAVIRT_XTRATUM
+ udf #5
+#endif
msr CPSR_c, r1
/* Save EXCHANGE_LR and EXCHANGE_SPSR registers to exchange area */
@@ -204,6 +219,9 @@ thread_dispatch_done:
/* Set return address and program status */
mov lr, EXCHANGE_LR
+#ifdef RTEMS_PARAVIRT_XTRATUM
+ udf #5
+#endif
msr SPSR_fsxc, EXCHANGE_SPSR
/* Restore EXCHANGE_LR and EXCHANGE_SPSR registers from exchange area */
@@ -237,6 +255,9 @@ thread_dispatch_done:
#endif
/* Return from interrupt */
+#ifdef RTEMS_PARAVIRT_XTRATUM
+ udf #10
+#endif
subs pc, lr, #4
#endif /* ARM_MULTILIB_ARCH_V4 */
diff --git a/cpukit/score/cpu/arm/armv4-exception-default.S b/cpukit/score/cpu/arm/armv4-exception-default.S
index a10de301b0..763913b09e 100644
--- a/cpukit/score/cpu/arm/armv4-exception-default.S
+++ b/cpukit/score/cpu/arm/armv4-exception-default.S
@@ -103,21 +103,39 @@ _ARMV4_Exception_fiq_default:
* Don't enable FIQs yet. Set the FIQ disable bit in the SPSR
* (which we'll load into the CPSR in save_more_context).
*/
+#ifdef RTEMS_PARAVIRT_XTRATUM
+ udf #4
+#endif
mrs r2, spsr
orr r2, #ARM_PSR_F
+#ifdef RTEMS_PARAVIRT_XTRATUM
+ udf #5
+#endif
msr spsr_c, r2
save_more_context:
/* Save more context */
mov r2, lr
+#ifdef RTEMS_PARAVIRT_XTRATUM
+ udf #4
+#endif
mrs r3, spsr
+#ifdef RTEMS_PARAVIRT_XTRATUM
+ udf #4
+#endif
mrs r7, cpsr
orr r5, r3, #ARM_PSR_I
bic r5, #ARM_PSR_T
+#ifdef RTEMS_PARAVIRT_XTRATUM
+ udf #5
+#endif
msr cpsr, r5
mov r0, sp
mov r1, lr
+#ifdef RTEMS_PARAVIRT_XTRATUM
+ udf #5
+#endif
msr cpsr, r7
mov r5, #0
add r6, sp, #ARM_EXCEPTION_FRAME_REGISTER_SP_OFFSET
diff --git a/cpukit/score/cpu/arm/cpu.c b/cpukit/score/cpu/arm/cpu.c
index ddfc37d243..42c9eacfff 100644
--- a/cpukit/score/cpu/arm/cpu.c
+++ b/cpukit/score/cpu/arm/cpu.c
@@ -127,9 +127,15 @@ void _CPU_ISR_Set_level( uint32_t level )
__asm__ volatile (
ARM_SWITCH_TO_ARM
+#ifdef RTEMS_PARAVIRT_XTRATUM
+ "udf #4\n"
+#endif
"mrs %[arm_switch_reg], cpsr\n"
"bic %[arm_switch_reg], #" _CPU_ISR_LEVEL_STRINGOF( ARM_PSR_I ) "\n"
"orr %[arm_switch_reg], %[level]\n"
+#ifdef RTEMS_PARAVIRT_XTRATUM
+ "udf #5\n"
+#endif
"msr cpsr, %0\n"
ARM_SWITCH_BACK
: [arm_switch_reg] "=&r" (arm_switch_reg)
@@ -144,6 +150,9 @@ uint32_t _CPU_ISR_Get_level( void )
__asm__ volatile (
ARM_SWITCH_TO_ARM
+#ifdef RTEMS_PARAVIRT_XTRATUM
+ "udf #4\n"
+#endif
"mrs %[level], cpsr\n"
"and %[level], #" _CPU_ISR_LEVEL_STRINGOF( ARM_PSR_I ) "\n"
ARM_SWITCH_BACK
diff --git a/cpukit/score/cpu/arm/rtems/score/arm.h b/cpukit/score/cpu/arm/rtems/score/arm.h
index af32fc3150..9e953358e7 100644
--- a/cpukit/score/cpu/arm/rtems/score/arm.h
+++ b/cpukit/score/cpu/arm/rtems/score/arm.h
@@ -48,10 +48,12 @@ extern "C" {
#define ARM_MULTILIB_HAS_BARRIER_INSTRUCTIONS
#endif
+#ifndef RTEMS_PARAVIRT_XTRATUM
#if defined(__ARM_ARCH_7A__) \
|| defined(__ARM_ARCH_7R__)
#define ARM_MULTILIB_HAS_THREAD_ID_REGISTER
#endif
+#endif
#if defined(__ARM_ARCH_7A__)
#define ARM_MULTILIB_CACHE_LINE_MAX_64
diff --git a/cpukit/score/cpu/arm/rtems/score/cpu.h b/cpukit/score/cpu/arm/rtems/score/cpu.h
index 69838c5bf8..67d6b16c6d 100644
--- a/cpukit/score/cpu/arm/rtems/score/cpu.h
+++ b/cpukit/score/cpu/arm/rtems/score/cpu.h
@@ -333,8 +333,14 @@ static inline uint32_t arm_interrupt_disable( void )
__asm__ volatile (
ARM_SWITCH_TO_ARM
+#ifdef RTEMS_PARAVIRT_XTRATUM
+ "udf #4\n"
+#endif
"mrs %[level], cpsr\n"
"orr %[arm_switch_reg], %[level], #0x80\n"
+#ifdef RTEMS_PARAVIRT_XTRATUM
+ "udf #5\n"
+#endif
"msr cpsr, %[arm_switch_reg]\n"
ARM_SWITCH_BACK
: [arm_switch_reg] "=&r" (arm_switch_reg), [level] "=&r" (level)
@@ -362,6 +368,9 @@ static inline void arm_interrupt_enable( uint32_t level )
__asm__ volatile (
ARM_SWITCH_TO_ARM
+#ifdef RTEMS_PARAVIRT_XTRATUM
+ "udf #5\n"
+#endif
"msr cpsr, %[level]\n"
ARM_SWITCH_BACK
: ARM_SWITCH_OUTPUT
@@ -383,8 +392,17 @@ static inline void arm_interrupt_flash( uint32_t level )
__asm__ volatile (
ARM_SWITCH_TO_ARM
+#ifdef RTEMS_PARAVIRT_XTRATUM
+ "udf #4\n"
+#endif
"mrs %[arm_switch_reg], cpsr\n"
+#ifdef RTEMS_PARAVIRT_XTRATUM
+ "udf #5\n"
+#endif
"msr cpsr, %[level]\n"
+#ifdef RTEMS_PARAVIRT_XTRATUM
+ "udf #5\n"
+#endif
"msr cpsr, %[arm_switch_reg]\n"
ARM_SWITCH_BACK
: [arm_switch_reg] "=&r" (arm_switch_reg)