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) */ |
