s390/dump_stack: use control program identification string
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Sat, 11 Mar 2017 11:22:11 +0000 (12:22 +0100)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Wed, 22 Mar 2017 07:29:11 +0000 (08:29 +0100)
If running within a level 3 hypervisor, the hypervisor provides a
SYSIB block which contains a control program indentifier string. Use
this string instead of the simple KVM and z/VM strings only. In case
of z/VM this provides addtional information: the z/VM version.

The new string looks similar to this:

Hardware name: IBM 2964 N96 702 (z/VM 6.4.0)

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/kernel/early.c

index 914f273b1983d6843734cd7c826aed51b79f372b..251391e3f8bcdac08f6ba359928e1d945125baf6 100644 (file)
@@ -252,7 +252,8 @@ static inline void strim_all(char *str)
 static noinline __init void setup_arch_string(void)
 {
        struct sysinfo_1_1_1 *mach = (struct sysinfo_1_1_1 *)&sysinfo_page;
-       char mstr[80];
+       struct sysinfo_3_2_2 *vm = (struct sysinfo_3_2_2 *)&sysinfo_page;
+       char mstr[80], hvstr[17];
 
        if (stsi(mach, 1, 1, 1))
                return;
@@ -264,10 +265,17 @@ static noinline __init void setup_arch_string(void)
                mach->manufacturer, mach->type,
                mach->model, mach->model_capacity);
        strim_all(mstr);
-       dump_stack_set_arch_desc("%s (%s)", mstr,
-                                MACHINE_IS_LPAR ? "LPAR" :
-                                MACHINE_IS_VM ? "z/VM" :
-                                MACHINE_IS_KVM ? "KVM" : "unknown");
+       if (stsi(vm, 3, 2, 2) == 0 && vm->count) {
+               EBCASC(vm->vm[0].cpi, sizeof(vm->vm[0].cpi));
+               sprintf(hvstr, "%-16.16s", vm->vm[0].cpi);
+               strim_all(hvstr);
+       } else {
+               sprintf(hvstr, "%s",
+                       MACHINE_IS_LPAR ? "LPAR" :
+                       MACHINE_IS_VM ? "z/VM" :
+                       MACHINE_IS_KVM ? "KVM" : "unknown");
+       }
+       dump_stack_set_arch_desc("%s (%s)", mstr, hvstr);
 }
 
 static __init void setup_topology(void)