mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-09 12:17:12 +09:00
KVM: x86 emulator: limit instructions to 15 bytes
commit eb3c79e64a upstream.
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@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
7cb056b820
commit
b63569376a
@@ -129,7 +129,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;
|
||||
|
||||
@@ -613,6 +613,9 @@ static int do_insn_fetch(struct x86_emulate_ctxt *ctxt,
|
||||
{
|
||||
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++);
|
||||
@@ -871,7 +874,7 @@ x86_decode_insn(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops)
|
||||
/* Shadow copy of register state. Committed on successful emulation. */
|
||||
|
||||
memset(c, 0, sizeof(struct decode_cache));
|
||||
c->eip = kvm_rip_read(ctxt->vcpu);
|
||||
c->eip = c->eip_orig = kvm_rip_read(ctxt->vcpu);
|
||||
ctxt->cs_base = seg_base(ctxt, VCPU_SREG_CS);
|
||||
memcpy(c->regs, ctxt->vcpu->arch.regs, sizeof c->regs);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user