1 /* 2 * QEMU Xen emulation: Event channel support 3 * 4 * Copyright © 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. 5 * 6 * Authors: David Woodhouse <dwmw2@infradead.org> 7 * 8 * This work is licensed under the terms of the GNU GPL, version 2 or later. 9 * See the COPYING file in the top-level directory. 10 */ 11 12 #ifndef QEMU_XEN_EVTCHN_H 13 #define QEMU_XEN_EVTCHN_H 14 15 #include "hw/sysbus.h" 16 17 typedef uint32_t evtchn_port_t; 18 19 void xen_evtchn_create(void); 20 int xen_evtchn_soft_reset(void); 21 int xen_evtchn_set_callback_param(uint64_t param); 22 void xen_evtchn_connect_gsis(qemu_irq *system_gsis); 23 void xen_evtchn_set_callback_level(int level); 24 25 int xen_evtchn_set_port(uint16_t port); 26 27 bool xen_evtchn_set_gsi(int gsi, int level); 28 void xen_evtchn_snoop_msi(PCIDevice *dev, bool is_msix, unsigned int vector, 29 uint64_t addr, uint32_t data, bool is_masked); 30 void xen_evtchn_remove_pci_device(PCIDevice *dev); 31 struct kvm_irq_routing_entry; 32 int xen_evtchn_translate_pirq_msi(struct kvm_irq_routing_entry *route, 33 uint64_t address, uint32_t data); 34 bool xen_evtchn_deliver_pirq_msi(uint64_t address, uint32_t data); 35 36 37 /* 38 * These functions mirror the libxenevtchn library API, providing the QEMU 39 * backend side of "interdomain" event channels. 40 */ 41 struct xenevtchn_handle; 42 struct xenevtchn_handle *xen_be_evtchn_open(void); 43 int xen_be_evtchn_bind_interdomain(struct xenevtchn_handle *xc, uint32_t domid, 44 evtchn_port_t guest_port); 45 int xen_be_evtchn_unbind(struct xenevtchn_handle *xc, evtchn_port_t port); 46 int xen_be_evtchn_close(struct xenevtchn_handle *xc); 47 int xen_be_evtchn_fd(struct xenevtchn_handle *xc); 48 int xen_be_evtchn_notify(struct xenevtchn_handle *xc, evtchn_port_t port); 49 int xen_be_evtchn_unmask(struct xenevtchn_handle *xc, evtchn_port_t port); 50 int xen_be_evtchn_pending(struct xenevtchn_handle *xc); 51 /* Apart from this which is a local addition */ 52 int xen_be_evtchn_get_guest_port(struct xenevtchn_handle *xc); 53 54 struct evtchn_status; 55 struct evtchn_close; 56 struct evtchn_unmask; 57 struct evtchn_bind_virq; 58 struct evtchn_bind_pirq; 59 struct evtchn_bind_ipi; 60 struct evtchn_send; 61 struct evtchn_alloc_unbound; 62 struct evtchn_bind_interdomain; 63 struct evtchn_bind_vcpu; 64 struct evtchn_reset; 65 int xen_evtchn_status_op(struct evtchn_status *status); 66 int xen_evtchn_close_op(struct evtchn_close *close); 67 int xen_evtchn_unmask_op(struct evtchn_unmask *unmask); 68 int xen_evtchn_bind_virq_op(struct evtchn_bind_virq *virq); 69 int xen_evtchn_bind_pirq_op(struct evtchn_bind_pirq *pirq); 70 int xen_evtchn_bind_ipi_op(struct evtchn_bind_ipi *ipi); 71 int xen_evtchn_send_op(struct evtchn_send *send); 72 int xen_evtchn_alloc_unbound_op(struct evtchn_alloc_unbound *alloc); 73 int xen_evtchn_bind_interdomain_op(struct evtchn_bind_interdomain *interdomain); 74 int xen_evtchn_bind_vcpu_op(struct evtchn_bind_vcpu *vcpu); 75 int xen_evtchn_reset_op(struct evtchn_reset *reset); 76 77 struct physdev_map_pirq; 78 struct physdev_unmap_pirq; 79 struct physdev_eoi; 80 struct physdev_irq_status_query; 81 struct physdev_get_free_pirq; 82 int xen_physdev_map_pirq(struct physdev_map_pirq *map); 83 int xen_physdev_unmap_pirq(struct physdev_unmap_pirq *unmap); 84 int xen_physdev_eoi_pirq(struct physdev_eoi *eoi); 85 int xen_physdev_query_pirq(struct physdev_irq_status_query *query); 86 int xen_physdev_get_free_pirq(struct physdev_get_free_pirq *get); 87 88 #endif /* QEMU_XEN_EVTCHN_H */ 89