#include <palacios/vmm_host_events.h>
#include <palacios/vmm_lock.h>
#include <palacios/vmm_string.h>
-
+#include <devices/serial.h>
struct stream_state {
- void *stream;
+ void *stream_in;
+ void *stream_out;
struct vm_device *frontend_dev;
+ struct v3_stream_ops stream_ops;
};
-
static int stream_read(char *buf, uint_t length, void *private_data)
{
struct vm_device *dev = (struct vm_device *) private_data;
struct stream_state *state = (struct stream_state *) dev->private_data;
- return V3_StreamRead(state->stream,buf,length);
+ return V3_StreamRead(state->stream_out,buf,length);
}
static int stream_write(char *buf, uint_t length, void *private_data)
struct vm_device *dev = (struct vm_device *) private_data;
struct stream_state *state = (struct stream_state *) dev->private_data;
- return V3_StreamWrite(state->stream,buf,length);
+ return V3_StreamWrite(state->stream_out,buf,length);
}
-
-static struct v3_stream_ops stream_ops = {
- .write = stream_write,
- .read = stream_read
-};
+static void notify(void * data){
+ struct stream_state *state = (struct stream_state *)data;
+ char temp[1024];
+ int len;
+
+ len = V3_StreamRead(state->stream_in, temp, 1024);
+ state->stream_ops.input(temp, len, state->stream_ops.front_data);
+}
static struct v3_device_ops dev_ops = {
.free = NULL,
const char * frontend_tag = v3_cfg_val(frontend_cfg, "tag");
struct vm_device * frontend = v3_find_dev(vm, frontend_tag);
char * dev_id = v3_cfg_val(cfg, "ID");
- char * path = v3_cfg_val(cfg, "localname");
+ char * stream_in = v3_cfg_val(cfg, "stream_in");
+ char * stream_out = v3_cfg_val(cfg, "stream_out");
+ struct stream_state *state;
+
- /* read configuration */
V3_ASSERT(frontend_cfg);
V3_ASSERT(frontend_tag);
V3_ASSERT(frontend);
+ V3_ASSERT(stream_in);
+ V3_ASSERT(stream_out);
-
- /* allocate state */
- state = (struct cons_state *)V3_Malloc(sizeof(struct stream_state));
+ state = (struct stream_state *)V3_Malloc(sizeof(struct stream_state));
V3_ASSERT(state);
state->frontend_dev = frontend;
- V3_ASSERT(path);
-
- /* The system is responsible for interpreting the localname of the stream */
- state->stream = V3_StreamOpen(ttypath, STREAM_OPEN_MODE_READ | STREAM_OPEN_MODE_WRITE);
- if (!state->stream) {
- PrintError("Could not open localname %s\n", path);
+
+ state->stream_out = V3_StreamOpen(stream_out, NULL, NULL, STREAM_OPEN_MODE_READ | STREAM_OPEN_MODE_WRITE);
+ state->stream_in = V3_StreamOpen(stream_in, notify, state, STREAM_OPEN_MODE_READ | STREAM_OPEN_MODE_WRITE);
+ if (!state->stream_out || !state->stream_in) {
+ PrintError("Could not open stream %s %s\n", stream_in, stream_out);
V3_Free(state);
return -1;
}
-
- /* allocate device */
+
struct vm_device *dev = v3_allocate_device(dev_id, &dev_ops, state);
V3_ASSERT(dev);
- /* attach device to virtual machine */
if (v3_attach_device(vm, dev) == -1) {
PrintError("Could not attach device %s\n", dev_id);
V3_Free(state);
return -1;
}
- /* attach to front-end display adapter */
- v3_console_register_cga(frontend, &cons_ops, dev);
+ state->stream_ops.read = stream_read;
+ state->stream_ops.write = stream_write;
+
+ v3_stream_register_serial(frontend, &(state->stream_ops), dev);
- return 0;
+ return 0;
}
-device_register("CURSES_CONSOLE", cons_init)
+device_register("STREAM", stream_init)