From a914bcf7f52249906e0cfcf7d667659a6ca49a0b Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Sun, 28 Jun 2015 16:57:10 +0000 Subject: [PATCH] xen: Implement physdev_op and map_pirq Signed-off-by: Ian Campbell git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15385 --- coregrind/m_syswrap/syswrap-xen.c | 83 ++++++++++++++++++++++++++++++- include/vki/vki-xen-physdev.h | 40 +++++++++++++++ include/vki/vki-xen.h | 1 + 3 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 include/vki/vki-xen-physdev.h diff --git a/coregrind/m_syswrap/syswrap-xen.c b/coregrind/m_syswrap/syswrap-xen.c index d897ed87e6..9d2a204a8e 100644 --- a/coregrind/m_syswrap/syswrap-xen.c +++ b/coregrind/m_syswrap/syswrap-xen.c @@ -460,6 +460,60 @@ PRE(evtchn_op_compat) evtchn->cmd, &evtchn->u, 1); } +PRE(physdev_op) +{ + int cmd = ARG1; + + PRINT("__HYPERVISOR_physdev_op ( %ld, %lx )", ARG1, ARG2); + +#define PRE_XEN_PHYSDEVOP_READ(_op, _field) \ + PRE_MEM_READ("XEN_PHYSDEVOP_" #_op " ." #_field, \ + (Addr)&arg->_field, \ + sizeof(arg->_field)) + + switch (cmd) { + case VKI_XEN_PHYSDEVOP_map_pirq: { + struct vki_xen_physdev_map_pirq *arg = + (struct vki_xen_physdev_map_pirq *)ARG2; + + PRE_XEN_PHYSDEVOP_READ("map_pirq", domid); + PRE_XEN_PHYSDEVOP_READ("map_pirq", type); + + PRE_XEN_PHYSDEVOP_READ("map_pirq", bus); + PRE_XEN_PHYSDEVOP_READ("map_pirq", devfn); + PRE_XEN_PHYSDEVOP_READ("map_pirq", entry_nr); + PRE_XEN_PHYSDEVOP_READ("map_pirq", table_base); + + switch(arg->type) { + case VKI_XEN_MAP_PIRQ_TYPE_MSI: + PRE_XEN_PHYSDEVOP_READ("map_pirq", index); + break; + case VKI_XEN_MAP_PIRQ_TYPE_GSI: + PRE_XEN_PHYSDEVOP_READ("map_pirq", index); + PRE_XEN_PHYSDEVOP_READ("map_pirq", pirq); + break; + case VKI_XEN_MAP_PIRQ_TYPE_MSI_SEG: + PRE_XEN_PHYSDEVOP_READ("map_pirq", index); + break; + case VKI_XEN_MAP_PIRQ_TYPE_MULTI_MSI: + break; + } + break; + } + case VKI_XEN_PHYSDEVOP_unmap_pirq: { + struct vki_xen_physdev_unmap_pirq *arg = + (struct vki_xen_physdev_unmap_pirq *)ARG2; + PRE_XEN_PHYSDEVOP_READ("unmap_pirq", domid); + PRE_XEN_PHYSDEVOP_READ("unmap_pirq", pirq); + break; + } + default: + bad_subop(tid, layout, arrghs, status, flags, + "__HYPERVISOR_physdev_op", cmd); + } +#undef PRE_XEN_PHYSDEVOP_READ +} + PRE(xen_version) { PRINT("__HYPERVISOR_xen_version ( %ld, %lx )", ARG1, ARG2); @@ -1388,6 +1442,33 @@ POST(evtchn_op_compat) post_evtchn_op(tid, evtchn->cmd, &evtchn->u, 1); } +POST(physdev_op) +{ + int cmd = ARG1; + +#define POST_XEN_PHYSDEVOP_WRITE(_op, _field) \ + POST_MEM_WRITE((Addr)&arg->_field, sizeof(arg->_field)) + + switch (cmd) { + case VKI_XEN_PHYSDEVOP_unmap_pirq: + /* No outputs */ + break; + + case VKI_XEN_PHYSDEVOP_map_pirq: { + struct vki_xen_physdev_map_pirq *arg = + (struct vki_xen_physdev_map_pirq *)ARG2; + if (arg->type == VKI_XEN_MAP_PIRQ_TYPE_MULTI_MSI) + POST_XEN_PHYSDEVOP_WRITE("map_pirq", entry_nr); + POST_XEN_PHYSDEVOP_WRITE("map_pirq", pirq); + break; + } +#undef POST_XEN_PHYSDEVOP_WRITE + + default: + break; + } +} + POST(xen_version) { switch (ARG1) { @@ -1989,7 +2070,7 @@ static XenHypercallTableEntry hypercall_table[] = { // __VKI_XEN_callback_op // 30 // __VKI_XEN_xenoprof_op // 31 HYPXY(__VKI_XEN_event_channel_op, evtchn_op, 2), // 32 - // __VKI_XEN_physdev_op // 33 + HYPXY(__VKI_XEN_physdev_op, physdev_op, 2), // 33 HYPXY(__VKI_XEN_hvm_op, hvm_op, 2), // 34 HYPXY(__VKI_XEN_sysctl, sysctl, 1), // 35 diff --git a/include/vki/vki-xen-physdev.h b/include/vki/vki-xen-physdev.h new file mode 100644 index 0000000000..b4f05c5f41 --- /dev/null +++ b/include/vki/vki-xen-physdev.h @@ -0,0 +1,40 @@ +#ifndef __VKI_XEN_PHYSDEV__H +#define __VKI_XEN_PHYSDEV_H + +#define VKI_XEN_MAP_PIRQ_TYPE_MSI 0x0 +#define VKI_XEN_MAP_PIRQ_TYPE_GSI 0x1 +#define VKI_XEN_MAP_PIRQ_TYPE_UNKNOWN 0x2 +#define VKI_XEN_MAP_PIRQ_TYPE_MSI_SEG 0x3 +#define VKI_XEN_MAP_PIRQ_TYPE_MULTI_MSI 0x4 + +#define VKI_XEN_PHYSDEVOP_map_pirq 13 +struct vki_xen_physdev_map_pirq { + vki_xen_domid_t domid; + /* IN */ + int type; + /* IN (ignored for ..._MULTI_MSI) */ + int index; + /* IN or OUT */ + int pirq; + /* IN - high 16 bits hold segment for ..._MSI_SEG and ..._MULTI_MSI */ + int bus; + /* IN */ + int devfn; + /* IN (also OUT for ..._MULTI_MSI) */ + 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; +}; + +#endif // __VKI_XEN_PHYSDEV_H + +/*--------------------------------------------------------------------*/ +/*--- end ---*/ +/*--------------------------------------------------------------------*/ diff --git a/include/vki/vki-xen.h b/include/vki/vki-xen.h index 8812b3e076..69b85019c6 100644 --- a/include/vki/vki-xen.h +++ b/include/vki/vki-xen.h @@ -88,6 +88,7 @@ struct vki_xenctl_bitmap { #include #include #include +#include #endif // __VKI_XEN_H -- 2.47.2