KVM: PPC: Move ONE_REG AltiVec support to powerpc
Move ONE_REG AltiVec support to powerpc generic layer. Signed-off-by: Mihai Caraman <mihai.caraman@freescale.com> Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
committed by
Alexander Graf
parent
8a41ea53b3
commit
3840edc803
@@ -476,6 +476,11 @@ struct kvm_get_htab_header {
|
|||||||
|
|
||||||
/* FP and vector status/control registers */
|
/* FP and vector status/control registers */
|
||||||
#define KVM_REG_PPC_FPSCR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x80)
|
#define KVM_REG_PPC_FPSCR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x80)
|
||||||
|
/*
|
||||||
|
* VSCR register is documented as a 32-bit register in the ISA, but it can
|
||||||
|
* only be accesses via a vector register. Expose VSCR as a 32-bit register
|
||||||
|
* even though the kernel represents it as a 128-bit vector.
|
||||||
|
*/
|
||||||
#define KVM_REG_PPC_VSCR (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x81)
|
#define KVM_REG_PPC_VSCR (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x81)
|
||||||
|
|
||||||
/* Virtual processor areas */
|
/* Virtual processor areas */
|
||||||
|
|||||||
@@ -558,25 +558,6 @@ int kvmppc_get_one_reg(struct kvm_vcpu *vcpu, u64 id,
|
|||||||
case KVM_REG_PPC_FPSCR:
|
case KVM_REG_PPC_FPSCR:
|
||||||
*val = get_reg_val(id, vcpu->arch.fp.fpscr);
|
*val = get_reg_val(id, vcpu->arch.fp.fpscr);
|
||||||
break;
|
break;
|
||||||
#ifdef CONFIG_ALTIVEC
|
|
||||||
case KVM_REG_PPC_VR0 ... KVM_REG_PPC_VR31:
|
|
||||||
if (!cpu_has_feature(CPU_FTR_ALTIVEC)) {
|
|
||||||
r = -ENXIO;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
val->vval = vcpu->arch.vr.vr[id - KVM_REG_PPC_VR0];
|
|
||||||
break;
|
|
||||||
case KVM_REG_PPC_VSCR:
|
|
||||||
if (!cpu_has_feature(CPU_FTR_ALTIVEC)) {
|
|
||||||
r = -ENXIO;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
*val = get_reg_val(id, vcpu->arch.vr.vscr.u[3]);
|
|
||||||
break;
|
|
||||||
case KVM_REG_PPC_VRSAVE:
|
|
||||||
*val = get_reg_val(id, vcpu->arch.vrsave);
|
|
||||||
break;
|
|
||||||
#endif /* CONFIG_ALTIVEC */
|
|
||||||
#ifdef CONFIG_VSX
|
#ifdef CONFIG_VSX
|
||||||
case KVM_REG_PPC_VSR0 ... KVM_REG_PPC_VSR31:
|
case KVM_REG_PPC_VSR0 ... KVM_REG_PPC_VSR31:
|
||||||
if (cpu_has_feature(CPU_FTR_VSX)) {
|
if (cpu_has_feature(CPU_FTR_VSX)) {
|
||||||
@@ -653,29 +634,6 @@ int kvmppc_set_one_reg(struct kvm_vcpu *vcpu, u64 id,
|
|||||||
case KVM_REG_PPC_FPSCR:
|
case KVM_REG_PPC_FPSCR:
|
||||||
vcpu->arch.fp.fpscr = set_reg_val(id, *val);
|
vcpu->arch.fp.fpscr = set_reg_val(id, *val);
|
||||||
break;
|
break;
|
||||||
#ifdef CONFIG_ALTIVEC
|
|
||||||
case KVM_REG_PPC_VR0 ... KVM_REG_PPC_VR31:
|
|
||||||
if (!cpu_has_feature(CPU_FTR_ALTIVEC)) {
|
|
||||||
r = -ENXIO;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
vcpu->arch.vr.vr[id - KVM_REG_PPC_VR0] = val->vval;
|
|
||||||
break;
|
|
||||||
case KVM_REG_PPC_VSCR:
|
|
||||||
if (!cpu_has_feature(CPU_FTR_ALTIVEC)) {
|
|
||||||
r = -ENXIO;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
vcpu->arch.vr.vscr.u[3] = set_reg_val(id, *val);
|
|
||||||
break;
|
|
||||||
case KVM_REG_PPC_VRSAVE:
|
|
||||||
if (!cpu_has_feature(CPU_FTR_ALTIVEC)) {
|
|
||||||
r = -ENXIO;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
vcpu->arch.vrsave = set_reg_val(id, *val);
|
|
||||||
break;
|
|
||||||
#endif /* CONFIG_ALTIVEC */
|
|
||||||
#ifdef CONFIG_VSX
|
#ifdef CONFIG_VSX
|
||||||
case KVM_REG_PPC_VSR0 ... KVM_REG_PPC_VSR31:
|
case KVM_REG_PPC_VSR0 ... KVM_REG_PPC_VSR31:
|
||||||
if (cpu_has_feature(CPU_FTR_VSX)) {
|
if (cpu_has_feature(CPU_FTR_VSX)) {
|
||||||
|
|||||||
@@ -921,6 +921,29 @@ int kvm_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg)
|
|||||||
if (r == -EINVAL) {
|
if (r == -EINVAL) {
|
||||||
r = 0;
|
r = 0;
|
||||||
switch (reg->id) {
|
switch (reg->id) {
|
||||||
|
#ifdef CONFIG_ALTIVEC
|
||||||
|
case KVM_REG_PPC_VR0 ... KVM_REG_PPC_VR31:
|
||||||
|
if (!cpu_has_feature(CPU_FTR_ALTIVEC)) {
|
||||||
|
r = -ENXIO;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
vcpu->arch.vr.vr[reg->id - KVM_REG_PPC_VR0] = val.vval;
|
||||||
|
break;
|
||||||
|
case KVM_REG_PPC_VSCR:
|
||||||
|
if (!cpu_has_feature(CPU_FTR_ALTIVEC)) {
|
||||||
|
r = -ENXIO;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
vcpu->arch.vr.vscr.u[3] = set_reg_val(reg->id, val);
|
||||||
|
break;
|
||||||
|
case KVM_REG_PPC_VRSAVE:
|
||||||
|
if (!cpu_has_feature(CPU_FTR_ALTIVEC)) {
|
||||||
|
r = -ENXIO;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
vcpu->arch.vrsave = set_reg_val(reg->id, val);
|
||||||
|
break;
|
||||||
|
#endif /* CONFIG_ALTIVEC */
|
||||||
default:
|
default:
|
||||||
r = -EINVAL;
|
r = -EINVAL;
|
||||||
break;
|
break;
|
||||||
@@ -953,6 +976,25 @@ int kvm_vcpu_ioctl_set_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg)
|
|||||||
if (r == -EINVAL) {
|
if (r == -EINVAL) {
|
||||||
r = 0;
|
r = 0;
|
||||||
switch (reg->id) {
|
switch (reg->id) {
|
||||||
|
#ifdef CONFIG_ALTIVEC
|
||||||
|
case KVM_REG_PPC_VR0 ... KVM_REG_PPC_VR31:
|
||||||
|
if (!cpu_has_feature(CPU_FTR_ALTIVEC)) {
|
||||||
|
r = -ENXIO;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
val.vval = vcpu->arch.vr.vr[reg->id - KVM_REG_PPC_VR0];
|
||||||
|
break;
|
||||||
|
case KVM_REG_PPC_VSCR:
|
||||||
|
if (!cpu_has_feature(CPU_FTR_ALTIVEC)) {
|
||||||
|
r = -ENXIO;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
val = get_reg_val(reg->id, vcpu->arch.vr.vscr.u[3]);
|
||||||
|
break;
|
||||||
|
case KVM_REG_PPC_VRSAVE:
|
||||||
|
val = get_reg_val(reg->id, vcpu->arch.vrsave);
|
||||||
|
break;
|
||||||
|
#endif /* CONFIG_ALTIVEC */
|
||||||
default:
|
default:
|
||||||
r = -EINVAL;
|
r = -EINVAL;
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user