Prev: [25/45] USB: EHCI: fix counting of transaction error retries
Next: [27/89] serial: 8250_pnp: use wildcard for serial Wacom tablets
From: Greg KH on 30 Mar 2010 20:40 2.6.27-stable review patch. If anyone has any objections, please let us know. ------------------ commit eb3c79e64a70fb8f7473e30fa07e89c1ecc2c9bb upstream [ <cebbert(a)redhat.com>: backport to 2.6.27 ] While we are never normally passed an instruction that exceeds 15 bytes, smp games can cause us to attempt to interpret one, which will cause large latencies in non-preempt hosts. Signed-off-by: Avi Kivity <avi(a)redhat.com> Signed-off-by: Greg Kroah-Hartman <gregkh(a)suse.de> --- arch/x86/kvm/x86_emulate.c | 5 ++++- include/asm-x86/kvm_x86_emulate.h | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) --- a/arch/x86/kvm/x86_emulate.c +++ b/arch/x86/kvm/x86_emulate.c @@ -581,6 +581,9 @@ static int do_insn_fetch(struct x86_emul { int rc = 0; + /* x86 instructions are limited to 15 bytes. */ + if (eip + size - ctxt->decode.eip_orig > 15) + return X86EMUL_UNHANDLEABLE; eip += ctxt->cs_base; while (size--) { rc = do_fetch_insn_byte(ctxt, ops, eip++, dest++); @@ -839,7 +842,7 @@ x86_decode_insn(struct x86_emulate_ctxt /* Shadow copy of register state. Committed on successful emulation. */ memset(c, 0, sizeof(struct decode_cache)); - c->eip = ctxt->vcpu->arch.rip; + c->eip = c->eip_orig = ctxt->vcpu->arch.rip; ctxt->cs_base = seg_base(ctxt, VCPU_SREG_CS); memcpy(c->regs, ctxt->vcpu->arch.regs, sizeof c->regs); --- a/include/asm-x86/kvm_x86_emulate.h +++ b/include/asm-x86/kvm_x86_emulate.h @@ -128,7 +128,7 @@ struct decode_cache { u8 seg_override; unsigned int d; unsigned long regs[NR_VCPU_REGS]; - unsigned long eip; + unsigned long eip, eip_orig; /* modrm */ u8 modrm; u8 modrm_mod; -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ |