xen: Implement physdev_op and map_pirq

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15385
This commit is contained in:
Bart Van Assche 2015-06-28 16:57:10 +00:00
parent b64fedcf91
commit a914bcf7f5
3 changed files with 123 additions and 1 deletions

View File

@ -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

View File

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

View File

@ -88,6 +88,7 @@ struct vki_xenctl_bitmap {
#include <vki/vki-xen-hvm.h>
#include <vki/vki-xen-tmem.h>
#include <vki/vki-xen-xsm.h>
#include <vki/vki-xen-physdev.h>
#endif // __VKI_XEN_H