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