#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
struct serial_buffer tx_buffer;
struct serial_buffer rx_buffer;
uint_t irq_number;
+
+ struct v3_stream_ops *stream_ops;
+ void *backend_data;
+
};
struct serial_port com2;
struct serial_port com3;
struct serial_port com4;
+
+
};
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);
+ }
}
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));
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;
}
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)