mirror-linux/arch/riscv/kernel
Conor Dooley 0fad198fff RISC-V: take text_mutex during alternative patching
commit 9493e6f3ce upstream.

Guenter reported a splat during boot, that Samuel pointed out was the
lockdep assertion failing in patch_insn_write():

WARNING: CPU: 0 PID: 0 at arch/riscv/kernel/patch.c:63 patch_insn_write+0x222/0x2f6
epc : patch_insn_write+0x222/0x2f6
 ra : patch_insn_write+0x21e/0x2f6
epc : ffffffff800068c6 ra : ffffffff800068c2 sp : ffffffff81803df0
 gp : ffffffff81a1ab78 tp : ffffffff81814f80 t0 : ffffffffffffe000
 t1 : 0000000000000001 t2 : 4c45203a76637369 s0 : ffffffff81803e40
 s1 : 0000000000000004 a0 : 0000000000000000 a1 : ffffffffffffffff
 a2 : 0000000000000004 a3 : 0000000000000000 a4 : 0000000000000001
 a5 : 0000000000000000 a6 : 0000000000000000 a7 : 0000000052464e43
 s2 : ffffffff80b4889c s3 : 000000000000082c s4 : ffffffff80b48828
 s5 : 0000000000000828 s6 : ffffffff8131a0a0 s7 : 0000000000000fff
 s8 : 0000000008000200 s9 : ffffffff8131a520 s10: 0000000000000018
 s11: 000000000000000b t3 : 0000000000000001 t4 : 000000000000000d
 t5 : ffffffffd8180000 t6 : ffffffff81803bc8
status: 0000000200000100 badaddr: 0000000000000000 cause: 0000000000000003
[<ffffffff800068c6>] patch_insn_write+0x222/0x2f6
[<ffffffff80006a36>] patch_text_nosync+0xc/0x2a
[<ffffffff80003b86>] riscv_cpufeature_patch_func+0x52/0x98
[<ffffffff80003348>] _apply_alternatives+0x46/0x86
[<ffffffff80c02d36>] apply_boot_alternatives+0x3c/0xfa
[<ffffffff80c03ad8>] setup_arch+0x584/0x5b8
[<ffffffff80c0075a>] start_kernel+0xa2/0x8f8

This issue was exposed by 702e64550b ("riscv: fpu: switch has_fpu() to
riscv_has_extension_likely()"), as it is the patching in has_fpu() that
triggers the splats in Guenter's report.

Take the text_mutex before doing any code patching to satisfy lockdep.

Fixes: ff689fd21c ("riscv: add RISC-V Svpbmt extension support")
Fixes: a35707c3d8 ("riscv: add memory-type errata for T-Head")
Fixes: 1a0e5dbd37 ("riscv: sifive: Add SiFive alternative ports")
Reported-by: Guenter Roeck <linux@roeck-us.net>
Link: https://lore.kernel.org/all/20230212154333.GA3760469@roeck-us.net/
Signed-off-by: Conor Dooley <conor.dooley@microchip.com>
Reviewed-by: Samuel Holland <samuel@sholland.org>
Tested-by: Guenter Roeck <linux@roeck-us.net>
Link: https://lore.kernel.org/r/20230212194735.491785-1-conor@kernel.org
Cc: stable@vger.kernel.org
Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2023-05-17 11:53:41 +02:00
..
compat_vdso RISC-V: Stop emitting attributes 2023-03-17 08:50:14 +01:00
probes riscv: kprobe: Fixup misaligned load text 2023-02-14 19:11:53 +01:00
vdso riscv: vdso: fix section overlapping under some conditions 2022-11-29 18:45:53 -08:00
.gitignore .gitignore: add SPDX License Identifier 2020-03-25 11:50:48 +01:00
Makefile riscv: compat_syscall_table: Fixup compile warning 2023-05-17 11:53:35 +02:00
alternative.c riscv: make patch-function pointer more generic in cpu_manufacturer_info struct 2022-06-16 15:47:40 -07:00
asm-offsets.c RISC-V: Add arch functions for non-retentive suspend entry/exit 2022-03-10 09:29:31 -08:00
cacheinfo.c drivers: base: cacheinfo: Get rid of DEFINE_SMP_CALL_CACHE_FUNCTION() 2021-09-01 10:29:10 +02:00
compat_signal.c riscv: compat: signal: Add rt_frame implementation 2022-05-17 16:37:21 -07:00
compat_syscall_table.c riscv: compat: syscall: Add compat_sys_call_table implementation 2022-04-26 13:36:25 -07:00
cpu-hotplug.c riscv: cpu-hotplug: clear cpu from numa map when teardown 2022-02-10 09:16:50 -08:00
cpu.c RISC-V: Fix /proc/cpuinfo cpumask warning 2022-10-27 15:23:19 -07:00
cpu_ops.c RISC-V: Align SBI probe implementation with spec 2023-05-11 23:03:04 +09:00
cpu_ops_sbi.c riscv: cpu_ops_sbi: Add 64bit hartid support on RV64 2022-07-19 16:38:58 -07:00
cpu_ops_spinwait.c RISC-V: cpu_ops_spinwait.c should include head.h 2022-08-11 13:24:16 -07:00
cpufeature.c RISC-V: take text_mutex during alternative patching 2023-05-17 11:53:41 +02:00
crash_dump.c vmcore: convert copy_oldmem_page() to take an iov_iter 2022-04-29 14:37:59 -07:00
crash_save_regs.S RISC-V: Fixup get incorrect user mode PC for kernel mode regs 2022-08-11 08:54:40 -07:00
efi-header.S RISC-V: Add PE/COFF header for EFI stub 2020-10-02 14:31:16 -07:00
efi.c riscv: read-only pages should not be writable 2022-05-28 11:39:31 +02:00
elf_kexec.c RISC-V: kexec: Fix memory leak of elf header buffer 2023-01-07 11:11:53 +01:00
entry.S RISC-V: Fix unannoted hardirqs-on in return to userspace slow-path 2022-12-31 13:32:37 +01:00
fpu.S riscv: abstract out CSR names for supervisor vs machine mode 2019-11-05 09:20:42 -08:00
ftrace.c RISC-V: Don't check text_mutex during stop_machine 2023-03-17 08:50:29 +01:00
head.S riscv: fix -Wundef warning for CONFIG_RISCV_BOOT_SPINWAIT 2023-02-01 08:34:39 +01:00
head.h RISC-V: Move spinwait booting method to its own config 2022-01-20 09:27:16 -08:00
image-vars.h efi/libstub: use EFI provided memcpy/memset routines 2022-09-17 15:13:21 +02:00
irq.c RISC-V: Remove do_IRQ() function 2020-06-09 19:11:24 -07:00
jump_label.c jump_label: make initial NOP patching the special case 2022-06-24 09:48:55 +02:00
kexec_relocate.S riscv: Don't use va_pa_offset on kdump 2022-01-09 10:38:06 -08:00
kgdb.c riscv: Fix "no previous prototype" compile warning in kgdb.c file 2020-07-09 20:09:30 -07:00
machine_kexec.c riscv: kexec: Fixup crash_smp_send_stop without multi cores 2022-11-29 21:50:59 -08:00
machine_kexec_file.c RISC-V: Add kexec_file support 2022-05-19 12:14:18 -07:00
mcount-dyn.S riscv: ftrace: Reduce the detour code size to half 2023-03-10 09:34:30 +01:00
mcount.S riscv: Workaround mcount name prior to clang-13 2021-04-26 08:25:01 -07:00
module-sections.c
module.c riscv: implement module alternatives 2022-05-11 21:36:31 -07:00
patch.c RISC-V: Don't check text_mutex during stop_machine 2023-03-17 08:50:29 +01:00
perf_callchain.c riscv: Fix fill_callchain return value 2022-03-30 23:01:42 -07:00
perf_regs.c perf/arch: Remove perf_sample_data::regs_user_copy 2020-11-09 18:12:34 +01:00
process.c riscv: process: fix kernel info leakage 2022-11-10 13:43:15 -08:00
ptrace.c riscv: compat: ptrace: Add compat_arch_ptrace implement 2022-05-17 16:37:22 -07:00
reset.c riscv: Use do_kernel_power_off() 2022-05-19 19:30:30 +02:00
riscv_ksyms.c riscv: provide memmove implementation 2020-12-10 17:27:54 -08:00
sbi.c RISC-V: Align SBI probe implementation with spec 2023-05-11 23:03:04 +09:00
setup.c riscv: Do not set initial_boot_params to the linear address of the dtb 2023-05-01 08:26:28 +09:00
signal.c riscv: add icache flush for nommu sigreturn trampoline 2023-04-20 12:35:12 +02:00
smp.c riscv: kexec: Fixup crash_smp_send_stop without multi cores 2022-11-29 21:50:59 -08:00
smpboot.c riscv: Move call to init_cpu_topology() to later initialization stage 2023-02-01 08:34:48 +01:00
soc.c riscv: Fix builtin DTB handling 2021-01-07 19:00:50 -08:00
stacktrace.c riscv: Use READ_ONCE_NOCHECK in imprecise unwinding stack mode 2023-03-17 08:50:29 +01:00
suspend.c RISC-V: Add arch functions for non-retentive suspend entry/exit 2022-03-10 09:29:31 -08:00
suspend_entry.S RISC-V: Split out the XIP fixups into their own file 2022-05-25 14:43:33 -07:00
sys_riscv.c riscv: Allow PROT_WRITE-only mmap() 2022-09-22 09:44:59 -07:00
syscall_table.c riscv/vdso: Refactor asm/vdso.h 2021-10-02 13:42:23 -07:00
time.c RISC-V: time: initialize hrtimer based broadcast clock event device 2023-03-10 09:33:03 +01:00
trace_irq.c riscv: fix oops caused by irqsoff latency tracer 2022-02-24 20:30:30 -08:00
trace_irq.h riscv: fix oops caused by irqsoff latency tracer 2022-02-24 20:30:30 -08:00
traps.c riscv: Avoid enabling interrupts in die() 2023-03-10 09:34:29 +01:00
traps_misaligned.c riscv: traps_misaligned: do not duplicate stringify 2022-08-11 08:56:53 -07:00
vdso.c RISC-V Patches for the 6.1 Merge Window, Part 2 2022-10-14 11:21:11 -07:00
vmlinux-xip.lds.S riscv: vmlinux.lds.S|vmlinux-xip.lds.S: remove `.fixup` section 2022-01-05 17:53:37 -08:00
vmlinux.lds.S riscv: vmlinux.lds.S|vmlinux-xip.lds.S: remove `.fixup` section 2022-01-05 17:53:37 -08:00