kernel_optimize_test/arch/arm64/kernel
Marc Zyngier f6242cac10 arm64: Fix text patching logic when using fixmap
Patch 2f896d5866 ("arm64: use fixmap for text patching") changed
the way we patch the kernel text, using a fixmap when the kernel or
modules are flagged as read only.

Unfortunately, a flaw in the logic makes it fall over when patching
modules without CONFIG_DEBUG_SET_MODULE_RONX enabled:

[...]
[   32.032636] Call trace:
[   32.032716] [<fffffe00003da0dc>] __copy_to_user+0x2c/0x60
[   32.032837] [<fffffe0000099f08>] __aarch64_insn_write+0x94/0xf8
[   32.033027] [<fffffe000009a0a0>] aarch64_insn_patch_text_nosync+0x18/0x58
[   32.033200] [<fffffe000009c3ec>] ftrace_modify_code+0x58/0x84
[   32.033363] [<fffffe000009c4e4>] ftrace_make_nop+0x3c/0x58
[   32.033532] [<fffffe0000164420>] ftrace_process_locs+0x3d0/0x5c8
[   32.033709] [<fffffe00001661cc>] ftrace_module_init+0x28/0x34
[   32.033882] [<fffffe0000135148>] load_module+0xbb8/0xfc4
[   32.034044] [<fffffe0000135714>] SyS_finit_module+0x94/0xc4
[...]

This is triggered by the use of virt_to_page() on a module address,
which ends to pointing to Nowhereland if you're lucky, or corrupt
your precious data if not.

This patch fixes the logic by mimicking what is done on arm:
- If we're patching a module and CONFIG_DEBUG_SET_MODULE_RONX is set,
  use vmalloc_to_page().
- If we're patching the kernel and CONFIG_DEBUG_RODATA is set,
  use virt_to_page().
- Otherwise, use the provided address, as we can write to it directly.

Tested on 4.0-rc1 as a KVM guest.

Reported-by: Richard W.M. Jones <rjones@redhat.com>
Reviewed-by: Kees Cook <keescook@chromium.org>
Acked-by: Mark Rutland <mark.rutland@arm.com>
Acked-by: Laura Abbott <lauraa@codeaurora.org>
Tested-by: Richard W.M. Jones <rjones@redhat.com>
Cc: Will Deacon <will.deacon@arm.com>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
2015-02-26 18:34:27 +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: move virtmap init to early initcall 2015-01-22 14:59:25 +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: Move some head.text functions to executable section 2014-11-26 17:19:47 +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 arm64: ASLR: Don't randomise text when randomise_va_space == 0 2014-10-24 15:47:49 +01: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 all arches, signal: move restart_block to struct task_struct 2015-02-12 18:54:12 -08: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