mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-02 08:34:20 +08:00
KVM: arm64: GICv4.1: Add function to get VLPI state
With GICv4.1 and the vPE unmapped, which indicates the invalidation of any VPT caches associated with the vPE, we can get the VLPI state by peeking at the VPT. So we add a function for this. Signed-off-by: Shenming Lu <lushenming@huawei.com> Signed-off-by: Marc Zyngier <maz@kernel.org> Link: https://lore.kernel.org/r/20210322060158.1584-4-lushenming@huawei.com
This commit is contained in:
parent
c21bc068cd
commit
80317fe4a6
@ -203,6 +203,25 @@ void vgic_v4_configure_vsgis(struct kvm *kvm)
|
|||||||
kvm_arm_resume_guest(kvm);
|
kvm_arm_resume_guest(kvm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Must be called with GICv4.1 and the vPE unmapped, which
|
||||||
|
* indicates the invalidation of any VPT caches associated
|
||||||
|
* with the vPE, thus we can get the VLPI state by peeking
|
||||||
|
* at the VPT.
|
||||||
|
*/
|
||||||
|
void vgic_v4_get_vlpi_state(struct vgic_irq *irq, bool *val)
|
||||||
|
{
|
||||||
|
struct its_vpe *vpe = &irq->target_vcpu->arch.vgic_cpu.vgic_v3.its_vpe;
|
||||||
|
int mask = BIT(irq->intid % BITS_PER_BYTE);
|
||||||
|
void *va;
|
||||||
|
u8 *ptr;
|
||||||
|
|
||||||
|
va = page_address(vpe->vpt_page);
|
||||||
|
ptr = va + irq->intid / BITS_PER_BYTE;
|
||||||
|
|
||||||
|
*val = !!(*ptr & mask);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* vgic_v4_init - Initialize the GICv4 data structures
|
* vgic_v4_init - Initialize the GICv4 data structures
|
||||||
* @kvm: Pointer to the VM being initialized
|
* @kvm: Pointer to the VM being initialized
|
||||||
|
@ -317,5 +317,6 @@ bool vgic_supports_direct_msis(struct kvm *kvm);
|
|||||||
int vgic_v4_init(struct kvm *kvm);
|
int vgic_v4_init(struct kvm *kvm);
|
||||||
void vgic_v4_teardown(struct kvm *kvm);
|
void vgic_v4_teardown(struct kvm *kvm);
|
||||||
void vgic_v4_configure_vsgis(struct kvm *kvm);
|
void vgic_v4_configure_vsgis(struct kvm *kvm);
|
||||||
|
void vgic_v4_get_vlpi_state(struct vgic_irq *irq, bool *val);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user