Commit aa97bb48 authored by Avi Kivity's avatar Avi Kivity

KVM: x86 emulator: implement movdqu instruction (f3 0f 6f, f3 0f 7f)

Signed-off-by: default avatarAvi Kivity <avi@redhat.com>
parent 1253791d
...@@ -2415,11 +2415,19 @@ static int em_mov(struct x86_emulate_ctxt *ctxt) ...@@ -2415,11 +2415,19 @@ static int em_mov(struct x86_emulate_ctxt *ctxt)
return X86EMUL_CONTINUE; return X86EMUL_CONTINUE;
} }
static int em_movdqu(struct x86_emulate_ctxt *ctxt)
{
struct decode_cache *c = &ctxt->decode;
memcpy(&c->dst.vec_val, &c->src.vec_val, c->op_bytes);
return X86EMUL_CONTINUE;
}
#define D(_y) { .flags = (_y) } #define D(_y) { .flags = (_y) }
#define N D(0) #define N D(0)
#define G(_f, _g) { .flags = ((_f) | Group), .u.group = (_g) } #define G(_f, _g) { .flags = ((_f) | Group), .u.group = (_g) }
#define GD(_f, _g) { .flags = ((_f) | Group | GroupDual), .u.gdual = (_g) } #define GD(_f, _g) { .flags = ((_f) | Group | GroupDual), .u.gdual = (_g) }
#define I(_f, _e) { .flags = (_f), .u.execute = (_e) } #define I(_f, _e) { .flags = (_f), .u.execute = (_e) }
#define GP(_f, _g) { .flags = ((_f) | Prefix), .u.gprefix = (_g) }
#define D2bv(_f) D((_f) | ByteOp), D(_f) #define D2bv(_f) D((_f) | ByteOp), D(_f)
#define I2bv(_f, _e) I((_f) | ByteOp, _e), I(_f, _e) #define I2bv(_f, _e) I((_f) | ByteOp, _e), I(_f, _e)
...@@ -2484,6 +2492,10 @@ static struct opcode group11[] = { ...@@ -2484,6 +2492,10 @@ static struct opcode group11[] = {
I(DstMem | SrcImm | ModRM | Mov, em_mov), X7(D(Undefined)), I(DstMem | SrcImm | ModRM | Mov, em_mov), X7(D(Undefined)),
}; };
static struct gprefix pfx_0f_6f_0f_7f = {
N, N, N, I(Sse, em_movdqu),
};
static struct opcode opcode_table[256] = { static struct opcode opcode_table[256] = {
/* 0x00 - 0x07 */ /* 0x00 - 0x07 */
D6ALU(Lock), D6ALU(Lock),
...@@ -2608,9 +2620,15 @@ static struct opcode twobyte_table[256] = { ...@@ -2608,9 +2620,15 @@ static struct opcode twobyte_table[256] = {
/* 0x50 - 0x5F */ /* 0x50 - 0x5F */
N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N,
/* 0x60 - 0x6F */ /* 0x60 - 0x6F */
N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N,
N, N, N, N,
N, N, N, N,
N, N, N, GP(SrcMem | DstReg | ModRM | Mov, &pfx_0f_6f_0f_7f),
/* 0x70 - 0x7F */ /* 0x70 - 0x7F */
N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N,
N, N, N, N,
N, N, N, N,
N, N, N, GP(SrcReg | DstMem | ModRM | Mov, &pfx_0f_6f_0f_7f),
/* 0x80 - 0x8F */ /* 0x80 - 0x8F */
X16(D(SrcImm)), X16(D(SrcImm)),
/* 0x90 - 0x9F */ /* 0x90 - 0x9F */
...@@ -2654,6 +2672,7 @@ static struct opcode twobyte_table[256] = { ...@@ -2654,6 +2672,7 @@ static struct opcode twobyte_table[256] = {
#undef G #undef G
#undef GD #undef GD
#undef I #undef I
#undef GP
#undef D2bv #undef D2bv
#undef I2bv #undef I2bv
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment