[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] merge
# HG changeset patch # User Ian Campbell <ian.campbell@xxxxxxxxxxxxx> # Date 1174401293 0 # Node ID 129bc1eda8d02df1ca75de35760451048f314725 # Parent 61a4a4795be57d12d2c1d9de5a12b8c847e77205 # Parent 522a1cd17b6d6f11cf19b318c163158efddb9381 merge --- xen/arch/x86/x86_64/asm-offsets.c | 1 + xen/arch/x86/x86_64/compat/entry.S | 4 ++++ xen/arch/x86/x86_64/compat/traps.c | 4 ++++ xen/arch/x86/x86_64/entry.S | 30 ++++++++++++++++++++++++++++++ xen/arch/x86/x86_64/traps.c | 18 ++++++++++++++++++ xen/include/asm-x86/domain.h | 3 +++ xen/include/asm-x86/processor.h | 6 +++--- 7 files changed, 63 insertions(+), 3 deletions(-) diff -r 61a4a4795be5 -r 129bc1eda8d0 xen/arch/x86/x86_64/asm-offsets.c --- a/xen/arch/x86/x86_64/asm-offsets.c Tue Mar 20 11:56:20 2007 +0000 +++ b/xen/arch/x86/x86_64/asm-offsets.c Tue Mar 20 14:34:53 2007 +0000 @@ -59,6 +59,7 @@ void __dummy__(void) OFFSET(VCPU_domain, struct vcpu, domain); OFFSET(VCPU_vcpu_info, struct vcpu, vcpu_info); OFFSET(VCPU_trap_bounce, struct vcpu, arch.trap_bounce); + OFFSET(VCPU_int80_bounce, struct vcpu, arch.int80_bounce); OFFSET(VCPU_thread_flags, struct vcpu, arch.flags); OFFSET(VCPU_event_addr, struct vcpu, arch.guest_context.event_callback_eip); diff -r 61a4a4795be5 -r 129bc1eda8d0 xen/arch/x86/x86_64/compat/entry.S --- a/xen/arch/x86/x86_64/compat/entry.S Tue Mar 20 11:56:20 2007 +0000 +++ b/xen/arch/x86/x86_64/compat/entry.S Tue Mar 20 14:34:53 2007 +0000 @@ -186,6 +186,10 @@ ENTRY(compat_post_handle_exception) jz compat_test_all_events call compat_create_bounce_frame jmp compat_test_all_events + +ENTRY(compat_int80_direct_trap) + call compat_create_bounce_frame + jmp compat_restore_all_guest /* CREATE A BASIC EXCEPTION FRAME ON GUEST OS (RING-1) STACK: */ /* {[ERRCODE,] EIP, CS, EFLAGS, [ESP, SS]} */ diff -r 61a4a4795be5 -r 129bc1eda8d0 xen/arch/x86/x86_64/compat/traps.c --- a/xen/arch/x86/x86_64/compat/traps.c Tue Mar 20 11:56:20 2007 +0000 +++ b/xen/arch/x86/x86_64/compat/traps.c Tue Mar 20 14:34:53 2007 +0000 @@ -1,6 +1,7 @@ #ifdef CONFIG_COMPAT #include <xen/event.h> +#include <asm/regs.h> #include <compat/callback.h> #include <compat/arch-x86_32.h> @@ -291,6 +292,9 @@ int compat_set_trap_table(XEN_GUEST_HAND XLAT_trap_info(dst + cur.vector, &cur); + if ( cur.vector == 0x80 ) + init_int80_direct_trap(current); + guest_handle_add_offset(traps, 1); } diff -r 61a4a4795be5 -r 129bc1eda8d0 xen/arch/x86/x86_64/entry.S --- a/xen/arch/x86/x86_64/entry.S Tue Mar 20 11:56:20 2007 +0000 +++ b/xen/arch/x86/x86_64/entry.S Tue Mar 20 14:34:53 2007 +0000 @@ -221,6 +221,35 @@ bad_hypercall: bad_hypercall: movq $-ENOSYS,UREGS_rax(%rsp) jmp test_all_events + +ENTRY(int80_direct_trap) + pushq $0 + SAVE_ALL + + GET_CURRENT(%rbx) + + /* Check that the callback is non-null. */ + leaq VCPU_int80_bounce(%rbx),%rdx + cmp $0, TRAPBOUNCE_flags(%rdx) + jz int80_slow_path + + movq VCPU_domain(%rbx),%rax + btl $_DOMF_compat,DOMAIN_domain_flags(%rax) + jc compat_int80_direct_trap + + call create_bounce_frame + jmp restore_all_guest + +int80_slow_path: + /* + * Setup entry vector and error code as if this was a GPF caused by an + * IDT entry with DPL==0. + */ + movl $((0x80 << 3) | 0x2),UREGS_error_code(%rsp) + movl $TRAP_gp_fault,UREGS_entry_vector(%rsp) + /* A GPF wouldn't have incremented the instruction pointer. */ + sub $2,UREGS_rip(%rsp) + jmp handle_exception_saved /* CREATE A BASIC EXCEPTION FRAME ON GUEST OS STACK: */ /* { RCX, R11, [DS-GS,] [CR2,] [ERRCODE,] RIP, CS, RFLAGS, RSP, SS } */ @@ -359,6 +388,7 @@ ENTRY(ret_from_intr) /* No special register assumptions. */ ENTRY(handle_exception) SAVE_ALL +handle_exception_saved: testb $X86_EFLAGS_IF>>8,UREGS_eflags+1(%rsp) jz exception_with_ints_disabled sti diff -r 61a4a4795be5 -r 129bc1eda8d0 xen/arch/x86/x86_64/traps.c --- a/xen/arch/x86/x86_64/traps.c Tue Mar 20 11:56:20 2007 +0000 +++ b/xen/arch/x86/x86_64/traps.c Tue Mar 20 14:34:53 2007 +0000 @@ -247,6 +247,7 @@ unsigned long do_iret(void) asmlinkage void syscall_enter(void); asmlinkage void compat_hypercall(void); +asmlinkage void int80_direct_trap(void); void __init percpu_traps_init(void) { char *stack_bottom, *stack; @@ -262,6 +263,7 @@ void __init percpu_traps_init(void) #ifdef CONFIG_COMPAT /* The hypercall entry vector is only accessible from ring 1. */ _set_gate(idt_table+HYPERCALL_VECTOR, 15, 1, &compat_hypercall); + _set_gate(idt_table+0x80, 15, 3, &int80_direct_trap); #endif } @@ -344,6 +346,22 @@ void __init percpu_traps_init(void) wrmsr(MSR_STAR, 0, (FLAT_RING3_CS32<<16) | __HYPERVISOR_CS); wrmsr(MSR_SYSCALL_MASK, EF_VM|EF_RF|EF_NT|EF_DF|EF_IE|EF_TF, 0U); +} + +void init_int80_direct_trap(struct vcpu *v) +{ + struct trap_info *ti = &v->arch.guest_context.trap_ctxt[0x80]; + struct trap_bounce *tb = &v->arch.int80_bounce; + + if ( !guest_gate_selector_okay(v->domain, ti->cs) ) + return; + + tb->flags = TBF_EXCEPTION; + tb->cs = ti->cs; + tb->eip = ti->address; + + if ( null_trap_bounce(v, tb) ) + tb->flags = 0; } static long register_guest_callback(struct callback_register *reg) diff -r 61a4a4795be5 -r 129bc1eda8d0 xen/include/asm-x86/domain.h --- a/xen/include/asm-x86/domain.h Tue Mar 20 11:56:20 2007 +0000 +++ b/xen/include/asm-x86/domain.h Tue Mar 20 14:34:53 2007 +0000 @@ -248,6 +248,9 @@ struct arch_vcpu #ifdef CONFIG_X86_32 struct desc_struct int80_desc; #endif +#ifdef CONFIG_X86_64 + struct trap_bounce int80_bounce; +#endif /* Virtual Machine Extensions */ struct hvm_vcpu hvm_vcpu; diff -r 61a4a4795be5 -r 129bc1eda8d0 xen/include/asm-x86/processor.h --- a/xen/include/asm-x86/processor.h Tue Mar 20 11:56:20 2007 +0000 +++ b/xen/include/asm-x86/processor.h Tue Mar 20 14:34:53 2007 +0000 @@ -455,16 +455,16 @@ extern idt_entry_t *idt_tables[]; extern struct tss_struct init_tss[NR_CPUS]; -#ifdef CONFIG_X86_32 - extern void init_int80_direct_trap(struct vcpu *v); + +#if defined(CONFIG_X86_32) + #define set_int80_direct_trap(_ed) \ (memcpy(idt_tables[(_ed)->processor] + 0x80, \ &((_ed)->arch.int80_desc), 8)) #else -#define init_int80_direct_trap(_ed) ((void)0) #define set_int80_direct_trap(_ed) ((void)0) #endif _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |