diff options
author | Alexander Graf <agraf@suse.de> | 2010-07-29 08:47:48 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2010-10-24 04:50:45 -0400 |
commit | 2a342ed57756ad5d8af5456959433884367e5ab2 (patch) | |
tree | bb3f1d707916bc53f48919ace0d0f757c7e2083b /arch/powerpc/kvm/book3s.c | |
parent | a73a9599e03eef1324d5aeecaebc1b339d2e1664 (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.c | 9 |
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; |