forked from Imagelibrary/rtems
arm: Use TPIDRPRW for current per-CPU control
Use the previously unused TPIDRPRW register to get the per-CPU control of the current processor. This avoids instructions in GET_SELF_CPU_CONTROL which are not available in Thumb mode.
This commit is contained in:
@@ -5,10 +5,10 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2008-2014 embedded brains GmbH. All rights reserved.
|
* Copyright (c) 2008, 2016 embedded brains GmbH. All rights reserved.
|
||||||
*
|
*
|
||||||
* embedded brains GmbH
|
* embedded brains GmbH
|
||||||
* Obere Lagerstr. 30
|
* Dornierstr. 4
|
||||||
* 82178 Puchheim
|
* 82178 Puchheim
|
||||||
* Germany
|
* Germany
|
||||||
* <rtems@embedded-brains.de>
|
* <rtems@embedded-brains.de>
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
|
|
||||||
#include <rtems/asm.h>
|
#include <rtems/asm.h>
|
||||||
#include <rtems/system.h>
|
#include <rtems/system.h>
|
||||||
#include <rtems/score/cpu.h>
|
#include <rtems/score/percpu.h>
|
||||||
|
|
||||||
#include <bspopts.h>
|
#include <bspopts.h>
|
||||||
#include <bsp/irq.h>
|
#include <bsp/irq.h>
|
||||||
@@ -184,11 +184,19 @@ _start:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RTEMS_SMP
|
#ifdef RTEMS_SMP
|
||||||
/* Read MPIDR */
|
/* Read MPIDR and get current processor index */
|
||||||
mrc p15, 0, r0, c0, c0, 5
|
mrc p15, 0, r0, c0, c0, 5
|
||||||
|
and r0, #0xff
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get current per-CPU control and store it in PL1 only Thread ID
|
||||||
|
* Register (TPIDRPRW).
|
||||||
|
*/
|
||||||
|
ldr r1, =_Per_CPU_Information
|
||||||
|
add r1, r1, r0, asl #PER_CPU_CONTROL_SIZE_LOG2
|
||||||
|
mcr p15, 0, r1, c13, c0, 4
|
||||||
|
|
||||||
/* Calculate stack offset */
|
/* Calculate stack offset */
|
||||||
and r0, #0xff
|
|
||||||
ldr r1, =bsp_stack_all_size
|
ldr r1, =bsp_stack_all_size
|
||||||
mul r1, r0
|
mul r1, r0
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ _ARMV4_Exception_interrupt:
|
|||||||
#endif /* ARM_MULTILIB_VFP */
|
#endif /* ARM_MULTILIB_VFP */
|
||||||
|
|
||||||
/* Get per-CPU control of current processor */
|
/* Get per-CPU control of current processor */
|
||||||
GET_SELF_CPU_CONTROL SELF_CPU_CONTROL, r1
|
GET_SELF_CPU_CONTROL SELF_CPU_CONTROL
|
||||||
|
|
||||||
/* Remember INT stack pointer */
|
/* Remember INT stack pointer */
|
||||||
mov r1, EXCHANGE_INT_SP
|
mov r1, EXCHANGE_INT_SP
|
||||||
|
|||||||
@@ -128,7 +128,7 @@ DEFINE_FUNCTION_ARM(_CPU_Context_restore)
|
|||||||
#ifdef RTEMS_SMP
|
#ifdef RTEMS_SMP
|
||||||
.L_get_potential_new_heir:
|
.L_get_potential_new_heir:
|
||||||
|
|
||||||
GET_SELF_CPU_CONTROL r2, r3
|
GET_SELF_CPU_CONTROL r2
|
||||||
|
|
||||||
/* We may have a new heir */
|
/* We may have a new heir */
|
||||||
|
|
||||||
|
|||||||
@@ -187,14 +187,12 @@
|
|||||||
#endif /* __thumb__ */
|
#endif /* __thumb__ */
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
.macro GET_SELF_CPU_CONTROL REG, TMP
|
.macro GET_SELF_CPU_CONTROL REG
|
||||||
ldr \REG, =_Per_CPU_Information
|
|
||||||
#ifdef RTEMS_SMP
|
#ifdef RTEMS_SMP
|
||||||
/* Use ARMv7 Multiprocessor Affinity Register (MPIDR) */
|
/* Use PL1 only Thread ID Register (TPIDRPRW) */
|
||||||
mrc p15, 0, \TMP, c0, c0, 5
|
mrc p15, 0, \REG, c13, c0, 4
|
||||||
|
#else
|
||||||
and \TMP, \TMP, #0xff
|
ldr \REG, =_Per_CPU_Information
|
||||||
add \REG, \REG, \TMP, asl #PER_CPU_CONTROL_SIZE_LOG2
|
|
||||||
#endif
|
#endif
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
|||||||
@@ -21,6 +21,29 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef ARM_MULTILIB_ARCH_V4
|
||||||
|
|
||||||
|
#ifdef RTEMS_SMP
|
||||||
|
|
||||||
|
static inline struct Per_CPU_Control *_ARM_Get_current_per_CPU_control( void )
|
||||||
|
{
|
||||||
|
struct Per_CPU_Control *cpu_self;
|
||||||
|
|
||||||
|
/* Use PL1 only Thread ID Register (TPIDRPRW) */
|
||||||
|
__asm__ volatile (
|
||||||
|
"mrc p15, 0, %0, c13, c0, 4"
|
||||||
|
: "=r" ( cpu_self )
|
||||||
|
);
|
||||||
|
|
||||||
|
return cpu_self;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define _CPU_Get_current_per_CPU_control() _ARM_Get_current_per_CPU_control()
|
||||||
|
|
||||||
|
#endif /* RTEMS_SMP */
|
||||||
|
|
||||||
|
#endif /* ARM_MULTILIB_ARCH_V4 */
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user