|  | #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); | 
|  |  | 
|  | int xen_physdev_op_compat(int cmd, void *arg) | 
|  | { | 
|  | 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; | 
|  | } | 
|  | EXPORT_SYMBOL_GPL(xen_physdev_op_compat); |