1 /******************************************************************************
2 * compat.c
3 *
4 * Implementations of legacy hypercalls. These call through to the new
5 * hypercall after doing necessary argument munging.
6 */
7
8 #include <xen/guest_access.h>
9 #include <xen/hypercall.h>
10 #include <xen/trace.h>
11 #include <public/sched.h>
12
13 #ifndef COMPAT
14 typedef long ret_t;
15 #endif
16
17 /* Legacy hypercall (as of 0x00030202). */
do_physdev_op_compat(XEN_GUEST_HANDLE (physdev_op_t)uop)18 ret_t do_physdev_op_compat(XEN_GUEST_HANDLE(physdev_op_t) uop)
19 {
20 struct physdev_op op;
21
22 if ( unlikely(copy_from_guest(&op, uop, 1) != 0) )
23 return -EFAULT;
24
25 return do_physdev_op(op.cmd, guest_handle_from_ptr(&uop.p->u, void));
26 }
27
28 #ifndef COMPAT
29
30 /* Legacy hypercall (as of 0x00030101). */
do_sched_op_compat(int cmd,unsigned long arg)31 long do_sched_op_compat(int cmd, unsigned long arg)
32 {
33 switch ( cmd )
34 {
35 case SCHEDOP_yield:
36 case SCHEDOP_block:
37 return do_sched_op(cmd, guest_handle_from_ptr(NULL, void));
38
39 case SCHEDOP_shutdown:
40 TRACE_3D(TRC_SCHED_SHUTDOWN,
41 current->domain->domain_id, current->vcpu_id, arg);
42 domain_shutdown(current->domain, (u8)arg);
43 break;
44
45 default:
46 return -ENOSYS;
47 }
48
49 return 0;
50 }
51
52 /* Legacy hypercall (as of 0x00030202). */
do_event_channel_op_compat(XEN_GUEST_HANDLE_PARAM (evtchn_op_t)uop)53 long do_event_channel_op_compat(XEN_GUEST_HANDLE_PARAM(evtchn_op_t) uop)
54 {
55 struct evtchn_op op;
56
57 if ( unlikely(copy_from_guest(&op, uop, 1) != 0) )
58 return -EFAULT;
59
60 switch ( op.cmd )
61 {
62 case EVTCHNOP_bind_interdomain:
63 case EVTCHNOP_bind_virq:
64 case EVTCHNOP_bind_pirq:
65 case EVTCHNOP_close:
66 case EVTCHNOP_send:
67 case EVTCHNOP_status:
68 case EVTCHNOP_alloc_unbound:
69 case EVTCHNOP_bind_ipi:
70 case EVTCHNOP_bind_vcpu:
71 case EVTCHNOP_unmask:
72 return pv_get_hypercall_handler(__HYPERVISOR_event_channel_op, false)
73 (op.cmd, (unsigned long)&uop.p->u, 0, 0, 0, 0);
74
75 default:
76 return -ENOSYS;
77 }
78 }
79
80 #endif
81