We now check the validity of the condition code before calling the UNDEF handlers, so we can simplify swp_handler by only checking for ARM_OPCODE_CONDTEST_UNCOND, which indicates that this is not a SWP instruction.
Signed-off-by: Marc Zyngier <marc.zyng...@arm.com> --- arch/arm/kernel/swp_emulate.c | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/arch/arm/kernel/swp_emulate.c b/arch/arm/kernel/swp_emulate.c index 3bda08bee674..2683c559e0ff 100644 --- a/arch/arm/kernel/swp_emulate.c +++ b/arch/arm/kernel/swp_emulate.c @@ -179,20 +179,9 @@ static int swp_handler(struct pt_regs *regs, unsigned int instr) perf_sw_event(PERF_COUNT_SW_EMULATION_FAULTS, 1, regs, regs->ARM_pc); - res = arm_check_condition(instr, regs->ARM_cpsr); - switch (res) { - case ARM_OPCODE_CONDTEST_PASS: - break; - case ARM_OPCODE_CONDTEST_FAIL: - /* Condition failed - return to next instruction */ - regs->ARM_pc += 4; - return 0; - case ARM_OPCODE_CONDTEST_UNCOND: - /* If unconditional encoding - not a SWP, undef */ + /* If unconditional encoding - not a SWP, undef */ + if (arm_check_condition(instr, regs->ARM_cpsr) == ARM_OPCODE_CONDTEST_UNCOND) return -EFAULT; - default: - return -EINVAL; - } if (current->pid != previous_pid) { pr_debug("\"%s\" (%ld) uses deprecated SWP{B} instruction\n", -- 2.11.0