Revision 76f5159d

b/hw/msix.c
128 128
static uint32_t msix_mmio_readl(void *opaque, target_phys_addr_t addr)
129 129
{
130 130
    PCIDevice *dev = opaque;
131
    unsigned int offset = addr & (MSIX_PAGE_SIZE - 1);
131
    unsigned int offset = addr & (MSIX_PAGE_SIZE - 1) & ~0x3;
132 132
    void *page = dev->msix_table_page;
133
    uint32_t val = 0;
134 133

  
135
    memcpy(&val, (void *)((char *)page + offset), 4);
136

  
137
    return val;
134
    return pci_get_long(page + offset);
138 135
}
139 136

  
140 137
static uint32_t msix_mmio_read_unallowed(void *opaque, target_phys_addr_t addr)
......
178 175
                             uint32_t val)
179 176
{
180 177
    PCIDevice *dev = opaque;
181
    unsigned int offset = addr & (MSIX_PAGE_SIZE - 1);
178
    unsigned int offset = addr & (MSIX_PAGE_SIZE - 1) & ~0x3;
182 179
    int vector = offset / MSIX_ENTRY_SIZE;
183
    memcpy(dev->msix_table_page + offset, &val, 4);
180
    pci_set_long(dev->msix_table_page + offset, val);
184 181
    if (!msix_is_masked(dev, vector) && msix_is_pending(dev, vector)) {
185 182
        msix_clr_pending(dev, vector);
186 183
        msix_notify(dev, vector);

Also available in: Unified diff