forked from Imagelibrary/rtems
arm: Per-CPU thread dispatch disable
Interrupt support for per-CPU thread dispatch disable level.
This commit is contained in:
@@ -38,21 +38,30 @@
|
|||||||
#define EXCHANGE_LR r4
|
#define EXCHANGE_LR r4
|
||||||
#define EXCHANGE_SPSR r5
|
#define EXCHANGE_SPSR r5
|
||||||
#define EXCHANGE_CPSR r6
|
#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_LIST {EXCHANGE_LR, EXCHANGE_SPSR, EXCHANGE_CPSR, EXCHANGE_INT_SP}
|
||||||
#define EXCHANGE_SIZE 16
|
#define EXCHANGE_SIZE 16
|
||||||
|
|
||||||
#define CONTEXT_LIST {r0, r1, r2, r3, EXCHANGE_LR, EXCHANGE_SPSR, r12}
|
#define SELF_CPU_CONTROL r7
|
||||||
#define CONTEXT_SIZE 28
|
|
||||||
|
#define CONTEXT_LIST {r0, r1, r2, r3, EXCHANGE_LR, EXCHANGE_SPSR, SELF_CPU_CONTROL, r12}
|
||||||
|
#define CONTEXT_SIZE 32
|
||||||
|
|
||||||
#ifdef ARM_MULTILIB_VFP_D32
|
#ifdef ARM_MULTILIB_VFP_D32
|
||||||
#define VFP_CONTEXT_WITH_ALIGNMENT_SPACE (24 * 8 + 4 + 4)
|
#define VFP_CONTEXT_WITH_ALIGNMENT_SPACE (24 * 8 + 4 + 4)
|
||||||
#endif
|
#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
|
.arm
|
||||||
.globl _ARMV4_Exception_interrupt
|
.globl _ARMV4_Exception_interrupt
|
||||||
@@ -90,9 +99,8 @@ _ARMV4_Exception_interrupt:
|
|||||||
str r0, [r1]
|
str r0, [r1]
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RTEMS_SMP
|
/* Get per-CPU control of current processor */
|
||||||
/* ISR enter */
|
GET_SELF_CPU_CONTROL SELF_CPU_CONTROL, r1
|
||||||
blx _ISR_SMP_Enter
|
|
||||||
|
|
||||||
/* Remember INT stack pointer */
|
/* Remember INT stack pointer */
|
||||||
mov r1, EXCHANGE_INT_SP
|
mov r1, EXCHANGE_INT_SP
|
||||||
@@ -100,37 +108,8 @@ _ARMV4_Exception_interrupt:
|
|||||||
/* Restore exchange registers from exchange area */
|
/* Restore exchange registers from exchange area */
|
||||||
ldmia r1, EXCHANGE_LIST
|
ldmia r1, EXCHANGE_LIST
|
||||||
|
|
||||||
/* 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
|
|
||||||
|
|
||||||
/* Restore exchange registers from exchange area */
|
|
||||||
ldmia r1, EXCHANGE_LIST
|
|
||||||
|
|
||||||
/* Get interrupt nest level */
|
/* Get interrupt nest level */
|
||||||
ldr r0, =ISR_NEST_LEVEL
|
ldr r2, [SELF_CPU_CONTROL, #PER_CPU_ISR_NEST_LEVEL]
|
||||||
ldr r2, [r0]
|
|
||||||
|
|
||||||
/* Switch stack if necessary and save original stack pointer */
|
/* Switch stack if necessary and save original stack pointer */
|
||||||
mov r3, sp
|
mov r3, sp
|
||||||
@@ -142,25 +121,22 @@ thread_dispatch_done:
|
|||||||
SWITCH_FROM_ARM_TO_THUMB r1
|
SWITCH_FROM_ARM_TO_THUMB r1
|
||||||
|
|
||||||
/* Increment interrupt nest and thread dispatch disable level */
|
/* Increment interrupt nest and thread dispatch disable level */
|
||||||
ldr r1, =_Thread_Dispatch_disable_level
|
ldr r3, [SELF_CPU_CONTROL, #PER_CPU_THREAD_DISPATCH_DISABLE_LEVEL]
|
||||||
ldr r3, [r1]
|
|
||||||
add r2, #1
|
add r2, #1
|
||||||
add r3, #1
|
add r3, #1
|
||||||
str r2, [r0]
|
str r2, [SELF_CPU_CONTROL, #PER_CPU_ISR_NEST_LEVEL]
|
||||||
str r3, [r1]
|
str r3, [SELF_CPU_CONTROL, #PER_CPU_THREAD_DISPATCH_DISABLE_LEVEL]
|
||||||
|
|
||||||
/* Call BSP dependent interrupt dispatcher */
|
/* Call BSP dependent interrupt dispatcher */
|
||||||
bl bsp_interrupt_dispatch
|
bl bsp_interrupt_dispatch
|
||||||
|
|
||||||
/* Decrement interrupt nest and thread dispatch disable level */
|
/* Decrement interrupt nest and thread dispatch disable level */
|
||||||
ldr r0, =ISR_NEST_LEVEL
|
ldr r2, [SELF_CPU_CONTROL, #PER_CPU_ISR_NEST_LEVEL]
|
||||||
ldr r1, =_Thread_Dispatch_disable_level
|
ldr r3, [SELF_CPU_CONTROL, #PER_CPU_THREAD_DISPATCH_DISABLE_LEVEL]
|
||||||
ldr r2, [r0]
|
|
||||||
ldr r3, [r1]
|
|
||||||
sub r2, #1
|
sub r2, #1
|
||||||
sub r3, #1
|
sub r3, #1
|
||||||
str r2, [r0]
|
str r2, [SELF_CPU_CONTROL, #PER_CPU_ISR_NEST_LEVEL]
|
||||||
str r3, [r1]
|
str r3, [SELF_CPU_CONTROL, #PER_CPU_THREAD_DISPATCH_DISABLE_LEVEL]
|
||||||
|
|
||||||
/* Restore stack pointer */
|
/* Restore stack pointer */
|
||||||
SWITCH_FROM_THUMB_TO_ARM
|
SWITCH_FROM_THUMB_TO_ARM
|
||||||
@@ -172,8 +148,7 @@ thread_dispatch_done:
|
|||||||
bne thread_dispatch_done
|
bne thread_dispatch_done
|
||||||
|
|
||||||
/* Check context switch necessary */
|
/* Check context switch necessary */
|
||||||
ldr r0, =DISPATCH_NEEDED
|
ldrb r1, [SELF_CPU_CONTROL, #PER_CPU_DISPATCH_NEEDED]
|
||||||
ldrb r1, [r0]
|
|
||||||
cmp r1, #0
|
cmp r1, #0
|
||||||
beq thread_dispatch_done
|
beq thread_dispatch_done
|
||||||
|
|
||||||
@@ -189,7 +164,6 @@ thread_dispatch_done:
|
|||||||
|
|
||||||
/* Switch to ARM instructions if necessary */
|
/* Switch to ARM instructions if necessary */
|
||||||
SWITCH_FROM_THUMB_TO_ARM
|
SWITCH_FROM_THUMB_TO_ARM
|
||||||
#endif /* RTEMS_SMP */
|
|
||||||
|
|
||||||
#ifdef ARM_MULTILIB_VFP_D32
|
#ifdef ARM_MULTILIB_VFP_D32
|
||||||
/* Restore VFP context */
|
/* Restore VFP context */
|
||||||
|
|||||||
Reference in New Issue
Block a user