[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 1/4] 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 <jbeulich@xxxxxxxx> --- 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 --- 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__ */ --- 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 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |