[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH] x86/elf: Remove ASM_CALL_CONSTRAINT from elf_core_save_regs()
I was mistaken about when ASM_CALL_CONSTRAINT is applicable. It is not applicable for plain pushes/pops, so remove it from the flags logic. Clarify the description of ASM_CALL_CONSTRAINT to be explicit about unwinding using framepointers. Fixes: 0754534b8a38 ("x86/elf: Improve code generation in elf_core_save_regs()") Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- CC: Jan Beulich <JBeulich@xxxxxxxx> CC: Roger Pau Monné <roger.pau@xxxxxxxxxx> --- xen/arch/x86/include/asm/asm_defns.h | 5 +++-- xen/arch/x86/include/asm/x86_64/elf.h | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/xen/arch/x86/include/asm/asm_defns.h b/xen/arch/x86/include/asm/asm_defns.h index 92b4116a1564..689d1dcbf754 100644 --- a/xen/arch/x86/include/asm/asm_defns.h +++ b/xen/arch/x86/include/asm/asm_defns.h @@ -28,8 +28,9 @@ asm ( "\t.equ CONFIG_INDIRECT_THUNK, " /* * This output constraint should be used for any inline asm which has a "call" - * instruction. Otherwise the asm may be inserted before the frame pointer - * gets set up by the containing function. + * instruction, which forces the stack frame to be set up prior to the asm + * block. This matters when unwinding using framepointers, where the asm's + * function can get skipped over. */ #ifdef CONFIG_FRAME_POINTER register unsigned long current_stack_pointer asm("rsp"); diff --git a/xen/arch/x86/include/asm/x86_64/elf.h b/xen/arch/x86/include/asm/x86_64/elf.h index f33be46ddec9..e7bec7327aa2 100644 --- a/xen/arch/x86/include/asm/x86_64/elf.h +++ b/xen/arch/x86/include/asm/x86_64/elf.h @@ -56,7 +56,7 @@ static inline void elf_core_save_regs(ELF_Gregset *core_regs, /* orig_rax not filled in for now */ asm ( "lea (%%rip), %0" : "=r" (core_regs->rip) ); asm ( "mov %%cs, %0" : "=m" (core_regs->cs) ); - asm ( "pushfq; popq %0" : "=m" (core_regs->rflags) ASM_CALL_CONSTRAINT ); + asm ( "pushfq; popq %0" : "=m" (core_regs->rflags) ); asm ( "movq %%rsp, %0" : "=m" (core_regs->rsp) ); asm ( "mov %%ss, %0" : "=m" (core_regs->ss) ); rdmsrl(MSR_FS_BASE, core_regs->thread_fs); base-commit: 28fa31d6bb7835be530c2855dd6cf4e77438ae12 -- 2.39.5
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |