Mercurial > ecos
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
