1 /****************************************************************************** 2 * hypervisor.h 3 * 4 * Linux-specific hypervisor handling. 5 * 6 * Copyright (c) 2002, K A Fraser 7 * 8 * $FreeBSD$ 9 */ 10 11 #ifndef __XEN_HYPERVISOR_H__ 12 #define __XEN_HYPERVISOR_H__ 13 14 #ifdef XENHVM 15 16 #define is_running_on_xen() (HYPERVISOR_shared_info != NULL) 17 18 #else 19 20 #define is_running_on_xen() 1 21 22 #endif 23 24 #ifdef PAE 25 #ifndef CONFIG_X86_PAE 26 #define CONFIG_X86_PAE 27 #endif 28 #endif 29 30 #include <sys/cdefs.h> 31 #include <sys/systm.h> 32 #include <xen/interface/xen.h> 33 #include <xen/interface/platform.h> 34 #include <xen/interface/event_channel.h> 35 #include <xen/interface/physdev.h> 36 #include <xen/interface/sched.h> 37 #include <xen/interface/callback.h> 38 #include <xen/interface/memory.h> 39 #include <machine/xen/hypercall.h> 40 41 #if defined(__amd64__) 42 #define MULTI_UVMFLAGS_INDEX 2 43 #define MULTI_UVMDOMID_INDEX 3 44 #else 45 #define MULTI_UVMFLAGS_INDEX 3 46 #define MULTI_UVMDOMID_INDEX 4 47 #endif 48 49 #ifdef CONFIG_XEN_PRIVILEGED_GUEST 50 #define is_initial_xendomain() (xen_start_info->flags & SIF_INITDOMAIN) 51 #else 52 #define is_initial_xendomain() 0 53 #endif 54 55 extern start_info_t *xen_start_info; 56 57 extern uint64_t get_system_time(int ticks); 58 59 static inline int 60 HYPERVISOR_console_write(char *str, int count) 61 { 62 return HYPERVISOR_console_io(CONSOLEIO_write, count, str); 63 } 64 65 static inline void HYPERVISOR_crash(void) __dead2; 66 67 static inline int 68 HYPERVISOR_yield(void) 69 { 70 int rc = HYPERVISOR_sched_op(SCHEDOP_yield, NULL); 71 72 #if CONFIG_XEN_COMPAT <= 0x030002 73 if (rc == -ENOXENSYS) 74 rc = HYPERVISOR_sched_op_compat(SCHEDOP_yield, 0); 75 #endif 76 return (rc); 77 } 78 79 static inline int 80 HYPERVISOR_block( 81 void) 82 { 83 int rc = HYPERVISOR_sched_op(SCHEDOP_block, NULL); 84 85 #if CONFIG_XEN_COMPAT <= 0x030002 86 if (rc == -ENOXENSYS) 87 rc = HYPERVISOR_sched_op_compat(SCHEDOP_block, 0); 88 #endif 89 return (rc); 90 } 91 92 93 static inline void 94 HYPERVISOR_shutdown(unsigned int reason) 95 { 96 struct sched_shutdown sched_shutdown = { 97 .reason = reason 98 }; 99 100 HYPERVISOR_sched_op(SCHEDOP_shutdown, &sched_shutdown); 101 #if CONFIG_XEN_COMPAT <= 0x030002 102 HYPERVISOR_sched_op_compat(SCHEDOP_shutdown, reason); 103 #endif 104 } 105 106 static inline void 107 HYPERVISOR_crash(void) 108 { 109 HYPERVISOR_shutdown(SHUTDOWN_crash); 110 /* NEVER REACHED */ 111 for (;;) ; /* eliminate noreturn error */ 112 } 113 114 /* Transfer control to hypervisor until an event is detected on one */ 115 /* of the specified ports or the specified number of ticks elapse */ 116 static inline int 117 HYPERVISOR_poll( 118 evtchn_port_t *ports, unsigned int nr_ports, int ticks) 119 { 120 int rc; 121 struct sched_poll sched_poll = { 122 .nr_ports = nr_ports, 123 .timeout = get_system_time(ticks) 124 }; 125 set_xen_guest_handle(sched_poll.ports, ports); 126 127 rc = HYPERVISOR_sched_op(SCHEDOP_poll, &sched_poll); 128 #if CONFIG_XEN_COMPAT <= 0x030002 129 if (rc == -ENOXENSYS) 130 rc = HYPERVISOR_sched_op_compat(SCHEDOP_yield, 0); 131 #endif 132 return (rc); 133 } 134 135 static inline void 136 MULTI_update_va_mapping( 137 multicall_entry_t *mcl, unsigned long va, 138 uint64_t new_val, unsigned long flags) 139 { 140 mcl->op = __HYPERVISOR_update_va_mapping; 141 mcl->args[0] = va; 142 #if defined(__amd64__) 143 mcl->args[1] = new_val; 144 #elif defined(PAE) 145 mcl->args[1] = (uint32_t)(new_val & 0xffffffff) ; 146 mcl->args[2] = (uint32_t)(new_val >> 32); 147 #else 148 mcl->args[1] = new_val; 149 mcl->args[2] = 0; 150 #endif 151 mcl->args[MULTI_UVMFLAGS_INDEX] = flags; 152 } 153 154 #endif /* __XEN_HYPERVISOR_H__ */ 155