qemu/hw/char/virtio-serial-bus.c
<<
>>
Prefs
   1/*
   2 * A bus for connecting virtio serial and console ports
   3 *
   4 * Copyright (C) 2009, 2010 Red Hat, Inc.
   5 *
   6 * Author(s):
   7 *  Amit Shah <amit.shah@redhat.com>
   8 *
   9 * Some earlier parts are:
  10 *  Copyright IBM, Corp. 2008
  11 * authored by
  12 *  Christian Ehrhardt <ehrhardt@linux.vnet.ibm.com>
  13 *
  14 * This work is licensed under the terms of the GNU GPL, version 2.  See
  15 * the COPYING file in the top-level directory.
  16 *
  17 * Contributions after 2012-01-13 are licensed under the terms of the
  18 * GNU GPL, version 2 or (at your option) any later version.
  19 */
  20
  21#include "qemu/osdep.h"
  22#include "qapi/error.h"
  23#include "qemu/iov.h"
  24#include "monitor/monitor.h"
  25#include "qemu/error-report.h"
  26#include "qemu/queue.h"
  27#include "hw/sysbus.h"
  28#include "trace.h"
  29#include "hw/virtio/virtio-serial.h"
  30#include "hw/virtio/virtio-access.h"
  31
  32static struct VirtIOSerialDevices {
  33    QLIST_HEAD(, VirtIOSerial) devices;
  34} vserdevices;
  35
  36static VirtIOSerialPort *find_port_by_id(VirtIOSerial *vser, uint32_t id)
  37{
  38    VirtIOSerialPort *port;
  39
  40    if (id == VIRTIO_CONSOLE_BAD_ID) {
  41        return NULL;
  42    }
  43
  44    QTAILQ_FOREACH(port, &vser->ports, next) {
  45        if (port->id == id)
  46            return port;
  47    }
  48    return NULL;
  49}
  50
  51static VirtIOSerialPort *find_port_by_vq(VirtIOSerial *vser, VirtQueue *vq)
  52{
  53    VirtIOSerialPort *port;
  54
  55    QTAILQ_FOREACH(port, &vser->ports, next) {
  56        if (port->ivq == vq || port->ovq == vq)
  57            return port;
  58    }
  59    return NULL;
  60}
  61
  62static VirtIOSerialPort *find_port_by_name(char *name)
  63{
  64    VirtIOSerial *vser;
  65
  66    QLIST_FOREACH(vser, &vserdevices.devices, next) {
  67        VirtIOSerialPort *port;
  68
  69        QTAILQ_FOREACH(port, &vser->ports, next) {
  70            if (port->name && !strcmp(port->name, name)) {
  71                return port;
  72            }
  73        }
  74    }
  75    return NULL;
  76}
  77
  78static VirtIOSerialPort *find_first_connected_console(VirtIOSerial *vser)
  79{
  80    VirtIOSerialPort *port;
  81
  82    QTAILQ_FOREACH(port, &vser->ports, next) {
  83        VirtIOSerialPortClass const *vsc = VIRTIO_SERIAL_PORT_GET_CLASS(port);
  84        if (vsc->is_console && port->host_connected) {
  85            return port;
  86        }
  87    }
  88    return NULL;
  89}
  90
  91static bool use_multiport(VirtIOSerial *vser)
  92{
  93    VirtIODevice *vdev = VIRTIO_DEVICE(vser);
  94    return virtio_vdev_has_feature(vdev, VIRTIO_CONSOLE_F_MULTIPORT);
  95}
  96
  97static size_t write_to_port(VirtIOSerialPort *port,
  98                            const uint8_t *buf, size_t size)
  99{
 100    VirtQueueElement *elem;
 101    VirtQueue *vq;
 102    size_t offset;
 103
 104    vq = port->ivq;
 105    if (!virtio_queue_ready(vq)) {
 106        return 0;
 107    }
 108
 109    offset = 0;
 110    while (offset < size) {
 111        size_t len;
 112
 113        elem = virtqueue_pop(vq, sizeof(VirtQueueElement));
 114        if (!elem) {
 115            break;
 116        }
 117
 118        len = iov_from_buf(elem->in_sg, elem->in_num, 0,
 119                           buf + offset, size - offset);
 120        offset += len;
 121
 122        virtqueue_push(vq, elem, len);
 123        g_free(elem);
 124    }
 125
 126    virtio_notify(VIRTIO_DEVICE(port->vser), vq);
 127    return offset;
 128}
 129
 130static void discard_vq_data(VirtQueue *vq, VirtIODevice *vdev)
 131{
 132    VirtQueueElement *elem;
 133
 134    if (!virtio_queue_ready(vq)) {
 135        return;
 136    }
 137    for (;;) {
 138        elem = virtqueue_pop(vq, sizeof(VirtQueueElement));
 139        if (!elem) {
 140            break;
 141        }
 142        virtqueue_push(vq, elem, 0);
 143        g_free(elem);
 144    }
 145    virtio_notify(vdev, vq);
 146}
 147
 148static void discard_throttle_data(VirtIOSerialPort *port)
 149{
 150    if (port->elem) {
 151        virtqueue_detach_element(port->ovq, port->elem, 0);
 152        g_free(port->elem);
 153        port->elem = NULL;
 154    }
 155}
 156
 157static void do_flush_queued_data(VirtIOSerialPort *port, VirtQueue *vq,
 158                                 VirtIODevice *vdev)
 159{
 160    VirtIOSerialPortClass *vsc;
 161
 162    assert(port);
 163    assert(virtio_queue_ready(vq));
 164
 165    vsc = VIRTIO_SERIAL_PORT_GET_CLASS(port);
 166
 167    while (!port->throttled) {
 168        unsigned int i;
 169
 170        /* Pop an elem only if we haven't left off a previous one mid-way */
 171        if (!port->elem) {
 172            port->elem = virtqueue_pop(vq, sizeof(VirtQueueElement));
 173            if (!port->elem) {
 174                break;
 175            }
 176            port->iov_idx = 0;
 177            port->iov_offset = 0;
 178        }
 179
 180        for (i = port->iov_idx; i < port->elem->out_num; i++) {
 181            size_t buf_size;
 182            ssize_t ret;
 183
 184            buf_size = port->elem->out_sg[i].iov_len - port->iov_offset;
 185            ret = vsc->have_data(port,
 186                                  port->elem->out_sg[i].iov_base
 187                                  + port->iov_offset,
 188                                  buf_size);
 189            if (port->throttled) {
 190                port->iov_idx = i;
 191                if (ret > 0) {
 192                    port->iov_offset += ret;
 193                }
 194                break;
 195            }
 196            port->iov_offset = 0;
 197        }
 198        if (port->throttled) {
 199            break;
 200        }
 201        virtqueue_push(vq, port->elem, 0);
 202        g_free(port->elem);
 203        port->elem = NULL;
 204    }
 205    virtio_notify(vdev, vq);
 206}
 207
 208static void flush_queued_data(VirtIOSerialPort *port)
 209{
 210    assert(port);
 211
 212    if (!virtio_queue_ready(port->ovq)) {
 213        return;
 214    }
 215    do_flush_queued_data(port, port->ovq, VIRTIO_DEVICE(port->vser));
 216}
 217
 218static size_t send_control_msg(VirtIOSerial *vser, void *buf, size_t len)
 219{
 220    VirtQueueElement *elem;
 221    VirtQueue *vq;
 222
 223    vq = vser->c_ivq;
 224    if (!virtio_queue_ready(vq)) {
 225        return 0;
 226    }
 227
 228    elem = virtqueue_pop(vq, sizeof(VirtQueueElement));
 229    if (!elem) {
 230        return 0;
 231    }
 232
 233    /* TODO: detect a buffer that's too short, set NEEDS_RESET */
 234    iov_from_buf(elem->in_sg, elem->in_num, 0, buf, len);
 235
 236    virtqueue_push(vq, elem, len);
 237    virtio_notify(VIRTIO_DEVICE(vser), vq);
 238    g_free(elem);
 239
 240    return len;
 241}
 242
 243static size_t send_control_event(VirtIOSerial *vser, uint32_t port_id,
 244                                 uint16_t event, uint16_t value)
 245{
 246    VirtIODevice *vdev = VIRTIO_DEVICE(vser);
 247    struct virtio_console_control cpkt;
 248
 249    virtio_stl_p(vdev, &cpkt.id, port_id);
 250    virtio_stw_p(vdev, &cpkt.event, event);
 251    virtio_stw_p(vdev, &cpkt.value, value);
 252
 253    trace_virtio_serial_send_control_event(port_id, event, value);
 254    return send_control_msg(vser, &cpkt, sizeof(cpkt));
 255}
 256
 257/* Functions for use inside qemu to open and read from/write to ports */
 258int virtio_serial_open(VirtIOSerialPort *port)
 259{
 260    /* Don't allow opening an already-open port */
 261    if (port->host_connected) {
 262        return 0;
 263    }
 264    /* Send port open notification to the guest */
 265    port->host_connected = true;
 266    send_control_event(port->vser, port->id, VIRTIO_CONSOLE_PORT_OPEN, 1);
 267
 268    return 0;
 269}
 270
 271int virtio_serial_close(VirtIOSerialPort *port)
 272{
 273    port->host_connected = false;
 274    /*
 275     * If there's any data the guest sent which the app didn't
 276     * consume, reset the throttling flag and discard the data.
 277     */
 278    port->throttled = false;
 279    discard_throttle_data(port);
 280    discard_vq_data(port->ovq, VIRTIO_DEVICE(port->vser));
 281
 282    send_control_event(port->vser, port->id, VIRTIO_CONSOLE_PORT_OPEN, 0);
 283
 284    return 0;
 285}
 286
 287/* Individual ports/apps call this function to write to the guest. */
 288ssize_t virtio_serial_write(VirtIOSerialPort *port, const uint8_t *buf,
 289                            size_t size)
 290{
 291    if (!port || !port->host_connected || !port->guest_connected) {
 292        return 0;
 293    }
 294    return write_to_port(port, buf, size);
 295}
 296
 297/*
 298 * Readiness of the guest to accept data on a port.
 299 * Returns max. data the guest can receive
 300 */
 301size_t virtio_serial_guest_ready(VirtIOSerialPort *port)
 302{
 303    VirtIODevice *vdev = VIRTIO_DEVICE(port->vser);
 304    VirtQueue *vq = port->ivq;
 305    unsigned int bytes;
 306
 307    if (!virtio_queue_ready(vq) ||
 308        !(vdev->status & VIRTIO_CONFIG_S_DRIVER_OK) ||
 309        virtio_queue_empty(vq)) {
 310        return 0;
 311    }
 312    if (use_multiport(port->vser) && !port->guest_connected) {
 313        return 0;
 314    }
 315    virtqueue_get_avail_bytes(vq, &bytes, NULL, 4096, 0);
 316    return bytes;
 317}
 318
 319static void flush_queued_data_bh(void *opaque)
 320{
 321    VirtIOSerialPort *port = opaque;
 322
 323    flush_queued_data(port);
 324}
 325
 326void virtio_serial_throttle_port(VirtIOSerialPort *port, bool throttle)
 327{
 328    if (!port) {
 329        return;
 330    }
 331
 332    trace_virtio_serial_throttle_port(port->id, throttle);
 333    port->throttled = throttle;
 334    if (throttle) {
 335        return;
 336    }
 337    qemu_bh_schedule(port->bh);
 338}
 339
 340/* Guest wants to notify us of some event */
 341static void handle_control_message(VirtIOSerial *vser, void *buf, size_t len)
 342{
 343    VirtIODevice *vdev = VIRTIO_DEVICE(vser);
 344    struct VirtIOSerialPort *port;
 345    VirtIOSerialPortClass *vsc;
 346    struct virtio_console_control cpkt, *gcpkt;
 347    uint8_t *buffer;
 348    size_t buffer_len;
 349
 350    gcpkt = buf;
 351
 352    if (len < sizeof(cpkt)) {
 353        /* The guest sent an invalid control packet */
 354        return;
 355    }
 356
 357    cpkt.event = virtio_lduw_p(vdev, &gcpkt->event);
 358    cpkt.value = virtio_lduw_p(vdev, &gcpkt->value);
 359
 360    trace_virtio_serial_handle_control_message(cpkt.event, cpkt.value);
 361
 362    if (cpkt.event == VIRTIO_CONSOLE_DEVICE_READY) {
 363        if (!cpkt.value) {
 364            error_report("virtio-serial-bus: Guest failure in adding device %s",
 365                         vser->bus.qbus.name);
 366            return;
 367        }
 368        /*
 369         * The device is up, we can now tell the device about all the
 370         * ports we have here.
 371         */
 372        QTAILQ_FOREACH(port, &vser->ports, next) {
 373            send_control_event(vser, port->id, VIRTIO_CONSOLE_PORT_ADD, 1);
 374        }
 375        return;
 376    }
 377
 378    port = find_port_by_id(vser, virtio_ldl_p(vdev, &gcpkt->id));
 379    if (!port) {
 380        error_report("virtio-serial-bus: Unexpected port id %u for device %s",
 381                     virtio_ldl_p(vdev, &gcpkt->id), vser->bus.qbus.name);
 382        return;
 383    }
 384
 385    trace_virtio_serial_handle_control_message_port(port->id);
 386
 387    vsc = VIRTIO_SERIAL_PORT_GET_CLASS(port);
 388
 389    switch(cpkt.event) {
 390    case VIRTIO_CONSOLE_PORT_READY:
 391        if (!cpkt.value) {
 392            error_report("virtio-serial-bus: Guest failure in adding port %u for device %s",
 393                         port->id, vser->bus.qbus.name);
 394            break;
 395        }
 396        /*
 397         * Now that we know the guest asked for the port name, we're
 398         * sure the guest has initialised whatever state is necessary
 399         * for this port. Now's a good time to let the guest know if
 400         * this port is a console port so that the guest can hook it
 401         * up to hvc.
 402         */
 403        if (vsc->is_console) {
 404            send_control_event(vser, port->id, VIRTIO_CONSOLE_CONSOLE_PORT, 1);
 405        }
 406
 407        if (port->name) {
 408            virtio_stl_p(vdev, &cpkt.id, port->id);
 409            virtio_stw_p(vdev, &cpkt.event, VIRTIO_CONSOLE_PORT_NAME);
 410            virtio_stw_p(vdev, &cpkt.value, 1);
 411
 412            buffer_len = sizeof(cpkt) + strlen(port->name) + 1;
 413            buffer = g_malloc(buffer_len);
 414
 415            memcpy(buffer, &cpkt, sizeof(cpkt));
 416            memcpy(buffer + sizeof(cpkt), port->name, strlen(port->name));
 417            buffer[buffer_len - 1] = 0;
 418
 419            send_control_msg(vser, buffer, buffer_len);
 420            g_free(buffer);
 421        }
 422
 423        if (port->host_connected) {
 424            send_control_event(vser, port->id, VIRTIO_CONSOLE_PORT_OPEN, 1);
 425        }
 426
 427        /*
 428         * When the guest has asked us for this information it means
 429         * the guest is all setup and has its virtqueues
 430         * initialised. If some app is interested in knowing about
 431         * this event, let it know.
 432         */
 433        if (vsc->guest_ready) {
 434            vsc->guest_ready(port);
 435        }
 436        break;
 437
 438    case VIRTIO_CONSOLE_PORT_OPEN:
 439        port->guest_connected = cpkt.value;
 440        if (vsc->set_guest_connected) {
 441            /* Send the guest opened notification if an app is interested */
 442            vsc->set_guest_connected(port, cpkt.value);
 443        }
 444        break;
 445    }
 446}
 447
 448static void control_in(VirtIODevice *vdev, VirtQueue *vq)
 449{
 450}
 451
 452static void control_out(VirtIODevice *vdev, VirtQueue *vq)
 453{
 454    VirtQueueElement *elem;
 455    VirtIOSerial *vser;
 456    uint8_t *buf;
 457    size_t len;
 458
 459    vser = VIRTIO_SERIAL(vdev);
 460
 461    len = 0;
 462    buf = NULL;
 463    for (;;) {
 464        size_t cur_len;
 465
 466        elem = virtqueue_pop(vq, sizeof(VirtQueueElement));
 467        if (!elem) {
 468            break;
 469        }
 470
 471        cur_len = iov_size(elem->out_sg, elem->out_num);
 472        /*
 473         * Allocate a new buf only if we didn't have one previously or
 474         * if the size of the buf differs
 475         */
 476        if (cur_len > len) {
 477            g_free(buf);
 478
 479            buf = g_malloc(cur_len);
 480            len = cur_len;
 481        }
 482        iov_to_buf(elem->out_sg, elem->out_num, 0, buf, cur_len);
 483
 484        handle_control_message(vser, buf, cur_len);
 485        virtqueue_push(vq, elem, 0);
 486        g_free(elem);
 487    }
 488    g_free(buf);
 489    virtio_notify(vdev, vq);
 490}
 491
 492/* Guest wrote something to some port. */
 493static void handle_output(VirtIODevice *vdev, VirtQueue *vq)
 494{
 495    VirtIOSerial *vser;
 496    VirtIOSerialPort *port;
 497
 498    vser = VIRTIO_SERIAL(vdev);
 499    port = find_port_by_vq(vser, vq);
 500
 501    if (!port || !port->host_connected) {
 502        discard_vq_data(vq, vdev);
 503        return;
 504    }
 505
 506    if (!port->throttled) {
 507        do_flush_queued_data(port, vq, vdev);
 508        return;
 509    }
 510}
 511
 512static void handle_input(VirtIODevice *vdev, VirtQueue *vq)
 513{
 514    /*
 515     * Users of virtio-serial would like to know when guest becomes
 516     * writable again -- i.e. if a vq had stuff queued up and the
 517     * guest wasn't reading at all, the host would not be able to
 518     * write to the vq anymore.  Once the guest reads off something,
 519     * we can start queueing things up again.  However, this call is
 520     * made for each buffer addition by the guest -- even though free
 521     * buffers existed prior to the current buffer addition.  This is
 522     * done so as not to maintain previous state, which will need
 523     * additional live-migration-related changes.
 524     */
 525    VirtIOSerial *vser;
 526    VirtIOSerialPort *port;
 527    VirtIOSerialPortClass *vsc;
 528
 529    vser = VIRTIO_SERIAL(vdev);
 530    port = find_port_by_vq(vser, vq);
 531
 532    if (!port) {
 533        return;
 534    }
 535    vsc = VIRTIO_SERIAL_PORT_GET_CLASS(port);
 536
 537    /*
 538     * If guest_connected is false, this call is being made by the
 539     * early-boot queueing up of descriptors, which is just noise for
 540     * the host apps -- don't disturb them in that case.
 541     */
 542    if (port->guest_connected && port->host_connected && vsc->guest_writable) {
 543        vsc->guest_writable(port);
 544    }
 545}
 546
 547static uint64_t get_features(VirtIODevice *vdev, uint64_t features,
 548                             Error **errp)
 549{
 550    VirtIOSerial *vser;
 551
 552    vser = VIRTIO_SERIAL(vdev);
 553
 554    features |= vser->host_features;
 555    if (vser->bus.max_nr_ports > 1) {
 556        virtio_add_feature(&features, VIRTIO_CONSOLE_F_MULTIPORT);
 557    }
 558    return features;
 559}
 560
 561/* Guest requested config info */
 562static void get_config(VirtIODevice *vdev, uint8_t *config_data)
 563{
 564    VirtIOSerial *vser = VIRTIO_SERIAL(vdev);
 565    struct virtio_console_config *config =
 566        (struct virtio_console_config *)config_data;
 567
 568    config->cols = 0;
 569    config->rows = 0;
 570    config->max_nr_ports = virtio_tswap32(vdev,
 571                                          vser->serial.max_virtserial_ports);
 572}
 573
 574/* Guest sent new config info */
 575static void set_config(VirtIODevice *vdev, const uint8_t *config_data)
 576{
 577    VirtIOSerial *vser = VIRTIO_SERIAL(vdev);
 578    struct virtio_console_config *config =
 579        (struct virtio_console_config *)config_data;
 580    uint8_t emerg_wr_lo = le32_to_cpu(config->emerg_wr);
 581    VirtIOSerialPort *port = find_first_connected_console(vser);
 582    VirtIOSerialPortClass *vsc;
 583
 584    if (!config->emerg_wr) {
 585        return;
 586    }
 587    /* Make sure we don't misdetect an emergency write when the guest
 588     * does a short config write after an emergency write. */
 589    config->emerg_wr = 0;
 590    if (!port) {
 591        return;
 592    }
 593    vsc = VIRTIO_SERIAL_PORT_GET_CLASS(port);
 594    (void)vsc->have_data(port, &emerg_wr_lo, 1);
 595}
 596
 597static void guest_reset(VirtIOSerial *vser)
 598{
 599    VirtIOSerialPort *port;
 600    VirtIOSerialPortClass *vsc;
 601
 602    QTAILQ_FOREACH(port, &vser->ports, next) {
 603        vsc = VIRTIO_SERIAL_PORT_GET_CLASS(port);
 604
 605        discard_throttle_data(port);
 606
 607        if (port->guest_connected) {
 608            port->guest_connected = false;
 609            if (vsc->set_guest_connected) {
 610                vsc->set_guest_connected(port, false);
 611            }
 612        }
 613    }
 614}
 615
 616static void set_status(VirtIODevice *vdev, uint8_t status)
 617{
 618    VirtIOSerial *vser;
 619    VirtIOSerialPort *port;
 620
 621    vser = VIRTIO_SERIAL(vdev);
 622    port = find_port_by_id(vser, 0);
 623
 624    if (port && !use_multiport(port->vser)
 625        && (status & VIRTIO_CONFIG_S_DRIVER_OK)) {
 626        /*
 627         * Non-multiport guests won't be able to tell us guest
 628         * open/close status.  Such guests can only have a port at id
 629         * 0, so set guest_connected for such ports as soon as guest
 630         * is up.
 631         */
 632        port->guest_connected = true;
 633    }
 634    if (!(status & VIRTIO_CONFIG_S_DRIVER_OK)) {
 635        guest_reset(vser);
 636    }
 637}
 638
 639static void vser_reset(VirtIODevice *vdev)
 640{
 641    VirtIOSerial *vser;
 642
 643    vser = VIRTIO_SERIAL(vdev);
 644    guest_reset(vser);
 645}
 646
 647static void virtio_serial_save_device(VirtIODevice *vdev, QEMUFile *f)
 648{
 649    VirtIOSerial *s = VIRTIO_SERIAL(vdev);
 650    VirtIOSerialPort *port;
 651    uint32_t nr_active_ports;
 652    unsigned int i, max_nr_ports;
 653    struct virtio_console_config config;
 654
 655    /* The config space (ignored on the far end in current versions) */
 656    get_config(vdev, (uint8_t *)&config);
 657    qemu_put_be16s(f, &config.cols);
 658    qemu_put_be16s(f, &config.rows);
 659    qemu_put_be32s(f, &config.max_nr_ports);
 660
 661    /* The ports map */
 662    max_nr_ports = s->serial.max_virtserial_ports;
 663    for (i = 0; i < (max_nr_ports + 31) / 32; i++) {
 664        qemu_put_be32s(f, &s->ports_map[i]);
 665    }
 666
 667    /* Ports */
 668
 669    nr_active_ports = 0;
 670    QTAILQ_FOREACH(port, &s->ports, next) {
 671        nr_active_ports++;
 672    }
 673
 674    qemu_put_be32s(f, &nr_active_ports);
 675
 676    /*
 677     * Items in struct VirtIOSerialPort.
 678     */
 679    QTAILQ_FOREACH(port, &s->ports, next) {
 680        uint32_t elem_popped;
 681
 682        qemu_put_be32s(f, &port->id);
 683        qemu_put_byte(f, port->guest_connected);
 684        qemu_put_byte(f, port->host_connected);
 685
 686        elem_popped = 0;
 687        if (port->elem) {
 688            elem_popped = 1;
 689        }
 690        qemu_put_be32s(f, &elem_popped);
 691        if (elem_popped) {
 692            qemu_put_be32s(f, &port->iov_idx);
 693            qemu_put_be64s(f, &port->iov_offset);
 694            qemu_put_virtqueue_element(f, port->elem);
 695        }
 696    }
 697}
 698
 699static void virtio_serial_post_load_timer_cb(void *opaque)
 700{
 701    uint32_t i;
 702    VirtIOSerial *s = VIRTIO_SERIAL(opaque);
 703    VirtIOSerialPort *port;
 704    uint8_t host_connected;
 705    VirtIOSerialPortClass *vsc;
 706
 707    if (!s->post_load) {
 708        return;
 709    }
 710    for (i = 0 ; i < s->post_load->nr_active_ports; ++i) {
 711        port = s->post_load->connected[i].port;
 712        host_connected = s->post_load->connected[i].host_connected;
 713        if (host_connected != port->host_connected) {
 714            /*
 715             * We have to let the guest know of the host connection
 716             * status change
 717             */
 718            send_control_event(s, port->id, VIRTIO_CONSOLE_PORT_OPEN,
 719                               port->host_connected);
 720        }
 721        vsc = VIRTIO_SERIAL_PORT_GET_CLASS(port);
 722        if (vsc->set_guest_connected) {
 723            vsc->set_guest_connected(port, port->guest_connected);
 724        }
 725    }
 726    g_free(s->post_load->connected);
 727    timer_free(s->post_load->timer);
 728    g_free(s->post_load);
 729    s->post_load = NULL;
 730}
 731
 732static int fetch_active_ports_list(QEMUFile *f,
 733                                   VirtIOSerial *s, uint32_t nr_active_ports)
 734{
 735    uint32_t i;
 736
 737    s->post_load = g_malloc0(sizeof(*s->post_load));
 738    s->post_load->nr_active_ports = nr_active_ports;
 739    s->post_load->connected =
 740        g_malloc0(sizeof(*s->post_load->connected) * nr_active_ports);
 741
 742    s->post_load->timer = timer_new_ns(QEMU_CLOCK_VIRTUAL,
 743                                            virtio_serial_post_load_timer_cb,
 744                                            s);
 745
 746    /* Items in struct VirtIOSerialPort */
 747    for (i = 0; i < nr_active_ports; i++) {
 748        VirtIOSerialPort *port;
 749        uint32_t elem_popped;
 750        uint32_t id;
 751
 752        id = qemu_get_be32(f);
 753        port = find_port_by_id(s, id);
 754        if (!port) {
 755            return -EINVAL;
 756        }
 757
 758        port->guest_connected = qemu_get_byte(f);
 759        s->post_load->connected[i].port = port;
 760        s->post_load->connected[i].host_connected = qemu_get_byte(f);
 761
 762        qemu_get_be32s(f, &elem_popped);
 763        if (elem_popped) {
 764            qemu_get_be32s(f, &port->iov_idx);
 765            qemu_get_be64s(f, &port->iov_offset);
 766
 767            port->elem =
 768                qemu_get_virtqueue_element(f, sizeof(VirtQueueElement));
 769
 770            /*
 771             *  Port was throttled on source machine.  Let's
 772             *  unthrottle it here so data starts flowing again.
 773             */
 774            virtio_serial_throttle_port(port, false);
 775        }
 776    }
 777    timer_mod(s->post_load->timer, 1);
 778    return 0;
 779}
 780
 781static int virtio_serial_load_device(VirtIODevice *vdev, QEMUFile *f,
 782                                     int version_id)
 783{
 784    VirtIOSerial *s = VIRTIO_SERIAL(vdev);
 785    uint32_t max_nr_ports, nr_active_ports, ports_map;
 786    unsigned int i;
 787    int ret;
 788    uint32_t tmp;
 789
 790    /* Unused */
 791    qemu_get_be16s(f, (uint16_t *) &tmp);
 792    qemu_get_be16s(f, (uint16_t *) &tmp);
 793    qemu_get_be32s(f, &tmp);
 794
 795    max_nr_ports = s->serial.max_virtserial_ports;
 796    for (i = 0; i < (max_nr_ports + 31) / 32; i++) {
 797        qemu_get_be32s(f, &ports_map);
 798
 799        if (ports_map != s->ports_map[i]) {
 800            /*
 801             * Ports active on source and destination don't
 802             * match. Fail migration.
 803             */
 804            return -EINVAL;
 805        }
 806    }
 807
 808    qemu_get_be32s(f, &nr_active_ports);
 809
 810    if (nr_active_ports) {
 811        ret = fetch_active_ports_list(f, s, nr_active_ports);
 812        if (ret) {
 813            return ret;
 814        }
 815    }
 816    return 0;
 817}
 818
 819static void virtser_bus_dev_print(Monitor *mon, DeviceState *qdev, int indent);
 820
 821static Property virtser_props[] = {
 822    DEFINE_PROP_UINT32("nr", VirtIOSerialPort, id, VIRTIO_CONSOLE_BAD_ID),
 823    DEFINE_PROP_STRING("name", VirtIOSerialPort, name),
 824    DEFINE_PROP_END_OF_LIST()
 825};
 826
 827#define TYPE_VIRTIO_SERIAL_BUS "virtio-serial-bus"
 828#define VIRTIO_SERIAL_BUS(obj) \
 829      OBJECT_CHECK(VirtIOSerialBus, (obj), TYPE_VIRTIO_SERIAL_BUS)
 830
 831static void virtser_bus_class_init(ObjectClass *klass, void *data)
 832{
 833    BusClass *k = BUS_CLASS(klass);
 834    k->print_dev = virtser_bus_dev_print;
 835}
 836
 837static const TypeInfo virtser_bus_info = {
 838    .name = TYPE_VIRTIO_SERIAL_BUS,
 839    .parent = TYPE_BUS,
 840    .instance_size = sizeof(VirtIOSerialBus),
 841    .class_init = virtser_bus_class_init,
 842};
 843
 844static void virtser_bus_dev_print(Monitor *mon, DeviceState *qdev, int indent)
 845{
 846    VirtIOSerialPort *port = VIRTIO_SERIAL_PORT(qdev);
 847
 848    monitor_printf(mon, "%*sport %d, guest %s, host %s, throttle %s\n",
 849                   indent, "", port->id,
 850                   port->guest_connected ? "on" : "off",
 851                   port->host_connected ? "on" : "off",
 852                   port->throttled ? "on" : "off");
 853}
 854
 855/* This function is only used if a port id is not provided by the user */
 856static uint32_t find_free_port_id(VirtIOSerial *vser)
 857{
 858    unsigned int i, max_nr_ports;
 859
 860    max_nr_ports = vser->serial.max_virtserial_ports;
 861    for (i = 0; i < (max_nr_ports + 31) / 32; i++) {
 862        uint32_t map, zeroes;
 863
 864        map = vser->ports_map[i];
 865        zeroes = ctz32(~map);
 866        if (zeroes != 32) {
 867            return zeroes + i * 32;
 868        }
 869    }
 870    return VIRTIO_CONSOLE_BAD_ID;
 871}
 872
 873static void mark_port_added(VirtIOSerial *vser, uint32_t port_id)
 874{
 875    unsigned int i;
 876
 877    i = port_id / 32;
 878    vser->ports_map[i] |= 1U << (port_id % 32);
 879}
 880
 881static void add_port(VirtIOSerial *vser, uint32_t port_id)
 882{
 883    mark_port_added(vser, port_id);
 884    send_control_event(vser, port_id, VIRTIO_CONSOLE_PORT_ADD, 1);
 885}
 886
 887static void remove_port(VirtIOSerial *vser, uint32_t port_id)
 888{
 889    VirtIOSerialPort *port;
 890
 891    /*
 892     * Don't mark port 0 removed -- we explicitly reserve it for
 893     * backward compat with older guests, ensure a virtconsole device
 894     * unplug retains the reservation.
 895     */
 896    if (port_id) {
 897        unsigned int i;
 898
 899        i = port_id / 32;
 900        vser->ports_map[i] &= ~(1U << (port_id % 32));
 901    }
 902
 903    port = find_port_by_id(vser, port_id);
 904    /*
 905     * This function is only called from qdev's unplug callback; if we
 906     * get a NULL port here, we're in trouble.
 907     */
 908    assert(port);
 909
 910    /* Flush out any unconsumed buffers first */
 911    discard_throttle_data(port);
 912    discard_vq_data(port->ovq, VIRTIO_DEVICE(port->vser));
 913
 914    send_control_event(vser, port->id, VIRTIO_CONSOLE_PORT_REMOVE, 1);
 915}
 916
 917static void virtser_port_device_realize(DeviceState *dev, Error **errp)
 918{
 919    VirtIOSerialPort *port = VIRTIO_SERIAL_PORT(dev);
 920    VirtIOSerialPortClass *vsc = VIRTIO_SERIAL_PORT_GET_CLASS(port);
 921    VirtIOSerialBus *bus = VIRTIO_SERIAL_BUS(qdev_get_parent_bus(dev));
 922    int max_nr_ports;
 923    bool plugging_port0;
 924    Error *err = NULL;
 925
 926    port->vser = bus->vser;
 927    port->bh = qemu_bh_new(flush_queued_data_bh, port);
 928
 929    assert(vsc->have_data);
 930
 931    /*
 932     * Is the first console port we're seeing? If so, put it up at
 933     * location 0. This is done for backward compatibility (old
 934     * kernel, new qemu).
 935     */
 936    plugging_port0 = vsc->is_console && !find_port_by_id(port->vser, 0);
 937
 938    if (find_port_by_id(port->vser, port->id)) {
 939        error_setg(errp, "virtio-serial-bus: A port already exists at id %u",
 940                   port->id);
 941        return;
 942    }
 943
 944    if (port->name != NULL && find_port_by_name(port->name)) {
 945        error_setg(errp, "virtio-serial-bus: A port already exists by name %s",
 946                   port->name);
 947        return;
 948    }
 949
 950    if (port->id == VIRTIO_CONSOLE_BAD_ID) {
 951        if (plugging_port0) {
 952            port->id = 0;
 953        } else {
 954            port->id = find_free_port_id(port->vser);
 955            if (port->id == VIRTIO_CONSOLE_BAD_ID) {
 956                error_setg(errp, "virtio-serial-bus: Maximum port limit for "
 957                                 "this device reached");
 958                return;
 959            }
 960        }
 961    }
 962
 963    max_nr_ports = port->vser->serial.max_virtserial_ports;
 964    if (port->id >= max_nr_ports) {
 965        error_setg(errp, "virtio-serial-bus: Out-of-range port id specified, "
 966                         "max. allowed: %u", max_nr_ports - 1);
 967        return;
 968    }
 969
 970    vsc->realize(dev, &err);
 971    if (err != NULL) {
 972        error_propagate(errp, err);
 973        return;
 974    }
 975
 976    port->elem = NULL;
 977}
 978
 979static void virtser_port_device_plug(HotplugHandler *hotplug_dev,
 980                                     DeviceState *dev, Error **errp)
 981{
 982    VirtIOSerialPort *port = VIRTIO_SERIAL_PORT(dev);
 983
 984    QTAILQ_INSERT_TAIL(&port->vser->ports, port, next);
 985    port->ivq = port->vser->ivqs[port->id];
 986    port->ovq = port->vser->ovqs[port->id];
 987
 988    add_port(port->vser, port->id);
 989
 990    /* Send an update to the guest about this new port added */
 991    virtio_notify_config(VIRTIO_DEVICE(hotplug_dev));
 992}
 993
 994static void virtser_port_device_unrealize(DeviceState *dev, Error **errp)
 995{
 996    VirtIOSerialPort *port = VIRTIO_SERIAL_PORT(dev);
 997    VirtIOSerialPortClass *vsc = VIRTIO_SERIAL_PORT_GET_CLASS(dev);
 998    VirtIOSerial *vser = port->vser;
 999
1000    qemu_bh_delete(port->bh);
1001    remove_port(port->vser, port->id);
1002
1003    QTAILQ_REMOVE(&vser->ports, port, next);
1004
1005    if (vsc->unrealize) {
1006        vsc->unrealize(dev, errp);
1007    }
1008}
1009
1010static void virtio_serial_device_realize(DeviceState *dev, Error **errp)
1011{
1012    VirtIODevice *vdev = VIRTIO_DEVICE(dev);
1013    VirtIOSerial *vser = VIRTIO_SERIAL(dev);
1014    uint32_t i, max_supported_ports;
1015    size_t config_size = sizeof(struct virtio_console_config);
1016
1017    if (!vser->serial.max_virtserial_ports) {
1018        error_setg(errp, "Maximum number of serial ports not specified");
1019        return;
1020    }
1021
1022    /* Each port takes 2 queues, and one pair is for the control queue */
1023    max_supported_ports = VIRTIO_QUEUE_MAX / 2 - 1;
1024
1025    if (vser->serial.max_virtserial_ports > max_supported_ports) {
1026        error_setg(errp, "maximum ports supported: %u", max_supported_ports);
1027        return;
1028    }
1029
1030    if (!virtio_has_feature(vser->host_features,
1031                            VIRTIO_CONSOLE_F_EMERG_WRITE)) {
1032        config_size = offsetof(struct virtio_console_config, emerg_wr);
1033    }
1034    virtio_init(vdev, "virtio-serial", VIRTIO_ID_CONSOLE,
1035                config_size);
1036
1037    /* Spawn a new virtio-serial bus on which the ports will ride as devices */
1038    qbus_create_inplace(&vser->bus, sizeof(vser->bus), TYPE_VIRTIO_SERIAL_BUS,
1039                        dev, vdev->bus_name);
1040    qbus_set_hotplug_handler(BUS(&vser->bus), DEVICE(vser), errp);
1041    vser->bus.vser = vser;
1042    QTAILQ_INIT(&vser->ports);
1043
1044    vser->bus.max_nr_ports = vser->serial.max_virtserial_ports;
1045    vser->ivqs = g_malloc(vser->serial.max_virtserial_ports
1046                          * sizeof(VirtQueue *));
1047    vser->ovqs = g_malloc(vser->serial.max_virtserial_ports
1048                          * sizeof(VirtQueue *));
1049
1050    /* Add a queue for host to guest transfers for port 0 (backward compat) */
1051    vser->ivqs[0] = virtio_add_queue(vdev, 128, handle_input);
1052    /* Add a queue for guest to host transfers for port 0 (backward compat) */
1053    vser->ovqs[0] = virtio_add_queue(vdev, 128, handle_output);
1054
1055    /* TODO: host to guest notifications can get dropped
1056     * if the queue fills up. Implement queueing in host,
1057     * this might also make it possible to reduce the control
1058     * queue size: as guest preposts buffers there,
1059     * this will save 4Kbyte of guest memory per entry. */
1060
1061    /* control queue: host to guest */
1062    vser->c_ivq = virtio_add_queue(vdev, 32, control_in);
1063    /* control queue: guest to host */
1064    vser->c_ovq = virtio_add_queue(vdev, 32, control_out);
1065
1066    for (i = 1; i < vser->bus.max_nr_ports; i++) {
1067        /* Add a per-port queue for host to guest transfers */
1068        vser->ivqs[i] = virtio_add_queue(vdev, 128, handle_input);
1069        /* Add a per-per queue for guest to host transfers */
1070        vser->ovqs[i] = virtio_add_queue(vdev, 128, handle_output);
1071    }
1072
1073    vser->ports_map = g_malloc0(((vser->serial.max_virtserial_ports + 31) / 32)
1074        * sizeof(vser->ports_map[0]));
1075    /*
1076     * Reserve location 0 for a console port for backward compat
1077     * (old kernel, new qemu)
1078     */
1079    mark_port_added(vser, 0);
1080
1081    vser->post_load = NULL;
1082
1083    QLIST_INSERT_HEAD(&vserdevices.devices, vser, next);
1084}
1085
1086static void virtio_serial_port_class_init(ObjectClass *klass, void *data)
1087{
1088    DeviceClass *k = DEVICE_CLASS(klass);
1089
1090    set_bit(DEVICE_CATEGORY_INPUT, k->categories);
1091    k->bus_type = TYPE_VIRTIO_SERIAL_BUS;
1092    k->realize = virtser_port_device_realize;
1093    k->unrealize = virtser_port_device_unrealize;
1094    k->props = virtser_props;
1095}
1096
1097static const TypeInfo virtio_serial_port_type_info = {
1098    .name = TYPE_VIRTIO_SERIAL_PORT,
1099    .parent = TYPE_DEVICE,
1100    .instance_size = sizeof(VirtIOSerialPort),
1101    .abstract = true,
1102    .class_size = sizeof(VirtIOSerialPortClass),
1103    .class_init = virtio_serial_port_class_init,
1104};
1105
1106static void virtio_serial_device_unrealize(DeviceState *dev, Error **errp)
1107{
1108    VirtIODevice *vdev = VIRTIO_DEVICE(dev);
1109    VirtIOSerial *vser = VIRTIO_SERIAL(dev);
1110
1111    QLIST_REMOVE(vser, next);
1112
1113    g_free(vser->ivqs);
1114    g_free(vser->ovqs);
1115    g_free(vser->ports_map);
1116    if (vser->post_load) {
1117        g_free(vser->post_load->connected);
1118        timer_del(vser->post_load->timer);
1119        timer_free(vser->post_load->timer);
1120        g_free(vser->post_load);
1121    }
1122    virtio_cleanup(vdev);
1123}
1124
1125/* Note: 'console' is used for backwards compatibility */
1126static const VMStateDescription vmstate_virtio_console = {
1127    .name = "virtio-console",
1128    .minimum_version_id = 3,
1129    .version_id = 3,
1130    .fields = (VMStateField[]) {
1131        VMSTATE_VIRTIO_DEVICE,
1132        VMSTATE_END_OF_LIST()
1133    },
1134};
1135
1136static Property virtio_serial_properties[] = {
1137    DEFINE_PROP_UINT32("max_ports", VirtIOSerial, serial.max_virtserial_ports,
1138                                                  31),
1139    DEFINE_PROP_BIT64("emergency-write", VirtIOSerial, host_features,
1140                      VIRTIO_CONSOLE_F_EMERG_WRITE, true),
1141    DEFINE_PROP_END_OF_LIST(),
1142};
1143
1144static void virtio_serial_class_init(ObjectClass *klass, void *data)
1145{
1146    DeviceClass *dc = DEVICE_CLASS(klass);
1147    VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass);
1148    HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(klass);
1149
1150    QLIST_INIT(&vserdevices.devices);
1151
1152    dc->props = virtio_serial_properties;
1153    dc->vmsd = &vmstate_virtio_console;
1154    set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
1155    vdc->realize = virtio_serial_device_realize;
1156    vdc->unrealize = virtio_serial_device_unrealize;
1157    vdc->get_features = get_features;
1158    vdc->get_config = get_config;
1159    vdc->set_config = set_config;
1160    vdc->set_status = set_status;
1161    vdc->reset = vser_reset;
1162    vdc->save = virtio_serial_save_device;
1163    vdc->load = virtio_serial_load_device;
1164    hc->plug = virtser_port_device_plug;
1165    hc->unplug = qdev_simple_device_unplug_cb;
1166}
1167
1168static const TypeInfo virtio_device_info = {
1169    .name = TYPE_VIRTIO_SERIAL,
1170    .parent = TYPE_VIRTIO_DEVICE,
1171    .instance_size = sizeof(VirtIOSerial),
1172    .class_init = virtio_serial_class_init,
1173    .interfaces = (InterfaceInfo[]) {
1174        { TYPE_HOTPLUG_HANDLER },
1175        { }
1176    }
1177};
1178
1179static void virtio_serial_register_types(void)
1180{
1181    type_register_static(&virtser_bus_info);
1182    type_register_static(&virtio_serial_port_type_info);
1183    type_register_static(&virtio_device_info);
1184}
1185
1186type_init(virtio_serial_register_types)
1187