s390: show virtualization support in /proc/cpuinfo
authorDavid Hildenbrand <dahi@linux.vnet.ibm.com>
Tue, 24 Feb 2015 14:54:47 +0000 (15:54 +0100)
committerChristian Borntraeger <borntraeger@de.ibm.com>
Mon, 30 Nov 2015 11:47:11 +0000 (12:47 +0100)
This patch exposes the SIE capability (aka virtualization support) via
/proc/cpuinfo -> "features" as "sie".

As we don't want to expose this hwcap via elf, let's add a second,
"internal"/non-elf capability list. The content is simply concatenated
to the existing features when printing /proc/cpuinfo.

We also add the defines to elf.h to keep the hwcap stuff at a common
place.

Acked-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
arch/s390/include/asm/elf.h
arch/s390/kernel/processor.c
arch/s390/kernel/setup.c

index bab6739a1154e1fd9827ff8dfb5c152ef52f3930..08e34a5dc909a82025094eda1f0261abceec18ba 100644 (file)
 #define HWCAP_S390_TE          1024
 #define HWCAP_S390_VXRS                2048
 
+/* Internal bits, not exposed via elf */
+#define HWCAP_INT_SIE          1UL
+
 /*
  * These are used to set parameters in the core dumps.
  */
@@ -169,6 +172,10 @@ extern unsigned int vdso_enabled;
 extern unsigned long elf_hwcap;
 #define ELF_HWCAP (elf_hwcap)
 
+/* Internal hardware capabilities, not exposed via elf */
+
+extern unsigned long int_hwcap;
+
 /* This yields a string that ld.so will use to load implementation
    specific libraries for optimization.  This is more specific in
    intent than poking at uname or /proc/cpuinfo.
index 7ce00e7a709a946058b4bdeaadecba16f969d326..647128d5b9839bad0d939493908c0d83780a7c45 100644 (file)
@@ -61,6 +61,9 @@ static int show_cpuinfo(struct seq_file *m, void *v)
                "esan3", "zarch", "stfle", "msa", "ldisp", "eimm", "dfp",
                "edat", "etf3eh", "highgprs", "te", "vx"
        };
+       static const char * const int_hwcap_str[] = {
+               "sie"
+       };
        unsigned long n = (unsigned long) v - 1;
        int i;
 
@@ -75,6 +78,9 @@ static int show_cpuinfo(struct seq_file *m, void *v)
                for (i = 0; i < ARRAY_SIZE(hwcap_str); i++)
                        if (hwcap_str[i] && (elf_hwcap & (1UL << i)))
                                seq_printf(m, "%s ", hwcap_str[i]);
+               for (i = 0; i < ARRAY_SIZE(int_hwcap_str); i++)
+                       if (int_hwcap_str[i] && (int_hwcap & (1UL << i)))
+                               seq_printf(m, "%s ", int_hwcap_str[i]);
                seq_puts(m, "\n");
                show_cacheinfo(m);
        }
index c837bcacf2188460a50754f3a75d1b485c25f671..dc83ae66a730983fe0ef6206e501b0571e2ef5c2 100644 (file)
@@ -80,6 +80,8 @@ EXPORT_SYMBOL(console_irq);
 unsigned long elf_hwcap __read_mostly = 0;
 char elf_platform[ELF_PLATFORM_SIZE];
 
+unsigned long int_hwcap = 0;
+
 int __initdata memory_end_set;
 unsigned long __initdata memory_end;
 unsigned long __initdata max_physmem_end;
@@ -793,6 +795,13 @@ static int __init setup_hwcaps(void)
                strcpy(elf_platform, "z13");
                break;
        }
+
+       /*
+        * Virtualization support HWCAP_INT_SIE is bit 0.
+        */
+       if (sclp.has_sief2)
+               int_hwcap |= HWCAP_INT_SIE;
+
        return 0;
 }
 arch_initcall(setup_hwcaps);