X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2Fserial.c;h=7d0c10e04b702373c4b6e8cfa3d33b392e08cdf4;hb=8330d6bb32172ba7c50b4e242e0213c8a9e1424e;hp=e7f11dabc9d677c8931542cc0df31651b12dedbd;hpb=d3ba44fb64c5a40a0d47cf8fecf809b8c20fd440;p=palacios-OLD.git diff --git a/palacios/src/devices/serial.c b/palacios/src/devices/serial.c index e7f11da..7d0c10e 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->write(&c,1,com_port->backend_data); + } } @@ -914,7 +933,7 @@ static int init_serial_port(struct serial_port * com) { static int serial_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) { struct serial_state * state = (struct serial_state *)V3_Malloc(sizeof(struct serial_state)); - char * name = v3_cfg_val(cfg, "name"); + char * dev_id = v3_cfg_val(cfg, "ID"); PrintDebug("UART: init_device\n"); init_serial_port(&(state->com1)); @@ -928,10 +947,10 @@ static int serial_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) { state->com4.irq_number = COM4_IRQ; - struct vm_device * dev = v3_allocate_device(name, &dev_ops, state); + struct vm_device * dev = v3_allocate_device(dev_id, &dev_ops, state); if (v3_attach_device(vm, dev) == -1) { - PrintError("Could not attach device %s\n", name); + PrintError("Could not attach device %s\n", dev_id); return -1; } @@ -974,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)