linux/arch/powerpc/kernel
Naveen N. Rao bd55e792de powerpc/module_64: Use special stub for _mcount() with -mprofile-kernel
Since commit c55d7b5e64 ("powerpc: Remove STRICT_KERNEL_RWX
incompatibility with RELOCATABLE"), powerpc kernels with
-mprofile-kernel can crash in certain scenarios with a trace like below:

    BUG: Unable to handle kernel instruction fetch (NULL pointer?)
    Faulting instruction address: 0x00000000
    Oops: Kernel access of bad area, sig: 11 [#1]
    LE PAGE_SIZE=64K MMU=Radix SMP NR_CPUS=256 DEBUG_PAGEALLOC NUMA PowerNV
    <snip>
    NIP [0000000000000000] 0x0
    LR [c0080000102c0048] ext4_iomap_end+0x8/0x30 [ext4]
    Call Trace:
     iomap_apply+0x20c/0x920 (unreliable)
     iomap_bmap+0xfc/0x160
     ext4_bmap+0xa4/0x180 [ext4]
     bmap+0x4c/0x80
     jbd2_journal_init_inode+0x44/0x1a0 [jbd2]
     ext4_load_journal+0x440/0x860 [ext4]
     ext4_fill_super+0x342c/0x3ab0 [ext4]
     mount_bdev+0x25c/0x290
     ext4_mount+0x28/0x50 [ext4]
     legacy_get_tree+0x4c/0xb0
     vfs_get_tree+0x4c/0x130
     do_mount+0xa18/0xc50
     sys_mount+0x158/0x180
     system_call+0x5c/0x68

The NIP points to NULL, or a random location (data even), while the LR
always points to the LEP of a function (with an offset of 8), indicating
that something went wrong with ftrace. However, ftrace is not
necessarily active when such crashes occur.

The kernel OOPS sometimes follows a warning from ftrace indicating that
some module functions could not be patched with a nop. Other times, if a
module is loaded early during boot, instruction patching can fail due to
a separate bug, but the error is not reported due to missing error
reporting.

In all the above cases when instruction patching fails, ftrace will be
disabled but certain kernel module functions will be left with default
calls to _mcount(). This is not a problem with ELFv1. However, with
-mprofile-kernel, the default stub is problematic since it depends on a
valid module TOC in r2. If the kernel (or a different module) calls into
a function that does not use the TOC, the function won't have a prologue
to setup the module TOC. When that function calls into _mcount(), we
will end up in the relocation stub that will use the previous TOC, and
end up trying to jump into a random location. From the above trace:

	iomap_apply+0x20c/0x920 [kernel TOC]
			|
			V
	ext4_iomap_end+0x8/0x30 [no GEP == kernel TOC]
			|
			V
		_mcount() stub
	[uses kernel TOC -> random entry]

To address this, let's change over to using the special stub that is
used for ftrace_[regs_]caller() for _mcount(). This ensures that we are
not dependent on a valid module TOC in r2 for default _mcount()
handling.

Reported-by: Qian Cai <cai@lca.pw>
Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
Tested-by: Qian Cai <cai@lca.pw>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/8affd4298d22099bbd82544fab8185700a6222b1.1587488954.git.naveen.n.rao@linux.vnet.ibm.com
2020-06-02 20:59:16 +10:00
..
ptrace powerpc/watchpoint: Use builtin ALIGN*() macros 2020-05-19 00:11:05 +10:00
syscalls asm-generic: fix unistd_32.h generation format 2020-04-07 10:43:42 -07:00
trace powerpc: Add a probe_kernel_read_inst() function 2020-05-19 00:10:37 +10:00
vdso32 powerpc/vdso32: Fallback on getres syscall when clock is unknown 2020-05-11 19:24:29 +10:00
vdso64 .gitignore: add SPDX License Identifier 2020-03-25 11:50:48 +01:00
.gitignore .gitignore: add SPDX License Identifier 2020-03-25 11:50:48 +01:00
align.c powerpc: Define and use get_user_instr() et. al. 2020-05-19 00:10:37 +10:00
asm-offsets.c powerpc/xmon: Move breakpoints to text section 2020-05-19 00:10:36 +10:00
audit.c
btext.c powerpc: Prefer __section and __printf from compiler_attributes.h 2020-03-27 00:16:32 +11:00
cacheinfo.c
cacheinfo.h
compat_audit.c
cpu_setup_6xx.S powerpc/32: Blacklist functions running with MMU disabled for kprobe 2020-06-02 20:59:11 +10:00
cpu_setup_44x.S
cpu_setup_fsl_booke.S powerpc/booke: Spelling s/date/data/ 2019-11-17 01:56:31 -06:00
cpu_setup_pa6t.S
cpu_setup_power.S powerpc/64s: Set reserved PCR bits 2019-09-21 08:36:53 +10:00
cpu_setup_ppc970.S
cputable.c powerpc/40x: Remove support for IBM 405GP 2020-05-28 23:24:36 +10:00
crash_dump.c powerpc: Add prefixed instructions to instruction data type 2020-05-19 00:10:39 +10:00
dawr.c powerpc/watchpoint: Disable all available watchpoints when !dawr_force_enable 2020-05-19 00:11:05 +10:00
dbell.c KVM: PPC: Book3S HV: use smp_mb() when setting/clearing host_ipi flag 2019-09-24 12:46:26 +10:00
dma-iommu.c powerpc updates for 5.4 2019-09-20 11:48:06 -07:00
dma-mask.c
dma-swiotlb.c
dt_cpu_ftrs.c powerpc/64: Setup a paca before parsing device tree etc. 2020-03-25 12:09:37 +11:00
early_32.c powerpc/fsl_booke/32: implement KASLR infrastructure 2019-11-13 19:27:40 +11:00
eeh_cache.c powerpc/eeh_cache: Don't use pci_dn when inserting new ranges 2020-01-23 21:31:18 +11:00
eeh_dev.c
eeh_driver.c powerpc/eeh: Fix deadlock handling dead PHB 2020-02-17 12:47:05 +11:00
eeh_event.c
eeh_pe.c
eeh_sysfs.c powerpc/eeh_sysfs: Make clearing EEH_DEV_SYSFS saner 2020-01-23 21:31:19 +11:00
eeh.c powerpc/eeh: Release EEH device state synchronously 2020-05-18 21:58:44 +10:00
entry_32.S powerpc/entry32: Blacklist exception exit points for kprobe. 2020-06-02 20:59:13 +10:00
entry_64.S powerpc/64s/kuap: Conditionally restore AMR in kuap_restore_amr asm 2020-05-28 23:24:37 +10:00
epapr_hcalls.S
epapr_paravirt.c powerpc: Use a datatype for instructions 2020-05-19 00:10:37 +10:00
exceptions-64e.S powerpc/64s: Implement interrupt exit logic in C 2020-04-01 13:42:14 +11:00
exceptions-64s.S powerpc/64s/kuap: Conditionally restore AMR in kuap_restore_amr asm 2020-05-28 23:24:37 +10:00
fadump.c powerpc/fadump: Account for memory_limit while reserving memory 2020-06-02 20:59:05 +10:00
firmware.c
fpu.S powerpc/32: Blacklist functions running with MMU disabled for kprobe 2020-06-02 20:59:11 +10:00
fsl_booke_entry_mapping.S powerpc/fsl_booke/32: implement KASLR infrastructure 2019-11-13 19:27:40 +11:00
head_8xx.S powerpc/8xx: Map linear memory with huge pages 2020-05-26 22:22:23 +10:00
head_32.h Merge branch 'fixes' into next 2020-03-10 15:16:42 +11:00
head_32.S powerpc/rtas: Remove machine_check_in_rtas() 2020-06-02 20:59:11 +10:00
head_40x.S powerpc/40x: Don't save CR in SPRN_SPRG_SCRATCH6 2020-05-28 23:24:36 +10:00
head_44x.S
head_64.S powerpc/64: Don't initialise init_task->thread.regs 2020-05-15 11:58:54 +10:00
head_booke.h powerpc: Replace _ALIGN_UP() by ALIGN() 2020-05-11 23:15:15 +10:00
head_fsl_booke.S powerpc/32: save DEAR/DAR before calling handle_page_fault 2020-01-26 22:15:09 +11:00
hw_breakpoint.c powerpc/watchpoint: Don't allow concurrent perf and ptrace events 2020-05-19 00:14:45 +10:00
idle_6xx.S powerpc/32: Blacklist functions running with MMU disabled for kprobe 2020-06-02 20:59:11 +10:00
idle_book3e.S
idle_book3s.S powerpc/64s: Reimplement power4_idle code in C 2020-01-16 14:59:37 +10:00
idle_e500.S powerpc/32: Blacklist functions running with MMU disabled for kprobe 2020-06-02 20:59:11 +10:00
idle.c powerpc/64s: Reimplement power4_idle code in C 2020-01-16 14:59:37 +10:00
ima_arch.c powerpc/ima: Fix secure boot rules in ima arch policy 2020-05-07 17:25:54 +10:00
io-workarounds.c
io.c
iomap.c
iommu.c
irq.c powerpc/64s: Fix doorbell wakeup msgclr optimisation 2020-04-03 00:09:53 +11:00
isa-bridge.c
jump_label.c powerpc: Use a datatype for instructions 2020-05-19 00:10:37 +10:00
kgdb.c powerpc: Use a datatype for instructions 2020-05-19 00:10:37 +10:00
kprobes-ftrace.c
kprobes.c powerpc/kprobes: Use probe_address() to read instructions 2020-06-02 20:59:08 +10:00
kvm_emul.S
kvm.c
l2cr_6xx.S powerpc/32: Blacklist functions running with MMU disabled for kprobe 2020-06-02 20:59:11 +10:00
legacy_serial.c tty/serial: Migrate 8250_fsl to use has_sysrq 2019-12-18 15:04:42 +01:00
Makefile powerpc/64: make buildable without CONFIG_COMPAT 2020-04-03 00:10:00 +11:00
mce_power.c powerpc: Use a function for reading instructions 2020-05-19 00:10:37 +10:00
mce.c powerpc/64s: machine check do not trace real-mode handler 2020-05-19 00:10:34 +10:00
misc_32.S powerpc/32: Blacklist functions running with MMU disabled for kprobe 2020-06-02 20:59:11 +10:00
misc_64.S Merge branch 'topic/kaslr-book3e32' into next 2019-11-14 19:23:33 +11:00
misc.S powerpc/32: Blacklist functions running with MMU disabled for kprobe 2020-06-02 20:59:11 +10:00
module_32.c powerpc: module_[32|64].c: replace swap function with built-in one 2020-05-11 23:15:14 +10:00
module_64.c powerpc/module_64: Use special stub for _mcount() with -mprofile-kernel 2020-06-02 20:59:16 +10:00
module.c
module.lds
msi.c
note.S
nvram_64.c powerpc: Replace _ALIGN_UP() by ALIGN() 2020-05-11 23:15:15 +10:00
of_platform.c powerpc/eeh: Make early EEH init pseries specific 2020-03-25 12:09:39 +11:00
optprobes_head.S powerpc: Add prefixed instructions to instruction data type 2020-05-19 00:10:39 +10:00
optprobes.c powerpc: Add ppc_inst_as_u64() 2020-05-26 23:36:57 +10:00
paca.c powerpc/rtas: Implement reentrant rtas call 2020-06-02 20:59:08 +10:00
pci_32.c
pci_64.c powerpc: Replace _ALIGN_UP() by ALIGN() 2020-05-11 23:15:15 +10:00
pci_dn.c powerpc/pcidn: Warn when sriov pci_dn management is used incorrectly 2020-01-23 21:31:19 +11:00
pci_of_scan.c powerpc/pci: Remove pcibios_setup_bus_devices() 2020-01-06 16:25:29 +11:00
pci-common.c powerpc updates for 5.7 2020-04-05 11:12:59 -07:00
pci-hotplug.c powerpc/eeh: Release EEH device state synchronously 2020-05-18 21:58:44 +10:00
pmc.c
ppc32.h
ppc_save_regs.S powerpc: Improve ppc_save_regs() 2020-04-04 21:40:57 +11:00
proc_powerpc.c proc: convert everything to "struct proc_ops" 2020-02-04 03:05:26 +00:00
process.c powerpc/watchpoint: Prepare handler to handle more than one watchpoint 2020-05-19 00:14:37 +10:00
prom_init_check.sh powerpc/prom_init: Undo relocation before entering secure mode 2019-10-29 15:12:17 +11:00
prom_init.c powerpc: Replace _ALIGN() by ALIGN() 2020-05-11 23:15:16 +10:00
prom_parse.c
prom.c powerpc/kernel: Enables memory hot-remove after reboot on pseries guests 2020-06-02 20:59:07 +10:00
reloc_32.S
reloc_64.S
rtas_flash.c proc: convert everything to "struct proc_ops" 2020-02-04 03:05:26 +00:00
rtas_pci.c
rtas-proc.c proc: convert everything to "struct proc_ops" 2020-02-04 03:05:26 +00:00
rtas-rtc.c
rtas.c powerpc/rtas: Implement reentrant rtas call 2020-06-02 20:59:08 +10:00
rtasd.c proc: convert everything to "struct proc_ops" 2020-02-04 03:05:26 +00:00
secure_boot.c powerpc: Detect the trusted boot state of the system 2019-11-12 12:25:49 +11:00
security.c powerpc: Use a macro for creating instructions from u32s 2020-05-19 00:10:36 +10:00
secvar-ops.c powerpc/powernv: Add OPAL API interface to access secure variable 2019-11-13 00:33:22 +11:00
secvar-sysfs.c powerpc: expose secure variables to userspace via sysfs 2019-11-13 00:33:22 +11:00
setup_32.c powerpc/mm: Allocate static page tables for fixmap 2020-05-26 22:22:19 +10:00
setup_64.c Merge branch 'fixes' into next 2020-05-26 22:56:03 +10:00
setup-common.c powerpc/40x: Remove support for IBM 403GCX 2020-05-28 23:24:35 +10:00
setup.h powerpc/64: Prevent stack protection in early boot 2020-03-25 12:09:38 +11:00
signal_32.c powerpc: Use trap metadata to prevent double restart rather than zeroing trap 2020-05-15 11:58:54 +10:00
signal_64.c powerpc: Use trap metadata to prevent double restart rather than zeroing trap 2020-05-15 11:58:54 +10:00
signal.c powerpc/watchpoint: Convert thread_struct->hw_brk to an array 2020-05-19 00:11:05 +10:00
signal.h powerpc/64/sycall: Implement syscall entry/exit logic in C 2020-04-01 13:42:13 +11:00
smp-tbsync.c
smp.c powerpc: Fix misleading small cores print 2020-06-02 20:59:06 +10:00
stacktrace.c powerpc: Rename current_stack_pointer() to current_stack_frame() 2020-03-04 22:44:28 +11:00
suspend.c
swsusp_32.S powerpc/32: Blacklist functions running with MMU disabled for kprobe 2020-06-02 20:59:11 +10:00
swsusp_64.c
swsusp_asm64.S
swsusp_booke.S
swsusp.c
sys_ppc32.c
syscall_64.c powerpc/64/kuap: Conditionally restore AMR in interrupt exit 2020-05-28 23:24:37 +10:00
syscalls.c y2038: syscalls: change remaining timeval to __kernel_old_timeval 2019-11-15 14:38:29 +01:00
sysfs.c powerpc/sysfs: Show idle_purr and idle_spurr for every CPU 2020-04-30 12:35:26 +10:00
systbl_chk.sh
systbl.S powerpc/64/sycall: Implement syscall entry/exit logic in C 2020-04-01 13:42:13 +11:00
tau_6xx.c
time.c Revert "powerpc/64: irq_work avoid interrupt when called with hardware irqs enabled" 2020-04-03 16:55:34 +11:00
tm.S
traps.c powerpc: Support prefixed instructions in alignment handler 2020-05-19 00:11:03 +10:00
ucall.S
udbg_16550.c
udbg.c powerpc/udbg: Make it safe to call udbg_printf() always 2019-10-11 19:33:25 +11:00
uprobes.c powerpc: Add ppc_inst_next() 2020-05-26 23:36:51 +10:00
vdso.c powerpc/64: make buildable without CONFIG_COMPAT 2020-04-03 00:10:00 +11:00
vecemu.c powerpc: Define and use get_user_instr() et. al. 2020-05-19 00:10:37 +10:00
vector.S powerpc/32: Blacklist functions running with MMU disabled for kprobe 2020-06-02 20:59:11 +10:00
vmlinux.lds.S powerpc/mm: Don't be too strict with _etext alignment on PPC32 2020-05-26 22:22:22 +10:00
watchdog.c