|
@@ -100,6 +100,16 @@ struct thread_struct {
|
|
|
.fs = __KERNEL_DS, \
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * ColdFire stack format sbould be 0x4 for an aligned usp (will always be
|
|
|
+ * true on thread creation). We need to set this explicitly.
|
|
|
+ */
|
|
|
+#ifdef CONFIG_COLDFIRE
|
|
|
+#define setframeformat(_regs) do { (_regs)->format = 0x4; } while(0)
|
|
|
+#else
|
|
|
+#define setframeformat(_regs) do { } while (0)
|
|
|
+#endif
|
|
|
+
|
|
|
#ifdef CONFIG_MMU
|
|
|
/*
|
|
|
* Do necessary setup to start up a newly executed thread.
|
|
@@ -109,6 +119,7 @@ static inline void start_thread(struct pt_regs * regs, unsigned long pc,
|
|
|
{
|
|
|
regs->pc = pc;
|
|
|
regs->sr &= ~0x2000;
|
|
|
+ setframeformat(regs);
|
|
|
wrusp(usp);
|
|
|
}
|
|
|
|
|
@@ -116,21 +127,11 @@ extern int handle_kernel_fault(struct pt_regs *regs);
|
|
|
|
|
|
#else
|
|
|
|
|
|
-/*
|
|
|
- * Coldfire stacks need to be re-aligned on trap exit, conventional
|
|
|
- * 68k can handle this case cleanly.
|
|
|
- */
|
|
|
-#ifdef CONFIG_COLDFIRE
|
|
|
-#define reformat(_regs) do { (_regs)->format = 0x4; } while(0)
|
|
|
-#else
|
|
|
-#define reformat(_regs) do { } while (0)
|
|
|
-#endif
|
|
|
-
|
|
|
#define start_thread(_regs, _pc, _usp) \
|
|
|
do { \
|
|
|
(_regs)->pc = (_pc); \
|
|
|
((struct switch_stack *)(_regs))[-1].a6 = 0; \
|
|
|
- reformat(_regs); \
|
|
|
+ setframeformat(_regs); \
|
|
|
if (current->mm) \
|
|
|
(_regs)->d5 = current->mm->start_data; \
|
|
|
(_regs)->sr &= ~0x2000; \
|