]>
Commit | Line | Data |
---|---|---|
cf47a83f JB |
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 | ||
8 | int 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 | } | |
45 | EXPORT_SYMBOL_GPL(xen_event_channel_op_compat); | |
46 | ||
909b3fdb | 47 | int xen_physdev_op_compat(int cmd, void *arg) |
cf47a83f JB |
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 | } | |
909b3fdb | 81 | EXPORT_SYMBOL_GPL(xen_physdev_op_compat); |