Patchwork [v4,07/07] s390: make sclp ascii console the default

login
register
mail settings
Submitter Christian Borntraeger
Date July 26, 2012, 8:59 a.m.
Message ID <1343293186-18372-1-git-send-email-borntraeger@de.ibm.com>
Download mbox | patch
Permalink /patch/173377/
State New
Headers show

Comments

Christian Borntraeger - July 26, 2012, 8:59 a.m.
This patch makes the sclp ascii default for S390. It requires a guest
kernel that autodetects the console and which not blindly assumes
that kvm means virtio console.
(commit cd1834591fe9564720ac4b0193bf1c790fe89f0d
    KVM: s390: Perform early event mask processing during boot)
Otherwise the guest admin has to explicitely add console=ttyS1 to the
command line.

Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
---
 hw/s390-virtio.c |    1 -
 vl.c             |   48 ++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 48 insertions(+), 1 deletions(-)
Alexander Graf - July 30, 2012, 2:05 p.m.
On 26.07.2012, at 10:59, Christian Borntraeger wrote:

> This patch makes the sclp ascii default for S390. It requires a guest
> kernel that autodetects the console and which not blindly assumes
> that kvm means virtio console.
> (commit cd1834591fe9564720ac4b0193bf1c790fe89f0d
>    KVM: s390: Perform early event mask processing during boot)
> Otherwise the guest admin has to explicitely add console=ttyS1 to the
> command line.

Hrm. Could we make this the non-default for the time being with a simple -machine option to switch it to the default? When enough kernels are aware of the switch, we could then make it the default.

The best case would be if we could determine what type of kernel (default to virtio-console vs runtime detect) we run before we spawn the VM, so we could spawn it with the respective default and keep all kernels working...


Alex
Christian Borntraeger - July 31, 2012, 12:44 p.m.
On 30/07/12 16:05, Alexander Graf wrote:
> 
> On 26.07.2012, at 10:59, Christian Borntraeger wrote:
> 
>> This patch makes the sclp ascii default for S390. It requires a guest
>> kernel that autodetects the console and which not blindly assumes
>> that kvm means virtio console.
>> (commit cd1834591fe9564720ac4b0193bf1c790fe89f0d
>>    KVM: s390: Perform early event mask processing during boot)
>> Otherwise the guest admin has to explicitely add console=ttyS1 to the
>> command line.
> 
> Hrm. Could we make this the non-default for the time being with a simple -machine option to switch it to the default? When enough kernels are aware of the switch, we could then make it the default.

No problem, we can defer that patch. It was merely a testing aid for those who want to test the
sclp code. Later on maybe we can make that decision based on other thing.
Alexander Graf - July 31, 2012, 12:52 p.m.
On 07/31/2012 02:44 PM, Christian Borntraeger wrote:
> On 30/07/12 16:05, Alexander Graf wrote:
>> On 26.07.2012, at 10:59, Christian Borntraeger wrote:
>>
>>> This patch makes the sclp ascii default for S390. It requires a guest
>>> kernel that autodetects the console and which not blindly assumes
>>> that kvm means virtio console.
>>> (commit cd1834591fe9564720ac4b0193bf1c790fe89f0d
>>>     KVM: s390: Perform early event mask processing during boot)
>>> Otherwise the guest admin has to explicitely add console=ttyS1 to the
>>> command line.
>> Hrm. Could we make this the non-default for the time being with a simple -machine option to switch it to the default? When enough kernels are aware of the switch, we could then make it the default.
> No problem, we can defer that patch. It was merely a testing aid for those who want to test the
> sclp code. Later on maybe we can make that decision based on other thing.

Well, I'd like to have the logic around and easy to choose. Basically 
what I envision is that one day we do a flag day that introduces a 
compatibility machine type which only differs from the current one in 
that it sets said machine opt to "use ascii console as default".

That way for the time being, people who want to play with it only need 
to do -machine ascii_console=on and everything else would happen 
automatically. It'd definitely make it easier for everyone involved.


Alex

Patch

diff --git a/hw/s390-virtio.c b/hw/s390-virtio.c
index 28e320d..8b48f66 100644
--- a/hw/s390-virtio.c
+++ b/hw/s390-virtio.c
@@ -341,7 +341,6 @@  static QEMUMachine s390_machine = {
     .no_serial = 1,
     .no_parallel = 1,
     .no_sdcard = 1,
-    .use_virtcon = 1,
     .max_cpus = 255,
     .is_default = 1,
 };
diff --git a/vl.c b/vl.c
index 46248b9..30fd506 100644
--- a/vl.c
+++ b/vl.c
@@ -168,6 +168,7 @@  int main(int argc, char **argv)
 #define DEFAULT_RAM_SIZE 128
 
 #define MAX_VIRTIO_CONSOLES 1
+#define MAX_SCLP_CONSOLES   1
 
 static const char *data_dir;
 const char *bios_name = NULL;
@@ -195,6 +196,7 @@  int no_quit = 0;
 CharDriverState *serial_hds[MAX_SERIAL_PORTS];
 CharDriverState *parallel_hds[MAX_PARALLEL_PORTS];
 CharDriverState *virtcon_hds[MAX_VIRTIO_CONSOLES];
+CharDriverState *sclpcon_hds[MAX_SCLP_CONSOLES];
 int win2k_install_hack = 0;
 int usb_enabled = 0;
 int singlestep = 0;
@@ -268,6 +270,7 @@  static int default_floppy = 1;
 static int default_cdrom = 1;
 static int default_sdcard = 1;
 static int default_vga = 1;
+static int default_sclpcon = 1;
 
 static struct {
     const char *driver;
@@ -289,6 +292,7 @@  static struct {
     { .driver = "isa-cirrus-vga",       .flag = &default_vga       },
     { .driver = "vmware-svga",          .flag = &default_vga       },
     { .driver = "qxl-vga",              .flag = &default_vga       },
+    { .driver = "sclpconsole",          .flag = &default_sclpcon   },
 };
 
 static void res_free(void)
@@ -1935,6 +1939,7 @@  struct device_config {
         DEV_VIRTCON,   /* -virtioconsole */
         DEV_DEBUGCON,  /* -debugcon */
         DEV_GDB,       /* -gdb, -s */
+        DEV_SCLPCON,   /* sclp console */
     } type;
     const char *cmdline;
     Location loc;
@@ -2014,6 +2019,37 @@  static int parallel_parse(const char *devname)
     return 0;
 }
 
+static int sclpcon_parse(const char *devname)
+{
+    QemuOptsList *device = qemu_find_opts("device");
+    static int index;
+    char label[32];
+    QemuOpts *dev_opts;
+
+    if (strcmp(devname, "none") == 0) {
+        return 0;
+    }
+    if (index == MAX_SCLP_CONSOLES) {
+        fprintf(stderr, "qemu: only one sclpconsole may be specified\n");
+        exit(1);
+    }
+
+    dev_opts = qemu_opts_create(device, NULL, 0, NULL);
+    qemu_opt_set(dev_opts, "driver", "sclpconsole");
+
+    snprintf(label, sizeof(label), "sclpcon%d", index);
+    sclpcon_hds[index] = qemu_chr_new(label, devname, NULL);
+    if (!sclpcon_hds[index]) {
+        fprintf(stderr, "qemu: could not open sclp console '%s': %s\n",
+                devname, strerror(errno));
+        return -1;
+    }
+    qemu_opt_set(dev_opts, "chardev", label);
+
+    index++;
+    return 0;
+}
+
 static int virtcon_parse(const char *devname)
 {
     QemuOptsList *device = qemu_find_opts("device");
@@ -3122,6 +3158,7 @@  int main(int argc, char **argv, char **envp)
                 default_cdrom = 0;
                 default_sdcard = 0;
                 default_vga = 0;
+                default_sclpcon = 0;
                 break;
             case QEMU_OPTION_xen_domid:
                 if (!(xen_available())) {
@@ -3303,11 +3340,16 @@  int main(int argc, char **argv, char **envp)
             add_device_config(DEV_PARALLEL, "null");
         if (default_serial && default_monitor) {
             add_device_config(DEV_SERIAL, "mon:stdio");
+        } else if (default_sclpcon && default_monitor) {
+            add_device_config(DEV_SCLPCON, "mon:stdio");
         } else if (default_virtcon && default_monitor) {
             add_device_config(DEV_VIRTCON, "mon:stdio");
         } else {
             if (default_serial)
                 add_device_config(DEV_SERIAL, "stdio");
+            if (default_sclpcon) {
+                add_device_config(DEV_SCLPCON, "stdio");
+            }
             if (default_virtcon)
                 add_device_config(DEV_VIRTCON, "stdio");
             if (default_monitor)
@@ -3320,6 +3362,9 @@  int main(int argc, char **argv, char **envp)
             add_device_config(DEV_PARALLEL, "vc:80Cx24C");
         if (default_monitor)
             monitor_parse("vc:80Cx24C", "readline");
+        if (default_sclpcon) {
+            add_device_config(DEV_SCLPCON, "vc:80Cx24C");
+        }
         if (default_virtcon)
             add_device_config(DEV_VIRTCON, "vc:80Cx24C");
     }
@@ -3490,6 +3535,9 @@  int main(int argc, char **argv, char **envp)
         exit(1);
     if (foreach_device_config(DEV_PARALLEL, parallel_parse) < 0)
         exit(1);
+    if (foreach_device_config(DEV_SCLPCON, sclpcon_parse) < 0) {
+        exit(1);
+    }
     if (foreach_device_config(DEV_VIRTCON, virtcon_parse) < 0)
         exit(1);
     if (foreach_device_config(DEV_DEBUGCON, debugcon_parse) < 0)