diff --git a/coregrind/m_syswrap/syswrap-xen.c b/coregrind/m_syswrap/syswrap-xen.c index d897ed87e..9d2a204a8 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 000000000..b4f05c5f4 --- /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 8812b3e07..69b85019c 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