aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kvm/book3s.c
diff options
context:
space:
mode:
authorAlexander Graf <agraf@suse.de>2010-07-29 08:47:48 -0400
committerAvi Kivity <avi@redhat.com>2010-10-24 04:50:45 -0400
commit2a342ed57756ad5d8af5456959433884367e5ab2 (patch)
treebb3f1d707916bc53f48919ace0d0f757c7e2083b /arch/powerpc/kvm/book3s.c
parenta73a9599e03eef1324d5aeecaebc1b339d2e1664 (diff)
KVM: PPC: Implement hypervisor interface
To communicate with KVM directly we need to plumb some sort of interface between the guest and KVM. Usually those interfaces use hypercalls. This hypercall implementation is described in the last patch of the series in a special documentation file. Please read that for further information. This patch implements stubs to handle KVM PPC hypercalls on the host and guest side alike. Signed-off-by: Alexander Graf <agraf@suse.de> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/powerpc/kvm/book3s.c')
-rw-r--r--arch/powerpc/kvm/book3s.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/arch/powerpc/kvm/book3s.c b/arch/powerpc/kvm/book3s.c
index cfd7fe5c3a62..5cb5f0d9381f 100644
--- a/arch/powerpc/kvm/book3s.c
+++ b/arch/powerpc/kvm/book3s.c
@@ -947,10 +947,10 @@ program_interrupt:
947 break; 947 break;
948 } 948 }
949 case BOOK3S_INTERRUPT_SYSCALL: 949 case BOOK3S_INTERRUPT_SYSCALL:
950 // XXX make user settable
951 if (vcpu->arch.osi_enabled && 950 if (vcpu->arch.osi_enabled &&
952 (((u32)kvmppc_get_gpr(vcpu, 3)) == OSI_SC_MAGIC_R3) && 951 (((u32)kvmppc_get_gpr(vcpu, 3)) == OSI_SC_MAGIC_R3) &&
953 (((u32)kvmppc_get_gpr(vcpu, 4)) == OSI_SC_MAGIC_R4)) { 952 (((u32)kvmppc_get_gpr(vcpu, 4)) == OSI_SC_MAGIC_R4)) {
953 /* MOL hypercalls */
954 u64 *gprs = run->osi.gprs; 954 u64 *gprs = run->osi.gprs;
955 int i; 955 int i;
956 956
@@ -959,8 +959,13 @@ program_interrupt:
959 gprs[i] = kvmppc_get_gpr(vcpu, i); 959 gprs[i] = kvmppc_get_gpr(vcpu, i);
960 vcpu->arch.osi_needed = 1; 960 vcpu->arch.osi_needed = 1;
961 r = RESUME_HOST_NV; 961 r = RESUME_HOST_NV;
962 962 } else if (!(vcpu->arch.shared->msr & MSR_PR) &&
963 (((u32)kvmppc_get_gpr(vcpu, 0)) == KVM_SC_MAGIC_R0)) {
964 /* KVM PV hypercalls */
965 kvmppc_set_gpr(vcpu, 3, kvmppc_kvm_pv(vcpu));
966 r = RESUME_GUEST;
963 } else { 967 } else {
968 /* Guest syscalls */
964 vcpu->stat.syscall_exits++; 969 vcpu->stat.syscall_exits++;
965 kvmppc_book3s_queue_irqprio(vcpu, exit_nr); 970 kvmppc_book3s_queue_irqprio(vcpu, exit_nr);
966 r = RESUME_GUEST; 971 r = RESUME_GUEST;