diff options
Diffstat (limited to 'arch/powerpc/kvm/book3s.c')
| -rw-r--r-- | arch/powerpc/kvm/book3s.c | 46 |
1 files changed, 38 insertions, 8 deletions
diff --git a/arch/powerpc/kvm/book3s.c b/arch/powerpc/kvm/book3s.c index 8912608b7e1b..94e597e6f15c 100644 --- a/arch/powerpc/kvm/book3s.c +++ b/arch/powerpc/kvm/book3s.c | |||
| @@ -18,6 +18,8 @@ | |||
| 18 | #include <linux/err.h> | 18 | #include <linux/err.h> |
| 19 | #include <linux/export.h> | 19 | #include <linux/export.h> |
| 20 | #include <linux/slab.h> | 20 | #include <linux/slab.h> |
| 21 | #include <linux/module.h> | ||
| 22 | #include <linux/miscdevice.h> | ||
| 21 | 23 | ||
| 22 | #include <asm/reg.h> | 24 | #include <asm/reg.h> |
| 23 | #include <asm/cputable.h> | 25 | #include <asm/cputable.h> |
| @@ -575,10 +577,10 @@ int kvm_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg) | |||
| 575 | break; | 577 | break; |
| 576 | case KVM_REG_PPC_FPR0 ... KVM_REG_PPC_FPR31: | 578 | case KVM_REG_PPC_FPR0 ... KVM_REG_PPC_FPR31: |
| 577 | i = reg->id - KVM_REG_PPC_FPR0; | 579 | i = reg->id - KVM_REG_PPC_FPR0; |
| 578 | val = get_reg_val(reg->id, vcpu->arch.fpr[i]); | 580 | val = get_reg_val(reg->id, VCPU_FPR(vcpu, i)); |
| 579 | break; | 581 | break; |
| 580 | case KVM_REG_PPC_FPSCR: | 582 | case KVM_REG_PPC_FPSCR: |
| 581 | val = get_reg_val(reg->id, vcpu->arch.fpscr); | 583 | val = get_reg_val(reg->id, vcpu->arch.fp.fpscr); |
| 582 | break; | 584 | break; |
| 583 | #ifdef CONFIG_ALTIVEC | 585 | #ifdef CONFIG_ALTIVEC |
| 584 | case KVM_REG_PPC_VR0 ... KVM_REG_PPC_VR31: | 586 | case KVM_REG_PPC_VR0 ... KVM_REG_PPC_VR31: |
| @@ -586,19 +588,30 @@ int kvm_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg) | |||
| 586 | r = -ENXIO; | 588 | r = -ENXIO; |
| 587 | break; | 589 | break; |
| 588 | } | 590 | } |
| 589 | val.vval = vcpu->arch.vr[reg->id - KVM_REG_PPC_VR0]; | 591 | val.vval = vcpu->arch.vr.vr[reg->id - KVM_REG_PPC_VR0]; |
| 590 | break; | 592 | break; |
| 591 | case KVM_REG_PPC_VSCR: | 593 | case KVM_REG_PPC_VSCR: |
| 592 | if (!cpu_has_feature(CPU_FTR_ALTIVEC)) { | 594 | if (!cpu_has_feature(CPU_FTR_ALTIVEC)) { |
| 593 | r = -ENXIO; | 595 | r = -ENXIO; |
| 594 | break; | 596 | break; |
| 595 | } | 597 | } |
| 596 | val = get_reg_val(reg->id, vcpu->arch.vscr.u[3]); | 598 | val = get_reg_val(reg->id, vcpu->arch.vr.vscr.u[3]); |
| 597 | break; | 599 | break; |
| 598 | case KVM_REG_PPC_VRSAVE: | 600 | case KVM_REG_PPC_VRSAVE: |
| 599 | val = get_reg_val(reg->id, vcpu->arch.vrsave); | 601 | val = get_reg_val(reg->id, vcpu->arch.vrsave); |
| 600 | break; | 602 | break; |
| 601 | #endif /* CONFIG_ALTIVEC */ | 603 | #endif /* CONFIG_ALTIVEC */ |
| 604 | #ifdef CONFIG_VSX | ||
| 605 | case KVM_REG_PPC_VSR0 ... KVM_REG_PPC_VSR31: | ||
| 606 | if (cpu_has_feature(CPU_FTR_VSX)) { | ||
| 607 | long int i = reg->id - KVM_REG_PPC_VSR0; | ||
| 608 | val.vsxval[0] = vcpu->arch.fp.fpr[i][0]; | ||
| 609 | val.vsxval[1] = vcpu->arch.fp.fpr[i][1]; | ||
| 610 | } else { | ||
| 611 | r = -ENXIO; | ||
| 612 | } | ||
| 613 | break; | ||
| 614 | #endif /* CONFIG_VSX */ | ||
| 602 | case KVM_REG_PPC_DEBUG_INST: { | 615 | case KVM_REG_PPC_DEBUG_INST: { |
| 603 | u32 opcode = INS_TW; | 616 | u32 opcode = INS_TW; |
| 604 | r = copy_to_user((u32 __user *)(long)reg->addr, | 617 | r = copy_to_user((u32 __user *)(long)reg->addr, |
| @@ -654,10 +667,10 @@ int kvm_vcpu_ioctl_set_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg) | |||
| 654 | break; | 667 | break; |
| 655 | case KVM_REG_PPC_FPR0 ... KVM_REG_PPC_FPR31: | 668 | case KVM_REG_PPC_FPR0 ... KVM_REG_PPC_FPR31: |
| 656 | i = reg->id - KVM_REG_PPC_FPR0; | 669 | i = reg->id - KVM_REG_PPC_FPR0; |
| 657 | vcpu->arch.fpr[i] = set_reg_val(reg->id, val); | 670 | VCPU_FPR(vcpu, i) = set_reg_val(reg->id, val); |
| 658 | break; | 671 | break; |
| 659 | case KVM_REG_PPC_FPSCR: | 672 | case KVM_REG_PPC_FPSCR: |
| 660 | vcpu->arch.fpscr = set_reg_val(reg->id, val); | 673 | vcpu->arch.fp.fpscr = set_reg_val(reg->id, val); |
| 661 | break; | 674 | break; |
| 662 | #ifdef CONFIG_ALTIVEC | 675 | #ifdef CONFIG_ALTIVEC |
| 663 | case KVM_REG_PPC_VR0 ... KVM_REG_PPC_VR31: | 676 | case KVM_REG_PPC_VR0 ... KVM_REG_PPC_VR31: |
| @@ -665,14 +678,14 @@ int kvm_vcpu_ioctl_set_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg) | |||
| 665 | r = -ENXIO; | 678 | r = -ENXIO; |
| 666 | break; | 679 | break; |
| 667 | } | 680 | } |
| 668 | vcpu->arch.vr[reg->id - KVM_REG_PPC_VR0] = val.vval; | 681 | vcpu->arch.vr.vr[reg->id - KVM_REG_PPC_VR0] = val.vval; |
| 669 | break; | 682 | break; |
| 670 | case KVM_REG_PPC_VSCR: | 683 | case KVM_REG_PPC_VSCR: |
| 671 | if (!cpu_has_feature(CPU_FTR_ALTIVEC)) { | 684 | if (!cpu_has_feature(CPU_FTR_ALTIVEC)) { |
| 672 | r = -ENXIO; | 685 | r = -ENXIO; |
| 673 | break; | 686 | break; |
| 674 | } | 687 | } |
| 675 | vcpu->arch.vscr.u[3] = set_reg_val(reg->id, val); | 688 | vcpu->arch.vr.vscr.u[3] = set_reg_val(reg->id, val); |
| 676 | break; | 689 | break; |
| 677 | case KVM_REG_PPC_VRSAVE: | 690 | case KVM_REG_PPC_VRSAVE: |
| 678 | if (!cpu_has_feature(CPU_FTR_ALTIVEC)) { | 691 | if (!cpu_has_feature(CPU_FTR_ALTIVEC)) { |
| @@ -682,6 +695,17 @@ int kvm_vcpu_ioctl_set_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg) | |||
| 682 | vcpu->arch.vrsave = set_reg_val(reg->id, val); | 695 | vcpu->arch.vrsave = set_reg_val(reg->id, val); |
| 683 | break; | 696 | break; |
| 684 | #endif /* CONFIG_ALTIVEC */ | 697 | #endif /* CONFIG_ALTIVEC */ |
| 698 | #ifdef CONFIG_VSX | ||
| 699 | case KVM_REG_PPC_VSR0 ... KVM_REG_PPC_VSR31: | ||
| 700 | if (cpu_has_feature(CPU_FTR_VSX)) { | ||
| 701 | long int i = reg->id - KVM_REG_PPC_VSR0; | ||
| 702 | vcpu->arch.fp.fpr[i][0] = val.vsxval[0]; | ||
| 703 | vcpu->arch.fp.fpr[i][1] = val.vsxval[1]; | ||
| 704 | } else { | ||
| 705 | r = -ENXIO; | ||
| 706 | } | ||
| 707 | break; | ||
| 708 | #endif /* CONFIG_VSX */ | ||
| 685 | #ifdef CONFIG_KVM_XICS | 709 | #ifdef CONFIG_KVM_XICS |
| 686 | case KVM_REG_PPC_ICP_STATE: | 710 | case KVM_REG_PPC_ICP_STATE: |
| 687 | if (!vcpu->arch.icp) { | 711 | if (!vcpu->arch.icp) { |
| @@ -879,3 +903,9 @@ static void kvmppc_book3s_exit(void) | |||
| 879 | 903 | ||
| 880 | module_init(kvmppc_book3s_init); | 904 | module_init(kvmppc_book3s_init); |
| 881 | module_exit(kvmppc_book3s_exit); | 905 | module_exit(kvmppc_book3s_exit); |
| 906 | |||
| 907 | /* On 32bit this is our one and only kernel module */ | ||
| 908 | #ifdef CONFIG_KVM_BOOK3S_32 | ||
| 909 | MODULE_ALIAS_MISCDEV(KVM_MINOR); | ||
| 910 | MODULE_ALIAS("devname:kvm"); | ||
| 911 | #endif | ||
