KVM: PPC: Convert SPRG[0-4] to shared page
When in kernel mode there are 4 additional registers available that are simple data storage. Instead of exiting to the hypervisor to read and write those, we can just share them with the guest using the page. This patch converts all users of the current field to the shared page. Signed-off-by: Alexander Graf <agraf@suse.de> Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
Родитель
de7906c36c
Коммит
a73a9599e0
|
@ -217,10 +217,6 @@ struct kvm_vcpu_arch {
|
||||||
ulong guest_owned_ext;
|
ulong guest_owned_ext;
|
||||||
#endif
|
#endif
|
||||||
u32 mmucr;
|
u32 mmucr;
|
||||||
ulong sprg0;
|
|
||||||
ulong sprg1;
|
|
||||||
ulong sprg2;
|
|
||||||
ulong sprg3;
|
|
||||||
ulong sprg4;
|
ulong sprg4;
|
||||||
ulong sprg5;
|
ulong sprg5;
|
||||||
ulong sprg6;
|
ulong sprg6;
|
||||||
|
|
|
@ -23,6 +23,10 @@
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
|
||||||
struct kvm_vcpu_arch_shared {
|
struct kvm_vcpu_arch_shared {
|
||||||
|
__u64 sprg0;
|
||||||
|
__u64 sprg1;
|
||||||
|
__u64 sprg2;
|
||||||
|
__u64 sprg3;
|
||||||
__u64 srr0;
|
__u64 srr0;
|
||||||
__u64 srr1;
|
__u64 srr1;
|
||||||
__u64 dar;
|
__u64 dar;
|
||||||
|
|
|
@ -1062,10 +1062,10 @@ int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
|
||||||
regs->srr0 = vcpu->arch.shared->srr0;
|
regs->srr0 = vcpu->arch.shared->srr0;
|
||||||
regs->srr1 = vcpu->arch.shared->srr1;
|
regs->srr1 = vcpu->arch.shared->srr1;
|
||||||
regs->pid = vcpu->arch.pid;
|
regs->pid = vcpu->arch.pid;
|
||||||
regs->sprg0 = vcpu->arch.sprg0;
|
regs->sprg0 = vcpu->arch.shared->sprg0;
|
||||||
regs->sprg1 = vcpu->arch.sprg1;
|
regs->sprg1 = vcpu->arch.shared->sprg1;
|
||||||
regs->sprg2 = vcpu->arch.sprg2;
|
regs->sprg2 = vcpu->arch.shared->sprg2;
|
||||||
regs->sprg3 = vcpu->arch.sprg3;
|
regs->sprg3 = vcpu->arch.shared->sprg3;
|
||||||
regs->sprg5 = vcpu->arch.sprg4;
|
regs->sprg5 = vcpu->arch.sprg4;
|
||||||
regs->sprg6 = vcpu->arch.sprg5;
|
regs->sprg6 = vcpu->arch.sprg5;
|
||||||
regs->sprg7 = vcpu->arch.sprg6;
|
regs->sprg7 = vcpu->arch.sprg6;
|
||||||
|
@ -1088,10 +1088,10 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
|
||||||
kvmppc_set_msr(vcpu, regs->msr);
|
kvmppc_set_msr(vcpu, regs->msr);
|
||||||
vcpu->arch.shared->srr0 = regs->srr0;
|
vcpu->arch.shared->srr0 = regs->srr0;
|
||||||
vcpu->arch.shared->srr1 = regs->srr1;
|
vcpu->arch.shared->srr1 = regs->srr1;
|
||||||
vcpu->arch.sprg0 = regs->sprg0;
|
vcpu->arch.shared->sprg0 = regs->sprg0;
|
||||||
vcpu->arch.sprg1 = regs->sprg1;
|
vcpu->arch.shared->sprg1 = regs->sprg1;
|
||||||
vcpu->arch.sprg2 = regs->sprg2;
|
vcpu->arch.shared->sprg2 = regs->sprg2;
|
||||||
vcpu->arch.sprg3 = regs->sprg3;
|
vcpu->arch.shared->sprg3 = regs->sprg3;
|
||||||
vcpu->arch.sprg5 = regs->sprg4;
|
vcpu->arch.sprg5 = regs->sprg4;
|
||||||
vcpu->arch.sprg6 = regs->sprg5;
|
vcpu->arch.sprg6 = regs->sprg5;
|
||||||
vcpu->arch.sprg7 = regs->sprg6;
|
vcpu->arch.sprg7 = regs->sprg6;
|
||||||
|
|
|
@ -495,10 +495,10 @@ int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
|
||||||
regs->srr0 = vcpu->arch.shared->srr0;
|
regs->srr0 = vcpu->arch.shared->srr0;
|
||||||
regs->srr1 = vcpu->arch.shared->srr1;
|
regs->srr1 = vcpu->arch.shared->srr1;
|
||||||
regs->pid = vcpu->arch.pid;
|
regs->pid = vcpu->arch.pid;
|
||||||
regs->sprg0 = vcpu->arch.sprg0;
|
regs->sprg0 = vcpu->arch.shared->sprg0;
|
||||||
regs->sprg1 = vcpu->arch.sprg1;
|
regs->sprg1 = vcpu->arch.shared->sprg1;
|
||||||
regs->sprg2 = vcpu->arch.sprg2;
|
regs->sprg2 = vcpu->arch.shared->sprg2;
|
||||||
regs->sprg3 = vcpu->arch.sprg3;
|
regs->sprg3 = vcpu->arch.shared->sprg3;
|
||||||
regs->sprg5 = vcpu->arch.sprg4;
|
regs->sprg5 = vcpu->arch.sprg4;
|
||||||
regs->sprg6 = vcpu->arch.sprg5;
|
regs->sprg6 = vcpu->arch.sprg5;
|
||||||
regs->sprg7 = vcpu->arch.sprg6;
|
regs->sprg7 = vcpu->arch.sprg6;
|
||||||
|
@ -521,10 +521,10 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
|
||||||
kvmppc_set_msr(vcpu, regs->msr);
|
kvmppc_set_msr(vcpu, regs->msr);
|
||||||
vcpu->arch.shared->srr0 = regs->srr0;
|
vcpu->arch.shared->srr0 = regs->srr0;
|
||||||
vcpu->arch.shared->srr1 = regs->srr1;
|
vcpu->arch.shared->srr1 = regs->srr1;
|
||||||
vcpu->arch.sprg0 = regs->sprg0;
|
vcpu->arch.shared->sprg0 = regs->sprg0;
|
||||||
vcpu->arch.sprg1 = regs->sprg1;
|
vcpu->arch.shared->sprg1 = regs->sprg1;
|
||||||
vcpu->arch.sprg2 = regs->sprg2;
|
vcpu->arch.shared->sprg2 = regs->sprg2;
|
||||||
vcpu->arch.sprg3 = regs->sprg3;
|
vcpu->arch.shared->sprg3 = regs->sprg3;
|
||||||
vcpu->arch.sprg5 = regs->sprg4;
|
vcpu->arch.sprg5 = regs->sprg4;
|
||||||
vcpu->arch.sprg6 = regs->sprg5;
|
vcpu->arch.sprg6 = regs->sprg5;
|
||||||
vcpu->arch.sprg7 = regs->sprg6;
|
vcpu->arch.sprg7 = regs->sprg6;
|
||||||
|
|
|
@ -263,13 +263,17 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu)
|
||||||
kvmppc_set_gpr(vcpu, rt, get_tb()); break;
|
kvmppc_set_gpr(vcpu, rt, get_tb()); break;
|
||||||
|
|
||||||
case SPRN_SPRG0:
|
case SPRN_SPRG0:
|
||||||
kvmppc_set_gpr(vcpu, rt, vcpu->arch.sprg0); break;
|
kvmppc_set_gpr(vcpu, rt, vcpu->arch.shared->sprg0);
|
||||||
|
break;
|
||||||
case SPRN_SPRG1:
|
case SPRN_SPRG1:
|
||||||
kvmppc_set_gpr(vcpu, rt, vcpu->arch.sprg1); break;
|
kvmppc_set_gpr(vcpu, rt, vcpu->arch.shared->sprg1);
|
||||||
|
break;
|
||||||
case SPRN_SPRG2:
|
case SPRN_SPRG2:
|
||||||
kvmppc_set_gpr(vcpu, rt, vcpu->arch.sprg2); break;
|
kvmppc_set_gpr(vcpu, rt, vcpu->arch.shared->sprg2);
|
||||||
|
break;
|
||||||
case SPRN_SPRG3:
|
case SPRN_SPRG3:
|
||||||
kvmppc_set_gpr(vcpu, rt, vcpu->arch.sprg3); break;
|
kvmppc_set_gpr(vcpu, rt, vcpu->arch.shared->sprg3);
|
||||||
|
break;
|
||||||
/* Note: SPRG4-7 are user-readable, so we don't get
|
/* Note: SPRG4-7 are user-readable, so we don't get
|
||||||
* a trap. */
|
* a trap. */
|
||||||
|
|
||||||
|
@ -341,13 +345,17 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SPRN_SPRG0:
|
case SPRN_SPRG0:
|
||||||
vcpu->arch.sprg0 = kvmppc_get_gpr(vcpu, rs); break;
|
vcpu->arch.shared->sprg0 = kvmppc_get_gpr(vcpu, rs);
|
||||||
|
break;
|
||||||
case SPRN_SPRG1:
|
case SPRN_SPRG1:
|
||||||
vcpu->arch.sprg1 = kvmppc_get_gpr(vcpu, rs); break;
|
vcpu->arch.shared->sprg1 = kvmppc_get_gpr(vcpu, rs);
|
||||||
|
break;
|
||||||
case SPRN_SPRG2:
|
case SPRN_SPRG2:
|
||||||
vcpu->arch.sprg2 = kvmppc_get_gpr(vcpu, rs); break;
|
vcpu->arch.shared->sprg2 = kvmppc_get_gpr(vcpu, rs);
|
||||||
|
break;
|
||||||
case SPRN_SPRG3:
|
case SPRN_SPRG3:
|
||||||
vcpu->arch.sprg3 = kvmppc_get_gpr(vcpu, rs); break;
|
vcpu->arch.shared->sprg3 = kvmppc_get_gpr(vcpu, rs);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
emulated = kvmppc_core_emulate_mtspr(vcpu, sprn, rs);
|
emulated = kvmppc_core_emulate_mtspr(vcpu, sprn, rs);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче