linux/arch/arm64/kernel
Will Deacon 130c93fd10 arm64: efi: don't restore TTBR0 if active_mm points at init_mm
init_mm isn't a normal mm: it has swapper_pg_dir as its pgd (which
contains kernel mappings) and is used as the active_mm for the idle
thread.

When restoring the pgd after an EFI call, we write current->active_mm
into TTBR0. If the current task is actually the idle thread (e.g. when
initialising the EFI RTC before entering userspace), then the TLB can
erroneously populate itself with junk global entries as a result of
speculative table walks.

When we do eventually return to userspace, the task can end up hitting
these junk mappings leading to lockups, corruption or crashes.

This patch fixes the problem in the same way as the CPU suspend code by
ensuring that we never switch to the init_mm in efi_set_pgd and instead
point TTBR0 at the zero page. A check is also added to cpu_switch_mm to
BUG if we get passed swapper_pg_dir.

Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Fixes: f3cdfd239d ("arm64/efi: move SetVirtualAddressMap() to UEFI stub")
Signed-off-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
2015-03-20 17:05:16 +00:00
..
vdso arm64: vdso: minor ABI fix for clock_getres 2015-02-26 18:13:51 +00:00
.gitignore
alternative.c arm64: add module support for alternatives fixups 2014-12-04 10:28:24 +00:00
arm64ksyms.c arm64: Add ftrace support 2014-05-29 09:08:08 +01:00
armv8_deprecated.c arm64: Emulate SETEND for AArch32 tasks 2015-01-23 17:11:44 +00:00
asm-offsets.c Fairly small update, but there are some interesting new features. 2015-02-13 09:55:09 -08:00
cacheinfo.c arm64: kernel: add support for cpu cache information 2015-01-15 11:55:07 +00:00
cpu_errata.c arm64: alternatives: fix pr_fmt string for consistency 2014-11-25 18:27:01 +00: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: remove ARM64_CPU_SUSPEND config option 2015-01-27 11:35:33 +00:00
cpuinfo.c arm64: Track system support for mixed endian EL0 2015-01-23 17:02:19 +00: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 updates for 3.19 2014-12-09 13:12:47 -08:00
efi-stub.c arm64/efi: efistub: Apply __init annotation 2015-01-15 21:28:35 +00:00
efi.c arm64: efi: don't restore TTBR0 if active_mm points at init_mm 2015-03-20 17:05:16 +00:00
entry32.S arm64: Implement the compat_sys_call_table in C 2015-01-27 09:38:07 +00: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: eliminate literal pool entries 2014-11-07 15:04:49 +00:00
entry.S arm64: Implement the compat_sys_call_table in C 2015-01-27 09:38:07 +00: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: ftrace: fix ftrace_modify_graph_caller for branch replace 2015-02-23 09:13:45 +00:00
head.S arm64: put __boot_cpu_mode label after alignment instead of before 2015-03-14 11:02:26 +00:00
hw_breakpoint.c arm64: kernel: remove ARM64_CPU_SUSPEND config option 2015-01-27 11:35:33 +00: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: Fix text patching logic when using fixmap 2015-02-26 18:34:27 +00:00
io.c arm64: optimize memcpy_{from,to}io() and memset_io() 2014-11-06 17:25:27 +00:00
irq.c arm64: Treat handle_arch_irq as a function pointer 2014-11-25 15:56:44 +00:00
jump_label.c arm64: jump labels: NOP out NOP -> NOP replacement 2014-11-26 17:19:47 +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 arm64: psci: move psci firmware calls out of line 2015-02-26 18:23:53 +00:00
module.c mm: vmalloc: pass additional vm_flags to __vmalloc_node_range() 2015-02-13 21:21:42 -08:00
pci.c PCI: Move domain assignment from arm64 to generic code 2014-12-27 18:19:12 -07:00
perf_event.c arm64: perf: Prevent wraparound during overflow 2014-12-04 10:26:54 +00:00
perf_regs.c perf: Move task_pt_regs sampling into arch code 2015-01-09 11:12:28 +01:00
process.c efi/arm64: use UEFI for system reset and poweroff 2015-03-14 11:00:18 +00:00
psci-call.S arm64: psci: move psci firmware calls out of line 2015-02-26 18:23:53 +00:00
psci.c arm64: psci: move psci firmware calls out of line 2015-02-26 18:23:53 +00:00
ptrace.c arm64: add seccomp support 2014-11-28 10:24:59 +00:00
return_address.c arm64: LLVMLinux: Use global stack pointer in return_address() 2014-09-08 14:39:19 +01:00
setup.c arm64: implement generic IOMMU configuration 2015-01-23 16:44:16 +00:00
signal32.c arm64: compat Fix siginfo_t -> compat_siginfo_t conversion on big endian 2015-02-27 18:05:56 +00:00
signal.c all arches, signal: move restart_block to struct task_struct 2015-02-12 18:54:12 -08:00
sleep.S arm64: Move cpu_resume into the text section 2014-11-25 15:56:44 +00:00
smp_spin_table.c arm64: fix missing asm/io.h include in kernel/smp_spin_table.c 2015-01-07 11:40:59 +00:00
smp.c smp, ARM64: Kill SMP single function call interrupt 2015-01-23 18:06:47 +00: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: remove ARM64_CPU_SUSPEND config option 2015-01-27 11:35:33 +00:00
sys32.c arm64: Implement the compat_sys_call_table in C 2015-01-27 09:38:07 +00:00
sys_compat.c arm64: compat: align cacheflush syscall with arch/arm 2014-12-01 13:31:12 +00:00
sys.c arm64: make sys_call_table const 2015-01-27 09:38:08 +00:00
time.c arm64: kernel: initialize broadcast hrtimer based clock event device 2014-05-30 17:48:13 +01:00
topology.c arm64: topology: Fix handling of multi-level cluster MPIDR-based detection 2014-11-25 15:56:43 +00:00
trace-events-emulation.h arm64: Trace emulation of AArch32 legacy instructions 2014-11-20 16:35:02 +00:00
traps.c arm64: decode ESR_ELx.EC when reporting exceptions 2015-01-15 12:24:22 +00: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 arm64: add better page protections to arm64 2015-01-22 14:54:29 +00:00