|
[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 |