[PATCH] arm64: Handle el1 synchronous instruction aborts cleanly

Laura Abbott labbott at redhat.com
Fri Jun 10 17:34:02 PDT 2016


On 06/10/2016 02:48 AM, Mark Rutland wrote:
> On Thu, Jun 09, 2016 at 06:42:08PM -0700, Laura Abbott wrote:
>> Executing from a non-executable area gives an ugly message:
>>
>> lkdtm: Performing direct entry EXEC_RODATA
>> lkdtm: attempting ok execution at ffff0000084c0e08
>> lkdtm: attempting bad execution at ffff000008880700
>> Bad mode in Synchronous Abort handler detected on CPU2, code 0x8400000e -- IABT (current EL)
>> CPU: 2 PID: 998 Comm: sh Not tainted 4.7.0-rc2+ #13
>>
>> The 'IABT (current EL)' indicates the error but isn't as obvious as a
>> regular fault message. The increase in kernel page permissions makes
>> hitting this case more likely and bad mode should not be a common
>> ocurrence. Handle this case in the vectors to give a better message.
>
> Could you add something about why the new message will be better? e.g.
> do we get more info, is it more consistent with the behaviour of other
> architectures?
>
> Bad mode is still a rare occurrence, even if triggered deliberately by a
> test, but anything that makes debugging easier is good!
>

I think bad mode should be avoided where possible on principle. I'll
clarify what more information this gives.

>> Signed-off-by: Laura Abbott <labbott at redhat.com>
>> ---
>> Came up during some lkdtm testing
>> http://article.gmane.org/gmane.linux.kernel.hardened.devel/2524
>> ---
>>  arch/arm64/kernel/entry.S | 19 +++++++++++++++++++
>>  1 file changed, 19 insertions(+)
>>
>> diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S
>> index 12e8d2b..37f3694 100644
>> --- a/arch/arm64/kernel/entry.S
>> +++ b/arch/arm64/kernel/entry.S
>> @@ -336,6 +336,8 @@ el1_sync:
>>  	lsr	x24, x1, #ESR_ELx_EC_SHIFT	// exception class
>>  	cmp	x24, #ESR_ELx_EC_DABT_CUR	// data abort in EL1
>>  	b.eq	el1_da
>> +	cmp	x24, #ESR_ELx_EC_IABT_CUR	// instruction abort in EL1
>> +	b.eq	el1_ia
>>  	cmp	x24, #ESR_ELx_EC_SYS64		// configurable trap
>>  	b.eq	el1_undef
>>  	cmp	x24, #ESR_ELx_EC_SP_ALIGN	// stack alignment exception
>> @@ -347,6 +349,23 @@ el1_sync:
>>  	cmp	x24, #ESR_ELx_EC_BREAKPT_CUR	// debug exception in EL1
>>  	b.ge	el1_dbg
>>  	b	el1_inv
>> +el1_ia:
>> +	/*
>> +	 * Instruction abort handling
>> +	 */
>> +	mrs	x0, far_el1
>> +	enable_dbg
>> +	// re-enable interrupts if they were enabled in the aborted context
>> +	tbnz	x23, #7, 1f			// PSR_I_BIT
>> +	enable_irq
>> +	orr	x1, x1, #1 << 24		// use reserved ISS bit for instruction aborts
>
> I'm planning to kill ESR_LNX_EXEC (the reserved ISS bit here), for v4.8
> [1,2], so we'll need to figure out how to avoid problems when merging.
> My patch only handles the ESR_ELx_EC_IABT_LOW case, but it should be
> simple to add ESR_ELx_EC_IABT_CUR.
>
> If you're happy for me to do so, I could take this into my ESR_LNX_EXEC
> series.
>

That sounds fine.

>> +1:
>> +	mov	x2, sp				// struct pt_regs
>> +	bl	do_mem_abort
>> +
>> +	// disable interrupts before pulling preserved data off the stack
>> +	disable_irq
>> +	kernel_exit 1
>>  el1_da:
>>  	/*
>>  	 * Data abort handling
>> --
>> 2.5.5
>>
>
> Otherwise this looks good to me. Modulo the above:
>
> Acked-by: Mark Rutland <mark.rutland at arm.com>
>

Thanks!

Laura

> Thanks,
> Mark.
>
> [1] http://lists.infradead.org/pipermail/linux-arm-kernel/2016-May/432107.html
> [2] http://lists.infradead.org/pipermail/linux-arm-kernel/2016-June/433682.html
>




More information about the linux-arm-kernel mailing list