Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


stream implementation and interface between searial device and stream
[palacios.git] / palacios / src / devices / serial.c
index e7f11da..7d0c10e 100644 (file)
 #include <palacios/vmm_host_events.h>
 #include <palacios/vm_guest.h>
 
+#include <devices/serial.h>
+
+
+#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)