diff options
author | Avi Kivity <avi@redhat.com> | 2012-06-13 05:25:06 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2012-07-09 07:19:04 -0400 |
commit | 9299836e6379d5703826a540fb3c704223fac520 (patch) | |
tree | d32fa89b033a17b5153fb2f95f15c79827ace5ac | |
parent | de5f70e0c65fcd0472a412a7a9690afcd3ee4526 (diff) |
KVM: x86 emulator: emulate BSWAP
Opcodes 0F C8 - 0F CF.
Used by the SeaBIOS cdrom code (though not in big real mode).
Signed-off-by: Avi Kivity <avi@redhat.com>
-rw-r--r-- | arch/x86/kvm/emulate.c | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index b4b326ebc835..cfa5cc30c1d9 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c | |||
@@ -3264,6 +3264,21 @@ static int em_lahf(struct x86_emulate_ctxt *ctxt) | |||
3264 | return X86EMUL_CONTINUE; | 3264 | return X86EMUL_CONTINUE; |
3265 | } | 3265 | } |
3266 | 3266 | ||
3267 | static int em_bswap(struct x86_emulate_ctxt *ctxt) | ||
3268 | { | ||
3269 | switch (ctxt->op_bytes) { | ||
3270 | #ifdef CONFIG_X86_64 | ||
3271 | case 8: | ||
3272 | asm("bswap %0" : "+r"(ctxt->dst.val)); | ||
3273 | break; | ||
3274 | #endif | ||
3275 | default: | ||
3276 | asm("bswap %0" : "+r"(*(u32 *)&ctxt->dst.val)); | ||
3277 | break; | ||
3278 | } | ||
3279 | return X86EMUL_CONTINUE; | ||
3280 | } | ||
3281 | |||
3267 | static bool valid_cr(int nr) | 3282 | static bool valid_cr(int nr) |
3268 | { | 3283 | { |
3269 | switch (nr) { | 3284 | switch (nr) { |
@@ -3780,11 +3795,12 @@ static struct opcode twobyte_table[256] = { | |||
3780 | I(DstMem | SrcReg | ModRM | BitOp | Lock | PageTable, em_btc), | 3795 | I(DstMem | SrcReg | ModRM | BitOp | Lock | PageTable, em_btc), |
3781 | I(DstReg | SrcMem | ModRM, em_bsf), I(DstReg | SrcMem | ModRM, em_bsr), | 3796 | I(DstReg | SrcMem | ModRM, em_bsf), I(DstReg | SrcMem | ModRM, em_bsr), |
3782 | D(DstReg | SrcMem8 | ModRM | Mov), D(DstReg | SrcMem16 | ModRM | Mov), | 3797 | D(DstReg | SrcMem8 | ModRM | Mov), D(DstReg | SrcMem16 | ModRM | Mov), |
3783 | /* 0xC0 - 0xCF */ | 3798 | /* 0xC0 - 0xC7 */ |
3784 | D2bv(DstMem | SrcReg | ModRM | Lock), | 3799 | D2bv(DstMem | SrcReg | ModRM | Lock), |
3785 | N, D(DstMem | SrcReg | ModRM | Mov), | 3800 | N, D(DstMem | SrcReg | ModRM | Mov), |
3786 | N, N, N, GD(0, &group9), | 3801 | N, N, N, GD(0, &group9), |
3787 | N, N, N, N, N, N, N, N, | 3802 | /* 0xC8 - 0xCF */ |
3803 | X8(I(DstReg, em_bswap)), | ||
3788 | /* 0xD0 - 0xDF */ | 3804 | /* 0xD0 - 0xDF */ |
3789 | N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, | 3805 | N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, |
3790 | /* 0xE0 - 0xEF */ | 3806 | /* 0xE0 - 0xEF */ |