Lines Matching full:port
66 uint16_t port:15; member
128 uint16_t port; member
210 /* Rebuild s->pirq[].port mapping */ in xen_evtchn_post_load()
224 s->pirq[p->u.pirq].port = i; in xen_evtchn_post_load()
547 static void deassign_kernel_port(evtchn_port_t port) in deassign_kernel_port() argument
553 ha.u.evtchn.send_port = port; in deassign_kernel_port()
558 qemu_log_mask(LOG_GUEST_ERROR, "Failed to unbind kernel port %d: %s\n", in deassign_kernel_port()
559 port, strerror(ret)); in deassign_kernel_port()
563 static int assign_kernel_port(uint16_t type, evtchn_port_t port, in assign_kernel_port() argument
574 ha.u.evtchn.send_port = port; in assign_kernel_port()
577 ha.u.evtchn.deliver.port.port = port; in assign_kernel_port()
578 ha.u.evtchn.deliver.port.vcpu = kvm_arch_vcpu_id(cpu); in assign_kernel_port()
579 ha.u.evtchn.deliver.port.priority = KVM_IRQ_ROUTING_XEN_EVTCHN_PRIO_2LEVEL; in assign_kernel_port()
584 static int assign_kernel_eventfd(uint16_t type, evtchn_port_t port, int fd) in assign_kernel_eventfd() argument
589 ha.u.evtchn.send_port = port; in assign_kernel_eventfd()
592 ha.u.evtchn.deliver.eventfd.port = 0; in assign_kernel_eventfd()
598 static bool valid_port(evtchn_port_t port) in valid_port() argument
600 if (!port) { in valid_port()
605 return port < EVTCHN_2L_NR_CHANNELS; in valid_port()
607 return port < COMPAT_EVTCHN_2L_NR_CHANNELS; in valid_port()
624 evtchn_port_t be_port = p->u.interdomain.port; in unbind_backend_ports()
629 p->u.interdomain.port = 0; in unbind_backend_ports()
631 /* Leave the backend port open and unbound too. */ in unbind_backend_ports()
654 if (!valid_port(status->port)) { in xen_evtchn_status_op()
660 p = &s->port_table[status->port]; in xen_evtchn_status_op()
674 status->u.interdomain.port = p->u.interdomain.port; in xen_evtchn_status_op()
696 static int do_unmask_port_lm(XenEvtchnState *s, evtchn_port_t port, in do_unmask_port_lm() argument
702 int idx = port / bits_per_word; in do_unmask_port_lm()
703 int offset = port % bits_per_word; in do_unmask_port_lm()
738 /* If a port in this word was already pending for this vCPU, all done. */ in do_unmask_port_lm()
748 inject_callback(s, s->port_table[port].vcpu); in do_unmask_port_lm()
753 static int do_unmask_port_compat(XenEvtchnState *s, evtchn_port_t port, in do_unmask_port_compat() argument
760 int idx = port / bits_per_word; in do_unmask_port_compat()
761 int offset = port % bits_per_word; in do_unmask_port_compat()
796 /* If a port in this word was already pending for this vCPU, all done. */ in do_unmask_port_compat()
806 inject_callback(s, s->port_table[port].vcpu); in do_unmask_port_compat()
811 static int unmask_port(XenEvtchnState *s, evtchn_port_t port, bool do_unmask) in unmask_port() argument
815 if (s->port_table[port].type == EVTCHNSTAT_closed) { in unmask_port()
824 vcpu_info = kvm_xen_get_vcpu_info_hva(s->port_table[port].vcpu); in unmask_port()
830 return do_unmask_port_lm(s, port, do_unmask, shinfo, vcpu_info); in unmask_port()
832 return do_unmask_port_compat(s, port, do_unmask, shinfo, vcpu_info); in unmask_port()
836 static int do_set_port_lm(XenEvtchnState *s, evtchn_port_t port, in do_set_port_lm() argument
842 int idx = port / bits_per_word; in do_set_port_lm()
843 int offset = port % bits_per_word; in do_set_port_lm()
864 /* If a port in this word was already pending for this vCPU, all done. */ in do_set_port_lm()
874 inject_callback(s, s->port_table[port].vcpu); in do_set_port_lm()
879 static int do_set_port_compat(XenEvtchnState *s, evtchn_port_t port, in do_set_port_compat() argument
885 int idx = port / bits_per_word; in do_set_port_compat()
886 int offset = port % bits_per_word; in do_set_port_compat()
907 /* If a port in this word was already pending for this vCPU, all done. */ in do_set_port_compat()
917 inject_callback(s, s->port_table[port].vcpu); in do_set_port_compat()
922 static int set_port_pending(XenEvtchnState *s, evtchn_port_t port) in set_port_pending() argument
926 if (s->port_table[port].type == EVTCHNSTAT_closed) { in set_port_pending()
931 XenEvtchnPort *p = &s->port_table[port]; in set_port_pending()
939 evt.port = port; in set_port_pending()
951 vcpu_info = kvm_xen_get_vcpu_info_hva(s->port_table[port].vcpu); in set_port_pending()
957 return do_set_port_lm(s, port, shinfo, vcpu_info); in set_port_pending()
959 return do_set_port_compat(s, port, shinfo, vcpu_info); in set_port_pending()
963 static int clear_port_pending(XenEvtchnState *s, evtchn_port_t port) in clear_port_pending() argument
975 int idx = port / bits_per_word; in clear_port_pending()
976 int offset = port % bits_per_word; in clear_port_pending()
985 int idx = port / bits_per_word; in clear_port_pending()
986 int offset = port % bits_per_word; in clear_port_pending()
995 static void free_port(XenEvtchnState *s, evtchn_port_t port) in free_port() argument
997 s->port_table[port].type = EVTCHNSTAT_closed; in free_port()
998 s->port_table[port].u.val = 0; in free_port()
999 s->port_table[port].vcpu = 0; in free_port()
1001 if (s->nr_ports == port + 1) { in free_port()
1009 clear_port_pending(s, port); in free_port()
1013 uint16_t val, evtchn_port_t *port) in allocate_port() argument
1023 *port = p; in allocate_port()
1049 static int close_port(XenEvtchnState *s, evtchn_port_t port, in close_port() argument
1052 XenEvtchnPort *p = &s->port_table[port]; in close_port()
1054 /* Because it *might* be a PIRQ port */ in close_port()
1062 s->pirq[p->u.pirq].port = 0; in close_port()
1075 deassign_kernel_port(port); in close_port()
1081 uint16_t be_port = p->u.interdomain.port; in close_port()
1085 deassign_kernel_port(port); in close_port()
1091 XenEvtchnPort *rp = &s->port_table[p->u.interdomain.port]; in close_port()
1092 if (!valid_port(p->u.interdomain.port) || in close_port()
1093 rp->u.interdomain.port != port || in close_port()
1099 rp->u.interdomain.port = 0; in close_port()
1108 free_port(s, port); in close_port()
1159 if (!valid_port(close->port)) { in xen_evtchn_close_op()
1166 ret = close_port(s, close->port, &flush_kvm_routes); in xen_evtchn_close_op()
1186 if (!valid_port(unmask->port)) { in xen_evtchn_unmask_op()
1192 ret = unmask_port(s, unmask->port, true); in xen_evtchn_unmask_op()
1209 if (!valid_port(vcpu->port)) { in xen_evtchn_bind_vcpu_op()
1219 p = &s->port_table[vcpu->port]; in xen_evtchn_bind_vcpu_op()
1227 * on the new vCPU if the port was already pending. in xen_evtchn_bind_vcpu_op()
1230 unmask_port(s, vcpu->port, false); in xen_evtchn_bind_vcpu_op()
1264 &virq->port); in xen_evtchn_bind_virq_op()
1266 ret = kvm_xen_set_vcpu_virq(virq->vcpu, virq->virq, virq->port); in xen_evtchn_bind_virq_op()
1268 free_port(s, virq->port); in xen_evtchn_bind_virq_op()
1292 if (s->pirq[pirq->pirq].port) { in xen_evtchn_bind_pirq_op()
1299 &pirq->port); in xen_evtchn_bind_pirq_op()
1305 s->pirq[pirq->pirq].port = pirq->port; in xen_evtchn_bind_pirq_op()
1306 trace_kvm_xen_bind_pirq(pirq->pirq, pirq->port); in xen_evtchn_bind_pirq_op()
1356 ret = allocate_port(s, ipi->vcpu, EVTCHNSTAT_ipi, 0, &ipi->port); in xen_evtchn_bind_ipi_op()
1358 assign_kernel_port(EVTCHNSTAT_ipi, ipi->port, ipi->vcpu); in xen_evtchn_bind_ipi_op()
1387 /* The newly allocated port starts out as unbound */ in xen_evtchn_bind_interdomain_op()
1415 lp->u.interdomain.port = interdomain->remote_port; in xen_evtchn_bind_interdomain_op()
1423 * The 'remote' port for loopback must be an unbound port allocated in xen_evtchn_bind_interdomain_op()
1425 * port that was just allocated for the local end. in xen_evtchn_bind_interdomain_op()
1431 rp->u.interdomain.port = interdomain->local_port; in xen_evtchn_bind_interdomain_op()
1434 lp->u.interdomain.port = interdomain->remote_port; in xen_evtchn_bind_interdomain_op()
1471 ret = allocate_port(s, 0, EVTCHNSTAT_unbound, 0, &alloc->port); in xen_evtchn_alloc_unbound_op()
1474 XenEvtchnPort *p = &s->port_table[alloc->port]; in xen_evtchn_alloc_unbound_op()
1493 if (!valid_port(send->port)) { in xen_evtchn_send_op()
1499 p = &s->port_table[send->port]; in xen_evtchn_send_op()
1508 uint16_t be_port = p->u.interdomain.port; in xen_evtchn_send_op()
1518 set_port_pending(s, p->u.interdomain.port); in xen_evtchn_send_op()
1523 set_port_pending(s, send->port); in xen_evtchn_send_op()
1540 int xen_evtchn_set_port(uint16_t port) in xen_evtchn_set_port() argument
1550 if (!valid_port(port)) { in xen_evtchn_set_port()
1556 p = &s->port_table[port]; in xen_evtchn_set_port()
1561 set_port_pending(s, port); in xen_evtchn_set_port()
1666 int port = s->pirq[pirq].port; in xen_evtchn_set_gsi() local
1669 if (port) { in xen_evtchn_set_gsi()
1670 set_port_pending(s, port); in xen_evtchn_set_gsi()
1717 /* It could theoretically be bound to a port already, but that is OK. */ in do_remove_pci_vector()
1779 uint32_t pirq, port; in xen_evtchn_translate_pirq_msi() local
1806 port = s->pirq[pirq].port; in xen_evtchn_translate_pirq_msi()
1807 if (!valid_port(port)) { in xen_evtchn_translate_pirq_msi()
1811 cpu = qemu_get_cpu(s->port_table[port].vcpu); in xen_evtchn_translate_pirq_msi()
1817 route->u.xen_evtchn.port = port; in xen_evtchn_translate_pirq_msi()
1827 uint32_t pirq, port; in xen_evtchn_deliver_pirq_msi() local
1842 port = s->pirq[pirq].port; in xen_evtchn_deliver_pirq_msi()
1843 if (!valid_port(port)) { in xen_evtchn_deliver_pirq_msi()
1847 set_port_pending(s, port); in xen_evtchn_deliver_pirq_msi()
1975 int port = s->pirq[pirq].port; in xen_physdev_eoi_pirq() local
1976 if (port) { in xen_physdev_eoi_pirq()
1977 set_port_pending(s, port); in xen_physdev_eoi_pirq()
2083 /* The guest has to have an unbound port waiting for us to bind */ in xen_be_evtchn_bind_interdomain()
2088 /* Allow rebinding after migration, preserve port # if possible */ in xen_be_evtchn_bind_interdomain()
2089 be_port = gp->u.interdomain.port; in xen_be_evtchn_bind_interdomain()
2111 gp->u.interdomain.port = be_port; in xen_be_evtchn_bind_interdomain()
2130 int xen_be_evtchn_unbind(struct xenevtchn_handle *xc, evtchn_port_t port) in xen_be_evtchn_unbind() argument
2145 if (port && port != xc->be_port) { in xen_be_evtchn_unbind()
2156 gp->u.interdomain.port = 0; in xen_be_evtchn_unbind()
2194 int xen_be_evtchn_notify(struct xenevtchn_handle *xc, evtchn_port_t port) in xen_be_evtchn_notify() argument
2240 int xen_be_evtchn_unmask(struct xenevtchn_handle *xc, evtchn_port_t port) in xen_be_evtchn_unmask() argument
2246 if (xc->be_port != port) { in xen_be_evtchn_unmask()
2300 info->port = i; in qmp_xen_event_list()
2312 info->target = p->u.interdomain.port; in qmp_xen_event_list()
2326 void qmp_xen_event_inject(uint32_t port, Error **errp) in qmp_xen_event_inject() argument
2335 if (!valid_port(port)) { in qmp_xen_event_inject()
2336 error_setg(errp, "Invalid port %u", port); in qmp_xen_event_inject()
2341 if (set_port_pending(s, port)) { in qmp_xen_event_inject()
2342 error_setg(errp, "Failed to set port %u", port); in qmp_xen_event_inject()
2361 monitor_printf(mon, "port %4u: vcpu: %d %s", info->port, info->vcpu, in hmp_xen_event_list()
2384 int port = qdict_get_int(qdict, "port"); in hmp_xen_event_inject() local
2387 qmp_xen_event_inject(port, &err); in hmp_xen_event_inject()
2391 monitor_printf(mon, "Delivered port %d\n", port); in hmp_xen_event_inject()