diff options
Diffstat (limited to 'arch/powerpc/kvm/e500.c')
| -rw-r--r-- | arch/powerpc/kvm/e500.c | 63 | 
1 files changed, 48 insertions, 15 deletions
diff --git a/arch/powerpc/kvm/e500.c b/arch/powerpc/kvm/e500.c index ce6b73c2961..2e02ed849f3 100644 --- a/arch/powerpc/kvm/e500.c +++ b/arch/powerpc/kvm/e500.c @@ -16,6 +16,8 @@  #include <linux/slab.h>  #include <linux/err.h>  #include <linux/export.h> +#include <linux/module.h> +#include <linux/miscdevice.h>  #include <asm/reg.h>  #include <asm/cputable.h> @@ -305,7 +307,7 @@ void kvmppc_core_load_guest_debugstate(struct kvm_vcpu *vcpu)  {  } -void kvmppc_core_vcpu_load(struct kvm_vcpu *vcpu, int cpu) +static void kvmppc_core_vcpu_load_e500(struct kvm_vcpu *vcpu, int cpu)  {  	kvmppc_booke_vcpu_load(vcpu, cpu); @@ -313,7 +315,7 @@ void kvmppc_core_vcpu_load(struct kvm_vcpu *vcpu, int cpu)  	kvmppc_e500_recalc_shadow_pid(to_e500(vcpu));  } -void kvmppc_core_vcpu_put(struct kvm_vcpu *vcpu) +static void kvmppc_core_vcpu_put_e500(struct kvm_vcpu *vcpu)  {  #ifdef CONFIG_SPE  	if (vcpu->arch.shadow_msr & MSR_SPE) @@ -367,7 +369,8 @@ int kvmppc_core_vcpu_setup(struct kvm_vcpu *vcpu)  	return 0;  } -void kvmppc_core_get_sregs(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs) +static int kvmppc_core_get_sregs_e500(struct kvm_vcpu *vcpu, +				      struct kvm_sregs *sregs)  {  	struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu); @@ -388,9 +391,11 @@ void kvmppc_core_get_sregs(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs)  	kvmppc_get_sregs_ivor(vcpu, sregs);  	kvmppc_get_sregs_e500_tlb(vcpu, sregs); +	return 0;  } -int kvmppc_core_set_sregs(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs) +static int kvmppc_core_set_sregs_e500(struct kvm_vcpu *vcpu, +				      struct kvm_sregs *sregs)  {  	struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu);  	int ret; @@ -425,21 +430,22 @@ int kvmppc_core_set_sregs(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs)  	return kvmppc_set_sregs_ivor(vcpu, sregs);  } -int kvmppc_get_one_reg(struct kvm_vcpu *vcpu, u64 id, -			union kvmppc_one_reg *val) +static int kvmppc_get_one_reg_e500(struct kvm_vcpu *vcpu, u64 id, +				   union kvmppc_one_reg *val)  {  	int r = kvmppc_get_one_reg_e500_tlb(vcpu, id, val);  	return r;  } -int kvmppc_set_one_reg(struct kvm_vcpu *vcpu, u64 id, -		       union kvmppc_one_reg *val) +static int kvmppc_set_one_reg_e500(struct kvm_vcpu *vcpu, u64 id, +				   union kvmppc_one_reg *val)  {  	int r = kvmppc_get_one_reg_e500_tlb(vcpu, id, val);  	return r;  } -struct kvm_vcpu *kvmppc_core_vcpu_create(struct kvm *kvm, unsigned int id) +static struct kvm_vcpu *kvmppc_core_vcpu_create_e500(struct kvm *kvm, +						     unsigned int id)  {  	struct kvmppc_vcpu_e500 *vcpu_e500;  	struct kvm_vcpu *vcpu; @@ -481,7 +487,7 @@ out:  	return ERR_PTR(err);  } -void kvmppc_core_vcpu_free(struct kvm_vcpu *vcpu) +static void kvmppc_core_vcpu_free_e500(struct kvm_vcpu *vcpu)  {  	struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu); @@ -492,15 +498,32 @@ void kvmppc_core_vcpu_free(struct kvm_vcpu *vcpu)  	kmem_cache_free(kvm_vcpu_cache, vcpu_e500);  } -int kvmppc_core_init_vm(struct kvm *kvm) +static int kvmppc_core_init_vm_e500(struct kvm *kvm)  {  	return 0;  } -void kvmppc_core_destroy_vm(struct kvm *kvm) +static void kvmppc_core_destroy_vm_e500(struct kvm *kvm)  {  } +static struct kvmppc_ops kvm_ops_e500 = { +	.get_sregs = kvmppc_core_get_sregs_e500, +	.set_sregs = kvmppc_core_set_sregs_e500, +	.get_one_reg = kvmppc_get_one_reg_e500, +	.set_one_reg = kvmppc_set_one_reg_e500, +	.vcpu_load   = kvmppc_core_vcpu_load_e500, +	.vcpu_put    = kvmppc_core_vcpu_put_e500, +	.vcpu_create = kvmppc_core_vcpu_create_e500, +	.vcpu_free   = kvmppc_core_vcpu_free_e500, +	.mmu_destroy  = kvmppc_mmu_destroy_e500, +	.init_vm = kvmppc_core_init_vm_e500, +	.destroy_vm = kvmppc_core_destroy_vm_e500, +	.emulate_op = kvmppc_core_emulate_op_e500, +	.emulate_mtspr = kvmppc_core_emulate_mtspr_e500, +	.emulate_mfspr = kvmppc_core_emulate_mfspr_e500, +}; +  static int __init kvmppc_e500_init(void)  {  	int r, i; @@ -512,11 +535,11 @@ static int __init kvmppc_e500_init(void)  	r = kvmppc_core_check_processor_compat();  	if (r) -		return r; +		goto err_out;  	r = kvmppc_booke_init();  	if (r) -		return r; +		goto err_out;  	/* copy extra E500 exception handlers */  	ivor[0] = mfspr(SPRN_IVOR32); @@ -534,13 +557,23 @@ static int __init kvmppc_e500_init(void)  	flush_icache_range(kvmppc_booke_handlers, kvmppc_booke_handlers +  			   ivor[max_ivor] + handler_len); -	return kvm_init(NULL, sizeof(struct kvmppc_vcpu_e500), 0, THIS_MODULE); +	r = kvm_init(NULL, sizeof(struct kvmppc_vcpu_e500), 0, THIS_MODULE); +	if (r) +		goto err_out; +	kvm_ops_e500.owner = THIS_MODULE; +	kvmppc_pr_ops = &kvm_ops_e500; + +err_out: +	return r;  }  static void __exit kvmppc_e500_exit(void)  { +	kvmppc_pr_ops = NULL;  	kvmppc_booke_exit();  }  module_init(kvmppc_e500_init);  module_exit(kvmppc_e500_exit); +MODULE_ALIAS_MISCDEV(KVM_MINOR); +MODULE_ALIAS("devname:kvm");  | 
