diff options
author | Avi Kivity <avi@qumranet.com> | 2008-06-16 06:23:17 +0200 |
---|---|---|
committer | Avi Kivity <avi@qumranet.com> | 2008-07-20 11:42:33 +0200 |
commit | dc71d0f1620790ec8e54101ca37e7b31e31208a8 (patch) | |
tree | 75016ef3339ea6e82e2aaaee99d17e1ffeb64696 | |
parent | KVM: x86 emulator: handle undecoded rex.b with r/m = 5 in certain cases (diff) | |
download | linux-dc71d0f1620790ec8e54101ca37e7b31e31208a8.tar.xz linux-dc71d0f1620790ec8e54101ca37e7b31e31208a8.zip |
KVM: x86 emulator: simplify sib decoding
Instead of using sparse switches, use simpler if/else sequences.
Signed-off-by: Avi Kivity <avi@qumranet.com>
-rw-r--r-- | arch/x86/kvm/x86_emulate.c | 20 |
1 files changed, 4 insertions, 16 deletions
diff --git a/arch/x86/kvm/x86_emulate.c b/arch/x86/kvm/x86_emulate.c index 3721cfddc973..ca7ab2469a4a 100644 --- a/arch/x86/kvm/x86_emulate.c +++ b/arch/x86/kvm/x86_emulate.c @@ -748,24 +748,12 @@ static int decode_modrm(struct x86_emulate_ctxt *ctxt, base_reg |= sib & 7; scale = sib >> 6; - switch (base_reg) { - case 5: - case 13: - if (c->modrm_mod != 0) - c->modrm_ea += c->regs[base_reg]; - else - c->modrm_ea += - insn_fetch(s32, 4, c->eip); - break; - default: + if ((base_reg & 7) == 5 && c->modrm_mod == 0) + c->modrm_ea += insn_fetch(s32, 4, c->eip); + else c->modrm_ea += c->regs[base_reg]; - } - switch (index_reg) { - case 4: - break; - default: + if (index_reg != 4) c->modrm_ea += c->regs[index_reg] << scale; - } break; case 5: case 13: |