Skip to content
Snippets Groups Projects
  • Stefano Stabellini's avatar
    428c3ece
    fix MSI injection on Xen · 428c3ece
    Stefano Stabellini authored
    
    On Xen MSIs can be remapped into pirqs, which are a type of event
    channels. It's mostly for the benefit of PCI passthrough devices, to
    avoid the overhead of interacting with the emulated lapic.
    
    However remapping interrupts and MSIs is also supported for emulated
    devices, such as the e1000 and virtio-net.
    
    When an interrupt or an MSI is remapped into a pirq, masking and
    unmasking is done by masking and unmasking the event channel. The
    masking bit on the PCI config space or MSI-X table should be ignored,
    but it isn't at the moment.
    
    As a consequence emulated devices which use MSI or MSI-X, such as
    virtio-net, don't work properly (the guest doesn't receive any
    notifications). The mechanism was working properly when xen_apic was
    introduced, but I haven't narrowed down which commit in particular is
    causing the regression.
    
    Fix the issue by ignoring the masking bit for MSI and MSI-X which have
    been remapped into pirqs.
    
    Signed-off-by: default avatarStefano Stabellini <stefano.stabellini@eu.citrix.com>
    Reviewed-by: default avatarMichael S. Tsirkin <mst@redhat.com>
    Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
    428c3ece
    History
    fix MSI injection on Xen
    Stefano Stabellini authored
    
    On Xen MSIs can be remapped into pirqs, which are a type of event
    channels. It's mostly for the benefit of PCI passthrough devices, to
    avoid the overhead of interacting with the emulated lapic.
    
    However remapping interrupts and MSIs is also supported for emulated
    devices, such as the e1000 and virtio-net.
    
    When an interrupt or an MSI is remapped into a pirq, masking and
    unmasking is done by masking and unmasking the event channel. The
    masking bit on the PCI config space or MSI-X table should be ignored,
    but it isn't at the moment.
    
    As a consequence emulated devices which use MSI or MSI-X, such as
    virtio-net, don't work properly (the guest doesn't receive any
    notifications). The mechanism was working properly when xen_apic was
    introduced, but I haven't narrowed down which commit in particular is
    causing the regression.
    
    Fix the issue by ignoring the masking bit for MSI and MSI-X which have
    been remapped into pirqs.
    
    Signed-off-by: default avatarStefano Stabellini <stefano.stabellini@eu.citrix.com>
    Reviewed-by: default avatarMichael S. Tsirkin <mst@redhat.com>
    Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
xen-hvm-stub.c 1.19 KiB
/*
 * Copyright (C) 2010       Citrix Ltd.
 *
 * This work is licensed under the terms of the GNU GPL, version 2.  See
 * the COPYING file in the top-level directory.
 *
 * Contributions after 2012-01-13 are licensed under the terms of the
 * GNU GPL, version 2 or (at your option) any later version.
 */

#include "qemu/osdep.h"
#include "qemu-common.h"
#include "hw/xen/xen.h"
#include "exec/memory.h"
#include "qmp-commands.h"

int xen_pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num)
{
    return -1;
}

void xen_piix3_set_irq(void *opaque, int irq_num, int level)
{
}

void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, int len)
{
}

void xen_hvm_inject_msi(uint64_t addr, uint32_t data)
{
}

int xen_is_pirq_msi(uint32_t msi_data)
{
    return 0;
}

void xen_ram_alloc(ram_addr_t ram_addr, ram_addr_t size, MemoryRegion *mr,
                   Error **errp)
{
}

qemu_irq *xen_interrupt_controller_init(void)
{
    return NULL;
}

void xen_register_framebuffer(MemoryRegion *mr)
{
}

void xen_modified_memory(ram_addr_t start, ram_addr_t length)
{
}

void xen_hvm_init(PCMachineState *pcms, MemoryRegion **ram_memory)
{
}

void qmp_xen_set_global_dirty_log(bool enable, Error **errp)
{
}