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