|
@@ -490,6 +490,7 @@ int kvm_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg)
|
|
|
int r;
|
|
|
union kvmppc_one_reg val;
|
|
|
int size;
|
|
|
+ long int i;
|
|
|
|
|
|
size = one_reg_size(reg->id);
|
|
|
if (size > sizeof(val))
|
|
@@ -506,6 +507,29 @@ int kvm_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg)
|
|
|
case KVM_REG_PPC_DSISR:
|
|
|
val = get_reg_val(reg->id, vcpu->arch.shared->dsisr);
|
|
|
break;
|
|
|
+ case KVM_REG_PPC_FPR0 ... KVM_REG_PPC_FPR31:
|
|
|
+ i = reg->id - KVM_REG_PPC_FPR0;
|
|
|
+ val = get_reg_val(reg->id, vcpu->arch.fpr[i]);
|
|
|
+ break;
|
|
|
+ case KVM_REG_PPC_FPSCR:
|
|
|
+ val = get_reg_val(reg->id, vcpu->arch.fpscr);
|
|
|
+ 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[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.vscr.u[3]);
|
|
|
+ break;
|
|
|
+#endif /* CONFIG_ALTIVEC */
|
|
|
default:
|
|
|
r = -EINVAL;
|
|
|
break;
|
|
@@ -525,6 +549,7 @@ int kvm_vcpu_ioctl_set_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg)
|
|
|
int r;
|
|
|
union kvmppc_one_reg val;
|
|
|
int size;
|
|
|
+ long int i;
|
|
|
|
|
|
size = one_reg_size(reg->id);
|
|
|
if (size > sizeof(val))
|
|
@@ -544,6 +569,29 @@ int kvm_vcpu_ioctl_set_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg)
|
|
|
case KVM_REG_PPC_DSISR:
|
|
|
vcpu->arch.shared->dsisr = set_reg_val(reg->id, val);
|
|
|
break;
|
|
|
+ case KVM_REG_PPC_FPR0 ... KVM_REG_PPC_FPR31:
|
|
|
+ i = reg->id - KVM_REG_PPC_FPR0;
|
|
|
+ vcpu->arch.fpr[i] = set_reg_val(reg->id, val);
|
|
|
+ break;
|
|
|
+ case KVM_REG_PPC_FPSCR:
|
|
|
+ vcpu->arch.fpscr = set_reg_val(reg->id, val);
|
|
|
+ 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[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.vscr.u[3] = set_reg_val(reg->id, val);
|
|
|
+ break;
|
|
|
+#endif /* CONFIG_ALTIVEC */
|
|
|
default:
|
|
|
r = -EINVAL;
|
|
|
break;
|