diff options
author | Avi Kivity <avi@qumranet.com> | 2008-06-16 00:53:26 -0400 |
---|---|---|
committer | Avi Kivity <avi@qumranet.com> | 2008-07-20 05:42:33 -0400 |
commit | 84411d85dacdb6665578608c6a70fc8b819761a8 (patch) | |
tree | 9adcee7b8938b47f57fb964adb7d3939245f44fd /arch/x86/kvm/x86_emulate.c | |
parent | dc71d0f1620790ec8e54101ca37e7b31e31208a8 (diff) |
KVM: x86 emulator: simplify r/m decoding
Consolidate the duplicated code when not in any special case.
Signed-off-by: Avi Kivity <avi@qumranet.com>
Diffstat (limited to 'arch/x86/kvm/x86_emulate.c')
-rw-r--r-- | arch/x86/kvm/x86_emulate.c | 17 |
1 files changed, 4 insertions, 13 deletions
diff --git a/arch/x86/kvm/x86_emulate.c b/arch/x86/kvm/x86_emulate.c index ca7ab2469a4a..c3a823174f3e 100644 --- a/arch/x86/kvm/x86_emulate.c +++ b/arch/x86/kvm/x86_emulate.c | |||
@@ -740,9 +740,7 @@ static int decode_modrm(struct x86_emulate_ctxt *ctxt, | |||
740 | c->modrm_ea = (u16)c->modrm_ea; | 740 | c->modrm_ea = (u16)c->modrm_ea; |
741 | } else { | 741 | } else { |
742 | /* 32/64-bit ModR/M decode. */ | 742 | /* 32/64-bit ModR/M decode. */ |
743 | switch (c->modrm_rm) { | 743 | if ((c->modrm_rm & 7) == 4) { |
744 | case 4: | ||
745 | case 12: | ||
746 | sib = insn_fetch(u8, 1, c->eip); | 744 | sib = insn_fetch(u8, 1, c->eip); |
747 | index_reg |= (sib >> 3) & 7; | 745 | index_reg |= (sib >> 3) & 7; |
748 | base_reg |= sib & 7; | 746 | base_reg |= sib & 7; |
@@ -754,18 +752,11 @@ static int decode_modrm(struct x86_emulate_ctxt *ctxt, | |||
754 | c->modrm_ea += c->regs[base_reg]; | 752 | c->modrm_ea += c->regs[base_reg]; |
755 | if (index_reg != 4) | 753 | if (index_reg != 4) |
756 | c->modrm_ea += c->regs[index_reg] << scale; | 754 | c->modrm_ea += c->regs[index_reg] << scale; |
757 | break; | 755 | } else if ((c->modrm_rm & 7) == 5 && c->modrm_mod == 0) { |
758 | case 5: | 756 | if (ctxt->mode == X86EMUL_MODE_PROT64) |
759 | case 13: | ||
760 | if (c->modrm_mod != 0) | ||
761 | c->modrm_ea += c->regs[c->modrm_rm]; | ||
762 | else if (ctxt->mode == X86EMUL_MODE_PROT64) | ||
763 | rip_relative = 1; | 757 | rip_relative = 1; |
764 | break; | 758 | } else |
765 | default: | ||
766 | c->modrm_ea += c->regs[c->modrm_rm]; | 759 | c->modrm_ea += c->regs[c->modrm_rm]; |
767 | break; | ||
768 | } | ||
769 | switch (c->modrm_mod) { | 760 | switch (c->modrm_mod) { |
770 | case 0: | 761 | case 0: |
771 | if (c->modrm_rm == 5) | 762 | if (c->modrm_rm == 5) |