# HG changeset patch # User jlarmour # Date 1057115756 0 # Node ID a2fb6d1d07dbd517d1aad1299a1ea347809b4ea0 # Parent 4c13726203c50c927fa7b184dcb40de830f279c6 * include/hal_var_bank.h (HAL_THREAD_INIT_CONTEXT): Align stack pointer before using it. * include/hal_var_sp.h (HAL_THREAD_INIT_CONTEXT): Ditto. diff --git a/packages/hal/sh/arch/current/ChangeLog b/packages/hal/sh/arch/current/ChangeLog --- a/packages/hal/sh/arch/current/ChangeLog +++ b/packages/hal/sh/arch/current/ChangeLog @@ -1,3 +1,9 @@ +2003-04-17 Jonathan Larmour + + * include/hal_var_bank.h (HAL_THREAD_INIT_CONTEXT): Align stack + pointer before using it. + * include/hal_var_sp.h (HAL_THREAD_INIT_CONTEXT): Ditto. + 2003-04-10 Nick Garnett * src/sh.ld: diff --git a/packages/hal/sh/arch/current/include/hal_var_bank.h b/packages/hal/sh/arch/current/include/hal_var_bank.h --- a/packages/hal/sh/arch/current/include/hal_var_bank.h +++ b/packages/hal/sh/arch/current/include/hal_var_bank.h @@ -88,9 +88,13 @@ typedef struct #define HAL_THREAD_INIT_CONTEXT( _sparg_, _thread_, _entry_, _id_ ) \ CYG_MACRO_START \ + register CYG_WORD _sp_ = (CYG_WORD)_sparg_; \ register HAL_SavedRegisters *_regs_; \ int _i_; \ - _regs_ = (HAL_SavedRegisters *)((_sparg_) - sizeof(HAL_SavedRegisters)); \ + _sp_ = _sp_ & ~(CYGARC_ALIGNMENT-1); \ + /* Note that _regs_ below should be aligned if HAL_SavedRegisters */ \ + /* stops being aligned to CYGARC_ALIGNMENT */ \ + _regs_ = (HAL_SavedRegisters *)((_sp_) - sizeof(HAL_SavedRegisters)); \ for( _i_ = 0; _i_ < 16; _i_++ ) (_regs_)->r[_i_] = (_id_)|_i_; \ (_regs_)->r[15] = (CYG_WORD)(_regs_); /* SP = top of stack */ \ (_regs_)->r[04] = (CYG_WORD)(_thread_); /* R4 = arg1 = thread ptr */ \ diff --git a/packages/hal/sh/arch/current/include/hal_var_sp.h b/packages/hal/sh/arch/current/include/hal_var_sp.h --- a/packages/hal/sh/arch/current/include/hal_var_sp.h +++ b/packages/hal/sh/arch/current/include/hal_var_sp.h @@ -93,9 +93,13 @@ typedef struct #define HAL_THREAD_INIT_CONTEXT( _sparg_, _thread_, _entry_, _id_ ) \ CYG_MACRO_START \ + register CYG_WORD _sp_ = (CYG_WORD)_sparg_; \ register HAL_SavedRegisters *_regs_; \ int _i_; \ - _regs_ = (HAL_SavedRegisters *)((_sparg_) - sizeof(HAL_SavedRegisters)); \ + _sp_ = _sp_ & ~(CYGARC_ALIGNMENT-1); \ + /* Note that _regs_ below should be aligned if HAL_SavedRegisters */ \ + /* stops being aligned to CYGARC_ALIGNMENT */ \ + _regs_ = (HAL_SavedRegisters *)((_sp_) - sizeof(HAL_SavedRegisters)); \ for( _i_ = 0; _i_ < 16; _i_++ ) (_regs_)->r[_i_] = (_id_)|_i_; \ (_regs_)->r[15] = (CYG_WORD)(_regs_); /* SP = top of stack */ \ (_regs_)->r[04] = (CYG_WORD)(_thread_); /* R4 = arg1 = thread ptr */ \