From: Jan Beulich Date: Wed, 26 Sep 2012 09:48:21 +0000 (+0200) Subject: x86: enhance rsp-relative calculations X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~7857 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=f430ebef51f16767ec5e127131cdb3115aa1ae1b;p=xen.git x86: enhance rsp-relative calculations The use of "or" in GET_CPUINFO_FIELD so far wasn't ideal, as it doesn't lend itself to folding this operation with a possibly subsequent one (e.g. the well known mov+add=lea conversion). Split out the sub- operations, and shorten assembly code slightly with this. Signed-off-by: Jan Beulich Acked-by: Keir Fraser --- 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