2012-10-19 23:25:37 +04:00
# include <linux/kernel.h>
# include <linux/string.h>
# include <linux/bug.h>
# include <linux/export.h>
# include <asm/hypervisor.h>
# include <asm/xen/hypercall.h>
int xen_event_channel_op_compat ( int cmd , void * arg )
{
struct evtchn_op op ;
int rc ;
op . cmd = cmd ;
memcpy ( & op . u , arg , sizeof ( op . u ) ) ;
rc = _hypercall1 ( int , event_channel_op_compat , & op ) ;
switch ( cmd ) {
case EVTCHNOP_close :
case EVTCHNOP_send :
case EVTCHNOP_bind_vcpu :
case EVTCHNOP_unmask :
/* no output */
break ;
# define COPY_BACK(eop) \
case EVTCHNOP_ # # eop : \
memcpy ( arg , & op . u . eop , sizeof ( op . u . eop ) ) ; \
break
COPY_BACK ( bind_interdomain ) ;
COPY_BACK ( bind_virq ) ;
COPY_BACK ( bind_pirq ) ;
COPY_BACK ( status ) ;
COPY_BACK ( alloc_unbound ) ;
COPY_BACK ( bind_ipi ) ;
# undef COPY_BACK
default :
WARN_ON ( rc ! = - ENOSYS ) ;
break ;
}
return rc ;
}
EXPORT_SYMBOL_GPL ( xen_event_channel_op_compat ) ;
2013-03-12 19:06:23 +04:00
int xen_physdev_op_compat ( int cmd , void * arg )
2012-10-19 23:25:37 +04:00
{
struct physdev_op op ;
int rc ;
op . cmd = cmd ;
memcpy ( & op . u , arg , sizeof ( op . u ) ) ;
rc = _hypercall1 ( int , physdev_op_compat , & op ) ;
switch ( cmd ) {
case PHYSDEVOP_IRQ_UNMASK_NOTIFY :
case PHYSDEVOP_set_iopl :
case PHYSDEVOP_set_iobitmap :
case PHYSDEVOP_apic_write :
/* no output */
break ;
# define COPY_BACK(pop, fld) \
case PHYSDEVOP_ # # pop : \
memcpy ( arg , & op . u . fld , sizeof ( op . u . fld ) ) ; \
break
COPY_BACK ( irq_status_query , irq_status_query ) ;
COPY_BACK ( apic_read , apic_op ) ;
COPY_BACK ( ASSIGN_VECTOR , irq_op ) ;
# undef COPY_BACK
default :
WARN_ON ( rc ! = - ENOSYS ) ;
break ;
}
return rc ;
}
2013-03-12 19:06:23 +04:00
EXPORT_SYMBOL_GPL ( xen_physdev_op_compat ) ;