This is the mail archive of the ecos-patches@sources.redhat.com mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]