[rtems commit] arm: Per-CPU thread dispatch disable

Sebastian Huber sebh at rtems.org
Fri Aug 9 21:26:17 UTC 2013


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

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Thu Aug  1 17:46:37 2013 +0200

arm: Per-CPU thread dispatch disable

Interrupt support for per-CPU thread dispatch disable level.

---

 cpukit/score/cpu/arm/arm_exc_interrupt.S |   76 ++++++++++--------------------
 1 files changed, 25 insertions(+), 51 deletions(-)

diff --git a/cpukit/score/cpu/arm/arm_exc_interrupt.S b/cpukit/score/cpu/arm/arm_exc_interrupt.S
index 8bcd03e..3789309 100644
--- a/cpukit/score/cpu/arm/arm_exc_interrupt.S
+++ b/cpukit/score/cpu/arm/arm_exc_interrupt.S
@@ -38,21 +38,30 @@
 #define EXCHANGE_LR r4
 #define EXCHANGE_SPSR r5
 #define EXCHANGE_CPSR r6
-#define EXCHANGE_INT_SP r7
+#define EXCHANGE_INT_SP r8
 
 #define EXCHANGE_LIST {EXCHANGE_LR, EXCHANGE_SPSR, EXCHANGE_CPSR, EXCHANGE_INT_SP}
 #define EXCHANGE_SIZE 16
 
-#define CONTEXT_LIST {r0, r1, r2, r3, EXCHANGE_LR, EXCHANGE_SPSR, r12}
-#define CONTEXT_SIZE 28
+#define SELF_CPU_CONTROL r7
+
+#define CONTEXT_LIST {r0, r1, r2, r3, EXCHANGE_LR, EXCHANGE_SPSR, SELF_CPU_CONTROL, r12}
+#define CONTEXT_SIZE 32
 
 #ifdef ARM_MULTILIB_VFP_D32
   #define VFP_CONTEXT_WITH_ALIGNMENT_SPACE (24 * 8 + 4 + 4)
 #endif
 
-.extern _Thread_Dispatch_disable_level
+.macro GET_SELF_CPU_CONTROL REG, TMP
+	ldr	\REG, =_Per_CPU_Information
+#ifdef RTEMS_SMP
+	/* Use ARMv7 Multiprocessor Affinity Register (MPIDR) */
+	mrc	p15, 0, \TMP, c0, c0, 5
 
-.extern bsp_interrupt_dispatch
+	and	\TMP, \TMP, #0xff
+	add	\REG, \REG, \TMP, asl #PER_CPU_CONTROL_SIZE_LOG2
+#endif
+.endm
 
 .arm
 .globl _ARMV4_Exception_interrupt
@@ -90,38 +99,9 @@ _ARMV4_Exception_interrupt:
 	str	r0, [r1]
 #endif
 
-#ifdef RTEMS_SMP
-	/* ISR enter */
-	blx	_ISR_SMP_Enter
-
-	/* Remember INT stack pointer */
-	mov	r1, EXCHANGE_INT_SP
-
-	/* Restore exchange registers from exchange area */
-	ldmia	r1, EXCHANGE_LIST
+	/* Get per-CPU control of current processor */
+	GET_SELF_CPU_CONTROL	SELF_CPU_CONTROL, r1
 
-	/* Switch stack if necessary and save original stack pointer */
-	mov	r2, sp
-	cmp	r0, #0
-	moveq	sp, r1
-	stmdb	sp!, {r2}
-
-	/* Call BSP dependent interrupt dispatcher */
-	blx	bsp_interrupt_dispatch
-
-	/* Restore stack pointer */
-	ldr	sp, [sp]
-
-	/* ISR exit */
-	blx	_ISR_SMP_Exit
-	cmp	r0, #0
-	beq	thread_dispatch_done
-
-	/* Thread dispatch */
-	blx	_Thread_Dispatch
-
-thread_dispatch_done:
-#else /* RTEMS_SMP */
 	/* Remember INT stack pointer */
 	mov	r1, EXCHANGE_INT_SP
 
@@ -129,8 +109,7 @@ thread_dispatch_done:
 	ldmia	r1, EXCHANGE_LIST
 
 	/* Get interrupt nest level */
-	ldr	r0, =ISR_NEST_LEVEL
-	ldr	r2, [r0]
+	ldr	r2, [SELF_CPU_CONTROL, #PER_CPU_ISR_NEST_LEVEL]
 
 	/* Switch stack if necessary and save original stack pointer */
 	mov	r3, sp
@@ -142,25 +121,22 @@ thread_dispatch_done:
 	SWITCH_FROM_ARM_TO_THUMB        r1
 
 	/* Increment interrupt nest and thread dispatch disable level */
-	ldr	r1, =_Thread_Dispatch_disable_level
-	ldr	r3, [r1]
+	ldr	r3, [SELF_CPU_CONTROL, #PER_CPU_THREAD_DISPATCH_DISABLE_LEVEL]
 	add	r2, #1
 	add	r3, #1
-	str	r2, [r0]
-	str	r3, [r1]
+	str	r2, [SELF_CPU_CONTROL, #PER_CPU_ISR_NEST_LEVEL]
+	str	r3, [SELF_CPU_CONTROL, #PER_CPU_THREAD_DISPATCH_DISABLE_LEVEL]
 
 	/* Call BSP dependent interrupt dispatcher */
 	bl	bsp_interrupt_dispatch
 
 	/* Decrement interrupt nest and thread dispatch disable level */
-	ldr	r0, =ISR_NEST_LEVEL
-	ldr	r1, =_Thread_Dispatch_disable_level
-	ldr	r2, [r0]
-	ldr	r3, [r1]
+	ldr	r2, [SELF_CPU_CONTROL, #PER_CPU_ISR_NEST_LEVEL]
+	ldr	r3, [SELF_CPU_CONTROL, #PER_CPU_THREAD_DISPATCH_DISABLE_LEVEL]
 	sub	r2, #1
 	sub	r3, #1
-	str	r2, [r0]
-	str	r3, [r1]
+	str	r2, [SELF_CPU_CONTROL, #PER_CPU_ISR_NEST_LEVEL]
+	str	r3, [SELF_CPU_CONTROL, #PER_CPU_THREAD_DISPATCH_DISABLE_LEVEL]
 
 	/* Restore stack pointer */
 	SWITCH_FROM_THUMB_TO_ARM
@@ -172,8 +148,7 @@ thread_dispatch_done:
 	bne	thread_dispatch_done
 
 	/* Check context switch necessary */
-	ldr	r0, =DISPATCH_NEEDED
-	ldrb	r1, [r0]
+	ldrb	r1, [SELF_CPU_CONTROL, #PER_CPU_DISPATCH_NEEDED]
 	cmp	r1, #0
 	beq	thread_dispatch_done
 
@@ -189,7 +164,6 @@ thread_dispatch_done:
 
 	/* Switch to ARM instructions if necessary */
 	SWITCH_FROM_THUMB_TO_ARM
-#endif /* RTEMS_SMP */
 
 #ifdef ARM_MULTILIB_VFP_D32
 	/* Restore VFP context */




More information about the vc mailing list