|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] x86: reduce code size of struct cpu_info member accesses
commit 4f6aea066fe2cf3bf4929d6dac1e558071566f73
Author: Jan Beulich <jbeulich@xxxxxxxx>
AuthorDate: Fri May 13 18:15:34 2016 +0100
Commit: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
CommitDate: Fri May 13 18:16:36 2016 +0100
x86: reduce code size of struct cpu_info member accesses
Instead of addressing these fields via the base of the stack (which
uniformly requires 4-byte displacements), address them from the end
(which for everything other than guest_cpu_user_regs requires just
1-byte ones). This yields a code size reduction somewhere between 8k
and 12k in my builds.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Release-acked-by: Wei Liu <wei.liu2@xxxxxxxxxx>
---
xen/arch/x86/hvm/svm/entry.S | 4 ++--
xen/arch/x86/hvm/vmx/entry.S | 4 ++--
xen/arch/x86/x86_64/compat/entry.S | 6 +++---
xen/arch/x86/x86_64/entry.S | 18 +++++++++---------
xen/include/asm-x86/asm_defns.h | 16 ++++++++--------
xen/include/asm-x86/current.h | 2 +-
6 files changed, 25 insertions(+), 25 deletions(-)
diff --git a/xen/arch/x86/hvm/svm/entry.S b/xen/arch/x86/hvm/svm/entry.S
index e816d66..759c184 100644
--- a/xen/arch/x86/hvm/svm/entry.S
+++ b/xen/arch/x86/hvm/svm/entry.S
@@ -31,7 +31,7 @@
#define CLGI .byte 0x0F,0x01,0xDD
ENTRY(svm_asm_do_resume)
- GET_CURRENT(%rbx)
+ GET_CURRENT(bx)
.Lsvm_do_resume:
call svm_intr_assist
mov %rsp,%rdi
@@ -97,7 +97,7 @@ UNLIKELY_END(svm_trace)
VMRUN
- GET_CURRENT(%rax)
+ GET_CURRENT(ax)
push %rdi
push %rsi
push %rdx
diff --git a/xen/arch/x86/hvm/vmx/entry.S b/xen/arch/x86/hvm/vmx/entry.S
index 5a1757e..3d98ee2 100644
--- a/xen/arch/x86/hvm/vmx/entry.S
+++ b/xen/arch/x86/hvm/vmx/entry.S
@@ -40,7 +40,7 @@ ENTRY(vmx_asm_vmexit_handler)
push %r10
push %r11
push %rbx
- GET_CURRENT(%rbx)
+ GET_CURRENT(bx)
push %rbp
push %r12
push %r13
@@ -113,7 +113,7 @@ UNLIKELY_END(realmode)
BUG /* vmx_vmentry_failure() shouldn't return. */
ENTRY(vmx_asm_do_vmentry)
- GET_CURRENT(%rbx)
+ GET_CURRENT(bx)
jmp .Lvmx_do_vmentry
.Lvmx_goto_emulator:
diff --git a/xen/arch/x86/x86_64/compat/entry.S
b/xen/arch/x86/x86_64/compat/entry.S
index 2723455..dbc3984 100644
--- a/xen/arch/x86/x86_64/compat/entry.S
+++ b/xen/arch/x86/x86_64/compat/entry.S
@@ -26,7 +26,7 @@ UNLIKELY_START(ne, msi_check)
UNLIKELY_END(msi_check)
movl UREGS_rax(%rsp),%eax
- GET_CURRENT(%rbx)
+ GET_CURRENT(bx)
cmpl $NR_hypercalls,%eax
jae compat_bad_hypercall
@@ -202,7 +202,7 @@ ENTRY(compat_restore_all_guest)
/* This mustn't modify registers other than %rax. */
ENTRY(cr4_pv32_restore)
push %rdx
- GET_CPUINFO_FIELD(cr4, %rdx)
+ GET_CPUINFO_FIELD(cr4, dx)
mov (%rdx), %rax
test $X86_CR4_SMEP|X86_CR4_SMAP,%eax
jnz 0f
@@ -245,7 +245,7 @@ ENTRY(cstar_enter)
pushq %rcx
pushq $0
SAVE_VOLATILE TRAP_syscall
- GET_CURRENT(%rbx)
+ GET_CURRENT(bx)
movq VCPU_domain(%rbx),%rcx
cmpb $0,DOMAIN_is_32bit_pv(%rcx)
je switch_to_kernel
diff --git a/xen/arch/x86/x86_64/entry.S b/xen/arch/x86/x86_64/entry.S
index 99a55af..fe7b195 100644
--- a/xen/arch/x86/x86_64/entry.S
+++ b/xen/arch/x86/x86_64/entry.S
@@ -97,7 +97,7 @@ ENTRY(lstar_enter)
pushq %rcx
pushq $0
SAVE_VOLATILE TRAP_syscall
- GET_CURRENT(%rbx)
+ GET_CURRENT(bx)
testb $TF_kernel_mode,VCPU_thread_flags(%rbx)
jz switch_to_kernel
@@ -246,7 +246,7 @@ GLOBAL(sysenter_eflags_saved)
pushq $0 /* null rip */
pushq $0
SAVE_VOLATILE TRAP_syscall
- GET_CURRENT(%rbx)
+ GET_CURRENT(bx)
cmpb $0,VCPU_sysenter_disables_events(%rbx)
movq VCPU_sysenter_addr(%rbx),%rax
setne %cl
@@ -288,7 +288,7 @@ UNLIKELY_START(ne, msi_check)
call check_for_unexpected_msi
UNLIKELY_END(msi_check)
- GET_CURRENT(%rbx)
+ GET_CURRENT(bx)
/* Check that the callback is non-null. */
leaq VCPU_int80_bounce(%rbx),%rdx
@@ -424,10 +424,10 @@ domain_crash_page_fault:
call show_page_walk
ENTRY(dom_crash_sync_extable)
# Get out of the guest-save area of the stack.
- GET_STACK_BASE(%rax)
+ GET_STACK_END(ax)
leaq STACK_CPUINFO_FIELD(guest_cpu_user_regs)(%rax),%rsp
# create_bounce_frame() temporarily clobbers CS.RPL. Fix up.
- __GET_CURRENT(%rax)
+ __GET_CURRENT(ax)
movq VCPU_domain(%rax),%rax
testb $1,DOMAIN_is_32bit_pv(%rax)
setz %al
@@ -445,7 +445,7 @@ ENTRY(common_interrupt)
/* No special register assumptions. */
ENTRY(ret_from_intr)
- GET_CURRENT(%rbx)
+ GET_CURRENT(bx)
testb $3,UREGS_cs(%rsp)
jz restore_all_xen
movq VCPU_domain(%rbx),%rax
@@ -459,7 +459,7 @@ ENTRY(page_fault)
GLOBAL(handle_exception)
SAVE_ALL CLAC
handle_exception_saved:
- GET_CURRENT(%rbx)
+ GET_CURRENT(bx)
testb $X86_EFLAGS_IF>>8,UREGS_eflags+1(%rsp)
jz exception_with_ints_disabled
@@ -653,7 +653,7 @@ handle_ist_exception:
testb $3,UREGS_cs(%rsp)
jz 1f
/* Interrupted guest context. Copy the context to stack bottom. */
- GET_CPUINFO_FIELD(guest_cpu_user_regs,%rdi)
+ GET_CPUINFO_FIELD(guest_cpu_user_regs,di)
movq %rsp,%rsi
movl $UREGS_kernel_sizeof/8,%ecx
movq %rdi,%rsp
@@ -668,7 +668,7 @@ handle_ist_exception:
/* We want to get straight to the IRET on the NMI exit path. */
testb $3,UREGS_cs(%rsp)
jz restore_all_xen
- GET_CURRENT(%rbx)
+ GET_CURRENT(bx)
/* Send an IPI to ourselves to cover for the lack of event checking. */
movl VCPU_processor(%rbx),%eax
shll $IRQSTAT_shift,%eax
diff --git a/xen/include/asm-x86/asm_defns.h b/xen/include/asm-x86/asm_defns.h
index 2bb8a6b..279d702 100644
--- a/xen/include/asm-x86/asm_defns.h
+++ b/xen/include/asm-x86/asm_defns.h
@@ -127,19 +127,19 @@ void ret_from_intr(void);
UNLIKELY_DONE(mp, tag); \
__UNLIKELY_END(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 STACK_CPUINFO_FIELD(field) (1 - CPUINFO_sizeof + CPUINFO_##field)
+#define GET_STACK_END(reg) \
+ movl $STACK_SIZE-1, %e##reg; \
+ orq %rsp, %r##reg
#define GET_CPUINFO_FIELD(field, reg) \
- GET_STACK_BASE(reg); \
- addq $STACK_CPUINFO_FIELD(field),reg
+ GET_STACK_END(reg); \
+ addq $STACK_CPUINFO_FIELD(field), %r##reg
#define __GET_CURRENT(reg) \
- movq STACK_CPUINFO_FIELD(current_vcpu)(reg),reg
+ movq STACK_CPUINFO_FIELD(current_vcpu)(%r##reg), %r##reg
#define GET_CURRENT(reg) \
- GET_STACK_BASE(reg); \
+ GET_STACK_END(reg); \
__GET_CURRENT(reg)
#ifndef NDEBUG
diff --git a/xen/include/asm-x86/current.h b/xen/include/asm-x86/current.h
index 73a7209..fa55602 100644
--- a/xen/include/asm-x86/current.h
+++ b/xen/include/asm-x86/current.h
@@ -55,7 +55,7 @@ static inline struct cpu_info *get_cpu_info(void)
register unsigned long sp asm("rsp");
#endif
- return (struct cpu_info *)((sp & ~(STACK_SIZE-1)) + STACK_SIZE) - 1;
+ return (struct cpu_info *)((sp | (STACK_SIZE - 1)) + 1) - 1;
}
#define get_current() (get_cpu_info()->current_vcpu)
--
generated by git-patchbot for /home/xen/git/xen.git#master
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |