@@ -317,6 +317,8 @@ static void spapr_xive_realize(DeviceState *dev, Error **errp)
*/
object_property_set_int(OBJECT(xsrc), "nr-irqs", xive->nr_irqs,
&error_fatal);
+ object_property_set_int(OBJECT(xsrc), "flags", XIVE_SRC_STORE_EOI,
+ &error_fatal);
object_property_set_link(OBJECT(xsrc), "xive", OBJECT(xive), &error_abort);
if (!qdev_realize(DEVICE(xsrc), NULL, errp)) {
return;
@@ -998,6 +998,12 @@ static uint64_t xive_source_esb_read(void *opaque, hwaddr addr, unsigned size)
case XIVE_ESB_SET_PQ_01 ... XIVE_ESB_SET_PQ_01 + 0x0FF:
case XIVE_ESB_SET_PQ_10 ... XIVE_ESB_SET_PQ_10 + 0x0FF:
case XIVE_ESB_SET_PQ_11 ... XIVE_ESB_SET_PQ_11 + 0x0FF:
+ if (offset == XIVE_ESB_SET_PQ_10 &&
+ xsrc->esb_flags & XIVE_SRC_STORE_EOI) {
+ qemu_log_mask(LOG_GUEST_ERROR, "XIVE: load-after-store ordering "
+ "not enforced with Store EOI active for IRQ %d\n",
+ srcno);
+ }
ret = xive_source_esb_set(xsrc, srcno, (offset >> 8) & 0x3);
break;
default:
Now that we check the XIVE characteristics of the sources at the KVM level, we can configure the sources to use StoreEOI by default. This feature will be activated for the emulated mode and possibly for KVM also if compatible. Signed-off-by: Cédric Le Goater <clg@kaod.org> --- hw/intc/spapr_xive.c | 2 ++ hw/intc/xive.c | 6 ++++++ 2 files changed, 8 insertions(+)