1251767Sgibbs/* 2251767Sgibbs * Permission is hereby granted, free of charge, to any person obtaining a copy 3251767Sgibbs * of this software and associated documentation files (the "Software"), to 4251767Sgibbs * deal in the Software without restriction, including without limitation the 5251767Sgibbs * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 6251767Sgibbs * sell copies of the Software, and to permit persons to whom the Software is 7251767Sgibbs * furnished to do so, subject to the following conditions: 8251767Sgibbs * 9251767Sgibbs * The above copyright notice and this permission notice shall be included in 10251767Sgibbs * all copies or substantial portions of the Software. 11251767Sgibbs * 12251767Sgibbs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 13251767Sgibbs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 14251767Sgibbs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 15251767Sgibbs * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 16251767Sgibbs * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 17251767Sgibbs * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18251767Sgibbs * DEALINGS IN THE SOFTWARE. 19251767Sgibbs * 20251767Sgibbs * $FreeBSD$ 21251767Sgibbs */ 22251767Sgibbs 23251767Sgibbs#ifndef __XEN_HVM_H__ 24251767Sgibbs#define __XEN_HVM_H__ 25251767Sgibbs 26255040Sgibbs#include <xen/xen-os.h> 27255040Sgibbs#include <xen/hypervisor.h> 28255040Sgibbs 29251767Sgibbs#include <xen/interface/hvm/params.h> 30251767Sgibbs 31251767Sgibbs/** 32251767Sgibbs * \brief Wrapper function to obtain a HVM parameter value. 33251767Sgibbs * 34251767Sgibbs * \param index HVM parameter index; see <xen/interface/hvm/params.h>. 35251767Sgibbs * 36251767Sgibbs * \returns 0 on failure; the value of the parameter otherwise. 37251767Sgibbs */ 38251767Sgibbsstatic inline unsigned long 39251767Sgibbshvm_get_parameter(int index) 40251767Sgibbs{ 41251767Sgibbs struct xen_hvm_param xhv; 42251767Sgibbs int error; 43251767Sgibbs 44251767Sgibbs xhv.domid = DOMID_SELF; 45251767Sgibbs xhv.index = index; 46251767Sgibbs error = HYPERVISOR_hvm_op(HVMOP_get_param, &xhv); 47251767Sgibbs if (error) { 48251767Sgibbs printf("%s: error %d trying to get %d\n", __func__, 49251767Sgibbs error, index); 50251767Sgibbs return (0); 51251767Sgibbs } 52251767Sgibbs return (xhv.value); 53251767Sgibbs} 54251767Sgibbs 55251767Sgibbs/** The callback method types for Hypervisor event delivery to our domain. */ 56251767Sgibbsenum { 57251767Sgibbs HVM_CB_TYPE_GSI, 58251767Sgibbs HVM_CB_TYPE_PCI_INTX, 59251767Sgibbs HVM_CB_TYPE_VECTOR, 60251767Sgibbs HVM_CB_TYPE_MASK = 0xFF, 61251767Sgibbs HVM_CB_TYPE_SHIFT = 56 62251767Sgibbs}; 63251767Sgibbs 64251767Sgibbs/** Format for specifying a GSI type callback. */ 65251767Sgibbsenum { 66251767Sgibbs HVM_CB_GSI_GSI_MASK = 0xFFFFFFFF, 67251767Sgibbs HVM_CB_GSI_GSI_SHIFT = 0 68251767Sgibbs}; 69251767Sgibbs#define HVM_CALLBACK_GSI(gsi) \ 70251767Sgibbs (((uint64_t)HVM_CB_TYPE_GSI << HVM_CB_TYPE_SHIFT) \ 71251767Sgibbs | ((gsi) & HVM_CB_GSI_GSI_MASK) << HVM_CB_GSI_GSI_SHIFT) 72251767Sgibbs 73251767Sgibbs/** Format for specifying a virtual PCI interrupt line GSI style callback. */ 74251767Sgibbsenum { 75251767Sgibbs HVM_CB_PCI_INTX_INTPIN_MASK = 0x3, 76251767Sgibbs HVM_CB_PCI_INTX_INTPIN_SHIFT = 0, 77251767Sgibbs HVM_CB_PCI_INTX_SLOT_MASK = 0x1F, 78251767Sgibbs HVM_CB_PCI_INTX_SLOT_SHIFT = 11, 79251767Sgibbs}; 80251767Sgibbs#define HVM_CALLBACK_PCI_INTX(slot, pin) \ 81251767Sgibbs (((uint64_t)HVM_CB_TYPE_PCI_INTX << HVM_CB_TYPE_SHIFT) \ 82251767Sgibbs | (((slot) & HVM_CB_PCI_INTX_SLOT_MASK) << HVM_CB_PCI_INTX_SLOT_SHIFT) \ 83251767Sgibbs | (((pin) & HVM_CB_PCI_INTX_INTPIN_MASK) << HVM_CB_PCI_INTX_INTPIN_SHIFT)) 84251767Sgibbs 85251767Sgibbs/** Format for specifying a direct IDT vector injection style callback. */ 86251767Sgibbsenum { 87251767Sgibbs HVM_CB_VECTOR_VECTOR_MASK = 0xFFFFFFFF, 88251767Sgibbs HVM_CB_VECTOR_VECTOR_SHIFT = 0 89251767Sgibbs}; 90251767Sgibbs#define HVM_CALLBACK_VECTOR(vector) \ 91251767Sgibbs (((uint64_t)HVM_CB_TYPE_VECTOR << HVM_CB_TYPE_SHIFT) \ 92251767Sgibbs | (((vector) & HVM_CB_GSI_GSI_MASK) << HVM_CB_GSI_GSI_SHIFT)) 93251767Sgibbs 94251767Sgibbsvoid xen_hvm_set_callback(device_t); 95251767Sgibbsvoid xen_hvm_suspend(void); 96255726Sgibbsvoid xen_hvm_resume(bool suspend_cancelled); 97251767Sgibbs#endif /* __XEN_HVM_H__ */ 98