s390: warn about clearing als implied facilities
authorVasily Gorbik <gor@linux.ibm.com>
Wed, 27 Feb 2019 16:36:35 +0000 (17:36 +0100)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Fri, 1 Mar 2019 07:00:42 +0000 (08:00 +0100)
Add a warning about removing required architecture level set facilities
via "facilities=" command line option.

Reviewed-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/boot/als.c
arch/s390/boot/boot.h
arch/s390/boot/ipl_parm.c

index 322e386..f902215 100644 (file)
@@ -7,6 +7,7 @@
 #include <asm/facility.h>
 #include <asm/lowcore.h>
 #include <asm/sclp.h>
+#include "boot.h"
 
 /*
  * The code within this file will be called very early. It may _not_
@@ -58,7 +59,7 @@ static void u16_to_decimal(char *str, u16 val)
        *str = '\0';
 }
 
-static void print_missing_facilities(void)
+void print_missing_facilities(void)
 {
        static char als_str[80] = "Missing facilities: ";
        unsigned long val;
@@ -90,7 +91,6 @@ static void print_missing_facilities(void)
        }
        strcat(als_str, "\n");
        sclp_early_printk(als_str);
-       sclp_early_printk("See Principles of Operations for facility bits\n");
 }
 
 static void facility_mismatch(void)
@@ -98,6 +98,7 @@ static void facility_mismatch(void)
        sclp_early_printk("The Linux kernel requires more recent processor hardware\n");
        print_machine_type();
        print_missing_facilities();
+       sclp_early_printk("See Principles of Operations for facility bits\n");
        disabled_wait(0x8badcccc);
 }
 
index 8665497..82bc063 100644 (file)
@@ -8,5 +8,6 @@ void store_ipl_parmblock(void);
 void setup_boot_command_line(void);
 void parse_boot_command_line(void);
 void setup_memory_end(void);
+void print_missing_facilities(void);
 
 #endif /* BOOT_BOOT_H */
index 94e5374..36beb56 100644 (file)
@@ -1,4 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
+#include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/ctype.h>
 #include <asm/ebcdic.h>
@@ -152,6 +153,20 @@ static void modify_facility(unsigned long nr, bool clear)
                __set_facility(nr, S390_lowcore.stfle_fac_list);
 }
 
+static void check_cleared_facilities(void)
+{
+       unsigned long als[] = { FACILITIES_ALS };
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(als); i++) {
+               if ((S390_lowcore.stfle_fac_list[i] & als[i]) != als[i]) {
+                       sclp_early_printk("Warning: The Linux kernel requires facilities cleared via command line option\n");
+                       print_missing_facilities();
+                       break;
+               }
+       }
+}
+
 static void modify_fac_list(char *str)
 {
        unsigned long val, endval;
@@ -185,6 +200,7 @@ static void modify_fac_list(char *str)
                        break;
                str++;
        }
+       check_cleared_facilities();
 }
 
 static char command_line_buf[COMMAND_LINE_SIZE] __section(.data);