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>
This commit is contained in:
parent
99189b4e48
commit
0e5f7cb91c
|
@ -339,10 +339,6 @@ static int dm_emulate_mmio_pre(struct vcpu *vcpu, uint64_t exit_qual)
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
status = analyze_instruction(vcpu, &vcpu->mmio);
|
|
||||||
if (status != 0)
|
|
||||||
return status;
|
|
||||||
|
|
||||||
if (vcpu->mmio.read_write == HV_MEM_IO_WRITE) {
|
if (vcpu->mmio.read_write == HV_MEM_IO_WRITE) {
|
||||||
status = emulate_instruction(vcpu, &vcpu->mmio);
|
status = emulate_instruction(vcpu, &vcpu->mmio);
|
||||||
if (status != 0)
|
if (status != 0)
|
||||||
|
@ -404,6 +400,9 @@ int ept_violation_vmexit_handler(struct vcpu *vcpu)
|
||||||
*/
|
*/
|
||||||
mmio->paddr = gpa;
|
mmio->paddr = gpa;
|
||||||
|
|
||||||
|
if (decode_instruction(vcpu, mmio) != 0)
|
||||||
|
goto out;
|
||||||
|
|
||||||
list_for_each(pos, &vcpu->vm->mmio_list) {
|
list_for_each(pos, &vcpu->vm->mmio_list) {
|
||||||
mmio_handler = list_entry(pos, struct mem_io_node, list);
|
mmio_handler = list_entry(pos, struct mem_io_node, list);
|
||||||
if ((mmio->paddr + mmio->access_size <=
|
if ((mmio->paddr + mmio->access_size <=
|
||||||
|
@ -419,9 +418,6 @@ int ept_violation_vmexit_handler(struct vcpu *vcpu)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (analyze_instruction(vcpu, mmio) != 0)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
if (mmio->read_write == HV_MEM_IO_WRITE) {
|
if (mmio->read_write == HV_MEM_IO_WRITE) {
|
||||||
if (emulate_instruction(vcpu, mmio) != 0)
|
if (emulate_instruction(vcpu, mmio) != 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
|
@ -90,6 +90,6 @@ int vmm_decode_instruction(struct vcpu *vcpu, uint64_t gla,
|
||||||
enum vm_cpu_mode cpu_mode, int csd, struct vie *vie);
|
enum vm_cpu_mode cpu_mode, int csd, struct vie *vie);
|
||||||
|
|
||||||
int emulate_instruction(struct vcpu *vcpu, struct mem_io *mmio);
|
int emulate_instruction(struct vcpu *vcpu, struct mem_io *mmio);
|
||||||
int analyze_instruction(struct vcpu *vcpu, struct mem_io *mmio);
|
int decode_instruction(struct vcpu *vcpu, struct mem_io *mmio);
|
||||||
|
|
||||||
#endif /* _VMM_INSTRUCTION_EMUL_H_ */
|
#endif /* _VMM_INSTRUCTION_EMUL_H_ */
|
||||||
|
|
|
@ -380,7 +380,7 @@ void vm_gva2gpa(struct vcpu *vcpu, uint64_t gva, uint64_t *gpa)
|
||||||
vcpu->arch_vcpu.contexts[vcpu->arch_vcpu.cur_context].cr3, gva);
|
vcpu->arch_vcpu.contexts[vcpu->arch_vcpu.cur_context].cr3, gva);
|
||||||
}
|
}
|
||||||
|
|
||||||
int analyze_instruction(struct vcpu *vcpu, struct mem_io *mmio)
|
int decode_instruction(struct vcpu *vcpu, struct mem_io *mmio)
|
||||||
{
|
{
|
||||||
uint64_t guest_rip_gva, guest_rip_gpa;
|
uint64_t guest_rip_gva, guest_rip_gpa;
|
||||||
char *guest_rip_hva;
|
char *guest_rip_hva;
|
||||||
|
|
|
@ -2178,7 +2178,7 @@ int apic_access_vmexit_handler(struct vcpu *vcpu)
|
||||||
|
|
||||||
vlapic = vcpu->arch_vcpu.vlapic;
|
vlapic = vcpu->arch_vcpu.vlapic;
|
||||||
|
|
||||||
analyze_instruction(vcpu, &vcpu->mmio);
|
decode_instruction(vcpu, &vcpu->mmio);
|
||||||
if (access_type == 1) {
|
if (access_type == 1) {
|
||||||
if (!emulate_instruction(vcpu, &vcpu->mmio))
|
if (!emulate_instruction(vcpu, &vcpu->mmio))
|
||||||
vlapic_write(vlapic, 1, offset, vcpu->mmio.value);
|
vlapic_write(vlapic, 1, offset, vcpu->mmio.value);
|
||||||
|
|
Loading…
Reference in New Issue