1#include <linux/kernel.h> 2#include <linux/string.h> 3#include <linux/bug.h> 4#include <linux/export.h> 5#include <asm/hypervisor.h> 6#include <asm/xen/hypercall.h> 7 8int xen_event_channel_op_compat(int cmd, void *arg) 9{ 10 struct evtchn_op op; 11 int rc; 12 13 op.cmd = cmd; 14 memcpy(&op.u, arg, sizeof(op.u)); 15 rc = _hypercall1(int, event_channel_op_compat, &op); 16 17 switch (cmd) { 18 case EVTCHNOP_close: 19 case EVTCHNOP_send: 20 case EVTCHNOP_bind_vcpu: 21 case EVTCHNOP_unmask: 22 /* no output */ 23 break; 24 25#define COPY_BACK(eop) \ 26 case EVTCHNOP_##eop: \ 27 memcpy(arg, &op.u.eop, sizeof(op.u.eop)); \ 28 break 29 30 COPY_BACK(bind_interdomain); 31 COPY_BACK(bind_virq); 32 COPY_BACK(bind_pirq); 33 COPY_BACK(status); 34 COPY_BACK(alloc_unbound); 35 COPY_BACK(bind_ipi); 36#undef COPY_BACK 37 38 default: 39 WARN_ON(rc != -ENOSYS); 40 break; 41 } 42 43 return rc; 44} 45EXPORT_SYMBOL_GPL(xen_event_channel_op_compat); 46 47int xen_physdev_op_compat(int cmd, void *arg) 48{ 49 struct physdev_op op; 50 int rc; 51 52 op.cmd = cmd; 53 memcpy(&op.u, arg, sizeof(op.u)); 54 rc = _hypercall1(int, physdev_op_compat, &op); 55 56 switch (cmd) { 57 case PHYSDEVOP_IRQ_UNMASK_NOTIFY: 58 case PHYSDEVOP_set_iopl: 59 case PHYSDEVOP_set_iobitmap: 60 case PHYSDEVOP_apic_write: 61 /* no output */ 62 break; 63 64#define COPY_BACK(pop, fld) \ 65 case PHYSDEVOP_##pop: \ 66 memcpy(arg, &op.u.fld, sizeof(op.u.fld)); \ 67 break 68 69 COPY_BACK(irq_status_query, irq_status_query); 70 COPY_BACK(apic_read, apic_op); 71 COPY_BACK(ASSIGN_VECTOR, irq_op); 72#undef COPY_BACK 73 74 default: 75 WARN_ON(rc != -ENOSYS); 76 break; 77 } 78 79 return rc; 80} 81EXPORT_SYMBOL_GPL(xen_physdev_op_compat); 82