amd64 vol 3 16.6.1: "In both the flat model and the cluster model, if the destination field = FFh, the interrupt is accepted by all local APICs." 16.14: "A DEST value of FFFF_FFFFh in the ICR is used to broadcast IPIs to all local APICs."
intel 64 vol 3 12.6.2.2: "Broadcast to all local APICs is achieved by setting all destination bits to one." 12.12.9: "A destination ID value of FFFF_FFFFH is used for broadcast of interrupts in both logical destination and physical destination modes." The specs say 0xFFFFFFFF/0xFF should be a broadcast to all APICs in logical destination mode but it is matched only for cluster 0xFFFF/0xFF (or as flat mode in xAPIC). Add a check in vlapic_match_dest similar to what is done for physical destination mode. Signed-off-by: Victor Lira <[email protected]> --- xen/arch/x86/hvm/vlapic.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xen/arch/x86/hvm/vlapic.c b/xen/arch/x86/hvm/vlapic.c index 79697487ba..1208cd21f0 100644 --- a/xen/arch/x86/hvm/vlapic.c +++ b/xen/arch/x86/hvm/vlapic.c @@ -248,7 +248,8 @@ bool vlapic_match_dest( { case APIC_DEST_NOSHORT: if ( dest_mode ) - return vlapic_match_logical_addr(target, dest); + return (dest == _VLAPIC_ID(target, 0xffffffffU)) || + vlapic_match_logical_addr(target, dest); return (dest == _VLAPIC_ID(target, 0xffffffffU)) || (dest == VLAPIC_ID(target)); -- 2.51.GIT
