Commit 6fc078d3 authored by Peter Zijlstra's avatar Peter Zijlstra Committed by sanglipeng1
Browse files

x86/ftrace: Use alternative RET encoding

stable inclusion
from stable-v5.10.211
commit 4eb421fa71e42af0e68ae6fc5c2724d5759e50d3
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/IAF2J4

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=4eb421fa71e42af0e68ae6fc5c2724d5759e50d3



--------------------------------

Upstream commit: 1f001e9d

Use the return thunk in ftrace trampolines, if needed.

Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
Reviewed-by: default avatarJosh Poimboeuf <jpoimboe@kernel.org>
Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
Signed-off-by: default avatarBorislav Petkov (AMD) <bp@alien8.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarsanglipeng1 <sanglipeng1@jd.com>
parent 822da186
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -311,7 +311,7 @@ union ftrace_op_code_union {
	} __attribute__((packed));
};

#define RET_SIZE		1 + IS_ENABLED(CONFIG_SLS)
#define RET_SIZE		(IS_ENABLED(CONFIG_RETPOLINE) ? 5 : 1 + IS_ENABLED(CONFIG_SLS))

static unsigned long
create_trampoline(struct ftrace_ops *ops, unsigned int *tramp_size)
@@ -367,7 +367,10 @@ create_trampoline(struct ftrace_ops *ops, unsigned int *tramp_size)
		goto fail;

	ip = trampoline + size;
	memcpy(ip, retq, RET_SIZE);
	if (cpu_feature_enabled(X86_FEATURE_RETHUNK))
		__text_gen_insn(ip, JMP32_INSN_OPCODE, ip, &__x86_return_thunk, JMP32_INSN_SIZE);
	else
		memcpy(ip, retq, sizeof(retq));

	/* No need to test direct calls on created trampolines */
	if (ops->flags & FTRACE_OPS_FL_SAVE_REGS) {