Commit be0135bd authored by Marc Zyngier's avatar Marc Zyngier

KVM: arm64: nv: Add basic emulation of AT S1E1{R,W}P

Building on top of our primitive AT S1E{0,1}{R,W} emulation,
add minimal support for the FEAT_PAN2 instructions, momentary
context-switching PSTATE.PAN so that it takes effect in the
context of the guest.
Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
parent 477e89ca
...@@ -49,6 +49,28 @@ static void __mmu_config_restore(struct mmu_config *config) ...@@ -49,6 +49,28 @@ static void __mmu_config_restore(struct mmu_config *config)
write_sysreg(config->vtcr, vtcr_el2); write_sysreg(config->vtcr, vtcr_el2);
} }
static bool at_s1e1p_fast(struct kvm_vcpu *vcpu, u32 op, u64 vaddr)
{
u64 host_pan;
bool fail;
host_pan = read_sysreg_s(SYS_PSTATE_PAN);
write_sysreg_s(*vcpu_cpsr(vcpu) & PSTATE_PAN, SYS_PSTATE_PAN);
switch (op) {
case OP_AT_S1E1RP:
fail = __kvm_at(OP_AT_S1E1RP, vaddr);
break;
case OP_AT_S1E1WP:
fail = __kvm_at(OP_AT_S1E1WP, vaddr);
break;
}
write_sysreg_s(host_pan, SYS_PSTATE_PAN);
return fail;
}
/* /*
* Return the PAR_EL1 value as the result of a valid translation. * Return the PAR_EL1 value as the result of a valid translation.
* *
...@@ -105,6 +127,10 @@ static u64 __kvm_at_s1e01_fast(struct kvm_vcpu *vcpu, u32 op, u64 vaddr) ...@@ -105,6 +127,10 @@ static u64 __kvm_at_s1e01_fast(struct kvm_vcpu *vcpu, u32 op, u64 vaddr)
isb(); isb();
switch (op) { switch (op) {
case OP_AT_S1E1RP:
case OP_AT_S1E1WP:
fail = at_s1e1p_fast(vcpu, op, vaddr);
break;
case OP_AT_S1E1R: case OP_AT_S1E1R:
fail = __kvm_at(OP_AT_S1E1R, vaddr); fail = __kvm_at(OP_AT_S1E1R, vaddr);
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment