Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 197873
b: refs/heads/master
c: 9778829
h: refs/heads/master
i:
  197871: 98aca2d
v: v3
  • Loading branch information
Amit Shah authored and Rusty Russell committed May 19, 2010
1 parent c2e0461 commit 5b12759
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 13 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 4038f5b767a610c5a5d92d7047755c663ead1568
refs/heads/master: 9778829cffd4d8d68c7e457645f958a82d4c4d8b
43 changes: 31 additions & 12 deletions trunk/drivers/char/virtio_console.c
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,9 @@ struct console {
/* The hvc device associated with this console port */
struct hvc_struct *hvc;

/* The size of the console */
struct winsize ws;

/*
* This number identifies the number that we used to register
* with hvc in hvc_instantiate() and hvc_alloc(); this is the
Expand Down Expand Up @@ -773,22 +776,14 @@ static int get_chars(u32 vtermno, char *buf, int count)
static void resize_console(struct port *port)
{
struct virtio_device *vdev;
struct winsize ws;

/* The port could have been hot-unplugged */
if (!port)
if (!port || !is_console_port(port))
return;

vdev = port->portdev->vdev;
if (virtio_has_feature(vdev, VIRTIO_CONSOLE_F_SIZE)) {
vdev->config->get(vdev,
offsetof(struct virtio_console_config, cols),
&ws.ws_col, sizeof(u16));
vdev->config->get(vdev,
offsetof(struct virtio_console_config, rows),
&ws.ws_row, sizeof(u16));
hvc_resize(port->cons.hvc, ws);
}
if (virtio_has_feature(vdev, VIRTIO_CONSOLE_F_SIZE))
hvc_resize(port->cons.hvc, port->cons.ws);
}

/* We set the configuration at this point, since we now have a tty */
Expand Down Expand Up @@ -952,6 +947,15 @@ static const struct file_operations port_debugfs_ops = {
.read = debugfs_read,
};

static void set_console_size(struct port *port, u16 rows, u16 cols)
{
if (!port || !is_console_port(port))
return;

port->cons.ws.ws_row = rows;
port->cons.ws.ws_col = cols;
}

static unsigned int fill_queue(struct virtqueue *vq, spinlock_t *lock)
{
struct port_buffer *buf;
Expand Down Expand Up @@ -1000,6 +1004,8 @@ static int add_port(struct ports_device *portdev, u32 id)
port->inbuf = NULL;
port->cons.hvc = NULL;

port->cons.ws.ws_row = port->cons.ws.ws_col = 0;

port->host_connected = port->guest_connected = false;

port->outvq_full = false;
Expand Down Expand Up @@ -1320,14 +1326,27 @@ static void config_intr(struct virtio_device *vdev)
portdev = vdev->priv;

if (!use_multiport(portdev)) {
struct port *port;
u16 rows, cols;

vdev->config->get(vdev,
offsetof(struct virtio_console_config, cols),
&cols, sizeof(u16));
vdev->config->get(vdev,
offsetof(struct virtio_console_config, rows),
&rows, sizeof(u16));

port = find_port_by_id(portdev, 0);
set_console_size(port, rows, cols);

/*
* We'll use this way of resizing only for legacy
* support. For newer userspace
* (VIRTIO_CONSOLE_F_MULTPORT+), use control messages
* to indicate console size changes so that it can be
* done per-port.
*/
resize_console(find_port_by_id(portdev, 0));
resize_console(port);
}
}

Expand Down

0 comments on commit 5b12759

Please sign in to comment.