x86/static_call: Fix __static_call_fixup()
commit5409730962
upstream. Christian reported spurious module load crashes after some of Song's module memory layout patches. Turns out that if the very last instruction on the very last page of the module is a 'JMP __x86_return_thunk' then __static_call_fixup() will trip a fault and die. And while the module rework made this slightly more likely to happen, it's always been possible. Fixes:ee88d363d1
("x86,static_call: Use alternative RET encoding") Reported-by: Christian Bricart <christian@bricart.de> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Acked-by: Josh Poimboeuf <jpoimboe@kernel.org> Link: https://lkml.kernel.org/r/20230816104419.GA982867@hirez.programming.kicks-ass.net Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
c16d0b3baf
commit
c1f831425f
@ -184,6 +184,19 @@ EXPORT_SYMBOL_GPL(arch_static_call_transform);
|
|||||||
*/
|
*/
|
||||||
bool __static_call_fixup(void *tramp, u8 op, void *dest)
|
bool __static_call_fixup(void *tramp, u8 op, void *dest)
|
||||||
{
|
{
|
||||||
|
unsigned long addr = (unsigned long)tramp;
|
||||||
|
/*
|
||||||
|
* Not all .return_sites are a static_call trampoline (most are not).
|
||||||
|
* Check if the 3 bytes after the return are still kernel text, if not,
|
||||||
|
* then this definitely is not a trampoline and we need not worry
|
||||||
|
* further.
|
||||||
|
*
|
||||||
|
* This avoids the memcmp() below tripping over pagefaults etc..
|
||||||
|
*/
|
||||||
|
if (((addr >> PAGE_SHIFT) != ((addr + 7) >> PAGE_SHIFT)) &&
|
||||||
|
!kernel_text_address(addr + 7))
|
||||||
|
return false;
|
||||||
|
|
||||||
if (memcmp(tramp+5, tramp_ud, 3)) {
|
if (memcmp(tramp+5, tramp_ud, 3)) {
|
||||||
/* Not a trampoline site, not our problem. */
|
/* Not a trampoline site, not our problem. */
|
||||||
return false;
|
return false;
|
||||||
|
Reference in New Issue
Block a user