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>
This commit is contained in:
committed by
Avi Kivity
parent
0604675fe1
commit
9cc5e9538a
@@ -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_priv_switch(struct kvm_vcpu *vcpu, int usermode);
|
||||||
extern void kvmppc_mmu_switch_pid(struct kvm_vcpu *vcpu, u32 pid);
|
extern void kvmppc_mmu_switch_pid(struct kvm_vcpu *vcpu, u32 pid);
|
||||||
extern void kvmppc_mmu_destroy(struct kvm_vcpu *vcpu);
|
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_dtlb_index(struct kvm_vcpu *vcpu, gva_t eaddr);
|
||||||
extern int kvmppc_mmu_itlb_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,
|
extern gpa_t kvmppc_mmu_xlate(struct kvm_vcpu *vcpu, unsigned int gtlb_index,
|
||||||
|
@@ -1202,14 +1202,9 @@ struct kvm_vcpu *kvmppc_core_vcpu_create(struct kvm *kvm, unsigned int id)
|
|||||||
|
|
||||||
vcpu->arch.shadow_msr = MSR_USER64;
|
vcpu->arch.shadow_msr = MSR_USER64;
|
||||||
|
|
||||||
err = __init_new_context();
|
err = kvmppc_mmu_init(vcpu);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto free_shadow_vcpu;
|
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;
|
return vcpu;
|
||||||
|
|
||||||
@@ -1225,7 +1220,6 @@ void kvmppc_core_vcpu_free(struct kvm_vcpu *vcpu)
|
|||||||
{
|
{
|
||||||
struct kvmppc_vcpu_book3s *vcpu_book3s = to_book3s(vcpu);
|
struct kvmppc_vcpu_book3s *vcpu_book3s = to_book3s(vcpu);
|
||||||
|
|
||||||
__destroy_context(vcpu_book3s->context_id);
|
|
||||||
kvm_vcpu_uninit(vcpu);
|
kvm_vcpu_uninit(vcpu);
|
||||||
kfree(vcpu_book3s->shadow_vcpu);
|
kfree(vcpu_book3s->shadow_vcpu);
|
||||||
vfree(vcpu_book3s);
|
vfree(vcpu_book3s);
|
||||||
|
@@ -405,4 +405,22 @@ void kvmppc_mmu_flush_segments(struct kvm_vcpu *vcpu)
|
|||||||
void kvmppc_mmu_destroy(struct kvm_vcpu *vcpu)
|
void kvmppc_mmu_destroy(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
kvmppc_mmu_pte_flush(vcpu, 0, 0);
|
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;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user