Skip to content

Commit efff191

Browse files
paulusmackagraf
authored andcommitted
KVM: PPC: Store FP/VSX/VMX state in thread_fp/vr_state structures
This uses struct thread_fp_state and struct thread_vr_state to store the floating-point, VMX/Altivec and VSX state, rather than flat arrays. This makes transferring the state to/from the thread_struct simpler and allows us to unify the get/set_one_reg implementations for the VSX registers. Signed-off-by: Paul Mackerras <[email protected]> Signed-off-by: Alexander Graf <[email protected]>
1 parent 09548fd commit efff191

File tree

9 files changed

+131
-220
lines changed

9 files changed

+131
-220
lines changed

arch/powerpc/include/asm/kvm_host.h

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -410,8 +410,7 @@ struct kvm_vcpu_arch {
410410

411411
ulong gpr[32];
412412

413-
u64 fpr[32];
414-
u64 fpscr;
413+
struct thread_fp_state fp;
415414

416415
#ifdef CONFIG_SPE
417416
ulong evr[32];
@@ -420,12 +419,7 @@ struct kvm_vcpu_arch {
420419
u64 acc;
421420
#endif
422421
#ifdef CONFIG_ALTIVEC
423-
vector128 vr[32];
424-
vector128 vscr;
425-
#endif
426-
427-
#ifdef CONFIG_VSX
428-
u64 vsr[64];
422+
struct thread_vr_state vr;
429423
#endif
430424

431425
#ifdef CONFIG_KVM_BOOKE_HV
@@ -619,6 +613,8 @@ struct kvm_vcpu_arch {
619613
#endif
620614
};
621615

616+
#define VCPU_FPR(vcpu, i) (vcpu)->arch.fp.fpr[i][TS_FPROFFSET]
617+
622618
/* Values for vcpu->arch.state */
623619
#define KVMPPC_VCPU_NOTREADY 0
624620
#define KVMPPC_VCPU_RUNNABLE 1

arch/powerpc/kernel/asm-offsets.c

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -425,14 +425,11 @@ int main(void)
425425
DEFINE(VCPU_GUEST_PID, offsetof(struct kvm_vcpu, arch.pid));
426426
DEFINE(VCPU_GPRS, offsetof(struct kvm_vcpu, arch.gpr));
427427
DEFINE(VCPU_VRSAVE, offsetof(struct kvm_vcpu, arch.vrsave));
428-
DEFINE(VCPU_FPRS, offsetof(struct kvm_vcpu, arch.fpr));
429-
DEFINE(VCPU_FPSCR, offsetof(struct kvm_vcpu, arch.fpscr));
428+
DEFINE(VCPU_FPRS, offsetof(struct kvm_vcpu, arch.fp.fpr));
429+
DEFINE(VCPU_FPSCR, offsetof(struct kvm_vcpu, arch.fp.fpscr));
430430
#ifdef CONFIG_ALTIVEC
431-
DEFINE(VCPU_VRS, offsetof(struct kvm_vcpu, arch.vr));
432-
DEFINE(VCPU_VSCR, offsetof(struct kvm_vcpu, arch.vscr));
433-
#endif
434-
#ifdef CONFIG_VSX
435-
DEFINE(VCPU_VSRS, offsetof(struct kvm_vcpu, arch.vsr));
431+
DEFINE(VCPU_VRS, offsetof(struct kvm_vcpu, arch.vr.vr));
432+
DEFINE(VCPU_VSCR, offsetof(struct kvm_vcpu, arch.vr.vscr));
436433
#endif
437434
DEFINE(VCPU_XER, offsetof(struct kvm_vcpu, arch.xer));
438435
DEFINE(VCPU_CTR, offsetof(struct kvm_vcpu, arch.ctr));

arch/powerpc/kvm/book3s.c

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -577,30 +577,41 @@ int kvm_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg)
577577
break;
578578
case KVM_REG_PPC_FPR0 ... KVM_REG_PPC_FPR31:
579579
i = reg->id - KVM_REG_PPC_FPR0;
580-
val = get_reg_val(reg->id, vcpu->arch.fpr[i]);
580+
val = get_reg_val(reg->id, VCPU_FPR(vcpu, i));
581581
break;
582582
case KVM_REG_PPC_FPSCR:
583-
val = get_reg_val(reg->id, vcpu->arch.fpscr);
583+
val = get_reg_val(reg->id, vcpu->arch.fp.fpscr);
584584
break;
585585
#ifdef CONFIG_ALTIVEC
586586
case KVM_REG_PPC_VR0 ... KVM_REG_PPC_VR31:
587587
if (!cpu_has_feature(CPU_FTR_ALTIVEC)) {
588588
r = -ENXIO;
589589
break;
590590
}
591-
val.vval = vcpu->arch.vr[reg->id - KVM_REG_PPC_VR0];
591+
val.vval = vcpu->arch.vr.vr[reg->id - KVM_REG_PPC_VR0];
592592
break;
593593
case KVM_REG_PPC_VSCR:
594594
if (!cpu_has_feature(CPU_FTR_ALTIVEC)) {
595595
r = -ENXIO;
596596
break;
597597
}
598-
val = get_reg_val(reg->id, vcpu->arch.vscr.u[3]);
598+
val = get_reg_val(reg->id, vcpu->arch.vr.vscr.u[3]);
599599
break;
600600
case KVM_REG_PPC_VRSAVE:
601601
val = get_reg_val(reg->id, vcpu->arch.vrsave);
602602
break;
603603
#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 */
604615
case KVM_REG_PPC_DEBUG_INST: {
605616
u32 opcode = INS_TW;
606617
r = copy_to_user((u32 __user *)(long)reg->addr,
@@ -656,25 +667,25 @@ int kvm_vcpu_ioctl_set_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg)
656667
break;
657668
case KVM_REG_PPC_FPR0 ... KVM_REG_PPC_FPR31:
658669
i = reg->id - KVM_REG_PPC_FPR0;
659-
vcpu->arch.fpr[i] = set_reg_val(reg->id, val);
670+
VCPU_FPR(vcpu, i) = set_reg_val(reg->id, val);
660671
break;
661672
case KVM_REG_PPC_FPSCR:
662-
vcpu->arch.fpscr = set_reg_val(reg->id, val);
673+
vcpu->arch.fp.fpscr = set_reg_val(reg->id, val);
663674
break;
664675
#ifdef CONFIG_ALTIVEC
665676
case KVM_REG_PPC_VR0 ... KVM_REG_PPC_VR31:
666677
if (!cpu_has_feature(CPU_FTR_ALTIVEC)) {
667678
r = -ENXIO;
668679
break;
669680
}
670-
vcpu->arch.vr[reg->id - KVM_REG_PPC_VR0] = val.vval;
681+
vcpu->arch.vr.vr[reg->id - KVM_REG_PPC_VR0] = val.vval;
671682
break;
672683
case KVM_REG_PPC_VSCR:
673684
if (!cpu_has_feature(CPU_FTR_ALTIVEC)) {
674685
r = -ENXIO;
675686
break;
676687
}
677-
vcpu->arch.vscr.u[3] = set_reg_val(reg->id, val);
688+
vcpu->arch.vr.vscr.u[3] = set_reg_val(reg->id, val);
678689
break;
679690
case KVM_REG_PPC_VRSAVE:
680691
if (!cpu_has_feature(CPU_FTR_ALTIVEC)) {
@@ -684,6 +695,17 @@ int kvm_vcpu_ioctl_set_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg)
684695
vcpu->arch.vrsave = set_reg_val(reg->id, val);
685696
break;
686697
#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 */
687709
#ifdef CONFIG_KVM_XICS
688710
case KVM_REG_PPC_ICP_STATE:
689711
if (!vcpu->arch.icp) {

arch/powerpc/kvm/book3s_hv.c

Lines changed: 0 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -811,27 +811,6 @@ static int kvmppc_get_one_reg_hv(struct kvm_vcpu *vcpu, u64 id,
811811
case KVM_REG_PPC_SDAR:
812812
*val = get_reg_val(id, vcpu->arch.sdar);
813813
break;
814-
#ifdef CONFIG_VSX
815-
case KVM_REG_PPC_FPR0 ... KVM_REG_PPC_FPR31:
816-
if (cpu_has_feature(CPU_FTR_VSX)) {
817-
/* VSX => FP reg i is stored in arch.vsr[2*i] */
818-
long int i = id - KVM_REG_PPC_FPR0;
819-
*val = get_reg_val(id, vcpu->arch.vsr[2 * i]);
820-
} else {
821-
/* let generic code handle it */
822-
r = -EINVAL;
823-
}
824-
break;
825-
case KVM_REG_PPC_VSR0 ... KVM_REG_PPC_VSR31:
826-
if (cpu_has_feature(CPU_FTR_VSX)) {
827-
long int i = id - KVM_REG_PPC_VSR0;
828-
val->vsxval[0] = vcpu->arch.vsr[2 * i];
829-
val->vsxval[1] = vcpu->arch.vsr[2 * i + 1];
830-
} else {
831-
r = -ENXIO;
832-
}
833-
break;
834-
#endif /* CONFIG_VSX */
835814
case KVM_REG_PPC_VPA_ADDR:
836815
spin_lock(&vcpu->arch.vpa_update_lock);
837816
*val = get_reg_val(id, vcpu->arch.vpa.next_gpa);
@@ -914,27 +893,6 @@ static int kvmppc_set_one_reg_hv(struct kvm_vcpu *vcpu, u64 id,
914893
case KVM_REG_PPC_SDAR:
915894
vcpu->arch.sdar = set_reg_val(id, *val);
916895
break;
917-
#ifdef CONFIG_VSX
918-
case KVM_REG_PPC_FPR0 ... KVM_REG_PPC_FPR31:
919-
if (cpu_has_feature(CPU_FTR_VSX)) {
920-
/* VSX => FP reg i is stored in arch.vsr[2*i] */
921-
long int i = id - KVM_REG_PPC_FPR0;
922-
vcpu->arch.vsr[2 * i] = set_reg_val(id, *val);
923-
} else {
924-
/* let generic code handle it */
925-
r = -EINVAL;
926-
}
927-
break;
928-
case KVM_REG_PPC_VSR0 ... KVM_REG_PPC_VSR31:
929-
if (cpu_has_feature(CPU_FTR_VSX)) {
930-
long int i = id - KVM_REG_PPC_VSR0;
931-
vcpu->arch.vsr[2 * i] = val->vsxval[0];
932-
vcpu->arch.vsr[2 * i + 1] = val->vsxval[1];
933-
} else {
934-
r = -ENXIO;
935-
}
936-
break;
937-
#endif /* CONFIG_VSX */
938896
case KVM_REG_PPC_VPA_ADDR:
939897
addr = set_reg_val(id, *val);
940898
r = -EINVAL;

arch/powerpc/kvm/book3s_hv_rmhandlers.S

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1889,7 +1889,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_VSX)
18891889
BEGIN_FTR_SECTION
18901890
reg = 0
18911891
.rept 32
1892-
li r6,reg*16+VCPU_VSRS
1892+
li r6,reg*16+VCPU_FPRS
18931893
STXVD2X(reg,R6,R3)
18941894
reg = reg + 1
18951895
.endr
@@ -1951,7 +1951,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_VSX)
19511951
BEGIN_FTR_SECTION
19521952
reg = 0
19531953
.rept 32
1954-
li r7,reg*16+VCPU_VSRS
1954+
li r7,reg*16+VCPU_FPRS
19551955
LXVD2X(reg,R7,R4)
19561956
reg = reg + 1
19571957
.endr

0 commit comments

Comments
 (0)