linux/arch/arm64/kernel
Will Deacon 2ce39ad151 arm64: debug: unmask PSTATE.D earlier
Clearing PSTATE.D is one of the requirements for generating a debug
exception. The arm64 booting protocol requires that PSTATE.D is set,
since many of the debug registers (for example, the hw_breakpoint
registers) are UNKNOWN out of reset and could potentially generate
spurious, fatal debug exceptions in early boot code if PSTATE.D was
clear. Once the debug registers have been safely initialised, PSTATE.D
is cleared, however this is currently broken for two reasons:

(1) The boot CPU clears PSTATE.D in a postcore_initcall and secondary
    CPUs clear PSTATE.D in secondary_start_kernel. Since the initcall
    runs after SMP (and the scheduler) have been initialised, there is
    no guarantee that it is actually running on the boot CPU. In this
    case, the boot CPU is left with PSTATE.D set and is not capable of
    generating debug exceptions.

(2) In a preemptible kernel, we may explicitly schedule on the IRQ
    return path to EL1. If an IRQ occurs with PSTATE.D set in the idle
    thread, then we may schedule the kthread_init thread, run the
    postcore_initcall to clear PSTATE.D and then context switch back
    to the idle thread before returning from the IRQ. The exception
    return path will then restore PSTATE.D from the stack, and set it
    again.

This patch fixes the problem by moving the clearing of PSTATE.D earlier
to proc.S. This has the desirable effect of clearing it in one place for
all CPUs, long before we have to worry about the scheduler or any
exception handling. We ensure that the previous reset of MDSCR_EL1 has
completed before unmasking the exception, so that any spurious
exceptions resulting from UNKNOWN debug registers are not generated.

Without this patch applied, the kprobes selftests have been seen to fail
under KVM, where we end up attempting to step the OOL instruction buffer
with PSTATE.D set and therefore fail to complete the step.

Cc: <stable@vger.kernel.org>
Acked-by: Mark Rutland <mark.rutland@arm.com>
Reported-by: Catalin Marinas <catalin.marinas@arm.com>
Tested-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Tested-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
2016-07-19 16:56:46 +01:00
..
vdso arm64: Add support for CLOCK_MONOTONIC_RAW in clock_gettime() vDSO 2016-07-12 16:06:32 +01:00
.gitignore
acpi_parking_protocol.c arm64: kernel: acpi: fix ioremap in ACPI parking protocol cpu_postboot 2016-02-26 15:39:52 +00:00
acpi.c arm64: acpi: add acpi=on cmdline option to prefer ACPI boot over DT 2016-04-26 14:37:41 +01:00
alternative.c arm64: mm: fold alternatives into .init 2015-12-10 17:36:08 +00:00
arm64ksyms.c arm64: kasan: instrument user memory access API 2016-06-21 15:37:18 +01:00
armv8_deprecated.c arm64: consolidate signal injection on emulation errors 2016-07-01 11:43:30 +01:00
asm-offsets.c arm64: Add support for CLOCK_MONOTONIC_RAW in clock_gettime() vDSO 2016-07-12 16:06:32 +01:00
cacheinfo.c arm64: kernel: add support for cpu cache information 2015-01-15 11:55:07 +00:00
cpu_errata.c arm64: trap userspace "dc cvau" cache operation on errata-affected core 2016-07-01 11:46:00 +01:00
cpu_ops.c arm64: kernel: implement ACPI parking protocol 2016-02-16 15:12:32 +00:00
cpu-reset.h arm64: Add back cpu reset routines 2016-06-27 16:31:25 +01:00
cpu-reset.S arm64: Add back cpu reset routines 2016-06-27 16:31:25 +01:00
cpufeature.c arm64: errata: Calling enable functions for CPU errata too 2016-07-01 11:30:28 +01:00
cpuidle.c arm64: cpuidle: make arm_cpuidle_suspend() a bit more efficient 2016-04-13 14:49:23 +01:00
cpuinfo.c arm64: cpuinfo: Expose MIDR_EL1 and REVIDR_EL1 to sysfs 2016-07-12 16:09:37 +01:00
debug-monitors.c arm64: debug: unmask PSTATE.D earlier 2016-07-19 16:56:46 +01:00
efi-entry.S arm64: move early boot code to the .init segment 2016-04-14 18:11:30 +01:00
efi.c arm64: efi: avoid block mappings for unaligned UEFI memory regions 2016-07-01 11:56:26 +01:00
entry32.S arm64: entry32: remove pointless register assignment 2015-07-10 16:47:13 +01:00
entry-fpsimd.S
entry-ftrace.S arm64: ftrace: fix function_graph tracer panic 2015-10-02 11:12:56 +01:00
entry.S arm64: trap userspace "dc cvau" cache operation on errata-affected core 2016-07-01 11:46:00 +01:00
fpsimd.c arm64: Fix misspellings in comments. 2016-03-04 18:19:17 +00:00
ftrace.c arm64: ftrace: modify a stack frame in a safe way 2015-12-21 17:26:01 +00:00
head.S arm64 updates for 4.7: 2016-05-16 17:17:24 -07:00
hibernate-asm.S arm64: kernel: Add support for hibernate/suspend-to-disk 2016-04-28 13:36:22 +01:00
hibernate.c arm64: hibernate: Refuse to hibernate if the boot cpu is offline 2016-04-28 13:36:23 +01:00
hw_breakpoint.c arm64 updates for 4.7: 2016-05-16 17:17:24 -07:00
hyp-stub.S arm64: Add back cpu reset routines 2016-06-27 16:31:25 +01:00
image.h arm64 updates for 4.7: 2016-05-16 17:17:24 -07:00
insn.c arm64: insn: avoid virt_to_page() translations on core kernel symbols 2016-04-14 16:31:49 +01:00
io.c arm64: optimize memcpy_{from,to}io() and memset_io() 2014-11-06 17:25:27 +00:00
irq.c arm64: remove irq_count and do_softirq_own_stack() 2015-12-21 17:26:01 +00:00
jump_label.c jump_label: Rename JUMP_LABEL_{EN,DIS}ABLE to JUMP_LABEL_{JMP,NOP} 2015-08-03 11:34:12 +02:00
kaslr.c arm64: relocatable: deal with physically misaligned kernel images 2016-04-26 12:23:28 +01:00
kgdb.c arm64: kgdb: Match pstate size with gdbserver protocol 2016-06-16 19:20:51 +01:00
kuser32.S
machine_kexec.c arm64/kexec: Add pr_debug output 2016-06-27 16:31:26 +01:00
Makefile arm64: fix vdso-offsets.h dependency 2016-07-11 17:10:11 +01:00
module-plts.c arm64: add support for module PLTs 2016-02-24 14:57:24 +00:00
module.c arm64: add support for kernel ASLR 2016-02-24 14:57:27 +00:00
module.lds arm64: add support for module PLTs 2016-02-24 14:57:24 +00:00
paravirt.c arm64: introduce CONFIG_PARAVIRT, PARAVIRT_TIME_ACCOUNTING and pv_time_ops 2015-12-21 14:40:54 +00:00
pci.c arm64, numa: Add NUMA support for arm64 platforms. 2016-04-15 18:06:09 +01:00
perf_callchain.c perf core: Add a 'nr' field to perf_event_callchain_context 2016-05-16 23:11:51 -03:00
perf_event.c arm64: perf: don't expose CHAIN event in sysfs 2016-04-25 15:05:24 +01:00
perf_regs.c perf: Move task_pt_regs sampling into arch code 2015-01-09 11:12:28 +01:00
process.c exit_thread: remove empty bodies 2016-05-20 17:58:30 -07:00
psci.c ARM: 8511/1: ARM64: kernel: PSCI: move PSCI idle management code to drivers/firmware 2016-02-11 15:33:38 +00:00
ptrace.c arm64: Rework valid_user_regs 2016-03-02 15:49:28 +00:00
relocate_kernel.S arm64/kexec: Add core kexec support 2016-06-27 16:31:25 +01:00
return_address.c arm64: ftrace: fix a stack tracer's output under function graph tracer 2015-12-21 17:26:02 +00:00
setup.c arm64: mm: fix location of _etext 2016-06-27 18:21:27 +01:00
signal32.c arm64: Fix misspellings in comments. 2016-03-04 18:19:17 +00:00
signal.c arm64: Rework valid_user_regs 2016-03-02 15:49:28 +00:00
sleep.S arm64: Change cpu_resume() to enable mmu early then access sleep_sp by va 2016-04-28 12:05:46 +01:00
smccc-call.S ARM: 8480/2: arm64: add implementation for arm-smccc 2016-01-04 16:24:45 +00:00
smp_spin_table.c arm64: spin-table: add missing of_node_put() 2016-04-20 10:35:15 +01:00
smp.c arm64: debug: unmask PSTATE.D earlier 2016-07-19 16:56:46 +01:00
stacktrace.c arm64: make irq_stack_ptr more robust 2016-02-12 15:53:51 +00:00
suspend.c arm64: Change cpu_resume() to enable mmu early then access sleep_sp by va 2016-04-28 12:05:46 +01:00
sys32.c arm64: fix implementation of mmap2 compat syscall 2015-03-19 10:43:51 +00:00
sys_compat.c arm64: compat: align cacheflush syscall with arch/arm 2014-12-01 13:31:12 +00:00
sys.c arm64: compat: Check for AArch32 state 2016-04-20 12:22:42 +01:00
time.c arm64: ftrace: fix a stack tracer's output under function graph tracer 2015-12-21 17:26:02 +00:00
topology.c arm64: kernel: remove non-legit DT warnings when booting using ACPI 2015-07-27 11:08:41 +01:00
trace-events-emulation.h arm64: Trace emulation of AArch32 legacy instructions 2014-11-20 16:35:02 +00:00
traps.c arm64: trap userspace "dc cvau" cache operation on errata-affected core 2016-07-01 11:46:00 +01:00
vdso.c arm64: Add support for CLOCK_MONOTONIC_RAW in clock_gettime() vDSO 2016-07-12 16:06:32 +01:00
vmlinux.lds.S arm64: mm: fix location of _etext 2016-06-27 18:21:27 +01:00