| #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); |