diff options
-rw-r--r-- | xen/arch/x86/x86_64/entry.S | 8 | ||||
-rw-r--r-- | xen/include/asm-x86/asm_defns.h | 15 | ||||
-rw-r--r-- | xen/include/asm-x86/x86_64/asm_defns.h | 8 |
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 |