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 ---*/
/*--------------------------------------------------------------------*/