Skip to content

Commit aee1931

Browse files
yonghuahlijinxia
authored andcommitted
HV: refine 'decode_instruction() function
update: 1. remove 'struct mem_io *'from input arguments 2. return 'opsize' instead of status. 3. rename 'vmm_decode_instruction()' Signed-off-by: Yonghua Huang <yonghua.huang@intel.com>
1 parent fcd7932 commit aee1931

File tree

5 files changed

+14
-25
lines changed

5 files changed

+14
-25
lines changed

hypervisor/arch/x86/ept.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -400,7 +400,8 @@ int ept_violation_vmexit_handler(struct vcpu *vcpu)
400400
*/
401401
mmio->paddr = gpa;
402402

403-
if (decode_instruction(vcpu, mmio) != 0)
403+
mmio->access_size = decode_instruction(vcpu);
404+
if (mmio->access_size == 0)
404405
goto out;
405406

406407
list_for_each(pos, &vcpu->vm->mmio_list) {

hypervisor/arch/x86/guest/instr_emul.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2107,7 +2107,7 @@ decode_moffset(struct vie *vie)
21072107
}
21082108

21092109
int
2110-
vmm_decode_instruction(__unused struct vcpu *vcpu, __unused uint64_t gla,
2110+
__decode_instruction(__unused struct vcpu *vcpu, __unused uint64_t gla,
21112111
enum vm_cpu_mode cpu_mode, int cs_d, struct vie *vie)
21122112
{
21132113
if (decode_prefixes(vie, cpu_mode, cs_d))

hypervisor/arch/x86/guest/instr_emul.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,10 @@ void vie_init(struct vie *vie, const char *inst_bytes, uint32_t inst_length);
8686
* in VIE_INVALID_GLA instead.
8787
*/
8888
#define VIE_INVALID_GLA (1UL << 63) /* a non-canonical address */
89-
int vmm_decode_instruction(struct vcpu *vcpu, uint64_t gla,
89+
int __decode_instruction(struct vcpu *vcpu, uint64_t gla,
9090
enum vm_cpu_mode cpu_mode, int csd, struct vie *vie);
9191

9292
int emulate_instruction(struct vcpu *vcpu, struct mem_io *mmio);
93-
int decode_instruction(struct vcpu *vcpu, struct mem_io *mmio);
93+
uint8_t decode_instruction(struct vcpu *vcpu);
9494

9595
#endif /* _VMM_INSTRUCTION_EMUL_H_ */

hypervisor/arch/x86/guest/instr_emul_wrapper.c

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -380,15 +380,14 @@ void vm_gva2gpa(struct vcpu *vcpu, uint64_t gva, uint64_t *gpa)
380380
vcpu->arch_vcpu.contexts[vcpu->arch_vcpu.cur_context].cr3, gva);
381381
}
382382

383-
int decode_instruction(struct vcpu *vcpu, struct mem_io *mmio)
383+
uint8_t decode_instruction(struct vcpu *vcpu)
384384
{
385385
uint64_t guest_rip_gva, guest_rip_gpa;
386386
char *guest_rip_hva;
387387
struct emul_cnx *emul_cnx;
388388
uint32_t csar;
389389
int retval = 0;
390390
enum vm_cpu_mode cpu_mode;
391-
int i;
392391

393392
guest_rip_gva =
394393
vcpu->arch_vcpu.contexts[vcpu->arch_vcpu.cur_context].rip;
@@ -399,7 +398,7 @@ int decode_instruction(struct vcpu *vcpu, struct mem_io *mmio)
399398

400399
guest_rip_hva = GPA2HVA(vcpu->vm, guest_rip_gpa);
401400
emul_cnx = &per_cpu(g_inst_ctxt, vcpu->pcpu_id);
402-
emul_cnx->mmio = mmio;
401+
emul_cnx->mmio = &vcpu->mmio;
403402
emul_cnx->vcpu = vcpu;
404403

405404
/* by now, HVA <-> HPA is 1:1 mapping, so use hpa is OK*/
@@ -410,29 +409,18 @@ int decode_instruction(struct vcpu *vcpu, struct mem_io *mmio)
410409
csar = exec_vmread(VMX_GUEST_CS_ATTR);
411410
cpu_mode = get_vmx_cpu_mode();
412411

413-
mmio->private_data = emul_cnx;
412+
vcpu->mmio.private_data = emul_cnx;
414413

415-
retval = vmm_decode_instruction(vcpu, guest_rip_gva,
414+
retval = __decode_instruction(vcpu, guest_rip_gva,
416415
cpu_mode, SEG_DESC_DEF32(csar), &emul_cnx->vie);
417416

418-
mmio->access_size = emul_cnx->vie.opsize;
419-
420417
if (retval != 0) {
421-
/* dump to instruction when decoding failed */
422-
pr_err("decode following instruction failed @ 0x%016llx:",
423-
exec_vmread(VMX_GUEST_RIP));
424-
for (i = 0; i < emul_cnx->vie.num_valid; i++) {
425-
if (i >= VIE_INST_SIZE)
426-
break;
427-
428-
if (i == 0)
429-
pr_err("\n");
430-
pr_err("%d=%02hhx ",
431-
i, emul_cnx->vie.inst[i]);
432-
}
418+
pr_err("decode instruction failed @ 0x%016llx:",
419+
exec_vmread(VMX_GUEST_RIP));
420+
return 0;
433421
}
434422

435-
return retval;
423+
return emul_cnx->vie.opsize;
436424
}
437425

438426
int emulate_instruction(struct vcpu *vcpu, struct mem_io *mmio)

hypervisor/arch/x86/guest/vlapic.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2178,7 +2178,7 @@ int apic_access_vmexit_handler(struct vcpu *vcpu)
21782178

21792179
vlapic = vcpu->arch_vcpu.vlapic;
21802180

2181-
decode_instruction(vcpu, &vcpu->mmio);
2181+
decode_instruction(vcpu);
21822182
if (access_type == 1) {
21832183
if (!emulate_instruction(vcpu, &vcpu->mmio))
21842184
vlapic_write(vlapic, 1, offset, vcpu->mmio.value);

0 commit comments

Comments
 (0)