|
@@ -19,6 +19,38 @@
|
|
|
|
|
|
static unsigned long als[] __initdata = { FACILITIES_ALS };
|
|
|
|
|
|
+static void __init u16_to_hex(char *str, u16 val)
|
|
|
+{
|
|
|
+ int i, num;
|
|
|
+
|
|
|
+ for (i = 1; i <= 4; i++) {
|
|
|
+ num = (val >> (16 - 4 * i)) & 0xf;
|
|
|
+ if (num >= 10)
|
|
|
+ num += 7;
|
|
|
+ *str++ = '0' + num;
|
|
|
+ }
|
|
|
+ *str = '\0';
|
|
|
+}
|
|
|
+
|
|
|
+static void __init print_machine_type(void)
|
|
|
+{
|
|
|
+ static char mach_str[80] __initdata = "Detected machine-type number: ";
|
|
|
+ char type_str[5];
|
|
|
+ struct cpuid id;
|
|
|
+
|
|
|
+ get_cpu_id(&id);
|
|
|
+ u16_to_hex(type_str, id.machine);
|
|
|
+ strcat(mach_str, type_str);
|
|
|
+ _sclp_print_early(mach_str);
|
|
|
+}
|
|
|
+
|
|
|
+static void __init facility_mismatch(void)
|
|
|
+{
|
|
|
+ _sclp_print_early("The Linux kernel requires more recent processor hardware");
|
|
|
+ print_machine_type();
|
|
|
+ disabled_wait(0x8badcccc);
|
|
|
+}
|
|
|
+
|
|
|
void __init verify_facilities(void)
|
|
|
{
|
|
|
int i;
|
|
@@ -38,9 +70,7 @@ void __init verify_facilities(void)
|
|
|
: "memory", "cc");
|
|
|
}
|
|
|
for (i = 0; i < ARRAY_SIZE(als); i++) {
|
|
|
- if ((S390_lowcore.stfle_fac_list[i] & als[i]) == als[i])
|
|
|
- continue;
|
|
|
- _sclp_print_early("The Linux kernel requires more recent processor hardware");
|
|
|
- disabled_wait(0x8badcccc);
|
|
|
+ if ((S390_lowcore.stfle_fac_list[i] & als[i]) != als[i])
|
|
|
+ facility_mismatch();
|
|
|
}
|
|
|
}
|