X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2Fserial.c;h=7d0c10e04b702373c4b6e8cfa3d33b392e08cdf4;hb=8330d6bb32172ba7c50b4e242e0213c8a9e1424e;hp=b5274312a84cf30600842453ebfb9e95a58d8282;hpb=d1f4efdef22f2f1ca60bebbc962058f3ec93d484;p=palacios.git diff --git a/palacios/src/devices/serial.c b/palacios/src/devices/serial.c index b527431..7d0c10e 100644 --- a/palacios/src/devices/serial.c +++ b/palacios/src/devices/serial.c @@ -28,6 +28,8 @@ #include #include +#include + #ifndef CONFIG_DEBUG_SERIAL #undef PrintDebug @@ -283,6 +285,10 @@ struct serial_port { struct serial_buffer tx_buffer; struct serial_buffer rx_buffer; uint_t irq_number; + + struct v3_stream_ops *stream_ops; + void *backend_data; + }; @@ -291,6 +297,8 @@ struct serial_state { struct serial_port com2; struct serial_port com3; struct serial_port com4; + + }; @@ -492,6 +500,11 @@ static int write_data_port(struct guest_info * core, uint16_t port, com_port->dll.data = *val; } else { queue_data(&(com_port->tx_buffer), *val, com_port, dev); + if (com_port->stream_ops) { + uint8_t c; + dequeue_data(&(com_port->tx_buffer), &c, com_port, dev); + com_port->stream_ops->write(&c,1,com_port->backend_data); + } } @@ -980,5 +993,16 @@ static int serial_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) { return 0; } +int v3_stream_register_serial(struct vm_device * serial_dev, struct v3_stream_ops * ops, void * private_data) +{ + struct serial_state *state = (struct serial_state *)(serial_dev->private_data); + + state->com1.stream_ops = ops; + state->com1.backend_data = private_data; + /* bind to other ports here */ + + return 0; +} + device_register("SERIAL", serial_init)