X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2Fserial.c;h=961b7ea0be1b1f296cce262286313ac5d4f50793;hb=ae4e727a7abfdb7df9cb93769a0799494ec75254;hp=3f0085eded6b5ad7ca556fba4b53b64aa04c3c73;hpb=e5e029575affad90c19ca038a3b780820535d421;p=palacios.git diff --git a/palacios/src/devices/serial.c b/palacios/src/devices/serial.c index 3f0085e..961b7ea 100644 --- a/palacios/src/devices/serial.c +++ b/palacios/src/devices/serial.c @@ -28,6 +28,14 @@ #include #include +#include + + +#ifndef CONFIG_DEBUG_SERIAL +#undef PrintDebug +#define PrintDebug(fmt, args...) +#endif + #define COM1_DATA_PORT 0x3f8 #define COM1_IRQ_ENABLE_PORT 0x3f9 @@ -277,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; + }; @@ -285,6 +297,8 @@ struct serial_state { struct serial_port com2; struct serial_port com3; struct serial_port com4; + + }; @@ -486,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->stream_write(&c,1,com_port->backend_data); + } } @@ -974,5 +993,14 @@ 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 */ +} + device_register("SERIAL", serial_init)