For now, we use stop_machine() to patch the text and when we use IPIs for remote icache flushes (which is emitted in patch_text_nosync()), the system hangs. So instead, make sure every CPU executes the stop_machine() patching function and emit a local icache flush there. Co-developed-by: Björn Töpel <bjorn@rivosinc.com> Signed-off-by: Björn Töpel <bjorn@rivosinc.com> Signed-off-by: Alexandre Ghiti <alexghiti@rivosinc.com> Reviewed-by: Andrea Parri <parri.andrea@gmail.com> Link: https://lore.kernel.org/r/20240229121056.203419-3-alexghiti@rivosinc.com Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
16 lines
449 B
C
16 lines
449 B
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Copyright (C) 2020 SiFive
|
|
*/
|
|
|
|
#ifndef _ASM_RISCV_PATCH_H
|
|
#define _ASM_RISCV_PATCH_H
|
|
|
|
int patch_insn_write(void *addr, const void *insn, size_t len);
|
|
int patch_text_nosync(void *addr, const void *insns, size_t len);
|
|
int patch_text_set_nosync(void *addr, u8 c, size_t len);
|
|
int patch_text(void *addr, u32 *insns, int ninsns);
|
|
|
|
extern int riscv_patch_in_stop_machine;
|
|
|
|
#endif /* _ASM_RISCV_PATCH_H */
|