1/****************************************************************************** 2 * hypervisor.h 3 * 4 * Linux-specific hypervisor handling. 5 * 6 * Copyright (c) 2002, K A Fraser 7 * 8 * $FreeBSD: releng/11.0/sys/xen/hypervisor.h 289686 2015-10-21 10:44:07Z royger $ 9 */ 10 11#ifndef __XEN_HYPERVISOR_H__ 12#define __XEN_HYPERVISOR_H__ 13 14#include <sys/cdefs.h> 15#include <sys/systm.h> 16#include <xen/interface/xen.h> 17#include <xen/interface/platform.h> 18#include <xen/interface/event_channel.h> 19#include <xen/interface/physdev.h> 20#include <xen/interface/sched.h> 21#include <xen/interface/callback.h> 22#include <xen/interface/memory.h> 23#include <machine/xen/hypercall.h> 24 25extern uint64_t get_system_time(int ticks); 26 27static inline int 28HYPERVISOR_console_write(const char *str, int count) 29{ 30 return HYPERVISOR_console_io(CONSOLEIO_write, count, str); 31} 32 33static inline int 34HYPERVISOR_yield(void) 35{ 36 int rc = HYPERVISOR_sched_op(SCHEDOP_yield, NULL); 37 38#if CONFIG_XEN_COMPAT <= 0x030002 39 if (rc == -ENOXENSYS) 40 rc = HYPERVISOR_sched_op_compat(SCHEDOP_yield, 0); 41#endif 42 return (rc); 43} 44 45static inline int 46HYPERVISOR_block( 47 void) 48{ 49 int rc = HYPERVISOR_sched_op(SCHEDOP_block, NULL); 50 51#if CONFIG_XEN_COMPAT <= 0x030002 52 if (rc == -ENOXENSYS) 53 rc = HYPERVISOR_sched_op_compat(SCHEDOP_block, 0); 54#endif 55 return (rc); 56} 57 58 59static inline void 60HYPERVISOR_shutdown(unsigned int reason) 61{ 62 struct sched_shutdown sched_shutdown = { 63 .reason = reason 64 }; 65 66 HYPERVISOR_sched_op(SCHEDOP_shutdown, &sched_shutdown); 67#if CONFIG_XEN_COMPAT <= 0x030002 68 HYPERVISOR_sched_op_compat(SCHEDOP_shutdown, reason); 69#endif 70} 71 72static inline void 73HYPERVISOR_crash(void) 74{ 75 HYPERVISOR_shutdown(SHUTDOWN_crash); 76 /* NEVER REACHED */ 77 for (;;) ; /* eliminate noreturn error */ 78} 79 80/* Transfer control to hypervisor until an event is detected on one */ 81/* of the specified ports or the specified number of ticks elapse */ 82static inline int 83HYPERVISOR_poll( 84 evtchn_port_t *ports, unsigned int nr_ports, int ticks) 85{ 86 int rc; 87 struct sched_poll sched_poll = { 88 .nr_ports = nr_ports, 89 .timeout = get_system_time(ticks) 90 }; 91 set_xen_guest_handle(sched_poll.ports, ports); 92 93 rc = HYPERVISOR_sched_op(SCHEDOP_poll, &sched_poll); 94#if CONFIG_XEN_COMPAT <= 0x030002 95 if (rc == -ENOXENSYS) 96 rc = HYPERVISOR_sched_op_compat(SCHEDOP_yield, 0); 97#endif 98 return (rc); 99} 100 101#endif /* __XEN_HYPERVISOR_H__ */ 102