}
- 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));
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");
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;
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");
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;
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;
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;
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;
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;
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;
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);
}
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
};