aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xen/arch/x86/x86_64/entry.S8
-rw-r--r--xen/include/asm-x86/asm_defns.h15
-rw-r--r--xen/include/asm-x86/x86_64/asm_defns.h8
3 files changed, 19 insertions, 12 deletions
diff --git a/xen/arch/x86/x86_64/entry.S b/xen/arch/x86/x86_64/entry.S
index 8156827d41..74a40758b2 100644
--- a/xen/arch/x86/x86_64/entry.S
+++ b/xen/arch/x86/x86_64/entry.S
@@ -445,10 +445,10 @@ domain_crash_synchronous_string:
ENTRY(domain_crash_synchronous)
# Get out of the guest-save area of the stack.
- GET_CPUINFO_FIELD(CPUINFO_guest_cpu_user_regs,%rax)
- movq %rax,%rsp
+ GET_STACK_BASE(%rax)
+ leaq STACK_CPUINFO_FIELD(guest_cpu_user_regs)(%rax),%rsp
# create_bounce_frame() temporarily clobbers CS.RPL. Fix up.
- GET_CURRENT(%rax)
+ __GET_CURRENT(%rax)
movq VCPU_domain(%rax),%rax
testb $1,DOMAIN_is_32bit_pv(%rax)
setz %al
@@ -622,7 +622,7 @@ handle_ist_exception:
testb $3,UREGS_cs(%rsp)
jz 1f
/* Interrupted guest context. Copy the context to stack bottom. */
- GET_CPUINFO_FIELD(CPUINFO_guest_cpu_user_regs,%rdi)
+ GET_CPUINFO_FIELD(guest_cpu_user_regs,%rdi)
movq %rsp,%rsi
movl $UREGS_kernel_sizeof/8,%ecx
movq %rdi,%rsp
diff --git a/xen/include/asm-x86/asm_defns.h b/xen/include/asm-x86/asm_defns.h
index 5a8d4a0ea5..c1175c4775 100644
--- a/xen/include/asm-x86/asm_defns.h
+++ b/xen/include/asm-x86/asm_defns.h
@@ -44,6 +44,21 @@ void ret_from_intr(void);
.subsection 0; \
.Llikely.tag:
+#define STACK_CPUINFO_FIELD(field) (STACK_SIZE-CPUINFO_sizeof+CPUINFO_##field)
+#define GET_STACK_BASE(reg) \
+ movq $~(STACK_SIZE-1),reg; \
+ andq %rsp,reg
+
+#define GET_CPUINFO_FIELD(field, reg) \
+ GET_STACK_BASE(reg); \
+ addq $STACK_CPUINFO_FIELD(field),reg
+
+#define __GET_CURRENT(reg) \
+ movq STACK_CPUINFO_FIELD(current_vcpu)(reg),reg
+#define GET_CURRENT(reg) \
+ GET_STACK_BASE(reg); \
+ __GET_CURRENT(reg)
+
#endif
#endif /* __X86_ASM_DEFNS_H__ */
diff --git a/xen/include/asm-x86/x86_64/asm_defns.h b/xen/include/asm-x86/x86_64/asm_defns.h
index d8e87ebe63..6278446dc2 100644
--- a/xen/include/asm-x86/x86_64/asm_defns.h
+++ b/xen/include/asm-x86/x86_64/asm_defns.h
@@ -111,14 +111,6 @@ STR(IRQ) #nr "_interrupt:\n\t" \
"movl $"#nr",4(%rsp)\n\t" \
"jmp common_interrupt");
-#define GET_CPUINFO_FIELD(field,reg) \
- movq $~(STACK_SIZE-1),reg; \
- andq %rsp,reg; \
- orq $(STACK_SIZE-CPUINFO_sizeof+field),reg;
-#define GET_CURRENT(reg) \
- GET_CPUINFO_FIELD(CPUINFO_current_vcpu,reg) \
- movq (reg),reg;
-
#ifdef __ASSEMBLY__
# define _ASM_EX(p) p-.
#else