diff options
author | Franck Bui-Huu <fbuihuu@gmail.com> | 2007-02-02 11:41:47 -0500 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2007-02-21 19:50:44 -0500 |
commit | 9693a85378b590cc7a4aa2db2174422585c7c8c4 (patch) | |
tree | 43d031f8e555d9276e68bdb158bd264c2d260346 /arch/mips/kernel | |
parent | 9654640d0af8f2de40ff3807d3695109d3463f54 (diff) |
[MIPS] Add basic SMARTMIPS ASE support
This patch adds trivial support for SMARTMIPS extension. This extension
is currently implemented by 4KS[CD] CPUs.
Basically it saves/restores ACX register, which is part of the SMARTMIPS
ASE, when needed. This patch does *not* add any support for Smartmips MMU
features.
Futhermore this patch does not add explicit support for 4KS[CD] CPUs since
they are respectively mips32 and mips32r2 compliant. So with the current
processor configuration, a platform that has such CPUs needs to select
both configs:
CPU_HAS_SMARTMIPS
SYS_HAS_CPU_MIPS32_R[12]
This is due to the processor configuration which is mixing up all the
architecture variants and the processor types.
The drawback of this, is that we currently pass '-march=mips32' option to
gcc when building a kernel instead of '-march=4ksc' for 4KSC case. This
can lead to a kernel image a little bit bigger than required.
Signed-off-by: Franck Bui-Huu <fbuihuu@gmail.com>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/kernel')
-rw-r--r-- | arch/mips/kernel/asm-offsets.c | 4 | ||||
-rw-r--r-- | arch/mips/kernel/ptrace.c | 10 | ||||
-rw-r--r-- | arch/mips/kernel/signal.c | 7 | ||||
-rw-r--r-- | arch/mips/kernel/traps.c | 3 |
4 files changed, 24 insertions, 0 deletions
diff --git a/arch/mips/kernel/asm-offsets.c b/arch/mips/kernel/asm-offsets.c index c0b089d47181..222de465db73 100644 --- a/arch/mips/kernel/asm-offsets.c +++ b/arch/mips/kernel/asm-offsets.c | |||
@@ -64,6 +64,9 @@ void output_ptreg_defines(void) | |||
64 | offset("#define PT_R31 ", struct pt_regs, regs[31]); | 64 | offset("#define PT_R31 ", struct pt_regs, regs[31]); |
65 | offset("#define PT_LO ", struct pt_regs, lo); | 65 | offset("#define PT_LO ", struct pt_regs, lo); |
66 | offset("#define PT_HI ", struct pt_regs, hi); | 66 | offset("#define PT_HI ", struct pt_regs, hi); |
67 | #ifdef CONFIG_CPU_HAS_SMARTMIPS | ||
68 | offset("#define PT_ACX ", struct pt_regs, acx); | ||
69 | #endif | ||
67 | offset("#define PT_EPC ", struct pt_regs, cp0_epc); | 70 | offset("#define PT_EPC ", struct pt_regs, cp0_epc); |
68 | offset("#define PT_BVADDR ", struct pt_regs, cp0_badvaddr); | 71 | offset("#define PT_BVADDR ", struct pt_regs, cp0_badvaddr); |
69 | offset("#define PT_STATUS ", struct pt_regs, cp0_status); | 72 | offset("#define PT_STATUS ", struct pt_regs, cp0_status); |
@@ -246,6 +249,7 @@ void output_sc_defines(void) | |||
246 | text("/* Linux sigcontext offsets. */"); | 249 | text("/* Linux sigcontext offsets. */"); |
247 | offset("#define SC_REGS ", struct sigcontext, sc_regs); | 250 | offset("#define SC_REGS ", struct sigcontext, sc_regs); |
248 | offset("#define SC_FPREGS ", struct sigcontext, sc_fpregs); | 251 | offset("#define SC_FPREGS ", struct sigcontext, sc_fpregs); |
252 | offset("#define SC_ACX ", struct sigcontext, sc_acx); | ||
249 | offset("#define SC_MDHI ", struct sigcontext, sc_mdhi); | 253 | offset("#define SC_MDHI ", struct sigcontext, sc_mdhi); |
250 | offset("#define SC_MDLO ", struct sigcontext, sc_mdlo); | 254 | offset("#define SC_MDLO ", struct sigcontext, sc_mdlo); |
251 | offset("#define SC_PC ", struct sigcontext, sc_pc); | 255 | offset("#define SC_PC ", struct sigcontext, sc_pc); |
diff --git a/arch/mips/kernel/ptrace.c b/arch/mips/kernel/ptrace.c index 258d74fd0b63..201ae194d1b8 100644 --- a/arch/mips/kernel/ptrace.c +++ b/arch/mips/kernel/ptrace.c | |||
@@ -236,6 +236,11 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
236 | case MMLO: | 236 | case MMLO: |
237 | tmp = regs->lo; | 237 | tmp = regs->lo; |
238 | break; | 238 | break; |
239 | #ifdef CONFIG_CPU_HAS_SMARTMIPS | ||
240 | case ACX: | ||
241 | tmp = regs->acx; | ||
242 | break; | ||
243 | #endif | ||
239 | case FPC_CSR: | 244 | case FPC_CSR: |
240 | tmp = child->thread.fpu.fcr31; | 245 | tmp = child->thread.fpu.fcr31; |
241 | break; | 246 | break; |
@@ -362,6 +367,11 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
362 | case MMLO: | 367 | case MMLO: |
363 | regs->lo = data; | 368 | regs->lo = data; |
364 | break; | 369 | break; |
370 | #ifdef CONFIG_CPU_HAS_SMARTMIPS | ||
371 | case ACX: | ||
372 | regs->acx = data; | ||
373 | break; | ||
374 | #endif | ||
365 | case FPC_CSR: | 375 | case FPC_CSR: |
366 | child->thread.fpu.fcr31 = data; | 376 | child->thread.fpu.fcr31 = data; |
367 | break; | 377 | break; |
diff --git a/arch/mips/kernel/signal.c b/arch/mips/kernel/signal.c index adbfb95e42d0..f091786187a6 100644 --- a/arch/mips/kernel/signal.c +++ b/arch/mips/kernel/signal.c | |||
@@ -89,6 +89,9 @@ int setup_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc) | |||
89 | for (i = 1; i < 32; i++) | 89 | for (i = 1; i < 32; i++) |
90 | err |= __put_user(regs->regs[i], &sc->sc_regs[i]); | 90 | err |= __put_user(regs->regs[i], &sc->sc_regs[i]); |
91 | 91 | ||
92 | #ifdef CONFIG_CPU_HAS_SMARTMIPS | ||
93 | err |= __put_user(regs->acx, &sc->sc_acx); | ||
94 | #endif | ||
92 | err |= __put_user(regs->hi, &sc->sc_mdhi); | 95 | err |= __put_user(regs->hi, &sc->sc_mdhi); |
93 | err |= __put_user(regs->lo, &sc->sc_mdlo); | 96 | err |= __put_user(regs->lo, &sc->sc_mdlo); |
94 | if (cpu_has_dsp) { | 97 | if (cpu_has_dsp) { |
@@ -132,6 +135,10 @@ int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc) | |||
132 | current_thread_info()->restart_block.fn = do_no_restart_syscall; | 135 | current_thread_info()->restart_block.fn = do_no_restart_syscall; |
133 | 136 | ||
134 | err |= __get_user(regs->cp0_epc, &sc->sc_pc); | 137 | err |= __get_user(regs->cp0_epc, &sc->sc_pc); |
138 | |||
139 | #ifdef CONFIG_CPU_HAS_SMARTMIPS | ||
140 | err |= __get_user(regs->acx, &sc->sc_acx); | ||
141 | #endif | ||
135 | err |= __get_user(regs->hi, &sc->sc_mdhi); | 142 | err |= __get_user(regs->hi, &sc->sc_mdhi); |
136 | err |= __get_user(regs->lo, &sc->sc_mdlo); | 143 | err |= __get_user(regs->lo, &sc->sc_mdlo); |
137 | if (cpu_has_dsp) { | 144 | if (cpu_has_dsp) { |
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index 2aa208b99da8..18f56a9dbcfa 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c | |||
@@ -229,6 +229,9 @@ void show_regs(struct pt_regs *regs) | |||
229 | printk("\n"); | 229 | printk("\n"); |
230 | } | 230 | } |
231 | 231 | ||
232 | #ifdef CONFIG_CPU_HAS_SMARTMIPS | ||
233 | printk("Acx : %0*lx\n", field, regs->acx); | ||
234 | #endif | ||
232 | printk("Hi : %0*lx\n", field, regs->hi); | 235 | printk("Hi : %0*lx\n", field, regs->hi); |
233 | printk("Lo : %0*lx\n", field, regs->lo); | 236 | printk("Lo : %0*lx\n", field, regs->lo); |
234 | 237 | ||