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