Skip to content

Commit 0090c0a

Browse files
author
Marc Zyngier
committed
KVM: arm64: Add helper computing the state of 52bit PA support
Track whether the guest is using 52bit PAs, either LPA or LPA2. This further simplifies the handling of LVA for 4k and 16k pages, as LPA2 implies LVA in this case. Reviewed-by: Oliver Upton <oliver.upton@linux.dev> Signed-off-by: Marc Zyngier <maz@kernel.org>
1 parent b320789 commit 0090c0a

2 files changed

Lines changed: 27 additions & 5 deletions

File tree

arch/arm64/include/asm/kvm_nested.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,7 @@ struct s1_walk_info {
299299
bool pan;
300300
bool be;
301301
bool s2;
302+
bool pa52bit;
302303
};
303304

304305
struct s1_walk_result {

arch/arm64/kvm/at.c

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,29 @@ static bool check_output_size(u64 ipa, struct s1_walk_info *wi)
3131
return wi->max_oa_bits < 48 && (ipa & GENMASK_ULL(47, wi->max_oa_bits));
3232
}
3333

34+
static bool has_52bit_pa(struct kvm_vcpu *vcpu, struct s1_walk_info *wi, u64 tcr)
35+
{
36+
switch (BIT(wi->pgshift)) {
37+
case SZ_64K:
38+
default: /* IMPDEF: treat any other value as 64k */
39+
if (!kvm_has_feat_enum(vcpu->kvm, ID_AA64MMFR0_EL1, PARANGE, 52))
40+
return false;
41+
return ((wi->regime == TR_EL2 ?
42+
FIELD_GET(TCR_EL2_PS_MASK, tcr) :
43+
FIELD_GET(TCR_IPS_MASK, tcr)) == 0b0110);
44+
case SZ_16K:
45+
if (!kvm_has_feat(vcpu->kvm, ID_AA64MMFR0_EL1, TGRAN16, 52_BIT))
46+
return false;
47+
break;
48+
case SZ_4K:
49+
if (!kvm_has_feat(vcpu->kvm, ID_AA64MMFR0_EL1, TGRAN4, 52_BIT))
50+
return false;
51+
break;
52+
}
53+
54+
return (tcr & (wi->regime == TR_EL2 ? TCR_EL2_DS : TCR_DS));
55+
}
56+
3457
/* Return the translation regime that applies to an AT instruction */
3558
static enum trans_regime compute_translation_regime(struct kvm_vcpu *vcpu, u32 op)
3659
{
@@ -232,15 +255,13 @@ static int setup_s1_walk(struct kvm_vcpu *vcpu, struct s1_walk_info *wi,
232255
goto transfault_l0;
233256
}
234257

258+
wi->pa52bit = has_52bit_pa(vcpu, wi, tcr);
259+
235260
/* R_GTJBY, R_SXWGM */
236261
switch (BIT(wi->pgshift)) {
237262
case SZ_4K:
238-
lva = kvm_has_feat(vcpu->kvm, ID_AA64MMFR0_EL1, TGRAN4, 52_BIT);
239-
lva &= tcr & (wi->regime == TR_EL2 ? TCR_EL2_DS : TCR_DS);
240-
break;
241263
case SZ_16K:
242-
lva = kvm_has_feat(vcpu->kvm, ID_AA64MMFR0_EL1, TGRAN16, 52_BIT);
243-
lva &= tcr & (wi->regime == TR_EL2 ? TCR_EL2_DS : TCR_DS);
264+
lva = wi->pa52bit;
244265
break;
245266
case SZ_64K:
246267
lva = kvm_has_feat(vcpu->kvm, ID_AA64MMFR2_EL1, VARange, 52);

0 commit comments

Comments
 (0)