aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAvi Kivity <avi@redhat.com>2012-06-13 05:25:06 -0400
committerAvi Kivity <avi@redhat.com>2012-07-09 07:19:04 -0400
commit9299836e6379d5703826a540fb3c704223fac520 (patch)
treed32fa89b033a17b5153fb2f95f15c79827ace5ac
parentde5f70e0c65fcd0472a412a7a9690afcd3ee4526 (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.c20
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
3267static 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
3267static bool valid_cr(int nr) 3282static 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 */