6 #include <linux/device.h>
7 #include <linux/cdev.h>
8 #include <linux/errno.h>
10 #include <linux/uaccess.h>
11 #include <linux/poll.h>
12 #include <linux/anon_inodes.h>
13 #include <linux/file.h>
15 #include <palacios/vmm.h>
16 #include <palacios/vmm_host_events.h>
19 #include "palacios-stream.h"
23 send_serial_input_to_palacios( unsigned char *input,
25 struct v3_vm_info * vm ) {
26 struct v3_serial_event event;
32 memcpy(event.data, input, len);
35 v3_deliver_serial_event(vm, &event);
39 serial_read(struct file * filp, char __user * buf, size_t size, loff_t * offset) {
43 struct stream_buffer * stream = filp->private_data;
51 len = stream_dequeue(stream, temp, size);
53 if (copy_to_user(buf, temp, len)) {
54 printk("Read fault\n");
58 printk("Returning %d bytes\n", len);
64 serial_write(struct file * filp, const char __user * buf, size_t size, loff_t * offset) {
66 struct stream_buffer * stream = filp->private_data;
67 struct v3_vm_info * vm;
75 if (copy_from_user(temp, buf, size)) {
76 printk("Write fault\n");
80 vm = stream->guest->v3_ctx;
81 send_serial_input_to_palacios(temp, size, vm);
88 serial_poll(struct file * filp, struct poll_table_struct * poll_tb) {
89 unsigned int mask = 0;
90 struct stream_buffer *stream = filp->private_data;
92 poll_wait(filp, &(stream->intr_queue), poll_tb);
94 if(stream_datalen(stream) > 0){
95 mask = POLLIN | POLLRDNORM;
98 printk("polling v3 serial\n");
103 static struct file_operations v3_cons_fops = {
105 .write = serial_write,
110 int open_serial(char * name) {
114 printk("open path: %s\n", name);
116 stream = find_stream_by_name(NULL, name);
118 if (stream == NULL) {
122 cons_fd = anon_inode_getfd("v3-cons", &v3_cons_fops, stream, 0);
125 printk("Error creating serial inode\n");
129 printk("Returning new serial fd\n");