From: Bart Van Assche Date: Sun, 28 Jun 2015 16:33:04 +0000 (+0000) Subject: xen: Add domctl interface version 0x0000000a X-Git-Tag: svn/VALGRIND_3_11_0~278 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=b1e2a3e6a1e3ae44dfb58941405e89e6b5352596;p=thirdparty%2Fvalgrind.git xen: Add domctl interface version 0x0000000a Signed-off-by: Ian Campbell git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15366 --- diff --git a/coregrind/m_syswrap/syswrap-xen.c b/coregrind/m_syswrap/syswrap-xen.c index 75ec1662f4..6ce28e65cf 100644 --- a/coregrind/m_syswrap/syswrap-xen.c +++ b/coregrind/m_syswrap/syswrap-xen.c @@ -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: diff --git a/include/vki/vki-xen-domctl.h b/include/vki/vki-xen-domctl.h index f90583f50f..5e9902b8f1 100644 --- a/include/vki/vki-xen-domctl.h +++ b/include/vki/vki-xen-domctl.h @@ -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;