1*a8f6ac05SJustin T. Gibbs /* 2*a8f6ac05SJustin T. Gibbs * Permission is hereby granted, free of charge, to any person obtaining a copy 3*a8f6ac05SJustin T. Gibbs * of this software and associated documentation files (the "Software"), to 4*a8f6ac05SJustin T. Gibbs * deal in the Software without restriction, including without limitation the 5*a8f6ac05SJustin T. Gibbs * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 6*a8f6ac05SJustin T. Gibbs * sell copies of the Software, and to permit persons to whom the Software is 7*a8f6ac05SJustin T. Gibbs * furnished to do so, subject to the following conditions: 8*a8f6ac05SJustin T. Gibbs * 9*a8f6ac05SJustin T. Gibbs * The above copyright notice and this permission notice shall be included in 10*a8f6ac05SJustin T. Gibbs * all copies or substantial portions of the Software. 11*a8f6ac05SJustin T. Gibbs * 12*a8f6ac05SJustin T. Gibbs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 13*a8f6ac05SJustin T. Gibbs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 14*a8f6ac05SJustin T. Gibbs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 15*a8f6ac05SJustin T. Gibbs * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 16*a8f6ac05SJustin T. Gibbs * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 17*a8f6ac05SJustin T. Gibbs * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18*a8f6ac05SJustin T. Gibbs * DEALINGS IN THE SOFTWARE. 19*a8f6ac05SJustin T. Gibbs * 20*a8f6ac05SJustin T. Gibbs * $FreeBSD$ 21*a8f6ac05SJustin T. Gibbs */ 22*a8f6ac05SJustin T. Gibbs 23*a8f6ac05SJustin T. Gibbs #ifndef __XEN_HVM_H__ 24*a8f6ac05SJustin T. Gibbs #define __XEN_HVM_H__ 25*a8f6ac05SJustin T. Gibbs 26*a8f6ac05SJustin T. Gibbs #include <xen/interface/hvm/params.h> 27*a8f6ac05SJustin T. Gibbs 28*a8f6ac05SJustin T. Gibbs /** 29*a8f6ac05SJustin T. Gibbs * \brief Wrapper function to obtain a HVM parameter value. 30*a8f6ac05SJustin T. Gibbs * 31*a8f6ac05SJustin T. Gibbs * \param index HVM parameter index; see <xen/interface/hvm/params.h>. 32*a8f6ac05SJustin T. Gibbs * 33*a8f6ac05SJustin T. Gibbs * \returns 0 on failure; the value of the parameter otherwise. 34*a8f6ac05SJustin T. Gibbs */ 35*a8f6ac05SJustin T. Gibbs static inline unsigned long 36*a8f6ac05SJustin T. Gibbs hvm_get_parameter(int index) 37*a8f6ac05SJustin T. Gibbs { 38*a8f6ac05SJustin T. Gibbs struct xen_hvm_param xhv; 39*a8f6ac05SJustin T. Gibbs int error; 40*a8f6ac05SJustin T. Gibbs 41*a8f6ac05SJustin T. Gibbs xhv.domid = DOMID_SELF; 42*a8f6ac05SJustin T. Gibbs xhv.index = index; 43*a8f6ac05SJustin T. Gibbs error = HYPERVISOR_hvm_op(HVMOP_get_param, &xhv); 44*a8f6ac05SJustin T. Gibbs if (error) { 45*a8f6ac05SJustin T. Gibbs printf("%s: error %d trying to get %d\n", __func__, 46*a8f6ac05SJustin T. Gibbs error, index); 47*a8f6ac05SJustin T. Gibbs return (0); 48*a8f6ac05SJustin T. Gibbs } 49*a8f6ac05SJustin T. Gibbs return (xhv.value); 50*a8f6ac05SJustin T. Gibbs } 51*a8f6ac05SJustin T. Gibbs 52*a8f6ac05SJustin T. Gibbs /** The callback method types for Hypervisor event delivery to our domain. */ 53*a8f6ac05SJustin T. Gibbs enum { 54*a8f6ac05SJustin T. Gibbs HVM_CB_TYPE_GSI, 55*a8f6ac05SJustin T. Gibbs HVM_CB_TYPE_PCI_INTX, 56*a8f6ac05SJustin T. Gibbs HVM_CB_TYPE_VECTOR, 57*a8f6ac05SJustin T. Gibbs HVM_CB_TYPE_MASK = 0xFF, 58*a8f6ac05SJustin T. Gibbs HVM_CB_TYPE_SHIFT = 56 59*a8f6ac05SJustin T. Gibbs }; 60*a8f6ac05SJustin T. Gibbs 61*a8f6ac05SJustin T. Gibbs /** Format for specifying a GSI type callback. */ 62*a8f6ac05SJustin T. Gibbs enum { 63*a8f6ac05SJustin T. Gibbs HVM_CB_GSI_GSI_MASK = 0xFFFFFFFF, 64*a8f6ac05SJustin T. Gibbs HVM_CB_GSI_GSI_SHIFT = 0 65*a8f6ac05SJustin T. Gibbs }; 66*a8f6ac05SJustin T. Gibbs #define HVM_CALLBACK_GSI(gsi) \ 67*a8f6ac05SJustin T. Gibbs (((uint64_t)HVM_CB_TYPE_GSI << HVM_CB_TYPE_SHIFT) \ 68*a8f6ac05SJustin T. Gibbs | ((gsi) & HVM_CB_GSI_GSI_MASK) << HVM_CB_GSI_GSI_SHIFT) 69*a8f6ac05SJustin T. Gibbs 70*a8f6ac05SJustin T. Gibbs /** Format for specifying a virtual PCI interrupt line GSI style callback. */ 71*a8f6ac05SJustin T. Gibbs enum { 72*a8f6ac05SJustin T. Gibbs HVM_CB_PCI_INTX_INTPIN_MASK = 0x3, 73*a8f6ac05SJustin T. Gibbs HVM_CB_PCI_INTX_INTPIN_SHIFT = 0, 74*a8f6ac05SJustin T. Gibbs HVM_CB_PCI_INTX_SLOT_MASK = 0x1F, 75*a8f6ac05SJustin T. Gibbs HVM_CB_PCI_INTX_SLOT_SHIFT = 11, 76*a8f6ac05SJustin T. Gibbs }; 77*a8f6ac05SJustin T. Gibbs #define HVM_CALLBACK_PCI_INTX(slot, pin) \ 78*a8f6ac05SJustin T. Gibbs (((uint64_t)HVM_CB_TYPE_PCI_INTX << HVM_CB_TYPE_SHIFT) \ 79*a8f6ac05SJustin T. Gibbs | (((slot) & HVM_CB_PCI_INTX_SLOT_MASK) << HVM_CB_PCI_INTX_SLOT_SHIFT) \ 80*a8f6ac05SJustin T. Gibbs | (((pin) & HVM_CB_PCI_INTX_INTPIN_MASK) << HVM_CB_PCI_INTX_INTPIN_SHIFT)) 81*a8f6ac05SJustin T. Gibbs 82*a8f6ac05SJustin T. Gibbs /** Format for specifying a direct IDT vector injection style callback. */ 83*a8f6ac05SJustin T. Gibbs enum { 84*a8f6ac05SJustin T. Gibbs HVM_CB_VECTOR_VECTOR_MASK = 0xFFFFFFFF, 85*a8f6ac05SJustin T. Gibbs HVM_CB_VECTOR_VECTOR_SHIFT = 0 86*a8f6ac05SJustin T. Gibbs }; 87*a8f6ac05SJustin T. Gibbs #define HVM_CALLBACK_VECTOR(vector) \ 88*a8f6ac05SJustin T. Gibbs (((uint64_t)HVM_CB_TYPE_VECTOR << HVM_CB_TYPE_SHIFT) \ 89*a8f6ac05SJustin T. Gibbs | (((vector) & HVM_CB_GSI_GSI_MASK) << HVM_CB_GSI_GSI_SHIFT)) 90*a8f6ac05SJustin T. Gibbs 91*a8f6ac05SJustin T. Gibbs void xen_hvm_set_callback(device_t); 92*a8f6ac05SJustin T. Gibbs void xen_hvm_suspend(void); 93*a8f6ac05SJustin T. Gibbs void xen_hvm_resume(void); 94*a8f6ac05SJustin T. Gibbs #endif /* __XEN_HVM_H__ */ 95