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