@@ -625,16 +625,22 @@ uint32_t pci_default_read_config(PCIDevice *d,
return pcie_config_get(d, address, len);
}
-void pci_default_write_config(PCIDevice *d, uint32_t addr, uint32_t val, int l)
+static void pci_default_write_config_common(PCIDevice *d,
+ uint32_t addr, uint32_t val, int l)
{
int i;
uint32_t config_size = pcie_config_size(d);
+ assert(l == 1 || l == 2 || l == 4);
for(i = 0; i < l && addr < config_size; val >>= 8, ++i, ++addr) {
uint8_t wmask = d->wmask[addr];
d->config[addr] = (d->config[addr] & ~wmask) | (val & wmask);
}
+}
+void pci_default_write_config(PCIDevice *d, uint32_t addr, uint32_t val, int l)
+{
+ pci_default_write_config_common(d, addr, val, l);
if (pci_config_changed(addr, l,
PCI_BASE_ADDRESS_0, PCI_BASE_ADDRESS_5 + 4) ||
pci_config_changed_with_size(addr, l, PCI_ROM_ADDRESS, 4)) {
Updating BAR in pci bar is specific to header type 00. So split out the logic to common to header type 01 which will be used later. Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp> --- hw/pci.c | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-)