mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-11-01 09:13:37 +00:00 
			
		
		
		
	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
    200b812d00 ("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>
		
	
			
		
			
				
	
	
		
			41 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			41 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
#include <linux/linkage.h>
 | 
						|
#include <asm/assembler.h>
 | 
						|
#include "abort-macro.S"
 | 
						|
/*
 | 
						|
 * Function: v6_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.
 | 
						|
 * Note: we read user space.  This means we might cause a data
 | 
						|
 * abort here if the I-TLB and D-TLB aren't seeing the same
 | 
						|
 * picture.  Unfortunately, this does happen.  We live with it.
 | 
						|
 */
 | 
						|
	.align	5
 | 
						|
ENTRY(v6_early_abort)
 | 
						|
	mrc	p15, 0, r1, c5, c0, 0		@ get FSR
 | 
						|
	mrc	p15, 0, r0, c6, c0, 0		@ get FAR
 | 
						|
/*
 | 
						|
 * Faulty SWP instruction on 1136 doesn't set bit 11 in DFSR.
 | 
						|
 */
 | 
						|
#ifdef CONFIG_ARM_ERRATA_326103
 | 
						|
	ldr	ip, =0x4107b36
 | 
						|
	mrc	p15, 0, r3, c0, c0, 0		@ get processor id
 | 
						|
	teq	ip, r3, lsr #4			@ r0 ARM1136?
 | 
						|
	bne	do_DataAbort
 | 
						|
	tst	r5, #PSR_J_BIT			@ Java?
 | 
						|
	tsteq	r5, #PSR_T_BIT			@ Thumb?
 | 
						|
	bne	do_DataAbort
 | 
						|
	bic	r1, r1, #1 << 11		@ clear bit 11 of FSR
 | 
						|
	ldr	r3, [r4]			@ read aborted ARM instruction
 | 
						|
 ARM_BE8(rev	r3, r3)
 | 
						|
 | 
						|
	do_ldrd_abort tmp=ip, insn=r3
 | 
						|
	tst	r3, #1 << 20			@ L = 0 -> write
 | 
						|
	orreq	r1, r1, #1 << 11		@ yes.
 | 
						|
#endif
 | 
						|
	b	do_DataAbort
 |