Expose the GICv3 SGI decoder so Realm sysreg exits can reuse Xen's normal ICC_SGI1R_EL1 handling.
Signed-off-by: Koichiro Den <[email protected]> --- xen/arch/arm/include/asm/vgic.h | 10 ++++++++++ xen/arch/arm/vgic-v3.c | 4 +++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/xen/arch/arm/include/asm/vgic.h b/xen/arch/arm/include/asm/vgic.h index 6f9ab1c98c1c..93f5e3ba40fc 100644 --- a/xen/arch/arm/include/asm/vgic.h +++ b/xen/arch/arm/include/asm/vgic.h @@ -336,6 +336,9 @@ extern void vgic_set_irqs_pending(struct vcpu *v, uint32_t r, extern void register_vgic_ops(struct domain *d, const struct vgic_ops *ops); int vgic_v2_init(struct domain *d, unsigned int *mmio_count); int vgic_v3_init(struct domain *d, unsigned int *mmio_count); +#ifdef CONFIG_GICV3 +bool vgic_v3_to_sgi(struct vcpu *v, uint64_t sgir); +#endif extern bool vgic_to_sgi(struct vcpu *v, register_t sgir, enum gic_sgi_mode irqmode, int virq, @@ -346,6 +349,13 @@ extern void vgic_check_inflight_irqs_pending(struct vcpu *v, #endif /* !CONFIG_NEW_VGIC */ +#if defined(CONFIG_NEW_VGIC) || !defined(CONFIG_GICV3) +static inline bool vgic_v3_to_sgi(struct vcpu *v, uint64_t sgir) +{ + return false; +} +#endif + /*** Common VGIC functions used by Xen arch code ****/ /* diff --git a/xen/arch/arm/vgic-v3.c b/xen/arch/arm/vgic-v3.c index 77517c303061..9cb1495bba97 100644 --- a/xen/arch/arm/vgic-v3.c +++ b/xen/arch/arm/vgic-v3.c @@ -1600,13 +1600,15 @@ write_reserved: return 1; } -static bool vgic_v3_to_sgi(struct vcpu *v, uint64_t sgir) +bool vgic_v3_to_sgi(struct vcpu *v, uint64_t sgir) { int virq; int irqmode; enum gic_sgi_mode sgi_mode; struct sgi_target target; + ASSERT(v == current); + sgi_target_init(&target); irqmode = (sgir >> ICH_SGI_IRQMODE_SHIFT) & ICH_SGI_IRQMODE_MASK; virq = (sgir >> ICH_SGI_IRQ_SHIFT ) & ICH_SGI_IRQ_MASK; -- 2.51.0
