1255040Sgibbs/****************************************************************************** 2255040Sgibbs * evtchn.h 3255040Sgibbs * 4255040Sgibbs * Data structures and definitions private to the FreeBSD implementation 5255040Sgibbs * of the Xen event channel API. 6255040Sgibbs * 7255040Sgibbs * Copyright (c) 2004, K A Fraser 8255040Sgibbs * Copyright (c) 2012, Spectra Logic Corporation 9255040Sgibbs * 10255040Sgibbs * This file may be distributed separately from the Linux kernel, or 11255040Sgibbs * incorporated into other software packages, subject to the following license: 12255040Sgibbs * 13255040Sgibbs * Permission is hereby granted, free of charge, to any person obtaining a copy 14255040Sgibbs * of this source file (the "Software"), to deal in the Software without 15255040Sgibbs * restriction, including without limitation the rights to use, copy, modify, 16255040Sgibbs * merge, publish, distribute, sublicense, and/or sell copies of the Software, 17255040Sgibbs * and to permit persons to whom the Software is furnished to do so, subject to 18255040Sgibbs * the following conditions: 19255040Sgibbs * 20255040Sgibbs * The above copyright notice and this permission notice shall be included in 21255040Sgibbs * all copies or substantial portions of the Software. 22255040Sgibbs * 23255040Sgibbs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 24255040Sgibbs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 25255040Sgibbs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 26255040Sgibbs * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 27255040Sgibbs * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 28255040Sgibbs * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 29255040Sgibbs * IN THE SOFTWARE. 30255040Sgibbs * 31255040Sgibbs * $FreeBSD$ 32255040Sgibbs */ 33255040Sgibbs 34255040Sgibbs#ifndef __XEN_EVTCHN_EVTCHNVAR_H__ 35255040Sgibbs#define __XEN_EVTCHN_EVTCHNVAR_H__ 36255040Sgibbs 37255040Sgibbs#include <xen/hypervisor.h> 38255040Sgibbs#include <xen/interface/event_channel.h> 39255040Sgibbs 40255040Sgibbsenum evtchn_type { 41255040Sgibbs EVTCHN_TYPE_UNBOUND, 42255040Sgibbs EVTCHN_TYPE_PIRQ, 43255040Sgibbs EVTCHN_TYPE_VIRQ, 44255040Sgibbs EVTCHN_TYPE_IPI, 45255040Sgibbs EVTCHN_TYPE_PORT, 46255040Sgibbs EVTCHN_TYPE_COUNT 47255040Sgibbs}; 48255040Sgibbs 49255040Sgibbs/** Submit a port notification for delivery to a userland evtchn consumer */ 50255040Sgibbsvoid evtchn_device_upcall(evtchn_port_t port); 51255040Sgibbs 52255040Sgibbs/** 53255040Sgibbs * Disable signal delivery for an event channel port, returning its 54255040Sgibbs * previous mask state. 55255040Sgibbs * 56255040Sgibbs * \param port The event channel port to query and mask. 57255040Sgibbs * 58255040Sgibbs * \returns 1 if event delivery was previously disabled. Otherwise 0. 59255040Sgibbs */ 60255040Sgibbsstatic inline int 61255040Sgibbsevtchn_test_and_set_mask(evtchn_port_t port) 62255040Sgibbs{ 63255040Sgibbs shared_info_t *s = HYPERVISOR_shared_info; 64255040Sgibbs return synch_test_and_set_bit(port, s->evtchn_mask); 65255040Sgibbs} 66255040Sgibbs 67255040Sgibbs/** 68255040Sgibbs * Clear any pending event for the given event channel port. 69255040Sgibbs * 70255040Sgibbs * \param port The event channel port to clear. 71255040Sgibbs */ 72255040Sgibbsstatic inline void 73255040Sgibbsevtchn_clear_port(evtchn_port_t port) 74255040Sgibbs{ 75255040Sgibbs shared_info_t *s = HYPERVISOR_shared_info; 76255040Sgibbs synch_clear_bit(port, &s->evtchn_pending[0]); 77255040Sgibbs} 78255040Sgibbs 79255040Sgibbs/** 80255040Sgibbs * Disable signal delivery for an event channel port. 81255040Sgibbs * 82255040Sgibbs * \param port The event channel port to mask. 83255040Sgibbs */ 84255040Sgibbsstatic inline void 85255040Sgibbsevtchn_mask_port(evtchn_port_t port) 86255040Sgibbs{ 87255040Sgibbs shared_info_t *s = HYPERVISOR_shared_info; 88255040Sgibbs 89255040Sgibbs synch_set_bit(port, &s->evtchn_mask[0]); 90255040Sgibbs} 91255040Sgibbs 92255040Sgibbs/** 93255040Sgibbs * Enable signal delivery for an event channel port. 94255040Sgibbs * 95255040Sgibbs * \param port The event channel port to enable. 96255040Sgibbs */ 97255040Sgibbsstatic inline void 98255040Sgibbsevtchn_unmask_port(evtchn_port_t port) 99255040Sgibbs{ 100255040Sgibbs evtchn_unmask_t op = { .port = port }; 101255040Sgibbs 102255040Sgibbs HYPERVISOR_event_channel_op(EVTCHNOP_unmask, &op); 103255040Sgibbs} 104255040Sgibbs 105255040Sgibbs#endif /* __XEN_EVTCHN_EVTCHNVAR_H__ */ 106