Commit 85164fd8 authored by Paul Burton's avatar Paul Burton

MIPS: unaligned: Remove FP & MSA code when unsupported

When CONFIG_MIPS_FP_SUPPORT=n we don't support floating point, so remove
support for floating point instructions from emulate_load_store_insn() &
emulate_load_store_microMIPS(). This code should not be needed & relies
upon access to FPU state in struct task_struct which will later be
removed.

Similarly & for the same reasons, when CONFIG_CPU_HAS_MSA=n remove
support for MSA instructions. Since MSA support depends upon FP support
this is implied when CONFIG_MIPS_FP_SUPPORT=n.
Signed-off-by: default avatarPaul Burton <paul.burton@mips.com>
Patchwork: https://patchwork.linux-mips.org/patch/21020/
Cc: linux-mips@linux-mips.org
parent 6a1cc218
...@@ -882,18 +882,12 @@ do { \ ...@@ -882,18 +882,12 @@ do { \
static void emulate_load_store_insn(struct pt_regs *regs, static void emulate_load_store_insn(struct pt_regs *regs,
void __user *addr, unsigned int __user *pc) void __user *addr, unsigned int __user *pc)
{ {
unsigned long origpc, orig31, value;
union mips_instruction insn; union mips_instruction insn;
unsigned long value; unsigned int res;
unsigned int res, preempted;
unsigned long origpc;
unsigned long orig31;
void __user *fault_addr = NULL;
#ifdef CONFIG_EVA #ifdef CONFIG_EVA
mm_segment_t seg; mm_segment_t seg;
#endif #endif
union fpureg *fpr;
enum msa_2b_fmt df;
unsigned int wd;
origpc = (unsigned long)pc; origpc = (unsigned long)pc;
orig31 = regs->regs[31]; orig31 = regs->regs[31];
...@@ -1212,11 +1206,15 @@ static void emulate_load_store_insn(struct pt_regs *regs, ...@@ -1212,11 +1206,15 @@ static void emulate_load_store_insn(struct pt_regs *regs,
/* Cannot handle 64-bit instructions in 32-bit kernel */ /* Cannot handle 64-bit instructions in 32-bit kernel */
goto sigill; goto sigill;
#ifdef CONFIG_MIPS_FP_SUPPORT
case lwc1_op: case lwc1_op:
case ldc1_op: case ldc1_op:
case swc1_op: case swc1_op:
case sdc1_op: case sdc1_op:
case cop1x_op: case cop1x_op: {
void __user *fault_addr = NULL;
die_if_kernel("Unaligned FP access in kernel code", regs); die_if_kernel("Unaligned FP access in kernel code", regs);
BUG_ON(!used_math()); BUG_ON(!used_math());
...@@ -1230,8 +1228,16 @@ static void emulate_load_store_insn(struct pt_regs *regs, ...@@ -1230,8 +1228,16 @@ static void emulate_load_store_insn(struct pt_regs *regs,
if (res == 0) if (res == 0)
break; break;
return; return;
}
#endif /* CONFIG_MIPS_FP_SUPPORT */
#ifdef CONFIG_CPU_HAS_MSA
case msa_op: {
unsigned int wd, preempted;
enum msa_2b_fmt df;
union fpureg *fpr;
case msa_op:
if (!cpu_has_msa) if (!cpu_has_msa)
goto sigill; goto sigill;
...@@ -1308,6 +1314,8 @@ static void emulate_load_store_insn(struct pt_regs *regs, ...@@ -1308,6 +1314,8 @@ static void emulate_load_store_insn(struct pt_regs *regs,
compute_return_epc(regs); compute_return_epc(regs);
break; break;
}
#endif /* CONFIG_CPU_HAS_MSA */
#ifndef CONFIG_CPU_MIPSR6 #ifndef CONFIG_CPU_MIPSR6
/* /*
...@@ -1392,7 +1400,6 @@ static void emulate_load_store_microMIPS(struct pt_regs *regs, ...@@ -1392,7 +1400,6 @@ static void emulate_load_store_microMIPS(struct pt_regs *regs,
unsigned long origpc, contpc; unsigned long origpc, contpc;
union mips_instruction insn; union mips_instruction insn;
struct mm_decoded_insn mminsn; struct mm_decoded_insn mminsn;
void __user *fault_addr = NULL;
origpc = regs->cp0_epc; origpc = regs->cp0_epc;
orig31 = regs->regs[31]; orig31 = regs->regs[31];
...@@ -1708,6 +1715,7 @@ static void emulate_load_store_microMIPS(struct pt_regs *regs, ...@@ -1708,6 +1715,7 @@ static void emulate_load_store_microMIPS(struct pt_regs *regs,
/* LL,SC,LLD,SCD are not serviced */ /* LL,SC,LLD,SCD are not serviced */
goto sigbus; goto sigbus;
#ifdef CONFIG_MIPS_FP_SUPPORT
case mm_pool32f_op: case mm_pool32f_op:
switch (insn.mm_x_format.func) { switch (insn.mm_x_format.func) {
case mm_lwxc1_func: case mm_lwxc1_func:
...@@ -1722,7 +1730,9 @@ static void emulate_load_store_microMIPS(struct pt_regs *regs, ...@@ -1722,7 +1730,9 @@ static void emulate_load_store_microMIPS(struct pt_regs *regs,
case mm_ldc132_op: case mm_ldc132_op:
case mm_sdc132_op: case mm_sdc132_op:
case mm_lwc132_op: case mm_lwc132_op:
case mm_swc132_op: case mm_swc132_op: {
void __user *fault_addr = NULL;
fpu_emul: fpu_emul:
/* roll back jump/branch */ /* roll back jump/branch */
regs->cp0_epc = origpc; regs->cp0_epc = origpc;
...@@ -1742,6 +1752,8 @@ static void emulate_load_store_microMIPS(struct pt_regs *regs, ...@@ -1742,6 +1752,8 @@ static void emulate_load_store_microMIPS(struct pt_regs *regs,
if (res == 0) if (res == 0)
goto success; goto success;
return; return;
}
#endif /* CONFIG_MIPS_FP_SUPPORT */
case mm_lh32_op: case mm_lh32_op:
reg = insn.mm_i_format.rt; reg = insn.mm_i_format.rt;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment