summaryrefslogtreecommitdiffstats
path: root/arch/arm64/kernel/machine_kexec.c
diff options
context:
space:
mode:
authorFuad Tabba <tabba@google.com>2021-05-24 09:29:49 +0100
committerWill Deacon <will@kernel.org>2021-05-25 19:27:48 +0100
commit5e20e3499682c4f1724438d23afcafd473526a54 (patch)
tree9de38982cdca58bc66574f09186b7dcb64b0d866 /arch/arm64/kernel/machine_kexec.c
parent7908072da535dca52b3a011ed6e1f73534546b59 (diff)
downloadlinux-5e20e3499682c4f1724438d23afcafd473526a54.tar.gz
linux-5e20e3499682c4f1724438d23afcafd473526a54.tar.bz2
linux-5e20e3499682c4f1724438d23afcafd473526a54.zip
arm64: Downgrade flush_icache_range to invalidate
Since __flush_dcache_area is called right before, invalidate_icache_range is sufficient in this case. Rewrite the comment to better explain the rationale behind the cache maintenance operations used here. No functional change intended. Possible performance impact due to invalidating only the icache rather than invalidating and cleaning both caches. Reported-by: Catalin Marinas <catalin.marinas@arm.com> Reported-by: Will Deacon <will@kernel.org> Link: https://lore.kernel.org/linux-arch/20200511110014.lb9PEahJ4hVOYrbwIb_qUHXyNy9KQzNFdb_I3YlzY6A@z/ Acked-by: Mark Rutland <mark.rutland@arm.com> Signed-off-by: Fuad Tabba <tabba@google.com> Acked-by: Catalin Marinas <catalin.marinas@arm.com> Reviewed-by: Ard Biesheuvel <ardb@kernel.org> Link: https://lore.kernel.org/r/20210524083001.2586635-7-tabba@google.com Signed-off-by: Will Deacon <will@kernel.org>
Diffstat (limited to 'arch/arm64/kernel/machine_kexec.c')
-rw-r--r--arch/arm64/kernel/machine_kexec.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/arch/arm64/kernel/machine_kexec.c b/arch/arm64/kernel/machine_kexec.c
index 90a335c74442..a03944fd0cd4 100644
--- a/arch/arm64/kernel/machine_kexec.c
+++ b/arch/arm64/kernel/machine_kexec.c
@@ -68,10 +68,14 @@ int machine_kexec_post_load(struct kimage *kimage)
kimage->arch.kern_reloc = __pa(reloc_code);
kexec_image_info(kimage);
- /* Flush the reloc_code in preparation for its execution. */
+ /*
+ * For execution with the MMU off, reloc_code needs to be cleaned to the
+ * PoC and invalidated from the I-cache.
+ */
__flush_dcache_area(reloc_code, arm64_relocate_new_kernel_size);
- flush_icache_range((uintptr_t)reloc_code, (uintptr_t)reloc_code +
- arm64_relocate_new_kernel_size);
+ invalidate_icache_range((uintptr_t)reloc_code,
+ (uintptr_t)reloc_code +
+ arm64_relocate_new_kernel_size);
return 0;
}