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