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 */   \