summaryrefslogtreecommitdiffstats
path: root/cpukit/score/src/threadstackallocate.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/score/src/threadstackallocate.c')
-rw-r--r--cpukit/score/src/threadstackallocate.c84
1 files changed, 84 insertions, 0 deletions
diff --git a/cpukit/score/src/threadstackallocate.c b/cpukit/score/src/threadstackallocate.c
new file mode 100644
index 0000000000..d8e21ea1f6
--- /dev/null
+++ b/cpukit/score/src/threadstackallocate.c
@@ -0,0 +1,84 @@
+/*
+ * Thread Handler - Stack Allocate Helper
+ *
+ * COPYRIGHT (c) 1989-2010.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/system.h>
+#include <rtems/score/apiext.h>
+#include <rtems/score/context.h>
+#include <rtems/score/interr.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/object.h>
+#include <rtems/score/priority.h>
+#include <rtems/score/states.h>
+#include <rtems/score/sysstate.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/threadq.h>
+#include <rtems/score/userext.h>
+#include <rtems/score/wkspace.h>
+#include <rtems/config.h>
+
+/*PAGE
+ *
+ * _Thread_Stack_Allocate
+ *
+ * Allocate the requested stack space for the thread.
+ * return the actual size allocated after any adjustment
+ * or return zero if the allocation failed.
+ * Set the Start.stack field to the address of the stack
+ */
+
+size_t _Thread_Stack_Allocate(
+ Thread_Control *the_thread,
+ size_t stack_size
+)
+{
+ void *stack_addr = 0;
+ size_t the_stack_size;
+
+ the_stack_size = _Stack_Ensure_minimum( stack_size );
+
+ /*
+ * Call ONLY the CPU table stack allocate hook, _or_ the
+ * the RTEMS workspace allocate. This is so the stack free
+ * routine can call the correct deallocation routine.
+ */
+
+ if ( Configuration.stack_allocate_hook ) {
+ stack_addr = (*Configuration.stack_allocate_hook)( the_stack_size );
+ } else {
+
+ /*
+ * First pad the requested size so we allocate enough memory
+ * so the context initialization can align it properly. The address
+ * returned the workspace allocate must be directly stored in the
+ * stack control block because it is later used in the free sequence.
+ *
+ * Thus it is the responsibility of the CPU dependent code to
+ * get and keep the stack adjust factor, the stack alignment, and
+ * the context initialization sequence in sync.
+ */
+
+ the_stack_size = _Stack_Adjust_size( the_stack_size );
+ stack_addr = _Workspace_Allocate( the_stack_size );
+ }
+
+ if ( !stack_addr )
+ the_stack_size = 0;
+
+ the_thread->Start.stack = stack_addr;
+
+ return the_stack_size;
+}