static void do_flush_queued_data(VirtIOSerialPort *port, VirtQueue *vq,

                                 VirtIODevice *vdev)

{

    VirtIOSerialPortClass *vsc;



    assert(port);

    assert(virtio_queue_ready(vq));



    vsc = VIRTIO_SERIAL_PORT_GET_CLASS(port);



    while (!port->throttled) {

        unsigned int i;



        /* Pop an elem only if we haven't left off a previous one mid-way */

        if (!port->elem.out_num) {

            if (!virtqueue_pop(vq, &port->elem)) {

                break;

            }

            port->iov_idx = 0;

            port->iov_offset = 0;

        }



        for (i = port->iov_idx; i < port->elem.out_num; i++) {

            size_t buf_size;

            ssize_t ret;



            buf_size = port->elem.out_sg[i].iov_len - port->iov_offset;

            ret = vsc->have_data(port,

                                  port->elem.out_sg[i].iov_base

                                  + port->iov_offset,

                                  buf_size);

            if (port->throttled) {

                port->iov_idx = i;

                if (ret > 0) {

                    port->iov_offset += ret;

                }

                break;

            }

            port->iov_offset = 0;

        }

        if (port->throttled) {

            break;

        }

        virtqueue_push(vq, &port->elem, 0);

        port->elem.out_num = 0;

    }

    virtio_notify(vdev, vq);

}

static void do_flush_queued_data(VirtIOSerialPort *port, VirtQueue *vq,

                                 VirtIODevice *vdev)

{

    VirtIOSerialPortClass *vsc;



    assert(port);

    assert(virtio_queue_ready(vq));



    vsc = VIRTIO_SERIAL_PORT_GET_CLASS(port);



    while (!port->throttled) {

        unsigned int i;



        

        if (!port->elem.out_num) {

            if (!virtqueue_pop(vq, &port->elem)) {

                break;

            }

            port->iov_idx = 0;

            port->iov_offset = 0;

        }



        for (i = port->iov_idx; i < port->elem.out_num; i++) {

            size_t buf_size;

            ssize_t ret;



            buf_size = port->elem.out_sg[i].iov_len - port->iov_offset;

            ret = vsc->have_data(port,

                                  port->elem.out_sg[i].iov_base

                                  + port->iov_offset,

                                  buf_size);

            if (port->throttled) {

                port->iov_idx = i;

                if (ret > 0) {

                    port->iov_offset += ret;

                }

                break;

            }

            port->iov_offset = 0;

        }

        if (port->throttled) {

            break;

        }

        virtqueue_push(vq, &port->elem, 0);

        port->elem.out_num = 0;

    }

    virtio_notify(vdev, vq);

}

static void FUNC_0(VirtIOSerialPort *VAR_0, VirtQueue *VAR_1,

                                 VirtIODevice *VAR_2)

{

    VirtIOSerialPortClass *vsc;



    assert(VAR_0);

    assert(virtio_queue_ready(VAR_1));



    vsc = VIRTIO_SERIAL_PORT_GET_CLASS(VAR_0);



    while (!VAR_0->throttled) {

        unsigned int VAR_3;



        

        if (!VAR_0->elem.out_num) {

            if (!virtqueue_pop(VAR_1, &VAR_0->elem)) {

                break;

            }

            VAR_0->iov_idx = 0;

            VAR_0->iov_offset = 0;

        }



        for (VAR_3 = VAR_0->iov_idx; VAR_3 < VAR_0->elem.out_num; VAR_3++) {

            size_t buf_size;

            ssize_t ret;



            buf_size = VAR_0->elem.out_sg[VAR_3].iov_len - VAR_0->iov_offset;

            ret = vsc->have_data(VAR_0,

                                  VAR_0->elem.out_sg[VAR_3].iov_base

                                  + VAR_0->iov_offset,

                                  buf_size);

            if (VAR_0->throttled) {

                VAR_0->iov_idx = VAR_3;

                if (ret > 0) {

                    VAR_0->iov_offset += ret;

                }

                break;

            }

            VAR_0->iov_offset = 0;

        }

        if (VAR_0->throttled) {

            break;

        }

        virtqueue_push(VAR_1, &VAR_0->elem, 0);

        VAR_0->elem.out_num = 0;

    }

    virtio_notify(VAR_2, VAR_1);

}

static void FUNC_0(VirtIOSerialPort *VAR_0, VirtQueue *VAR_1,
VirtIODevice *VAR_2)
{ VirtIOSerialPortClass *vsc; assert(VAR_0); assert(virtio_queue_ready(VAR_1)); vsc = VIRTIO_SERIAL_PORT_GET_CLASS(VAR_0); while (!VAR_0->throttled) { unsigned int VAR_3; if (!VAR_0->elem.out_num) { if (!virtqueue_pop(VAR_1, &VAR_0->elem)) { break; } VAR_0->iov_idx = 0; VAR_0->iov_offset = 0; } for (VAR_3 = VAR_0->iov_idx; VAR_3 < VAR_0->elem.out_num; VAR_3++) { size_t buf_size; ssize_t ret; buf_size = VAR_0->elem.out_sg[VAR_3].iov_len - VAR_0->iov_offset; ret = vsc->have_data(VAR_0,
VAR_0->elem.out_sg[VAR_3].iov_base
+ VAR_0->iov_offset,
buf_size); if (VAR_0->throttled) { VAR_0->iov_idx = VAR_3; if (ret > 0) { VAR_0->iov_offset += ret; } break; } VAR_0->iov_offset = 0; } if (VAR_0->throttled) { break; } virtqueue_push(VAR_1, &VAR_0->elem, 0); VAR_0->elem.out_num = 0; } virtio_notify(VAR_2, VAR_1); }