Patch "arm64: entry: improve data abort handling of tagged pointers" has been added to the 3.18-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
arm64: entry: improve data abort handling of tagged pointers
to the 3.18-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
arm64-entry-improve-data-abort-handling-of-tagged-pointers.patch
and it can be found in the queue-3.18 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
276e93279a630657fff4b086ba14c95955912dfaMon Sep 17 00:00:00 2001
From: Kristina Martsenko <[email protected]>
Date: Wed, 3 May 2017 16:37:47 +0100
Subject: arm64: entry: improve data abort handling of tagged pointers
From: Kristina Martsenko <[email protected]>
commit 276e93279a630657fff4b086ba14c95955912dfa upstream.
When handling a data abort from EL0, we currently zero the top byte of the faulting address, as we assume the address is a TTBR0 address, which may contain a non-zero address tag. However, the address may be a TTBR1 address, in which case we should not zero the top byte. This patch fixes that. The effect is that the full TTBR1 address is passed to the task's signal handler (or printed out in the kernel log).
When handling a data abort from EL1, we leave the faulting address intact, as we assume it's either a TTBR1 address or a TTBR0 address with tag 0x00. This is true as far as I'm aware, we don't seem to access a tagged TTBR0 address anywhere in the kernel. Regardless, it's easy to forget about address tags, and code added in the future may not always remember to remove tags from addresses before accessing them. So add tag handling to the EL1 data abort handler as well. This also makes it consistent with the EL0 data abort handler.
--- arch/arm64/include/asm/asm-uaccess.h | 13 +++++++++++++ arch/arm64/kernel/entry.S | 6 ++++-- 2 files changed, 17 insertions(+), 2 deletions(-)
arch/arm64/include/asm/asm-uaccess.h new file +13 -0
@@ -0,0 +1,13 @@ +#ifndef __ASM_ASM_UACCESS_H +#define __ASM_ASM_UACCESS_H + +/* +* Remove the address tag from a virtual address, if present. +*/ + .macro clear_address_tag, dst, addr + tst \addr, #(1 << 55) + bic \dst, \addr, #(0xff << 56) + csel \dst, \dst, \addr, eq + .endm + +#endif
arch/arm64/kernel/entry.S +4 -2
@@ -28,6 +28,7 @@ #include <asm/errno.h> #include <asm/esr.h> #include <asm/thread_info.h> +#include <asm/asm-uaccess.h> #include <asm/unistd.h> /*
@@ -307,12 +308,13 @@ el1_da: /* * Data abort handling */ - mrs x0, far_el1 + mrs x3, far_el1 enable_dbg // re-enable interrupts if they were enabled in the aborted context tbnz x23, #7, 1f // PSR_I_BIT enable_irq 1: + clear_address_tag x0, x3 mov x2, sp // struct pt_regs bl do_mem_abort
@@ -472,7 +474,7 @@ el0_da: // enable interrupts before calling the main handler enable_dbg_and_irq ct_user_exit - bic x0, x26, #(0xff << 56) + clear_address_tag x0, x26 mov x1, x25 mov x2, sp adr lr, ret_to_user
Patches currently in stable-queue which might be from [email protected] are
queue-3.18/arm64-hw_breakpoint-fix-watchpoint-matching-for-tagged-pointers.patch queue-3.18/arm64-entry-improve-data-abort-handling-of-tagged-pointers.patch