aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorPaul Mackerras <paulus@samba.org>2011-06-28 20:19:50 -0400
committerAvi Kivity <avi@redhat.com>2011-07-12 06:16:51 -0400
commitdf6909e5d52f67be01862c5cb453e509aee661f1 (patch)
treeaab39c039a693e5381f922df4125aa7b72be681c /arch
parentf9e0554deca54a42fb2cf7f68c05a4a37461c205 (diff)
KVM: PPC: Move guest enter/exit down into subarch-specific code
Instead of doing the kvm_guest_enter/exit() and local_irq_dis/enable() calls in powerpc.c, this moves them down into the subarch-specific book3s_pr.c and booke.c. This eliminates an extra local_irq_enable() call in book3s_pr.c, and will be needed for when we do SMT4 guest support in the book3s hypervisor mode code. Signed-off-by: Paul Mackerras <paulus@samba.org> Signed-off-by: Alexander Graf <agraf@suse.de>
Diffstat (limited to 'arch')
-rw-r--r--arch/powerpc/include/asm/kvm_ppc.h1
-rw-r--r--arch/powerpc/kvm/book3s_interrupts.S2
-rw-r--r--arch/powerpc/kvm/book3s_pr.c12
-rw-r--r--arch/powerpc/kvm/booke.c13
-rw-r--r--arch/powerpc/kvm/powerpc.c6
5 files changed, 22 insertions, 12 deletions
diff --git a/arch/powerpc/include/asm/kvm_ppc.h b/arch/powerpc/include/asm/kvm_ppc.h
index 9b6f3f99c5e..48b7ab76de2 100644
--- a/arch/powerpc/include/asm/kvm_ppc.h
+++ b/arch/powerpc/include/asm/kvm_ppc.h
@@ -42,6 +42,7 @@ enum emulation_result {
42 EMULATE_AGAIN, /* something went wrong. go again */ 42 EMULATE_AGAIN, /* something went wrong. go again */
43}; 43};
44 44
45extern int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu);
45extern int __kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu); 46extern int __kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu);
46extern char kvmppc_handlers_start[]; 47extern char kvmppc_handlers_start[];
47extern unsigned long kvmppc_handler_len; 48extern unsigned long kvmppc_handler_len;
diff --git a/arch/powerpc/kvm/book3s_interrupts.S b/arch/powerpc/kvm/book3s_interrupts.S
index 2f0bc928b08..8c5e0e16010 100644
--- a/arch/powerpc/kvm/book3s_interrupts.S
+++ b/arch/powerpc/kvm/book3s_interrupts.S
@@ -85,7 +85,7 @@
85 * r3: kvm_run pointer 85 * r3: kvm_run pointer
86 * r4: vcpu pointer 86 * r4: vcpu pointer
87 */ 87 */
88_GLOBAL(__kvmppc_vcpu_entry) 88_GLOBAL(__kvmppc_vcpu_run)
89 89
90kvm_start_entry: 90kvm_start_entry:
91 /* Write correct stack frame */ 91 /* Write correct stack frame */
diff --git a/arch/powerpc/kvm/book3s_pr.c b/arch/powerpc/kvm/book3s_pr.c
index 72b20b8749f..0c0d3f27443 100644
--- a/arch/powerpc/kvm/book3s_pr.c
+++ b/arch/powerpc/kvm/book3s_pr.c
@@ -891,8 +891,7 @@ void kvmppc_core_vcpu_free(struct kvm_vcpu *vcpu)
891 vfree(vcpu_book3s); 891 vfree(vcpu_book3s);
892} 892}
893 893
894extern int __kvmppc_vcpu_entry(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu); 894int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
895int __kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
896{ 895{
897 int ret; 896 int ret;
898 double fpr[32][TS_FPRWIDTH]; 897 double fpr[32][TS_FPRWIDTH];
@@ -944,14 +943,15 @@ int __kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
944 /* Remember the MSR with disabled extensions */ 943 /* Remember the MSR with disabled extensions */
945 ext_msr = current->thread.regs->msr; 944 ext_msr = current->thread.regs->msr;
946 945
947 /* XXX we get called with irq disabled - change that! */
948 local_irq_enable();
949
950 /* Preload FPU if it's enabled */ 946 /* Preload FPU if it's enabled */
951 if (vcpu->arch.shared->msr & MSR_FP) 947 if (vcpu->arch.shared->msr & MSR_FP)
952 kvmppc_handle_ext(vcpu, BOOK3S_INTERRUPT_FP_UNAVAIL, MSR_FP); 948 kvmppc_handle_ext(vcpu, BOOK3S_INTERRUPT_FP_UNAVAIL, MSR_FP);
953 949
954 ret = __kvmppc_vcpu_entry(kvm_run, vcpu); 950 kvm_guest_enter();
951
952 ret = __kvmppc_vcpu_run(kvm_run, vcpu);
953
954 kvm_guest_exit();
955 955
956 local_irq_disable(); 956 local_irq_disable();
957 957
diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c
index 9066325b23b..ee45fa01220 100644
--- a/arch/powerpc/kvm/booke.c
+++ b/arch/powerpc/kvm/booke.c
@@ -312,6 +312,19 @@ void kvmppc_core_deliver_interrupts(struct kvm_vcpu *vcpu)
312 vcpu->arch.shared->int_pending = 0; 312 vcpu->arch.shared->int_pending = 0;
313} 313}
314 314
315int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
316{
317 int ret;
318
319 local_irq_disable();
320 kvm_guest_enter();
321 ret = __kvmppc_vcpu_run(kvm_run, vcpu);
322 kvm_guest_exit();
323 local_irq_enable();
324
325 return ret;
326}
327
315/** 328/**
316 * kvmppc_handle_exit 329 * kvmppc_handle_exit
317 * 330 *
diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
index 0c80e159c13..026036efcde 100644
--- a/arch/powerpc/kvm/powerpc.c
+++ b/arch/powerpc/kvm/powerpc.c
@@ -500,11 +500,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)
500 500
501 kvmppc_core_deliver_interrupts(vcpu); 501 kvmppc_core_deliver_interrupts(vcpu);
502 502
503 local_irq_disable(); 503 r = kvmppc_vcpu_run(run, vcpu);
504 kvm_guest_enter();
505 r = __kvmppc_vcpu_run(run, vcpu);
506 kvm_guest_exit();
507 local_irq_enable();
508 504
509 if (vcpu->sigset_active) 505 if (vcpu->sigset_active)
510 sigprocmask(SIG_SETMASK, &sigsaved, NULL); 506 sigprocmask(SIG_SETMASK, &sigsaved, NULL);