Skip to content

Commit 0e5f7cb

Browse files
yonghuahlijinxia
authored andcommitted
hv: bugfix - MMIO access size was not properly initialized.
- MMIO access size is not initialized before instruction emulation. - rename 'analyze_instruction()' to 'decode_instruction()' Signed-off-by: Yonghua Huang <yonghua.huang@intel.com>
1 parent 99189b4 commit 0e5f7cb

File tree

4 files changed

+6
-10
lines changed

4 files changed

+6
-10
lines changed

hypervisor/arch/x86/ept.c

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -339,10 +339,6 @@ static int dm_emulate_mmio_pre(struct vcpu *vcpu, uint64_t exit_qual)
339339
{
340340
int status;
341341

342-
status = analyze_instruction(vcpu, &vcpu->mmio);
343-
if (status != 0)
344-
return status;
345-
346342
if (vcpu->mmio.read_write == HV_MEM_IO_WRITE) {
347343
status = emulate_instruction(vcpu, &vcpu->mmio);
348344
if (status != 0)
@@ -404,6 +400,9 @@ int ept_violation_vmexit_handler(struct vcpu *vcpu)
404400
*/
405401
mmio->paddr = gpa;
406402

403+
if (decode_instruction(vcpu, mmio) != 0)
404+
goto out;
405+
407406
list_for_each(pos, &vcpu->vm->mmio_list) {
408407
mmio_handler = list_entry(pos, struct mem_io_node, list);
409408
if ((mmio->paddr + mmio->access_size <=
@@ -419,9 +418,6 @@ int ept_violation_vmexit_handler(struct vcpu *vcpu)
419418
return -EIO;
420419
}
421420

422-
if (analyze_instruction(vcpu, mmio) != 0)
423-
goto out;
424-
425421
if (mmio->read_write == HV_MEM_IO_WRITE) {
426422
if (emulate_instruction(vcpu, mmio) != 0)
427423
goto out;

hypervisor/arch/x86/guest/instr_emul.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,6 @@ int vmm_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 analyze_instruction(struct vcpu *vcpu, struct mem_io *mmio);
93+
int decode_instruction(struct vcpu *vcpu, struct mem_io *mmio);
9494

9595
#endif /* _VMM_INSTRUCTION_EMUL_H_ */

hypervisor/arch/x86/guest/instr_emul_wrapper.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ 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 analyze_instruction(struct vcpu *vcpu, struct mem_io *mmio)
383+
int decode_instruction(struct vcpu *vcpu, struct mem_io *mmio)
384384
{
385385
uint64_t guest_rip_gva, guest_rip_gpa;
386386
char *guest_rip_hva;

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-
analyze_instruction(vcpu, &vcpu->mmio);
2181+
decode_instruction(vcpu, &vcpu->mmio);
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)