Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 68764420 authored by Will Deacon's avatar Will Deacon
Browse files

arm64: ftrace: fix building without CONFIG_MODULES



When CONFIG_MODULES is disabled, we cannot dereference a module pointer:

arch/arm64/kernel/ftrace.c: In function 'ftrace_make_call':
arch/arm64/kernel/ftrace.c:107:36: error: dereferencing pointer to incomplete type 'struct module'
   trampoline = (unsigned long *)mod->arch.ftrace_trampoline;

Also, the within_module() function is not defined:

arch/arm64/kernel/ftrace.c: In function 'ftrace_make_nop':
arch/arm64/kernel/ftrace.c:171:8: error: implicit declaration of function 'within_module'; did you mean 'init_module'? [-Werror=implicit-function-declaration]

This addresses both by adding replacing the IS_ENABLED(CONFIG_ARM64_MODULE_PLTS)
checks with #ifdef versions.

Fixes: e71a4e1b ("arm64: ftrace: add support for far branches to dynamic ftrace")
Reported-by: default avatarArnd Bergmann <arnd@arndb.de>
Acked-by: default avatarArd Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
parent 1eb34b6e
Loading
Loading
Loading
Loading
+10 −6
Original line number Diff line number Diff line
@@ -71,11 +71,12 @@ int ftrace_update_ftrace_func(ftrace_func_t func)
int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr)
{
	unsigned long pc = rec->ip;
	long offset = (long)pc - (long)addr;
	u32 old, new;

	if (IS_ENABLED(CONFIG_ARM64_MODULE_PLTS) &&
	    (offset < -SZ_128M || offset >= SZ_128M)) {
#ifdef CONFIG_ARM64_MODULE_PLTS
	long offset = (long)pc - (long)addr;

	if (offset < -SZ_128M || offset >= SZ_128M) {
		unsigned long *trampoline;
		struct module *mod;

@@ -121,6 +122,7 @@ int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr)
		}
		addr = (unsigned long)&trampoline[1];
	}
#endif /* CONFIG_ARM64_MODULE_PLTS */

	old = aarch64_insn_gen_nop();
	new = aarch64_insn_gen_branch_imm(pc, addr, AARCH64_INSN_BRANCH_LINK);
@@ -135,12 +137,13 @@ int ftrace_make_nop(struct module *mod, struct dyn_ftrace *rec,
		    unsigned long addr)
{
	unsigned long pc = rec->ip;
	long offset = (long)pc - (long)addr;
	bool validate = true;
	u32 old = 0, new;

	if (IS_ENABLED(CONFIG_ARM64_MODULE_PLTS) &&
	    (offset < -SZ_128M || offset >= SZ_128M)) {
#ifdef CONFIG_ARM64_MODULE_PLTS
	long offset = (long)pc - (long)addr;

	if (offset < -SZ_128M || offset >= SZ_128M) {
		u32 replaced;

		/*
@@ -177,6 +180,7 @@ int ftrace_make_nop(struct module *mod, struct dyn_ftrace *rec,
		old = aarch64_insn_gen_branch_imm(pc, addr,
						  AARCH64_INSN_BRANCH_LINK);
	}
#endif /* CONFIG_ARM64_MODULE_PLTS */

	new = aarch64_insn_gen_nop();