[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 2/5] x86/pv: Drop int80_bounce from struct pv_vcpu
The int80_bounce field of struct pv_vcpu is a bit of an odd special case, because it is a simple derivation of trap_ctxt[0x80], which is also stored. It is also the only use of {compat_,}create_bounce_frame() which isn't referencing the plain trap_bounce field of struct pv_vcpu. (And altering this property the purpose of this patch.) Remove the int80_bounce field entirely, along with init_int80_direct_trap(), which in turn requires that the int80_direct_trap() path gain logic previously contained in init_int80_direct_trap(). This does admittedly make the int80 fastpath slightly longer, but these few instructions are in the noise compared to the architectural context switch overhead, and it now matches the syscall/sysenter paths (which have far less architectural overhead already). No behavioural change from the guests point of view. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx> --- v2: * Fix comparason against DOMAIN_is_32bit_pv --- xen/arch/x86/domain.c | 2 -- xen/arch/x86/pv/callback.c | 8 -------- xen/arch/x86/pv/traps.c | 14 -------------- xen/arch/x86/x86_64/asm-offsets.c | 1 - xen/arch/x86/x86_64/entry.S | 32 ++++++++++++++++++++++++++++---- xen/include/asm-x86/domain.h | 1 - xen/include/asm-x86/processor.h | 2 -- 7 files changed, 28 insertions(+), 32 deletions(-) diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index 1f8b08e..69679a6 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -892,8 +892,6 @@ int arch_set_info_guest( goto out; } - init_int80_direct_trap(v); - /* IOPL privileges are virtualised. */ v->arch.pv_vcpu.iopl = v->arch.user_regs.eflags & X86_EFLAGS_IOPL; v->arch.user_regs.eflags &= ~X86_EFLAGS_IOPL; diff --git a/xen/arch/x86/pv/callback.c b/xen/arch/x86/pv/callback.c index 97d8438..29ae692 100644 --- a/xen/arch/x86/pv/callback.c +++ b/xen/arch/x86/pv/callback.c @@ -371,7 +371,6 @@ long do_set_trap_table(XEN_GUEST_HANDLE_PARAM(const_trap_info_t) traps) if ( guest_handle_is_null(traps) ) { memset(dst, 0, NR_VECTORS * sizeof(*dst)); - init_int80_direct_trap(curr); return 0; } @@ -393,9 +392,6 @@ long do_set_trap_table(XEN_GUEST_HANDLE_PARAM(const_trap_info_t) traps) memcpy(&dst[cur.vector], &cur, sizeof(cur)); - if ( cur.vector == 0x80 ) - init_int80_direct_trap(curr); - guest_handle_add_offset(traps, 1); if ( hypercall_preempt_check() ) @@ -420,7 +416,6 @@ int compat_set_trap_table(XEN_GUEST_HANDLE(trap_info_compat_t) traps) if ( guest_handle_is_null(traps) ) { memset(dst, 0, NR_VECTORS * sizeof(*dst)); - init_int80_direct_trap(curr); return 0; } @@ -439,9 +434,6 @@ int compat_set_trap_table(XEN_GUEST_HANDLE(trap_info_compat_t) traps) XLAT_trap_info(dst + cur.vector, &cur); - if ( cur.vector == 0x80 ) - init_int80_direct_trap(curr); - guest_handle_add_offset(traps, 1); if ( hypercall_preempt_check() ) diff --git a/xen/arch/x86/pv/traps.c b/xen/arch/x86/pv/traps.c index d122881..98549bc 100644 --- a/xen/arch/x86/pv/traps.c +++ b/xen/arch/x86/pv/traps.c @@ -142,20 +142,6 @@ bool set_guest_nmi_trapbounce(void) return !null_trap_bounce(curr, tb); } -void init_int80_direct_trap(struct vcpu *v) -{ - struct trap_info *ti = &v->arch.pv_vcpu.trap_ctxt[0x80]; - struct trap_bounce *tb = &v->arch.pv_vcpu.int80_bounce; - - tb->cs = ti->cs; - tb->eip = ti->address; - - if ( null_trap_bounce(v, tb) ) - tb->flags = 0; - else - tb->flags = TBF_EXCEPTION | (TI_GET_IF(ti) ? TBF_INTERRUPT : 0); -} - struct softirq_trap { struct domain *domain; /* domain to inject trap */ struct vcpu *vcpu; /* vcpu to inject trap */ diff --git a/xen/arch/x86/x86_64/asm-offsets.c b/xen/arch/x86/x86_64/asm-offsets.c index e6d4147..1a45428 100644 --- a/xen/arch/x86/x86_64/asm-offsets.c +++ b/xen/arch/x86/x86_64/asm-offsets.c @@ -61,7 +61,6 @@ void __dummy__(void) OFFSET(VCPU_domain, struct vcpu, domain); OFFSET(VCPU_vcpu_info, struct vcpu, vcpu_info); OFFSET(VCPU_trap_bounce, struct vcpu, arch.pv_vcpu.trap_bounce); - OFFSET(VCPU_int80_bounce, struct vcpu, arch.pv_vcpu.int80_bounce); OFFSET(VCPU_thread_flags, struct vcpu, arch.flags); OFFSET(VCPU_event_addr, struct vcpu, arch.pv_vcpu.event_callback_eip); OFFSET(VCPU_event_sel, struct vcpu, arch.pv_vcpu.event_callback_cs); diff --git a/xen/arch/x86/x86_64/entry.S b/xen/arch/x86/x86_64/entry.S index 6249efe..bf41563 100644 --- a/xen/arch/x86/x86_64/entry.S +++ b/xen/arch/x86/x86_64/entry.S @@ -336,12 +336,36 @@ UNLIKELY_END(msi_check) movq STACK_CPUINFO_FIELD(current_vcpu)(%rbx), %rbx - /* Check that the callback is non-null. */ - leaq VCPU_int80_bounce(%rbx),%rdx - cmpb $0,TRAPBOUNCE_flags(%rdx) + mov VCPU_trap_ctxt(%rbx), %rsi + mov VCPU_domain(%rbx), %rax + + /* + * if ( null_trap_bounce(v, &v->arch.pv_vcpu.trap_ctxt[0x80]) ) + * goto int80_slow_path; + */ + mov 0x80 * TRAPINFO_sizeof + TRAPINFO_eip(%rsi), %rdi + movzwl 0x80 * TRAPINFO_sizeof + TRAPINFO_cs (%rsi), %ecx + + mov %ecx, %edx + and $~3, %edx + + cmpb $0, DOMAIN_is_32bit_pv(%rax) + cmove %rdi, %rdx + + test %rdx, %rdx jz int80_slow_path - movq VCPU_domain(%rbx),%rax + /* Construct trap_bounce from trap_ctxt[0x80]. */ + lea VCPU_trap_bounce(%rbx), %rdx + movw %cx, TRAPBOUNCE_cs(%rdx) + movq %rdi, TRAPBOUNCE_eip(%rdx) + + /* TB_flags = TBF_EXCEPTION | (TI_GET_IF(ti) ? TBF_INTERRUPT : 0); */ + testb $4, 0x80 * TRAPINFO_sizeof + TRAPINFO_flags(%rsi) + setnz %cl + lea TBF_EXCEPTION(, %rcx, TBF_INTERRUPT), %ecx + mov %cl, TRAPBOUNCE_flags(%rdx) + cmpb $0, DOMAIN_is_32bit_pv(%rax) jne compat_int80_direct_trap diff --git a/xen/include/asm-x86/domain.h b/xen/include/asm-x86/domain.h index 4679d54..47aadc2 100644 --- a/xen/include/asm-x86/domain.h +++ b/xen/include/asm-x86/domain.h @@ -482,7 +482,6 @@ struct pv_vcpu /* Bounce information for propagating an exception to guest OS. */ struct trap_bounce trap_bounce; - struct trap_bounce int80_bounce; /* I/O-port access bitmap. */ XEN_GUEST_HANDLE(uint8) iobmp; /* Guest kernel vaddr of the bitmap. */ diff --git a/xen/include/asm-x86/processor.h b/xen/include/asm-x86/processor.h index 9c70a98..01bc89f 100644 --- a/xen/include/asm-x86/processor.h +++ b/xen/include/asm-x86/processor.h @@ -439,8 +439,6 @@ extern idt_entry_t *idt_tables[]; DECLARE_PER_CPU(struct tss_struct, init_tss); DECLARE_PER_CPU(root_pgentry_t *, root_pgt); -extern void init_int80_direct_trap(struct vcpu *v); - extern void write_ptbase(struct vcpu *v); /* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */ -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |