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