Three small fixes. Two for x86 and one avoids that sparse bails out.
-----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQEcBAABAgAGBQJUwkVXAAoJEL/70l94x66DwPEH/RPBmxJ+lD0nRyXVECSWxjN6 DYJvp4HsLV8BhBx/ATjAkjiVPKTUk9vQBjfgl72YatjASP9aNIkBqnN0AOVdVQ2i 04ZvYaSw3jY0A5PSecdFQZ4u8MAvaRS4AYNOYM3Kpf0EOrIwanXFpEfVRGT8ichT uBK/mbN7vDO1SsgAnB00fCew4wFrHIa7fJ8eLNnebDOuC72oUZA+2nKx8ApWq4ca ZaziqkI2CFaV2rqJokKDun2arxI2Q6/L87g7qyo+HMd1b+aepLTWYNOs1vH0YoSc 73aHg+3crIqx75XmnaxKP5SPOr6vpmnloux9yre8u1tvejBIbCMz1g9Mdl0YOmA= =YRTn -----END PGP SIGNATURE----- Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm Pull kvm fixes from Paolo Bonzini: "Three small fixes. Two for x86 and one avoids that sparse bails out" * tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm: KVM: x86: SYSENTER emulation is broken KVM: x86: Fix of previously incomplete fix for CVE-2014-8480 KVM: fix sparse warning in include/trace/events/kvm.h
This commit is contained in:
commit
2e3810da41
2 changed files with 19 additions and 28 deletions
|
@ -2348,7 +2348,7 @@ static int em_sysenter(struct x86_emulate_ctxt *ctxt)
|
||||||
* Not recognized on AMD in compat mode (but is recognized in legacy
|
* Not recognized on AMD in compat mode (but is recognized in legacy
|
||||||
* mode).
|
* mode).
|
||||||
*/
|
*/
|
||||||
if ((ctxt->mode == X86EMUL_MODE_PROT32) && (efer & EFER_LMA)
|
if ((ctxt->mode != X86EMUL_MODE_PROT64) && (efer & EFER_LMA)
|
||||||
&& !vendor_intel(ctxt))
|
&& !vendor_intel(ctxt))
|
||||||
return emulate_ud(ctxt);
|
return emulate_ud(ctxt);
|
||||||
|
|
||||||
|
@ -2359,25 +2359,13 @@ static int em_sysenter(struct x86_emulate_ctxt *ctxt)
|
||||||
setup_syscalls_segments(ctxt, &cs, &ss);
|
setup_syscalls_segments(ctxt, &cs, &ss);
|
||||||
|
|
||||||
ops->get_msr(ctxt, MSR_IA32_SYSENTER_CS, &msr_data);
|
ops->get_msr(ctxt, MSR_IA32_SYSENTER_CS, &msr_data);
|
||||||
switch (ctxt->mode) {
|
if ((msr_data & 0xfffc) == 0x0)
|
||||||
case X86EMUL_MODE_PROT32:
|
return emulate_gp(ctxt, 0);
|
||||||
if ((msr_data & 0xfffc) == 0x0)
|
|
||||||
return emulate_gp(ctxt, 0);
|
|
||||||
break;
|
|
||||||
case X86EMUL_MODE_PROT64:
|
|
||||||
if (msr_data == 0x0)
|
|
||||||
return emulate_gp(ctxt, 0);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
ctxt->eflags &= ~(EFLG_VM | EFLG_IF);
|
ctxt->eflags &= ~(EFLG_VM | EFLG_IF);
|
||||||
cs_sel = (u16)msr_data;
|
cs_sel = (u16)msr_data & ~SELECTOR_RPL_MASK;
|
||||||
cs_sel &= ~SELECTOR_RPL_MASK;
|
|
||||||
ss_sel = cs_sel + 8;
|
ss_sel = cs_sel + 8;
|
||||||
ss_sel &= ~SELECTOR_RPL_MASK;
|
if (efer & EFER_LMA) {
|
||||||
if (ctxt->mode == X86EMUL_MODE_PROT64 || (efer & EFER_LMA)) {
|
|
||||||
cs.d = 0;
|
cs.d = 0;
|
||||||
cs.l = 1;
|
cs.l = 1;
|
||||||
}
|
}
|
||||||
|
@ -2386,10 +2374,11 @@ static int em_sysenter(struct x86_emulate_ctxt *ctxt)
|
||||||
ops->set_segment(ctxt, ss_sel, &ss, 0, VCPU_SREG_SS);
|
ops->set_segment(ctxt, ss_sel, &ss, 0, VCPU_SREG_SS);
|
||||||
|
|
||||||
ops->get_msr(ctxt, MSR_IA32_SYSENTER_EIP, &msr_data);
|
ops->get_msr(ctxt, MSR_IA32_SYSENTER_EIP, &msr_data);
|
||||||
ctxt->_eip = msr_data;
|
ctxt->_eip = (efer & EFER_LMA) ? msr_data : (u32)msr_data;
|
||||||
|
|
||||||
ops->get_msr(ctxt, MSR_IA32_SYSENTER_ESP, &msr_data);
|
ops->get_msr(ctxt, MSR_IA32_SYSENTER_ESP, &msr_data);
|
||||||
*reg_write(ctxt, VCPU_REGS_RSP) = msr_data;
|
*reg_write(ctxt, VCPU_REGS_RSP) = (efer & EFER_LMA) ? msr_data :
|
||||||
|
(u32)msr_data;
|
||||||
|
|
||||||
return X86EMUL_CONTINUE;
|
return X86EMUL_CONTINUE;
|
||||||
}
|
}
|
||||||
|
@ -3791,8 +3780,8 @@ static const struct opcode group5[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct opcode group6[] = {
|
static const struct opcode group6[] = {
|
||||||
DI(Prot, sldt),
|
DI(Prot | DstMem, sldt),
|
||||||
DI(Prot, str),
|
DI(Prot | DstMem, str),
|
||||||
II(Prot | Priv | SrcMem16, em_lldt, lldt),
|
II(Prot | Priv | SrcMem16, em_lldt, lldt),
|
||||||
II(Prot | Priv | SrcMem16, em_ltr, ltr),
|
II(Prot | Priv | SrcMem16, em_ltr, ltr),
|
||||||
N, N, N, N,
|
N, N, N, N,
|
||||||
|
|
|
@ -146,6 +146,14 @@ TRACE_EVENT(kvm_msi_set_irq,
|
||||||
|
|
||||||
#if defined(CONFIG_HAVE_KVM_IRQFD)
|
#if defined(CONFIG_HAVE_KVM_IRQFD)
|
||||||
|
|
||||||
|
#ifdef kvm_irqchips
|
||||||
|
#define kvm_ack_irq_string "irqchip %s pin %u"
|
||||||
|
#define kvm_ack_irq_parm __print_symbolic(__entry->irqchip, kvm_irqchips), __entry->pin
|
||||||
|
#else
|
||||||
|
#define kvm_ack_irq_string "irqchip %d pin %u"
|
||||||
|
#define kvm_ack_irq_parm __entry->irqchip, __entry->pin
|
||||||
|
#endif
|
||||||
|
|
||||||
TRACE_EVENT(kvm_ack_irq,
|
TRACE_EVENT(kvm_ack_irq,
|
||||||
TP_PROTO(unsigned int irqchip, unsigned int pin),
|
TP_PROTO(unsigned int irqchip, unsigned int pin),
|
||||||
TP_ARGS(irqchip, pin),
|
TP_ARGS(irqchip, pin),
|
||||||
|
@ -160,13 +168,7 @@ TRACE_EVENT(kvm_ack_irq,
|
||||||
__entry->pin = pin;
|
__entry->pin = pin;
|
||||||
),
|
),
|
||||||
|
|
||||||
#ifdef kvm_irqchips
|
TP_printk(kvm_ack_irq_string, kvm_ack_irq_parm)
|
||||||
TP_printk("irqchip %s pin %u",
|
|
||||||
__print_symbolic(__entry->irqchip, kvm_irqchips),
|
|
||||||
__entry->pin)
|
|
||||||
#else
|
|
||||||
TP_printk("irqchip %d pin %u", __entry->irqchip, __entry->pin)
|
|
||||||
#endif
|
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif /* defined(CONFIG_HAVE_KVM_IRQFD) */
|
#endif /* defined(CONFIG_HAVE_KVM_IRQFD) */
|
||||||
|
|
Loading…
Add table
Reference in a new issue