mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2025-12-05 15:15:44 +00:00
score: Enforce CPU_STACK_ALIGNMENT requirements
Clarify CPU_STACK_ALIGNMENT requirements in no_cpu port. Add static assertion to enforce CPU_STACK_ALIGNMENT requirements.
This commit is contained in:
@@ -292,19 +292,6 @@ typedef struct {
|
||||
*/
|
||||
#define CPU_HEAP_ALIGNMENT CPU_ALIGNMENT
|
||||
|
||||
/**
|
||||
* This number corresponds to the byte alignment requirement for the
|
||||
* stack. This alignment requirement may be stricter than that for the
|
||||
* data types alignment specified by @ref CPU_ALIGNMENT. If the
|
||||
* @ref CPU_ALIGNMENT is strict enough for the stack, then this should be
|
||||
* set to 0.
|
||||
*
|
||||
* @note This must be a power of 2 either 0 or greater than @ref CPU_ALIGNMENT.
|
||||
*
|
||||
* Port Specific Information:
|
||||
*
|
||||
* XXX document implementation including references if appropriate
|
||||
*/
|
||||
#define CPU_STACK_ALIGNMENT 8
|
||||
|
||||
#define CPU_INTERRUPT_STACK_ALIGNMENT CPU_CACHE_LINE_BYTES
|
||||
|
||||
@@ -401,16 +401,6 @@ extern Context_Control_fp _CPU_Null_fp_context;
|
||||
*/
|
||||
#define CPU_HEAP_ALIGNMENT CPU_ALIGNMENT
|
||||
|
||||
/**
|
||||
* This number corresponds to the byte alignment requirement for the
|
||||
* stack. This alignment requirement may be stricter than that for the
|
||||
* data types alignment specified by @ref CPU_ALIGNMENT.
|
||||
*
|
||||
*
|
||||
* Port Specific Information:
|
||||
*
|
||||
* Stack is software-managed
|
||||
*/
|
||||
#define CPU_STACK_ALIGNMENT CPU_ALIGNMENT
|
||||
|
||||
#define CPU_INTERRUPT_STACK_ALIGNMENT CPU_CACHE_LINE_BYTES
|
||||
|
||||
@@ -338,7 +338,7 @@ extern void* _VBR;
|
||||
* from the Workspace.
|
||||
*/
|
||||
|
||||
#define CPU_STACK_ALIGNMENT 0
|
||||
#define CPU_STACK_ALIGNMENT CPU_ALIGNMENT
|
||||
|
||||
#define CPU_INTERRUPT_STACK_ALIGNMENT CPU_CACHE_LINE_BYTES
|
||||
|
||||
|
||||
@@ -525,15 +525,6 @@ extern Context_Control_fp _CPU_Null_fp_context;
|
||||
|
||||
#define CPU_HEAP_ALIGNMENT CPU_ALIGNMENT
|
||||
|
||||
/*
|
||||
* This number corresponds to the byte alignment requirement for the
|
||||
* stack. This alignment requirement may be stricter than that for the
|
||||
* data types alignment specified by CPU_ALIGNMENT. If the CPU_ALIGNMENT
|
||||
* is strict enough for the stack, then this should be set to 0.
|
||||
*
|
||||
* NOTE: This must be a power of 2 either 0 or greater than CPU_ALIGNMENT.
|
||||
*/
|
||||
|
||||
#define CPU_STACK_ALIGNMENT CPU_ALIGNMENT
|
||||
|
||||
#define CPU_INTERRUPT_STACK_ALIGNMENT CPU_CACHE_LINE_BYTES
|
||||
|
||||
@@ -247,19 +247,7 @@ typedef struct {
|
||||
*/
|
||||
#define CPU_HEAP_ALIGNMENT CPU_ALIGNMENT
|
||||
|
||||
/*
|
||||
* This number corresponds to the byte alignment requirement for the
|
||||
* stack. This alignment requirement may be stricter than that for the
|
||||
* data types alignment specified by CPU_ALIGNMENT. If the CPU_ALIGNMENT
|
||||
* is strict enough for the stack, then this should be set to 0.
|
||||
*
|
||||
* NOTE: This must be a power of 2 either 0 or greater than CPU_ALIGNMENT.
|
||||
*
|
||||
* MOXIE Specific Information:
|
||||
*
|
||||
* XXX
|
||||
*/
|
||||
#define CPU_STACK_ALIGNMENT 0
|
||||
#define CPU_STACK_ALIGNMENT CPU_ALIGNMENT
|
||||
|
||||
#define CPU_INTERRUPT_STACK_ALIGNMENT CPU_CACHE_LINE_BYTES
|
||||
|
||||
|
||||
@@ -592,17 +592,16 @@ extern Context_Control_fp _CPU_Null_fp_context;
|
||||
/**
|
||||
* This number corresponds to the byte alignment requirement for the
|
||||
* stack. This alignment requirement may be stricter than that for the
|
||||
* data types alignment specified by @ref CPU_ALIGNMENT. If the
|
||||
* @ref CPU_ALIGNMENT is strict enough for the stack, then this should be
|
||||
* set to 0.
|
||||
* data types alignment specified by @ref CPU_ALIGNMENT.
|
||||
*
|
||||
* NOTE: This must be a power of 2 either 0 or greater than @ref CPU_ALIGNMENT.
|
||||
* NOTE: This must be a power of two and greater than or equal to
|
||||
* @ref CPU_HEAP_ALIGNMENT.
|
||||
*
|
||||
* Port Specific Information:
|
||||
*
|
||||
* XXX document implementation including references if appropriate
|
||||
*/
|
||||
#define CPU_STACK_ALIGNMENT 0
|
||||
#define CPU_STACK_ALIGNMENT CPU_HEAP_ALIGNMENT
|
||||
|
||||
/**
|
||||
* The alignment of the interrupt stack in bytes.
|
||||
|
||||
@@ -237,17 +237,7 @@ typedef Context_Control CPU_Interrupt_frame;
|
||||
|
||||
#define CPU_HEAP_ALIGNMENT CPU_ALIGNMENT
|
||||
|
||||
/*
|
||||
* This number corresponds to the byte alignment requirement for the
|
||||
* stack. This alignment requirement may be stricter than that for the
|
||||
* data types alignment specified by CPU_ALIGNMENT. If the CPU_ALIGNMENT
|
||||
* is strict enough for the stack, then this should be set to 0.
|
||||
*
|
||||
* NOTE: This must be a power of 2 either 0 or greater than CPU_ALIGNMENT.
|
||||
*
|
||||
*/
|
||||
|
||||
#define CPU_STACK_ALIGNMENT 0
|
||||
#define CPU_STACK_ALIGNMENT CPU_ALIGNMENT
|
||||
|
||||
#define CPU_INTERRUPT_STACK_ALIGNMENT CPU_CACHE_LINE_BYTES
|
||||
|
||||
|
||||
@@ -661,15 +661,6 @@ void ppc_set_interrupt_level( uint32_t level );
|
||||
|
||||
#define CPU_HEAP_ALIGNMENT (PPC_ALIGNMENT)
|
||||
|
||||
/*
|
||||
* This number corresponds to the byte alignment requirement for the
|
||||
* stack. This alignment requirement may be stricter than that for the
|
||||
* data types alignment specified by CPU_ALIGNMENT. If the CPU_ALIGNMENT
|
||||
* is strict enough for the stack, then this should be set to 0.
|
||||
*
|
||||
* NOTE: This must be a power of 2 either 0 or greater than CPU_ALIGNMENT.
|
||||
*/
|
||||
|
||||
#define CPU_STACK_ALIGNMENT (PPC_STACK_ALIGNMENT)
|
||||
|
||||
#define CPU_INTERRUPT_STACK_ALIGNMENT CPU_CACHE_LINE_BYTES
|
||||
|
||||
@@ -358,15 +358,6 @@ void CPU_delay( uint32_t microseconds );
|
||||
|
||||
#define CPU_HEAP_ALIGNMENT CPU_ALIGNMENT
|
||||
|
||||
/*
|
||||
* This number corresponds to the byte alignment requirement for the
|
||||
* stack. This alignment requirement may be stricter than that for the
|
||||
* data types alignment specified by CPU_ALIGNMENT. If the CPU_ALIGNMENT
|
||||
* is strict enough for the stack, then this should be set to 0.
|
||||
*
|
||||
* NOTE: This must be a power of 2 either 0 or greater than CPU_ALIGNMENT.
|
||||
*/
|
||||
|
||||
#define CPU_STACK_ALIGNMENT CPU_ALIGNMENT
|
||||
|
||||
#define CPU_INTERRUPT_STACK_ALIGNMENT CPU_CACHE_LINE_BYTES
|
||||
|
||||
@@ -635,13 +635,6 @@ extern const CPU_Trap_table_entry _CPU_Trap_slot_template;
|
||||
#define CPU_HEAP_ALIGNMENT CPU_ALIGNMENT
|
||||
|
||||
/*
|
||||
* This number corresponds to the byte alignment requirement for the
|
||||
* stack. This alignment requirement may be stricter than that for the
|
||||
* data types alignment specified by CPU_ALIGNMENT. If the CPU_ALIGNMENT
|
||||
* is strict enough for the stack, then this should be set to 0.
|
||||
*
|
||||
* NOTE: This must be a power of 2 either 0 or greater than CPU_ALIGNMENT.
|
||||
*
|
||||
* The alignment restrictions for the SPARC are not that strict but this
|
||||
* should unsure that the stack is always sufficiently alignment that the
|
||||
* window overflow, underflow, and flush routines can use double word loads
|
||||
|
||||
@@ -255,20 +255,10 @@ typedef struct {
|
||||
#define CPU_HEAP_ALIGNMENT CPU_ALIGNMENT
|
||||
|
||||
/**
|
||||
* This number corresponds to the byte alignment requirement for the
|
||||
* stack. This alignment requirement may be stricter than that for the
|
||||
* data types alignment specified by @ref CPU_ALIGNMENT. If the
|
||||
* @ref CPU_ALIGNMENT is strict enough for the stack, then this should be
|
||||
* set to 0.
|
||||
*
|
||||
* @note This must be a power of 2 either 0 or greater than @ref CPU_ALIGNMENT.
|
||||
*
|
||||
* Port Specific Information:
|
||||
*
|
||||
* The v850 has enough RAM where alignment to 16 may be desirable depending
|
||||
* on the cache properties. But this remains to be demonstrated.
|
||||
*/
|
||||
#define CPU_STACK_ALIGNMENT 4
|
||||
#define CPU_STACK_ALIGNMENT 8
|
||||
|
||||
#define CPU_INTERRUPT_STACK_ALIGNMENT CPU_CACHE_LINE_BYTES
|
||||
|
||||
|
||||
@@ -30,29 +30,21 @@
|
||||
#define _RTEMS_PERCPU_DEFINE_OFFSETS
|
||||
#include <rtems/score/percpu.h>
|
||||
|
||||
#define PER_CPU_IS_POWER_OF_TWO( value ) \
|
||||
( ( ( ( value ) - 1 ) & ( value ) ) == 0 )
|
||||
|
||||
/*
|
||||
* In case a CPU port needs another alignment, then add this here and make sure
|
||||
* it is a power of two greater than or equal to two.
|
||||
* The minimum alignment of two is due to the Heap Handler which uses the
|
||||
* HEAP_PREV_BLOCK_USED flag to indicate that the previous block is used.
|
||||
*/
|
||||
|
||||
RTEMS_STATIC_ASSERT(
|
||||
CPU_ALIGNMENT == 2
|
||||
|| CPU_ALIGNMENT == 4
|
||||
|| CPU_ALIGNMENT == 8
|
||||
|| CPU_ALIGNMENT == 16
|
||||
|| CPU_ALIGNMENT == 32,
|
||||
CPU_ALIGNMENT >= 2 && PER_CPU_IS_POWER_OF_TWO( CPU_ALIGNMENT ),
|
||||
CPU_ALIGNMENT
|
||||
);
|
||||
|
||||
/*
|
||||
* In case a CPU port needs another heap alignment, then add this here and make
|
||||
* sure it is a power of two greater than or equal to two.
|
||||
*/
|
||||
RTEMS_STATIC_ASSERT(
|
||||
CPU_HEAP_ALIGNMENT == 2
|
||||
|| CPU_HEAP_ALIGNMENT == 4
|
||||
|| CPU_HEAP_ALIGNMENT == 8
|
||||
|| CPU_HEAP_ALIGNMENT == 16
|
||||
|| CPU_HEAP_ALIGNMENT == 32,
|
||||
CPU_HEAP_ALIGNMENT >= 2 && PER_CPU_IS_POWER_OF_TWO( CPU_HEAP_ALIGNMENT ),
|
||||
CPU_HEAP_ALIGNMENT_0
|
||||
);
|
||||
|
||||
@@ -61,6 +53,12 @@ RTEMS_STATIC_ASSERT(
|
||||
CPU_HEAP_ALIGNMENT_1
|
||||
);
|
||||
|
||||
RTEMS_STATIC_ASSERT(
|
||||
CPU_STACK_ALIGNMENT >= CPU_HEAP_ALIGNMENT &&
|
||||
PER_CPU_IS_POWER_OF_TWO( CPU_STACK_ALIGNMENT ),
|
||||
CPU_STACK_ALIGNMENT
|
||||
);
|
||||
|
||||
RTEMS_STATIC_ASSERT(
|
||||
sizeof(void *) == CPU_SIZEOF_POINTER,
|
||||
CPU_SIZEOF_POINTER
|
||||
|
||||
Reference in New Issue
Block a user