changeset 2182:8d70f3959bf9

Fix default stack sizes - too small and didn't account for stack checking
author gthomas
date Tue, 18 Apr 2006 22:29:39 +0000
parents d9e9cf8adc85
children 1ad184c3a357
files packages/hal/powerpc/arch/current/ChangeLog packages/hal/powerpc/arch/current/include/hal_arch.h
diffstat 2 files changed, 23 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/packages/hal/powerpc/arch/current/ChangeLog
+++ b/packages/hal/powerpc/arch/current/ChangeLog
@@ -1,3 +1,8 @@
+2006-04-18  Gary Thomas  <gary@mlbassoc.com>
+
+	* include/hal_arch.h: Adjust stack sizes - they were too small
+	(on machines with FPU) and didn't account for stack checking.
+
 2005-07-29  Gary Thomas  <gary@mlbassoc.com>
 
 	* include/arch.inc: Add one-time-include protection since newer
--- a/packages/hal/powerpc/arch/current/include/hal_arch.h
+++ b/packages/hal/powerpc/arch/current/include/hal_arch.h
@@ -403,8 +403,13 @@ externC void hal_idle_thread_action(cyg_
     (38*4 /* offsetof(HAL_SavedRegisters, context_size) */)
 
 // Interrupt + call to ISR, interrupt_end() and the DSR
+#ifdef CYGHWR_HAL_POWERPC_FPU
+#define CYGNUM_HAL_STACK_INTERRUPT_SIZE \
+    (((43*4)+(16*8) /* sizeof(HAL_SavedRegisters) */) + 2 * CYGNUM_HAL_STACK_FRAME_SIZE)
+#else
 #define CYGNUM_HAL_STACK_INTERRUPT_SIZE \
     ((43*4 /* sizeof(HAL_SavedRegisters) */) + 2 * CYGNUM_HAL_STACK_FRAME_SIZE)
+#endif
 
 // We have lots of registers so no particular amount is added in for
 // typical local variable usage.
@@ -414,6 +419,12 @@ externC void hal_idle_thread_action(cyg_
 // than this. Allow enough for three interrupt sources - clock, serial and
 // one other
 
+#ifdef CYGFUN_KERNEL_THREADS_STACK_CHECKING
+#define CYGNUM_HAL_STACK_CHECKING_OVERHEAD (2*CYGNUM_KERNEL_THREADS_STACK_CHECK_DATA_SIZE)
+#else
+#define CYGNUM_HAL_STACK_CHECKING_OVERHEAD 0
+#endif
+
 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK 
 
 // An interrupt stack which is large enough for all possible interrupt
@@ -421,7 +432,9 @@ externC void hal_idle_thread_action(cyg_
 // can therefore be much smaller
 
 # define CYGNUM_HAL_STACK_SIZE_MINIMUM \
-         (16*CYGNUM_HAL_STACK_FRAME_SIZE + 2*CYGNUM_HAL_STACK_INTERRUPT_SIZE)
+         (16*CYGNUM_HAL_STACK_FRAME_SIZE + \
+          2*CYGNUM_HAL_STACK_INTERRUPT_SIZE + \
+          CYGNUM_HAL_STACK_CHECKING_OVERHEAD)
 
 #else
 
@@ -429,7 +442,8 @@ externC void hal_idle_thread_action(cyg_
 // a stack sufficiently large
 # define CYGNUM_HAL_STACK_SIZE_MINIMUM                  \
         (((2+3)*CYGNUM_HAL_STACK_INTERRUPT_SIZE) +      \
-         (16*CYGNUM_HAL_STACK_FRAME_SIZE))
+         (16*CYGNUM_HAL_STACK_FRAME_SIZE) +             \
+         CYGNUM_HAL_STACK_CHECKING_OVERHEAD)
 #endif
 
 // Now make a reasonable choice for a typical thread size. Pluck figures
@@ -437,7 +451,8 @@ externC void hal_idle_thread_action(cyg_
 // automatic variables per call frame
 #define CYGNUM_HAL_STACK_SIZE_TYPICAL                \
         (CYGNUM_HAL_STACK_SIZE_MINIMUM +             \
-         30 * (CYGNUM_HAL_STACK_FRAME_SIZE+(16*4)))
+         (30 * (CYGNUM_HAL_STACK_FRAME_SIZE+(16*4))) + \
+         CYGNUM_HAL_STACK_CHECKING_OVERHEAD)
 
 //--------------------------------------------------------------------------
 // Macros for switching context between two eCos instances (jump from