This is the mail archive of the
ecos-patches@sources.redhat.com
mailing list for the eCos project.
SH HAL stack alignment (should have been in before)
- From: Jonathan Larmour <jlarmour at jifvik dot org>
- To: ecos-patches at sources dot redhat dot com
- Date: Wed, 2 Jul 2003 04:15:36 +0100
- Subject: SH HAL stack alignment (should have been in before)
Index: ChangeLog
===================================================================
RCS file: /cvs/ecos/ecos/packages/hal/sh/arch/current/ChangeLog,v
retrieving revision 1.43
diff -u -5 -p -r1.43 ChangeLog
--- ChangeLog 10 Apr 2003 18:07:57 -0000 1.43
+++ ChangeLog 2 Jul 2003 03:15:35 -0000
@@ -1,5 +1,11 @@
+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:
Added entry for .stack section in data section.
Index: include/hal_var_bank.h
===================================================================
RCS file: /cvs/ecos/ecos/packages/hal/sh/arch/current/include/hal_var_bank.h,v
retrieving revision 1.2
diff -u -5 -p -r1.2 hal_var_bank.h
--- include/hal_var_bank.h 23 May 2002 23:04:37 -0000 1.2
+++ include/hal_var_bank.h 2 Jul 2003 03:15:35 -0000
@@ -86,13 +86,17 @@ typedef struct
// _entry_ entry point address.
// _id_ bit pattern used in initializing registers, for debugging.
#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 */ \
(_regs_)->mach = 0; /* MACH = 0 */ \
(_regs_)->macl = 0; /* MACL = 0 */ \
Index: include/hal_var_sp.h
===================================================================
RCS file: /cvs/ecos/ecos/packages/hal/sh/arch/current/include/hal_var_sp.h,v
retrieving revision 1.2
diff -u -5 -p -r1.2 hal_var_sp.h
--- include/hal_var_sp.h 23 May 2002 23:04:38 -0000 1.2
+++ include/hal_var_sp.h 2 Jul 2003 03:15:35 -0000
@@ -91,13 +91,17 @@ typedef struct
// _entry_ entry point address.
// _id_ bit pattern used in initializing registers, for debugging.
#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 */ \
(_regs_)->mach = 0; /* MACH = 0 */ \
(_regs_)->macl = 0; /* MACL = 0 */ \