diff options
author | Alexander Graf <agraf@suse.de> | 2010-07-29 08:47:47 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2010-10-24 04:50:45 -0400 |
commit | a73a9599e03eef1324d5aeecaebc1b339d2e1664 (patch) | |
tree | 0bdda99fbefc4fe38e1f5769556e32c8e11834f2 /arch/powerpc/kvm | |
parent | de7906c36ca1e22a3e3600e95c6a4e2c1e4e2e9c (diff) |
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>
Diffstat (limited to 'arch/powerpc/kvm')
-rw-r--r-- | arch/powerpc/kvm/book3s.c | 16 | ||||
-rw-r--r-- | arch/powerpc/kvm/booke.c | 16 | ||||
-rw-r--r-- | arch/powerpc/kvm/emulate.c | 24 |
3 files changed, 32 insertions, 24 deletions
diff --git a/arch/powerpc/kvm/book3s.c b/arch/powerpc/kvm/book3s.c index afa0dd4a27f4..cfd7fe5c3a62 100644 --- a/arch/powerpc/kvm/book3s.c +++ b/arch/powerpc/kvm/book3s.c | |||
@@ -1062,10 +1062,10 @@ int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) | |||
1062 | regs->srr0 = vcpu->arch.shared->srr0; | 1062 | regs->srr0 = vcpu->arch.shared->srr0; |
1063 | regs->srr1 = vcpu->arch.shared->srr1; | 1063 | regs->srr1 = vcpu->arch.shared->srr1; |
1064 | regs->pid = vcpu->arch.pid; | 1064 | regs->pid = vcpu->arch.pid; |
1065 | regs->sprg0 = vcpu->arch.sprg0; | 1065 | regs->sprg0 = vcpu->arch.shared->sprg0; |
1066 | regs->sprg1 = vcpu->arch.sprg1; | 1066 | regs->sprg1 = vcpu->arch.shared->sprg1; |
1067 | regs->sprg2 = vcpu->arch.sprg2; | 1067 | regs->sprg2 = vcpu->arch.shared->sprg2; |
1068 | regs->sprg3 = vcpu->arch.sprg3; | 1068 | regs->sprg3 = vcpu->arch.shared->sprg3; |
1069 | regs->sprg5 = vcpu->arch.sprg4; | 1069 | regs->sprg5 = vcpu->arch.sprg4; |
1070 | regs->sprg6 = vcpu->arch.sprg5; | 1070 | regs->sprg6 = vcpu->arch.sprg5; |
1071 | regs->sprg7 = vcpu->arch.sprg6; | 1071 | regs->sprg7 = vcpu->arch.sprg6; |
@@ -1088,10 +1088,10 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) | |||
1088 | kvmppc_set_msr(vcpu, regs->msr); | 1088 | kvmppc_set_msr(vcpu, regs->msr); |
1089 | vcpu->arch.shared->srr0 = regs->srr0; | 1089 | vcpu->arch.shared->srr0 = regs->srr0; |
1090 | vcpu->arch.shared->srr1 = regs->srr1; | 1090 | vcpu->arch.shared->srr1 = regs->srr1; |
1091 | vcpu->arch.sprg0 = regs->sprg0; | 1091 | vcpu->arch.shared->sprg0 = regs->sprg0; |
1092 | vcpu->arch.sprg1 = regs->sprg1; | 1092 | vcpu->arch.shared->sprg1 = regs->sprg1; |
1093 | vcpu->arch.sprg2 = regs->sprg2; | 1093 | vcpu->arch.shared->sprg2 = regs->sprg2; |
1094 | vcpu->arch.sprg3 = regs->sprg3; | 1094 | vcpu->arch.shared->sprg3 = regs->sprg3; |
1095 | vcpu->arch.sprg5 = regs->sprg4; | 1095 | vcpu->arch.sprg5 = regs->sprg4; |
1096 | vcpu->arch.sprg6 = regs->sprg5; | 1096 | vcpu->arch.sprg6 = regs->sprg5; |
1097 | vcpu->arch.sprg7 = regs->sprg6; | 1097 | vcpu->arch.sprg7 = regs->sprg6; |
diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c index 793df28b628d..b2c8c423c4d5 100644 --- a/arch/powerpc/kvm/booke.c +++ b/arch/powerpc/kvm/booke.c | |||
@@ -495,10 +495,10 @@ int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) | |||
495 | regs->srr0 = vcpu->arch.shared->srr0; | 495 | regs->srr0 = vcpu->arch.shared->srr0; |
496 | regs->srr1 = vcpu->arch.shared->srr1; | 496 | regs->srr1 = vcpu->arch.shared->srr1; |
497 | regs->pid = vcpu->arch.pid; | 497 | regs->pid = vcpu->arch.pid; |
498 | regs->sprg0 = vcpu->arch.sprg0; | 498 | regs->sprg0 = vcpu->arch.shared->sprg0; |
499 | regs->sprg1 = vcpu->arch.sprg1; | 499 | regs->sprg1 = vcpu->arch.shared->sprg1; |
500 | regs->sprg2 = vcpu->arch.sprg2; | 500 | regs->sprg2 = vcpu->arch.shared->sprg2; |
501 | regs->sprg3 = vcpu->arch.sprg3; | 501 | regs->sprg3 = vcpu->arch.shared->sprg3; |
502 | regs->sprg5 = vcpu->arch.sprg4; | 502 | regs->sprg5 = vcpu->arch.sprg4; |
503 | regs->sprg6 = vcpu->arch.sprg5; | 503 | regs->sprg6 = vcpu->arch.sprg5; |
504 | regs->sprg7 = vcpu->arch.sprg6; | 504 | regs->sprg7 = vcpu->arch.sprg6; |
@@ -521,10 +521,10 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) | |||
521 | kvmppc_set_msr(vcpu, regs->msr); | 521 | kvmppc_set_msr(vcpu, regs->msr); |
522 | vcpu->arch.shared->srr0 = regs->srr0; | 522 | vcpu->arch.shared->srr0 = regs->srr0; |
523 | vcpu->arch.shared->srr1 = regs->srr1; | 523 | vcpu->arch.shared->srr1 = regs->srr1; |
524 | vcpu->arch.sprg0 = regs->sprg0; | 524 | vcpu->arch.shared->sprg0 = regs->sprg0; |
525 | vcpu->arch.sprg1 = regs->sprg1; | 525 | vcpu->arch.shared->sprg1 = regs->sprg1; |
526 | vcpu->arch.sprg2 = regs->sprg2; | 526 | vcpu->arch.shared->sprg2 = regs->sprg2; |
527 | vcpu->arch.sprg3 = regs->sprg3; | 527 | vcpu->arch.shared->sprg3 = regs->sprg3; |
528 | vcpu->arch.sprg5 = regs->sprg4; | 528 | vcpu->arch.sprg5 = regs->sprg4; |
529 | vcpu->arch.sprg6 = regs->sprg5; | 529 | vcpu->arch.sprg6 = regs->sprg5; |
530 | vcpu->arch.sprg7 = regs->sprg6; | 530 | vcpu->arch.sprg7 = regs->sprg6; |
diff --git a/arch/powerpc/kvm/emulate.c b/arch/powerpc/kvm/emulate.c index ad0fa4ff4ea0..454869b5e91e 100644 --- a/arch/powerpc/kvm/emulate.c +++ b/arch/powerpc/kvm/emulate.c | |||
@@ -263,13 +263,17 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu) | |||
263 | kvmppc_set_gpr(vcpu, rt, get_tb()); break; | 263 | kvmppc_set_gpr(vcpu, rt, get_tb()); break; |
264 | 264 | ||
265 | case SPRN_SPRG0: | 265 | case SPRN_SPRG0: |
266 | kvmppc_set_gpr(vcpu, rt, vcpu->arch.sprg0); break; | 266 | kvmppc_set_gpr(vcpu, rt, vcpu->arch.shared->sprg0); |
267 | break; | ||
267 | case SPRN_SPRG1: | 268 | case SPRN_SPRG1: |
268 | kvmppc_set_gpr(vcpu, rt, vcpu->arch.sprg1); break; | 269 | kvmppc_set_gpr(vcpu, rt, vcpu->arch.shared->sprg1); |
270 | break; | ||
269 | case SPRN_SPRG2: | 271 | case SPRN_SPRG2: |
270 | kvmppc_set_gpr(vcpu, rt, vcpu->arch.sprg2); break; | 272 | kvmppc_set_gpr(vcpu, rt, vcpu->arch.shared->sprg2); |
273 | break; | ||
271 | case SPRN_SPRG3: | 274 | case SPRN_SPRG3: |
272 | kvmppc_set_gpr(vcpu, rt, vcpu->arch.sprg3); break; | 275 | kvmppc_set_gpr(vcpu, rt, vcpu->arch.shared->sprg3); |
276 | break; | ||
273 | /* Note: SPRG4-7 are user-readable, so we don't get | 277 | /* Note: SPRG4-7 are user-readable, so we don't get |
274 | * a trap. */ | 278 | * a trap. */ |
275 | 279 | ||
@@ -341,13 +345,17 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu) | |||
341 | break; | 345 | break; |
342 | 346 | ||
343 | case SPRN_SPRG0: | 347 | case SPRN_SPRG0: |
344 | vcpu->arch.sprg0 = kvmppc_get_gpr(vcpu, rs); break; | 348 | vcpu->arch.shared->sprg0 = kvmppc_get_gpr(vcpu, rs); |
349 | break; | ||
345 | case SPRN_SPRG1: | 350 | case SPRN_SPRG1: |
346 | vcpu->arch.sprg1 = kvmppc_get_gpr(vcpu, rs); break; | 351 | vcpu->arch.shared->sprg1 = kvmppc_get_gpr(vcpu, rs); |
352 | break; | ||
347 | case SPRN_SPRG2: | 353 | case SPRN_SPRG2: |
348 | vcpu->arch.sprg2 = kvmppc_get_gpr(vcpu, rs); break; | 354 | vcpu->arch.shared->sprg2 = kvmppc_get_gpr(vcpu, rs); |
355 | break; | ||
349 | case SPRN_SPRG3: | 356 | case SPRN_SPRG3: |
350 | vcpu->arch.sprg3 = kvmppc_get_gpr(vcpu, rs); break; | 357 | vcpu->arch.shared->sprg3 = kvmppc_get_gpr(vcpu, rs); |
358 | break; | ||
351 | 359 | ||
352 | default: | 360 | default: |
353 | emulated = kvmppc_core_emulate_mtspr(vcpu, sprn, rs); | 361 | emulated = kvmppc_core_emulate_mtspr(vcpu, sprn, rs); |