summaryrefslogtreecommitdiff
path: root/cpukit/score/src/threadinitialize.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/score/src/threadinitialize.c')
-rw-r--r--cpukit/score/src/threadinitialize.c39
1 files changed, 17 insertions, 22 deletions
diff --git a/cpukit/score/src/threadinitialize.c b/cpukit/score/src/threadinitialize.c
index c6e8abf979..48444824b2 100644
--- a/cpukit/score/src/threadinitialize.c
+++ b/cpukit/score/src/threadinitialize.c
@@ -43,9 +43,6 @@ bool _Thread_Initialize(
)
{
uintptr_t tls_size = _TLS_Get_size();
- #if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
- void *fp_area = NULL;
- #endif
bool extension_status;
size_t i;
Scheduler_Node *scheduler_node;
@@ -91,6 +88,13 @@ bool _Thread_Initialize(
if ( stack_area == NULL ) {
#endif
stack_size = _Stack_Ensure_minimum( stack_size );
+
+#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
+ if ( is_fp ) {
+ stack_size += CONTEXT_FP_SIZE;
+ }
+#endif
+
stack_area = _Stack_Allocate( stack_size );
if ( stack_area == NULL ) {
@@ -102,6 +106,16 @@ bool _Thread_Initialize(
}
#endif
+ /* Allocate floating-point context in stack area */
+#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
+ if ( is_fp ) {
+ the_thread->fp_context = stack_area;
+ the_thread->Start.fp_context = stack_area;
+ stack_size -= CONTEXT_FP_SIZE;
+ stack_area = (char *) stack_area + CONTEXT_FP_SIZE;
+ }
+#endif
+
_Stack_Initialize(
&the_thread->Start.Initial_stack,
stack_area,
@@ -124,19 +138,6 @@ bool _Thread_Initialize(
}
/*
- * Allocate the floating point area for this thread
- */
- #if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
- if ( is_fp ) {
- fp_area = _Workspace_Allocate( CONTEXT_FP_SIZE );
- if ( !fp_area )
- goto failed;
- }
- the_thread->fp_context = fp_area;
- the_thread->Start.fp_context = fp_area;
- #endif
-
- /*
* Get thread queue heads
*/
the_thread->Wait.spare_heads = _Freechain_Get(
@@ -301,16 +302,10 @@ failed:
#endif
_Workspace_Free( the_thread->Start.tls_area );
-
_Freechain_Put(
&information->Thread_queue_heads.Free,
the_thread->Wait.spare_heads
);
-
- #if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
- _Workspace_Free( fp_area );
- #endif
-
_Stack_Free( the_thread->Start.allocated_stack );
return false;
}