mirror of
https://github.com/FEX-Emu/linux.git
synced 2025-01-13 12:53:27 +00:00
8586831317
The ARMv6 and ARMv7 early abort handlers clear the exclusive monitors upon entry to the kernel, but this is redundant: - We clear the monitors on every exception return since commit 200b812d0084 ("Clear the exclusive monitor when returning from an exception"), so this is not necessary to ensure the monitors are cleared before returning from a fault handler. - Any dummy STREX will target a temporary scratch area in memory, and may succeed or fail without corrupting useful data. Its status value will not be used. - Any other STREX in the kernel must be preceded by an LDREX, which will initialise the monitors consistently and will not depend on the earlier state of the monitors. Therefore we have no reason to care about the initial state of the exclusive monitors when a data abort is taken, and clearing the monitors prior to exception return (as we already do) is sufficient. This patch removes the redundant clearing of the exclusive monitors from the early abort handlers. Signed-off-by: Mark Rutland <mark.rutland@arm.com> Acked-by: Will Deacon <will.deacon@arm.com> Cc: stable@vger.kernel.org Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
46 lines
1004 B
ArmAsm
46 lines
1004 B
ArmAsm
#include <linux/linkage.h>
|
|
#include <asm/assembler.h>
|
|
/*
|
|
* Function: v7_early_abort
|
|
*
|
|
* Params : r2 = pt_regs
|
|
* : r4 = aborted context pc
|
|
* : r5 = aborted context psr
|
|
*
|
|
* Returns : r4 - r11, r13 preserved
|
|
*
|
|
* Purpose : obtain information about current aborted instruction.
|
|
*/
|
|
.align 5
|
|
ENTRY(v7_early_abort)
|
|
mrc p15, 0, r1, c5, c0, 0 @ get FSR
|
|
mrc p15, 0, r0, c6, c0, 0 @ get FAR
|
|
|
|
/*
|
|
* V6 code adjusts the returned DFSR.
|
|
* New designs should not need to patch up faults.
|
|
*/
|
|
|
|
#if defined(CONFIG_VERIFY_PERMISSION_FAULT)
|
|
/*
|
|
* Detect erroneous permission failures and fix
|
|
*/
|
|
ldr r3, =0x40d @ On permission fault
|
|
and r3, r1, r3
|
|
cmp r3, #0x0d
|
|
bne do_DataAbort
|
|
|
|
mcr p15, 0, r0, c7, c8, 0 @ Retranslate FAR
|
|
isb
|
|
mrc p15, 0, ip, c7, c4, 0 @ Read the PAR
|
|
and r3, ip, #0x7b @ On translation fault
|
|
cmp r3, #0x0b
|
|
bne do_DataAbort
|
|
bic r1, r1, #0xf @ Fix up FSR FS[5:0]
|
|
and ip, ip, #0x7e
|
|
orr r1, r1, ip, LSR #1
|
|
#endif
|
|
|
|
b do_DataAbort
|
|
ENDPROC(v7_early_abort)
|