1 /******************************************************************************
2  * asm-x86/hypercall.h
3  */
4 
5 #ifndef __ASM_X86_HYPERCALL_H__
6 #define __ASM_X86_HYPERCALL_H__
7 
8 #include <xen/types.h>
9 #include <public/physdev.h>
10 #include <public/event_channel.h>
11 #include <public/arch-x86/xen-mca.h> /* for do_mca */
12 #include <asm/paging.h>
13 
14 typedef unsigned long hypercall_fn_t(
15     unsigned long, unsigned long, unsigned long,
16     unsigned long, unsigned long, unsigned long);
17 
18 typedef struct {
19     hypercall_fn_t *native, *compat;
20 } hypercall_table_t;
21 
22 typedef struct {
23     uint8_t native, compat;
24 } hypercall_args_t;
25 
26 extern const hypercall_args_t hypercall_args_table[NR_hypercalls];
27 
28 void pv_hypercall(struct cpu_user_regs *regs);
29 void hypercall_page_initialise_ring3_kernel(void *hypercall_page);
30 void hypercall_page_initialise_ring1_kernel(void *hypercall_page);
31 void pv_hypercall_table_replace(unsigned int hypercall, hypercall_fn_t * native,
32                                 hypercall_fn_t *compat);
33 hypercall_fn_t *pv_get_hypercall_handler(unsigned int hypercall, bool compat);
34 
35 /*
36  * Both do_mmuext_op() and do_mmu_update():
37  * We steal the m.s.b. of the @count parameter to indicate whether this
38  * invocation of do_mmu_update() is resuming a previously preempted call.
39  */
40 #define MMU_UPDATE_PREEMPTED          (~(~0U>>1))
41 
42 extern long
43 do_event_channel_op_compat(
44     XEN_GUEST_HANDLE_PARAM(evtchn_op_t) uop);
45 
46 /* Legacy hypercall (as of 0x00030202). */
47 extern long do_physdev_op_compat(
48     XEN_GUEST_HANDLE(physdev_op_t) uop);
49 
50 /* Legacy hypercall (as of 0x00030101). */
51 extern long do_sched_op_compat(
52     int cmd, unsigned long arg);
53 
54 extern long
55 do_set_trap_table(
56     XEN_GUEST_HANDLE_PARAM(const_trap_info_t) traps);
57 
58 extern long
59 do_mmu_update(
60     XEN_GUEST_HANDLE_PARAM(mmu_update_t) ureqs,
61     unsigned int count,
62     XEN_GUEST_HANDLE_PARAM(uint) pdone,
63     unsigned int foreigndom);
64 
65 extern long
66 do_set_gdt(
67     XEN_GUEST_HANDLE_PARAM(xen_ulong_t) frame_list,
68     unsigned int entries);
69 
70 extern long
71 do_stack_switch(
72     unsigned long ss,
73     unsigned long esp);
74 
75 extern long
76 do_fpu_taskswitch(
77     int set);
78 
79 extern long
80 do_set_debugreg(
81     int reg,
82     unsigned long value);
83 
84 extern unsigned long
85 do_get_debugreg(
86     int reg);
87 
88 extern long
89 do_update_descriptor(
90     u64 pa,
91     u64 desc);
92 
93 extern long
94 do_mca(XEN_GUEST_HANDLE_PARAM(xen_mc_t) u_xen_mc);
95 
96 extern long
97 do_update_va_mapping(
98     unsigned long va,
99     u64 val64,
100     unsigned long flags);
101 
102 extern long
103 do_physdev_op(
104     int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
105 
106 extern long
107 do_update_va_mapping_otherdomain(
108     unsigned long va,
109     u64 val64,
110     unsigned long flags,
111     domid_t domid);
112 
113 extern long
114 do_mmuext_op(
115     XEN_GUEST_HANDLE_PARAM(mmuext_op_t) uops,
116     unsigned int count,
117     XEN_GUEST_HANDLE_PARAM(uint) pdone,
118     unsigned int foreigndom);
119 
120 extern long do_callback_op(
121     int cmd, XEN_GUEST_HANDLE_PARAM(const_void) arg);
122 
123 extern unsigned long
124 do_iret(
125     void);
126 
127 extern long
128 do_set_callbacks(
129     unsigned long event_address,
130     unsigned long failsafe_address,
131     unsigned long syscall_address);
132 
133 extern long
134 do_set_segment_base(
135     unsigned int which,
136     unsigned long base);
137 
138 #ifdef CONFIG_COMPAT
139 
140 #include <compat/arch-x86/xen.h>
141 #include <compat/physdev.h>
142 
143 extern int
144 compat_physdev_op(
145     int cmd,
146     XEN_GUEST_HANDLE_PARAM(void) arg);
147 
148 extern int
149 arch_compat_vcpu_op(
150     int cmd, struct vcpu *v, XEN_GUEST_HANDLE_PARAM(void) arg);
151 
152 extern int compat_mmuext_op(
153     XEN_GUEST_HANDLE_PARAM(void) arg,
154     unsigned int count,
155     XEN_GUEST_HANDLE_PARAM(uint) pdone,
156     unsigned int foreigndom);
157 
158 extern int compat_platform_op(
159     XEN_GUEST_HANDLE_PARAM(void) u_xenpf_op);
160 
161 extern long compat_callback_op(
162     int cmd, XEN_GUEST_HANDLE(void) arg);
163 
164 extern int compat_update_va_mapping(
165     unsigned int va, u32 lo, u32 hi, unsigned int flags);
166 
167 extern int compat_update_va_mapping_otherdomain(
168     unsigned long va, u32 lo, u32 hi, unsigned long flags, domid_t domid);
169 
170 DEFINE_XEN_GUEST_HANDLE(trap_info_compat_t);
171 extern int compat_set_trap_table(XEN_GUEST_HANDLE(trap_info_compat_t) traps);
172 
173 extern int compat_set_gdt(
174     XEN_GUEST_HANDLE_PARAM(uint) frame_list, unsigned int entries);
175 
176 extern int compat_update_descriptor(
177     u32 pa_lo, u32 pa_hi, u32 desc_lo, u32 desc_hi);
178 
179 extern unsigned int compat_iret(void);
180 
181 extern int compat_nmi_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
182 
183 extern long compat_set_callbacks(
184     unsigned long event_selector, unsigned long event_address,
185     unsigned long failsafe_selector, unsigned long failsafe_address);
186 
187 DEFINE_XEN_GUEST_HANDLE(physdev_op_compat_t);
188 extern int compat_physdev_op_compat(XEN_GUEST_HANDLE(physdev_op_compat_t) uop);
189 
190 #endif /* CONFIG_COMPAT */
191 
192 #endif /* __ASM_X86_HYPERCALL_H__ */
193