[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH V7 07/11] vpci/header: emulate PCI_COMMAND register for guests




On 26.07.22 18:30, Jan Beulich wrote:

Hello Jan

On 19.07.2022 19:42, Oleksandr Tyshchenko wrote:
--- a/xen/drivers/vpci/header.c
+++ b/xen/drivers/vpci/header.c
@@ -443,11 +443,27 @@ static int modify_bars(const struct pci_dev *pdev, 
uint16_t cmd, bool rom_only)
      return 0;
  }
+/* TODO: Add proper emulation for all bits of the command register. */
  static void cf_check cmd_write(
      const struct pci_dev *pdev, unsigned int reg, uint32_t cmd, void *data)
  {
      uint16_t current_cmd = pci_conf_read16(pdev->sbdf, reg);
+ if ( !is_hardware_domain(pdev->domain) )
+    {
+        struct vpci_header *header = data;
+
+        header->guest_cmd = cmd;
+#ifdef CONFIG_HAS_PCI_MSI
+        if ( pdev->vpci->msi->enabled || pdev->vpci->msix->enabled )
+            /*
+             * Guest wants to enable INTx, but it can't be enabled
+             * if MSI/MSI-X enabled.
+             */
+            cmd |= PCI_COMMAND_INTX_DISABLE;
+#endif
+    }
+
      /*
       * Let Dom0 play with all the bits directly except for the memory
       * decoding one.
@@ -464,6 +480,19 @@ static void cf_check cmd_write(
          pci_conf_write16(pdev->sbdf, reg, cmd);
  }
+static uint32_t cf_check cmd_read(
+    const struct pci_dev *pdev, unsigned int reg, void *data)
+{
+    if ( !is_hardware_domain(pdev->domain) )
+    {
+        struct vpci_header *header = data;
+
+        return header->guest_cmd;
+    }
+
+    return pci_conf_read16(pdev->sbdf, reg);
+}
This function wants the same leading comment as cmd_write().

ok


  I also
think you better wouldn't give the guest the impression that r/o bits
can actually be written to (but getting this right may well fall
under the TODO).

ok



Jan

--
Regards,

Oleksandr Tyshchenko




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.