summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoel Sherrill <joel@rtems.org>2018-03-12 14:42:47 -0500
committerJoel Sherrill <joel@rtems.org>2018-03-13 09:55:23 -0500
commitc0443b4ce943fa891839c7b7be21d8ebd4370de1 (patch)
treef2aad8953f41eb54a6ba8e9b39781d1867cf7fcc
parent7c39cab92a788dff434e7e7eaa38aa1543d9393e (diff)
downloadrtems-c0443b4ce943fa891839c7b7be21d8ebd4370de1.tar.bz2
Add ARM Paravirtualization support
Closes #3305.
-rw-r--r--cpukit/score/cpu/arm/headers.am1
-rwxr-xr-xcpukit/score/cpu/arm/include/rtems/score/arm.h8
-rw-r--r--cpukit/score/cpu/arm/include/rtems/score/cpu.h9
-rw-r--r--cpukit/score/cpu/arm/include/rtems/score/paravirt.h75
4 files changed, 90 insertions, 3 deletions
diff --git a/cpukit/score/cpu/arm/headers.am b/cpukit/score/cpu/arm/headers.am
index 6325328189..9bbc7015b9 100644
--- a/cpukit/score/cpu/arm/headers.am
+++ b/cpukit/score/cpu/arm/headers.am
@@ -21,3 +21,4 @@ include_rtems_score_HEADERS += include/rtems/score/cpu.h
include_rtems_score_HEADERS += include/rtems/score/cpu_asm.h
include_rtems_score_HEADERS += include/rtems/score/cpuatomic.h
include_rtems_score_HEADERS += include/rtems/score/cpuimpl.h
+include_rtems_score_HEADERS += include/rtems/score/paravirt.h
diff --git a/cpukit/score/cpu/arm/include/rtems/score/arm.h b/cpukit/score/cpu/arm/include/rtems/score/arm.h
index f08da1dc57..bff4044a99 100755
--- a/cpukit/score/cpu/arm/include/rtems/score/arm.h
+++ b/cpukit/score/cpu/arm/include/rtems/score/arm.h
@@ -49,9 +49,11 @@ extern "C" {
#define ARM_MULTILIB_HAS_BARRIER_INSTRUCTIONS
#endif
-#if defined(__ARM_ARCH_7A__) \
- || defined(__ARM_ARCH_7R__)
- #define ARM_MULTILIB_HAS_THREAD_ID_REGISTER
+#ifndef ARM_DISABLE_THREAD_ID_REGISTER_USE
+ #if defined(__ARM_ARCH_7A__) \
+ || defined(__ARM_ARCH_7R__)
+ #define ARM_MULTILIB_HAS_THREAD_ID_REGISTER
+ #endif
#endif
#if defined(__ARM_ARCH_7A__)
diff --git a/cpukit/score/cpu/arm/include/rtems/score/cpu.h b/cpukit/score/cpu/arm/include/rtems/score/cpu.h
index 15e3ac7280..728a43c528 100644
--- a/cpukit/score/cpu/arm/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/arm/include/rtems/score/cpu.h
@@ -30,6 +30,9 @@
#define _RTEMS_SCORE_CPU_H
#include <rtems/score/basedefs.h>
+#if defined(RTEMS_PARAVIRT)
+#include <rtems/score/paravirt.h>
+#endif
#include <rtems/score/arm.h>
#if defined(ARM_MULTILIB_ARCH_V4)
@@ -297,6 +300,11 @@ static inline void _ARM_Instruction_synchronization_barrier( void )
#endif
}
+#if defined(ARM_DISABLE_INLINE_ISR_DISABLE_ENABLE)
+uint32_t arm_interrupt_disable( void );
+void arm_interrupt_enable( uint32_t level );
+void arm_interrupt_flash( uint32_t level );
+#else
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t level;
@@ -387,6 +395,7 @@ static inline void arm_interrupt_flash( uint32_t level )
);
#endif
}
+#endif /* !ARM_DISABLE_INLINE_ISR_DISABLE_ENABLE */
#define _CPU_ISR_Disable( _isr_cookie ) \
do { \
diff --git a/cpukit/score/cpu/arm/include/rtems/score/paravirt.h b/cpukit/score/cpu/arm/include/rtems/score/paravirt.h
new file mode 100644
index 0000000000..08fb8a08ef
--- /dev/null
+++ b/cpukit/score/cpu/arm/include/rtems/score/paravirt.h
@@ -0,0 +1,75 @@
+/**
+ * @file
+ *
+ * @brief ARM Paravirtualization Definitions
+ *
+ * This include file contains definitions pertaining to paravirtualization
+ * of the ARM port.
+ */
+
+/*
+ * COPYRIGHT (c) 2018.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+
+#ifndef RTEMS_PARAVIRT
+#error "This file should only be included with paravirtualization is enabled."
+#endif
+
+#ifndef _RTEMS_SCORE_PARAVIRT_H
+#define _RTEMS_SCORE_PARAVIRT_H
+
+/**
+ * @defgroup ParavirtARM Paravirtualization ARM Support
+ *
+ * @ingroup Score
+ *
+ * This handler encapulates the functionality (primarily conditional
+ * feature defines) related to paravirtualization on the ARM.
+ *
+ * Paravirtualization on the ARM makes the following assumptions:
+ *
+ * - RTEMS executes in user space
+ * - Interrupt enable/disable support using the MSR must be disabled
+ * and replaced with BSP provided methods which are adapted to the
+ * hosting environment.
+ */
+
+#ifndef ASM
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !ASM */
+
+/**
+ * In a paravirtualized environment, RTEMS executes in user space
+ * and cannot disable/enable external exceptions (e.g. interrupts).
+ * The BSP which acts as an adapter to the hosting environment will
+ * provide the interrupt enable/disable methods.
+ */
+#define ARM_DISABLE_INLINE_ISR_DISABLE_ENABLE
+
+/**
+ * In a paravirtualized environment, RTEMS executes in user space
+ * and cannot write to the the Thread ID register which is normally
+ * used. CP15 C13 has three variants of a Thread ID register.
+ *
+ * - Opcode_2 = 2: This register is both user and privileged R/W accessible.
+ * - Opcode_2 = 3: This register is user read-only and privileged
+ * R/W accessible.
+ * - Opcode_2 = 4: This register is privileged R/W accessible only.
+ */
+#define ARM_DISABLE_THREAD_ID_REGISTER_USE
+
+#endif