[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>
This commit is contained in:

committed by
Ralf Baechle

parent
9654640d0a
commit
9693a85378
@@ -64,6 +64,9 @@ void output_ptreg_defines(void)
|
||||
offset("#define PT_R31 ", struct pt_regs, regs[31]);
|
||||
offset("#define PT_LO ", struct pt_regs, lo);
|
||||
offset("#define PT_HI ", struct pt_regs, hi);
|
||||
#ifdef CONFIG_CPU_HAS_SMARTMIPS
|
||||
offset("#define PT_ACX ", struct pt_regs, acx);
|
||||
#endif
|
||||
offset("#define PT_EPC ", struct pt_regs, cp0_epc);
|
||||
offset("#define PT_BVADDR ", struct pt_regs, cp0_badvaddr);
|
||||
offset("#define PT_STATUS ", struct pt_regs, cp0_status);
|
||||
@@ -246,6 +249,7 @@ void output_sc_defines(void)
|
||||
text("/* Linux sigcontext offsets. */");
|
||||
offset("#define SC_REGS ", struct sigcontext, sc_regs);
|
||||
offset("#define SC_FPREGS ", struct sigcontext, sc_fpregs);
|
||||
offset("#define SC_ACX ", struct sigcontext, sc_acx);
|
||||
offset("#define SC_MDHI ", struct sigcontext, sc_mdhi);
|
||||
offset("#define SC_MDLO ", struct sigcontext, sc_mdlo);
|
||||
offset("#define SC_PC ", struct sigcontext, sc_pc);
|
||||
|
@@ -236,6 +236,11 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
case MMLO:
|
||||
tmp = regs->lo;
|
||||
break;
|
||||
#ifdef CONFIG_CPU_HAS_SMARTMIPS
|
||||
case ACX:
|
||||
tmp = regs->acx;
|
||||
break;
|
||||
#endif
|
||||
case FPC_CSR:
|
||||
tmp = child->thread.fpu.fcr31;
|
||||
break;
|
||||
@@ -362,6 +367,11 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
case MMLO:
|
||||
regs->lo = data;
|
||||
break;
|
||||
#ifdef CONFIG_CPU_HAS_SMARTMIPS
|
||||
case ACX:
|
||||
regs->acx = data;
|
||||
break;
|
||||
#endif
|
||||
case FPC_CSR:
|
||||
child->thread.fpu.fcr31 = data;
|
||||
break;
|
||||
|
@@ -89,6 +89,9 @@ int setup_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
|
||||
for (i = 1; i < 32; i++)
|
||||
err |= __put_user(regs->regs[i], &sc->sc_regs[i]);
|
||||
|
||||
#ifdef CONFIG_CPU_HAS_SMARTMIPS
|
||||
err |= __put_user(regs->acx, &sc->sc_acx);
|
||||
#endif
|
||||
err |= __put_user(regs->hi, &sc->sc_mdhi);
|
||||
err |= __put_user(regs->lo, &sc->sc_mdlo);
|
||||
if (cpu_has_dsp) {
|
||||
@@ -132,6 +135,10 @@ int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
|
||||
current_thread_info()->restart_block.fn = do_no_restart_syscall;
|
||||
|
||||
err |= __get_user(regs->cp0_epc, &sc->sc_pc);
|
||||
|
||||
#ifdef CONFIG_CPU_HAS_SMARTMIPS
|
||||
err |= __get_user(regs->acx, &sc->sc_acx);
|
||||
#endif
|
||||
err |= __get_user(regs->hi, &sc->sc_mdhi);
|
||||
err |= __get_user(regs->lo, &sc->sc_mdlo);
|
||||
if (cpu_has_dsp) {
|
||||
|
@@ -229,6 +229,9 @@ void show_regs(struct pt_regs *regs)
|
||||
printk("\n");
|
||||
}
|
||||
|
||||
#ifdef CONFIG_CPU_HAS_SMARTMIPS
|
||||
printk("Acx : %0*lx\n", field, regs->acx);
|
||||
#endif
|
||||
printk("Hi : %0*lx\n", field, regs->hi);
|
||||
printk("Lo : %0*lx\n", field, regs->lo);
|
||||
|
||||
|
Reference in New Issue
Block a user