File valgrind.xen-4.12-implement-sysctl-get_cpu_policy.patch of Package valgrind

From: Olaf Hering <olaf@aepfle.de>
Date: Fri, 7 Feb 2020 19:25:02 +0100
Subject: xen-4.12: implement sysctl get_cpu_policy

Handle XEN_SYSCTL_get_cpu_policy

bz#390553
---
 coregrind/m_syswrap/syswrap-xen.c | 28 ++++++++++++++++++++++++++++
 include/vki/vki-xen-sysctl.h      | 11 +++++++++++
 include/vki/vki-xen-x86.h         | 14 ++++++++++++++
 3 files changed, 53 insertions(+)

--- a/coregrind/m_syswrap/syswrap-xen.c
+++ b/coregrind/m_syswrap/syswrap-xen.c
@@ -845,24 +845,36 @@ PRE(sysctl) {
       {
       case 0x0000000d:
       case 0x0000000e:
       case 0x0000000f:
       case 0x00000010:
       case 0x00000011:
          PRE_XEN_SYSCTL_READ(cpu_featureset_0000000d, index);
          PRE_XEN_SYSCTL_READ(cpu_featureset_0000000d, nr_features);
          break;
       }
       break;
 
+   case VKI_XEN_SYSCTL_get_cpu_policy:
+      switch (sysctl->interface_version)
+      {
+      case 0x00000012:
+         PRE_XEN_SYSCTL_READ(get_cpu_policy_00000012, index);
+         PRE_XEN_SYSCTL_READ(get_cpu_policy_00000012, nr_leaves);
+         PRE_XEN_SYSCTL_READ(get_cpu_policy_00000012, nr_msrs);
+         PRE_XEN_SYSCTL_READ(get_cpu_policy_00000012, _rsvd);
+         break;
+      }
+      break;
+
    default:
       bad_subop(tid, layout, arrghs, status, flags,
                 "__HYPERVISOR_sysctl", sysctl->cmd);
       break;
    }
 #undef PRE_XEN_SYSCTL_READ
 #undef __PRE_XEN_SYSCTL_READ
 }
 
 PRE(domctl)
 {
    struct vki_xen_domctl *domctl = (struct vki_xen_domctl *)ARG1;
@@ -2379,24 +2391,40 @@ POST(sysctl)
       case 0x0000000d:
       case 0x0000000e:
       case 0x0000000f:
       case 0x00000010:
       case 0x00000011:
          POST_XEN_SYSCTL_WRITE(cpu_featureset_0000000d, nr_features);
          POST_MEM_WRITE((Addr)sysctl->u.cpu_featureset_0000000d.features.p,
                         sizeof(uint32_t) *  sysctl->u.cpu_featureset_0000000d.nr_features);
          break;
       }
       break;
 
+   case VKI_XEN_SYSCTL_get_cpu_policy:
+      switch (sysctl->interface_version)
+      {
+      case 0x00000012:
+         POST_XEN_SYSCTL_WRITE(get_cpu_policy_00000012, index);
+         POST_XEN_SYSCTL_WRITE(get_cpu_policy_00000012, nr_leaves);
+         POST_XEN_SYSCTL_WRITE(get_cpu_policy_00000012, nr_msrs);
+         POST_XEN_SYSCTL_WRITE(get_cpu_policy_00000012, _rsvd);
+         POST_MEM_WRITE((Addr)sysctl->u.get_cpu_policy_00000012.cpuid_policy.p,
+                        sizeof(vki_xen_cpuid_leaf_00000012_t) *  sysctl->u.get_cpu_policy_00000012.nr_leaves);
+         POST_MEM_WRITE((Addr)sysctl->u.get_cpu_policy_00000012.msr_policy.p,
+                        sizeof(vki_xen_msr_entry_00000012_t) *  sysctl->u.get_cpu_policy_00000012.nr_msrs);
+         break;
+      }
+      break;
+
    /* No outputs */
    case VKI_XEN_SYSCTL_debug_keys:
        break;
    }
 #undef POST_XEN_SYSCTL_WRITE
 #undef __POST_XEN_SYSCTL_WRITE
 }
 
 POST(domctl){
    struct vki_xen_domctl *domctl = (struct vki_xen_domctl *)ARG1;
 
    switch (domctl->interface_version) {
--- a/include/vki/vki-xen-sysctl.h
+++ b/include/vki/vki-xen-sysctl.h
@@ -50,24 +50,25 @@
 #define VKI_XEN_SYSCTL_cpupool_op                    18
 #define VKI_XEN_SYSCTL_scheduler_op                  19
 #define VKI_XEN_SYSCTL_coverage_op                   20
 #define VKI_XEN_SYSCTL_gcov_op                       20 /* Since xen-4.9 */
 #define VKI_XEN_SYSCTL_psr_cmt_op                    21
 #define VKI_XEN_SYSCTL_pcitopoinfo                   22
 #define VKI_XEN_SYSCTL_psr_cat_op                    23
 #define VKI_XEN_SYSCTL_tmem_op                       24
 #define VKI_XEN_SYSCTL_get_cpu_levelling_caps        25
 #define VKI_XEN_SYSCTL_get_cpu_featureset            26
 #define VKI_XEN_SYSCTL_livepatch_op                  27
 #define VKI_XEN_SYSCTL_set_parameter                 28
+#define VKI_XEN_SYSCTL_get_cpu_policy                29
 
 struct vki_xen_sysctl_readconsole {
     /* IN */
     vki_uint8_t clear;
     vki_uint8_t incremental;
 
     vki_uint8_t pad0, pad1;
 
     /*
      * IN:  Start index for consumption if @incremental.
      * OUT: End index after consuming from the console.
      */
@@ -234,24 +235,33 @@ struct vki_xen_sysctl_physinfo_00000010 {
 
 struct vki_xen_sysctl_sched_id {
     /* OUT variable. */
     vki_uint32_t              sched_id;
 };
 
 struct vki_xen_sysctl_cpu_featureset_0000000d {
     vki_uint32_t index;
     vki_uint32_t nr_features;
     VKI_XEN_GUEST_HANDLE_64(vki_uint32) features;
 };
 
+struct vki_xen_sysctl_get_cpu_policy_00000012 {
+    vki_uint32_t index;
+    vki_uint32_t nr_leaves;
+    vki_uint64_t nr_msrs;
+    vki_uint64_t _rsvd;
+    VKI_XEN_GUEST_HANDLE_64(vki_xen_cpuid_leaf_00000012_t) cpuid_policy;
+    VKI_XEN_GUEST_HANDLE_64(vki_xen_msr_entry_00000012_t) msr_policy;
+};
+
 struct vki_xen_sysctl {
     vki_uint32_t cmd;
     vki_uint32_t interface_version; /* XEN_SYSCTL_INTERFACE_VERSION */
     union {
         struct vki_xen_sysctl_readconsole       readconsole;
         //struct vki_xen_sysctl_tbuf_op           tbuf_op;
         struct vki_xen_sysctl_physinfo_00000008 physinfo_00000008;
         struct vki_xen_sysctl_physinfo_0000000a physinfo_0000000a;
         struct vki_xen_sysctl_physinfo_00000010 physinfo_00000010;
         struct vki_xen_sysctl_topologyinfo      topologyinfo;
         struct vki_xen_sysctl_cputopoinfo_0000000c cputopoinfo_0000000c;
         struct vki_xen_sysctl_pcitopoinfo_0000000c pcitopoinfo_0000000c;
@@ -272,22 +282,23 @@ struct vki_xen_sysctl {
         //struct vki_xen_sysctl_lockprof_op       lockprof_op;
         struct vki_xen_sysctl_cpupool_op        cpupool_op;
         //struct vki_xen_sysctl_scheduler_op      scheduler_op;
         //struct vki_xen_sysctl_coverage_op       coverage_op;
         //struct vki_xen_sysctl_gcov_op           gcov_op;
         //struct vki_xen_sysctl_psr_cmt_op        psr_cmt_op;
         //struct vki_xen_sysctl_psr_cat_op        psr_cat_op;
         //struct vki_xen_sysctl_tmem_op           tmem_op;
         //struct vki_xen_sysctl_cpu_levelling_caps cpu_levelling_caps;
         struct vki_xen_sysctl_cpu_featureset_0000000d cpu_featureset_0000000d;
         //struct vki_xen_sysctl_livepatch_op      livepatch;
         //struct vki_xen_sysctl_set_parameter     set_parameter;
+        struct vki_xen_sysctl_get_cpu_policy_00000012 get_cpu_policy_00000012;
 
         vki_uint8_t                             pad[128];
     } u;
 };
 
 #endif // __VKI_XEN_SYSCTL_H
 
 /*--------------------------------------------------------------------*/
 /*--- end                                                          ---*/
 /*--------------------------------------------------------------------*/
--- a/include/vki/vki-xen-x86.h
+++ b/include/vki/vki-xen-x86.h
@@ -272,17 +272,31 @@ struct vki_hvm_hw_mtrr {
 #define VKI_MTRR_VCNT     8
 #define VKI_NUM_FIXED_MSR 11
    vki_uint64_t msr_pat_cr;
    /* mtrr physbase & physmask msr pair*/
    vki_uint64_t msr_mtrr_var[VKI_MTRR_VCNT*2];
    vki_uint64_t msr_mtrr_fixed[VKI_NUM_FIXED_MSR];
    vki_uint64_t msr_mtrr_cap;
    vki_uint64_t msr_mtrr_def_type;
 };
 
 VKI_DECLARE_HVM_SAVE_TYPE(MTRR, 14, struct vki_hvm_hw_mtrr);
 
+struct vki_xen_cpuid_leaf_00000012 {
+    vki_uint32_t leaf, subleaf;
+    vki_uint32_t a, b, c, d;
+};
+typedef struct vki_xen_cpuid_leaf_00000012 vki_xen_cpuid_leaf_00000012_t;
+DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_cpuid_leaf_00000012_t);
+
+struct vki_xen_msr_entry_00000012 {
+    vki_uint32_t leaf, subleaf;
+    vki_uint32_t a, b, c, d;
+};
+typedef struct vki_xen_msr_entry_00000012 vki_xen_msr_entry_00000012_t;
+DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_msr_entry_00000012_t);
+
 #endif // __VKI_XEN_H
 
 /*--------------------------------------------------------------------*/
 /*--- end                                                          ---*/
 /*--------------------------------------------------------------------*/
openSUSE Build Service is sponsored by