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.


Cache information interface and implementation for AMD and Intel on Linux
[palacios.git] / linux_module / iface-console.c
index c28fd4c..0f5bd23 100644 (file)
@@ -113,11 +113,11 @@ console_read(struct file * filp, char __user * buf, size_t size, loff_t * offset
     }
 
 
-    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));
@@ -163,9 +163,9 @@ console_poll(struct file * filp, struct poll_table_struct * poll_tb) {
 
     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) {
        //      DEBUG("Returning from POLL\n");
@@ -183,12 +183,12 @@ static int console_release(struct inode * i, struct file * filp) {
 
     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;
@@ -216,12 +216,12 @@ static int console_connect(struct v3_guest * guest, unsigned int cmd,
        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) {
        ERROR("Console already connected\n");
@@ -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));
+
+    if (!cons) { 
+       ERROR("Cannot allocate memory for console\n");
+       return NULL;
+    }
 
     INFO("Guest initialized virtual console (Guest=%s)\n", guest->name);
 
     if (guest == NULL) {
        ERROR("ERROR: Cannot open a console on a NULL guest\n");
+       palacios_free(cons);
        return NULL;
     }
 
     if (cons->open == 1) {
        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;
@@ -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
 };