From 1e15dcfbaef6ef5b1cdba73408be6bd9dfc27fe9 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Tue, 29 Sep 2020 10:51:54 +0200 Subject: [PATCH] x86/ELF: don't store function pointer in elf_core_save_regs() This keeps at least gcc 10 from generating a separate function instance in common/kexec.o alongside the inlining of the function in its sole caller. I also think putting the address of the actual code storing the registers is a better indication to consumers than that of an otherwise unreferenced function. Signed-off-by: Jan Beulich Reviewed-by: Andrew Cooper --- xen/include/asm-x86/x86_64/elf.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xen/include/asm-x86/x86_64/elf.h b/xen/include/asm-x86/x86_64/elf.h index 09b286422d..43c9cf3a3f 100644 --- a/xen/include/asm-x86/x86_64/elf.h +++ b/xen/include/asm-x86/x86_64/elf.h @@ -54,7 +54,7 @@ static inline void elf_core_save_regs(ELF_Gregset *core_regs, asm volatile("movq %%rsi,%0" : "=m"(core_regs->rsi)); asm volatile("movq %%rdi,%0" : "=m"(core_regs->rdi)); /* orig_rax not filled in for now */ - core_regs->rip = (unsigned long)elf_core_save_regs; + asm ( "call 0f; 0: popq %0" : "=m" (core_regs->rip) ); core_regs->cs = read_sreg(cs); asm volatile("pushfq; popq %0" :"=m"(core_regs->rflags)); asm volatile("movq %%rsp,%0" : "=m"(core_regs->rsp)); -- 2.39.5