#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.
  */
 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.
 
                "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;
 
                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);
        }
 
 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;
                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);