score: Delete _CPU_Context_Fp_start()

Since the FP area pointer is passed by reference in
_CPU_Context_Initialize_fp() the optional FP area adjustment via
_CPU_Context_Fp_start() is superfluous.  It is also wrong with respect
to memory management, e.g. pointer passed to _Workspace_Free() may be
not the one returned by _Workspace_Allocate().

Close #1400.
This commit is contained in:
Sebastian Huber
2017-01-25 14:32:02 +01:00
parent 7cb7454f93
commit 27bfcd88f7
18 changed files with 14 additions and 288 deletions

View File

@@ -458,9 +458,6 @@ void _CPU_Context_Initialize(
#define _CPU_Context_Restart_self( _the_context ) \ #define _CPU_Context_Restart_self( _the_context ) \
_CPU_Context_restore( (_the_context) ); _CPU_Context_restore( (_the_context) );
#define _CPU_Context_Fp_start( _base, _offset ) \
( (void *) _Addresses_Add_offset( (_base), (_offset) ) )
#define _CPU_Context_Initialize_fp( _destination ) \ #define _CPU_Context_Initialize_fp( _destination ) \
do { \ do { \
*(*(_destination)) = _CPU_Null_fp_context; \ *(*(_destination)) = _CPU_Null_fp_context; \

View File

@@ -734,31 +734,6 @@ void _CPU_Context_Initialize(
#define _CPU_Context_Restart_self( _the_context ) \ #define _CPU_Context_Restart_self( _the_context ) \
_CPU_Context_restore( (_the_context) ); _CPU_Context_restore( (_the_context) );
/**
* @ingroup CPUContext
* The purpose of this macro is to allow the initial pointer into
* a floating point context area (used to save the floating point
* context) to be at an arbitrary place in the floating point
* context area.
*
* This is necessary because some FP units are designed to have
* their context saved as a stack which grows into lower addresses.
* Other FP units can be saved by simply moving registers into offsets
* from the base of the context area. Finally some FP units provide
* a "dump context" instruction which could fill in from high to low
* or low to high based on the whim of the CPU designers.
*
* @param[in] _base is the lowest physical address of the floating point
* context area
* @param[in] _offset is the offset into the floating point area
*
* Port Specific Information:
*
* XXX document implementation including references if appropriate
*/
#define _CPU_Context_Fp_start( _base, _offset ) \
( (void *) _Addresses_Add_offset( (_base), (_offset) ) )
#define _CPU_Context_Initialize_fp( _destination ) \ #define _CPU_Context_Initialize_fp( _destination ) \
memset( *( _destination ), 0, CPU_CONTEXT_FP_SIZE ); memset( *( _destination ), 0, CPU_CONTEXT_FP_SIZE );

View File

@@ -624,24 +624,6 @@ void _CPU_Context_Initialize(
#define _CPU_Context_Restart_self( _the_context ) \ #define _CPU_Context_Restart_self( _the_context ) \
_CPU_Context_restore( (_the_context) ) _CPU_Context_restore( (_the_context) )
/*
* The purpose of this macro is to allow the initial pointer into
* a floating point context area (used to save the floating point
* context) to be at an arbitrary place in the floating point
* context area.
*
* This is necessary because some FP units are designed to have
* their context saved as a stack which grows into lower addresses.
* Other FP units can be saved by simply moving registers into offsets
* from the base of the context area. Finally some FP units provide
* a "dump context" instruction which could fill in from high to low
* or low to high based on the whim of the CPU designers.
*
*/
#define _CPU_Context_Fp_start( _base, _offset ) \
( (void *) _Addresses_Add_offset( (_base), (_offset) ) )
#define _CPU_Context_Initialize_fp( _destination ) \ #define _CPU_Context_Initialize_fp( _destination ) \
memset( *( _destination ), 0, CPU_CONTEXT_FP_SIZE ); memset( *( _destination ), 0, CPU_CONTEXT_FP_SIZE );

View File

@@ -508,9 +508,6 @@ uint32_t _CPU_ISR_Get_level( void );
} }
#endif #endif
#define _CPU_Context_Fp_start( _base, _offset ) \
( (void *) _Addresses_Add_offset( (_base), (_offset) ) )
#define _CPU_Context_Initialize_fp( _fp_area ) \ #define _CPU_Context_Initialize_fp( _fp_area ) \
{ \ { \
memcpy( *_fp_area, &_CPU_Null_fp_context, CPU_CONTEXT_FP_SIZE ); \ memcpy( *_fp_area, &_CPU_Null_fp_context, CPU_CONTEXT_FP_SIZE ); \

View File

@@ -748,33 +748,6 @@ extern char _gp[];
#define _CPU_Context_Restart_self( _the_context ) \ #define _CPU_Context_Restart_self( _the_context ) \
_CPU_Context_restore( (_the_context) ); _CPU_Context_restore( (_the_context) );
/**
* @ingroup CPUContext
* The purpose of this macro is to allow the initial pointer into
* a floating point context area (used to save the floating point
* context) to be at an arbitrary place in the floating point
* context area.
*
* This is necessary because some FP units are designed to have
* their context saved as a stack which grows into lower addresses.
* Other FP units can be saved by simply moving registers into offsets
* from the base of the context area. Finally some FP units provide
* a "dump context" instruction which could fill in from high to low
* or low to high based on the whim of the CPU designers.
*
* @param[in] _base is the lowest physical address of the floating point
* context area
* @param[in] _offset is the offset into the floating point area
*
* Port Specific Information:
*
* XXX document implementation including references if appropriate
*/
#define _CPU_Context_Fp_start( _base, _offset )
#if 0
( (void *) _Addresses_Add_offset( (_base), (_offset) ) )
#endif
/** /**
* This routine initializes the FP context area passed to it to. * This routine initializes the FP context area passed to it to.
* There are a few standard ways in which to initialize the * There are a few standard ways in which to initialize the

View File

@@ -739,32 +739,6 @@ void _CPU_Context_Restart_self(
Context_Control *the_context Context_Control *the_context
) RTEMS_NO_RETURN; ) RTEMS_NO_RETURN;
/**
* @ingroup CPUContext
*
* The purpose of this macro is to allow the initial pointer into
* a floating point context area (used to save the floating point
* context) to be at an arbitrary place in the floating point
* context area.
*
* This is necessary because some FP units are designed to have
* their context saved as a stack which grows into lower addresses.
* Other FP units can be saved by simply moving registers into offsets
* from the base of the context area. Finally some FP units provide
* a "dump context" instruction which could fill in from high to low
* or low to high based on the whim of the CPU designers.
*
* @param[in] _base is the lowest physical address of the floating point
* context area
* @param[in] _offset is the offset into the floating point area
*
* Port Specific Information:
*
* XXX document implementation including references if appropriate
*/
#define _CPU_Context_Fp_start( _base, _offset ) \
( (void *) _Addresses_Add_offset( (_base), (_offset) ) )
/** /**
* This routine initializes the FP context area passed to it to. * This routine initializes the FP context area passed to it to.
* There are a few standard ways in which to initialize the * There are a few standard ways in which to initialize the

View File

@@ -172,12 +172,6 @@ typedef struct {
} _operand2; } _operand2;
} Context_Control_fp; } Context_Control_fp;
/*
* This software FP implementation is only for GCC.
*/
#define _CPU_Context_Fp_start( _base, _offset ) \
((void *) _Addresses_Add_offset( (_base), (_offset) ) )
#define _CPU_Context_Initialize_fp( _fp_area ) \ #define _CPU_Context_Initialize_fp( _fp_area ) \
{ \ { \
Context_Control_fp *_fp; \ Context_Control_fp *_fp; \
@@ -234,9 +228,6 @@ typedef struct {
#endif #endif
} Context_Control_fp; } Context_Control_fp;
#define _CPU_Context_Fp_start( _base, _offset ) \
((void *) _Addresses_Add_offset( (_base), (_offset) ))
/* /*
* The reset value for all context relevant registers except the FP data * The reset value for all context relevant registers except the FP data
* registers is zero. The reset value of the FP data register is NAN. The * registers is zero. The reset value of the FP data register is NAN. The
@@ -260,17 +251,15 @@ typedef struct {
uint8_t fp_save_area [M68K_FP_STATE_SIZE + 112]; uint8_t fp_save_area [M68K_FP_STATE_SIZE + 112];
} Context_Control_fp; } Context_Control_fp;
#define _CPU_Context_Fp_start( _base, _offset ) \ /*
( \ * The floating-point context is saved/restored via FSAVE/FRESTORE which
(void *) _Addresses_Add_offset( \ * use a growing down stack. Initialize the stack and adjust the FP area
(_base), \ * pointer accordingly.
(_offset) + CPU_CONTEXT_FP_SIZE - 4 \ */
) \
)
#define _CPU_Context_Initialize_fp( _fp_area ) \ #define _CPU_Context_Initialize_fp( _fp_area ) \
{ \ { \
uint32_t *_fp_context = (uint32_t *)*(_fp_area); \ uint32_t *_fp_context = _Addresses_Add_offset( \
*(_fp_area), CPU_CONTEXT_FP_SIZE - 4); \
*(--(_fp_context)) = 0; \ *(--(_fp_context)) = 0; \
*(_fp_area) = (void *)(_fp_context); \ *(_fp_area) = (void *)(_fp_context); \
} }

View File

@@ -791,23 +791,6 @@ void _CPU_Context_Initialize(
#define _CPU_Context_Restart_self( _the_context ) \ #define _CPU_Context_Restart_self( _the_context ) \
_CPU_Context_restore( (_the_context) ); _CPU_Context_restore( (_the_context) );
/*
* The purpose of this macro is to allow the initial pointer into
* A floating point context area (used to save the floating point
* context) to be at an arbitrary place in the floating point
* context area.
*
* This is necessary because some FP units are designed to have
* their context saved as a stack which grows into lower addresses.
* Other FP units can be saved by simply moving registers into offsets
* from the base of the context area. Finally some FP units provide
* a "dump context" instruction which could fill in from high to low
* or low to high based on the whim of the CPU designers.
*/
#define _CPU_Context_Fp_start( _base, _offset ) \
( (void *) _Addresses_Add_offset( (_base), (_offset) ) )
/* /*
* This routine initializes the FP context area passed to it to. * This routine initializes the FP context area passed to it to.
* There are a few standard ways in which to initialize the * There are a few standard ways in which to initialize the

View File

@@ -608,26 +608,6 @@ uint32_t _CPU_ISR_Get_level( void );
#define _CPU_Context_Restart_self( _the_context ) \ #define _CPU_Context_Restart_self( _the_context ) \
_CPU_Context_restore( (_the_context) ); _CPU_Context_restore( (_the_context) );
/*
* The purpose of this macro is to allow the initial pointer into
* a floating point context area (used to save the floating point
* context) to be at an arbitrary place in the floating point
* context area.
*
* This is necessary because some FP units are designed to have
* their context saved as a stack which grows into lower addresses.
* Other FP units can be saved by simply moving registers into offsets
* from the base of the context area. Finally some FP units provide
* a "dump context" instruction which could fill in from high to low
* or low to high based on the whim of the CPU designers.
*
* MOXIE Specific Information:
*
* XXX
*/
#define _CPU_Context_Fp_start( _base, _offset ) \
( (void *) (_base) + (_offset) )
#define _CPU_Context_Initialize_fp( _destination ) \ #define _CPU_Context_Initialize_fp( _destination ) \
memset( *( _destination ), 0, CPU_CONTEXT_FP_SIZE ); memset( *( _destination ), 0, CPU_CONTEXT_FP_SIZE );

View File

@@ -875,32 +875,6 @@ uint32_t _CPU_ISR_Get_level( void );
#define _CPU_Context_Restart_self( _the_context ) \ #define _CPU_Context_Restart_self( _the_context ) \
_CPU_Context_restore( (_the_context) ); _CPU_Context_restore( (_the_context) );
/**
* @ingroup CPUContext
*
* The purpose of this macro is to allow the initial pointer into
* a floating point context area (used to save the floating point
* context) to be at an arbitrary place in the floating point
*context area.
*
* This is necessary because some FP units are designed to have
* their context saved as a stack which grows into lower addresses.
* Other FP units can be saved by simply moving registers into offsets
* from the base of the context area. Finally some FP units provide
* a "dump context" instruction which could fill in from high to low
* or low to high based on the whim of the CPU designers.
*
* @param[in] _base is the lowest physical address of the floating point
* context area
* @param[in] _offset is the offset into the floating point area
*
* Port Specific Information:
*
* XXX document implementation including references if appropriate
*/
#define _CPU_Context_Fp_start( _base, _offset ) \
( (void *) _Addresses_Add_offset( (_base), (_offset) ) )
/** /**
* This routine initializes the FP context area passed to it to. * This routine initializes the FP context area passed to it to.
* There are a few standard ways in which to initialize the * There are a few standard ways in which to initialize the

View File

@@ -620,10 +620,11 @@ void _CPU_Context_Initialize(
_CPU_Context_restore( (_the_context) ); _CPU_Context_restore( (_the_context) );
/* /*
* The purpose of this macro is to allow the initial pointer into * This routine is responsible to initialize the FP context.
* a floating point context area (used to save the floating point *
* context) to be at an arbitrary place in the floating point * The FP area pointer is passed by reference to allow the initial pointer
* context area. * into a floating point context area (used to save the floating point
* context) to be at an arbitrary place in the floating point context area.
* *
* This is necessary because some FP units are designed to have * This is necessary because some FP units are designed to have
* their context saved as a stack which grows into lower addresses. * their context saved as a stack which grows into lower addresses.
@@ -631,14 +632,9 @@ void _CPU_Context_Initialize(
* from the base of the context area. Finally some FP units provide * from the base of the context area. Finally some FP units provide
* a "dump context" instruction which could fill in from high to low * a "dump context" instruction which could fill in from high to low
* or low to high based on the whim of the CPU designers. * or low to high based on the whim of the CPU designers.
*
*/ */
#define _CPU_Context_Initialize_fp( _fp_area_p ) \
#define _CPU_Context_Fp_start( _base, _offset ) \ memset( *( _fp_area_p ), 0, CPU_CONTEXT_FP_SIZE )
( (void *) _Addresses_Add_offset( (_base), (_offset) ) )
#define _CPU_Context_Initialize_fp( _destination ) \
memset( *( _destination ), 0, CPU_CONTEXT_FP_SIZE );
/* end of Context handler macros */ /* end of Context handler macros */

View File

@@ -830,23 +830,6 @@ void _CPU_Context_Initialize(
#define _CPU_Context_Restart_self( _the_context ) \ #define _CPU_Context_Restart_self( _the_context ) \
_CPU_Context_restore( (_the_context) ); _CPU_Context_restore( (_the_context) );
/*
* The purpose of this macro is to allow the initial pointer into
* a floating point context area (used to save the floating point
* context) to be at an arbitrary place in the floating point
* context area.
*
* This is necessary because some FP units are designed to have
* their context saved as a stack which grows into lower addresses.
* Other FP units can be saved by simply moving registers into offsets
* from the base of the context area. Finally some FP units provide
* a "dump context" instruction which could fill in from high to low
* or low to high based on the whim of the CPU designers.
*/
#define _CPU_Context_Fp_start( _base, _offset ) \
( (void *) _Addresses_Add_offset( (_base), (_offset) ) )
/* /*
* This routine initializes the FP context area passed to it to. * This routine initializes the FP context area passed to it to.
* There are a few standard ways in which to initialize the * There are a few standard ways in which to initialize the

View File

@@ -549,23 +549,6 @@ void _CPU_Context_Initialize(
#define _CPU_Context_Restart_self( _the_context ) \ #define _CPU_Context_Restart_self( _the_context ) \
_CPU_Context_restore( (_the_context) ); _CPU_Context_restore( (_the_context) );
/*
* The purpose of this macro is to allow the initial pointer into
* a floating point context area (used to save the floating point
* context) to be at an arbitrary place in the floating point
* context area.
*
* This is necessary because some FP units are designed to have
* their context saved as a stack which grows into lower addresses.
* Other FP units can be saved by simply moving registers into offsets
* from the base of the context area. Finally some FP units provide
* a "dump context" instruction which could fill in from high to low
* or low to high based on the whim of the CPU designers.
*/
#define _CPU_Context_Fp_start( _base, _offset ) \
( (void *) _Addresses_Add_offset( (_base), (_offset) ) )
/* /*
* This routine initializes the FP context area passed to it to. * This routine initializes the FP context area passed to it to.
* There are a few standard ways in which to initialize the * There are a few standard ways in which to initialize the

View File

@@ -955,13 +955,6 @@ void _CPU_Context_Initialize(
#define _CPU_Context_Restart_self( _the_context ) \ #define _CPU_Context_Restart_self( _the_context ) \
_CPU_Context_restore( (_the_context) ); _CPU_Context_restore( (_the_context) );
/**
* The FP context area for the SPARC is a simple structure and nothing
* special is required to find the "starting load point"
*/
#define _CPU_Context_Fp_start( _base, _offset ) \
( (void *) _Addresses_Add_offset( (_base), (_offset) ) )
/** /**
* This routine initializes the FP context area passed to it to. * This routine initializes the FP context area passed to it to.
* *

View File

@@ -823,14 +823,6 @@ void _CPU_Context_Initialize(
#define _CPU_Context_Restart_self( _the_context ) \ #define _CPU_Context_Restart_self( _the_context ) \
_CPU_Context_restore( (_the_context) ); _CPU_Context_restore( (_the_context) );
/*
* The FP context area for the SPARC is a simple structure and nothing
* special is required to find the "starting load point"
*/
#define _CPU_Context_Fp_start( _base, _offset ) \
( (void *) _Addresses_Add_offset( (_base), (_offset) ) )
/* /*
* This routine initializes the FP context area passed to it to. * This routine initializes the FP context area passed to it to.
* *

View File

@@ -696,34 +696,6 @@ void _CPU_Context_Initialize(
#define _CPU_Context_Restart_self( _the_context ) \ #define _CPU_Context_Restart_self( _the_context ) \
_CPU_Context_restore( (_the_context) ); _CPU_Context_restore( (_the_context) );
/* XXX this should be possible to remove */
#if 0
/**
* @ingroup CPUContext
* The purpose of this macro is to allow the initial pointer into
* a floating point context area (used to save the floating point
* context) to be at an arbitrary place in the floating point
* context area.
*
* This is necessary because some FP units are designed to have
* their context saved as a stack which grows into lower addresses.
* Other FP units can be saved by simply moving registers into offsets
* from the base of the context area. Finally some FP units provide
* a "dump context" instruction which could fill in from high to low
* or low to high based on the whim of the CPU designers.
*
* @param[in] _base is the lowest physical address of the floating point
* context area
* @param[in] _offset is the offset into the floating point area
*
* Port Specific Information:
*
* XXX document implementation including references if appropriate
*/
#define _CPU_Context_Fp_start( _base, _offset ) \
( (void *) _Addresses_Add_offset( (_base), (_offset) ) )
#endif
/* XXX this should be possible to remove */ /* XXX this should be possible to remove */
#if 0 #if 0
/** /**

View File

@@ -110,22 +110,6 @@ extern "C" {
#define _Context_Restart_self( _the_context ) \ #define _Context_Restart_self( _the_context ) \
_CPU_Context_Restart_self( _the_context ) _CPU_Context_Restart_self( _the_context )
/**
* @brief Return starting address of floating point context.
*
* This function returns the starting address of the floating
* point context save area. It is assumed that the are reserved
* for the floating point save area is large enough.
*
* @param[in] _base is lowest physical address of the floating point
* context save area.
* @param[in] _offset is the offset into the floating point area
*
* @retval the initial FP context pointer
*/
#define _Context_Fp_start( _base, _offset ) \
_CPU_Context_Fp_start( (_base), (_offset) )
/** /**
* @brief Initialize floating point context area. * @brief Initialize floating point context area.
* *

View File

@@ -137,7 +137,6 @@ bool _Thread_Initialize(
fp_area = _Workspace_Allocate( CONTEXT_FP_SIZE ); fp_area = _Workspace_Allocate( CONTEXT_FP_SIZE );
if ( !fp_area ) if ( !fp_area )
goto failed; goto failed;
fp_area = _Context_Fp_start( fp_area, 0 );
} }
the_thread->fp_context = fp_area; the_thread->fp_context = fp_area;
the_thread->Start.fp_context = fp_area; the_thread->Start.fp_context = fp_area;