Re: [GIT PULL] x86/urgent for v5.11-rc7
From: Miroslav Benes <mbenes@suse.cz>
Date: 2021-02-09 08:33:45
Also in:
lkml
On Mon, 8 Feb 2021, Steven Rostedt wrote:
On Mon, 8 Feb 2021 16:47:05 +0100 Peter Zijlstra [off-list ref] wrote:quoted
quoted
/* * Convert a function address into the appropriate ftrace location. * * Usually this is just the address of the function, but on some architectures * it's more complicated so allow them to provide a custom behaviour. */ #ifndef klp_get_ftrace_location static unsigned long klp_get_ftrace_location(unsigned long faddr) { return faddr; } #endif
powerpc has this
static inline unsigned long klp_get_ftrace_location(unsigned long faddr)
{
/*
* Live patch works only with -mprofile-kernel on PPC. In this case,
* the ftrace location is always within the first 16 bytes.
*/
return ftrace_location_range(faddr, faddr + 16);
}
quoted
I suppose the trivial fix is to see if it points to endbr64 and if so, increment the addr by the length of that.I thought of that too. But one thing that may be possible, is to use kallsym. I believe you can get the range of a function (start and end of the function) from kallsyms. Then ask ftrace for the addr in that range (there should only be one).
And we can do this if a hard-coded value live above is not welcome. If I remember correctly, we used to have exactly this in the old versions of kGraft. We walked through all ftrace records, called kallsyms_lookup_size_offset() on every record's ip and if the offset+ip matched faddr (in this case), we returned the ip. Miroslav