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.


Cleanup of linkage issues for non-Linux hosts
[palacios.git] / linux_module / iface-console.c
index 9eedbe5..0f5bd23 100644 (file)
@@ -96,34 +96,34 @@ console_read(struct file * filp, char __user * buf, size_t size, loff_t * offset
 
 
     if (size < sizeof(struct cons_msg)) {
-       printk("Invalid Read operation size: %lu\n", size);
+       ERROR("Invalid Read operation size: %lu\n", size);
        return -EFAULT;
     }
     
     msg = dequeue(cons->queue);
     
     if (msg == NULL) {
-       printk("ERROR: Null console message\n");
+       ERROR("ERROR: Null console message\n");
        return -EFAULT;
     }
     
     if (copy_to_user(buf, msg, size)) {
-       printk("Read Fault\n");
+       ERROR("Read Fault\n");
        return -EFAULT;
     }
 
 
-    kfree(msg);
+    palacios_free(msg);
 
-    spin_lock_irqsave(&(cons->queue->lock), flags);
+    palacios_spinlock_lock_irqsave(&(cons->queue->lock), flags);
     entries =  cons->queue->num_entries;
-    spin_unlock_irqrestore(&(cons->queue->lock), flags);
+    palacios_spinlock_unlock_irqrestore(&(cons->queue->lock), flags);
     
     if (entries > 0) {
        wake_up_interruptible(&(cons->intr_queue));
     }
 
-    //    printk("Read from console\n");
+    //    DEBUG("Read from console\n");
     return size;
 }
 
@@ -140,8 +140,8 @@ console_write(struct file * filp, const char __user * buf, size_t size, loff_t *
 
 
     for (i = 0; i < size; i++) {
-       if (copy_from_user(&(event.scan_code), buf++, 1)) {
-           printk("Console Write fault\n");
+       if (copy_from_user(&(event.scan_code), buf + i, 1)) {
+           ERROR("Console Write fault\n");
            return -EFAULT;
        }
 
@@ -158,17 +158,17 @@ console_poll(struct file * filp, struct poll_table_struct * poll_tb) {
     unsigned long flags;
     int entries = 0;
 
-    //    printk("Console=%p (guest=%s)\n", cons, cons->guest->name);
+    //    DEBUG("Console=%p (guest=%s)\n", cons, cons->guest->name);
 
 
     poll_wait(filp, &(cons->intr_queue), poll_tb);
 
-    spin_lock_irqsave(&(cons->queue->lock), flags);
+    palacios_spinlock_lock_irqsave(&(cons->queue->lock), flags);
     entries = cons->queue->num_entries;
-    spin_unlock_irqrestore(&(cons->queue->lock), flags);
+    palacios_spinlock_unlock_irqrestore(&(cons->queue->lock), flags);
 
     if (entries > 0) {
-       //      printk("Returning from POLL\n");
+       //      DEBUG("Returning from POLL\n");
        return mask;
     }
     
@@ -181,14 +181,14 @@ static int console_release(struct inode * i, struct file * filp) {
     struct cons_msg * msg = NULL;
     unsigned long flags;
 
-    printk("Releasing the Console File desc\n");
+    DEBUG("Releasing the Console File desc\n");
     
-    spin_lock_irqsave(&(cons->queue->lock), flags);
+    palacios_spinlock_lock_irqsave(&(cons->queue->lock), flags);
     cons->connected = 0;
-    spin_unlock_irqrestore(&(cons->queue->lock), flags);
+    palacios_spinlock_unlock_irqrestore(&(cons->queue->lock), flags);
 
     while ((msg = dequeue(cons->queue))) {
-       kfree(msg);
+       palacios_free(msg);
     }
 
     return 0;
@@ -212,33 +212,33 @@ static int console_connect(struct v3_guest * guest, unsigned int cmd,
     int acquired = 0;
 
     if (cons->open == 0) {
-       printk("Attempted to connect to unopened console\n");
+       ERROR("Attempted to connect to unopened console\n");
        return -1;
     }
 
-    spin_lock_irqsave(&(cons->lock), flags);
+    palacios_spinlock_lock_irqsave(&(cons->lock), flags);
     if (cons->connected == 0) {
        cons->connected = 1;
        acquired = 1;
     }
-    spin_unlock_irqrestore(&(cons->lock), flags);
+    palacios_spinlock_unlock_irqrestore(&(cons->lock), flags);
 
     if (acquired == 0) {
-       printk("Console already connected\n");
+       ERROR("Console already connected\n");
        return -1;
     }
 
-    cons_fd = anon_inode_getfd("v3-cons", &cons_fops, cons, 0);
+    cons_fd = anon_inode_getfd("v3-cons", &cons_fops, cons, O_RDWR);
 
     if (cons_fd < 0) {
-       printk("Error creating console inode\n");
+       ERROR("Error creating console inode\n");
        return cons_fd;
     }
 
     v3_deliver_console_event(guest->v3_ctx, NULL);
 
 
-    printk("Console connected\n");
+    INFO("Console connected\n");
 
     return cons_fd;
 }
@@ -247,23 +247,30 @@ static int console_connect(struct v3_guest * guest, unsigned int cmd,
 
 static void * palacios_tty_open(void * private_data, unsigned int width, unsigned int height) {
     struct v3_guest * guest = (struct v3_guest *)private_data;
-    struct palacios_console * cons = kmalloc(sizeof(struct palacios_console), GFP_KERNEL);
+    struct palacios_console * cons = palacios_alloc(sizeof(struct palacios_console));
 
-    printk("Guest initialized virtual console (Guest=%s)\n", guest->name);
+    if (!cons) { 
+       ERROR("Cannot allocate memory for console\n");
+       return NULL;
+    }
+
+    INFO("Guest initialized virtual console (Guest=%s)\n", guest->name);
 
     if (guest == NULL) {
-       printk("ERROR: Cannot open a console on a NULL guest\n");
+       ERROR("ERROR: Cannot open a console on a NULL guest\n");
+       palacios_free(cons);
        return NULL;
     }
 
     if (cons->open == 1) {
-       printk("Console already open\n");
+       ERROR("Console already open\n");
+       palacios_free(cons);
        return NULL;
     }
 
 
     cons->queue = create_queue(CONSOLE_QUEUE_LEN);
-    spin_lock_init(&(cons->lock));
+    palacios_spinlock_init(&(cons->lock));
     init_waitqueue_head(&(cons->intr_queue));
 
     cons->guest = guest;
@@ -280,7 +287,7 @@ static void * palacios_tty_open(void * private_data, unsigned int width, unsigne
 }
 
 static int post_msg(struct palacios_console * cons, struct cons_msg * msg) {
-    //    printk("Posting Console message\n");
+    //    DEBUG("Posting Console message\n");
 
     while (enqueue(cons->queue, msg) == -1) {  
        wake_up_interruptible(&(cons->intr_queue));
@@ -301,7 +308,12 @@ static int palacios_tty_cursor_set(void * console, int x, int y) {
        return 0;
     }
 
-    msg = kmalloc(sizeof(struct cons_msg), GFP_KERNEL);
+    msg = palacios_alloc(sizeof(struct cons_msg));
+
+    if (!msg) { 
+       ERROR("Cannot allocate cursor set message in console\n");
+       return -1;
+    }
 
     msg->op = CONSOLE_CURS_SET;
     msg->cursor.x = x;
@@ -318,7 +330,12 @@ static int palacios_tty_character_set(void * console, int x, int y, char c, unsi
        return 0;
     }
 
-    msg = kmalloc(sizeof(struct cons_msg), GFP_KERNEL);
+    msg = palacios_alloc(sizeof(struct cons_msg));
+
+    if (!msg) { 
+       ERROR("Cannot allocate character set message in console\n");
+       return -1;
+    }
 
     msg->op = CONSOLE_CHAR_SET;
     msg->character.x = x;
@@ -338,7 +355,12 @@ static int palacios_tty_scroll(void * console, int lines) {
        return 0;
     }
 
-    msg = kmalloc(sizeof(struct cons_msg), GFP_KERNEL);
+    msg = palacios_alloc(sizeof(struct cons_msg));
+
+    if (!msg) { 
+       ERROR("Cannot allocate scroll message in console\n");
+       return -1;
+    }
 
     msg->op = CONSOLE_SCROLL;
     msg->scroll.lines = lines;
@@ -354,7 +376,12 @@ static int palacios_set_text_resolution(void * console, int cols, int rows) {
        return 0;
     }
 
-    msg = kmalloc(sizeof(struct cons_msg), GFP_KERNEL);
+    msg = palacios_alloc(sizeof(struct cons_msg));
+
+    if (!msg) { 
+       ERROR("Cannot allocate text resolution message in console\n");
+       return -1;
+    }
     
     msg->op = CONSOLE_RESOLUTION;
     msg->resolution.cols = cols;
@@ -371,7 +398,12 @@ static int palacios_tty_update(void * console) {
        return 0;
     }
 
-    msg = kmalloc(sizeof(struct cons_msg), GFP_KERNEL);
+    msg = palacios_alloc(sizeof(struct cons_msg));
+
+    if (!msg) { 
+       ERROR("Cannot allocate update message in console\n");
+       return -1;
+    }
 
     msg->op = CONSOLE_UPDATE;
 
@@ -382,6 +414,13 @@ static void palacios_tty_close(void * console) {
     struct palacios_console * cons = (struct palacios_console *) console;
 
     cons->open = 0;
+
+    remove_guest_ctrl(cons->guest, V3_VM_CONSOLE_CONNECT);
+    deinit_queue(cons->queue);
+    
+    palacios_spinlock_deinit(&(cons->lock));
+       
+    palacios_free(cons);
 }
 
 
@@ -407,13 +446,18 @@ static int console_init( void ) {
     return 0;
 }
 
+static int console_deinit(void)
+{
+    // nothing to do
+    return 0;
+}
 
 
 
 static struct linux_ext console_ext = {
     .name = "CONSOLE",
     .init = console_init,
-    .deinit = NULL,
+    .deinit = console_deinit,
     .guest_init = NULL,
     .guest_deinit = NULL
 };