[rtems commit] Add ARM Paravirtualization support

Joel Sherrill joel at rtems.org
Tue Mar 13 15:01:38 UTC 2018


Module:    rtems
Branch:    master
Commit:    c0443b4ce943fa891839c7b7be21d8ebd4370de1
Changeset: http://git.rtems.org/rtems/commit/?id=c0443b4ce943fa891839c7b7be21d8ebd4370de1

Author:    Joel Sherrill <joel at rtems.org>
Date:      Mon Mar 12 14:42:47 2018 -0500

Add ARM Paravirtualization support

Closes #3305.

---

 cpukit/score/cpu/arm/headers.am                    |  1 +
 cpukit/score/cpu/arm/include/rtems/score/arm.h     |  8 ++-
 cpukit/score/cpu/arm/include/rtems/score/cpu.h     |  9 +++
 .../score/cpu/arm/include/rtems/score/paravirt.h   | 75 ++++++++++++++++++++++
 4 files changed, 90 insertions(+), 3 deletions(-)

diff --git a/cpukit/score/cpu/arm/headers.am b/cpukit/score/cpu/arm/headers.am
index 6325328..9bbc701 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 f08da1d..bff4044 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 15e3ac7..728a43c 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 0000000..08fb8a0
--- /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



More information about the vc mailing list