m68k: set register a2 to current if MMU enabled on ColdFire
Virtual memory m68k systems build with register a2 dedicated to being the current proc pointer (non-MMU don't do this). Add code to the ColdFire interrupt and exception processing to set this on entry, and at context switch time. We use the same GET_CURRENT() macro that MMU enabled code uses - modifying it so that the assembler is ColdFire clean. Signed-off-by: Greg Ungerer <gerg@uclinux.org> Acked-by: Matt Waddel <mwaddel@yahoo.com> Acked-by: Kurt Mahan <kmahan@xmission.com> Acked-by: Geert Uytterhoeven <geert@linux-m68k.org>
This commit is contained in:
@@ -222,16 +222,24 @@
|
|||||||
* Non-MMU systems do not reserve %a2 in this way, and this definition is
|
* Non-MMU systems do not reserve %a2 in this way, and this definition is
|
||||||
* not used for them.
|
* not used for them.
|
||||||
*/
|
*/
|
||||||
|
#ifdef CONFIG_MMU
|
||||||
|
|
||||||
#define curptr a2
|
#define curptr a2
|
||||||
|
|
||||||
#define GET_CURRENT(tmp) get_current tmp
|
#define GET_CURRENT(tmp) get_current tmp
|
||||||
.macro get_current reg=%d0
|
.macro get_current reg=%d0
|
||||||
movel %sp,\reg
|
movel %sp,\reg
|
||||||
andw #-THREAD_SIZE,\reg
|
andl #-THREAD_SIZE,\reg
|
||||||
movel \reg,%curptr
|
movel \reg,%curptr
|
||||||
movel %curptr@,%curptr
|
movel %curptr@,%curptr
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define GET_CURRENT(tmp)
|
||||||
|
|
||||||
|
#endif /* CONFIG_MMU */
|
||||||
|
|
||||||
#else /* C source */
|
#else /* C source */
|
||||||
|
|
||||||
#define STR(X) STR1(X)
|
#define STR(X) STR1(X)
|
||||||
|
@@ -44,6 +44,7 @@
|
|||||||
|
|
||||||
ENTRY(buserr)
|
ENTRY(buserr)
|
||||||
SAVE_ALL_INT
|
SAVE_ALL_INT
|
||||||
|
GET_CURRENT(%d0)
|
||||||
movel %sp,%sp@- /* stack frame pointer argument */
|
movel %sp,%sp@- /* stack frame pointer argument */
|
||||||
jsr buserr_c
|
jsr buserr_c
|
||||||
addql #4,%sp
|
addql #4,%sp
|
||||||
@@ -51,6 +52,7 @@ ENTRY(buserr)
|
|||||||
|
|
||||||
ENTRY(trap)
|
ENTRY(trap)
|
||||||
SAVE_ALL_INT
|
SAVE_ALL_INT
|
||||||
|
GET_CURRENT(%d0)
|
||||||
movel %sp,%sp@- /* stack frame pointer argument */
|
movel %sp,%sp@- /* stack frame pointer argument */
|
||||||
jsr trap_c
|
jsr trap_c
|
||||||
addql #4,%sp
|
addql #4,%sp
|
||||||
@@ -61,6 +63,7 @@ ENTRY(trap)
|
|||||||
.globl dbginterrupt
|
.globl dbginterrupt
|
||||||
ENTRY(dbginterrupt)
|
ENTRY(dbginterrupt)
|
||||||
SAVE_ALL_INT
|
SAVE_ALL_INT
|
||||||
|
GET_CURRENT(%d0)
|
||||||
movel %sp,%sp@- /* stack frame pointer argument */
|
movel %sp,%sp@- /* stack frame pointer argument */
|
||||||
jsr dbginterrupt_c
|
jsr dbginterrupt_c
|
||||||
addql #4,%sp
|
addql #4,%sp
|
||||||
|
@@ -62,6 +62,7 @@ enosys:
|
|||||||
ENTRY(system_call)
|
ENTRY(system_call)
|
||||||
SAVE_ALL_SYS
|
SAVE_ALL_SYS
|
||||||
move #0x2000,%sr /* enable intrs again */
|
move #0x2000,%sr /* enable intrs again */
|
||||||
|
GET_CURRENT(%d2)
|
||||||
|
|
||||||
cmpl #NR_syscalls,%d0
|
cmpl #NR_syscalls,%d0
|
||||||
jcc enosys
|
jcc enosys
|
||||||
@@ -165,6 +166,7 @@ Lsignal_return:
|
|||||||
*/
|
*/
|
||||||
ENTRY(inthandler)
|
ENTRY(inthandler)
|
||||||
SAVE_ALL_INT
|
SAVE_ALL_INT
|
||||||
|
GET_CURRENT(%d2)
|
||||||
|
|
||||||
movew %sp@(PT_OFF_FORMATVEC),%d0 /* put exception # in d0 */
|
movew %sp@(PT_OFF_FORMATVEC),%d0 /* put exception # in d0 */
|
||||||
andl #0x03fc,%d0 /* mask out vector only */
|
andl #0x03fc,%d0 /* mask out vector only */
|
||||||
@@ -190,7 +192,9 @@ ENTRY(resume)
|
|||||||
movel %sp,%a0@(TASK_THREAD+THREAD_KSP) /* save kernel stack pointer */
|
movel %sp,%a0@(TASK_THREAD+THREAD_KSP) /* save kernel stack pointer */
|
||||||
RDUSP /* movel %usp,%a3 */
|
RDUSP /* movel %usp,%a3 */
|
||||||
movel %a3,%a0@(TASK_THREAD+THREAD_USP) /* save thread user stack */
|
movel %a3,%a0@(TASK_THREAD+THREAD_USP) /* save thread user stack */
|
||||||
|
#ifdef CONFIG_MMU
|
||||||
|
movel %a1,%a2 /* set new current */
|
||||||
|
#endif
|
||||||
movel %a1@(TASK_THREAD+THREAD_USP),%a3 /* restore thread user stack */
|
movel %a1@(TASK_THREAD+THREAD_USP),%a3 /* restore thread user stack */
|
||||||
WRUSP /* movel %a3,%usp */
|
WRUSP /* movel %a3,%usp */
|
||||||
movel %a1@(TASK_THREAD+THREAD_KSP),%sp /* restore new kernel stack */
|
movel %a1@(TASK_THREAD+THREAD_KSP),%sp /* restore new kernel stack */
|
||||||
|
Reference in New Issue
Block a user