Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

x86/bpf: Use alternative RET encoding

Use the return thunk in eBPF generated code, if needed.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Borislav Petkov <bp@suse.de>
Reviewed-by: Josh Poimboeuf <jpoimboe@kernel.org>
Signed-off-by: Borislav Petkov <bp@suse.de>

authored by

Peter Zijlstra and committed by
Borislav Petkov
d77cfe59 1f001e9d

+17 -2
+17 -2
arch/x86/net/bpf_jit_comp.c
··· 425 425 *pprog = prog; 426 426 } 427 427 428 + static void emit_return(u8 **pprog, u8 *ip) 429 + { 430 + u8 *prog = *pprog; 431 + 432 + if (cpu_feature_enabled(X86_FEATURE_RETHUNK)) { 433 + emit_jump(&prog, &__x86_return_thunk, ip); 434 + } else { 435 + EMIT1(0xC3); /* ret */ 436 + if (IS_ENABLED(CONFIG_SLS)) 437 + EMIT1(0xCC); /* int3 */ 438 + } 439 + 440 + *pprog = prog; 441 + } 442 + 428 443 /* 429 444 * Generate the following code: 430 445 * ··· 1700 1685 ctx->cleanup_addr = proglen; 1701 1686 pop_callee_regs(&prog, callee_regs_used); 1702 1687 EMIT1(0xC9); /* leave */ 1703 - EMIT1(0xC3); /* ret */ 1688 + emit_return(&prog, image + addrs[i - 1] + (prog - temp)); 1704 1689 break; 1705 1690 1706 1691 default: ··· 2203 2188 if (flags & BPF_TRAMP_F_SKIP_FRAME) 2204 2189 /* skip our return address and return to parent */ 2205 2190 EMIT4(0x48, 0x83, 0xC4, 8); /* add rsp, 8 */ 2206 - EMIT1(0xC3); /* ret */ 2191 + emit_return(&prog, prog); 2207 2192 /* Make sure the trampoline generation logic doesn't overflow */ 2208 2193 if (WARN_ON_ONCE(prog > (u8 *)image_end - BPF_INSN_SAFETY)) { 2209 2194 ret = -EFAULT;