]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
xen: Add domctl interface version 0x0000000a
authorBart Van Assche <bvanassche@acm.org>
Sun, 28 Jun 2015 16:33:04 +0000 (16:33 +0000)
committerBart Van Assche <bvanassche@acm.org>
Sun, 28 Jun 2015 16:33:04 +0000 (16:33 +0000)
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15366

coregrind/m_syswrap/syswrap-xen.c
include/vki/vki-xen-domctl.h

index 75ec1662f4ed9fc302a96e69342af7db7e54130a..6ce28e65cf674b8922f1b706604bcc318b7c0f3a 100644 (file)
@@ -707,6 +707,10 @@ PRE(domctl)
          case VKI_XEN_SCHEDULER_CREDIT2:
             PRE_XEN_DOMCTL_READ(scheduler_op, u.credit2.weight);
             break;
+         case VKI_XEN_SCHEDULER_RTDS:
+            PRE_XEN_DOMCTL_READ(scheduler_op, u.rtds.period);
+            PRE_XEN_DOMCTL_READ(scheduler_op, u.rtds.budget);
+            break;
          case VKI_XEN_SCHEDULER_ARINC653:
             break;
          }
@@ -714,14 +718,57 @@ PRE(domctl)
       break;
 
    case VKI_XEN_DOMCTL_getvcpuaffinity:
-      __PRE_XEN_DOMCTL_READ(getvcpuaffinity, vcpuaffinity, vcpu);
+      switch (domctl->interface_version) {
+      case 0x00000007:
+      case 0x00000008:
+      case 0x00000009:
+         __PRE_XEN_DOMCTL_READ(getvcpuaffinity, vcpuaffinity_00000009, vcpu);
+         __PRE_XEN_DOMCTL_READ(getvcpuaffinity, vcpuaffinity_00000009, cpumap.nr_bits);
+         break;
+      case 0x0000000a:
+         __PRE_XEN_DOMCTL_READ(getvcpuaffinity, vcpuaffinity_0000000a, vcpu);
+         if (domctl->u.vcpuaffinity_0000000a.flags & VKI_XEN_VCPUAFFINITY_HARD)
+            __PRE_XEN_DOMCTL_READ(
+               setvcpuaffinity, vcpuaffinity_0000000a, cpumap_hard.nr_bits);
+         if (domctl->u.vcpuaffinity_0000000a.flags & VKI_XEN_VCPUAFFINITY_SOFT)
+            __PRE_XEN_DOMCTL_READ(
+               setvcpuaffinity, vcpuaffinity_0000000a, cpumap_soft.nr_bits);
+         break;
+      }
       break;
 
    case VKI_XEN_DOMCTL_setvcpuaffinity:
-      __PRE_XEN_DOMCTL_READ(setvcpuaffinity, vcpuaffinity, vcpu);
-      PRE_MEM_READ("XEN_DOMCTL_setvcpuaffinity u.vcpuaffinity.cpumap.bitmap",
-                   (Addr)domctl->u.vcpuaffinity.cpumap.bitmap.p,
-                   domctl->u.vcpuaffinity.cpumap.nr_bits / 8);
+      switch (domctl->interface_version) {
+      case 0x00000007:
+      case 0x00000008:
+      case 0x00000009:
+         __PRE_XEN_DOMCTL_READ(setvcpuaffinity, vcpuaffinity_00000009, vcpu);
+         __PRE_XEN_DOMCTL_READ(setvcpuaffinity, vcpuaffinity_00000009, cpumap.nr_bits);
+         PRE_MEM_READ("XEN_DOMCTL_setvcpuaffinity u.vcpuaffinity.cpumap.bitmap",
+                      (Addr)domctl->u.vcpuaffinity_00000009.cpumap.bitmap.p,
+                      domctl->u.vcpuaffinity_00000009.cpumap.nr_bits / 8);
+         break;
+      case 0x0000000a:
+         __PRE_XEN_DOMCTL_READ(setvcpuaffinity, vcpuaffinity_0000000a, vcpu);
+         __PRE_XEN_DOMCTL_READ(setvcpuaffinity, vcpuaffinity_0000000a, flags);
+         if (domctl->u.vcpuaffinity_0000000a.flags & VKI_XEN_VCPUAFFINITY_HARD) {
+            __PRE_XEN_DOMCTL_READ(
+               setvcpuaffinity, vcpuaffinity_0000000a, cpumap_hard.nr_bits);
+            PRE_MEM_READ(
+               "XEN_DOMCTL_setvcpuaffinity u.vcpuaffinity.cpumap_hard.bitmap",
+               (Addr)domctl->u.vcpuaffinity_0000000a.cpumap_hard.bitmap.p,
+               domctl->u.vcpuaffinity_0000000a.cpumap_hard.nr_bits / 8);
+         }
+         if (domctl->u.vcpuaffinity_0000000a.flags & VKI_XEN_VCPUAFFINITY_SOFT) {
+            __PRE_XEN_DOMCTL_READ(
+               setvcpuaffinity, vcpuaffinity_0000000a, cpumap_soft.nr_bits);
+            PRE_MEM_READ(
+               "XEN_DOMCTL_setvcpuaffinity u.vcpuaffinity.cpumap_soft.bitmap",
+               (Addr)domctl->u.vcpuaffinity_0000000a.cpumap_soft.bitmap.p,
+               domctl->u.vcpuaffinity_0000000a.cpumap_soft.nr_bits / 8);
+         }
+      break;
+      }
       break;
 
    case VKI_XEN_DOMCTL_getnodeaffinity:
@@ -1266,7 +1313,6 @@ POST(domctl){
    case VKI_XEN_DOMCTL_settscinfo:
    case VKI_XEN_DOMCTL_ioport_permission:
    case VKI_XEN_DOMCTL_hypercall_init:
-   case VKI_XEN_DOMCTL_setvcpuaffinity:
    case VKI_XEN_DOMCTL_setvcpucontext:
    case VKI_XEN_DOMCTL_setnodeaffinity:
    case VKI_XEN_DOMCTL_set_cpuid:
@@ -1342,13 +1388,33 @@ POST(domctl){
             break;
          case VKI_XEN_SCHEDULER_ARINC653:
             break;
+         case VKI_XEN_SCHEDULER_RTDS:
+            POST_XEN_DOMCTL_WRITE(scheduler_op, u.rtds.period);
+            POST_XEN_DOMCTL_WRITE(scheduler_op, u.rtds.budget);
+            break;
          }
       }
       break;
 
    case VKI_XEN_DOMCTL_getvcpuaffinity:
-      POST_MEM_WRITE((Addr)domctl->u.vcpuaffinity.cpumap.bitmap.p,
-                     domctl->u.vcpuaffinity.cpumap.nr_bits / 8);
+   case VKI_XEN_DOMCTL_setvcpuaffinity: /* Writes back actual result */
+      switch (domctl->interface_version) {
+      case 0x00000007:
+      case 0x00000008:
+      case 0x00000009:
+         POST_MEM_WRITE((Addr)domctl->u.vcpuaffinity_00000009.cpumap.bitmap.p,
+                        domctl->u.vcpuaffinity_00000009.cpumap.nr_bits / 8);
+         break;
+      case 0x0000000a:
+         if (domctl->u.vcpuaffinity_0000000a.flags & VKI_XEN_VCPUAFFINITY_HARD)
+            POST_MEM_WRITE(
+               (Addr)domctl->u.vcpuaffinity_0000000a.cpumap_hard.bitmap.p,
+               domctl->u.vcpuaffinity_0000000a.cpumap_hard.nr_bits / 8);
+         if (domctl->u.vcpuaffinity_0000000a.flags & VKI_XEN_VCPUAFFINITY_SOFT)
+            POST_MEM_WRITE(
+               (Addr)domctl->u.vcpuaffinity_0000000a.cpumap_soft.bitmap.p,
+               domctl->u.vcpuaffinity_0000000a.cpumap_soft.nr_bits / 8);
+      }
       break;
 
    case VKI_XEN_DOMCTL_getnodeaffinity:
index f90583f50f8439239f3a5221c3c4c28f8348c478..5e9902b8f1818b000ef8c716d1d363ad13d5eb51 100644 (file)
@@ -173,11 +173,20 @@ struct vki_xen_domctl_getpageframeinfo3 {
     VKI_XEN_GUEST_HANDLE_64(vki_xen_pfn_t) array; /* IN/OUT */
 };
 
-struct vki_xen_domctl_vcpuaffinity {
+struct vki_xen_domctl_vcpuaffinity_00000009 {
     vki_uint32_t  vcpu;              /* IN */
     struct vki_xenctl_bitmap cpumap; /* IN/OUT */
 };
 
+struct vki_xen_domctl_vcpuaffinity_0000000a {
+    vki_uint32_t  vcpu;              /* IN */
+#define VKI_XEN_VCPUAFFINITY_HARD   (1U<<0)
+#define VKI_XEN_VCPUAFFINITY_SOFT   (1U<<1)
+    vki_uint32_t  flags;              /* IN */
+    struct vki_xenctl_bitmap cpumap_hard; /* IN/OUT */
+    struct vki_xenctl_bitmap cpumap_soft; /* IN/OUT */
+};
+
 struct vki_xen_domctl_shadow_op_stats {
     vki_uint32_t fault_count;
     vki_uint32_t dirty_count;
@@ -239,6 +248,7 @@ struct vki_xen_domctl_scheduler_op {
 #define VKI_XEN_SCHEDULER_CREDIT   5
 #define VKI_XEN_SCHEDULER_CREDIT2  6
 #define VKI_XEN_SCHEDULER_ARINC653 7
+#define VKI_XEN_SCHEDULER_RTDS     8
     vki_uint32_t cmd;       /* VKI_XEN_DOMCTL_SCHEDOP_* */
 #define VKI_XEN_DOMCTL_SCHEDOP_putinfo 0
 #define VKI_XEN_DOMCTL_SCHEDOP_getinfo 1
@@ -257,6 +267,10 @@ struct vki_xen_domctl_scheduler_op {
         struct xen_domctl_sched_credit2 {
             vki_uint16_t weight;
         } credit2;
+        struct xen_domctl_sched_rtds {
+            vki_uint32_t period;
+            vki_uint32_t budget;
+        } rtds;
     } u;
 };
 
@@ -366,7 +380,8 @@ struct vki_xen_domctl {
         //struct vki_xen_domctl_getpageframeinfo2 getpageframeinfo2;
         struct vki_xen_domctl_getpageframeinfo3 getpageframeinfo3;
         struct vki_xen_domctl_nodeaffinity      nodeaffinity;
-        struct vki_xen_domctl_vcpuaffinity      vcpuaffinity;
+        struct vki_xen_domctl_vcpuaffinity_00000009 vcpuaffinity_00000009;
+        struct vki_xen_domctl_vcpuaffinity_0000000a vcpuaffinity_0000000a;
         struct vki_xen_domctl_shadow_op         shadow_op;
         struct vki_xen_domctl_max_mem           max_mem;
         struct vki_xen_domctl_vcpucontext       vcpucontext;