]> xenbits.xensource.com Git - xen.git/commit
x86/apic: fix disabling LVT0 in disconnect_bsp_APIC
authorRoger Pau Monné <roger.pau@citrix.com>
Thu, 5 Mar 2020 09:56:38 +0000 (10:56 +0100)
committerJan Beulich <jbeulich@suse.com>
Thu, 5 Mar 2020 09:56:38 +0000 (10:56 +0100)
commitc080e5b43dcc62d1c4d9a05fbb17e3b8d95f8eaa
treeb043b90adbe9d520611ca569c4cb61bb4cd4644e
parent7f11b1c7756f2e7d85c358946f1496f3a899702b
x86/apic: fix disabling LVT0 in disconnect_bsp_APIC

The Intel SDM states:

"When an illegal vector value (0 to 15) is written to a LVT entry and
the delivery mode is Fixed (bits 8-11 equal 0), the APIC may signal an
illegal vector error, without regard to whether the mask bit is set or
whether an interrupt is actually seen on the input."

And that's exactly what's currently done in disconnect_bsp_APIC when
virt_wire_setup is true and LVT LINT0 is being masked. By writing only
APIC_LVT_MASKED Xen is actually setting the vector to 0 and the
delivery mode to Fixed (0), and hence it triggers an APIC error even
when the LVT entry is masked.

This would usually manifest when Xen is being shut down, as that's
where disconnect_bsp_APIC is called:

(XEN) APIC error on CPU0: 40(00)

Fix this by calling clear_local_APIC prior to setting the LVT LINT
registers which already clear LVT LINT0, and hence the troublesome
write can be avoided as the register is already cleared.

Reported-by: Andrew Cooper <andrew.cooper3@citrix.com>
Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
master commit: 782b48b7f7319c07b044606d67a60875e53dd05b
master date: 2020-01-29 14:47:00 +0100
xen/arch/x86/apic.c