]> git.baikalelectronics.ru Git - kernel.git/commit
arm64: ftrace: Ensure synchronisation in PLT setup for Neoverse-N1 #1542419
authorJames Morse <james.morse@arm.com>
Wed, 2 Oct 2019 09:49:35 +0000 (10:49 +0100)
committerWill Deacon <will@kernel.org>
Fri, 4 Oct 2019 10:44:05 +0000 (11:44 +0100)
commit9cd61d2af52567d011e934ba6d2c4178f9c71c51
treeb7b2acb8ff0eab645c69150cece3d6415bd996e8
parent5310d093061779e8d5e9a2c91da044c9ed334cf2
arm64: ftrace: Ensure synchronisation in PLT setup for Neoverse-N1 #1542419

CPUs affected by Neoverse-N1 #1542419 may execute a stale instruction if
it was recently modified. The affected sequence requires freshly written
instructions to be executable before a branch to them is updated.

There are very few places in the kernel that modify executable text,
all but one come with sufficient synchronisation:
 * The module loader's flush_module_icache() calls flush_icache_range(),
   which does a kick_all_cpus_sync()
 * bpf_int_jit_compile() calls flush_icache_range().
 * Kprobes calls aarch64_insn_patch_text(), which does its work in
   stop_machine().
 * static keys and ftrace both patch between nops and branches to
   existing kernel code (not generated code).

The affected sequence is the interaction between ftrace and modules.
The module PLT is cleaned using __flush_icache_range() as the trampoline
shouldn't be executable until we update the branch to it.

Drop the double-underscore so that this path runs kick_all_cpus_sync()
too.

Signed-off-by: James Morse <james.morse@arm.com>
Signed-off-by: Will Deacon <will@kernel.org>
arch/arm64/kernel/ftrace.c