Skip to content

Commit 7028ac8

Browse files
iamjpnmpe
authored andcommitted
KVM: PPC: Use accessors for VCPU registers
Introduce accessor generator macros for VCPU registers. Use the accessor functions to replace direct accesses to this registers. This will be important later for Nested APIv2 support which requires additional functionality for accessing and modifying VCPU state. Signed-off-by: Jordan Niethe <jniethe5@gmail.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://msgid.link/20230914030600.16993-5-jniethe5@gmail.com
1 parent 2a64bc6 commit 7028ac8

File tree

6 files changed

+59
-24
lines changed

6 files changed

+59
-24
lines changed

arch/powerpc/include/asm/kvm_book3s.h

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -458,10 +458,45 @@ static inline void kvmppc_set_vscr(struct kvm_vcpu *vcpu, u32 val)
458458
}
459459
#endif
460460

461+
#define KVMPPC_BOOK3S_VCPU_ACCESSOR_SET(reg, size) \
462+
static inline void kvmppc_set_##reg(struct kvm_vcpu *vcpu, u##size val) \
463+
{ \
464+
\
465+
vcpu->arch.reg = val; \
466+
}
467+
468+
#define KVMPPC_BOOK3S_VCPU_ACCESSOR_GET(reg, size) \
469+
static inline u##size kvmppc_get_##reg(struct kvm_vcpu *vcpu) \
470+
{ \
471+
return vcpu->arch.reg; \
472+
}
473+
474+
#define KVMPPC_BOOK3S_VCPU_ACCESSOR(reg, size) \
475+
KVMPPC_BOOK3S_VCPU_ACCESSOR_SET(reg, size) \
476+
KVMPPC_BOOK3S_VCPU_ACCESSOR_GET(reg, size) \
477+
478+
KVMPPC_BOOK3S_VCPU_ACCESSOR(pid, 32)
479+
KVMPPC_BOOK3S_VCPU_ACCESSOR(tar, 64)
480+
KVMPPC_BOOK3S_VCPU_ACCESSOR(ebbhr, 64)
481+
KVMPPC_BOOK3S_VCPU_ACCESSOR(ebbrr, 64)
482+
KVMPPC_BOOK3S_VCPU_ACCESSOR(bescr, 64)
483+
KVMPPC_BOOK3S_VCPU_ACCESSOR(ic, 64)
484+
KVMPPC_BOOK3S_VCPU_ACCESSOR(vrsave, 64)
485+
486+
static inline u64 kvmppc_get_dec_expires(struct kvm_vcpu *vcpu)
487+
{
488+
return vcpu->arch.dec_expires;
489+
}
490+
491+
static inline void kvmppc_set_dec_expires(struct kvm_vcpu *vcpu, u64 val)
492+
{
493+
vcpu->arch.dec_expires = val;
494+
}
495+
461496
/* Expiry time of vcpu DEC relative to host TB */
462497
static inline u64 kvmppc_dec_expires_host_tb(struct kvm_vcpu *vcpu)
463498
{
464-
return vcpu->arch.dec_expires - vcpu->arch.vcore->tb_offset;
499+
return kvmppc_get_dec_expires(vcpu) - vcpu->arch.vcore->tb_offset;
465500
}
466501

467502
static inline bool is_kvmppc_resume_guest(int r)

arch/powerpc/kvm/book3s.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -565,7 +565,7 @@ int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
565565
regs->msr = kvmppc_get_msr(vcpu);
566566
regs->srr0 = kvmppc_get_srr0(vcpu);
567567
regs->srr1 = kvmppc_get_srr1(vcpu);
568-
regs->pid = vcpu->arch.pid;
568+
regs->pid = kvmppc_get_pid(vcpu);
569569
regs->sprg0 = kvmppc_get_sprg0(vcpu);
570570
regs->sprg1 = kvmppc_get_sprg1(vcpu);
571571
regs->sprg2 = kvmppc_get_sprg2(vcpu);
@@ -683,19 +683,19 @@ int kvmppc_get_one_reg(struct kvm_vcpu *vcpu, u64 id,
683683
*val = get_reg_val(id, vcpu->arch.fscr);
684684
break;
685685
case KVM_REG_PPC_TAR:
686-
*val = get_reg_val(id, vcpu->arch.tar);
686+
*val = get_reg_val(id, kvmppc_get_tar(vcpu));
687687
break;
688688
case KVM_REG_PPC_EBBHR:
689-
*val = get_reg_val(id, vcpu->arch.ebbhr);
689+
*val = get_reg_val(id, kvmppc_get_ebbhr(vcpu));
690690
break;
691691
case KVM_REG_PPC_EBBRR:
692-
*val = get_reg_val(id, vcpu->arch.ebbrr);
692+
*val = get_reg_val(id, kvmppc_get_ebbrr(vcpu));
693693
break;
694694
case KVM_REG_PPC_BESCR:
695-
*val = get_reg_val(id, vcpu->arch.bescr);
695+
*val = get_reg_val(id, kvmppc_get_bescr(vcpu));
696696
break;
697697
case KVM_REG_PPC_IC:
698-
*val = get_reg_val(id, vcpu->arch.ic);
698+
*val = get_reg_val(id, kvmppc_get_ic(vcpu));
699699
break;
700700
default:
701701
r = -EINVAL;
@@ -768,19 +768,19 @@ int kvmppc_set_one_reg(struct kvm_vcpu *vcpu, u64 id,
768768
kvmppc_set_fpscr(vcpu, set_reg_val(id, *val));
769769
break;
770770
case KVM_REG_PPC_TAR:
771-
vcpu->arch.tar = set_reg_val(id, *val);
771+
kvmppc_set_tar(vcpu, set_reg_val(id, *val));
772772
break;
773773
case KVM_REG_PPC_EBBHR:
774-
vcpu->arch.ebbhr = set_reg_val(id, *val);
774+
kvmppc_set_ebbhr(vcpu, set_reg_val(id, *val));
775775
break;
776776
case KVM_REG_PPC_EBBRR:
777-
vcpu->arch.ebbrr = set_reg_val(id, *val);
777+
kvmppc_set_ebbrr(vcpu, set_reg_val(id, *val));
778778
break;
779779
case KVM_REG_PPC_BESCR:
780-
vcpu->arch.bescr = set_reg_val(id, *val);
780+
kvmppc_set_bescr(vcpu, set_reg_val(id, *val));
781781
break;
782782
case KVM_REG_PPC_IC:
783-
vcpu->arch.ic = set_reg_val(id, *val);
783+
kvmppc_set_ic(vcpu, set_reg_val(id, *val));
784784
break;
785785
default:
786786
r = -EINVAL;

arch/powerpc/kvm/book3s_64_mmu_radix.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ static long kvmhv_copy_tofrom_guest_radix(struct kvm_vcpu *vcpu, gva_t eaddr,
9696
void *to, void *from, unsigned long n)
9797
{
9898
int lpid = vcpu->kvm->arch.lpid;
99-
int pid = vcpu->arch.pid;
99+
int pid = kvmppc_get_pid(vcpu);
100100

101101
/* This would cause a data segment intr so don't allow the access */
102102
if (eaddr & (0x3FFUL << 52))
@@ -270,7 +270,7 @@ int kvmppc_mmu_radix_xlate(struct kvm_vcpu *vcpu, gva_t eaddr,
270270
/* Work out effective PID */
271271
switch (eaddr >> 62) {
272272
case 0:
273-
pid = vcpu->arch.pid;
273+
pid = kvmppc_get_pid(vcpu);
274274
break;
275275
case 3:
276276
pid = 0;

arch/powerpc/kvm/book3s_hv.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2310,7 +2310,7 @@ static int kvmppc_get_one_reg_hv(struct kvm_vcpu *vcpu, u64 id,
23102310
*val = get_reg_val(id, vcpu->arch.tcscr);
23112311
break;
23122312
case KVM_REG_PPC_PID:
2313-
*val = get_reg_val(id, vcpu->arch.pid);
2313+
*val = get_reg_val(id, kvmppc_get_pid(vcpu));
23142314
break;
23152315
case KVM_REG_PPC_ACOP:
23162316
*val = get_reg_val(id, vcpu->arch.acop);
@@ -2421,7 +2421,7 @@ static int kvmppc_get_one_reg_hv(struct kvm_vcpu *vcpu, u64 id,
24212421
*val = get_reg_val(id, vcpu->arch.vcore->arch_compat);
24222422
break;
24232423
case KVM_REG_PPC_DEC_EXPIRY:
2424-
*val = get_reg_val(id, vcpu->arch.dec_expires);
2424+
*val = get_reg_val(id, kvmppc_get_dec_expires(vcpu));
24252425
break;
24262426
case KVM_REG_PPC_ONLINE:
24272427
*val = get_reg_val(id, vcpu->arch.online);
@@ -2553,7 +2553,7 @@ static int kvmppc_set_one_reg_hv(struct kvm_vcpu *vcpu, u64 id,
25532553
vcpu->arch.tcscr = set_reg_val(id, *val);
25542554
break;
25552555
case KVM_REG_PPC_PID:
2556-
vcpu->arch.pid = set_reg_val(id, *val);
2556+
kvmppc_set_pid(vcpu, set_reg_val(id, *val));
25572557
break;
25582558
case KVM_REG_PPC_ACOP:
25592559
vcpu->arch.acop = set_reg_val(id, *val);
@@ -2606,8 +2606,8 @@ static int kvmppc_set_one_reg_hv(struct kvm_vcpu *vcpu, u64 id,
26062606
* decrementer, which is better than a large one that
26072607
* causes a hang.
26082608
*/
2609-
if (!vcpu->arch.dec_expires && tb_offset)
2610-
vcpu->arch.dec_expires = get_tb() + tb_offset;
2609+
if (!kvmppc_get_dec_expires(vcpu) && tb_offset)
2610+
kvmppc_set_dec_expires(vcpu, get_tb() + tb_offset);
26112611

26122612
vcpu->arch.vcore->tb_offset = tb_offset;
26132613
break;
@@ -2690,7 +2690,7 @@ static int kvmppc_set_one_reg_hv(struct kvm_vcpu *vcpu, u64 id,
26902690
r = kvmppc_set_arch_compat(vcpu, set_reg_val(id, *val));
26912691
break;
26922692
case KVM_REG_PPC_DEC_EXPIRY:
2693-
vcpu->arch.dec_expires = set_reg_val(id, *val);
2693+
kvmppc_set_dec_expires(vcpu, set_reg_val(id, *val));
26942694
break;
26952695
case KVM_REG_PPC_ONLINE:
26962696
i = set_reg_val(id, *val);

arch/powerpc/kvm/book3s_hv_p9_entry.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ static void switch_mmu_to_guest_radix(struct kvm *kvm, struct kvm_vcpu *vcpu, u6
305305
u32 pid;
306306

307307
lpid = nested ? nested->shadow_lpid : kvm->arch.lpid;
308-
pid = vcpu->arch.pid;
308+
pid = kvmppc_get_pid(vcpu);
309309

310310
/*
311311
* Prior memory accesses to host PID Q3 must be completed before we
@@ -330,7 +330,7 @@ static void switch_mmu_to_guest_hpt(struct kvm *kvm, struct kvm_vcpu *vcpu, u64
330330
int i;
331331

332332
lpid = kvm->arch.lpid;
333-
pid = vcpu->arch.pid;
333+
pid = kvmppc_get_pid(vcpu);
334334

335335
/*
336336
* See switch_mmu_to_guest_radix. ptesync should not be required here

arch/powerpc/kvm/powerpc.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1729,7 +1729,7 @@ int kvm_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg)
17291729
val = get_reg_val(reg->id, kvmppc_get_vscr(vcpu));
17301730
break;
17311731
case KVM_REG_PPC_VRSAVE:
1732-
val = get_reg_val(reg->id, vcpu->arch.vrsave);
1732+
val = get_reg_val(reg->id, kvmppc_get_vrsave(vcpu));
17331733
break;
17341734
#endif /* CONFIG_ALTIVEC */
17351735
default:
@@ -1784,7 +1784,7 @@ int kvm_vcpu_ioctl_set_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg)
17841784
r = -ENXIO;
17851785
break;
17861786
}
1787-
vcpu->arch.vrsave = set_reg_val(reg->id, val);
1787+
kvmppc_set_vrsave(vcpu, set_reg_val(reg->id, val));
17881788
break;
17891789
#endif /* CONFIG_ALTIVEC */
17901790
default:

0 commit comments

Comments
 (0)