KVM: PPC: Extract MMU init
authorAlexander Graf <agraf@suse.de>
Thu, 15 Apr 2010 22:11:45 +0000 (00:11 +0200)
committerAvi Kivity <avi@redhat.com>
Mon, 17 May 2010 09:18:34 +0000 (12:18 +0300)
The host shadow mmu code needs to get initialized. It needs to fetch a
segment it can use to put shadow PTEs into.

That initialization code was in generic code, which is icky. Let's move
it over to the respective MMU file.

Signed-off-by: Alexander Graf <agraf@suse.de>
Signed-off-by: Avi Kivity <avi@redhat.com>
arch/powerpc/include/asm/kvm_ppc.h
arch/powerpc/kvm/book3s.c
arch/powerpc/kvm/book3s_64_mmu_host.c

index edade847b8f8c23b856586281622615b0be67a28..18d139ec2d223555960b703637173ffe6dddab13 100644 (file)
@@ -69,6 +69,7 @@ extern void kvmppc_mmu_map(struct kvm_vcpu *vcpu, u64 gvaddr, gpa_t gpaddr,
 extern void kvmppc_mmu_priv_switch(struct kvm_vcpu *vcpu, int usermode);
 extern void kvmppc_mmu_switch_pid(struct kvm_vcpu *vcpu, u32 pid);
 extern void kvmppc_mmu_destroy(struct kvm_vcpu *vcpu);
+extern int kvmppc_mmu_init(struct kvm_vcpu *vcpu);
 extern int kvmppc_mmu_dtlb_index(struct kvm_vcpu *vcpu, gva_t eaddr);
 extern int kvmppc_mmu_itlb_index(struct kvm_vcpu *vcpu, gva_t eaddr);
 extern gpa_t kvmppc_mmu_xlate(struct kvm_vcpu *vcpu, unsigned int gtlb_index,
index 7ff80f9f13a85bd185d4be6daec6900cd8250ba7..d0986968a6119f550746fec2577e7cda05a10b15 100644 (file)
@@ -1202,14 +1202,9 @@ struct kvm_vcpu *kvmppc_core_vcpu_create(struct kvm *kvm, unsigned int id)
 
        vcpu->arch.shadow_msr = MSR_USER64;
 
-       err = __init_new_context();
+       err = kvmppc_mmu_init(vcpu);
        if (err < 0)
                goto free_shadow_vcpu;
-       vcpu_book3s->context_id = err;
-
-       vcpu_book3s->vsid_max = ((vcpu_book3s->context_id + 1) << USER_ESID_BITS) - 1;
-       vcpu_book3s->vsid_first = vcpu_book3s->context_id << USER_ESID_BITS;
-       vcpu_book3s->vsid_next = vcpu_book3s->vsid_first;
 
        return vcpu;
 
@@ -1225,7 +1220,6 @@ void kvmppc_core_vcpu_free(struct kvm_vcpu *vcpu)
 {
        struct kvmppc_vcpu_book3s *vcpu_book3s = to_book3s(vcpu);
 
-       __destroy_context(vcpu_book3s->context_id);
        kvm_vcpu_uninit(vcpu);
        kfree(vcpu_book3s->shadow_vcpu);
        vfree(vcpu_book3s);
index b0f5b4edaec2a1aefb72348a43f0d811c9d9b7be..0eea589dbef06ebbe19bc5968f301dca516008ba 100644 (file)
@@ -405,4 +405,22 @@ void kvmppc_mmu_flush_segments(struct kvm_vcpu *vcpu)
 void kvmppc_mmu_destroy(struct kvm_vcpu *vcpu)
 {
        kvmppc_mmu_pte_flush(vcpu, 0, 0);
+       __destroy_context(to_book3s(vcpu)->context_id);
+}
+
+int kvmppc_mmu_init(struct kvm_vcpu *vcpu)
+{
+       struct kvmppc_vcpu_book3s *vcpu3s = to_book3s(vcpu);
+       int err;
+
+       err = __init_new_context();
+       if (err < 0)
+               return -1;
+       vcpu3s->context_id = err;
+
+       vcpu3s->vsid_max = ((vcpu3s->context_id + 1) << USER_ESID_BITS) - 1;
+       vcpu3s->vsid_first = vcpu3s->context_id << USER_ESID_BITS;
+       vcpu3s->vsid_next = vcpu3s->vsid_first;
+
+       return 0;
 }