@@ -513,9 +513,9 @@ again:
DEBUG("(%x.%x): address=%04x val=0x%08x len=%d\n",
(d->devfn >> 3) & 0x1F, (d->devfn & 0x7), address, val, len);
- if (pci_dev->need_emulate_cmd) {
+ if (pci_dev->emulate_cmd_mask) {
val = merge_bits(val, pci_default_read_config(d, PCI_COMMAND, 2),
- address, len, PCI_COMMAND, 0xffff);
+ address, len, PCI_COMMAND, pci_dev->emulate_cmd_mask);
}
if (!pci_dev->cap.available) {
@@ -778,10 +778,9 @@ again:
/* dealing with virtual function device */
snprintf(name, sizeof(name), "%sphysfn/", dir);
- if (!stat(name, &statbuf))
- pci_dev->need_emulate_cmd = 1;
- else
- pci_dev->need_emulate_cmd = 0;
+ if (!stat(name, &statbuf)) {
+ pci_dev->emulate_cmd_mask = 0xffff;
+ }
dev->region_number = r;
return 0;
@@ -109,7 +109,7 @@ typedef struct AssignedDevice {
void *msix_table_page;
target_phys_addr_t msix_table_addr;
int mmio_index;
- int need_emulate_cmd;
+ uint32_t emulate_cmd_mask;
char *configfd_name;
int32_t bootindex;
QLIST_ENTRY(AssignedDevice) next;
Define a mask of PCI command register bits that need to be emulated, i.e. read back from their shadow state. We will need this for selectively emulating the INTx mask bit. Note: No initialization of emulate_cmd_mask to zero needed, the device state is already zero-initialized. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> --- hw/device-assignment.c | 11 +++++------ hw/device-assignment.h | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-)