diff options
author | Greg Ungerer <gerg@uclinux.org> | 2010-11-04 06:53:26 +0300 |
---|---|---|
committer | Greg Ungerer <gerg@uclinux.org> | 2011-01-05 08:19:18 +0300 |
commit | 1c83af5f9d7e15a091f11394ad5916a7dcf1a99e (patch) | |
tree | aa41743fb552319bb53959a7df228233d4f04ba2 /arch/m68knommu | |
parent | 0762346034a3e94f9c3a5fe8d7c4bcaffbc1cd53 (diff) | |
download | linux-1c83af5f9d7e15a091f11394ad5916a7dcf1a99e.tar.xz |
m68knommu: use user stack pointer hardware on some ColdFire cores
The more modern ColdFire parts (even if based on older version cores)
have separate user and supervisor stack pointers (a7 register).
Modify the ColdFire CPU setup and exception code to enable and use
this on parts that have it.
Signed-off-by: Greg Ungerer <gerg@uclinux.org>
Diffstat (limited to 'arch/m68knommu')
-rw-r--r-- | arch/m68knommu/Kconfig | 10 | ||||
-rw-r--r-- | arch/m68knommu/platform/coldfire/entry.S | 30 |
2 files changed, 20 insertions, 20 deletions
diff --git a/arch/m68knommu/Kconfig b/arch/m68knommu/Kconfig index 266a39eebcad..e6f482d18d05 100644 --- a/arch/m68knommu/Kconfig +++ b/arch/m68knommu/Kconfig @@ -75,6 +75,10 @@ config GENERIC_CLOCKEVENTS config NO_IOPORT def_bool y +config COLDFIRE_SW_A7 + bool + default n + source "init/Kconfig" source "kernel/Kconfig.freezer" @@ -107,11 +111,13 @@ config M68360 config M5206 bool "MCF5206" + select COLDFIRE_SW_A7 help Motorola ColdFire 5206 processor support. config M5206e bool "MCF5206e" + select COLDFIRE_SW_A7 help Motorola ColdFire 5206e processor support. @@ -129,6 +135,7 @@ config M523x config M5249 bool "MCF5249" + select COLDFIRE_SW_A7 help Motorola ColdFire 5249 processor support. @@ -139,6 +146,7 @@ config M5271 config M5272 bool "MCF5272" + select COLDFIRE_SW_A7 help Motorola ColdFire 5272 processor support. @@ -155,6 +163,7 @@ config M528x config M5307 bool "MCF5307" + select COLDFIRE_SW_A7 help Motorola ColdFire 5307 processor support. @@ -165,6 +174,7 @@ config M532x config M5407 bool "MCF5407" + select COLDFIRE_SW_A7 help Motorola ColdFire 5407 processor support. diff --git a/arch/m68knommu/platform/coldfire/entry.S b/arch/m68knommu/platform/coldfire/entry.S index b9ce31966181..f90e6173ccd4 100644 --- a/arch/m68knommu/platform/coldfire/entry.S +++ b/arch/m68knommu/platform/coldfire/entry.S @@ -36,13 +36,16 @@ #include <asm/asm-offsets.h> #include <asm/entry.h> +#ifdef CONFIG_COLDFIRE_SW_A7 +/* + * Define software copies of the supervisor and user stack pointers. + */ .bss - sw_ksp: .long 0 - sw_usp: .long 0 +#endif /* CONFIG_COLDFIRE_SW_A7 */ .text @@ -52,6 +55,7 @@ sw_usp: .globl ret_from_signal .globl sys_call_table .globl inthandler +.globl fasthandler enosys: mov.l #sys_ni_syscall,%d3 @@ -138,20 +142,7 @@ Luser_return: jne Lwork_to_do /* still work to do */ Lreturn: - move #0x2700,%sr /* disable intrs */ - movel sw_usp,%a0 /* get usp */ - movel %sp@(PT_OFF_PC),%a0@- /* copy exception program counter */ - movel %sp@(PT_OFF_FORMATVEC),%a0@- /* copy exception format/vector/sr */ - moveml %sp@,%d1-%d5/%a0-%a2 - lea %sp@(32),%sp /* space for 8 regs */ - movel %sp@+,%d0 - addql #4,%sp /* orig d0 */ - addl %sp@+,%sp /* stk adj */ - addql #8,%sp /* remove exception */ - movel %sp,sw_ksp /* save ksp */ - subql #8,sw_usp /* set exception */ - movel sw_usp,%sp /* restore usp */ - rte + RESTORE_USER Lwork_to_do: movel %a0@(TI_FLAGS),%d1 /* get thread_info->flags */ @@ -201,9 +192,8 @@ ENTRY(inthandler) */ ENTRY(resume) movel %a0, %d1 /* get prev thread in d1 */ - - movel sw_usp,%d0 /* save usp */ - movel %d0,%a0@(TASK_THREAD+THREAD_USP) + RDUSP + movel %a2,%a0@(TASK_THREAD+THREAD_USP) SAVE_SWITCH_STACK movel %sp,%a0@(TASK_THREAD+THREAD_KSP) /* save kernel stack pointer */ @@ -211,5 +201,5 @@ ENTRY(resume) RESTORE_SWITCH_STACK movel %a1@(TASK_THREAD+THREAD_USP),%a0 /* restore thread user stack */ - movel %a0, sw_usp + WRUSP rts |