From c649ee7b5105f89d17141873bcfb35c4522a1240 Mon Sep 17 00:00:00 2001 From: Christoph Muellner Date: Tue, 15 May 2018 10:25:30 +0200 Subject: arm64: asm: Use *_nospec variants for blr and br. Replace indirect branch instructions (br and blr) by *_nospec variants, which prevent speculative execution in case CONFIG_RETPOLINE is enabled. Signed-off-by: Christoph Muellner --- arch/arm64/kernel/entry-ftrace.S | 2 +- arch/arm64/kernel/entry.S | 8 ++++---- arch/arm64/kvm/hyp/hyp-entry.S | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/arch/arm64/kernel/entry-ftrace.S b/arch/arm64/kernel/entry-ftrace.S index 1175f5827ae1..8393d3db6022 100644 --- a/arch/arm64/kernel/entry-ftrace.S +++ b/arch/arm64/kernel/entry-ftrace.S @@ -106,7 +106,7 @@ ENTRY(_mcount) mcount_get_pc x0 // function's pc mcount_get_lr x1 // function's lr (= parent's pc) - blr x2 // (*ftrace_trace_function)(pc, lr); + blr_nospec x2 // (*ftrace_trace_function)(pc, lr); skip_ftrace_call: // } #ifdef CONFIG_FUNCTION_GRAPH_TRACER diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S index d03542418f9b..adfb7f6adcad 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S @@ -395,7 +395,7 @@ tsk .req x28 // current thread_info ldr_l x1, handle_arch_irq mov x0, sp irq_stack_entry - blr x1 + blr_nospec x1 irq_stack_exit .endm @@ -975,7 +975,7 @@ el0_svc_naked: // compat entry point b.hs ni_sys mask_nospec64 xscno, xsc_nr, x19 // enforce bounds for syscall number ldr x16, [stbl, xscno, lsl #3] // address in the syscall table - blr x16 // call sys_* routine + blr_nospec x16 // call sys_* routine b ret_fast_syscall ni_sys: mov x0, sp @@ -1005,7 +1005,7 @@ __sys_trace: ldp x4, x5, [sp, #S_X4] ldp x6, x7, [sp, #S_X6] ldr x16, [stbl, xscno, lsl #3] // address in the syscall table - blr x16 // call sys_* routine + blr_nospec x16 // call sys_* routine __sys_trace_return: str x0, [sp, #S_X0] // save returned x0 @@ -1180,7 +1180,7 @@ ENTRY(ret_from_fork) bl schedule_tail cbz x19, 1f // not a kernel thread mov x0, x20 - blr x19 + blr_nospec x19 1: get_thread_info tsk b ret_to_user ENDPROC(ret_from_fork) diff --git a/arch/arm64/kvm/hyp/hyp-entry.S b/arch/arm64/kvm/hyp/hyp-entry.S index f36464bd57c5..2e098c1248f7 100644 --- a/arch/arm64/kvm/hyp/hyp-entry.S +++ b/arch/arm64/kvm/hyp/hyp-entry.S @@ -38,7 +38,7 @@ mov x0, x1 mov x1, x2 mov x2, x3 - blr lr + blr_nospec_lr ldr lr, [sp], #16 .endm -- cgit v1.2.3