[PATCH v3 2/3] Add ARM Paravirtualization support

Joel Sherrill joel at rtems.org
Wed Feb 21 20:07:50 UTC 2018


Closes #3305.
---
 cpukit/score/cpu/arm/cpu_asm.S                     |  5 +-
 cpukit/score/cpu/arm/include/rtems/score/cpu.h     |  6 ++
 .../score/cpu/arm/include/rtems/score/paravirt.h   | 75 ++++++++++++++++++++++
 cpukit/score/cpu/arm/include/rtems/score/types.h   |  3 +
 4 files changed, 88 insertions(+), 1 deletion(-)
 create mode 100644 cpukit/score/cpu/arm/include/rtems/score/paravirt.h

diff --git a/cpukit/score/cpu/arm/cpu_asm.S b/cpukit/score/cpu/arm/cpu_asm.S
index f58b99d..214e67d 100644
--- a/cpukit/score/cpu/arm/cpu_asm.S
+++ b/cpukit/score/cpu/arm/cpu_asm.S
@@ -111,9 +111,12 @@ DEFINE_FUNCTION_ARM(_CPU_Context_switch)
 #endif
 
 #ifdef ARM_MULTILIB_HAS_THREAD_ID_REGISTER
+  #if defined(CPU_ARM_USE_USER_ACCESSIBLE_THREAD_ID_REGISTER)
+	mcr	p15, 0, r3, c13, c0, 2
+  #else
 	mcr	p15, 0, r3, c13, c0, 3
+  #endif
 #endif
-
 	str	r4, [r2, #PER_CPU_ISR_DISPATCH_DISABLE]
 
 	/* In ARMv5T and above the load of PC is an interworking branch */
diff --git a/cpukit/score/cpu/arm/include/rtems/score/cpu.h b/cpukit/score/cpu/arm/include/rtems/score/cpu.h
index 05e236c..4b52d6d 100644
--- a/cpukit/score/cpu/arm/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/arm/include/rtems/score/cpu.h
@@ -297,6 +297,11 @@ static inline void _ARM_Instruction_synchronization_barrier( void )
 #endif
 }
 
+#if defined(CPU_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 +392,7 @@ static inline void arm_interrupt_flash( uint32_t level )
   );
 #endif
 }
+#endif  /* !CPU_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..fc3d276
--- /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 CPU_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 CPU_ARM_USE_USER_ACCESSIBLE_THREAD_ID_REGISTER
+
+#endif
diff --git a/cpukit/score/cpu/arm/include/rtems/score/types.h b/cpukit/score/cpu/arm/include/rtems/score/types.h
index 37a56df..8518891 100644
--- a/cpukit/score/cpu/arm/include/rtems/score/types.h
+++ b/cpukit/score/cpu/arm/include/rtems/score/types.h
@@ -21,6 +21,9 @@
 #define _RTEMS_SCORE_TYPES_H
 
 #include <rtems/score/basedefs.h>
+#if defined(RTEMS_PARAVIRT)
+#include <rtems/score/paravirt.h>
+#endif
 
 #ifndef ASM
 
-- 
1.8.3.1




More information about the devel mailing list