1 /******************************************************************************
2 * arch/x86/x86_64/domain.c
3 *
4 */
5
6 #include <xen/types.h>
7 #include <xen/guest_access.h>
8 #include <xen/hypercall.h>
9 #include <compat/vcpu.h>
10
11 #define xen_vcpu_get_physid vcpu_get_physid
12 CHECK_vcpu_get_physid;
13 #undef xen_vcpu_get_physid
14
15 int
arch_compat_vcpu_op(int cmd,struct vcpu * v,XEN_GUEST_HANDLE_PARAM (void)arg)16 arch_compat_vcpu_op(
17 int cmd, struct vcpu *v, XEN_GUEST_HANDLE_PARAM(void) arg)
18 {
19 int rc = -ENOSYS;
20
21 switch ( cmd )
22 {
23 case VCPUOP_register_runstate_memory_area:
24 {
25 struct compat_vcpu_register_runstate_memory_area area;
26 struct compat_vcpu_runstate_info info;
27
28 area.addr.p = 0;
29
30 rc = -EFAULT;
31 if ( copy_from_guest(&area.addr.h, arg, 1) )
32 break;
33
34 if ( area.addr.h.c != area.addr.p ||
35 !compat_handle_okay(area.addr.h, 1) )
36 break;
37
38 rc = 0;
39 guest_from_compat_handle(v->runstate_guest.compat, area.addr.h);
40
41 if ( v == current )
42 {
43 XLAT_vcpu_runstate_info(&info, &v->runstate);
44 }
45 else
46 {
47 struct vcpu_runstate_info runstate;
48
49 vcpu_runstate_get(v, &runstate);
50 XLAT_vcpu_runstate_info(&info, &runstate);
51 }
52 __copy_to_guest(v->runstate_guest.compat, &info, 1);
53
54 break;
55 }
56
57 case VCPUOP_get_physid:
58 rc = arch_do_vcpu_op(cmd, v, arg);
59 break;
60 }
61
62 return rc;
63 }
64
65 /*
66 * Local variables:
67 * mode: C
68 * c-file-style: "BSD"
69 * c-basic-offset: 4
70 * tab-width: 4
71 * indent-tabs-mode: nil
72 * End:
73 */
74