Mercurial > ecos
changeset 1089:a2fb6d1d07db
* 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.
| author | jlarmour |
|---|---|
| date | Wed, 02 Jul 2003 03:15:56 +0000 |
| parents | 4c13726203c5 |
| children | 6e9aef716a8b |
| files | packages/hal/sh/arch/current/ChangeLog packages/hal/sh/arch/current/include/hal_var_bank.h packages/hal/sh/arch/current/include/hal_var_sp.h |
| diffstat | 3 files changed, 16 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/packages/hal/sh/arch/current/ChangeLog +++ b/packages/hal/sh/arch/current/ChangeLog @@ -1,3 +1,9 @@ +2003-04-17 Jonathan Larmour <jifl@eCosCentric.com> + + * 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 <nickg@balti.calivar.com> * src/sh.ld:
--- 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 */ \
--- 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 */ \
