s390/ipl: add REIPL_CLEAR flag to os_info
authorMikhail Zaslonko <zaslonko@linux.ibm.com>
Thu, 30 Mar 2023 07:18:01 +0000 (09:18 +0200)
committerAlexander Gordeev <agordeev@linux.ibm.com>
Thu, 1 Jun 2023 15:07:56 +0000 (17:07 +0200)
Introduce new OS_INFO_FLAGS_ENTRY to os_info pointing to the field
with bit flags.
Add OS_INFO_FLAGS_ENTRY upon dump_reipl shutdown action processing and
set OS_INFO_FLAG_REIPL_CLEAR flag indicating 'clear' sysfs attribute has
been set on the panicked system for specified ipl type. This flag can be
used to inform the dumper whether LOAD_CLEAR or LOAD_NORMAL diag308
subcode to be used for ipl after dumping the memory.

Signed-off-by: Mikhail Zaslonko <zaslonko@linux.ibm.com>
Acked-by: Alexander Gordeev <agordeev@linux.ibm.com>
Reviewed-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
arch/s390/include/asm/os_info.h
arch/s390/kernel/ipl.c

index 0d1c74a7a65044f86b7dcff62a7aab17a5064b48..a4d2e103f1161b93d4d183918de5d19697d60f94 100644 (file)
@@ -16,6 +16,9 @@
 
 #define OS_INFO_VMCOREINFO     0
 #define OS_INFO_REIPL_BLOCK    1
+#define OS_INFO_FLAGS_ENTRY    2
+
+#define OS_INFO_FLAG_REIPL_CLEAR       (1UL << 0)
 
 struct os_info_entry {
        u64     addr;
@@ -30,8 +33,8 @@ struct os_info {
        u16     version_minor;
        u64     crashkernel_addr;
        u64     crashkernel_size;
-       struct os_info_entry entry[2];
-       u8      reserved[4024];
+       struct os_info_entry entry[3];
+       u8      reserved[4004];
 } __packed;
 
 void os_info_init(void);
index 43de939b7af199757646a3ea82347897f6dd9980..d57b02fdd329dda95f6cc367c75069883f080250 100644 (file)
@@ -176,6 +176,8 @@ static bool reipl_fcp_clear;
 static bool reipl_ccw_clear;
 static bool reipl_eckd_clear;
 
+static unsigned long os_info_flags;
+
 static inline int __diag308(unsigned long subcode, unsigned long addr)
 {
        union register_pair r1;
@@ -1939,6 +1941,20 @@ static void dump_reipl_run(struct shutdown_trigger *trigger)
        struct lowcore *abs_lc;
        unsigned int csum;
 
+       /*
+        * Set REIPL_CLEAR flag in os_info flags entry indicating
+        * 'clear' sysfs attribute has been set on the panicked system
+        * for specified reipl type.
+        * Always set for IPL_TYPE_NSS and IPL_TYPE_UNKNOWN.
+        */
+       if ((reipl_type == IPL_TYPE_CCW && reipl_ccw_clear) ||
+           (reipl_type == IPL_TYPE_ECKD && reipl_eckd_clear) ||
+           (reipl_type == IPL_TYPE_FCP && reipl_fcp_clear) ||
+           (reipl_type == IPL_TYPE_NVME && reipl_nvme_clear) ||
+           reipl_type == IPL_TYPE_NSS ||
+           reipl_type == IPL_TYPE_UNKNOWN)
+               os_info_flags |= OS_INFO_FLAG_REIPL_CLEAR;
+       os_info_entry_add(OS_INFO_FLAGS_ENTRY, &os_info_flags, sizeof(os_info_flags));
        csum = (__force unsigned int)
               csum_partial(reipl_block_actual, reipl_block_actual->hdr.len, 0);
        abs_lc = get_abs_lowcore();