From: Lei Xia Date: Wed, 3 Nov 2010 20:02:15 +0000 (-0500) Subject: stream implementation and interface between searial device and stream X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=commitdiff_plain;h=8330d6bb32172ba7c50b4e242e0213c8a9e1424e;p=palacios.git stream implementation and interface between searial device and stream incomplete yet --- diff --git a/palacios/include/devices/serial.h b/palacios/include/devices/serial.h new file mode 100644 index 0000000..f71159c --- /dev/null +++ b/palacios/include/devices/serial.h @@ -0,0 +1,39 @@ +/* + * This file is part of the Palacios Virtual Machine Monitor developed + * by the V3VEE Project with funding from the United States National + * Science Foundation and the Department of Energy. + * + * The V3VEE Project is a joint project between Northwestern University + * and the University of New Mexico. You can find out more at + * http://www.v3vee.org + * + * Copyright (c) 2008, Jack Lange + * Copyright (c) 2008, The V3VEE Project + * All rights reserved. + * + * Author: Jack Lange + * + * This is free software. You are permitted to use, + * redistribute, and modify it as specified in the file "V3VEE_LICENSE". + */ + +#ifndef __DEVICES_SERIAL_H__ +#define __DEVICES_SERIAL_H__ + +#ifdef __V3VEE__ + +/* Really need to find clean way to allow a backend stream device to be attachable + to different kinds of frontend devices that can act as a stream */ + +struct v3_stream_ops { + int (*read)(char *buf, uint_t len, void *private_data); + int (*write)(char *buf, uint_t len, void *private_data); +}; + + +int v3_stream_register_serial(struct vm_device * serial_dev, struct v3_stream_ops * ops, void * private_data); + +#endif // ! __V3VEE__ + + +#endif diff --git a/palacios/include/palacios/vmm_stream.h b/palacios/include/palacios/vmm_stream.h new file mode 100644 index 0000000..02b7aed --- /dev/null +++ b/palacios/include/palacios/vmm_stream.h @@ -0,0 +1,75 @@ +/* + * This file is part of the Palacios Virtual Machine Monitor developed + * by the V3VEE Project with funding from the United States National + * Science Foundation and the Department of Energy. + * + * The V3VEE Project is a joint project between Northwestern University + * and the University of New Mexico. You can find out more at + * http://www.v3vee.org + * + * Copyright (c) 2010, Peter Dinda (pdinda@northwestern.edu> + * Copyright (c) 2010, The V3VEE Project + * All rights reserved. + * + * Author: Peter Dinda + * + * This is free software. You are permitted to use, + * redistribute, and modify it as specified in the file "V3VEE_LICENSE". + */ + + +#ifndef __VMM_STREAM_H__ +#define __VMM_STREAM_H__ + +#include + + +#ifdef __V3VEE__ + +#define V3_StreamOpen(path, mode) \ + ({ \ + extern struct v3_stream_hooks *stream_hooks; \ + ((stream_hooks) && (stream_hooks)->stream_open) ? \ + (stream_hooks)->stream_open((path), (mode)) : NULL; \ + }) + +#define V3_StreamRead(stream, b, l) \ + ({ \ + extern struct v3_stream_hooks *stream_hooks; \ + ((stream_hooks) && (stream_hooks)->stream_read) ? \ + (stream_hooks)->stream_read((stream), (b), (l)) : -1; \ + }) + +#define V3_StreamWrite(stream, b, l) \ + ({ \ + extern struct v3_stream_hooks *stream_hooks; \ + ((stream_hooks) && (stream_hooks)->stream_write) ? \ + (stream_hooks)->stream_write((stream), (b), (l)) : -1; \ + }) + + +#define V3_StreamClose(stream) \ + ({ \ + extern struct v3_stream_hooks *stream_hooks; \ + ((stream_hooks) && (stream_hooks)->stream_close) ? \ + (stream_hooks)->stream_close((stream), (mode)) : NULL; \ + }) + + +#endif + +#define STREAM_OPEN_MODE_READ (1 << 0) +#define STREAM_OPEN_MODE_WRITE (1 << 1) + +struct v3_stream_hooks { + void *(*stream_open)(const char *path, int mode); + int (*stream_read)(void *stream, char *buf, int len); + int (*stream_write)(void *stream, char *buf, int len); + int (*stream_close)(void *stream); + +}; + + +extern void V3_Init_Stream(struct v3_stream_hooks * hooks); + +#endif diff --git a/palacios/src/devices/Kconfig b/palacios/src/devices/Kconfig index 7bcc256..8d62f77 100644 --- a/palacios/src/devices/Kconfig +++ b/palacios/src/devices/Kconfig @@ -351,5 +351,11 @@ config SERIAL_UART help Include virtual serial port +config STREAM + bool "Stream device" + default n + help + Stream Device + endmenu diff --git a/palacios/src/devices/Makefile b/palacios/src/devices/Makefile index 817645d..a90ac91 100644 --- a/palacios/src/devices/Makefile +++ b/palacios/src/devices/Makefile @@ -38,4 +38,4 @@ obj-$(CONFIG_CURSES_CONSOLE) += curses_cons.o obj-$(CONFIG_PASSTHROUGH_PCI) += pci_passthrough.o obj-$(CONFIG_SYMMOD) += lnx_virtio_symmod.o - +obj-$(CONFIG_STREAM) += stream.o diff --git a/palacios/src/devices/serial.c b/palacios/src/devices/serial.c index b527431..7d0c10e 100644 --- a/palacios/src/devices/serial.c +++ b/palacios/src/devices/serial.c @@ -28,6 +28,8 @@ #include #include +#include + #ifndef CONFIG_DEBUG_SERIAL #undef PrintDebug @@ -283,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; + }; @@ -291,6 +297,8 @@ struct serial_state { struct serial_port com2; struct serial_port com3; struct serial_port com4; + + }; @@ -492,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); + } } @@ -980,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) diff --git a/palacios/src/palacios/Makefile b/palacios/src/palacios/Makefile index 2592e9c..0cfcc01 100644 --- a/palacios/src/palacios/Makefile +++ b/palacios/src/palacios/Makefile @@ -62,7 +62,7 @@ obj-$(CONFIG_TELEMETRY) += vmm_telemetry.o obj-$(CONFIG_SOCKET) += vmm_socket.o obj-$(CONFIG_VNET) += vmm_vnet.o obj-$(CONFIG_FILE) += vmm_file.o -obj-$(CONFIG_CONSOLE) += vmm_console.o +obj-$(CONFIG_CONSOLE) += vmm_console.o vmm_stream.o obj-$(CONFIG_SYMBIOTIC) += vmm_symbiotic.o vmm_symspy.o diff --git a/palacios/src/palacios/vmm.c b/palacios/src/palacios/vmm.c index 4ed2473..811e45c 100644 --- a/palacios/src/palacios/vmm.c +++ b/palacios/src/palacios/vmm.c @@ -226,22 +226,10 @@ int v3_start_vm(struct v3_vm_info * vm, unsigned int cpu_mask) { // Finally launch the BSP on core 0 sprintf(tname,"core%u",0); -#if CONFIG_LINUX - if (vm->num_cores==1) { - start_core(&(vm->cores[0])); - return -1; - } else { - if (!os_hooks->start_thread_on_cpu(0,start_core,&(vm->cores[0]),tname)) { - PrintError("Thread launch failed\n"); - return -1; - } - } -#else if (!os_hooks->start_thread_on_cpu(0,start_core,&(vm->cores[0]),tname)) { PrintError("Thread launch failed\n"); return -1; } -#endif return 0; diff --git a/palacios/src/palacios/vmm_stream.c b/palacios/src/palacios/vmm_stream.c new file mode 100644 index 0000000..729c661 --- /dev/null +++ b/palacios/src/palacios/vmm_stream.c @@ -0,0 +1,34 @@ +/* + * This file is part of the Palacios Virtual Machine Monitor developed + * by the V3VEE Project with funding from the United States National + * Science Foundation and the Department of Energy. + * + * The V3VEE Project is a joint project between Northwestern University + * and the University of New Mexico. You can find out more at + * http://www.v3vee.org + * + * Copyright (c) 2010, Lei Xia + * Copyright (c) 2010, The V3VEE Project + * All rights reserved. + * + * Author: Lei Xia + * + * This is free software. You are permitted to use, + * redistribute, and modify it as specified in the file "V3VEE_LICENSE". + */ + + +#include +#include +#include +#include + + +struct v3_stream_hooks * stream_hooks = 0; + +void V3_Init_Stream(struct v3_stream_hooks * hooks) { + stream_hooks = hooks; + PrintDebug("V3 stream inited\n"); + + return; +}