Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
fallback.c
Go to the documentation of this file.
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 
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 
36 #undef COPY_BACK
37 
38  default:
39  WARN_ON(rc != -ENOSYS);
40  break;
41  }
42 
43  return rc;
44 }
46 
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) {
58  case PHYSDEVOP_set_iopl:
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 
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 }