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;
}
for (i = 0; i < size; i++) {
if (copy_from_user(&(event.scan_code), buf + i, 1)) {
- printk("Console Write fault\n");
+ ERROR("Console Write fault\n");
return -EFAULT;
}
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;
}
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;
struct palacios_console * cons = priv_data;
int cons_fd = 0;
unsigned long flags;
+ 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;
+ }
+ palacios_spinlock_unlock_irqrestore(&(cons->lock), flags);
+
+ if (acquired == 0) {
+ ERROR("Console already connected\n");
+ return -1;
+ }
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;
}
- cons->connected = 1;
-
v3_deliver_console_event(guest->v3_ctx, NULL);
- spin_unlock_irqrestore(&(cons->lock), flags);
- printk("Console connected\n");
+
+ INFO("Console connected\n");
return cons_fd;
}
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;
}
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));
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
};