KVM: PPC: Add feature bitmap for magic page
authorAlexander Graf <agraf@suse.de>
Tue, 3 Aug 2010 09:32:56 +0000 (11:32 +0200)
committerAvi Kivity <avi@redhat.com>
Sun, 24 Oct 2010 08:52:09 +0000 (10:52 +0200)
We will soon add SR PV support to the shared page, so we need some
infrastructure that allows the guest to query for features KVM exports.

This patch adds a second return value to the magic mapping that
indicated to the guest which features are available.

Signed-off-by: Alexander Graf <agraf@suse.de>
arch/powerpc/include/asm/kvm_para.h
arch/powerpc/kernel/kvm.c
arch/powerpc/kvm/powerpc.c

index 7438ab360120e14345733a6dba2b7526d59006bd..43c1b2260af85bef8e4d165051f6fcea1f912831 100644 (file)
@@ -47,6 +47,8 @@ struct kvm_vcpu_arch_shared {
 
 #define KVM_FEATURE_MAGIC_PAGE 1
 
+#define KVM_MAGIC_FEAT_SR      (1 << 0)
+
 #ifdef __KERNEL__
 
 #ifdef CONFIG_KVM_GUEST
index d3a2cc50d6117741c276189f7c501266a1e54325..226882fe85a6581876a06721147dcaa90619eb73 100644 (file)
@@ -266,12 +266,20 @@ static void kvm_patch_ins_wrteei(u32 *inst)
 
 static void kvm_map_magic_page(void *data)
 {
-       kvm_hypercall2(KVM_HC_PPC_MAP_MAGIC_PAGE,
-                      KVM_MAGIC_PAGE,  /* Physical Address */
-                      KVM_MAGIC_PAGE); /* Effective Address */
+       u32 *features = data;
+
+       ulong in[8];
+       ulong out[8];
+
+       in[0] = KVM_MAGIC_PAGE;
+       in[1] = KVM_MAGIC_PAGE;
+
+       kvm_hypercall(in, out, HC_VENDOR_KVM | KVM_HC_PPC_MAP_MAGIC_PAGE);
+
+       *features = out[0];
 }
 
-static void kvm_check_ins(u32 *inst)
+static void kvm_check_ins(u32 *inst, u32 features)
 {
        u32 _inst = *inst;
        u32 inst_no_rt = _inst & ~KVM_MASK_RT;
@@ -367,9 +375,10 @@ static void kvm_use_magic_page(void)
        u32 *p;
        u32 *start, *end;
        u32 tmp;
+       u32 features;
 
        /* Tell the host to map the magic page to -4096 on all CPUs */
-       on_each_cpu(kvm_map_magic_page, NULL, 1);
+       on_each_cpu(kvm_map_magic_page, &features, 1);
 
        /* Quick self-test to see if the mapping works */
        if (__get_user(tmp, (u32*)KVM_MAGIC_PAGE)) {
@@ -382,7 +391,7 @@ static void kvm_use_magic_page(void)
        end = (void*)_etext;
 
        for (p = start; p < end; p++)
-               kvm_check_ins(p);
+               kvm_check_ins(p, features);
 
        printk(KERN_INFO "KVM: Live patching for a fast VM %s\n",
                         kvm_patching_worked ? "worked" : "failed");
index 6a53a3f86dae1b65fabb393cbf578397d189bfee..496d7a5200dc4ff94fd4c25b38c84b4f530b7116 100644 (file)
@@ -66,6 +66,8 @@ int kvmppc_kvm_pv(struct kvm_vcpu *vcpu)
                vcpu->arch.magic_page_pa = param1;
                vcpu->arch.magic_page_ea = param2;
 
+               r2 = 0;
+
                r = HC_EV_SUCCESS;
                break;
        }
@@ -76,13 +78,14 @@ int kvmppc_kvm_pv(struct kvm_vcpu *vcpu)
 #endif
 
                /* Second return value is in r4 */
-               kvmppc_set_gpr(vcpu, 4, r2);
                break;
        default:
                r = HC_EV_UNIMPLEMENTED;
                break;
        }
 
+       kvmppc_set_gpr(vcpu, 4, r2);
+
        return r;
 }