From 83098dc18907145e3275339aaf26f9c4f6c85c39 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Fri, 24 Mar 2017 08:02:28 +0100 Subject: bsp/xm_tms570: New BSP --- c/src/lib/libbsp/arm/acinclude.m4 | 2 + c/src/lib/libbsp/arm/shared/start/start.S | 38 ++++- c/src/lib/libbsp/arm/shared/startup/linkcmds.base | 4 + c/src/lib/libbsp/arm/xm-tms570/Makefile.am | 123 ++++++++++++++++ c/src/lib/libbsp/arm/xm-tms570/bsp_specs | 17 +++ c/src/lib/libbsp/arm/xm-tms570/clock/clock.c | 113 +++++++++++++++ c/src/lib/libbsp/arm/xm-tms570/configure.ac | 34 +++++ c/src/lib/libbsp/arm/xm-tms570/include/bsp.h | 27 ++++ c/src/lib/libbsp/arm/xm-tms570/include/irq.h | 161 +++++++++++++++++++++ c/src/lib/libbsp/arm/xm-tms570/irq/irq.c | 52 +++++++ .../libbsp/arm/xm-tms570/make/custom/xm_tms570.cfg | 16 ++ c/src/lib/libbsp/arm/xm-tms570/preinstall.am | 108 ++++++++++++++ c/src/lib/libbsp/arm/xm-tms570/startup/bspreset.c | 25 ++++ c/src/lib/libbsp/arm/xm-tms570/startup/bspstart.c | 21 +++ .../libbsp/arm/xm-tms570/startup/bspstarthooks.c | 26 ++++ .../libbsp/arm/xm-tms570/startup/cpucounterread.c | 50 +++++++ c/src/lib/libbsp/arm/xm-tms570/startup/linkcmds | 5 + .../arm/xm-tms570/startup/linkcmds.xm_tms570 | 30 ++++ c/src/lib/libbsp/arm/xm-tms570/startup/xmhdr.c | 27 ++++ c/src/lib/libbsp/shared/include/fatal.h | 1 + cpukit/score/cpu/arm/arm_exc_abort.S | 3 + cpukit/score/cpu/arm/arm_exc_interrupt.S | 30 ++++ cpukit/score/cpu/arm/armv4-exception-default.S | 18 +++ cpukit/score/cpu/arm/cpu.c | 9 ++ cpukit/score/cpu/arm/rtems/score/arm.h | 2 + cpukit/score/cpu/arm/rtems/score/cpu.h | 18 +++ 26 files changed, 959 insertions(+), 1 deletion(-) create mode 100644 c/src/lib/libbsp/arm/xm-tms570/Makefile.am create mode 100644 c/src/lib/libbsp/arm/xm-tms570/bsp_specs create mode 100644 c/src/lib/libbsp/arm/xm-tms570/clock/clock.c create mode 100644 c/src/lib/libbsp/arm/xm-tms570/configure.ac create mode 100644 c/src/lib/libbsp/arm/xm-tms570/include/bsp.h create mode 100644 c/src/lib/libbsp/arm/xm-tms570/include/irq.h create mode 100644 c/src/lib/libbsp/arm/xm-tms570/irq/irq.c create mode 100644 c/src/lib/libbsp/arm/xm-tms570/make/custom/xm_tms570.cfg create mode 100644 c/src/lib/libbsp/arm/xm-tms570/preinstall.am create mode 100644 c/src/lib/libbsp/arm/xm-tms570/startup/bspreset.c create mode 100644 c/src/lib/libbsp/arm/xm-tms570/startup/bspstart.c create mode 100644 c/src/lib/libbsp/arm/xm-tms570/startup/bspstarthooks.c create mode 100644 c/src/lib/libbsp/arm/xm-tms570/startup/cpucounterread.c create mode 100644 c/src/lib/libbsp/arm/xm-tms570/startup/linkcmds create mode 100644 c/src/lib/libbsp/arm/xm-tms570/startup/linkcmds.xm_tms570 create mode 100644 c/src/lib/libbsp/arm/xm-tms570/startup/xmhdr.c diff --git a/c/src/lib/libbsp/arm/acinclude.m4 b/c/src/lib/libbsp/arm/acinclude.m4 index 079d2b0910..d0d222ee2f 100644 --- a/c/src/lib/libbsp/arm/acinclude.m4 +++ b/c/src/lib/libbsp/arm/acinclude.m4 @@ -42,6 +42,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 547cce3d2c..f96e536a90 100755 --- 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, 2016 embedded brains GmbH. All rights reserved. + * Copyright (c) 2008, 2017 embedded brains GmbH. All rights reserved. * * embedded brains GmbH * Dornierstr. 4 @@ -13,6 +13,9 @@ * Germany * * + * 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 #include +#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 @@ -190,6 +205,7 @@ _start: #ifdef RTEMS_SMP /* Read MPIDR and get current processor index */ + XM_SI(MRC_OPCODE) mrc p15, 0, r0, c0, c0, 5 and r0, #0xff @@ -209,6 +225,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 @@ -228,12 +245,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 @@ -242,6 +261,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 @@ -254,6 +274,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 @@ -262,6 +283,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 @@ -270,6 +292,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 @@ -281,6 +304,7 @@ bsp_start_skip_hyp_svc_switch: #ifdef ARM_MULTILIB_VFP #ifdef ARM_MULTILIB_HAS_CPACR /* Read CPACR */ + XM_SI(MRC_OPCODE) mrc p15, 0, r0, c1, c0, 2 /* Enable CP10 and CP11 */ @@ -361,6 +385,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 @@ -453,3 +483,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 61f2b6f027..7322f5a2cb 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..cb942740be --- /dev/null +++ b/c/src/lib/libbsp/arm/xm-tms570/Makefile.am @@ -0,0 +1,123 @@ +## +# +# @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/bsppredriverhook.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 + * + * @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 + +#include +#include +#include +#include + +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..28116baa94 --- /dev/null +++ b/c/src/lib/libbsp/arm/xm-tms570/include/bsp.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2017 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Dornierstr. 4 + * 82178 Puchheim + * Germany + * + * + * 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 + +#define BSP_FEATURE_IRQ_EXTENSION + +#include +#include + +#include + +#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 + * + * 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 +#include +#include +#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..71d890737c --- /dev/null +++ b/c/src/lib/libbsp/arm/xm-tms570/irq/irq.c @@ -0,0 +1,52 @@ +/* + * @file irq.c + * + * @author Miguel Masmano + * + * @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 +#include +#include +#include + +void bsp_interrupt_dispatch(void) +{ + rtems_vector_number vector =XM_params_get_PCT()->irqIndex; + + bsp_interrupt_handler_dispatch(vector); +} + +void bsp_interrupt_vector_enable(rtems_vector_number vector) +{ + bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector)); + + if ((vector >= 0) && (vector < 96)) { + XM_clear_irqmask(1<=96)&&(vector<(96+32))) { + XM_clear_irqmask(0, 1<<(vector-96)); + } +} + +void bsp_interrupt_vector_disable(rtems_vector_number vector) +{ + bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector)); + + if ((vector >= 0) && (vector < 96)) { + XM_set_irqmask(1<=96)&&(vector<(96+32))) { + XM_set_irqmask(0, 1<<(vector-96)); + } +} + +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..3fa29599e8 --- /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-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 + * + * @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 +#include +#include + +#include + +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..f4de34fa12 --- /dev/null +++ b/c/src/lib/libbsp/arm/xm-tms570/startup/bspstart.c @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2017 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Dornierstr. 4 + * 82178 Puchheim + * Germany + * + * + * 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 +#include + +void bsp_start(void) +{ + bsp_interrupt_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 + * + * + * 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_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..9cefff34ec --- /dev/null +++ b/c/src/lib/libbsp/arm/xm-tms570/startup/cpucounterread.c @@ -0,0 +1,50 @@ +/* + * @file cpucounterread.c + * + * @author Miguel Masmano + * + * @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 +#include + +#include + +#include +#include + +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 +} + +static 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 +} + +RTEMS_SYSINIT_ITEM( + xm_tms570_cpu_counter_initialize, + RTEMS_SYSINIT_BSP_START, + RTEMS_SYSINIT_ORDER_FIRST +); 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 + * + * @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 + +/* + 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 d9ef290ec2..28898ab128 100644 --- a/c/src/lib/libbsp/shared/include/fatal.h +++ b/c/src/lib/libbsp/shared/include/fatal.h @@ -49,6 +49,7 @@ typedef enum { XM_BSP_FATAL_SET_TBR_NOT_IMPLEMENTED, XM_BSP_FATAL_GPT_CLOCK_IRQ_INSTALL, XM_BSP_FATAL_CONSOLE_DEVICE_INSTALL_APBUART, + 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 daa7038b0f..2f5079d4df 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 /* @@ -140,6 +149,9 @@ _ARMV4_Exception_interrupt: mov sp, NON_VOLATILE_SCRATCH /* Save CPSR in non-volatile register */ +#ifdef RTEMS_PARAVIRT_XTRATUM + udf #4 +#endif mrs NON_VOLATILE_SCRATCH, CPSR /* Decrement levels and determine thread dispatch state */ @@ -161,6 +173,9 @@ _ARMV4_Exception_interrupt: bne .Lthread_dispatch_done /* Thread dispatch */ +#ifdef RTEMS_PARAVIRT_XTRATUM + udf #4 +#endif mrs NON_VOLATILE_SCRATCH, CPSR .Ldo_thread_dispatch: @@ -178,6 +193,9 @@ _ARMV4_Exception_interrupt: BLX_TO_THUMB_1 _Thread_Do_dispatch /* Disable interrupts */ +#ifdef RTEMS_PARAVIRT_XTRATUM + udf #5 +#endif msr CPSR, NON_VOLATILE_SCRATCH #ifdef RTEMS_SMP @@ -220,10 +238,16 @@ _ARMV4_Exception_interrupt: 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 */ @@ -234,6 +258,9 @@ _ARMV4_Exception_interrupt: /* 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 */ @@ -267,6 +294,9 @@ _ARMV4_Exception_interrupt: #endif /* Return from interrupt */ +#ifdef RTEMS_PARAVIRT_XTRATUM + udf #10 +#endif subs pc, lr, #4 #ifdef RTEMS_PROFILING 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 01a43b3cfd..cc2a0bde24 100644 --- a/cpukit/score/cpu/arm/cpu.c +++ b/cpukit/score/cpu/arm/cpu.c @@ -119,8 +119,14 @@ 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], #" RTEMS_XSTRING( ARM_PSR_I ) "\n" +#ifdef RTEMS_PARAVIRT_XTRATUM + "udf #5\n" +#endif "msr cpsr, %0\n" ARM_SWITCH_BACK : [arm_switch_reg] "=&r" (arm_switch_reg) @@ -134,6 +140,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], #" RTEMS_XSTRING( 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 f08da1dc57..3ee3053f1e 100755 --- a/cpukit/score/cpu/arm/rtems/score/arm.h +++ b/cpukit/score/cpu/arm/rtems/score/arm.h @@ -49,10 +49,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 05e236c75a..2938954682 100644 --- a/cpukit/score/cpu/arm/rtems/score/cpu.h +++ b/cpukit/score/cpu/arm/rtems/score/cpu.h @@ -320,8 +320,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) @@ -347,6 +353,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 @@ -368,8 +377,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) -- cgit v1.2.3