]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
xen: Implement physdev_op and map_pirq
authorBart Van Assche <bvanassche@acm.org>
Sun, 28 Jun 2015 16:57:10 +0000 (16:57 +0000)
committerBart Van Assche <bvanassche@acm.org>
Sun, 28 Jun 2015 16:57:10 +0000 (16:57 +0000)
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15385

coregrind/m_syswrap/syswrap-xen.c
include/vki/vki-xen-physdev.h [new file with mode: 0644]
include/vki/vki-xen.h

index d897ed87e6f328bdb29fe0d71a183fd3354082ba..9d2a204a8ec3fc6b26fb3d428e6d86e8642c8b67 100644 (file)
@@ -460,6 +460,60 @@ PRE(evtchn_op_compat)
                  evtchn->cmd, &evtchn->u, 1);
 }
 
+PRE(physdev_op)
+{
+   int cmd = ARG1;
+
+   PRINT("__HYPERVISOR_physdev_op ( %ld, %lx )", ARG1, ARG2);
+
+#define PRE_XEN_PHYSDEVOP_READ(_op, _field)            \
+   PRE_MEM_READ("XEN_PHYSDEVOP_" #_op " ." #_field,    \
+                (Addr)&arg->_field,                    \
+                sizeof(arg->_field))
+
+   switch (cmd) {
+   case VKI_XEN_PHYSDEVOP_map_pirq: {
+      struct vki_xen_physdev_map_pirq *arg =
+         (struct vki_xen_physdev_map_pirq *)ARG2;
+
+      PRE_XEN_PHYSDEVOP_READ("map_pirq", domid);
+      PRE_XEN_PHYSDEVOP_READ("map_pirq", type);
+
+      PRE_XEN_PHYSDEVOP_READ("map_pirq", bus);
+      PRE_XEN_PHYSDEVOP_READ("map_pirq", devfn);
+      PRE_XEN_PHYSDEVOP_READ("map_pirq", entry_nr);
+      PRE_XEN_PHYSDEVOP_READ("map_pirq", table_base);
+
+      switch(arg->type) {
+      case VKI_XEN_MAP_PIRQ_TYPE_MSI:
+         PRE_XEN_PHYSDEVOP_READ("map_pirq", index);
+         break;
+      case VKI_XEN_MAP_PIRQ_TYPE_GSI:
+         PRE_XEN_PHYSDEVOP_READ("map_pirq", index);
+         PRE_XEN_PHYSDEVOP_READ("map_pirq", pirq);
+         break;
+      case VKI_XEN_MAP_PIRQ_TYPE_MSI_SEG:
+         PRE_XEN_PHYSDEVOP_READ("map_pirq", index);
+         break;
+      case VKI_XEN_MAP_PIRQ_TYPE_MULTI_MSI:
+         break;
+      }
+      break;
+   }
+   case VKI_XEN_PHYSDEVOP_unmap_pirq: {
+      struct vki_xen_physdev_unmap_pirq *arg =
+         (struct vki_xen_physdev_unmap_pirq *)ARG2;
+      PRE_XEN_PHYSDEVOP_READ("unmap_pirq", domid);
+      PRE_XEN_PHYSDEVOP_READ("unmap_pirq", pirq);
+      break;
+   }
+   default:
+      bad_subop(tid, layout, arrghs, status, flags,
+                "__HYPERVISOR_physdev_op", cmd);
+   }
+#undef PRE_XEN_PHYSDEVOP_READ
+}
+
 PRE(xen_version)
 {
    PRINT("__HYPERVISOR_xen_version ( %ld, %lx )", ARG1, ARG2);
@@ -1388,6 +1442,33 @@ POST(evtchn_op_compat)
    post_evtchn_op(tid, evtchn->cmd, &evtchn->u, 1);
 }
 
+POST(physdev_op)
+{
+   int cmd = ARG1;
+
+#define POST_XEN_PHYSDEVOP_WRITE(_op, _field)                   \
+   POST_MEM_WRITE((Addr)&arg->_field, sizeof(arg->_field))
+
+   switch (cmd) {
+   case VKI_XEN_PHYSDEVOP_unmap_pirq:
+      /* No outputs */
+      break;
+
+   case VKI_XEN_PHYSDEVOP_map_pirq: {
+      struct vki_xen_physdev_map_pirq *arg =
+         (struct vki_xen_physdev_map_pirq *)ARG2;
+      if (arg->type == VKI_XEN_MAP_PIRQ_TYPE_MULTI_MSI)
+         POST_XEN_PHYSDEVOP_WRITE("map_pirq", entry_nr);
+      POST_XEN_PHYSDEVOP_WRITE("map_pirq", pirq);
+      break;
+   }
+#undef POST_XEN_PHYSDEVOP_WRITE
+
+   default:
+      break;
+   }
+}
+
 POST(xen_version)
 {
    switch (ARG1) {
@@ -1989,7 +2070,7 @@ static XenHypercallTableEntry hypercall_table[] = {
    //    __VKI_XEN_callback_op                                     // 30
    //    __VKI_XEN_xenoprof_op                                     // 31
    HYPXY(__VKI_XEN_event_channel_op,        evtchn_op,         2), // 32
-   //    __VKI_XEN_physdev_op                                      // 33
+   HYPXY(__VKI_XEN_physdev_op,              physdev_op,        2), // 33
    HYPXY(__VKI_XEN_hvm_op,                  hvm_op,            2), // 34
 
    HYPXY(__VKI_XEN_sysctl,                  sysctl,            1), // 35
diff --git a/include/vki/vki-xen-physdev.h b/include/vki/vki-xen-physdev.h
new file mode 100644 (file)
index 0000000..b4f05c5
--- /dev/null
@@ -0,0 +1,40 @@
+#ifndef __VKI_XEN_PHYSDEV__H
+#define __VKI_XEN_PHYSDEV_H
+
+#define VKI_XEN_MAP_PIRQ_TYPE_MSI               0x0
+#define VKI_XEN_MAP_PIRQ_TYPE_GSI               0x1
+#define VKI_XEN_MAP_PIRQ_TYPE_UNKNOWN           0x2
+#define VKI_XEN_MAP_PIRQ_TYPE_MSI_SEG           0x3
+#define VKI_XEN_MAP_PIRQ_TYPE_MULTI_MSI         0x4
+
+#define VKI_XEN_PHYSDEVOP_map_pirq               13
+struct vki_xen_physdev_map_pirq {
+    vki_xen_domid_t domid;
+    /* IN */
+    int type;
+    /* IN (ignored for ..._MULTI_MSI) */
+    int index;
+    /* IN or OUT */
+    int pirq;
+    /* IN - high 16 bits hold segment for ..._MSI_SEG and ..._MULTI_MSI */
+    int bus;
+    /* IN */
+    int devfn;
+    /* IN (also OUT for ..._MULTI_MSI) */
+    int entry_nr;
+    /* IN */
+    vki_uint64_t table_base;
+};
+
+#define VKI_XEN_PHYSDEVOP_unmap_pirq             14
+struct vki_xen_physdev_unmap_pirq {
+    vki_xen_domid_t domid;
+    /* IN */
+    int pirq;
+};
+
+#endif // __VKI_XEN_PHYSDEV_H
+
+/*--------------------------------------------------------------------*/
+/*--- end                                                          ---*/
+/*--------------------------------------------------------------------*/
index 8812b3e076184f93a7e898dc47a1ac5533f20031..69b85019c6b3970159104e7801403f1bde526af6 100644 (file)
@@ -88,6 +88,7 @@ struct vki_xenctl_bitmap {
 #include <vki/vki-xen-hvm.h>
 #include <vki/vki-xen-tmem.h>
 #include <vki/vki-xen-xsm.h>
+#include <vki/vki-xen-physdev.h>
 
 #endif // __VKI_XEN_H