summaryrefslogtreecommitdiff
path: root/arch/arm64/kvm/at.c
diff options
context:
space:
mode:
authorMarc Zyngier <maz@kernel.org>2024-06-23 10:46:45 +0100
committerMarc Zyngier <maz@kernel.org>2024-08-30 12:04:20 +0100
commitff987ffc0c18c98f05ddc7696d56bb493b994450 (patch)
treef23a58542bbe4dfb6181b57972a2d27440b02e68 /arch/arm64/kvm/at.c
parent8df747f4f3a5c680e3c0e68af3487b97343ca80a (diff)
KVM: arm64: nv: Add support for FEAT_ATS1A
Handling FEAT_ATS1A (which provides the AT S1E{1,2}A instructions) is pretty easy, as it is just the usual AT without the permission check. This basically amounts to plumbing the instructions in the various dispatch tables, and handling FEAT_ATS1A being disabled in the ID registers. Signed-off-by: Marc Zyngier <maz@kernel.org>
Diffstat (limited to 'arch/arm64/kvm/at.c')
-rw-r--r--arch/arm64/kvm/at.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/arch/arm64/kvm/at.c b/arch/arm64/kvm/at.c
index 60f1ca3a897d..39f0e87a340e 100644
--- a/arch/arm64/kvm/at.c
+++ b/arch/arm64/kvm/at.c
@@ -78,6 +78,7 @@ static enum trans_regime compute_translation_regime(struct kvm_vcpu *vcpu, u32 o
switch (op) {
case OP_AT_S1E2R:
case OP_AT_S1E2W:
+ case OP_AT_S1E2A:
return vcpu_el2_e2h_is_set(vcpu) ? TR_EL20 : TR_EL2;
break;
default:
@@ -852,6 +853,9 @@ static u64 handle_at_slow(struct kvm_vcpu *vcpu, u32 op, u64 vaddr)
case OP_AT_S1E0W:
perm_fail = !uw;
break;
+ case OP_AT_S1E1A:
+ case OP_AT_S1E2A:
+ break;
default:
BUG();
}
@@ -935,6 +939,9 @@ skip_mmu_switch:
case OP_AT_S1E0W:
fail = __kvm_at(OP_AT_S1E0W, vaddr);
break;
+ case OP_AT_S1E1A:
+ fail = __kvm_at(OP_AT_S1E1A, vaddr);
+ break;
default:
WARN_ON_ONCE(1);
fail = true;
@@ -1010,6 +1017,9 @@ void __kvm_at_s1e2(struct kvm_vcpu *vcpu, u32 op, u64 vaddr)
case OP_AT_S1E2W:
fail = __kvm_at(OP_AT_S1E1W, vaddr);
break;
+ case OP_AT_S1E2A:
+ fail = __kvm_at(OP_AT_S1E1A, vaddr);
+ break;
default:
WARN_ON_ONCE(1);
fail = true;