diff options
-rw-r--r-- | arch/x86/kvm/emulate.c | 31 | ||||
-rw-r--r-- | include/trace/events/kvm.h | 16 |
2 files changed, 19 insertions, 28 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 169b09d76ddd..de12c1d379f1 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c | |||
@@ -2348,7 +2348,7 @@ static int em_sysenter(struct x86_emulate_ctxt *ctxt) | |||
2348 | * Not recognized on AMD in compat mode (but is recognized in legacy | 2348 | * Not recognized on AMD in compat mode (but is recognized in legacy |
2349 | * mode). | 2349 | * mode). |
2350 | */ | 2350 | */ |
2351 | if ((ctxt->mode == X86EMUL_MODE_PROT32) && (efer & EFER_LMA) | 2351 | if ((ctxt->mode != X86EMUL_MODE_PROT64) && (efer & EFER_LMA) |
2352 | && !vendor_intel(ctxt)) | 2352 | && !vendor_intel(ctxt)) |
2353 | return emulate_ud(ctxt); | 2353 | return emulate_ud(ctxt); |
2354 | 2354 | ||
@@ -2359,25 +2359,13 @@ static int em_sysenter(struct x86_emulate_ctxt *ctxt) | |||
2359 | setup_syscalls_segments(ctxt, &cs, &ss); | 2359 | setup_syscalls_segments(ctxt, &cs, &ss); |
2360 | 2360 | ||
2361 | ops->get_msr(ctxt, MSR_IA32_SYSENTER_CS, &msr_data); | 2361 | ops->get_msr(ctxt, MSR_IA32_SYSENTER_CS, &msr_data); |
2362 | switch (ctxt->mode) { | 2362 | if ((msr_data & 0xfffc) == 0x0) |
2363 | case X86EMUL_MODE_PROT32: | 2363 | return emulate_gp(ctxt, 0); |
2364 | if ((msr_data & 0xfffc) == 0x0) | ||
2365 | return emulate_gp(ctxt, 0); | ||
2366 | break; | ||
2367 | case X86EMUL_MODE_PROT64: | ||
2368 | if (msr_data == 0x0) | ||
2369 | return emulate_gp(ctxt, 0); | ||
2370 | break; | ||
2371 | default: | ||
2372 | break; | ||
2373 | } | ||
2374 | 2364 | ||
2375 | ctxt->eflags &= ~(EFLG_VM | EFLG_IF); | 2365 | ctxt->eflags &= ~(EFLG_VM | EFLG_IF); |
2376 | cs_sel = (u16)msr_data; | 2366 | cs_sel = (u16)msr_data & ~SELECTOR_RPL_MASK; |
2377 | cs_sel &= ~SELECTOR_RPL_MASK; | ||
2378 | ss_sel = cs_sel + 8; | 2367 | ss_sel = cs_sel + 8; |
2379 | ss_sel &= ~SELECTOR_RPL_MASK; | 2368 | if (efer & EFER_LMA) { |
2380 | if (ctxt->mode == X86EMUL_MODE_PROT64 || (efer & EFER_LMA)) { | ||
2381 | cs.d = 0; | 2369 | cs.d = 0; |
2382 | cs.l = 1; | 2370 | cs.l = 1; |
2383 | } | 2371 | } |
@@ -2386,10 +2374,11 @@ static int em_sysenter(struct x86_emulate_ctxt *ctxt) | |||
2386 | ops->set_segment(ctxt, ss_sel, &ss, 0, VCPU_SREG_SS); | 2374 | ops->set_segment(ctxt, ss_sel, &ss, 0, VCPU_SREG_SS); |
2387 | 2375 | ||
2388 | ops->get_msr(ctxt, MSR_IA32_SYSENTER_EIP, &msr_data); | 2376 | ops->get_msr(ctxt, MSR_IA32_SYSENTER_EIP, &msr_data); |
2389 | ctxt->_eip = msr_data; | 2377 | ctxt->_eip = (efer & EFER_LMA) ? msr_data : (u32)msr_data; |
2390 | 2378 | ||
2391 | ops->get_msr(ctxt, MSR_IA32_SYSENTER_ESP, &msr_data); | 2379 | ops->get_msr(ctxt, MSR_IA32_SYSENTER_ESP, &msr_data); |
2392 | *reg_write(ctxt, VCPU_REGS_RSP) = msr_data; | 2380 | *reg_write(ctxt, VCPU_REGS_RSP) = (efer & EFER_LMA) ? msr_data : |
2381 | (u32)msr_data; | ||
2393 | 2382 | ||
2394 | return X86EMUL_CONTINUE; | 2383 | return X86EMUL_CONTINUE; |
2395 | } | 2384 | } |
@@ -3791,8 +3780,8 @@ static const struct opcode group5[] = { | |||
3791 | }; | 3780 | }; |
3792 | 3781 | ||
3793 | static const struct opcode group6[] = { | 3782 | static const struct opcode group6[] = { |
3794 | DI(Prot, sldt), | 3783 | DI(Prot | DstMem, sldt), |
3795 | DI(Prot, str), | 3784 | DI(Prot | DstMem, str), |
3796 | II(Prot | Priv | SrcMem16, em_lldt, lldt), | 3785 | II(Prot | Priv | SrcMem16, em_lldt, lldt), |
3797 | II(Prot | Priv | SrcMem16, em_ltr, ltr), | 3786 | II(Prot | Priv | SrcMem16, em_ltr, ltr), |
3798 | N, N, N, N, | 3787 | N, N, N, N, |
diff --git a/include/trace/events/kvm.h b/include/trace/events/kvm.h index 6edf1f2028cd..86b399c66c3d 100644 --- a/include/trace/events/kvm.h +++ b/include/trace/events/kvm.h | |||
@@ -146,6 +146,14 @@ TRACE_EVENT(kvm_msi_set_irq, | |||
146 | 146 | ||
147 | #if defined(CONFIG_HAVE_KVM_IRQFD) | 147 | #if defined(CONFIG_HAVE_KVM_IRQFD) |
148 | 148 | ||
149 | #ifdef kvm_irqchips | ||
150 | #define kvm_ack_irq_string "irqchip %s pin %u" | ||
151 | #define kvm_ack_irq_parm __print_symbolic(__entry->irqchip, kvm_irqchips), __entry->pin | ||
152 | #else | ||
153 | #define kvm_ack_irq_string "irqchip %d pin %u" | ||
154 | #define kvm_ack_irq_parm __entry->irqchip, __entry->pin | ||
155 | #endif | ||
156 | |||
149 | TRACE_EVENT(kvm_ack_irq, | 157 | TRACE_EVENT(kvm_ack_irq, |
150 | TP_PROTO(unsigned int irqchip, unsigned int pin), | 158 | TP_PROTO(unsigned int irqchip, unsigned int pin), |
151 | TP_ARGS(irqchip, pin), | 159 | TP_ARGS(irqchip, pin), |
@@ -160,13 +168,7 @@ TRACE_EVENT(kvm_ack_irq, | |||
160 | __entry->pin = pin; | 168 | __entry->pin = pin; |
161 | ), | 169 | ), |
162 | 170 | ||
163 | #ifdef kvm_irqchips | 171 | TP_printk(kvm_ack_irq_string, kvm_ack_irq_parm) |
164 | TP_printk("irqchip %s pin %u", | ||
165 | __print_symbolic(__entry->irqchip, kvm_irqchips), | ||
166 | __entry->pin) | ||
167 | #else | ||
168 | TP_printk("irqchip %d pin %u", __entry->irqchip, __entry->pin) | ||
169 | #endif | ||
170 | ); | 172 | ); |
171 | 173 | ||
172 | #endif /* defined(CONFIG_HAVE_KVM_IRQFD) */ | 174 | #endif /* defined(CONFIG_HAVE_KVM_IRQFD) */ |