Message ID | 1481043967-15602-3-git-send-email-abelvesa@linux.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi Abel, [auto build test ERROR on linus/master] [also build test ERROR on v4.9-rc8 next-20161206] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Abel-Vesa/arm-Add-livepatch-support/20161207-074210 config: arm-allmodconfig (attached as .config) compiler: arm-linux-gnueabi-gcc (Debian 6.1.1-9) 6.1.1 20160705 reproduce: wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree make.cross ARCH=arm Note: the linux-review/Abel-Vesa/arm-Add-livepatch-support/20161207-074210 HEAD 49113edc744f38a682a4afa9e904384bb00f2988 builds fine. It only hurts bisectibility. All errors (new ones prefixed by >>): >> arch/arm/kernel/ftrace.c:163:5: error: redefinition of 'ftrace_modify_call' int ftrace_modify_call(struct dyn_ftrace *rec, unsigned long old_addr, ^~~~~~~~~~~~~~~~~~ In file included from arch/arm/kernel/ftrace.c:15:0: include/linux/ftrace.h:595:19: note: previous definition of 'ftrace_modify_call' was here static inline int ftrace_modify_call(struct dyn_ftrace *rec, unsigned long old_addr, ^~~~~~~~~~~~~~~~~~ vim +/ftrace_modify_call +163 arch/arm/kernel/ftrace.c 157 } 158 #endif 159 160 return ret; 161 } 162 > 163 int ftrace_modify_call(struct dyn_ftrace *rec, unsigned long old_addr, 164 unsigned long addr) 165 { 166 unsigned long pc = rec->ip; --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
diff --git a/arch/arm/kernel/ftrace.c b/arch/arm/kernel/ftrace.c index 3f17594..cb4543a 100644 --- a/arch/arm/kernel/ftrace.c +++ b/arch/arm/kernel/ftrace.c @@ -139,6 +139,15 @@ int ftrace_update_ftrace_func(ftrace_func_t func) ret = ftrace_modify_code(pc, 0, new, false); +#ifdef CONFIG_DYNAMIC_FTRACE_WITH_REGS + if (!ret) { + pc = (unsigned long)&ftrace_regs_call; + new = ftrace_call_replace(pc, (unsigned long)func); + + ret = ftrace_modify_code(pc, 0, new, false); + } +#endif + #ifdef CONFIG_OLD_MCOUNT if (!ret) { pc = (unsigned long)&ftrace_call_old; @@ -151,6 +160,18 @@ int ftrace_update_ftrace_func(ftrace_func_t func) return ret; } +int ftrace_modify_call(struct dyn_ftrace *rec, unsigned long old_addr, + unsigned long addr) +{ + unsigned long pc = rec->ip; + u32 old, new; + + old = arm_gen_branch(pc, old_addr); + new = arm_gen_branch(pc, addr); + + return ftrace_modify_code(pc, old, new, true); +} + int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr) { unsigned long new, old;
Function ftrace_modify_call provides a way to replace ftrace_stub with the ftrace function. This helps the klp_ftrace_handler to be called via ftrace_ops_no_ops, which in turn will set the pc with the patched function's starting address. This is used for livepatching. Signed-off-by: Abel Vesa <abelvesa@linux.com> --- arch/arm/kernel/ftrace.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)