Commit c1954ca6 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'for-linus' of git://git.armlinux.org.uk/~rmk/linux-arm

Pull ARM fixes from Russell King:

 - avoid invoking overflow handler for uaccess watchpoints

 - fix incorrect clock_gettime64 availability

 - fix EFI crash in create_mapping_late()

* tag 'for-linus' of git://git.armlinux.org.uk/~rmk/linux-arm:
  ARM: 8988/1: mmu: fix crash in EFI calls due to p4d typo in create_mapping_late()
  ARM: 8987/1: VDSO: Fix incorrect clock_gettime64
  ARM: 8986/1: hw_breakpoint: Don't invoke overflow handler on uaccess watchpoints
parents ae2911de 5c6360ee
Loading
Loading
Loading
Loading
+22 −5
Original line number Diff line number Diff line
@@ -683,6 +683,12 @@ static void disable_single_step(struct perf_event *bp)
	arch_install_hw_breakpoint(bp);
}

static int watchpoint_fault_on_uaccess(struct pt_regs *regs,
				       struct arch_hw_breakpoint *info)
{
	return !user_mode(regs) && info->ctrl.privilege == ARM_BREAKPOINT_USER;
}

static void watchpoint_handler(unsigned long addr, unsigned int fsr,
			       struct pt_regs *regs)
{
@@ -742,16 +748,27 @@ static void watchpoint_handler(unsigned long addr, unsigned int fsr,
		}

		pr_debug("watchpoint fired: address = 0x%x\n", info->trigger);

		/*
		 * If we triggered a user watchpoint from a uaccess routine,
		 * then handle the stepping ourselves since userspace really
		 * can't help us with this.
		 */
		if (watchpoint_fault_on_uaccess(regs, info))
			goto step;

		perf_bp_event(wp, regs);

		/*
		 * If no overflow handler is present, insert a temporary
		 * mismatch breakpoint so we can single-step over the
		 * watchpoint trigger.
		 * Defer stepping to the overflow handler if one is installed.
		 * Otherwise, insert a temporary mismatch breakpoint so that
		 * we can single-step over the watchpoint trigger.
		 */
		if (is_default_overflow_handler(wp))
			enable_single_step(wp, instruction_pointer(regs));
		if (!is_default_overflow_handler(wp))
			goto unlock;

step:
		enable_single_step(wp, instruction_pointer(regs));
unlock:
		rcu_read_unlock();
	}
+1 −0
Original line number Diff line number Diff line
@@ -184,6 +184,7 @@ static void __init patch_vdso(void *ehdr)
	if (!cntvct_ok) {
		vdso_nullpatch_one(&einfo, "__vdso_gettimeofday");
		vdso_nullpatch_one(&einfo, "__vdso_clock_gettime");
		vdso_nullpatch_one(&einfo, "__vdso_clock_gettime64");
	}
}

+1 −1
Original line number Diff line number Diff line
@@ -966,7 +966,7 @@ void __init create_mapping_late(struct mm_struct *mm, struct map_desc *md,
	pud_t *pud;

	p4d = p4d_alloc(mm, pgd_offset(mm, md->virtual), md->virtual);
	if (!WARN_ON(!p4d))
	if (WARN_ON(!p4d))
		return;
	pud = pud_alloc(mm, p4d, md->virtual);
	if (WARN_ON(!pud))