Skip to content

Commit c27e250

Browse files
KaigeFulijinxia
authored andcommitted
HV: instr_emul: Move op_byte from vie_op to instr_emul_vie
one/two_byte_opcodes is indexed by op_byte. So vie_op->op_byte is unnecessary. This patch remove it and add a new variable opcode to instr_emul_vie. Signed-off-by: Kaige Fu <kaige.fu@intel.com> Acked-by: Anthony Xu <anthony.xu@intel.com>
1 parent baf055e commit c27e250

File tree

2 files changed

+13
-42
lines changed

2 files changed

+13
-42
lines changed

hypervisor/arch/x86/guest/instr_emul.c

Lines changed: 12 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -60,144 +60,114 @@
6060

6161
static const struct instr_emul_vie_op two_byte_opcodes[256] = {
6262
[0xB6] = {
63-
.op_byte = 0xB6,
6463
.op_type = VIE_OP_TYPE_MOVZX,
6564
},
6665
[0xB7] = {
67-
.op_byte = 0xB7,
6866
.op_type = VIE_OP_TYPE_MOVZX,
6967
},
7068
[0xBA] = {
71-
.op_byte = 0xBA,
7269
.op_type = VIE_OP_TYPE_BITTEST,
7370
.op_flags = VIE_OP_F_IMM8,
7471
},
7572
[0xBE] = {
76-
.op_byte = 0xBE,
7773
.op_type = VIE_OP_TYPE_MOVSX,
7874
},
7975
};
8076

8177
static const struct instr_emul_vie_op one_byte_opcodes[256] = {
8278
[0x0F] = {
83-
.op_byte = 0x0FU,
8479
.op_type = VIE_OP_TYPE_TWO_BYTE
8580
},
8681
[0x2B] = {
87-
.op_byte = 0x2BU,
8882
.op_type = VIE_OP_TYPE_SUB,
8983
},
9084
[0x39] = {
91-
.op_byte = 0x39U,
9285
.op_type = VIE_OP_TYPE_CMP,
9386
},
9487
[0x3B] = {
95-
.op_byte = 0x3BU,
9688
.op_type = VIE_OP_TYPE_CMP,
9789
},
9890
[0x88] = {
99-
.op_byte = 0x88U,
10091
.op_type = VIE_OP_TYPE_MOV,
10192
},
10293
[0x89] = {
103-
.op_byte = 0x89U,
10494
.op_type = VIE_OP_TYPE_MOV,
10595
},
10696
[0x8A] = {
107-
.op_byte = 0x8AU,
10897
.op_type = VIE_OP_TYPE_MOV,
10998
},
11099
[0x8B] = {
111-
.op_byte = 0x8BU,
112100
.op_type = VIE_OP_TYPE_MOV,
113101
},
114102
[0xA1] = {
115-
.op_byte = 0xA1U,
116103
.op_type = VIE_OP_TYPE_MOV,
117104
.op_flags = VIE_OP_F_MOFFSET | VIE_OP_F_NO_MODRM,
118105
},
119106
[0xA3] = {
120-
.op_byte = 0xA3U,
121107
.op_type = VIE_OP_TYPE_MOV,
122108
.op_flags = VIE_OP_F_MOFFSET | VIE_OP_F_NO_MODRM,
123109
},
124110
[0xA4] = {
125-
.op_byte = 0xA4U,
126111
.op_type = VIE_OP_TYPE_MOVS,
127112
.op_flags = VIE_OP_F_NO_MODRM | VIE_OP_F_NO_GLA_VERIFICATION
128113
},
129114
[0xA5] = {
130-
.op_byte = 0xA5U,
131115
.op_type = VIE_OP_TYPE_MOVS,
132116
.op_flags = VIE_OP_F_NO_MODRM | VIE_OP_F_NO_GLA_VERIFICATION
133117
},
134118
[0xAA] = {
135-
.op_byte = 0xAAU,
136119
.op_type = VIE_OP_TYPE_STOS,
137120
.op_flags = VIE_OP_F_NO_MODRM | VIE_OP_F_NO_GLA_VERIFICATION
138121
},
139122
[0xAB] = {
140-
.op_byte = 0xABU,
141123
.op_type = VIE_OP_TYPE_STOS,
142124
.op_flags = VIE_OP_F_NO_MODRM | VIE_OP_F_NO_GLA_VERIFICATION
143125
},
144126
[0xC6] = {
145127
/* XXX Group 11 extended opcode - not just MOV */
146-
.op_byte = 0xC6U,
147128
.op_type = VIE_OP_TYPE_MOV,
148129
.op_flags = VIE_OP_F_IMM8,
149130
},
150131
[0xC7] = {
151-
.op_byte = 0xC7U,
152132
.op_type = VIE_OP_TYPE_MOV,
153133
.op_flags = VIE_OP_F_IMM,
154134
},
155135
[0x23] = {
156-
.op_byte = 0x23U,
157136
.op_type = VIE_OP_TYPE_AND,
158137
},
159138
[0x80] = {
160139
/* Group 1 extended opcode */
161-
.op_byte = 0x80U,
162140
.op_type = VIE_OP_TYPE_GROUP1,
163141
.op_flags = VIE_OP_F_IMM8,
164142
},
165143
[0x81] = {
166144
/* Group 1 extended opcode */
167-
.op_byte = 0x81U,
168145
.op_type = VIE_OP_TYPE_GROUP1,
169146
.op_flags = VIE_OP_F_IMM,
170147
},
171148
[0x83] = {
172149
/* Group 1 extended opcode */
173-
.op_byte = 0x83U,
174150
.op_type = VIE_OP_TYPE_GROUP1,
175151
.op_flags = VIE_OP_F_IMM8,
176152
},
177153
[0x84] = {
178-
.op_byte = 0x84U,
179154
.op_type = VIE_OP_TYPE_TEST,
180155
},
181156
[0x85] = {
182-
.op_byte = 0x85U,
183157
.op_type = VIE_OP_TYPE_TEST,
184158
},
185159
[0x08] = {
186-
.op_byte = 0x08U,
187160
.op_type = VIE_OP_TYPE_OR,
188161
},
189162
[0x09] = {
190-
.op_byte = 0x09U,
191163
.op_type = VIE_OP_TYPE_OR,
192164
},
193165
[0x8F] = {
194166
/* XXX Group 1A extended opcode - not just POP */
195-
.op_byte = 0x8FU,
196167
.op_type = VIE_OP_TYPE_POP,
197168
},
198169
[0xFF] = {
199170
/* XXX Group 5 extended opcode - not just PUSH */
200-
.op_byte = 0xFFU,
201171
.op_type = VIE_OP_TYPE_PUSH,
202172
}
203173
};
@@ -398,7 +368,7 @@ emulate_mov(struct vcpu *vcpu, uint64_t gpa, struct instr_emul_vie *vie,
398368

399369
size = vie->opsize;
400370
error = -EINVAL;
401-
switch (vie->op.op_byte) {
371+
switch (vie->opcode) {
402372
case 0x88U:
403373
/*
404374
* MOV byte from reg (ModRM:reg) to mem (ModRM:r/m)
@@ -524,7 +494,7 @@ emulate_movx(struct vcpu *vcpu, uint64_t gpa, struct instr_emul_vie *vie,
524494
size = vie->opsize;
525495
error = -EINVAL;
526496

527-
switch (vie->op.op_byte) {
497+
switch (vie->opcode) {
528498
case 0xB6U:
529499
/*
530500
* MOV and zero extend byte from mem (ModRM:r/m) to
@@ -675,7 +645,7 @@ emulate_movs(struct vcpu *vcpu, __unused uint64_t gpa, struct instr_emul_vie *vi
675645
uint8_t opsize;
676646
enum cpu_reg_name seg;
677647

678-
opsize = (vie->op.op_byte == 0xA4U) ? 1U : vie->opsize;
648+
opsize = (vie->opcode == 0xA4U) ? 1U : vie->opsize;
679649
error = 0;
680650

681651
/*
@@ -762,7 +732,7 @@ emulate_stos(struct vcpu *vcpu, uint64_t gpa, struct instr_emul_vie *vie,
762732
uint64_t val;
763733
uint64_t rcx, rdi, rflags;
764734

765-
opsize = (vie->op.op_byte == 0xAAU) ? 1U : vie->opsize;
735+
opsize = (vie->opcode == 0xAAU) ? 1U : vie->opsize;
766736
repeat = vie->repz_present | vie->repnz_present;
767737

768738
if (repeat != 0) {
@@ -825,7 +795,7 @@ emulate_test(struct vcpu *vcpu, uint64_t gpa, struct instr_emul_vie *vie,
825795
size = vie->opsize;
826796
error = -EINVAL;
827797

828-
switch (vie->op.op_byte) {
798+
switch (vie->opcode) {
829799
case 0x84U:
830800
/*
831801
* 84/r test r8, r/m8
@@ -891,7 +861,7 @@ emulate_and(struct vcpu *vcpu, uint64_t gpa, struct instr_emul_vie *vie,
891861
size = vie->opsize;
892862
error = -EINVAL;
893863

894-
switch (vie->op.op_byte) {
864+
switch (vie->opcode) {
895865
case 0x23U:
896866
/*
897867
* AND reg (ModRM:reg) and mem (ModRM:r/m) and store the
@@ -980,7 +950,7 @@ emulate_or(struct vcpu *vcpu, uint64_t gpa, struct instr_emul_vie *vie,
980950
size = vie->opsize;
981951
error = -EINVAL;
982952

983-
switch (vie->op.op_byte) {
953+
switch (vie->opcode) {
984954
case 0x81U:
985955
case 0x83U:
986956
/*
@@ -1070,7 +1040,7 @@ emulate_cmp(struct vcpu *vcpu, uint64_t gpa, struct instr_emul_vie *vie,
10701040
enum cpu_reg_name reg;
10711041

10721042
size = vie->opsize;
1073-
switch (vie->op.op_byte) {
1043+
switch (vie->opcode) {
10741044
case 0x39U:
10751045
case 0x3BU:
10761046
/*
@@ -1101,7 +1071,7 @@ emulate_cmp(struct vcpu *vcpu, uint64_t gpa, struct instr_emul_vie *vie,
11011071
return error;
11021072
}
11031073

1104-
if (vie->op.op_byte == 0x3BU) {
1074+
if (vie->opcode == 0x3BU) {
11051075
op1 = regop;
11061076
op2 = memop;
11071077
} else {
@@ -1136,7 +1106,7 @@ emulate_cmp(struct vcpu *vcpu, uint64_t gpa, struct instr_emul_vie *vie,
11361106
* the status flags.
11371107
*
11381108
*/
1139-
if (vie->op.op_byte == 0x80U) {
1109+
if (vie->opcode == 0x80U) {
11401110
size = 1U;
11411111
}
11421112

@@ -1170,7 +1140,7 @@ emulate_sub(struct vcpu *vcpu, uint64_t gpa, struct instr_emul_vie *vie,
11701140
size = vie->opsize;
11711141
error = -EINVAL;
11721142

1173-
switch (vie->op.op_byte) {
1143+
switch (vie->opcode) {
11741144
case 0x2BU:
11751145
/*
11761146
* SUB r/m from r and store the result in r
@@ -1850,6 +1820,7 @@ decode_opcode(struct instr_emul_vie *vie)
18501820
return -1;
18511821
}
18521822

1823+
vie->opcode = x;
18531824
vie->op = one_byte_opcodes[x];
18541825

18551826
if (vie->op.op_type == VIE_OP_TYPE_NONE) {

hypervisor/arch/x86/guest/instr_emul_wrapper.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,6 @@ enum cpu_reg_name {
142142
#define CPU_REG_SEG_LAST CPU_REG_GS
143143

144144
struct instr_emul_vie_op {
145-
uint8_t op_byte; /* actual opcode byte */
146145
uint8_t op_type; /* type of operation (e.g. MOV) */
147146
uint16_t op_flags;
148147
};
@@ -186,6 +185,7 @@ struct instr_emul_vie {
186185

187186
uint8_t decoded; /* set to 1 if successfully decoded */
188187

188+
uint8_t opcode;
189189
struct instr_emul_vie_op op; /* opcode description */
190190
};
191191

0 commit comments

Comments
 (0)