File valgrind.xen-4.6-handle-XEN_SYSCTL_pcitopoinfo.patch of Package valgrind
From: Olaf Hering <olaf@aepfle.de>
Date: Fri, 16 Nov 2018 17:21:23 +0100
Subject: xen-4.6: handle XEN_SYSCTL_pcitopoinfo
bz#390553
---
coregrind/m_syswrap/syswrap-xen.c | 20 ++++++++++++++++++++
include/vki/vki-xen-physdev.h | 9 +++++++++
include/vki/vki-xen-sysctl.h | 8 ++++++++
3 files changed, 37 insertions(+)
--- a/coregrind/m_syswrap/syswrap-xen.c
+++ b/coregrind/m_syswrap/syswrap-xen.c
@@ -798,24 +798,34 @@ PRE(sysctl) {
PRE_XEN_SYSCTL_READ(numainfo_00000008, node_to_memsize);
PRE_XEN_SYSCTL_READ(numainfo_00000008, node_to_memfree);
PRE_XEN_SYSCTL_READ(numainfo_00000008, node_to_node_distance);
break;
case 0x0000000c:
PRE_XEN_SYSCTL_READ(numainfo_0000000c, num_nodes);
PRE_XEN_SYSCTL_READ(numainfo_0000000c, meminfo);
PRE_XEN_SYSCTL_READ(numainfo_0000000c, distance);
break;
}
break;
+ case VKI_XEN_SYSCTL_pcitopoinfo:
+ switch (sysctl->interface_version)
+ {
+ case 0x0000000c:
+ PRE_XEN_SYSCTL_READ(pcitopoinfo_0000000c, num_devs);
+ PRE_XEN_SYSCTL_READ(pcitopoinfo_0000000c, devs);
+ 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;
@@ -2179,24 +2189,34 @@ POST(sysctl)
break;
case 0x0000000c:
POST_XEN_SYSCTL_WRITE(numainfo_0000000c, num_nodes);
POST_MEM_WRITE((Addr)sysctl->u.numainfo_0000000c.meminfo.p,
sizeof(uint64_t) * sysctl->u.numainfo_0000000c.num_nodes);
POST_MEM_WRITE((Addr)sysctl->u.numainfo_0000000c.distance.p,
sizeof(uint32_t) *
(sysctl->u.numainfo_0000000c.num_nodes * sysctl->u.numainfo_0000000c.num_nodes));
break;
}
break;
+ case VKI_XEN_SYSCTL_pcitopoinfo:
+ switch (sysctl->interface_version)
+ {
+ case 0x0000000c:
+ POST_XEN_SYSCTL_WRITE(pcitopoinfo_0000000c, num_devs);
+ POST_MEM_WRITE((Addr)sysctl->u.pcitopoinfo_0000000c.nodes.p,
+ sizeof(uint32_t) * sysctl->u.pcitopoinfo_0000000c.num_devs);
+ 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-physdev.h
+++ b/include/vki/vki-xen-physdev.h
@@ -49,17 +49,26 @@ struct vki_xen_physdev_map_pirq {
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;
};
+struct vki_physdev_pci_device {
+ /* IN */
+ vki_uint16_t seg;
+ vki_uint8_t bus;
+ vki_uint8_t devfn;
+};
+typedef struct vki_physdev_pci_device vki_physdev_pci_device_t;
+DEFINE_VKI_XEN_GUEST_HANDLE(vki_physdev_pci_device_t);
+
#endif // __VKI_XEN_PHYSDEV_H
/*--------------------------------------------------------------------*/
/*--- end ---*/
/*--------------------------------------------------------------------*/
--- a/include/vki/vki-xen-sysctl.h
+++ b/include/vki/vki-xen-sysctl.h
@@ -36,24 +36,25 @@
#define VKI_XEN_SYSCTL_get_pmstat 10
#define VKI_XEN_SYSCTL_cpu_hotplug 11
#define VKI_XEN_SYSCTL_pm_op 12
#define VKI_XEN_SYSCTL_page_offline_op 14
#define VKI_XEN_SYSCTL_lockprof_op 15
#define VKI_XEN_SYSCTL_topologyinfo 16
#define VKI_XEN_SYSCTL_cputopoinfo 16 /* Since xen-4.6 */
#define VKI_XEN_SYSCTL_numainfo 17
#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_psr_cmt_op 21
+#define VKI_XEN_SYSCTL_pcitopoinfo 22
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.
*/
@@ -137,24 +138,30 @@ struct vki_xen_sysctl_cputopo_0000000c {
vki_uint32_t core;
vki_uint32_t socket;
vki_uint32_t node;
};
typedef struct vki_xen_sysctl_cputopo_0000000c vki_xen_sysctl_cputopo_0000000c_t;
DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_sysctl_cputopo_0000000c_t);
struct vki_xen_sysctl_cputopoinfo_0000000c {
vki_uint32_t num_cpus;
VKI_XEN_GUEST_HANDLE_64(vki_xen_sysctl_cputopo_0000000c_t) cputopo;
};
+struct vki_xen_sysctl_pcitopoinfo_0000000c {
+ vki_uint32_t num_devs;
+ VKI_XEN_GUEST_HANDLE_64(vki_physdev_pci_device_t) devs;
+ VKI_XEN_GUEST_HANDLE_64(vki_uint32) nodes;
+};
+
struct vki_xen_sysctl_numainfo_00000008 {
vki_uint32_t max_node_index;
VKI_XEN_GUEST_HANDLE_64(vki_uint64) node_to_memsize;
VKI_XEN_GUEST_HANDLE_64(vki_uint64) node_to_memfree;
VKI_XEN_GUEST_HANDLE_64(vki_uint32) node_to_node_distance;
};
struct vki_xen_xen_sysctl_meminfo_0000000c {
vki_uint64_t memsize;
vki_uint64_t memfree;
};
typedef struct vki_xen_xen_sysctl_meminfo_0000000c vki_xen_xen_sysctl_meminfo_0000000c_t;
@@ -224,24 +231,25 @@ struct vki_xen_sysctl_sched_id {
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;
struct vki_xen_sysctl_numainfo_00000008 numainfo_00000008;
struct vki_xen_sysctl_numainfo_0000000c numainfo_0000000c;
struct vki_xen_sysctl_sched_id sched_id;
//struct vki_xen_sysctl_perfc_op perfc_op;
/* getdomaininfolist (sysctl) suffix is the getdomaininfo (domctl) suffix */
struct vki_xen_sysctl_getdomaininfolist_00000007 getdomaininfolist_00000007;
struct vki_xen_sysctl_getdomaininfolist_00000008 getdomaininfolist_00000008;
struct vki_xen_sysctl_getdomaininfolist_00000009 getdomaininfolist_00000009;
struct vki_xen_sysctl_getdomaininfolist_0000000f getdomaininfolist_0000000f;
struct vki_xen_sysctl_debug_keys debug_keys;
//struct vki_xen_sysctl_getcpuinfo getcpuinfo;
//struct vki_xen_sysctl_availheap availheap;