Commit 7cd5c279 authored by Marc Zyngier's avatar Marc Zyngier Committed by Oliver Upton
Browse files

KVM: arm64: Make PAN conditions part of the S1 walk context



Move the conditions describing PAN as part of the s1_walk_info
structure, in an effort to declutter the permission processing.

Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20241023145345.1613824-36-maz@kernel.org


Signed-off-by: default avatarOliver Upton <oliver.upton@linux.dev>
parent 8a9b304d
Loading
Loading
Loading
Loading
+11 −10
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ struct s1_walk_info {
	bool	     		hpd;
	bool			e0poe;
	bool			poe;
	bool			pan;
	bool	     		be;
	bool	     		s2;
};
@@ -151,6 +152,8 @@ static int setup_s1_walk(struct kvm_vcpu *vcpu, u32 op, struct s1_walk_info *wi,

	wi->regime = compute_translation_regime(vcpu, op);
	as_el0 = (op == OP_AT_S1E0R || op == OP_AT_S1E0W);
	wi->pan = (op == OP_AT_S1E1RP || op == OP_AT_S1E1WP) &&
		  (*vcpu_cpsr(vcpu) & PSR_PAN_BIT);

	va55 = va & BIT(55);

@@ -1020,10 +1023,12 @@ static void compute_s1_indirect_permissions(struct kvm_vcpu *vcpu,
	}
}

static void compute_s1_permissions(struct kvm_vcpu *vcpu, u32 op,
static void compute_s1_permissions(struct kvm_vcpu *vcpu,
				   struct s1_walk_info *wi,
				   struct s1_walk_result *wr)
{
	bool pan;

	if (!s1pie_enabled(vcpu, wi->regime))
		compute_s1_direct_permissions(vcpu, wi, wr);
	else
@@ -1032,15 +1037,11 @@ static void compute_s1_permissions(struct kvm_vcpu *vcpu, u32 op,
	if (!wi->hpd)
		compute_s1_hierarchical_permissions(vcpu, wi, wr);

	if (op == OP_AT_S1E1RP || op == OP_AT_S1E1WP) {
		bool pan;

		pan = *vcpu_cpsr(vcpu) & PSR_PAN_BIT;
		pan &= wr->ur || wr->uw || (pan3_enabled(vcpu, wi->regime) && wr->ux);
	pan = wi->pan && (wr->ur || wr->uw ||
			  (pan3_enabled(vcpu, wi->regime) && wr->ux));
	wr->pw &= !pan;
	wr->pr &= !pan;
}
}

static u64 handle_at_slow(struct kvm_vcpu *vcpu, u32 op, u64 vaddr)
{
@@ -1065,7 +1066,7 @@ static u64 handle_at_slow(struct kvm_vcpu *vcpu, u32 op, u64 vaddr)
	if (ret)
		goto compute_par;

	compute_s1_permissions(vcpu, op, &wi, &wr);
	compute_s1_permissions(vcpu, &wi, &wr);

	switch (op) {
	case OP_AT_S1E1RP: