Commit 1c304c77 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux

Pull arm64 fixes from Catalin Marinas:

 - Correctly mask out bits 63:60 in a kernel tag check fault address
   (specified as unknown by the architecture). Previously they were just
   zeroed but for kernel pointers they need to be all ones.

 - Fix a panic (unexpected kernel BRK exception) caused by kprobes being
   reentered due to an interrupt.

* tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux:
  arm64: kprobes: Fix Uexpected kernel BRK exception at EL1
  kasan, arm64: fix pointer tags in KASAN reports
parents a9034304 75bd4bff
...@@ -352,8 +352,8 @@ kprobe_breakpoint_ss_handler(struct pt_regs *regs, unsigned int esr) ...@@ -352,8 +352,8 @@ kprobe_breakpoint_ss_handler(struct pt_regs *regs, unsigned int esr)
unsigned long addr = instruction_pointer(regs); unsigned long addr = instruction_pointer(regs);
struct kprobe *cur = kprobe_running(); struct kprobe *cur = kprobe_running();
if (cur && (kcb->kprobe_status == KPROBE_HIT_SS) if (cur && (kcb->kprobe_status & (KPROBE_HIT_SS | KPROBE_REENTER)) &&
&& ((unsigned long)&cur->ainsn.api.insn[1] == addr)) { ((unsigned long)&cur->ainsn.api.insn[1] == addr)) {
kprobes_restore_local_irqflag(kcb, regs); kprobes_restore_local_irqflag(kcb, regs);
post_kprobe_handler(cur, kcb, regs); post_kprobe_handler(cur, kcb, regs);
......
...@@ -709,10 +709,11 @@ static int do_tag_check_fault(unsigned long far, unsigned int esr, ...@@ -709,10 +709,11 @@ static int do_tag_check_fault(unsigned long far, unsigned int esr,
struct pt_regs *regs) struct pt_regs *regs)
{ {
/* /*
* The architecture specifies that bits 63:60 of FAR_EL1 are UNKNOWN for tag * The architecture specifies that bits 63:60 of FAR_EL1 are UNKNOWN
* check faults. Mask them out now so that userspace doesn't see them. * for tag check faults. Set them to corresponding bits in the untagged
* address.
*/ */
far &= (1UL << 60) - 1; far = (__untagged_addr(far) & ~MTE_TAG_MASK) | (far & MTE_TAG_MASK);
do_bad_area(far, esr, regs); do_bad_area(far, esr, regs);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment