mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git
synced 2026-04-18 03:23:53 -04:00
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: Marc Zyngier <maz@kernel.org>
This commit is contained in:
@@ -49,6 +49,28 @@ static void __mmu_config_restore(struct mmu_config *config)
|
||||
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.
|
||||
*
|
||||
@@ -105,6 +127,10 @@ skip_mmu_switch:
|
||||
isb();
|
||||
|
||||
switch (op) {
|
||||
case OP_AT_S1E1RP:
|
||||
case OP_AT_S1E1WP:
|
||||
fail = at_s1e1p_fast(vcpu, op, vaddr);
|
||||
break;
|
||||
case OP_AT_S1E1R:
|
||||
fail = __kvm_at(OP_AT_S1E1R, vaddr);
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user