Commit e8330d9b authored by Rusty Russell's avatar Rusty Russell

lguest: support emerg_wr in console device in example launcher.

This is a magic register which causes a character to be outputted: it can
be used even before the device is configured.
Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
parent b3e28b65
...@@ -71,7 +71,7 @@ typedef uint8_t u8; ...@@ -71,7 +71,7 @@ typedef uint8_t u8;
#include "../../include/uapi/linux/virtio_config.h" #include "../../include/uapi/linux/virtio_config.h"
#include "../../include/uapi/linux/virtio_net.h" #include "../../include/uapi/linux/virtio_net.h"
#include "../../include/uapi/linux/virtio_blk.h" #include "../../include/uapi/linux/virtio_blk.h"
#include <linux/virtio_console.h> #include "../../include/uapi/linux/virtio_console.h"
#include "../../include/uapi/linux/virtio_rng.h" #include "../../include/uapi/linux/virtio_rng.h"
#include <linux/virtio_ring.h> #include <linux/virtio_ring.h>
#include "../../include/uapi/linux/virtio_pci.h" #include "../../include/uapi/linux/virtio_pci.h"
...@@ -1687,6 +1687,15 @@ static void emulate_mmio_write(struct device *d, u32 off, u32 val, u32 mask) ...@@ -1687,6 +1687,15 @@ static void emulate_mmio_write(struct device *d, u32 off, u32 val, u32 mask)
goto write_through16; goto write_through16;
case offsetof(struct virtio_pci_mmio, isr): case offsetof(struct virtio_pci_mmio, isr):
errx(1, "%s: Unexpected write to isr", d->name); errx(1, "%s: Unexpected write to isr", d->name);
/* Weird corner case: write to emerg_wr of console */
case sizeof(struct virtio_pci_mmio)
+ offsetof(struct virtio_console_config, emerg_wr):
if (strcmp(d->name, "console") == 0) {
char c = val;
write(STDOUT_FILENO, &c, 1);
goto write_through32;
}
/* Fall through... */
default: default:
errx(1, "%s: Unexpected write to offset %u", d->name, off); errx(1, "%s: Unexpected write to offset %u", d->name, off);
} }
...@@ -2048,6 +2057,7 @@ static struct device *new_pci_device(const char *name, u16 type, ...@@ -2048,6 +2057,7 @@ static struct device *new_pci_device(const char *name, u16 type,
static void setup_console(void) static void setup_console(void)
{ {
struct device *dev; struct device *dev;
struct virtio_console_config conf;
/* If we can save the initial standard input settings... */ /* If we can save the initial standard input settings... */
if (tcgetattr(STDIN_FILENO, &orig_term) == 0) { if (tcgetattr(STDIN_FILENO, &orig_term) == 0) {
...@@ -2075,8 +2085,9 @@ static void setup_console(void) ...@@ -2075,8 +2085,9 @@ static void setup_console(void)
add_pci_virtqueue(dev, console_input); add_pci_virtqueue(dev, console_input);
add_pci_virtqueue(dev, console_output); add_pci_virtqueue(dev, console_output);
/* There's no configuration area for this device. */ /* We need a configuration area for the emerg_wr early writes. */
no_device_config(dev); add_pci_feature(dev, VIRTIO_CONSOLE_F_EMERG_WRITE);
set_device_config(dev, &conf, sizeof(conf));
verbose("device %u: console\n", devices.device_num); verbose("device %u: console\n", devices.device_num);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment