diff options
author | Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp> | 2011-07-30 05:01:26 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2011-09-25 12:17:59 -0400 |
commit | e85a10852c26d7d509ad17bac1a0d5264224b2d2 (patch) | |
tree | 34e4893940b0b6448f6b255f68e9b21842dcf9d2 /arch | |
parent | 807941b121cf77e70eec8db308b8c1f496cc79e9 (diff) |
KVM: x86 emulator: Drop _size argument from insn_fetch()
_type is enough to know the size.
Signed-off-by: Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp>
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/kvm/emulate.c | 44 |
1 files changed, 22 insertions, 22 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index ce48dc4e6ed0..d4cc8af67d95 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c | |||
@@ -702,9 +702,9 @@ static int do_insn_fetch(struct x86_emulate_ctxt *ctxt, | |||
702 | } | 702 | } |
703 | 703 | ||
704 | /* Fetch next part of the instruction being emulated. */ | 704 | /* Fetch next part of the instruction being emulated. */ |
705 | #define insn_fetch(_type, _size, _ctxt) \ | 705 | #define insn_fetch(_type, _ctxt) \ |
706 | ({ unsigned long _x; \ | 706 | ({ unsigned long _x; \ |
707 | rc = do_insn_fetch(_ctxt, &_x, (_size)); \ | 707 | rc = do_insn_fetch(_ctxt, &_x, sizeof(_type)); \ |
708 | if (rc != X86EMUL_CONTINUE) \ | 708 | if (rc != X86EMUL_CONTINUE) \ |
709 | goto done; \ | 709 | goto done; \ |
710 | (_type)_x; \ | 710 | (_type)_x; \ |
@@ -901,7 +901,7 @@ static int decode_modrm(struct x86_emulate_ctxt *ctxt, | |||
901 | ctxt->modrm_rm = base_reg = (ctxt->rex_prefix & 1) << 3; /* REG.B */ | 901 | ctxt->modrm_rm = base_reg = (ctxt->rex_prefix & 1) << 3; /* REG.B */ |
902 | } | 902 | } |
903 | 903 | ||
904 | ctxt->modrm = insn_fetch(u8, 1, ctxt); | 904 | ctxt->modrm = insn_fetch(u8, ctxt); |
905 | ctxt->modrm_mod |= (ctxt->modrm & 0xc0) >> 6; | 905 | ctxt->modrm_mod |= (ctxt->modrm & 0xc0) >> 6; |
906 | ctxt->modrm_reg |= (ctxt->modrm & 0x38) >> 3; | 906 | ctxt->modrm_reg |= (ctxt->modrm & 0x38) >> 3; |
907 | ctxt->modrm_rm |= (ctxt->modrm & 0x07); | 907 | ctxt->modrm_rm |= (ctxt->modrm & 0x07); |
@@ -935,13 +935,13 @@ static int decode_modrm(struct x86_emulate_ctxt *ctxt, | |||
935 | switch (ctxt->modrm_mod) { | 935 | switch (ctxt->modrm_mod) { |
936 | case 0: | 936 | case 0: |
937 | if (ctxt->modrm_rm == 6) | 937 | if (ctxt->modrm_rm == 6) |
938 | modrm_ea += insn_fetch(u16, 2, ctxt); | 938 | modrm_ea += insn_fetch(u16, ctxt); |
939 | break; | 939 | break; |
940 | case 1: | 940 | case 1: |
941 | modrm_ea += insn_fetch(s8, 1, ctxt); | 941 | modrm_ea += insn_fetch(s8, ctxt); |
942 | break; | 942 | break; |
943 | case 2: | 943 | case 2: |
944 | modrm_ea += insn_fetch(u16, 2, ctxt); | 944 | modrm_ea += insn_fetch(u16, ctxt); |
945 | break; | 945 | break; |
946 | } | 946 | } |
947 | switch (ctxt->modrm_rm) { | 947 | switch (ctxt->modrm_rm) { |
@@ -978,13 +978,13 @@ static int decode_modrm(struct x86_emulate_ctxt *ctxt, | |||
978 | } else { | 978 | } else { |
979 | /* 32/64-bit ModR/M decode. */ | 979 | /* 32/64-bit ModR/M decode. */ |
980 | if ((ctxt->modrm_rm & 7) == 4) { | 980 | if ((ctxt->modrm_rm & 7) == 4) { |
981 | sib = insn_fetch(u8, 1, ctxt); | 981 | sib = insn_fetch(u8, ctxt); |
982 | index_reg |= (sib >> 3) & 7; | 982 | index_reg |= (sib >> 3) & 7; |
983 | base_reg |= sib & 7; | 983 | base_reg |= sib & 7; |
984 | scale = sib >> 6; | 984 | scale = sib >> 6; |
985 | 985 | ||
986 | if ((base_reg & 7) == 5 && ctxt->modrm_mod == 0) | 986 | if ((base_reg & 7) == 5 && ctxt->modrm_mod == 0) |
987 | modrm_ea += insn_fetch(s32, 4, ctxt); | 987 | modrm_ea += insn_fetch(s32, ctxt); |
988 | else | 988 | else |
989 | modrm_ea += ctxt->regs[base_reg]; | 989 | modrm_ea += ctxt->regs[base_reg]; |
990 | if (index_reg != 4) | 990 | if (index_reg != 4) |
@@ -997,13 +997,13 @@ static int decode_modrm(struct x86_emulate_ctxt *ctxt, | |||
997 | switch (ctxt->modrm_mod) { | 997 | switch (ctxt->modrm_mod) { |
998 | case 0: | 998 | case 0: |
999 | if (ctxt->modrm_rm == 5) | 999 | if (ctxt->modrm_rm == 5) |
1000 | modrm_ea += insn_fetch(s32, 4, ctxt); | 1000 | modrm_ea += insn_fetch(s32, ctxt); |
1001 | break; | 1001 | break; |
1002 | case 1: | 1002 | case 1: |
1003 | modrm_ea += insn_fetch(s8, 1, ctxt); | 1003 | modrm_ea += insn_fetch(s8, ctxt); |
1004 | break; | 1004 | break; |
1005 | case 2: | 1005 | case 2: |
1006 | modrm_ea += insn_fetch(s32, 4, ctxt); | 1006 | modrm_ea += insn_fetch(s32, ctxt); |
1007 | break; | 1007 | break; |
1008 | } | 1008 | } |
1009 | } | 1009 | } |
@@ -1020,13 +1020,13 @@ static int decode_abs(struct x86_emulate_ctxt *ctxt, | |||
1020 | op->type = OP_MEM; | 1020 | op->type = OP_MEM; |
1021 | switch (ctxt->ad_bytes) { | 1021 | switch (ctxt->ad_bytes) { |
1022 | case 2: | 1022 | case 2: |
1023 | op->addr.mem.ea = insn_fetch(u16, 2, ctxt); | 1023 | op->addr.mem.ea = insn_fetch(u16, ctxt); |
1024 | break; | 1024 | break; |
1025 | case 4: | 1025 | case 4: |
1026 | op->addr.mem.ea = insn_fetch(u32, 4, ctxt); | 1026 | op->addr.mem.ea = insn_fetch(u32, ctxt); |
1027 | break; | 1027 | break; |
1028 | case 8: | 1028 | case 8: |
1029 | op->addr.mem.ea = insn_fetch(u64, 8, ctxt); | 1029 | op->addr.mem.ea = insn_fetch(u64, ctxt); |
1030 | break; | 1030 | break; |
1031 | } | 1031 | } |
1032 | done: | 1032 | done: |
@@ -3316,13 +3316,13 @@ static int decode_imm(struct x86_emulate_ctxt *ctxt, struct operand *op, | |||
3316 | /* NB. Immediates are sign-extended as necessary. */ | 3316 | /* NB. Immediates are sign-extended as necessary. */ |
3317 | switch (op->bytes) { | 3317 | switch (op->bytes) { |
3318 | case 1: | 3318 | case 1: |
3319 | op->val = insn_fetch(s8, 1, ctxt); | 3319 | op->val = insn_fetch(s8, ctxt); |
3320 | break; | 3320 | break; |
3321 | case 2: | 3321 | case 2: |
3322 | op->val = insn_fetch(s16, 2, ctxt); | 3322 | op->val = insn_fetch(s16, ctxt); |
3323 | break; | 3323 | break; |
3324 | case 4: | 3324 | case 4: |
3325 | op->val = insn_fetch(s32, 4, ctxt); | 3325 | op->val = insn_fetch(s32, ctxt); |
3326 | break; | 3326 | break; |
3327 | } | 3327 | } |
3328 | if (!sign_extension) { | 3328 | if (!sign_extension) { |
@@ -3381,7 +3381,7 @@ int x86_decode_insn(struct x86_emulate_ctxt *ctxt, void *insn, int insn_len) | |||
3381 | 3381 | ||
3382 | /* Legacy prefixes. */ | 3382 | /* Legacy prefixes. */ |
3383 | for (;;) { | 3383 | for (;;) { |
3384 | switch (ctxt->b = insn_fetch(u8, 1, ctxt)) { | 3384 | switch (ctxt->b = insn_fetch(u8, ctxt)) { |
3385 | case 0x66: /* operand-size override */ | 3385 | case 0x66: /* operand-size override */ |
3386 | op_prefix = true; | 3386 | op_prefix = true; |
3387 | /* switch between 2/4 bytes */ | 3387 | /* switch between 2/4 bytes */ |
@@ -3437,7 +3437,7 @@ done_prefixes: | |||
3437 | /* Two-byte opcode? */ | 3437 | /* Two-byte opcode? */ |
3438 | if (ctxt->b == 0x0f) { | 3438 | if (ctxt->b == 0x0f) { |
3439 | ctxt->twobyte = 1; | 3439 | ctxt->twobyte = 1; |
3440 | ctxt->b = insn_fetch(u8, 1, ctxt); | 3440 | ctxt->b = insn_fetch(u8, ctxt); |
3441 | opcode = twobyte_table[ctxt->b]; | 3441 | opcode = twobyte_table[ctxt->b]; |
3442 | } | 3442 | } |
3443 | ctxt->d = opcode.flags; | 3443 | ctxt->d = opcode.flags; |
@@ -3445,13 +3445,13 @@ done_prefixes: | |||
3445 | while (ctxt->d & GroupMask) { | 3445 | while (ctxt->d & GroupMask) { |
3446 | switch (ctxt->d & GroupMask) { | 3446 | switch (ctxt->d & GroupMask) { |
3447 | case Group: | 3447 | case Group: |
3448 | ctxt->modrm = insn_fetch(u8, 1, ctxt); | 3448 | ctxt->modrm = insn_fetch(u8, ctxt); |
3449 | --ctxt->_eip; | 3449 | --ctxt->_eip; |
3450 | goffset = (ctxt->modrm >> 3) & 7; | 3450 | goffset = (ctxt->modrm >> 3) & 7; |
3451 | opcode = opcode.u.group[goffset]; | 3451 | opcode = opcode.u.group[goffset]; |
3452 | break; | 3452 | break; |
3453 | case GroupDual: | 3453 | case GroupDual: |
3454 | ctxt->modrm = insn_fetch(u8, 1, ctxt); | 3454 | ctxt->modrm = insn_fetch(u8, ctxt); |
3455 | --ctxt->_eip; | 3455 | --ctxt->_eip; |
3456 | goffset = (ctxt->modrm >> 3) & 7; | 3456 | goffset = (ctxt->modrm >> 3) & 7; |
3457 | if ((ctxt->modrm >> 6) == 3) | 3457 | if ((ctxt->modrm >> 6) == 3) |
@@ -3637,7 +3637,7 @@ done_prefixes: | |||
3637 | ctxt->dst.type = OP_IMM; | 3637 | ctxt->dst.type = OP_IMM; |
3638 | ctxt->dst.addr.mem.ea = ctxt->_eip; | 3638 | ctxt->dst.addr.mem.ea = ctxt->_eip; |
3639 | ctxt->dst.bytes = 1; | 3639 | ctxt->dst.bytes = 1; |
3640 | ctxt->dst.val = insn_fetch(u8, 1, ctxt); | 3640 | ctxt->dst.val = insn_fetch(u8, ctxt); |
3641 | break; | 3641 | break; |
3642 | case DstMem: | 3642 | case DstMem: |
3643 | case DstMem64: | 3643 | case DstMem64: |