forked from Minki/linux
ARM fixes for 5.8:
- avoid invoking overflow handler for uaccess watchpoints - fix incorrect clock_gettime64 availability - fix EFI crash in create_mapping_late() -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEuNNh8scc2k/wOAE+9OeQG+StrGQFAl8f9kwACgkQ9OeQG+St rGTVQQ/8DBdQzos64hSGovqesdA0VKRLd4kuyFrknwhafTDoKM/w7V0RXC8WqsPV ykGpDNW1tGbwsYUG/sIIW5SFGVQxHAhbZuBaVjn+xtszFIRagosujTG19HONh1wQ h0Vw63Xq1BWWpO4YD439Y1CNfjlUGNj3Uq0IakSHAve+mxcj6PlzcwKRB792NvIH 294ZMALLNHLGUEbvdUivf8nZLDcqasHl7q3UlGf7UG49BNJPy1XFOMUj/Em/d0zm 0nFv41wPytIjvNFYJQuT23zOz/WQrCV1Sr34kf5yREG1GrzgGO1oOKJdLwioh7rU dRyscR88e/Ax4w61TNAueNrF+NMvu5GDIPE3eiJ+k/O8dPWvp3AF6ysGDuyouS/3 W+h7yZq5ET1PsMHk5uB7PnOh4r0YklVwOk690JnMYdeK4MY+F27EY/wsZmJhoTXk ueK3Hamrvkf6KMhQYTNPK31gcD3VVJE80KKGi5hKPPaQRZDxyJCZyI1aFMxoZMtV ysUDUOkOLdyuYCO+uOeEW3YGwX0AuZS/QauMjE7scmNr7BiYxQp3sh2MU3+no32T lqc76gfDWzYpdi52Zh+mpc7ow33C9i4a84vw5OeNznYflUx4hmOVb5fYDnoYZVyQ RQqnuxbK3h7ks3kMEOV/OF9XmyFPIL95oE5m3LuU5cNGdTM+JAE= =lvQU -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
c1954ca6ab
@ -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();
|
||||
}
|
||||
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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))
|
||||
|
Loading…
Reference in New Issue
Block a user