diff options
-rw-r--r-- | cpukit/score/cpu/no_cpu/rtems/score/cpu.h | 18 | ||||
-rw-r--r-- | cpukit/score/include/rtems/score/percpu.h | 10 |
2 files changed, 25 insertions, 3 deletions
diff --git a/cpukit/score/cpu/no_cpu/rtems/score/cpu.h b/cpukit/score/cpu/no_cpu/rtems/score/cpu.h index 5241b5ba5d..959fb58a6d 100644 --- a/cpukit/score/cpu/no_cpu/rtems/score/cpu.h +++ b/cpukit/score/cpu/no_cpu/rtems/score/cpu.h @@ -1462,6 +1462,24 @@ CPU_Counter_ticks _CPU_Counter_difference( CPU_Counter_ticks first ); +/** + * @brief Special register pointing to the per-CPU control of the current + * processor. + * + * This is optional. Not every CPU port needs this. It is only an optional + * optimization variant. + */ +register struct Per_CPU_Control *_CPU_Per_CPU_current asm( "rX" ); + +/** + * @brief Optional method to obtain the per-CPU control of the current processor. + * + * This is optional. Not every CPU port needs this. It is only an optional + * optimization variant. In case this macro is undefined, the default + * implementation using the current processor index will be used. + */ +#define _CPU_Get_current_per_CPU_control() ( _CPU_Per_CPU_current ) + #ifdef RTEMS_SMP /** * @brief Performs CPU specific SMP initialization in the context of the boot diff --git a/cpukit/score/include/rtems/score/percpu.h b/cpukit/score/include/rtems/score/percpu.h index afc38031df..a1b0a38900 100644 --- a/cpukit/score/include/rtems/score/percpu.h +++ b/cpukit/score/include/rtems/score/percpu.h @@ -235,7 +235,7 @@ typedef struct { * * This structure is used to hold per core state information. */ -typedef struct { +typedef struct Per_CPU_Control { /** * @brief CPU port specific control. */ @@ -437,8 +437,12 @@ extern Per_CPU_Control_envelope _Per_CPU_Information[] CPU_STRUCTURE_ALIGNMENT; * we can use _Per_CPU_Get_snapshot()). All other places must use * _Per_CPU_Get() so that we can add checks for RTEMS_DEBUG. */ -#define _Per_CPU_Get_snapshot() \ - ( &_Per_CPU_Information[ _SMP_Get_current_processor() ].per_cpu ) +#if defined( _CPU_Get_current_per_CPU_control ) + #define _Per_CPU_Get_snapshot() _CPU_Get_current_per_CPU_control() +#else + #define _Per_CPU_Get_snapshot() \ + ( &_Per_CPU_Information[ _SMP_Get_current_processor() ].per_cpu ) +#endif #if defined( RTEMS_SMP ) static inline Per_CPU_Control *_Per_CPU_Get( void ) |