diff options
-rw-r--r-- | xen/arch/x86/traps.c | 47 |
1 files changed, 26 insertions, 21 deletions
diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c index 7248189304..8e324e5b16 100644 --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c @@ -128,12 +128,13 @@ boolean_param("ler", opt_ler); static void show_guest_stack(struct cpu_user_regs *regs) { int i; + struct vcpu *curr = current; unsigned long *stack, addr; - if ( is_hvm_vcpu(current) ) + if ( is_hvm_vcpu(curr) ) return; - if ( is_pv_32on64_vcpu(current) ) + if ( is_pv_32on64_vcpu(curr) ) { compat_show_guest_stack(regs, debug_stack_lines); return; @@ -800,12 +801,13 @@ void propagate_page_fault(unsigned long addr, u16 error_code) static int handle_gdt_ldt_mapping_fault( unsigned long offset, struct cpu_user_regs *regs) { + struct vcpu *curr = current; /* Which vcpu's area did we fault in, and is it in the ldt sub-area? */ unsigned int is_ldt_area = (offset >> (GDT_LDT_VCPU_VA_SHIFT-1)) & 1; unsigned int vcpu_area = (offset >> GDT_LDT_VCPU_VA_SHIFT); /* Should never fault in another vcpu's area. */ - BUG_ON(vcpu_area != current->vcpu_id); + BUG_ON(vcpu_area != curr->vcpu_id); /* Byte offset within the gdt/ldt sub-area. */ offset &= (1UL << (GDT_LDT_VCPU_VA_SHIFT-1)) - 1UL; @@ -826,7 +828,7 @@ static int handle_gdt_ldt_mapping_fault( return 0; /* In guest mode? Propagate #PF to guest, with adjusted %cr2. */ propagate_page_fault( - current->arch.guest_context.ldt_base + offset, + curr->arch.guest_context.ldt_base + offset, regs->error_code); } } @@ -2472,14 +2474,16 @@ void unset_nmi_callback(void) asmlinkage int do_device_not_available(struct cpu_user_regs *regs) { + struct vcpu *curr = current; + BUG_ON(!guest_mode(regs)); - setup_fpu(current); + setup_fpu(curr); - if ( current->arch.guest_context.ctrlreg[0] & X86_CR0_TS ) + if ( curr->arch.guest_context.ctrlreg[0] & X86_CR0_TS ) { do_guest_trap(TRAP_no_device, regs, 0); - current->arch.guest_context.ctrlreg[0] &= ~X86_CR0_TS; + curr->arch.guest_context.ctrlreg[0] &= ~X86_CR0_TS; } else TRACE_0D(TRC_PV_MATH_STATE_RESTORE); @@ -2660,7 +2664,7 @@ void __init trap_init(void) long register_guest_nmi_callback(unsigned long address) { struct vcpu *v = current; - struct domain *d = current->domain; + struct domain *d = v->domain; struct trap_info *t = &v->arch.guest_context.trap_ctxt[TRAP_nmi]; t->vector = TRAP_nmi; @@ -2692,14 +2696,15 @@ long unregister_guest_nmi_callback(void) long do_set_trap_table(XEN_GUEST_HANDLE(trap_info_t) traps) { struct trap_info cur; - struct trap_info *dst = current->arch.guest_context.trap_ctxt; + struct vcpu *curr = current; + struct trap_info *dst = curr->arch.guest_context.trap_ctxt; long rc = 0; /* If no table is presented then clear the entire virtual IDT. */ if ( guest_handle_is_null(traps) ) { memset(dst, 0, 256 * sizeof(*dst)); - init_int80_direct_trap(current); + init_int80_direct_trap(curr); return 0; } @@ -2721,12 +2726,12 @@ long do_set_trap_table(XEN_GUEST_HANDLE(trap_info_t) traps) if ( cur.address == 0 ) break; - fixup_guest_code_selector(current->domain, cur.cs); + fixup_guest_code_selector(curr->domain, cur.cs); memcpy(&dst[cur.vector], &cur, sizeof(cur)); if ( cur.vector == 0x80 ) - init_int80_direct_trap(current); + init_int80_direct_trap(curr); guest_handle_add_offset(traps, 1); } @@ -2734,35 +2739,35 @@ long do_set_trap_table(XEN_GUEST_HANDLE(trap_info_t) traps) return rc; } - -long set_debugreg(struct vcpu *p, int reg, unsigned long value) +long set_debugreg(struct vcpu *v, int reg, unsigned long value) { int i; + struct vcpu *curr = current; switch ( reg ) { case 0: if ( !access_ok(value, sizeof(long)) ) return -EPERM; - if ( p == current ) + if ( v == curr ) asm volatile ( "mov %0, %%db0" : : "r" (value) ); break; case 1: if ( !access_ok(value, sizeof(long)) ) return -EPERM; - if ( p == current ) + if ( v == curr ) asm volatile ( "mov %0, %%db1" : : "r" (value) ); break; case 2: if ( !access_ok(value, sizeof(long)) ) return -EPERM; - if ( p == current ) + if ( v == curr ) asm volatile ( "mov %0, %%db2" : : "r" (value) ); break; case 3: if ( !access_ok(value, sizeof(long)) ) return -EPERM; - if ( p == current ) + if ( v == curr ) asm volatile ( "mov %0, %%db3" : : "r" (value) ); break; case 6: @@ -2772,7 +2777,7 @@ long set_debugreg(struct vcpu *p, int reg, unsigned long value) */ value &= 0xffffefff; /* reserved bits => 0 */ value |= 0xffff0ff0; /* reserved bits => 1 */ - if ( p == current ) + if ( v == curr ) asm volatile ( "mov %0, %%db6" : : "r" (value) ); break; case 7: @@ -2793,14 +2798,14 @@ long set_debugreg(struct vcpu *p, int reg, unsigned long value) for ( i = 0; i < 16; i += 2 ) if ( ((value >> (i+16)) & 3) == 2 ) return -EPERM; } - if ( p == current ) + if ( v == current ) asm volatile ( "mov %0, %%db7" : : "r" (value) ); break; default: return -EINVAL; } - p->arch.guest_context.debugreg[reg] = value; + v->arch.guest_context.debugreg[reg] = value; return 0; } |