linux/arch/arm64/kernel
Mark Rutland 9b0b26580a arm64: efi: Fix stub cache maintenance
While efi-entry.S mentions that efi_entry() will have relocated the
kernel image, it actually means that efi_entry will have placed a copy
of the kernel in the appropriate location, and until this is branched to
at the end of efi_entry.S, all instructions are executed from the
original image.

Thus while the flush in efi_entry.S does ensure that the copy is visible
to noncacheable accesses, it does not guarantee that this is true for
the image instructions are being executed from. This could have
disasterous effects when the MMU and caches are disabled if the image
has not been naturally evicted to the PoC.

Additionally, due to a missing dsb following the ic ialluis, the new
kernel image is not necessarily clean in the I-cache when it is branched
to, with similar potentially disasterous effects.

This patch adds additional flushing to ensure that the currently
executing stub text is flushed to the PoC and is thus visible to
noncacheable accesses. As it is placed after the instructions cache
maintenance for the new image and __flush_dcache_area already contains a
dsb, we do not need to add a separate barrier to ensure completion of
the icache maintenance.

Comments are updated to clarify the situation with regard to the two
images and the maintenance required for both.

Fixes: 3c7f255039
Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Acked-by: Joel Schopp <joel.schopp@amd.com>
Reviewed-by: Roy Franz <roy.franz@linaro.org>
Tested-by: Tom Lendacky <thomas.lendacky@amd.com>
Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Ian Campbell <ijc@hellion.org.uk>
Cc: Leif Lindholm <leif.lindholm@linaro.org>
Cc: Mark Salter <msalter@redhat.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: stable@vger.kernel.org
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
2014-11-13 14:47:59 +00:00
..
vdso arm64: vdso: fix build error when switching from LE to BE 2014-07-30 15:06:35 +01:00
.gitignore
arm64ksyms.c arm64: Add ftrace support 2014-05-29 09:08:08 +01:00
asm-offsets.c arm64: KVM: implement lazy world switch for debug registers 2014-07-11 04:57:46 -07:00
cpu_ops.c arm64: kernel: enable PSCI cpu operations on UP systems 2014-07-18 15:23:25 +01:00
cpuidle.c arm64: kernel: introduce cpu_init_idle CPU operation 2014-09-12 10:48:55 +01:00
cpuinfo.c arm64: don't flag non-aliasing VIPT I-caches as aliasing 2014-09-08 14:39:18 +01:00
cputable.c arm64: add CPU_HOTPLUG infrastructure 2013-10-25 11:33:21 +01:00
debug-monitors.c KVM/ARM New features for 3.17 include: 2014-08-05 09:47:45 +02:00
efi-entry.S arm64: efi: Fix stub cache maintenance 2014-11-13 14:47:59 +00:00
efi-stub.c arm64/efi: efistub: don't abort if base of DRAM is occupied 2014-09-08 14:39:18 +01:00
efi.c Merge branch 'next' into efi-next-merge 2014-10-03 22:15:56 +01:00
entry-fpsimd.S arm64: fpsimd: fix a typo in fpsimd_save_partial_state ENDPROC 2014-07-31 11:42:42 +01:00
entry-ftrace.S arm64, ftrace: Remove check of obsolete variable function_trace_stop 2014-07-18 13:58:10 -04:00
entry.S arm64: debug: don't re-enable debug exceptions on return from el1_dbg 2014-09-23 15:49:34 +01:00
fpsimd.c arm64: fix bug for reloading FPSIMD state after cpu power off 2014-09-01 12:55:21 +01:00
ftrace.c arm64: Correct ftrace calls to aarch64_insn_gen_branch_imm() 2014-09-19 12:05:45 +01:00
head.S arm64/efi: efistub: cover entire static mem footprint in PE/COFF .text 2014-09-08 14:39:18 +01:00
hw_breakpoint.c arm64: is_compat_task is defined both in asm/compat.h and linux/compat.h 2014-05-12 16:43:29 +01:00
hyp-stub.S irqchip: gic-v3: Initial support for GICv3 2014-07-08 22:11:47 +00:00
image.h arm64: Update the Image header 2014-07-10 12:36:40 +01:00
insn.c arm64: insn: Add return statements after BUG_ON() 2014-09-25 15:32:48 +01:00
io.c
irq.c Merge branch 'irq-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip 2014-10-09 06:42:04 -04:00
jump_label.c arm64, jump label: optimize jump label implementation 2014-01-08 15:23:53 +00:00
kgdb.c arm64: Fix typos in KGDB macros 2014-09-25 15:35:41 +01:00
kuser32.S arm64: Add __NR_* definitions for compat syscalls 2014-07-10 11:02:40 +01:00
Makefile PCI changes for the v3.18 merge window: 2014-10-09 15:03:49 -04:00
module.c arm64: move encode_insn_immediate() from module.c to insn.c 2014-01-08 15:21:29 +00:00
pci.c arm64: Add architectural support for PCI 2014-09-30 17:08:57 -06:00
perf_event.c ARM64: make of_device_ids const 2014-10-03 14:49:28 +01:00
perf_regs.c arm64: perf: don't rely on layout of pt_regs when grabbing sp or pc 2014-08-28 20:01:50 +01:00
process.c arm64: ASLR: Don't randomise text when randomise_va_space == 0 2014-10-24 15:47:49 +01:00
psci.c arm64: psci: fix cpu_suspend to check idle state type for index 2014-10-30 16:29:07 +00:00
ptrace.c Merge git://git.infradead.org/users/eparis/audit 2014-10-19 16:25:56 -07:00
return_address.c arm64: LLVMLinux: Use global stack pointer in return_address() 2014-09-08 14:39:19 +01:00
setup.c setup: Move unmask of async interrupts after possible earlycon setup 2014-09-15 18:15:09 +01:00
signal32.c Merge branch 'signal-cleanup' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/misc 2014-08-09 09:58:12 -07:00
signal.c arm64: Use sigsp() 2014-08-06 13:03:45 +02:00
sleep.S arm64: kernel: refactor the CPU suspend API for retention states 2014-09-12 10:48:55 +01:00
smp_spin_table.c arm64: spin-table: handle unmapped cpu-release-addrs 2014-09-08 14:39:18 +01:00
smp.c arm64: Tell irq work about self IPI support 2014-09-13 18:46:13 +02:00
stacktrace.c arm64: LLVMLinux: Use current_stack_pointer in save_stack_trace_tsk 2014-09-08 14:39:19 +01:00
suspend.c arm64: kernel: refactor the CPU suspend API for retention states 2014-09-12 10:48:55 +01:00
sys32.S arm64: compat: correct register concatenation for syscall wrappers 2013-10-25 15:59:36 +01:00
sys_compat.c arm64: flush TLS registers during exec 2014-09-11 18:34:58 +01:00
sys.c arm64: switch to generic sigaltstack 2013-02-14 09:17:29 -05:00
time.c arm64: kernel: initialize broadcast hrtimer based clock event device 2014-05-30 17:48:13 +01:00
topology.c arm64: topology: add MPIDR-based detection 2014-07-09 12:22:40 +01:00
traps.c arm64: LLVMLinux: Use current_stack_pointer in kernel/traps.c 2014-09-08 14:39:19 +01:00
vdso.c arm64,ia64,ppc,s390,sh,tile,um,x86,mm: remove default gate area 2014-08-08 15:57:27 -07:00
vmlinux.lds.S ARM: 8168/1: extend __init_end to a page align address 2014-10-02 21:28:16 +01:00