aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc
diff options
context:
space:
mode:
authorAlexander Graf <agraf@suse.de>2010-04-15 18:11:45 -0400
committerAvi Kivity <avi@redhat.com>2010-05-17 05:18:34 -0400
commit9cc5e9538ab7cbbfb1d7263373d2f58ab2af2bad (patch)
tree058bf5939ecca2f3b805dd657cc565051947db07 /arch/powerpc
parent0604675fe17f68741730cebe74422605bb79d972 (diff)
KVM: PPC: Extract MMU init
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>
Diffstat (limited to 'arch/powerpc')
-rw-r--r--arch/powerpc/include/asm/kvm_ppc.h1
-rw-r--r--arch/powerpc/kvm/book3s.c8
-rw-r--r--arch/powerpc/kvm/book3s_64_mmu_host.c18
3 files changed, 20 insertions, 7 deletions
diff --git a/arch/powerpc/include/asm/kvm_ppc.h b/arch/powerpc/include/asm/kvm_ppc.h
index edade847b8f8..18d139ec2d22 100644
--- a/arch/powerpc/include/asm/kvm_ppc.h
+++ b/arch/powerpc/include/asm/kvm_ppc.h
@@ -69,6 +69,7 @@ extern void kvmppc_mmu_map(struct kvm_vcpu *vcpu, u64 gvaddr, gpa_t gpaddr,
69extern void kvmppc_mmu_priv_switch(struct kvm_vcpu *vcpu, int usermode); 69extern void kvmppc_mmu_priv_switch(struct kvm_vcpu *vcpu, int usermode);
70extern void kvmppc_mmu_switch_pid(struct kvm_vcpu *vcpu, u32 pid); 70extern void kvmppc_mmu_switch_pid(struct kvm_vcpu *vcpu, u32 pid);
71extern void kvmppc_mmu_destroy(struct kvm_vcpu *vcpu); 71extern void kvmppc_mmu_destroy(struct kvm_vcpu *vcpu);
72extern int kvmppc_mmu_init(struct kvm_vcpu *vcpu);
72extern int kvmppc_mmu_dtlb_index(struct kvm_vcpu *vcpu, gva_t eaddr); 73extern int kvmppc_mmu_dtlb_index(struct kvm_vcpu *vcpu, gva_t eaddr);
73extern int kvmppc_mmu_itlb_index(struct kvm_vcpu *vcpu, gva_t eaddr); 74extern int kvmppc_mmu_itlb_index(struct kvm_vcpu *vcpu, gva_t eaddr);
74extern gpa_t kvmppc_mmu_xlate(struct kvm_vcpu *vcpu, unsigned int gtlb_index, 75extern gpa_t kvmppc_mmu_xlate(struct kvm_vcpu *vcpu, unsigned int gtlb_index,
diff --git a/arch/powerpc/kvm/book3s.c b/arch/powerpc/kvm/book3s.c
index 7ff80f9f13a8..d0986968a611 100644
--- a/arch/powerpc/kvm/book3s.c
+++ b/arch/powerpc/kvm/book3s.c
@@ -1202,14 +1202,9 @@ struct kvm_vcpu *kvmppc_core_vcpu_create(struct kvm *kvm, unsigned int id)
1202 1202
1203 vcpu->arch.shadow_msr = MSR_USER64; 1203 vcpu->arch.shadow_msr = MSR_USER64;
1204 1204
1205 err = __init_new_context(); 1205 err = kvmppc_mmu_init(vcpu);
1206 if (err < 0) 1206 if (err < 0)
1207 goto free_shadow_vcpu; 1207 goto free_shadow_vcpu;
1208 vcpu_book3s->context_id = err;
1209
1210 vcpu_book3s->vsid_max = ((vcpu_book3s->context_id + 1) << USER_ESID_BITS) - 1;
1211 vcpu_book3s->vsid_first = vcpu_book3s->context_id << USER_ESID_BITS;
1212 vcpu_book3s->vsid_next = vcpu_book3s->vsid_first;
1213 1208
1214 return vcpu; 1209 return vcpu;
1215 1210
@@ -1225,7 +1220,6 @@ void kvmppc_core_vcpu_free(struct kvm_vcpu *vcpu)
1225{ 1220{
1226 struct kvmppc_vcpu_book3s *vcpu_book3s = to_book3s(vcpu); 1221 struct kvmppc_vcpu_book3s *vcpu_book3s = to_book3s(vcpu);
1227 1222
1228 __destroy_context(vcpu_book3s->context_id);
1229 kvm_vcpu_uninit(vcpu); 1223 kvm_vcpu_uninit(vcpu);
1230 kfree(vcpu_book3s->shadow_vcpu); 1224 kfree(vcpu_book3s->shadow_vcpu);
1231 vfree(vcpu_book3s); 1225 vfree(vcpu_book3s);
diff --git a/arch/powerpc/kvm/book3s_64_mmu_host.c b/arch/powerpc/kvm/book3s_64_mmu_host.c
index b0f5b4edaec2..0eea589dbef0 100644
--- a/arch/powerpc/kvm/book3s_64_mmu_host.c
+++ b/arch/powerpc/kvm/book3s_64_mmu_host.c
@@ -405,4 +405,22 @@ void kvmppc_mmu_flush_segments(struct kvm_vcpu *vcpu)
405void kvmppc_mmu_destroy(struct kvm_vcpu *vcpu) 405void kvmppc_mmu_destroy(struct kvm_vcpu *vcpu)
406{ 406{
407 kvmppc_mmu_pte_flush(vcpu, 0, 0); 407 kvmppc_mmu_pte_flush(vcpu, 0, 0);
408 __destroy_context(to_book3s(vcpu)->context_id);
409}
410
411int kvmppc_mmu_init(struct kvm_vcpu *vcpu)
412{
413 struct kvmppc_vcpu_book3s *vcpu3s = to_book3s(vcpu);
414 int err;
415
416 err = __init_new_context();
417 if (err < 0)
418 return -1;
419 vcpu3s->context_id = err;
420
421 vcpu3s->vsid_max = ((vcpu3s->context_id + 1) << USER_ESID_BITS) - 1;
422 vcpu3s->vsid_first = vcpu3s->context_id << USER_ESID_BITS;
423 vcpu3s->vsid_next = vcpu3s->vsid_first;
424
425 return 0;
408} 426}