Skip to content

Commit

Permalink
KVM: x86 emulator: Move ModRM flags for groups to top level opcode ta…
Browse files Browse the repository at this point in the history
…bles

Needed for the following patch which simplifies ModRM fetching code.

Signed-off-by: Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp>
Signed-off-by: Avi Kivity <avi@redhat.com>
  • Loading branch information
Takuya Yoshikawa authored and Avi Kivity committed May 6, 2012
1 parent 9b72d3b commit 1c2545b
Showing 1 changed file with 56 additions and 55 deletions.
111 changes: 56 additions & 55 deletions arch/x86/kvm/emulate.c
Original file line number Diff line number Diff line change
Expand Up @@ -3359,8 +3359,8 @@ static int check_perm_out(struct x86_emulate_ctxt *ctxt)
.check_perm = (_p) }
#define N D(0)
#define EXT(_f, _e) { .flags = ((_f) | RMExt), .u.group = (_e) }
#define G(_f, _g) { .flags = ((_f) | Group), .u.group = (_g) }
#define GD(_f, _g) { .flags = ((_f) | GroupDual), .u.gdual = (_g) }
#define G(_f, _g) { .flags = ((_f) | Group | ModRM), .u.group = (_g) }
#define GD(_f, _g) { .flags = ((_f) | GroupDual | ModRM), .u.gdual = (_g) }
#define I(_f, _e) { .flags = (_f), .u.execute = (_e) }
#define II(_f, _e, _i) \
{ .flags = (_f), .u.execute = (_e), .intercept = x86_intercept_##_i }
Expand All @@ -3380,25 +3380,25 @@ static int check_perm_out(struct x86_emulate_ctxt *ctxt)
I2bv(((_f) & ~Lock) | DstAcc | SrcImm, _e)

static struct opcode group7_rm1[] = {
DI(SrcNone | ModRM | Priv, monitor),
DI(SrcNone | ModRM | Priv, mwait),
DI(SrcNone | Priv, monitor),
DI(SrcNone | Priv, mwait),
N, N, N, N, N, N,
};

static struct opcode group7_rm3[] = {
DIP(SrcNone | ModRM | Prot | Priv, vmrun, check_svme_pa),
II(SrcNone | ModRM | Prot | VendorSpecific, em_vmmcall, vmmcall),
DIP(SrcNone | ModRM | Prot | Priv, vmload, check_svme_pa),
DIP(SrcNone | ModRM | Prot | Priv, vmsave, check_svme_pa),
DIP(SrcNone | ModRM | Prot | Priv, stgi, check_svme),
DIP(SrcNone | ModRM | Prot | Priv, clgi, check_svme),
DIP(SrcNone | ModRM | Prot | Priv, skinit, check_svme),
DIP(SrcNone | ModRM | Prot | Priv, invlpga, check_svme),
DIP(SrcNone | Prot | Priv, vmrun, check_svme_pa),
II(SrcNone | Prot | VendorSpecific, em_vmmcall, vmmcall),
DIP(SrcNone | Prot | Priv, vmload, check_svme_pa),
DIP(SrcNone | Prot | Priv, vmsave, check_svme_pa),
DIP(SrcNone | Prot | Priv, stgi, check_svme),
DIP(SrcNone | Prot | Priv, clgi, check_svme),
DIP(SrcNone | Prot | Priv, skinit, check_svme),
DIP(SrcNone | Prot | Priv, invlpga, check_svme),
};

static struct opcode group7_rm7[] = {
N,
DIP(SrcNone | ModRM, rdtscp, check_rdtsc),
DIP(SrcNone, rdtscp, check_rdtsc),
N, N, N, N, N, N,
};

Expand All @@ -3414,76 +3414,77 @@ static struct opcode group1[] = {
};

static struct opcode group1A[] = {
I(DstMem | SrcNone | ModRM | Mov | Stack, em_pop), N, N, N, N, N, N, N,
I(DstMem | SrcNone | Mov | Stack, em_pop), N, N, N, N, N, N, N,
};

static struct opcode group3[] = {
I(DstMem | SrcImm | ModRM, em_test),
I(DstMem | SrcImm | ModRM, em_test),
I(DstMem | SrcNone | ModRM | Lock, em_not),
I(DstMem | SrcNone | ModRM | Lock, em_neg),
I(SrcMem | ModRM, em_mul_ex),
I(SrcMem | ModRM, em_imul_ex),
I(SrcMem | ModRM, em_div_ex),
I(SrcMem | ModRM, em_idiv_ex),
I(DstMem | SrcImm, em_test),
I(DstMem | SrcImm, em_test),
I(DstMem | SrcNone | Lock, em_not),
I(DstMem | SrcNone | Lock, em_neg),
I(SrcMem, em_mul_ex),
I(SrcMem, em_imul_ex),
I(SrcMem, em_div_ex),
I(SrcMem, em_idiv_ex),
};

static struct opcode group4[] = {
I(ByteOp | DstMem | SrcNone | ModRM | Lock, em_grp45),
I(ByteOp | DstMem | SrcNone | ModRM | Lock, em_grp45),
I(ByteOp | DstMem | SrcNone | Lock, em_grp45),
I(ByteOp | DstMem | SrcNone | Lock, em_grp45),
N, N, N, N, N, N,
};

static struct opcode group5[] = {
I(DstMem | SrcNone | ModRM | Lock, em_grp45),
I(DstMem | SrcNone | ModRM | Lock, em_grp45),
I(SrcMem | ModRM | Stack, em_grp45),
I(SrcMemFAddr | ModRM | ImplicitOps | Stack, em_call_far),
I(SrcMem | ModRM | Stack, em_grp45),
I(SrcMemFAddr | ModRM | ImplicitOps, em_grp45),
I(SrcMem | ModRM | Stack, em_grp45), N,
I(DstMem | SrcNone | Lock, em_grp45),
I(DstMem | SrcNone | Lock, em_grp45),
I(SrcMem | Stack, em_grp45),
I(SrcMemFAddr | ImplicitOps | Stack, em_call_far),
I(SrcMem | Stack, em_grp45),
I(SrcMemFAddr | ImplicitOps, em_grp45),
I(SrcMem | Stack, em_grp45), N,
};

static struct opcode group6[] = {
DI(ModRM | Prot, sldt),
DI(ModRM | Prot, str),
DI(ModRM | Prot | Priv, lldt),
DI(ModRM | Prot | Priv, ltr),
DI(Prot, sldt),
DI(Prot, str),
DI(Prot | Priv, lldt),
DI(Prot | Priv, ltr),
N, N, N, N,
};

static struct group_dual group7 = { {
DI(ModRM | Mov | DstMem | Priv, sgdt),
DI(ModRM | Mov | DstMem | Priv, sidt),
II(ModRM | SrcMem | Priv, em_lgdt, lgdt),
II(ModRM | SrcMem | Priv, em_lidt, lidt),
II(SrcNone | ModRM | DstMem | Mov, em_smsw, smsw), N,
II(SrcMem16 | ModRM | Mov | Priv, em_lmsw, lmsw),
II(SrcMem | ModRM | ByteOp | Priv | NoAccess, em_invlpg, invlpg),
DI(Mov | DstMem | Priv, sgdt),
DI(Mov | DstMem | Priv, sidt),
II(SrcMem | Priv, em_lgdt, lgdt),
II(SrcMem | Priv, em_lidt, lidt),
II(SrcNone | DstMem | Mov, em_smsw, smsw), N,
II(SrcMem16 | Mov | Priv, em_lmsw, lmsw),
II(SrcMem | ByteOp | Priv | NoAccess, em_invlpg, invlpg),
}, {
I(SrcNone | ModRM | Priv | VendorSpecific, em_vmcall),
I(SrcNone | Priv | VendorSpecific, em_vmcall),
EXT(0, group7_rm1),
N, EXT(0, group7_rm3),
II(SrcNone | ModRM | DstMem | Mov, em_smsw, smsw), N,
II(SrcMem16 | ModRM | Mov | Priv, em_lmsw, lmsw), EXT(0, group7_rm7),
II(SrcNone | DstMem | Mov, em_smsw, smsw), N,
II(SrcMem16 | Mov | Priv, em_lmsw, lmsw),
EXT(0, group7_rm7),
} };

static struct opcode group8[] = {
N, N, N, N,
I(DstMem | SrcImmByte | ModRM, em_bt),
I(DstMem | SrcImmByte | ModRM | Lock | PageTable, em_bts),
I(DstMem | SrcImmByte | ModRM | Lock, em_btr),
I(DstMem | SrcImmByte | ModRM | Lock | PageTable, em_btc),
I(DstMem | SrcImmByte, em_bt),
I(DstMem | SrcImmByte | Lock | PageTable, em_bts),
I(DstMem | SrcImmByte | Lock, em_btr),
I(DstMem | SrcImmByte | Lock | PageTable, em_btc),
};

static struct group_dual group9 = { {
N, I(DstMem64 | ModRM | Lock | PageTable, em_cmpxchg8b), N, N, N, N, N, N,
N, I(DstMem64 | Lock | PageTable, em_cmpxchg8b), N, N, N, N, N, N,
}, {
N, N, N, N, N, N, N, N,
} };

static struct opcode group11[] = {
I(DstMem | SrcImm | ModRM | Mov | PageTable, em_mov),
I(DstMem | SrcImm | Mov | PageTable, em_mov),
X7(D(Undefined)),
};

Expand Down Expand Up @@ -3541,10 +3542,10 @@ static struct opcode opcode_table[256] = {
/* 0x70 - 0x7F */
X16(D(SrcImmByte)),
/* 0x80 - 0x87 */
G(ByteOp | DstMem | SrcImm | ModRM | Group, group1),
G(DstMem | SrcImm | ModRM | Group, group1),
G(ByteOp | DstMem | SrcImm | ModRM | No64 | Group, group1),
G(DstMem | SrcImmByte | ModRM | Group, group1),
G(ByteOp | DstMem | SrcImm, group1),
G(DstMem | SrcImm, group1),
G(ByteOp | DstMem | SrcImm | No64, group1),
G(DstMem | SrcImmByte, group1),
I2bv(DstMem | SrcReg | ModRM, em_test),
I2bv(DstMem | SrcReg | ModRM | Lock | PageTable, em_xchg),
/* 0x88 - 0x8F */
Expand Down

0 comments on commit 1c2545b

Please sign in to comment.