mirror-linux/arch/arm/kernel
Haibo Li 6578e0f196 ARM: 9295/1: unwind:fix unwind abort for uleb128 case
[ Upstream commit fa3eeb638d ]

When unwind instruction is 0xb2,the subsequent instructions
are uleb128 bytes.
For now,it uses only the first uleb128 byte in code.

For vsp increments of 0x204~0x400,use one uleb128 byte like below:
0xc06a00e4 <unwind_test_work>: 0x80b27fac
  Compact model index: 0
  0xb2 0x7f vsp = vsp + 1024
  0xac      pop {r4, r5, r6, r7, r8, r14}

For vsp increments larger than 0x400,use two uleb128 bytes like below:
0xc06a00e4 <unwind_test_work>: @0xc0cc9e0c
  Compact model index: 1
  0xb2 0x81 0x01 vsp = vsp + 1032
  0xac      pop {r4, r5, r6, r7, r8, r14}
The unwind works well since the decoded uleb128 byte is also 0x81.

For vsp increments larger than 0x600,use two uleb128 bytes like below:
0xc06a00e4 <unwind_test_work>: @0xc0cc9e0c
  Compact model index: 1
  0xb2 0x81 0x02 vsp = vsp + 1544
  0xac      pop {r4, r5, r6, r7, r8, r14}
In this case,the decoded uleb128 result is 0x101(vsp=0x204+(0x101<<2)).
While the uleb128 used in code is 0x81(vsp=0x204+(0x81<<2)).
The unwind aborts at this frame since it gets incorrect vsp.

To fix this,add uleb128 decode to cover all the above case.

Signed-off-by: Haibo Li <haibo.li@mediatek.com>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Alexandre Mergnat <amergnat@baylibre.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2023-06-09 10:34:08 +02:00
..
.gitignore
Makefile Kbuild updates for v6.1 2022-10-10 12:00:45 -07:00
arch_timer.c
armksyms.c
asm-offsets.c ARM: implement THREAD_INFO_IN_TASK for uniprocessor systems 2021-12-06 12:49:17 +01:00
atags.h
atags_compat.c
atags_parse.c
atags_proc.c proc: remove PDE_DATA() completely 2022-01-22 08:33:37 +02:00
bios32.c
bugs.c
cpuidle.c
crash_dump.c vmcore: convert copy_oldmem_page() to take an iov_iter 2022-04-29 14:37:59 -07:00
debug.S
devtree.c ARM: make ARCH_MULTIPLATFORM user-visible 2022-08-30 11:18:09 +02:00
dma.c
early_printk.c
efi.c efi/arm: libstub: move ARM specific code out of generic routines 2022-09-27 13:26:16 +02:00
elf.c
entry-armv.S ARM: 9201/1: spectre-bhb: rely on linker to emit cross-section literal loads 2022-05-20 12:33:47 +01:00
entry-common.S RCU pull request for v5.20 (or whatever) 2022-08-02 19:12:45 -07:00
entry-ftrace.S ARM: ftrace: enable the graph tracer with the EABI unwinder 2022-02-09 09:13:59 +01:00
entry-header.S context_tracking: Split user tracking Kconfig 2022-06-29 17:04:09 -07:00
entry-v7m.S ARM: v7m: enable support for IRQ stacks 2021-12-06 12:49:17 +01:00
fiq.c
fiqasm.S
ftrace.c ftrace: Remove return value of ftrace_arch_modify_*() 2022-05-26 21:13:00 -04:00
head-common.S ARM: implement THREAD_INFO_IN_TASK for uniprocessor systems 2021-12-06 12:49:17 +01:00
head-inflate-data.c
head-nommu.S ARM: 9160/1: NOMMU: Reload __secondary_data after PROCINFO_INITFUNC 2021-12-17 12:02:16 +00:00
head.S ARM: head.S: rename PMD_ORDER to PMD_ENTRY_ORDER 2022-07-17 17:14:44 -07:00
hibernate.c
hw_breakpoint.c ARM: 9206/1: A9: Add ARM ERRATA 764319 workaround (Updated) 2022-05-20 12:33:48 +01:00
hyp-stub.S
insn.c ARM: 9078/1: Add warn suppress parameter to arm_gen_branch_link() 2021-06-07 12:56:20 +01:00
io.c
irq.c asm-generic: Conditionally enable do_softirq_own_stack() via Kconfig. 2022-09-05 17:20:55 +02:00
isa.c
iwmmxt.S
iwmmxt.h
jump_label.c jump_label: make initial NOP patching the special case 2022-06-24 09:48:55 +02:00
kgdb.c ARM: Fix kgdb breakpoint for Thumb2 2022-02-21 14:56:53 +00:00
machine_kexec.c
module-plts.c ARM: 9098/1: ftrace: MODULE_PLT: Fix build problem without DYNAMIC_FTRACE 2021-07-05 11:52:26 +01:00
module.c ARM: 9204/2: module: Add all unwind tables when load module 2022-05-20 12:34:55 +01:00
opcodes.c
paravirt.c
patch.c
perf_callchain.c perf: Drop dead and useless guest "support" from arm, csky, nds32 and riscv 2021-11-17 14:49:07 +01:00
perf_event_v6.c
perf_event_v7.c arm_pmu: Fix write counter incorrect in ARMv7 big-endian mode 2021-06-01 14:17:01 +01:00
perf_event_xscale.c
perf_regs.c
phys2virt.S
pj4-cp0.c
process.c Random number generator fixes for Linux 6.1-rc1. 2022-10-16 15:27:07 -07:00
psci_smp.c
ptrace.c ptrace: Create ptrace_report_syscall_{entry,exit} in ptrace.h 2022-03-10 13:35:08 -06:00
reboot.c ARM: 9219/1: fix undeclared soft_restart 2022-07-28 15:09:17 +01:00
reboot.h
relocate_kernel.S
return_address.c ARM: 9234/1: stacktrace: Avoid duplicate saving of exception PC value 2022-10-04 11:09:47 +01:00
setup.c efi/arm: libstub: move ARM specific code out of generic routines 2022-09-27 13:26:16 +02:00
signal.c treewide: use get_random_{u8,u16}() when possible, part 1 2022-10-11 17:42:58 -06:00
signal.h
sigreturn_codes.S
sleep.S ARM: mm: switch to swapper_pg_dir early for vmap'ed stack 2022-01-24 20:37:55 +01:00
smccc-call.S
smp.c profile: setup_profiling_timer() is moslty not implemented 2022-07-29 18:12:36 -07:00
smp_scu.c
smp_tlb.c
smp_twd.c
spectre.c ARM: fix build error when BPF_SYSCALL is disabled 2022-03-08 12:53:05 -08:00
stacktrace.c ARM: 9234/1: stacktrace: Avoid duplicate saving of exception PC value 2022-10-04 11:09:47 +01:00
suspend.c
swp_emulate.c uaccess: fix type mismatch warnings from access_ok() 2022-02-25 09:36:05 +01:00
sys_arm.c
sys_oabi-compat.c ARM: 9110/1: oabi-compat: fix oabi epoll sparse warning 2021-08-20 11:39:27 +01:00
tcm.c
thumbee.c
time.c
topology.c
traps.c ARM: 9224/1: Dump the stack traces based on the parameter 'regs' of show_regs() 2022-09-22 08:21:30 +01:00
unwind.c ARM: 9295/1: unwind:fix unwind abort for uleb128 case 2023-06-09 10:34:08 +02:00
v7m.c
vdso.c
vmlinux-xip.lds.S Merge branches 'devel-stable' and 'misc' into for-linus 2021-11-02 09:04:22 +00:00
vmlinux.lds.S ARM: implement support for vmap'ed stacks 2021-12-03 15:11:33 +01:00
xscale-cp0.c