Commit 31e9ccc6 authored by Mikhail Zaslonko's avatar Mikhail Zaslonko Committed by Alexander Gordeev
Browse files

s390/ipl: add REIPL_CLEAR flag to os_info



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: default avatarMikhail Zaslonko <zaslonko@linux.ibm.com>
Acked-by: default avatarAlexander Gordeev <agordeev@linux.ibm.com>
Reviewed-by: default avatarHeiko Carstens <hca@linux.ibm.com>
Signed-off-by: default avatarAlexander Gordeev <agordeev@linux.ibm.com>
parent d933e5f4
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -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);
+16 −0
Original line number Diff line number Diff line
@@ -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();