summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHeiko Carstens <heiko.carstens@de.ibm.com>2016-06-28 14:40:07 +0200
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2016-07-31 05:27:59 -0400
commit06ed5512a26347f7b570295c68d48f0369bdb754 (patch)
tree7e14780c7bd5074a658198652c257c16674f95f8
parentbe2412c247c16c0ea4dd3293e8046e1b383c3bb6 (diff)
downloadlwn-06ed5512a26347f7b570295c68d48f0369bdb754.tar.gz
lwn-06ed5512a26347f7b570295c68d48f0369bdb754.zip
s390/als: print machine type on facility mismatch
If we have a facility mismatch the kernel only emits a warning that the processor is not recent enough and stops operating. This doesn't give us a lot of an idea of what actually went wrong. As a first step print the machine type in addition. Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Reviewed-by: Sascha Silbe <silbe@linux.vnet.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
-rw-r--r--arch/s390/kernel/als.c38
1 files changed, 34 insertions, 4 deletions
diff --git a/arch/s390/kernel/als.c b/arch/s390/kernel/als.c
index f96a577972c4..0eff858c2434 100644
--- a/arch/s390/kernel/als.c
+++ b/arch/s390/kernel/als.c
@@ -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();
}
}