linux/arch/arm64
Mark Rutland 39138093f1 arm64: alternatives: make clean_dcache_range_nopatch() noinstr-safe
When patching kernel alternatives, we need to be careful not to execute
kernel code which is itself subject to patching. In general, if code is
executed after the instructions in memory have been patched but prior to
the cache maintenance and barriers completing, it could lead to
UNPREDICTABLE results.

As our regular cache maintenance routines are patched with alternatives,
we have a clean_dcache_range_nopatch() function which is *intended* to
avoid patchable code and therefore supposed to be safe in the middle of
patching alternatives. Unfortunately, it's not marked as 'noinstr', and
so can be instrumented with patchable code.

Additionally, it calls read_sanitised_ftr_reg() (which may be
instrumented with patchable code) to find the sanitized value of
CTR_EL0.DminLine, and is therefore not safe to call during patching.

Luckily, since commit:

  675b0563d6 ("arm64: cpufeature: expose arm64_ftr_reg struct for CTR_EL0")

... we can read the sanitised CTR_EL0 value directly, and avoid the call
to read_sanitised_ftr_reg().

This patch marks clean_dcache_range_nopatch() as noinstr, and has it
read the sanitized CTR_EL0 value directly, avoiding the issues above.

As a bonus, this is also an optimization. As read_sanitised_ftr_reg()
performs a binary search to find the CTR_EL0 value, reading the value
directly avoids this binary search per applied alternative, avoiding
some unnecessary work.

Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Cc: Will Deacon <will@kernel.org>
Link: https://lore.kernel.org/r/20230616103150.1238132-1-mark.rutland@arm.com
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
2023-06-21 16:07:45 +01:00
..
boot hte: Changes for v6.4-rc1 2023-05-03 11:00:27 -07:00
configs arm64: defconfig: enable building the nvmem-reboot-mode module 2023-04-17 16:38:41 +02:00
crypto crypto: arm64/aes-neonbs - fix crash with CFI enabled 2023-03-14 17:06:44 +08:00
hyperv
include arm64/mm: remove now-superfluous ISBs from TTBR writes 2023-06-15 17:47:54 +01:00
kernel arm64: alternatives: make clean_dcache_range_nopatch() noinstr-safe 2023-06-21 16:07:45 +01:00
kvm Merge branch kvm-arm64/pgtable-fixes-6.4 into kvmarm-master/fixes 2023-05-11 15:26:01 +01:00
lib arm: uaccess: Remove memcpy_page_flushcache() 2023-03-27 16:26:19 +01:00
mm arm64: mm: fix VA-range sanity check 2023-06-15 17:51:07 +01:00
net bpf, arm64: Fixed a BTI error on returning to patched function 2023-04-03 17:44:03 +02:00
tools arm64/cpucaps: increase string width to properly format cpucaps.h 2023-06-06 17:23:27 +01:00
xen
Kbuild
Kconfig - Nick Piggin's "shoot lazy tlbs" series, to improve the peformance of 2023-04-27 19:42:02 -07:00
Kconfig.debug
Kconfig.platforms arm64 updates for 6.3: 2023-02-21 15:27:48 -08:00
Makefile arm64 updates for 6.3: 2023-02-21 15:27:48 -08:00