Skip to content

Commit c8ae9b3

Browse files
iamjpnmpe
authored andcommitted
KVM: PPC: Use accessors for VCORE registers
Introduce accessor generator macros for VCORE 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-6-jniethe5@gmail.com
1 parent 7028ac8 commit c8ae9b3

File tree

4 files changed

+39
-18
lines changed

4 files changed

+39
-18
lines changed

arch/powerpc/include/asm/kvm_book3s.h

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,29 @@ KVMPPC_BOOK3S_VCPU_ACCESSOR(bescr, 64)
483483
KVMPPC_BOOK3S_VCPU_ACCESSOR(ic, 64)
484484
KVMPPC_BOOK3S_VCPU_ACCESSOR(vrsave, 64)
485485

486+
487+
#define KVMPPC_BOOK3S_VCORE_ACCESSOR_SET(reg, size) \
488+
static inline void kvmppc_set_##reg(struct kvm_vcpu *vcpu, u##size val) \
489+
{ \
490+
vcpu->arch.vcore->reg = val; \
491+
}
492+
493+
#define KVMPPC_BOOK3S_VCORE_ACCESSOR_GET(reg, size) \
494+
static inline u##size kvmppc_get_##reg(struct kvm_vcpu *vcpu) \
495+
{ \
496+
return vcpu->arch.vcore->reg; \
497+
}
498+
499+
#define KVMPPC_BOOK3S_VCORE_ACCESSOR(reg, size) \
500+
KVMPPC_BOOK3S_VCORE_ACCESSOR_SET(reg, size) \
501+
KVMPPC_BOOK3S_VCORE_ACCESSOR_GET(reg, size) \
502+
503+
504+
KVMPPC_BOOK3S_VCORE_ACCESSOR(vtb, 64)
505+
KVMPPC_BOOK3S_VCORE_ACCESSOR(tb_offset, 64)
506+
KVMPPC_BOOK3S_VCORE_ACCESSOR_GET(arch_compat, 32)
507+
KVMPPC_BOOK3S_VCORE_ACCESSOR_GET(lpcr, 64)
508+
486509
static inline u64 kvmppc_get_dec_expires(struct kvm_vcpu *vcpu)
487510
{
488511
return vcpu->arch.dec_expires;
@@ -496,7 +519,7 @@ static inline void kvmppc_set_dec_expires(struct kvm_vcpu *vcpu, u64 val)
496519
/* Expiry time of vcpu DEC relative to host TB */
497520
static inline u64 kvmppc_dec_expires_host_tb(struct kvm_vcpu *vcpu)
498521
{
499-
return kvmppc_get_dec_expires(vcpu) - vcpu->arch.vcore->tb_offset;
522+
return kvmppc_get_dec_expires(vcpu) - kvmppc_get_tb_offset(vcpu);
500523
}
501524

502525
static inline bool is_kvmppc_resume_guest(int r)

arch/powerpc/kvm/book3s_hv.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -794,7 +794,7 @@ static void kvmppc_update_vpa_dispatch(struct kvm_vcpu *vcpu,
794794

795795
vpa->enqueue_dispatch_tb = cpu_to_be64(be64_to_cpu(vpa->enqueue_dispatch_tb) + stolen);
796796

797-
__kvmppc_create_dtl_entry(vcpu, vpa, vc->pcpu, now + vc->tb_offset, stolen);
797+
__kvmppc_create_dtl_entry(vcpu, vpa, vc->pcpu, now + kvmppc_get_tb_offset(vcpu), stolen);
798798

799799
vcpu->arch.vpa.dirty = true;
800800
}
@@ -845,9 +845,9 @@ static bool kvmppc_doorbell_pending(struct kvm_vcpu *vcpu)
845845

846846
static bool kvmppc_power8_compatible(struct kvm_vcpu *vcpu)
847847
{
848-
if (vcpu->arch.vcore->arch_compat >= PVR_ARCH_207)
848+
if (kvmppc_get_arch_compat(vcpu) >= PVR_ARCH_207)
849849
return true;
850-
if ((!vcpu->arch.vcore->arch_compat) &&
850+
if ((!kvmppc_get_arch_compat(vcpu)) &&
851851
cpu_has_feature(CPU_FTR_ARCH_207S))
852852
return true;
853853
return false;
@@ -2283,7 +2283,7 @@ static int kvmppc_get_one_reg_hv(struct kvm_vcpu *vcpu, u64 id,
22832283
*val = get_reg_val(id, vcpu->arch.vcore->dpdes);
22842284
break;
22852285
case KVM_REG_PPC_VTB:
2286-
*val = get_reg_val(id, vcpu->arch.vcore->vtb);
2286+
*val = get_reg_val(id, kvmppc_get_vtb(vcpu));
22872287
break;
22882288
case KVM_REG_PPC_DAWR:
22892289
*val = get_reg_val(id, vcpu->arch.dawr0);
@@ -2342,11 +2342,11 @@ static int kvmppc_get_one_reg_hv(struct kvm_vcpu *vcpu, u64 id,
23422342
spin_unlock(&vcpu->arch.vpa_update_lock);
23432343
break;
23442344
case KVM_REG_PPC_TB_OFFSET:
2345-
*val = get_reg_val(id, vcpu->arch.vcore->tb_offset);
2345+
*val = get_reg_val(id, kvmppc_get_tb_offset(vcpu));
23462346
break;
23472347
case KVM_REG_PPC_LPCR:
23482348
case KVM_REG_PPC_LPCR_64:
2349-
*val = get_reg_val(id, vcpu->arch.vcore->lpcr);
2349+
*val = get_reg_val(id, kvmppc_get_lpcr(vcpu));
23502350
break;
23512351
case KVM_REG_PPC_PPR:
23522352
*val = get_reg_val(id, vcpu->arch.ppr);
@@ -2418,7 +2418,7 @@ static int kvmppc_get_one_reg_hv(struct kvm_vcpu *vcpu, u64 id,
24182418
break;
24192419
#endif
24202420
case KVM_REG_PPC_ARCH_COMPAT:
2421-
*val = get_reg_val(id, vcpu->arch.vcore->arch_compat);
2421+
*val = get_reg_val(id, kvmppc_get_arch_compat(vcpu));
24222422
break;
24232423
case KVM_REG_PPC_DEC_EXPIRY:
24242424
*val = get_reg_val(id, kvmppc_get_dec_expires(vcpu));
@@ -2523,7 +2523,7 @@ static int kvmppc_set_one_reg_hv(struct kvm_vcpu *vcpu, u64 id,
25232523
vcpu->arch.vcore->dpdes = set_reg_val(id, *val);
25242524
break;
25252525
case KVM_REG_PPC_VTB:
2526-
vcpu->arch.vcore->vtb = set_reg_val(id, *val);
2526+
kvmppc_set_vtb(vcpu, set_reg_val(id, *val));
25272527
break;
25282528
case KVM_REG_PPC_DAWR:
25292529
vcpu->arch.dawr0 = set_reg_val(id, *val);
@@ -2606,10 +2606,11 @@ 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+
kvmppc_set_tb_offset(vcpu, tb_offset);
26092610
if (!kvmppc_get_dec_expires(vcpu) && tb_offset)
26102611
kvmppc_set_dec_expires(vcpu, get_tb() + tb_offset);
26112612

2612-
vcpu->arch.vcore->tb_offset = tb_offset;
2613+
kvmppc_set_tb_offset(vcpu, tb_offset);
26132614
break;
26142615
}
26152616
case KVM_REG_PPC_LPCR:
@@ -4042,7 +4043,6 @@ static void vcpu_vpa_increment_dispatch(struct kvm_vcpu *vcpu)
40424043
/* call our hypervisor to load up HV regs and go */
40434044
static int kvmhv_vcpu_entry_p9_nested(struct kvm_vcpu *vcpu, u64 time_limit, unsigned long lpcr, u64 *tb)
40444045
{
4045-
struct kvmppc_vcore *vc = vcpu->arch.vcore;
40464046
unsigned long host_psscr;
40474047
unsigned long msr;
40484048
struct hv_guest_state hvregs;
@@ -4122,7 +4122,7 @@ static int kvmhv_vcpu_entry_p9_nested(struct kvm_vcpu *vcpu, u64 time_limit, uns
41224122
if (!(lpcr & LPCR_LD)) /* Sign extend if not using large decrementer */
41234123
dec = (s32) dec;
41244124
*tb = mftb();
4125-
vcpu->arch.dec_expires = dec + (*tb + vc->tb_offset);
4125+
vcpu->arch.dec_expires = dec + (*tb + kvmppc_get_tb_offset(vcpu));
41264126

41274127
timer_rearm_host_dec(*tb);
41284128

@@ -4681,7 +4681,7 @@ int kvmhv_run_single_vcpu(struct kvm_vcpu *vcpu, u64 time_limit,
46814681

46824682
tb = mftb();
46834683

4684-
kvmppc_update_vpa_dispatch_p9(vcpu, vc, tb + vc->tb_offset);
4684+
kvmppc_update_vpa_dispatch_p9(vcpu, vc, tb + kvmppc_get_tb_offset(vcpu));
46854685

46864686
trace_kvm_guest_enter(vcpu);
46874687

arch/powerpc/kvm/book3s_hv_ras.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,14 +174,14 @@ long kvmppc_p9_realmode_hmi_handler(struct kvm_vcpu *vcpu)
174174
ppc_md.hmi_exception_early(NULL);
175175

176176
out:
177-
if (vc->tb_offset) {
177+
if (kvmppc_get_tb_offset(vcpu)) {
178178
u64 new_tb = mftb() + vc->tb_offset;
179179
mtspr(SPRN_TBU40, new_tb);
180180
if ((mftb() & 0xffffff) < (new_tb & 0xffffff)) {
181181
new_tb += 0x1000000;
182182
mtspr(SPRN_TBU40, new_tb);
183183
}
184-
vc->tb_offset_applied = vc->tb_offset;
184+
vc->tb_offset_applied = kvmppc_get_tb_offset(vcpu);
185185
}
186186

187187
return ret;

arch/powerpc/kvm/book3s_xive.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2779,8 +2779,6 @@ static int kvmppc_xive_create(struct kvm_device *dev, u32 type)
27792779

27802780
int kvmppc_xive_xics_hcall(struct kvm_vcpu *vcpu, u32 req)
27812781
{
2782-
struct kvmppc_vcore *vc = vcpu->arch.vcore;
2783-
27842782
/* The VM should have configured XICS mode before doing XICS hcalls. */
27852783
if (!kvmppc_xics_enabled(vcpu))
27862784
return H_TOO_HARD;
@@ -2799,7 +2797,7 @@ int kvmppc_xive_xics_hcall(struct kvm_vcpu *vcpu, u32 req)
27992797
return xive_vm_h_ipoll(vcpu, kvmppc_get_gpr(vcpu, 4));
28002798
case H_XIRR_X:
28012799
xive_vm_h_xirr(vcpu);
2802-
kvmppc_set_gpr(vcpu, 5, get_tb() + vc->tb_offset);
2800+
kvmppc_set_gpr(vcpu, 5, get_tb() + kvmppc_get_tb_offset(vcpu));
28032801
return H_SUCCESS;
28042802
}
28052803

0 commit comments

Comments
 (0)