Patchwork [resend] domctl/x86: move vMSI related #define-s to public interface

login
register
mail settings
Submitter Jan Beulich
Date Sept. 1, 2017, 4:24 p.m.
Message ID <59A9A5CA0200007800176A67@prv-mh.provo.novell.com>
Download mbox | patch
Permalink /patch/330495/
State New
Headers show

Comments

Jan Beulich - Sept. 1, 2017, 4:24 p.m.
Xen and qemu having identical #define-s (with different names) is a
strong hint that these should be part of the public interface, at the
same time making obvious that any change to the values in an interface
modification (and hence needs suitable care).

Signed-off-by: Jan Beulich <jbeulich@suse.com>
---
I'm sorry for the earlier mail, which had a stale version.
Andrew Cooper - Sept. 1, 2017, 4:35 p.m.
On 01/09/17 17:24, Jan Beulich wrote:
> Xen and qemu having identical #define-s (with different names) is a
> strong hint that these should be part of the public interface, at the
> same time making obvious that any change to the values in an interface
> modification (and hence needs suitable care).
>
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
Wei Liu - Sept. 1, 2017, 4:37 p.m.
On Fri, Sep 01, 2017 at 10:24:10AM -0600, Jan Beulich wrote:
> Xen and qemu having identical #define-s (with different names) is a
> strong hint that these should be part of the public interface, at the
> same time making obvious that any change to the values in an interface
> modification (and hence needs suitable care).
> 
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

Reviewed-by: Wei Liu <wei.liu2@citrix.com>
Roger Pau Monne - Sept. 1, 2017, 6:10 p.m.
On Fri, Sep 01, 2017 at 10:24:10AM -0600, Jan Beulich wrote:
> Xen and qemu having identical #define-s (with different names) is a
> strong hint that these should be part of the public interface, at the
> same time making obvious that any change to the values in an interface
> modification (and hence needs suitable care).
> 
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>

Thanks, Roger.

Patch

--- a/xen/arch/x86/hvm/vmsi.c
+++ b/xen/arch/x86/hvm/vmsi.c
@@ -104,10 +104,9 @@  void vmsi_deliver_pirq(struct domain *d,
     uint32_t flags = pirq_dpci->gmsi.gflags;
     int vector = pirq_dpci->gmsi.gvec;
     uint8_t dest = (uint8_t)flags;
-    uint8_t dest_mode = !!(flags & VMSI_DM_MASK);
-    uint8_t delivery_mode = (flags & VMSI_DELIV_MASK)
-        >> GFLAGS_SHIFT_DELIV_MODE;
-    uint8_t trig_mode = (flags&VMSI_TRIG_MODE) >> GFLAGS_SHIFT_TRG_MODE;
+    bool dest_mode = flags & XEN_DOMCTL_VMSI_X86_DM_MASK;
+    uint8_t delivery_mode = MASK_EXTR(flags, XEN_DOMCTL_VMSI_X86_DELIV_MASK);
+    bool trig_mode = flags & XEN_DOMCTL_VMSI_X86_TRIG_MASK;
 
     HVM_DBG_LOG(DBG_LEVEL_IOAPIC,
                 "msi: dest=%x dest_mode=%x delivery_mode=%x "
--- a/xen/drivers/passthrough/io.c
+++ b/xen/drivers/passthrough/io.c
@@ -340,10 +340,12 @@  int pt_irq_create_bind(
     {
     case PT_IRQ_TYPE_MSI:
     {
-        uint8_t dest, dest_mode, delivery_mode;
+        uint8_t dest, delivery_mode;
+        bool dest_mode;
         int dest_vcpu_id;
         const struct vcpu *vcpu;
-        uint32_t gflags = pt_irq_bind->u.msi.gflags & ~VMSI_UNMASKED;
+        uint32_t gflags = pt_irq_bind->u.msi.gflags &
+                          ~XEN_DOMCTL_VMSI_X86_UNMASKED;
 
         if ( !(pirq_dpci->flags & HVM_IRQ_DPCI_MAPPED) )
         {
@@ -413,10 +415,11 @@  int pt_irq_create_bind(
             }
         }
         /* Calculate dest_vcpu_id for MSI-type pirq migration. */
-        dest = pirq_dpci->gmsi.gflags & VMSI_DEST_ID_MASK;
-        dest_mode = !!(pirq_dpci->gmsi.gflags & VMSI_DM_MASK);
-        delivery_mode = (pirq_dpci->gmsi.gflags & VMSI_DELIV_MASK) >>
-                         GFLAGS_SHIFT_DELIV_MODE;
+        dest = MASK_EXTR(pirq_dpci->gmsi.gflags,
+                         XEN_DOMCTL_VMSI_X86_DEST_ID_MASK);
+        dest_mode = pirq_dpci->gmsi.gflags & XEN_DOMCTL_VMSI_X86_DM_MASK;
+        delivery_mode = MASK_EXTR(pirq_dpci->gmsi.gflags,
+                                  XEN_DOMCTL_VMSI_X86_DELIV_MASK);
 
         dest_vcpu_id = hvm_girq_dest_2_vcpu_id(d, dest, dest_mode);
         pirq_dpci->gmsi.dest_vcpu_id = dest_vcpu_id;
@@ -440,7 +443,7 @@  int pt_irq_create_bind(
             pi_update_irte(vcpu ? &vcpu->arch.hvm_vmx.pi_desc : NULL,
                            info, pirq_dpci->gmsi.gvec);
 
-        if ( pt_irq_bind->u.msi.gflags & VMSI_UNMASKED )
+        if ( pt_irq_bind->u.msi.gflags & XEN_DOMCTL_VMSI_X86_UNMASKED )
         {
             unsigned long flags;
             struct irq_desc *desc = pirq_spin_lock_irq_desc(info, &flags);
@@ -835,8 +838,9 @@  static int _hvm_dpci_msi_eoi(struct doma
     if ( (pirq_dpci->flags & HVM_IRQ_DPCI_MACH_MSI) &&
          (pirq_dpci->gmsi.gvec == vector) )
     {
-        int dest = pirq_dpci->gmsi.gflags & VMSI_DEST_ID_MASK;
-        int dest_mode = !!(pirq_dpci->gmsi.gflags & VMSI_DM_MASK);
+        unsigned int dest = MASK_EXTR(pirq_dpci->gmsi.gflags,
+                                      XEN_DOMCTL_VMSI_X86_DEST_ID_MASK);
+        bool dest_mode = pirq_dpci->gmsi.gflags & XEN_DOMCTL_VMSI_X86_DM_MASK;
 
         if ( vlapic_match_dest(vcpu_vlapic(current), NULL, 0, dest,
                                dest_mode) )
--- a/xen/include/asm-x86/hvm/irq.h
+++ b/xen/include/asm-x86/hvm/irq.h
@@ -131,17 +131,6 @@  struct dev_intx_gsi_link {
 #define HVM_IRQ_DPCI_IDENTITY_GSI    (1u << _HVM_IRQ_DPCI_IDENTITY_GSI_SHIFT)
 #define HVM_IRQ_DPCI_TRANSLATE       (1u << _HVM_IRQ_DPCI_TRANSLATE_SHIFT)
 
-#define VMSI_DEST_ID_MASK 0xff
-#define VMSI_RH_MASK      0x100
-#define VMSI_DM_MASK      0x200
-#define VMSI_DELIV_MASK   0x7000
-#define VMSI_TRIG_MODE    0x8000
-#define VMSI_UNMASKED     0x10000
-
-#define GFLAGS_SHIFT_RH             8
-#define GFLAGS_SHIFT_DELIV_MODE     12
-#define GFLAGS_SHIFT_TRG_MODE       15
-
 struct hvm_gmsi_info {
     uint32_t gvec;
     uint32_t gflags;
--- a/xen/include/public/domctl.h
+++ b/xen/include/public/domctl.h
@@ -576,6 +576,13 @@  struct xen_domctl_bind_pt_irq {
         struct {
             uint8_t gvec;
             uint32_t gflags;
+#define XEN_DOMCTL_VMSI_X86_DEST_ID_MASK 0x0000ff
+#define XEN_DOMCTL_VMSI_X86_RH_MASK      0x000100
+#define XEN_DOMCTL_VMSI_X86_DM_MASK      0x000200
+#define XEN_DOMCTL_VMSI_X86_DELIV_MASK   0x007000
+#define XEN_DOMCTL_VMSI_X86_TRIG_MASK    0x008000
+#define XEN_DOMCTL_VMSI_X86_UNMASKED     0x010000
+
             uint64_aligned_t gtable;
         } msi;
         struct {