linux/arch/arm64/kernel
Ard Biesheuvel 7326749801 arm64: unwind: reference pt_regs via embedded stack frame
As it turns out, the unwind code is slightly broken, and probably has
been for a while. The problem is in the dumping of the exception stack,
which is intended to dump the contents of the pt_regs struct at each
level in the call stack where an exception was taken and routed to a
routine marked as __exception (which means its stack frame is right
below the pt_regs struct on the stack).

'Right below the pt_regs struct' is ill defined, though: the unwind
code assigns 'frame pointer + 0x10' to the .sp member of the stackframe
struct at each level, and dump_backtrace() happily dereferences that as
the pt_regs pointer when encountering an __exception routine. However,
the actual size of the stack frame created by this routine (which could
be one of many __exception routines we have in the kernel) is not known,
and so frame.sp is pretty useless to figure out where struct pt_regs
really is.

So it seems the only way to ensure that we can find our struct pt_regs
when walking the stack frames is to put it at a known fixed offset of
the stack frame pointer that is passed to such __exception routines.
The simplest way to do that is to put it inside pt_regs itself, which is
the main change implemented by this patch. As a bonus, doing this allows
us to get rid of a fair amount of cruft related to walking from one stack
to the other, which is especially nice since we intend to introduce yet
another stack for overflow handling once we add support for vmapped
stacks. It also fixes an inconsistency where we only add a stack frame
pointing to ELR_EL1 if we are executing from the IRQ stack but not when
we are executing from the task stack.

To consistly identify exceptions regs even in the presence of exceptions
taken from entry code, we must check whether the next frame was created
by entry text, rather than whether the current frame was crated by
exception text.

To avoid backtracing using PCs that fall in the idmap, or are controlled
by userspace, we must explcitly zero the FP and LR in startup paths, and
must ensure that the frame embedded in pt_regs is zeroed upon entry from
EL0. To avoid these NULL entries showin in the backtrace, unwind_frame()
is updated to avoid them.

Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
[Mark: compare current frame against .entry.text, avoid bogus PCs]
Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: James Morse <james.morse@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
2017-08-09 14:07:13 +01:00
..
probes arm64: Call __show_regs directly 2017-05-30 11:07:41 +01:00
vdso arm64/vdso: Fix nsec handling for CLOCK_MONOTONIC_RAW 2017-06-20 10:41:51 +02:00
.gitignore
acpi_numa.c arm64/numa: avoid inconsistent information to be printed 2016-09-09 14:59:08 +01:00
acpi_parking_protocol.c arm64: fix endianness annotation in acpi_parking_protocol.c 2017-06-29 11:33:15 +01:00
acpi.c efi/bgrt: Enable ACPI BGRT handling on arm64 2017-04-05 12:27:25 +02:00
alternative.c arm64: fix endianness annotation for __apply_alternatives()/get_alt_insn() 2017-06-29 16:32:43 +01:00
arm64ksyms.c arm64: switch to RAW_COPY_USER 2017-03-28 18:23:24 -04:00
armv8_deprecated.c arm64: armv8_deprecated: ensure extension of addr 2017-05-09 17:47:05 +01:00
asm-offsets.c arm64: unwind: reference pt_regs via embedded stack frame 2017-08-09 14:07:13 +01:00
cacheinfo.c arm64: cacheinfo: Remove CCSIDR-based cache information probing 2017-03-20 16:16:54 +00:00
cpu_errata.c arm64: Add workaround for Cavium Thunder erratum 30115 2017-06-15 09:45:04 +01:00
cpu_ops.c arm64: Convert to using %pOF instead of full_name 2017-07-20 10:28:41 +01:00
cpu-reset.h arm64: Use __pa_symbol for kernel symbols 2017-01-12 15:05:39 +00:00
cpu-reset.S arm64: Add back cpu reset routines 2016-06-27 16:31:25 +01:00
cpufeature.c arm64: dump cpu_hwcaps at panic time 2017-06-22 15:58:20 +01:00
cpuidle.c arm64: kernel: Update kerneldoc for cpu_suspend() rename 2017-03-10 18:06:24 +00:00
cpuinfo.c arm64: cpuinfo: constify attribute_group structures. 2017-06-30 13:34:11 +01:00
crash_dump.c arm64: kdump: provide /proc/vmcore file 2017-04-05 18:31:38 +01:00
debug-monitors.c arm64: fix endianness annotation for debug-monitors.c 2017-06-29 11:02:41 +01:00
efi-entry.S arm64: efi-entry.S: avoid open-coded adr_l 2017-01-17 17:41:14 +00:00
efi-header.S arm64: efi: split Image code and data into separate PE/COFF sections 2017-04-04 17:50:59 +01:00
efi.c efi/arm: Enable DMI/SMBIOS 2017-06-05 17:50:44 +02:00
entry32.S arm64: entry32: remove pointless register assignment 2015-07-10 16:47:13 +01:00
entry-fpsimd.S
entry-ftrace.S arm64: include asm/assembler.h in entry-ftrace.S 2017-02-15 11:34:25 +00:00
entry.S arm64: unwind: reference pt_regs via embedded stack frame 2017-08-09 14:07:13 +01:00
fpsimd.c sched/headers: Prepare for new header dependencies before moving code to <linux/sched/signal.h> 2017-03-02 08:42:29 +01:00
ftrace-mod.S arm64: ftrace: add support for far branches to dynamic ftrace 2017-06-07 11:52:02 +01:00
ftrace.c arm64: ftrace: fix !CONFIG_ARM64_MODULE_PLTS kernels 2017-06-23 18:21:13 +01:00
head.S arm64: unwind: reference pt_regs via embedded stack frame 2017-08-09 14:07:13 +01:00
hibernate-asm.S arm64: Introduce raw_{d,i}cache_line_size 2016-09-09 15:03:29 +01:00
hibernate.c arm64: hibernate: preserve kdump image around hibernation 2017-04-05 18:28:50 +01:00
hw_breakpoint.c arm64: hw_breakpoint: fix watchpoint matching for tagged pointers 2017-05-09 17:26:40 +01:00
hyp-stub.S arm64: hyp-stub: Zero x0 on successful stub handling 2017-04-09 07:49:35 -07:00
image.h arm64 updates for 4.7: 2016-05-16 17:17:24 -07:00
insn.c arm64 updates for 4.13: 2017-07-05 17:09:27 -07:00
io.c
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: fix endianness annotation in get_kaslr_seed() 2017-06-29 16:32:43 +01:00
kgdb.c sched/headers: Prepare for new header dependencies before moving code to <linux/sched/task_stack.h> 2017-03-02 08:42:36 +01:00
kuser32.S
machine_kexec.c arm64: kdump: add VMCOREINFO's for user-space tools 2017-04-05 18:29:47 +01:00
Makefile arm64: ftrace: add support for far branches to dynamic ftrace 2017-06-07 11:52:02 +01:00
module-plts.c arm64: module: split core and init PLT sections 2017-04-26 12:31:00 +01:00
module.c arm64: fix endianness annotation for reloc_insn_movw() & reloc_insn_imm() 2017-06-29 11:09:39 +01:00
module.lds arm64: module: split core and init PLT sections 2017-04-26 12:31:00 +01:00
paravirt.c arm64: introduce CONFIG_PARAVIRT, PARAVIRT_TIME_ACCOUNTING and pv_time_ops 2015-12-21 14:40:54 +00:00
pci.c pci-v4.13-changes 2017-07-08 15:51:57 -07: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: Extend event config for ARMv8.1 2017-05-30 12:15:14 +01:00
perf_regs.c sched/headers: Prepare for new header dependencies before moving code to <linux/sched/task_stack.h> 2017-03-02 08:42:36 +01:00
process.c arm64: ptrace: Flush user-RW TLS reg to thread_struct before reading 2017-06-22 15:58:20 +01:00
psci.c arm64: Use __pa_symbol for kernel symbols 2017-01-12 15:05:39 +00:00
ptrace.c arm64: unwind: avoid percpu indirection for irq stack 2017-08-08 16:28:25 +01:00
reloc_test_core.c arm64: relocation testing module 2017-04-04 17:03:32 +01:00
reloc_test_syms.S arm64: relocation testing module 2017-04-04 17:03:32 +01:00
relocate_kernel.S arm64: Introduce raw_{d,i}cache_line_size 2016-09-09 15:03:29 +01:00
return_address.c arm64: factor out current_stack_pointer 2016-11-11 18:25:43 +00:00
setup.c arm64: check return value of of_flat_dt_get_machine_name 2017-05-30 11:07:42 +01:00
signal32.c Replace <asm/uaccess.h> with <linux/uaccess.h> globally 2016-12-24 11:46:01 -08:00
signal.c arm64: signal: Allow expansion of the signal frame 2017-06-23 18:20:18 +01:00
sleep.S arm64: move sp_el0 and tpidr_el1 into cpu_suspend_ctx 2016-11-11 18:25:44 +00:00
smccc-call.S firmware: qcom: scm: Fix interrupted SCM calls 2017-02-03 18:46:33 +00:00
smp_spin_table.c arm64: Use __pa_symbol for kernel symbols 2017-01-12 15:05:39 +00:00
smp.c arm64: Convert to using %pOF instead of full_name 2017-07-20 10:28:41 +01:00
stacktrace.c arm64: unwind: reference pt_regs via embedded stack frame 2017-08-09 14:07:13 +01:00
suspend.c arm64: move sp_el0 and tpidr_el1 into cpu_suspend_ctx 2016-11-11 18:25:44 +00:00
sys32.c arm64: fix implementation of mmap2 compat syscall 2015-03-19 10:43:51 +00:00
sys_compat.c sched/headers: Prepare for the reduction of <linux/sched.h>'s signal API dependency 2017-03-02 08:42:37 +01:00
sys.c arm64: compat: Check for AArch32 state 2016-04-20 12:22:42 +01:00
time.c clocksource/drivers: Rename clocksource_probe to timer_probe 2017-06-14 11:59:16 +02:00
topology.c arm64: Convert to using %pOF instead of full_name 2017-07-20 10:28: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: unwind: reference pt_regs via embedded stack frame 2017-08-09 14:07:13 +01:00
vdso.c arm64 updates for 4.13: 2017-07-05 17:09:27 -07:00
vmlinux.lds.S arm64: efi: split Image code and data into separate PE/COFF sections 2017-04-04 17:50:59 +01:00