From: Simon Guo
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
---
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
@@ -,6 +,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