Statistics
| Branch: | Revision:

root / hw / virtio-serial-bus.c @ 0d09e41a

History | View | Annotate | Download (27.8 kB)

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/iov.h"
22
#include "monitor/monitor.h"
23
#include "qemu/queue.h"
24
#include "hw/sysbus.h"
25
#include "trace.h"
26
#include "hw/virtio/virtio-serial.h"
27

    
28
static VirtIOSerialPort *find_port_by_id(VirtIOSerial *vser, uint32_t id)
29
{
30
    VirtIOSerialPort *port;
31

    
32
    if (id == VIRTIO_CONSOLE_BAD_ID) {
33
        return NULL;
34
    }
35

    
36
    QTAILQ_FOREACH(port, &vser->ports, next) {
37
        if (port->id == id)
38
            return port;
39
    }
40
    return NULL;
41
}
42

    
43
static VirtIOSerialPort *find_port_by_vq(VirtIOSerial *vser, VirtQueue *vq)
44
{
45
    VirtIOSerialPort *port;
46

    
47
    QTAILQ_FOREACH(port, &vser->ports, next) {
48
        if (port->ivq == vq || port->ovq == vq)
49
            return port;
50
    }
51
    return NULL;
52
}
53

    
54
static bool use_multiport(VirtIOSerial *vser)
55
{
56
    return vser->vdev.guest_features & (1 << VIRTIO_CONSOLE_F_MULTIPORT);
57
}
58

    
59
static size_t write_to_port(VirtIOSerialPort *port,
60
                            const uint8_t *buf, size_t size)
61
{
62
    VirtQueueElement elem;
63
    VirtQueue *vq;
64
    size_t offset;
65

    
66
    vq = port->ivq;
67
    if (!virtio_queue_ready(vq)) {
68
        return 0;
69
    }
70

    
71
    offset = 0;
72
    while (offset < size) {
73
        size_t len;
74

    
75
        if (!virtqueue_pop(vq, &elem)) {
76
            break;
77
        }
78

    
79
        len = iov_from_buf(elem.in_sg, elem.in_num, 0,
80
                           buf + offset, size - offset);
81
        offset += len;
82

    
83
        virtqueue_push(vq, &elem, len);
84
    }
85

    
86
    virtio_notify(&port->vser->vdev, vq);
87
    return offset;
88
}
89

    
90
static void discard_vq_data(VirtQueue *vq, VirtIODevice *vdev)
91
{
92
    VirtQueueElement elem;
93

    
94
    if (!virtio_queue_ready(vq)) {
95
        return;
96
    }
97
    while (virtqueue_pop(vq, &elem)) {
98
        virtqueue_push(vq, &elem, 0);
99
    }
100
    virtio_notify(vdev, vq);
101
}
102

    
103
static void do_flush_queued_data(VirtIOSerialPort *port, VirtQueue *vq,
104
                                 VirtIODevice *vdev)
105
{
106
    VirtIOSerialPortClass *vsc;
107

    
108
    assert(port);
109
    assert(virtio_queue_ready(vq));
110

    
111
    vsc = VIRTIO_SERIAL_PORT_GET_CLASS(port);
112

    
113
    while (!port->throttled) {
114
        unsigned int i;
115

    
116
        /* Pop an elem only if we haven't left off a previous one mid-way */
117
        if (!port->elem.out_num) {
118
            if (!virtqueue_pop(vq, &port->elem)) {
119
                break;
120
            }
121
            port->iov_idx = 0;
122
            port->iov_offset = 0;
123
        }
124

    
125
        for (i = port->iov_idx; i < port->elem.out_num; i++) {
126
            size_t buf_size;
127
            ssize_t ret;
128

    
129
            buf_size = port->elem.out_sg[i].iov_len - port->iov_offset;
130
            ret = vsc->have_data(port,
131
                                  port->elem.out_sg[i].iov_base
132
                                  + port->iov_offset,
133
                                  buf_size);
134
            if (port->throttled) {
135
                port->iov_idx = i;
136
                if (ret > 0) {
137
                    port->iov_offset += ret;
138
                }
139
                break;
140
            }
141
            port->iov_offset = 0;
142
        }
143
        if (port->throttled) {
144
            break;
145
        }
146
        virtqueue_push(vq, &port->elem, 0);
147
        port->elem.out_num = 0;
148
    }
149
    virtio_notify(vdev, vq);
150
}
151

    
152
static void flush_queued_data(VirtIOSerialPort *port)
153
{
154
    assert(port);
155

    
156
    if (!virtio_queue_ready(port->ovq)) {
157
        return;
158
    }
159
    do_flush_queued_data(port, port->ovq, &port->vser->vdev);
160
}
161

    
162
static size_t send_control_msg(VirtIOSerial *vser, void *buf, size_t len)
163
{
164
    VirtQueueElement elem;
165
    VirtQueue *vq;
166

    
167
    vq = vser->c_ivq;
168
    if (!virtio_queue_ready(vq)) {
169
        return 0;
170
    }
171
    if (!virtqueue_pop(vq, &elem)) {
172
        return 0;
173
    }
174

    
175
    memcpy(elem.in_sg[0].iov_base, buf, len);
176

    
177
    virtqueue_push(vq, &elem, len);
178
    virtio_notify(&vser->vdev, vq);
179
    return len;
180
}
181

    
182
static size_t send_control_event(VirtIOSerial *vser, uint32_t port_id,
183
                                 uint16_t event, uint16_t value)
184
{
185
    struct virtio_console_control cpkt;
186

    
187
    stl_p(&cpkt.id, port_id);
188
    stw_p(&cpkt.event, event);
189
    stw_p(&cpkt.value, value);
190

    
191
    trace_virtio_serial_send_control_event(port_id, event, value);
192
    return send_control_msg(vser, &cpkt, sizeof(cpkt));
193
}
194

    
195
/* Functions for use inside qemu to open and read from/write to ports */
196
int virtio_serial_open(VirtIOSerialPort *port)
197
{
198
    /* Don't allow opening an already-open port */
199
    if (port->host_connected) {
200
        return 0;
201
    }
202
    /* Send port open notification to the guest */
203
    port->host_connected = true;
204
    send_control_event(port->vser, port->id, VIRTIO_CONSOLE_PORT_OPEN, 1);
205

    
206
    return 0;
207
}
208

    
209
int virtio_serial_close(VirtIOSerialPort *port)
210
{
211
    port->host_connected = false;
212
    /*
213
     * If there's any data the guest sent which the app didn't
214
     * consume, reset the throttling flag and discard the data.
215
     */
216
    port->throttled = false;
217
    discard_vq_data(port->ovq, &port->vser->vdev);
218

    
219
    send_control_event(port->vser, port->id, VIRTIO_CONSOLE_PORT_OPEN, 0);
220

    
221
    return 0;
222
}
223

    
224
/* Individual ports/apps call this function to write to the guest. */
225
ssize_t virtio_serial_write(VirtIOSerialPort *port, const uint8_t *buf,
226
                            size_t size)
227
{
228
    if (!port || !port->host_connected || !port->guest_connected) {
229
        return 0;
230
    }
231
    return write_to_port(port, buf, size);
232
}
233

    
234
/*
235
 * Readiness of the guest to accept data on a port.
236
 * Returns max. data the guest can receive
237
 */
238
size_t virtio_serial_guest_ready(VirtIOSerialPort *port)
239
{
240
    VirtQueue *vq = port->ivq;
241
    unsigned int bytes;
242

    
243
    if (!virtio_queue_ready(vq) ||
244
        !(port->vser->vdev.status & VIRTIO_CONFIG_S_DRIVER_OK) ||
245
        virtio_queue_empty(vq)) {
246
        return 0;
247
    }
248
    if (use_multiport(port->vser) && !port->guest_connected) {
249
        return 0;
250
    }
251
    virtqueue_get_avail_bytes(vq, &bytes, NULL, 4096, 0);
252
    return bytes;
253
}
254

    
255
static void flush_queued_data_bh(void *opaque)
256
{
257
    VirtIOSerialPort *port = opaque;
258

    
259
    flush_queued_data(port);
260
}
261

    
262
void virtio_serial_throttle_port(VirtIOSerialPort *port, bool throttle)
263
{
264
    if (!port) {
265
        return;
266
    }
267

    
268
    trace_virtio_serial_throttle_port(port->id, throttle);
269
    port->throttled = throttle;
270
    if (throttle) {
271
        return;
272
    }
273
    qemu_bh_schedule(port->bh);
274
}
275

    
276
/* Guest wants to notify us of some event */
277
static void handle_control_message(VirtIOSerial *vser, void *buf, size_t len)
278
{
279
    struct VirtIOSerialPort *port;
280
    VirtIOSerialPortClass *vsc;
281
    struct virtio_console_control cpkt, *gcpkt;
282
    uint8_t *buffer;
283
    size_t buffer_len;
284

    
285
    gcpkt = buf;
286

    
287
    if (len < sizeof(cpkt)) {
288
        /* The guest sent an invalid control packet */
289
        return;
290
    }
291

    
292
    cpkt.event = lduw_p(&gcpkt->event);
293
    cpkt.value = lduw_p(&gcpkt->value);
294

    
295
    trace_virtio_serial_handle_control_message(cpkt.event, cpkt.value);
296

    
297
    if (cpkt.event == VIRTIO_CONSOLE_DEVICE_READY) {
298
        if (!cpkt.value) {
299
            error_report("virtio-serial-bus: Guest failure in adding device %s",
300
                         vser->bus.qbus.name);
301
            return;
302
        }
303
        /*
304
         * The device is up, we can now tell the device about all the
305
         * ports we have here.
306
         */
307
        QTAILQ_FOREACH(port, &vser->ports, next) {
308
            send_control_event(vser, port->id, VIRTIO_CONSOLE_PORT_ADD, 1);
309
        }
310
        return;
311
    }
312

    
313
    port = find_port_by_id(vser, ldl_p(&gcpkt->id));
314
    if (!port) {
315
        error_report("virtio-serial-bus: Unexpected port id %u for device %s",
316
                     ldl_p(&gcpkt->id), vser->bus.qbus.name);
317
        return;
318
    }
319

    
320
    trace_virtio_serial_handle_control_message_port(port->id);
321

    
322
    vsc = VIRTIO_SERIAL_PORT_GET_CLASS(port);
323

    
324
    switch(cpkt.event) {
325
    case VIRTIO_CONSOLE_PORT_READY:
326
        if (!cpkt.value) {
327
            error_report("virtio-serial-bus: Guest failure in adding port %u for device %s",
328
                         port->id, vser->bus.qbus.name);
329
            break;
330
        }
331
        /*
332
         * Now that we know the guest asked for the port name, we're
333
         * sure the guest has initialised whatever state is necessary
334
         * for this port. Now's a good time to let the guest know if
335
         * this port is a console port so that the guest can hook it
336
         * up to hvc.
337
         */
338
        if (vsc->is_console) {
339
            send_control_event(vser, port->id, VIRTIO_CONSOLE_CONSOLE_PORT, 1);
340
        }
341

    
342
        if (port->name) {
343
            stl_p(&cpkt.id, port->id);
344
            stw_p(&cpkt.event, VIRTIO_CONSOLE_PORT_NAME);
345
            stw_p(&cpkt.value, 1);
346

    
347
            buffer_len = sizeof(cpkt) + strlen(port->name) + 1;
348
            buffer = g_malloc(buffer_len);
349

    
350
            memcpy(buffer, &cpkt, sizeof(cpkt));
351
            memcpy(buffer + sizeof(cpkt), port->name, strlen(port->name));
352
            buffer[buffer_len - 1] = 0;
353

    
354
            send_control_msg(vser, buffer, buffer_len);
355
            g_free(buffer);
356
        }
357

    
358
        if (port->host_connected) {
359
            send_control_event(vser, port->id, VIRTIO_CONSOLE_PORT_OPEN, 1);
360
        }
361

    
362
        /*
363
         * When the guest has asked us for this information it means
364
         * the guest is all setup and has its virtqueues
365
         * initialised. If some app is interested in knowing about
366
         * this event, let it know.
367
         */
368
        if (vsc->guest_ready) {
369
            vsc->guest_ready(port);
370
        }
371
        break;
372

    
373
    case VIRTIO_CONSOLE_PORT_OPEN:
374
        port->guest_connected = cpkt.value;
375
        if (vsc->set_guest_connected) {
376
            /* Send the guest opened notification if an app is interested */
377
            vsc->set_guest_connected(port, cpkt.value);
378
        }
379
        break;
380
    }
381
}
382

    
383
static void control_in(VirtIODevice *vdev, VirtQueue *vq)
384
{
385
}
386

    
387
static void control_out(VirtIODevice *vdev, VirtQueue *vq)
388
{
389
    VirtQueueElement elem;
390
    VirtIOSerial *vser;
391
    uint8_t *buf;
392
    size_t len;
393

    
394
    vser = DO_UPCAST(VirtIOSerial, vdev, vdev);
395

    
396
    len = 0;
397
    buf = NULL;
398
    while (virtqueue_pop(vq, &elem)) {
399
        size_t cur_len;
400

    
401
        cur_len = iov_size(elem.out_sg, elem.out_num);
402
        /*
403
         * Allocate a new buf only if we didn't have one previously or
404
         * if the size of the buf differs
405
         */
406
        if (cur_len > len) {
407
            g_free(buf);
408

    
409
            buf = g_malloc(cur_len);
410
            len = cur_len;
411
        }
412
        iov_to_buf(elem.out_sg, elem.out_num, 0, buf, cur_len);
413

    
414
        handle_control_message(vser, buf, cur_len);
415
        virtqueue_push(vq, &elem, 0);
416
    }
417
    g_free(buf);
418
    virtio_notify(vdev, vq);
419
}
420

    
421
/* Guest wrote something to some port. */
422
static void handle_output(VirtIODevice *vdev, VirtQueue *vq)
423
{
424
    VirtIOSerial *vser;
425
    VirtIOSerialPort *port;
426

    
427
    vser = DO_UPCAST(VirtIOSerial, vdev, vdev);
428
    port = find_port_by_vq(vser, vq);
429

    
430
    if (!port || !port->host_connected) {
431
        discard_vq_data(vq, vdev);
432
        return;
433
    }
434

    
435
    if (!port->throttled) {
436
        do_flush_queued_data(port, vq, vdev);
437
        return;
438
    }
439
}
440

    
441
static void handle_input(VirtIODevice *vdev, VirtQueue *vq)
442
{
443
}
444

    
445
static uint32_t get_features(VirtIODevice *vdev, uint32_t features)
446
{
447
    VirtIOSerial *vser;
448

    
449
    vser = DO_UPCAST(VirtIOSerial, vdev, vdev);
450

    
451
    if (vser->bus.max_nr_ports > 1) {
452
        features |= (1 << VIRTIO_CONSOLE_F_MULTIPORT);
453
    }
454
    return features;
455
}
456

    
457
/* Guest requested config info */
458
static void get_config(VirtIODevice *vdev, uint8_t *config_data)
459
{
460
    VirtIOSerial *vser;
461

    
462
    vser = DO_UPCAST(VirtIOSerial, vdev, vdev);
463
    memcpy(config_data, &vser->config, sizeof(struct virtio_console_config));
464
}
465

    
466
static void set_config(VirtIODevice *vdev, const uint8_t *config_data)
467
{
468
    struct virtio_console_config config;
469

    
470
    memcpy(&config, config_data, sizeof(config));
471
}
472

    
473
static void guest_reset(VirtIOSerial *vser)
474
{
475
    VirtIOSerialPort *port;
476
    VirtIOSerialPortClass *vsc;
477

    
478
    QTAILQ_FOREACH(port, &vser->ports, next) {
479
        vsc = VIRTIO_SERIAL_PORT_GET_CLASS(port);
480
        if (port->guest_connected) {
481
            port->guest_connected = false;
482
            if (vsc->set_guest_connected) {
483
                vsc->set_guest_connected(port, false);
484
            }
485
        }
486
    }
487
}
488

    
489
static void set_status(VirtIODevice *vdev, uint8_t status)
490
{
491
    VirtIOSerial *vser;
492
    VirtIOSerialPort *port;
493

    
494
    vser = DO_UPCAST(VirtIOSerial, vdev, vdev);
495
    port = find_port_by_id(vser, 0);
496

    
497
    if (port && !use_multiport(port->vser)
498
        && (status & VIRTIO_CONFIG_S_DRIVER_OK)) {
499
        /*
500
         * Non-multiport guests won't be able to tell us guest
501
         * open/close status.  Such guests can only have a port at id
502
         * 0, so set guest_connected for such ports as soon as guest
503
         * is up.
504
         */
505
        port->guest_connected = true;
506
    }
507
    if (!(status & VIRTIO_CONFIG_S_DRIVER_OK)) {
508
        guest_reset(vser);
509
    }
510
}
511

    
512
static void vser_reset(VirtIODevice *vdev)
513
{
514
    VirtIOSerial *vser;
515

    
516
    vser = DO_UPCAST(VirtIOSerial, vdev, vdev);
517
    guest_reset(vser);
518
}
519

    
520
static void virtio_serial_save(QEMUFile *f, void *opaque)
521
{
522
    VirtIOSerial *s = opaque;
523
    VirtIOSerialPort *port;
524
    uint32_t nr_active_ports;
525
    unsigned int i, max_nr_ports;
526

    
527
    /* The virtio device */
528
    virtio_save(&s->vdev, f);
529

    
530
    /* The config space */
531
    qemu_put_be16s(f, &s->config.cols);
532
    qemu_put_be16s(f, &s->config.rows);
533

    
534
    qemu_put_be32s(f, &s->config.max_nr_ports);
535

    
536
    /* The ports map */
537
    max_nr_ports = tswap32(s->config.max_nr_ports);
538
    for (i = 0; i < (max_nr_ports + 31) / 32; i++) {
539
        qemu_put_be32s(f, &s->ports_map[i]);
540
    }
541

    
542
    /* Ports */
543

    
544
    nr_active_ports = 0;
545
    QTAILQ_FOREACH(port, &s->ports, next) {
546
        nr_active_ports++;
547
    }
548

    
549
    qemu_put_be32s(f, &nr_active_ports);
550

    
551
    /*
552
     * Items in struct VirtIOSerialPort.
553
     */
554
    QTAILQ_FOREACH(port, &s->ports, next) {
555
        uint32_t elem_popped;
556

    
557
        qemu_put_be32s(f, &port->id);
558
        qemu_put_byte(f, port->guest_connected);
559
        qemu_put_byte(f, port->host_connected);
560

    
561
        elem_popped = 0;
562
        if (port->elem.out_num) {
563
            elem_popped = 1;
564
        }
565
        qemu_put_be32s(f, &elem_popped);
566
        if (elem_popped) {
567
            qemu_put_be32s(f, &port->iov_idx);
568
            qemu_put_be64s(f, &port->iov_offset);
569

    
570
            qemu_put_buffer(f, (unsigned char *)&port->elem,
571
                            sizeof(port->elem));
572
        }
573
    }
574
}
575

    
576
static void virtio_serial_post_load_timer_cb(void *opaque)
577
{
578
    uint32_t i;
579
    VirtIOSerial *s = opaque;
580
    VirtIOSerialPort *port;
581
    uint8_t host_connected;
582
    VirtIOSerialPortClass *vsc;
583

    
584
    if (!s->post_load) {
585
        return;
586
    }
587
    for (i = 0 ; i < s->post_load->nr_active_ports; ++i) {
588
        port = s->post_load->connected[i].port;
589
        host_connected = s->post_load->connected[i].host_connected;
590
        if (host_connected != port->host_connected) {
591
            /*
592
             * We have to let the guest know of the host connection
593
             * status change
594
             */
595
            send_control_event(s, port->id, VIRTIO_CONSOLE_PORT_OPEN,
596
                               port->host_connected);
597
        }
598
        vsc = VIRTIO_SERIAL_PORT_GET_CLASS(port);
599
        if (vsc->set_guest_connected) {
600
            vsc->set_guest_connected(port, port->guest_connected);
601
        }
602
    }
603
    g_free(s->post_load->connected);
604
    qemu_free_timer(s->post_load->timer);
605
    g_free(s->post_load);
606
    s->post_load = NULL;
607
}
608

    
609
static int fetch_active_ports_list(QEMUFile *f, int version_id,
610
                                   VirtIOSerial *s, uint32_t nr_active_ports)
611
{
612
    uint32_t i;
613

    
614
    s->post_load = g_malloc0(sizeof(*s->post_load));
615
    s->post_load->nr_active_ports = nr_active_ports;
616
    s->post_load->connected =
617
        g_malloc0(sizeof(*s->post_load->connected) * nr_active_ports);
618

    
619
    s->post_load->timer = qemu_new_timer_ns(vm_clock,
620
                                            virtio_serial_post_load_timer_cb,
621
                                            s);
622

    
623
    /* Items in struct VirtIOSerialPort */
624
    for (i = 0; i < nr_active_ports; i++) {
625
        VirtIOSerialPort *port;
626
        uint32_t id;
627

    
628
        id = qemu_get_be32(f);
629
        port = find_port_by_id(s, id);
630
        if (!port) {
631
            return -EINVAL;
632
        }
633

    
634
        port->guest_connected = qemu_get_byte(f);
635
        s->post_load->connected[i].port = port;
636
        s->post_load->connected[i].host_connected = qemu_get_byte(f);
637

    
638
        if (version_id > 2) {
639
            uint32_t elem_popped;
640

    
641
            qemu_get_be32s(f, &elem_popped);
642
            if (elem_popped) {
643
                qemu_get_be32s(f, &port->iov_idx);
644
                qemu_get_be64s(f, &port->iov_offset);
645

    
646
                qemu_get_buffer(f, (unsigned char *)&port->elem,
647
                                sizeof(port->elem));
648
                virtqueue_map_sg(port->elem.in_sg, port->elem.in_addr,
649
                                 port->elem.in_num, 1);
650
                virtqueue_map_sg(port->elem.out_sg, port->elem.out_addr,
651
                                 port->elem.out_num, 1);
652

    
653
                /*
654
                 *  Port was throttled on source machine.  Let's
655
                 *  unthrottle it here so data starts flowing again.
656
                 */
657
                virtio_serial_throttle_port(port, false);
658
            }
659
        }
660
    }
661
    qemu_mod_timer(s->post_load->timer, 1);
662
    return 0;
663
}
664

    
665
static int virtio_serial_load(QEMUFile *f, void *opaque, int version_id)
666
{
667
    VirtIOSerial *s = opaque;
668
    uint32_t max_nr_ports, nr_active_ports, ports_map;
669
    unsigned int i;
670
    int ret;
671

    
672
    if (version_id > 3) {
673
        return -EINVAL;
674
    }
675

    
676
    /* The virtio device */
677
    ret = virtio_load(&s->vdev, f);
678
    if (ret) {
679
        return ret;
680
    }
681

    
682
    if (version_id < 2) {
683
        return 0;
684
    }
685

    
686
    /* The config space */
687
    qemu_get_be16s(f, &s->config.cols);
688
    qemu_get_be16s(f, &s->config.rows);
689

    
690
    qemu_get_be32s(f, &max_nr_ports);
691
    tswap32s(&max_nr_ports);
692
    if (max_nr_ports > tswap32(s->config.max_nr_ports)) {
693
        /* Source could have had more ports than us. Fail migration. */
694
        return -EINVAL;
695
    }
696

    
697
    for (i = 0; i < (max_nr_ports + 31) / 32; i++) {
698
        qemu_get_be32s(f, &ports_map);
699

    
700
        if (ports_map != s->ports_map[i]) {
701
            /*
702
             * Ports active on source and destination don't
703
             * match. Fail migration.
704
             */
705
            return -EINVAL;
706
        }
707
    }
708

    
709
    qemu_get_be32s(f, &nr_active_ports);
710

    
711
    if (nr_active_ports) {
712
        ret = fetch_active_ports_list(f, version_id, s, nr_active_ports);
713
        if (ret) {
714
            return ret;
715
        }
716
    }
717
    return 0;
718
}
719

    
720
static void virtser_bus_dev_print(Monitor *mon, DeviceState *qdev, int indent);
721

    
722
static Property virtser_props[] = {
723
    DEFINE_PROP_UINT32("nr", VirtIOSerialPort, id, VIRTIO_CONSOLE_BAD_ID),
724
    DEFINE_PROP_STRING("name", VirtIOSerialPort, name),
725
    DEFINE_PROP_END_OF_LIST()
726
};
727

    
728
#define TYPE_VIRTIO_SERIAL_BUS "virtio-serial-bus"
729
#define VIRTIO_SERIAL_BUS(obj) \
730
      OBJECT_CHECK(VirtIOSerialBus, (obj), TYPE_VIRTIO_SERIAL_BUS)
731

    
732
static void virtser_bus_class_init(ObjectClass *klass, void *data)
733
{
734
    BusClass *k = BUS_CLASS(klass);
735
    k->print_dev = virtser_bus_dev_print;
736
}
737

    
738
static const TypeInfo virtser_bus_info = {
739
    .name = TYPE_VIRTIO_SERIAL_BUS,
740
    .parent = TYPE_BUS,
741
    .instance_size = sizeof(VirtIOSerialBus),
742
    .class_init = virtser_bus_class_init,
743
};
744

    
745
static void virtser_bus_dev_print(Monitor *mon, DeviceState *qdev, int indent)
746
{
747
    VirtIOSerialPort *port = DO_UPCAST(VirtIOSerialPort, dev, qdev);
748

    
749
    monitor_printf(mon, "%*sport %d, guest %s, host %s, throttle %s\n",
750
                   indent, "", port->id,
751
                   port->guest_connected ? "on" : "off",
752
                   port->host_connected ? "on" : "off",
753
                   port->throttled ? "on" : "off");
754
}
755

    
756
/* This function is only used if a port id is not provided by the user */
757
static uint32_t find_free_port_id(VirtIOSerial *vser)
758
{
759
    unsigned int i, max_nr_ports;
760

    
761
    max_nr_ports = tswap32(vser->config.max_nr_ports);
762
    for (i = 0; i < (max_nr_ports + 31) / 32; i++) {
763
        uint32_t map, bit;
764

    
765
        map = vser->ports_map[i];
766
        bit = ffs(~map);
767
        if (bit) {
768
            return (bit - 1) + i * 32;
769
        }
770
    }
771
    return VIRTIO_CONSOLE_BAD_ID;
772
}
773

    
774
static void mark_port_added(VirtIOSerial *vser, uint32_t port_id)
775
{
776
    unsigned int i;
777

    
778
    i = port_id / 32;
779
    vser->ports_map[i] |= 1U << (port_id % 32);
780
}
781

    
782
static void add_port(VirtIOSerial *vser, uint32_t port_id)
783
{
784
    mark_port_added(vser, port_id);
785
    send_control_event(vser, port_id, VIRTIO_CONSOLE_PORT_ADD, 1);
786
}
787

    
788
static void remove_port(VirtIOSerial *vser, uint32_t port_id)
789
{
790
    VirtIOSerialPort *port;
791
    unsigned int i;
792

    
793
    i = port_id / 32;
794
    vser->ports_map[i] &= ~(1U << (port_id % 32));
795

    
796
    port = find_port_by_id(vser, port_id);
797
    /*
798
     * This function is only called from qdev's unplug callback; if we
799
     * get a NULL port here, we're in trouble.
800
     */
801
    assert(port);
802

    
803
    /* Flush out any unconsumed buffers first */
804
    discard_vq_data(port->ovq, &port->vser->vdev);
805

    
806
    send_control_event(vser, port->id, VIRTIO_CONSOLE_PORT_REMOVE, 1);
807
}
808

    
809
static int virtser_port_qdev_init(DeviceState *qdev)
810
{
811
    VirtIOSerialPort *port = DO_UPCAST(VirtIOSerialPort, dev, qdev);
812
    VirtIOSerialPortClass *vsc = VIRTIO_SERIAL_PORT_GET_CLASS(port);
813
    VirtIOSerialBus *bus = DO_UPCAST(VirtIOSerialBus, qbus, qdev->parent_bus);
814
    int ret, max_nr_ports;
815
    bool plugging_port0;
816

    
817
    port->vser = bus->vser;
818
    port->bh = qemu_bh_new(flush_queued_data_bh, port);
819

    
820
    assert(vsc->have_data);
821

    
822
    /*
823
     * Is the first console port we're seeing? If so, put it up at
824
     * location 0. This is done for backward compatibility (old
825
     * kernel, new qemu).
826
     */
827
    plugging_port0 = vsc->is_console && !find_port_by_id(port->vser, 0);
828

    
829
    if (find_port_by_id(port->vser, port->id)) {
830
        error_report("virtio-serial-bus: A port already exists at id %u",
831
                     port->id);
832
        return -1;
833
    }
834

    
835
    if (port->id == VIRTIO_CONSOLE_BAD_ID) {
836
        if (plugging_port0) {
837
            port->id = 0;
838
        } else {
839
            port->id = find_free_port_id(port->vser);
840
            if (port->id == VIRTIO_CONSOLE_BAD_ID) {
841
                error_report("virtio-serial-bus: Maximum port limit for this device reached");
842
                return -1;
843
            }
844
        }
845
    }
846

    
847
    max_nr_ports = tswap32(port->vser->config.max_nr_ports);
848
    if (port->id >= max_nr_ports) {
849
        error_report("virtio-serial-bus: Out-of-range port id specified, max. allowed: %u",
850
                     max_nr_ports - 1);
851
        return -1;
852
    }
853

    
854
    ret = vsc->init(port);
855
    if (ret) {
856
        return ret;
857
    }
858

    
859
    port->elem.out_num = 0;
860

    
861
    QTAILQ_INSERT_TAIL(&port->vser->ports, port, next);
862
    port->ivq = port->vser->ivqs[port->id];
863
    port->ovq = port->vser->ovqs[port->id];
864

    
865
    add_port(port->vser, port->id);
866

    
867
    /* Send an update to the guest about this new port added */
868
    virtio_notify_config(&port->vser->vdev);
869

    
870
    return ret;
871
}
872

    
873
static int virtser_port_qdev_exit(DeviceState *qdev)
874
{
875
    VirtIOSerialPort *port = DO_UPCAST(VirtIOSerialPort, dev, qdev);
876
    VirtIOSerialPortClass *vsc = VIRTIO_SERIAL_PORT_GET_CLASS(port);
877
    VirtIOSerial *vser = port->vser;
878

    
879
    qemu_bh_delete(port->bh);
880
    remove_port(port->vser, port->id);
881

    
882
    QTAILQ_REMOVE(&vser->ports, port, next);
883

    
884
    if (vsc->exit) {
885
        vsc->exit(port);
886
    }
887
    return 0;
888
}
889

    
890
VirtIODevice *virtio_serial_init(DeviceState *dev, virtio_serial_conf *conf)
891
{
892
    VirtIOSerial *vser;
893
    VirtIODevice *vdev;
894
    uint32_t i, max_supported_ports;
895

    
896
    if (!conf->max_virtserial_ports)
897
        return NULL;
898

    
899
    /* Each port takes 2 queues, and one pair is for the control queue */
900
    max_supported_ports = VIRTIO_PCI_QUEUE_MAX / 2 - 1;
901

    
902
    if (conf->max_virtserial_ports > max_supported_ports) {
903
        error_report("maximum ports supported: %u", max_supported_ports);
904
        return NULL;
905
    }
906

    
907
    vdev = virtio_common_init("virtio-serial", VIRTIO_ID_CONSOLE,
908
                              sizeof(struct virtio_console_config),
909
                              sizeof(VirtIOSerial));
910

    
911
    vser = DO_UPCAST(VirtIOSerial, vdev, vdev);
912

    
913
    /* Spawn a new virtio-serial bus on which the ports will ride as devices */
914
    qbus_create_inplace(&vser->bus.qbus, TYPE_VIRTIO_SERIAL_BUS, dev, NULL);
915
    vser->bus.qbus.allow_hotplug = 1;
916
    vser->bus.vser = vser;
917
    QTAILQ_INIT(&vser->ports);
918

    
919
    vser->bus.max_nr_ports = conf->max_virtserial_ports;
920
    vser->ivqs = g_malloc(conf->max_virtserial_ports * sizeof(VirtQueue *));
921
    vser->ovqs = g_malloc(conf->max_virtserial_ports * sizeof(VirtQueue *));
922

    
923
    /* Add a queue for host to guest transfers for port 0 (backward compat) */
924
    vser->ivqs[0] = virtio_add_queue(vdev, 128, handle_input);
925
    /* Add a queue for guest to host transfers for port 0 (backward compat) */
926
    vser->ovqs[0] = virtio_add_queue(vdev, 128, handle_output);
927

    
928
    /* TODO: host to guest notifications can get dropped
929
     * if the queue fills up. Implement queueing in host,
930
     * this might also make it possible to reduce the control
931
     * queue size: as guest preposts buffers there,
932
     * this will save 4Kbyte of guest memory per entry. */
933

    
934
    /* control queue: host to guest */
935
    vser->c_ivq = virtio_add_queue(vdev, 32, control_in);
936
    /* control queue: guest to host */
937
    vser->c_ovq = virtio_add_queue(vdev, 32, control_out);
938

    
939
    for (i = 1; i < vser->bus.max_nr_ports; i++) {
940
        /* Add a per-port queue for host to guest transfers */
941
        vser->ivqs[i] = virtio_add_queue(vdev, 128, handle_input);
942
        /* Add a per-per queue for guest to host transfers */
943
        vser->ovqs[i] = virtio_add_queue(vdev, 128, handle_output);
944
    }
945

    
946
    vser->config.max_nr_ports = tswap32(conf->max_virtserial_ports);
947
    vser->ports_map = g_malloc0(((conf->max_virtserial_ports + 31) / 32)
948
        * sizeof(vser->ports_map[0]));
949
    /*
950
     * Reserve location 0 for a console port for backward compat
951
     * (old kernel, new qemu)
952
     */
953
    mark_port_added(vser, 0);
954

    
955
    vser->vdev.get_features = get_features;
956
    vser->vdev.get_config = get_config;
957
    vser->vdev.set_config = set_config;
958
    vser->vdev.set_status = set_status;
959
    vser->vdev.reset = vser_reset;
960

    
961
    vser->qdev = dev;
962

    
963
    vser->post_load = NULL;
964

    
965
    /*
966
     * Register for the savevm section with the virtio-console name
967
     * to preserve backward compat
968
     */
969
    register_savevm(dev, "virtio-console", -1, 3, virtio_serial_save,
970
                    virtio_serial_load, vser);
971

    
972
    return vdev;
973
}
974

    
975
void virtio_serial_exit(VirtIODevice *vdev)
976
{
977
    VirtIOSerial *vser = DO_UPCAST(VirtIOSerial, vdev, vdev);
978

    
979
    unregister_savevm(vser->qdev, "virtio-console", vser);
980

    
981
    g_free(vser->ivqs);
982
    g_free(vser->ovqs);
983
    g_free(vser->ports_map);
984
    if (vser->post_load) {
985
        g_free(vser->post_load->connected);
986
        qemu_del_timer(vser->post_load->timer);
987
        qemu_free_timer(vser->post_load->timer);
988
        g_free(vser->post_load);
989
    }
990
    virtio_cleanup(vdev);
991
}
992

    
993
static void virtio_serial_port_class_init(ObjectClass *klass, void *data)
994
{
995
    DeviceClass *k = DEVICE_CLASS(klass);
996
    k->init = virtser_port_qdev_init;
997
    k->bus_type = TYPE_VIRTIO_SERIAL_BUS;
998
    k->exit = virtser_port_qdev_exit;
999
    k->unplug = qdev_simple_unplug_cb;
1000
    k->props = virtser_props;
1001
}
1002

    
1003
static const TypeInfo virtio_serial_port_type_info = {
1004
    .name = TYPE_VIRTIO_SERIAL_PORT,
1005
    .parent = TYPE_DEVICE,
1006
    .instance_size = sizeof(VirtIOSerialPort),
1007
    .abstract = true,
1008
    .class_size = sizeof(VirtIOSerialPortClass),
1009
    .class_init = virtio_serial_port_class_init,
1010
};
1011

    
1012
static void virtio_serial_register_types(void)
1013
{
1014
    type_register_static(&virtser_bus_info);
1015
    type_register_static(&virtio_serial_port_type_info);
1016
}
1017

    
1018
type_init(virtio_serial_register_types)