[PATCH 05/11] KVM: PPC: add GPR RA update skeleton for MMIO emulation

wei.guo.simon at gmail.com wei.guo.simon at gmail.com
Wed Apr 25 21:54:38 AEST 2018


From: Simon Guo <wei.guo.simon at gmail.com>

To optimize kvm emulation code with analyse_instr, adds new
mmio_update_ra flag to aid with GPR RA update.

This patch arms RA update at load/store emulation path for both
qemu mmio emulation or coalesced mmio emulation.

Signed-off-by: Simon Guo <wei.guo.simon at gmail.com>
---
 arch/powerpc/include/asm/kvm_host.h  |  2 ++
 arch/powerpc/kvm/emulate_loadstore.c |  1 +
 arch/powerpc/kvm/powerpc.c           | 17 +++++++++++++++++
 3 files changed, 20 insertions(+)

diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h
index 2d87768..1c7da00 100644
--- a/arch/powerpc/include/asm/kvm_host.h
+++ b/arch/powerpc/include/asm/kvm_host.h
@@ -673,6 +673,8 @@ struct kvm_vcpu_arch {
 	u8 mmio_sign_extend;
 	/* conversion between single and double precision */
 	u8 mmio_sp64_extend;
+	u8 mmio_ra; /* GPR as ra to be updated with EA */
+	u8 mmio_update_ra;
 	/*
 	 * Number of simulations for vsx.
 	 * If we use 2*8bytes to simulate 1*16bytes,
diff --git a/arch/powerpc/kvm/emulate_loadstore.c b/arch/powerpc/kvm/emulate_loadstore.c
index b8a3aef..90b9692 100644
--- a/arch/powerpc/kvm/emulate_loadstore.c
+++ b/arch/powerpc/kvm/emulate_loadstore.c
@@ -111,6 +111,7 @@ int kvmppc_emulate_loadstore(struct kvm_vcpu *vcpu)
 	vcpu->arch.mmio_sp64_extend = 0;
 	vcpu->arch.mmio_sign_extend = 0;
 	vcpu->arch.mmio_vmx_copy_nums = 0;
+	vcpu->arch.mmio_update_ra = 0;
 	vcpu->arch.mmio_host_swabbed = 0;
 
 	switch (get_op(inst)) {
diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
index bef27b1..f7fd68f 100644
--- a/arch/powerpc/kvm/powerpc.c
+++ b/arch/powerpc/kvm/powerpc.c
@@ -1111,6 +1111,12 @@ static int __kvmppc_handle_load(struct kvm_run *run, struct kvm_vcpu *vcpu,
 
 	if (!ret) {
 		kvmppc_complete_mmio_load(vcpu, run);
+		if (vcpu->arch.mmio_update_ra) {
+			kvmppc_set_gpr(vcpu, vcpu->arch.mmio_ra,
+					vcpu->arch.vaddr_accessed);
+			vcpu->arch.mmio_update_ra = 0;
+		}
+
 		vcpu->mmio_needed = 0;
 		return EMULATE_DONE;
 	}
@@ -1215,6 +1221,12 @@ int kvmppc_handle_store(struct kvm_run *run, struct kvm_vcpu *vcpu,
 
 	if (!ret) {
 		vcpu->mmio_needed = 0;
+		if (vcpu->arch.mmio_update_ra) {
+			kvmppc_set_gpr(vcpu, vcpu->arch.mmio_ra,
+					vcpu->arch.vaddr_accessed);
+			vcpu->arch.mmio_update_ra = 0;
+		}
+
 		return EMULATE_DONE;
 	}
 
@@ -1581,6 +1593,11 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)
 			}
 		}
 #endif
+		if (vcpu->arch.mmio_update_ra) {
+			kvmppc_set_gpr(vcpu, vcpu->arch.mmio_ra,
+					vcpu->arch.vaddr_accessed);
+			vcpu->arch.mmio_update_ra = 0;
+		}
 	} else if (vcpu->arch.osi_needed) {
 		u64 *gprs = run->osi.gprs;
 		int i;
-- 
1.8.3.1



More information about the Linuxppc-dev mailing list