diff options
author | Greg Ungerer <gerg@uclinux.org> | 2011-05-05 08:32:12 -0400 |
---|---|---|
committer | Greg Ungerer <gerg@uclinux.org> | 2011-07-24 21:20:40 -0400 |
commit | f941f5caa0e947f4ed060a751ca4a3bf552af625 (patch) | |
tree | f6811757e568e74307abd39534b1d7e7813c8d0f /arch/m68k/platform | |
parent | 10f939ff3ab80514da3bd96357bb54a8a59b9225 (diff) |
m68k: merge MMU and non MMU versions of system.h
The non-MMU m68k targets can use the same asm/system.h as the MMU
targets. So switch the current system_mm.h to be system.h and remove
system_no.h.
The assembly support code for the non-MMU resume functions needs to
be modified to match the now common switch_to() macro. Specifically
this means correctly saving and restoring the status flags in the case
of the ColdFire resume, and some reordering of the code to not use
registers before they are saved or after they are restored.
Signed-off-by: Greg Ungerer <gerg@uclinux.org>
Diffstat (limited to 'arch/m68k/platform')
-rw-r--r-- | arch/m68k/platform/68328/entry.S | 13 | ||||
-rw-r--r-- | arch/m68k/platform/68360/entry.S | 13 | ||||
-rw-r--r-- | arch/m68k/platform/coldfire/entry.S | 24 |
3 files changed, 25 insertions, 25 deletions
diff --git a/arch/m68k/platform/68328/entry.S b/arch/m68k/platform/68328/entry.S index f68dce766c0a..4ed7a65d5aa0 100644 --- a/arch/m68k/platform/68328/entry.S +++ b/arch/m68k/platform/68328/entry.S | |||
@@ -241,22 +241,21 @@ ENTRY(bad_interrupt) | |||
241 | 241 | ||
242 | /* | 242 | /* |
243 | * Beware - when entering resume, prev (the current task) is | 243 | * Beware - when entering resume, prev (the current task) is |
244 | * in a0, next (the new task) is in a1,so don't change these | 244 | * in a0, next (the new task) is in a1, so don't change these |
245 | * registers until their contents are no longer needed. | 245 | * registers until their contents are no longer needed. |
246 | */ | 246 | */ |
247 | ENTRY(resume) | 247 | ENTRY(resume) |
248 | movel %a0,%d1 /* save prev thread in d1 */ | 248 | movel %a0,%d1 /* save prev thread in d1 */ |
249 | movew %sr,%a0@(TASK_THREAD+THREAD_SR) /* save sr */ | 249 | movew %sr,%a0@(TASK_THREAD+THREAD_SR) /* save sr */ |
250 | movel %usp,%a2 /* save usp */ | ||
251 | movel %a2,%a0@(TASK_THREAD+THREAD_USP) | ||
252 | |||
253 | SAVE_SWITCH_STACK | 250 | SAVE_SWITCH_STACK |
254 | movel %sp,%a0@(TASK_THREAD+THREAD_KSP) /* save kernel stack */ | 251 | movel %sp,%a0@(TASK_THREAD+THREAD_KSP) /* save kernel stack */ |
252 | movel %usp,%a3 /* save usp */ | ||
253 | movel %a3,%a0@(TASK_THREAD+THREAD_USP) | ||
254 | |||
255 | movel %a1@(TASK_THREAD+THREAD_USP),%a3 /* restore user stack */ | ||
256 | movel %a3,%usp | ||
255 | movel %a1@(TASK_THREAD+THREAD_KSP),%sp /* restore new thread stack */ | 257 | movel %a1@(TASK_THREAD+THREAD_KSP),%sp /* restore new thread stack */ |
256 | RESTORE_SWITCH_STACK | 258 | RESTORE_SWITCH_STACK |
257 | |||
258 | movel %a1@(TASK_THREAD+THREAD_USP),%a0 /* restore user stack */ | ||
259 | movel %a0,%usp | ||
260 | movew %a1@(TASK_THREAD+THREAD_SR),%sr /* restore thread status reg */ | 259 | movew %a1@(TASK_THREAD+THREAD_SR),%sr /* restore thread status reg */ |
261 | rts | 260 | rts |
262 | 261 | ||
diff --git a/arch/m68k/platform/68360/entry.S b/arch/m68k/platform/68360/entry.S index a07b14feed92..0ede6702127a 100644 --- a/arch/m68k/platform/68360/entry.S +++ b/arch/m68k/platform/68360/entry.S | |||
@@ -162,22 +162,21 @@ bad_interrupt: | |||
162 | 162 | ||
163 | /* | 163 | /* |
164 | * Beware - when entering resume, prev (the current task) is | 164 | * Beware - when entering resume, prev (the current task) is |
165 | * in a0, next (the new task) is in a1,so don't change these | 165 | * in a0, next (the new task) is in a1, so don't change these |
166 | * registers until their contents are no longer needed. | 166 | * registers until their contents are no longer needed. |
167 | */ | 167 | */ |
168 | ENTRY(resume) | 168 | ENTRY(resume) |
169 | movel %a0,%d1 /* save prev thread in d1 */ | 169 | movel %a0,%d1 /* save prev thread in d1 */ |
170 | movew %sr,%a0@(TASK_THREAD+THREAD_SR) /* save sr */ | 170 | movew %sr,%a0@(TASK_THREAD+THREAD_SR) /* save sr */ |
171 | movel %usp,%a2 /* save usp */ | ||
172 | movel %a2,%a0@(TASK_THREAD+THREAD_USP) | ||
173 | |||
174 | SAVE_SWITCH_STACK | 171 | SAVE_SWITCH_STACK |
175 | movel %sp,%a0@(TASK_THREAD+THREAD_KSP) /* save kernel stack */ | 172 | movel %sp,%a0@(TASK_THREAD+THREAD_KSP) /* save kernel stack */ |
173 | movel %usp,%a3 /* save usp */ | ||
174 | movel %a3,%a0@(TASK_THREAD+THREAD_USP) | ||
175 | |||
176 | movel %a1@(TASK_THREAD+THREAD_USP),%a3 /* restore user stack */ | ||
177 | movel %a3,%usp | ||
176 | movel %a1@(TASK_THREAD+THREAD_KSP),%sp /* restore new thread stack */ | 178 | movel %a1@(TASK_THREAD+THREAD_KSP),%sp /* restore new thread stack */ |
177 | RESTORE_SWITCH_STACK | 179 | RESTORE_SWITCH_STACK |
178 | |||
179 | movel %a1@(TASK_THREAD+THREAD_USP),%a0 /* restore user stack */ | ||
180 | movel %a0,%usp | ||
181 | movew %a1@(TASK_THREAD+THREAD_SR),%sr /* restore thread status reg */ | 180 | movew %a1@(TASK_THREAD+THREAD_SR),%sr /* restore thread status reg */ |
182 | rts | 181 | rts |
183 | 182 | ||
diff --git a/arch/m68k/platform/coldfire/entry.S b/arch/m68k/platform/coldfire/entry.S index 27c2b001161e..bd27242c2f43 100644 --- a/arch/m68k/platform/coldfire/entry.S +++ b/arch/m68k/platform/coldfire/entry.S | |||
@@ -182,21 +182,23 @@ ENTRY(inthandler) | |||
182 | 182 | ||
183 | /* | 183 | /* |
184 | * Beware - when entering resume, prev (the current task) is | 184 | * Beware - when entering resume, prev (the current task) is |
185 | * in a0, next (the new task) is in a1,so don't change these | 185 | * in a0, next (the new task) is in a1, so don't change these |
186 | * registers until their contents are no longer needed. | 186 | * registers until their contents are no longer needed. |
187 | * This is always called in supervisor mode, so don't bother to save | ||
188 | * and restore sr; user's process sr is actually in the stack. | ||
189 | */ | 187 | */ |
190 | ENTRY(resume) | 188 | ENTRY(resume) |
191 | movel %a0, %d1 /* get prev thread in d1 */ | 189 | movew %sr,%d1 /* save current status */ |
192 | RDUSP | 190 | movew %d1,%a0@(TASK_THREAD+THREAD_SR) |
193 | movel %a2,%a0@(TASK_THREAD+THREAD_USP) | 191 | movel %a0,%d1 /* get prev thread in d1 */ |
194 | |||
195 | SAVE_SWITCH_STACK | 192 | SAVE_SWITCH_STACK |
196 | movel %sp,%a0@(TASK_THREAD+THREAD_KSP) /* save kernel stack pointer */ | 193 | movel %sp,%a0@(TASK_THREAD+THREAD_KSP) /* save kernel stack pointer */ |
197 | movel %a1@(TASK_THREAD+THREAD_KSP),%sp /* restore new thread stack */ | 194 | RDUSP /* movel %usp,%a3 */ |
195 | movel %a3,%a0@(TASK_THREAD+THREAD_USP) /* save thread user stack */ | ||
196 | |||
197 | movel %a1@(TASK_THREAD+THREAD_USP),%a3 /* restore thread user stack */ | ||
198 | WRUSP /* movel %a3,%usp */ | ||
199 | movel %a1@(TASK_THREAD+THREAD_KSP),%sp /* restore new kernel stack */ | ||
200 | movew %a1@(TASK_THREAD+THREAD_SR),%d7 /* restore new status */ | ||
201 | movew %d7,%sr | ||
198 | RESTORE_SWITCH_STACK | 202 | RESTORE_SWITCH_STACK |
199 | |||
200 | movel %a1@(TASK_THREAD+THREAD_USP),%a0 /* restore thread user stack */ | ||
201 | WRUSP | ||
202 | rts | 203 | rts |
204 | |||