Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5100f983 authored by Andre Przywara's avatar Andre Przywara Committed by Marc Zyngier
Browse files

arm/arm64: KVM: avoid unnecessary guest register mangling on MMIO read



Currently we mangle the endianness of the guest's register even on an
MMIO _read_, where it is completely useless, because we will not use
the value of that register.
Rework the io_mem_abort() function to clearly separate between reads
and writes and only do the endianness mangling on MMIO writes.

Signed-off-by: default avatarAndre Przywara <andre.przywara@arm.com>
Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
parent 849260c7
Loading
Loading
Loading
Loading
+9 −6
Original line number Diff line number Diff line
@@ -187,15 +187,18 @@ int io_mem_abort(struct kvm_vcpu *vcpu, struct kvm_run *run,
	}

	rt = vcpu->arch.mmio_decode.rt;
	data = vcpu_data_guest_to_host(vcpu, *vcpu_reg(vcpu, rt), mmio.len);

	trace_kvm_mmio((mmio.is_write) ? KVM_TRACE_MMIO_WRITE :
					 KVM_TRACE_MMIO_READ_UNSATISFIED,
			mmio.len, fault_ipa,
			(mmio.is_write) ? data : 0);
	if (mmio.is_write) {
		data = vcpu_data_guest_to_host(vcpu, *vcpu_reg(vcpu, rt),
					       mmio.len);

	if (mmio.is_write)
		trace_kvm_mmio(KVM_TRACE_MMIO_WRITE, mmio.len,
			       fault_ipa, data);
		mmio_write_buf(mmio.data, mmio.len, data);
	} else {
		trace_kvm_mmio(KVM_TRACE_MMIO_READ_UNSATISFIED, mmio.len,
			       fault_ipa, 0);
	}

	if (vgic_handle_mmio(vcpu, run, &mmio))
		return 1;