Blame SOURCES/github_5cbb2fd8_to_6c1c8ac6.patch

ada8de
commit 5cbb2fd8c20c46793095522059b1efc8232df926
ada8de
Author: Dave Anderson <anderson@redhat.com>
ada8de
Date:   Wed Nov 13 11:29:14 2019 -0500
ada8de
ada8de
    Add support for handling openSUSE vmlinux files which will be shipped
ada8de
    in .xz compressed format.  Without the patch, only gzip and bzip2
ada8de
    formats are supported.
ada8de
    (jirislaby@gmail.com)
ada8de
ada8de
diff --git a/symbols.c b/symbols.c
ada8de
index 55199fc..7e1bca7 100644
ada8de
--- a/symbols.c
ada8de
+++ b/symbols.c
ada8de
@@ -3655,6 +3655,7 @@ is_compressed_kernel(char *file, char **tmp)
ada8de
 
ada8de
 #define GZIP  (1)
ada8de
 #define BZIP2 (2)
ada8de
+#define XZ    (3)
ada8de
 
ada8de
 #define FNAME (1 << 3)
ada8de
 
ada8de
@@ -3704,6 +3705,19 @@ is_compressed_kernel(char *file, char **tmp)
ada8de
 		type = BZIP2;
ada8de
 	}
ada8de
 
ada8de
+	if (!memcmp(header, "\xfd""7zXZ", 6)) {
ada8de
+		if (!STRNEQ(basename(file), "vmlinux") &&
ada8de
+		    !(st->flags & FORCE_DEBUGINFO)) {
ada8de
+			error(INFO, "%s: compressed file name does not start "
ada8de
+			    "with \"vmlinux\"\n", file);
ada8de
+			error(CONT, 
ada8de
+			    "Use \"-f %s\" on command line to override.\n\n",
ada8de
+				file);
ada8de
+			return FALSE;
ada8de
+		}
ada8de
+		type = XZ;
ada8de
+	}
ada8de
+
ada8de
 	if (!type)
ada8de
 		return FALSE;
ada8de
 
ada8de
@@ -3739,6 +3753,12 @@ is_compressed_kernel(char *file, char **tmp)
ada8de
 			"/bin/bunzip2" : "/usr/bin/bunzip2",
ada8de
 			file, tempname);
ada8de
 		break;
ada8de
+	case XZ:
ada8de
+		sprintf(command, "%s -c %s > %s", 
ada8de
+			file_exists("/bin/unxz", NULL) ?
ada8de
+			"/bin/unxz" : "/usr/bin/unxz",
ada8de
+			file, tempname);
ada8de
+		break;
ada8de
 	}
ada8de
 	if (system(command) < 0) {
ada8de
 		please_wait_done();
ada8de
ada8de
commit babd7ae62d4e8fd6f93fd30b88040d9376522aa3
ada8de
Author: Dave Anderson <anderson@redhat.com>
ada8de
Date:   Fri Nov 15 09:55:34 2019 -0500
ada8de
ada8de
    Fix for the determination of the ARM64 page size on Linux 4.4 and
ada8de
    earlier kernels that do not have vmcoreinfo data.  Without the patch,
ada8de
    the crash session fails during initialization with the error message
ada8de
    "crash: "cannot determine page size".
ada8de
    (chenqiwu@xiaomi.com)
ada8de
ada8de
diff --git a/arm64.c b/arm64.c
ada8de
index 5ee5f1a..af7147d 100644
ada8de
--- a/arm64.c
ada8de
+++ b/arm64.c
ada8de
@@ -179,17 +179,16 @@ arm64_init(int when)
ada8de
 
ada8de
 		}
ada8de
 
ada8de
+		/*
ada8de
+		 * This code section will only be executed if the kernel is
ada8de
+		 * earlier than Linux 4.4 (if there is no vmcoreinfo)
ada8de
+		 */
ada8de
 		if (!machdep->pagesize &&
ada8de
 		    kernel_symbol_exists("swapper_pg_dir") &&
ada8de
 		    kernel_symbol_exists("idmap_pg_dir")) {
ada8de
-			if (kernel_symbol_exists("tramp_pg_dir"))
ada8de
-				value = symbol_value("tramp_pg_dir");
ada8de
-			else if (kernel_symbol_exists("reserved_ttbr0"))
ada8de
-				value = symbol_value("reserved_ttbr0");
ada8de
-			else
ada8de
-				value = symbol_value("swapper_pg_dir");
ada8de
+			value = symbol_value("swapper_pg_dir") -
ada8de
+				symbol_value("idmap_pg_dir");
ada8de
 
ada8de
-			value -= symbol_value("idmap_pg_dir");
ada8de
 			/*
ada8de
 			 * idmap_pg_dir is 2 pages prior to 4.1,
ada8de
 			 * and 3 pages thereafter.  Only 4K and 64K 
ada8de
ada8de
commit bfd9a651f9426d86250295ac875d7e33d8de2a97
ada8de
Author: Dave Anderson <anderson@redhat.com>
ada8de
Date:   Tue Nov 19 10:19:55 2019 -0500
ada8de
ada8de
    Determine the ARM64 kernel's "vabits_actual" value by reading the
ada8de
    new TCR_EL1.T1SZ vmcoreinfo entry.
ada8de
    (bhsharma@redhat.com)
ada8de
ada8de
diff --git a/arm64.c b/arm64.c
ada8de
index af7147d..0834913 100644
ada8de
--- a/arm64.c
ada8de
+++ b/arm64.c
ada8de
@@ -3856,8 +3856,17 @@ arm64_calc_VA_BITS(void)
ada8de
 		} else if (ACTIVE())
ada8de
 			error(FATAL, "cannot determine VA_BITS_ACTUAL: please use /proc/kcore\n");
ada8de
 		else {
ada8de
-			if ((string = pc->read_vmcoreinfo("NUMBER(VA_BITS_ACTUAL)"))) {
ada8de
-				value = atol(string);
ada8de
+			if ((string = pc->read_vmcoreinfo("NUMBER(tcr_el1_t1sz)"))) {
ada8de
+				/* See ARMv8 ARM for the description of
ada8de
+				 * TCR_EL1.T1SZ and how it can be used
ada8de
+				 * to calculate the vabits_actual
ada8de
+				 * supported by underlying kernel.
ada8de
+				 *
ada8de
+				 * Basically:
ada8de
+				 * vabits_actual = 64 - T1SZ;
ada8de
+				 */
ada8de
+				value = 64 - strtoll(string, NULL, 0);
ada8de
+				fprintf(fp,  "vmcoreinfo : vabits_actual: %ld\n", value);
ada8de
 				free(string);
ada8de
 				machdep->machspec->VA_BITS_ACTUAL = value;
ada8de
 				machdep->machspec->VA_BITS = value;
ada8de
ada8de
commit f1c71de4ef66508108c5929e79e21a85b147787b
ada8de
Author: Dave Anderson <anderson@redhat.com>
ada8de
Date:   Wed Nov 20 11:59:00 2019 -0500
ada8de
ada8de
    Fix to determine the ARM64 kernel's "vabits_actual" value from the
ada8de
    ELF header of a dumpfile created with the "snap.so" extension module.
ada8de
    (anderson@redhat.com)
ada8de
ada8de
diff --git a/netdump.c b/netdump.c
ada8de
index 3ced87c..406416a 100644
ada8de
--- a/netdump.c
ada8de
+++ b/netdump.c
ada8de
@@ -1887,7 +1887,7 @@ vmcoreinfo_read_string(const char *key)
ada8de
 			sprintf(value, "%ld", nd->arch_data2 & 0xffffffff);
ada8de
 			return value;
ada8de
 		}
ada8de
-		if (STREQ(key, "NUMBER(VA_BITS_ACTUAL)") && nd->arch_data2) {
ada8de
+		if (STREQ(key, "NUMBER(tcr_el1_t1sz)") && nd->arch_data2) {
ada8de
 			value = calloc(VADDR_PRLEN+1, sizeof(char));
ada8de
 			sprintf(value, "%lld", ((ulonglong)nd->arch_data2 >> 32) & 0xffffffff);
ada8de
 			pc->read_vmcoreinfo = no_vmcoreinfo;
ada8de
ada8de
commit b259940b228cc7025904f9b7372348b56f73a4d2
ada8de
Author: Dave Anderson <anderson@redhat.com>
ada8de
Date:   Thu Nov 21 09:27:52 2019 -0500
ada8de
ada8de
    Fix two typos in the examples section of the "help bt" display, which
ada8de
    mistakenly show "bf -f" and "bf -FF" instead of "bt -f" and "bt -FF".
ada8de
    (austindh.kim@gmail.com)
ada8de
ada8de
diff --git a/help.c b/help.c
ada8de
index 2b2285b..eed249b 100644
ada8de
--- a/help.c
ada8de
+++ b/help.c
ada8de
@@ -2117,7 +2117,7 @@ char *help_bt[] = {
ada8de
 "  The following three examples show the difference in the display of",
ada8de
 "  the same stack frame's contents using -f, -F, and -FF:",
ada8de
 "  ",
ada8de
-"    %s> bf -f",
ada8de
+"    %s> bt -f",
ada8de
 "    ...",
ada8de
 "     #4 [ffff810072b47f10] vfs_write at ffffffff800789d8",
ada8de
 "        ffff810072b47f18: ffff81007e020380 ffff81007e2c2880 ",
ada8de
@@ -2133,7 +2133,7 @@ char *help_bt[] = {
ada8de
 "        ffff810072b47f38: 00002b141825d000 sys_write+69   ",
ada8de
 "     #5 [ffff810072b47f40] sys_write at ffffffff80078f75",
ada8de
 "    ...",
ada8de
-"    %s> bf -FF",
ada8de
+"    %s> bt -FF",
ada8de
 "    ...",
ada8de
 "     #4 [ffff810072b47f10] vfs_write at ffffffff800789d8",
ada8de
 "        ffff810072b47f18: [ffff81007e020380:files_cache] [ffff81007e2c2880:filp]",
ada8de
ada8de
commit 5171ef5a7e85805f61ef98b15801da06648a8e39
ada8de
Author: Dave Anderson <anderson@redhat.com>
ada8de
Date:   Fri Nov 22 13:39:40 2019 -0500
ada8de
ada8de
    Similar to ARM64, the X86_64, PPC64 and S390x architectures will use
ada8de
    the exported value of MAX_PHYSMEM_BITS from the vmcoreinfo data as
ada8de
    the preferred method if it is available.
ada8de
    (anderson@redhat.com)
ada8de
ada8de
diff --git a/ppc64.c b/ppc64.c
ada8de
index 0936551..f368bf8 100644
ada8de
--- a/ppc64.c
ada8de
+++ b/ppc64.c
ada8de
@@ -225,6 +225,13 @@ static int ppc64_is_vmaddr(ulong addr)
ada8de
 static int set_ppc64_max_physmem_bits(void)
ada8de
 {
ada8de
 	int dimension;
ada8de
+	char *string;
ada8de
+
ada8de
+	if ((string = pc->read_vmcoreinfo("NUMBER(MAX_PHYSMEM_BITS)"))) {
ada8de
+		machdep->max_physmem_bits = atol(string);
ada8de
+		free(string);
ada8de
+		return 0;
ada8de
+	}
ada8de
 
ada8de
 	get_array_length("mem_section", &dimension, 0);
ada8de
 
ada8de
diff --git a/s390x.c b/s390x.c
ada8de
index 0055890..4a1a466 100644
ada8de
--- a/s390x.c
ada8de
+++ b/s390x.c
ada8de
@@ -240,6 +240,13 @@ static int
ada8de
 set_s390x_max_physmem_bits(void)
ada8de
 {
ada8de
 	int array_len, dimension;
ada8de
+	char *string;
ada8de
+
ada8de
+	if ((string = pc->read_vmcoreinfo("NUMBER(MAX_PHYSMEM_BITS)"))) {
ada8de
+		machdep->max_physmem_bits = atol(string);
ada8de
+		free(string);
ada8de
+		return TRUE;
ada8de
+	}
ada8de
 
ada8de
 	machdep->max_physmem_bits = _MAX_PHYSMEM_BITS_OLD;
ada8de
 
ada8de
diff --git a/x86_64.c b/x86_64.c
ada8de
index c7967bd..a4138ed 100644
ada8de
--- a/x86_64.c
ada8de
+++ b/x86_64.c
ada8de
@@ -665,7 +665,10 @@ x86_64_init(int when)
ada8de
 		}
ada8de
 		machdep->section_size_bits = _SECTION_SIZE_BITS;
ada8de
 		if (!machdep->max_physmem_bits) {
ada8de
-			if (machdep->flags & VM_5LEVEL)
ada8de
+			if ((string = pc->read_vmcoreinfo("NUMBER(MAX_PHYSMEM_BITS)"))) {
ada8de
+				machdep->max_physmem_bits = atol(string);
ada8de
+				free(string);
ada8de
+			} else if (machdep->flags & VM_5LEVEL)
ada8de
 				machdep->max_physmem_bits = 
ada8de
 					_MAX_PHYSMEM_BITS_5LEVEL;
ada8de
 			else if (THIS_KERNEL_VERSION >= LINUX(2,6,31))
ada8de
ada8de
commit 6664cb3f4ea2eac1b6d482e541b56d7792a4be04
ada8de
Author: Dave Anderson <anderson@redhat.com>
ada8de
Date:   Tue Nov 26 12:18:02 2019 -0500
ada8de
ada8de
    If an S390X kernel crashes before vmcoreinfo initialization, there is
ada8de
    no way to extract the KASLR offset for such early dumps.  In a new
ada8de
    S390X kernel patch, the KASLR offset will be stored in the lowcore
ada8de
    memory during early boot and then overwritten after vmcoreinfo is
ada8de
    initialized.  This patch allows crash to identify the KASLR offset
ada8de
    that is stored in the lowcore memory.
ada8de
    (zaslonko@linux.ibm.com)
ada8de
ada8de
diff --git a/s390x.c b/s390x.c
ada8de
index 4a1a466..8840cc7 100644
ada8de
--- a/s390x.c
ada8de
+++ b/s390x.c
ada8de
@@ -46,6 +46,8 @@
ada8de
 
ada8de
 #define S390X_PSW_MASK_PSTATE	0x0001000000000000UL
ada8de
 
ada8de
+#define S390X_LC_VMCORE_INFO	0xe0c
ada8de
+
ada8de
 /*
ada8de
  * Flags for Region and Segment table entries.
ada8de
  */
ada8de
@@ -460,6 +462,8 @@ static void s390x_check_live(void)
ada8de
 void
ada8de
 s390x_init(int when)
ada8de
 {
ada8de
+	ulong s390x_lc_kaslr;
ada8de
+
ada8de
 	switch (when)
ada8de
 	{
ada8de
 	case SETUP_ENV:
ada8de
@@ -486,6 +490,24 @@ s390x_init(int when)
ada8de
 		machdep->verify_paddr = generic_verify_paddr;
ada8de
 		machdep->get_kvaddr_ranges = s390x_get_kvaddr_ranges;
ada8de
 		machdep->ptrs_per_pgd = PTRS_PER_PGD;
ada8de
+		if (DUMPFILE() && !(kt->flags & RELOC_SET)) {
ada8de
+			/* Read the value from well-known lowcore location*/
ada8de
+			if (readmem(S390X_LC_VMCORE_INFO, PHYSADDR, &s390x_lc_kaslr,
ada8de
+			    sizeof(s390x_lc_kaslr), "s390x_lc_kaslr",
ada8de
+			    QUIET|RETURN_ON_ERROR)) {
ada8de
+				/* Check for explicit kaslr offset flag */
ada8de
+				if (s390x_lc_kaslr & 0x1UL) {
ada8de
+					/* Drop the last bit to get an offset value */
ada8de
+					s390x_lc_kaslr &= ~(0x1UL);
ada8de
+					/* Make sure the offset is aligned by 0x1000 */
ada8de
+					if (s390x_lc_kaslr && !(s390x_lc_kaslr & 0xfff)) {
ada8de
+						kt->relocate = s390x_lc_kaslr * (-1);
ada8de
+						kt->flags |= RELOC_SET;
ada8de
+						kt->flags2 |= KASLR;
ada8de
+					}
ada8de
+				}
ada8de
+			}
ada8de
+		}
ada8de
 		break;
ada8de
 
ada8de
 	case PRE_GDB:
ada8de
ada8de
commit b265bad21cdb394b230431360605551b02fc5053
ada8de
Author: Dave Anderson <anderson@redhat.com>
ada8de
Date:   Sun Dec 1 14:06:59 2019 -0500
ada8de
ada8de
    Fix for a crash-7.2.7 regression that determined the value of the
ada8de
    ARM64 kernel SECTION_SIZE_BITS by reading the in-kernel configuration
ada8de
    data if there is no VMCOREINFO data available.  In that case, without
ada8de
    the patch, a double-free exception may occur.
ada8de
    (anderson@redhat.com)
ada8de
ada8de
diff --git a/arm64.c b/arm64.c
ada8de
index 0834913..233029d 100644
ada8de
--- a/arm64.c
ada8de
+++ b/arm64.c
ada8de
@@ -1073,10 +1073,8 @@ arm64_get_section_size_bits(void)
ada8de
 		free(string);
ada8de
 	} else if (kt->ikconfig_flags & IKCONFIG_AVAIL) {
ada8de
 		if ((ret = get_kernel_config("CONFIG_MEMORY_HOTPLUG", NULL)) == IKCONFIG_Y) {
ada8de
-			if ((ret = get_kernel_config("CONFIG_HOTPLUG_SIZE_BITS", &string)) == IKCONFIG_STR) {
ada8de
+			if ((ret = get_kernel_config("CONFIG_HOTPLUG_SIZE_BITS", &string)) == IKCONFIG_STR)
ada8de
 				machdep->section_size_bits = atol(string);
ada8de
-				free(string);
ada8de
-			}
ada8de
 		} 
ada8de
 	}
ada8de
 
ada8de
ada8de
commit e13b51a59645fd8c3884082b157a0b494cf77ec6
ada8de
Author: Dave Anderson <anderson@redhat.com>
ada8de
Date:   Sun Dec 1 14:18:41 2019 -0500
ada8de
ada8de
    Fix for segmentation violation if the gdb_readmem_callback() function
ada8de
    gets called from other than a crash command, such as from an epython
ada8de
    command from the mypkdump.so extension module.
ada8de
    (anderson@redhat.com)
ada8de
ada8de
diff --git a/gdb_interface.c b/gdb_interface.c
ada8de
index 608da86..562d2ac 100644
ada8de
--- a/gdb_interface.c
ada8de
+++ b/gdb_interface.c
ada8de
@@ -1,8 +1,8 @@
ada8de
 /* gdb_interface.c - core analysis suite
ada8de
  *
ada8de
  * Copyright (C) 1999, 2000, 2001, 2002 Mission Critical Linux, Inc.
ada8de
- * Copyright (C) 2002-2015,2018 David Anderson
ada8de
- * Copyright (C) 2002-2015,2018 Red Hat, Inc. All rights reserved.
ada8de
+ * Copyright (C) 2002-2015,2018-2019 David Anderson
ada8de
+ * Copyright (C) 2002-2015,2018-2019 Red Hat, Inc. All rights reserved.
ada8de
  *
ada8de
  * This program is free software; you can redistribute it and/or modify
ada8de
  * it under the terms of the GNU General Public License as published by
ada8de
@@ -831,6 +831,11 @@ gdb_readmem_callback(ulong addr, void *buf, int len, int write)
ada8de
 	if (write)
ada8de
 		return FALSE;
ada8de
 
ada8de
+	if (!(pc->cur_req)) {
ada8de
+		return(readmem(addr, KVADDR, buf, len, 
ada8de
+			"gdb_readmem_callback", RETURN_ON_ERROR));
ada8de
+	}
ada8de
+
ada8de
 	if (pc->cur_req->flags & GNU_NO_READMEM)
ada8de
 		return TRUE;
ada8de
 
ada8de
ada8de
commit da4a22029aa55fa55200d52f98866fce48ba720e
ada8de
Author: Dave Anderson <anderson@redhat.com>
ada8de
Date:   Tue Dec 3 11:41:19 2019 -0500
ada8de
ada8de
    Fix for the "dis -s" option when running against kernels that have
ada8de
    been configured with CONFIG_RANDOMIZE_BASE=y (KASLR).  Without the
ada8de
    patch, the command option indicates that the FILE and LINE numbers
ada8de
    are "(unknown)", and that "source code is not available".
ada8de
    (anderson@redhat.com)
ada8de
ada8de
diff --git a/kernel.c b/kernel.c
ada8de
index c4cb001..80486ba 100644
ada8de
--- a/kernel.c
ada8de
+++ b/kernel.c
ada8de
@@ -1459,12 +1459,20 @@ list_source_code(struct gnu_request *req, int count_entered)
ada8de
         char *argv[MAXARGS];
ada8de
 	struct syment *sp;
ada8de
 	ulong remaining, offset;
ada8de
+	struct load_module *lm;
ada8de
 	char *p1;
ada8de
 
ada8de
 	sp = value_search(req->addr, &offset);
ada8de
 	if (!sp || !is_symbol_text(sp))
ada8de
 		error(FATAL, "%lx: not a kernel text address\n", req->addr);
ada8de
 
ada8de
+	if (module_symbol(req->addr, NULL, &lm, NULL, 0)) {
ada8de
+		if (!(lm->mod_flags & MOD_LOAD_SYMS))
ada8de
+			error(FATAL, "%s: module source code is not available\n", lm->mod_name);
ada8de
+		get_line_number(req->addr, buf1, FALSE);
ada8de
+	} else if (kt->flags2 & KASLR)
ada8de
+		req->addr -= (kt->relocate * -1);
ada8de
+
ada8de
 	sprintf(buf1, "list *0x%lx", req->addr);
ada8de
 	open_tmpfile();
ada8de
 	if (!gdb_pass_through(buf1, pc->tmpfile, GNU_RETURN_ON_ERROR)) {
ada8de
ada8de
commit 4e4e5859731da650d3520150d7ea2ef07094c7af
ada8de
Author: Dave Anderson <anderson@redhat.com>
ada8de
Date:   Thu Dec 12 12:08:11 2019 -0500
ada8de
ada8de
    Fix for newer Xen hypervisors, which fail during initialization with
ada8de
    the error message "crash: cannot resolve init_tss".  This is caused
ada8de
    by a change in the Xen hypervisor with commit 78884406256, from
ada8de
    4.12.0-rc5-763-g7888440625.  In that patch the tss_struct structure
ada8de
    was renamed to tss64 and the tss_page structure was introduced,
ada8de
    which contains a single tss64.  Now tss information is accessible
ada8de
    via the symbol "per_cpu__tss_page".
ada8de
    (dietmar.hahn@ts.fujitsu.com)
ada8de
ada8de
diff --git a/x86.c b/x86.c
ada8de
index 88562b6..de0d3d3 100644
ada8de
--- a/x86.c
ada8de
+++ b/x86.c
ada8de
@@ -5600,18 +5600,18 @@ x86_get_stackbase_hyper(ulong task)
ada8de
 
ada8de
 	if (symbol_exists("init_tss")) {
ada8de
 		init_tss = symbol_value("init_tss");
ada8de
-		init_tss += XEN_HYPER_SIZE(tss_struct) * pcpu;
ada8de
+		init_tss += XEN_HYPER_SIZE(tss) * pcpu;
ada8de
 	} else {
ada8de
 		init_tss = symbol_value("per_cpu__init_tss");
ada8de
 		init_tss = xen_hyper_per_cpu(init_tss, pcpu);
ada8de
 	}
ada8de
 	
ada8de
-	buf = GETBUF(XEN_HYPER_SIZE(tss_struct));
ada8de
+	buf = GETBUF(XEN_HYPER_SIZE(tss));
ada8de
 	if (!readmem(init_tss, KVADDR, buf,
ada8de
-			XEN_HYPER_SIZE(tss_struct), "init_tss", RETURN_ON_ERROR)) {
ada8de
+			XEN_HYPER_SIZE(tss), "init_tss", RETURN_ON_ERROR)) {
ada8de
 		error(FATAL, "cannot read init_tss.\n");
ada8de
 	}
ada8de
-	esp = ULONG(buf + XEN_HYPER_OFFSET(tss_struct_esp0));
ada8de
+	esp = ULONG(buf + XEN_HYPER_OFFSET(tss_esp0));
ada8de
 	FREEBUF(buf);
ada8de
 	base = esp & (~(STACKSIZE() - 1));
ada8de
 
ada8de
@@ -5745,8 +5745,8 @@ x86_init_hyper(int when)
ada8de
 #endif
ada8de
 		XEN_HYPER_STRUCT_SIZE_INIT(cpu_time, "cpu_time");
ada8de
 		XEN_HYPER_STRUCT_SIZE_INIT(cpuinfo_x86, "cpuinfo_x86");
ada8de
-		XEN_HYPER_STRUCT_SIZE_INIT(tss_struct, "tss_struct");
ada8de
-		XEN_HYPER_MEMBER_OFFSET_INIT(tss_struct_esp0, "tss_struct", "esp0");
ada8de
+		XEN_HYPER_STRUCT_SIZE_INIT(tss, "tss_struct");
ada8de
+		XEN_HYPER_MEMBER_OFFSET_INIT(tss_esp0, "tss_struct", "esp0");
ada8de
 		XEN_HYPER_MEMBER_OFFSET_INIT(cpu_time_local_tsc_stamp, "cpu_time", "local_tsc_stamp");
ada8de
 		XEN_HYPER_MEMBER_OFFSET_INIT(cpu_time_stime_local_stamp, "cpu_time", "stime_local_stamp");
ada8de
 		XEN_HYPER_MEMBER_OFFSET_INIT(cpu_time_stime_master_stamp, "cpu_time", "stime_master_stamp");
ada8de
diff --git a/x86_64.c b/x86_64.c
ada8de
index a4138ed..4f1a6d7 100644
ada8de
--- a/x86_64.c
ada8de
+++ b/x86_64.c
ada8de
@@ -7973,13 +7973,23 @@ x86_64_init_hyper(int when)
ada8de
 
ada8de
 	case POST_GDB:
ada8de
 		XEN_HYPER_STRUCT_SIZE_INIT(cpuinfo_x86, "cpuinfo_x86");
ada8de
-		XEN_HYPER_STRUCT_SIZE_INIT(tss_struct, "tss_struct");
ada8de
-		if (MEMBER_EXISTS("tss_struct", "__blh")) {
ada8de
-			XEN_HYPER_ASSIGN_OFFSET(tss_struct_rsp0) = MEMBER_OFFSET("tss_struct", "__blh") + sizeof(short unsigned int);
ada8de
+		if (symbol_exists("per_cpu__tss_page")) {
ada8de
+			XEN_HYPER_STRUCT_SIZE_INIT(tss, "tss64");
ada8de
+			XEN_HYPER_ASSIGN_OFFSET(tss_rsp0) =
ada8de
+							MEMBER_OFFSET("tss64", "rsp0");
ada8de
+			XEN_HYPER_MEMBER_OFFSET_INIT(tss_ist, "tss64", "ist");
ada8de
 		} else {
ada8de
-			XEN_HYPER_ASSIGN_OFFSET(tss_struct_rsp0) = MEMBER_OFFSET("tss_struct", "rsp0");
ada8de
+			XEN_HYPER_STRUCT_SIZE_INIT(tss, "tss_struct");
ada8de
+			XEN_HYPER_MEMBER_OFFSET_INIT(tss_ist, "tss_struct", "ist");
ada8de
+			if (MEMBER_EXISTS("tss_struct", "__blh")) {
ada8de
+				XEN_HYPER_ASSIGN_OFFSET(tss_rsp0) =
ada8de
+					MEMBER_OFFSET("tss_struct", "__blh") +
ada8de
+								sizeof(short unsigned int);
ada8de
+			} else	{
ada8de
+				XEN_HYPER_ASSIGN_OFFSET(tss_rsp0) =
ada8de
+							MEMBER_OFFSET("tss_struct", "rsp0");
ada8de
+			}
ada8de
 		}
ada8de
-		XEN_HYPER_MEMBER_OFFSET_INIT(tss_struct_ist, "tss_struct", "ist");
ada8de
 		if (symbol_exists("cpu_data")) {
ada8de
 			xht->cpu_data_address = symbol_value("cpu_data");
ada8de
 		}
ada8de
diff --git a/xen_hyper.c b/xen_hyper.c
ada8de
index f2f00e6..1030c0a 100644
ada8de
--- a/xen_hyper.c
ada8de
+++ b/xen_hyper.c
ada8de
@@ -338,33 +338,35 @@ xen_hyper_x86_pcpu_init(void)
ada8de
 	if((xhpct->pcpu_struct = malloc(XEN_HYPER_SIZE(cpu_info))) == NULL) {
ada8de
 		error(FATAL, "cannot malloc pcpu struct space.\n");
ada8de
 	}
ada8de
-
ada8de
 	/* get physical cpu context */
ada8de
 	xen_hyper_alloc_pcpu_context_space(XEN_HYPER_MAX_CPUS());
ada8de
 	if (symbol_exists("per_cpu__init_tss")) {
ada8de
 		init_tss_base = symbol_value("per_cpu__init_tss");
ada8de
 		flag = TRUE;
ada8de
+	} else if (symbol_exists("per_cpu__tss_page")) {
ada8de
+			init_tss_base = symbol_value("per_cpu__tss_page");
ada8de
+			flag = TRUE;
ada8de
 	} else {
ada8de
 		init_tss_base = symbol_value("init_tss");
ada8de
 		flag = FALSE;
ada8de
 	}
ada8de
-	buf = GETBUF(XEN_HYPER_SIZE(tss_struct));	
ada8de
+	buf = GETBUF(XEN_HYPER_SIZE(tss));
ada8de
 	for_cpu_indexes(i, cpuid)
ada8de
 	{
ada8de
 		if (flag)
ada8de
 			init_tss = xen_hyper_per_cpu(init_tss_base, cpuid);
ada8de
 		else
ada8de
 			init_tss = init_tss_base +
ada8de
-				XEN_HYPER_SIZE(tss_struct) * cpuid;
ada8de
+				XEN_HYPER_SIZE(tss) * cpuid;
ada8de
 		if (!readmem(init_tss, KVADDR, buf,
ada8de
-			XEN_HYPER_SIZE(tss_struct), "init_tss", RETURN_ON_ERROR)) {
ada8de
+			XEN_HYPER_SIZE(tss), "init_tss", RETURN_ON_ERROR)) {
ada8de
 			error(FATAL, "cannot read init_tss.\n");
ada8de
 		}
ada8de
 		if (machine_type("X86")) {
ada8de
-			sp = ULONG(buf + XEN_HYPER_OFFSET(tss_struct_esp0));
ada8de
+			sp = ULONG(buf + XEN_HYPER_OFFSET(tss_esp0));
ada8de
 		} else if (machine_type("X86_64")) {
ada8de
-			sp = ULONG(buf + XEN_HYPER_OFFSET(tss_struct_rsp0));
ada8de
-		} else 
ada8de
+			sp = ULONG(buf + XEN_HYPER_OFFSET(tss_rsp0));
ada8de
+		} else
ada8de
 			sp = 0;
ada8de
 		cpu_info = XEN_HYPER_GET_CPU_INFO(sp);
ada8de
 		if (CRASHDEBUG(1)) {
ada8de
@@ -1777,10 +1779,10 @@ xen_hyper_store_pcpu_context_tss(struct xen_hyper_pcpu_context *pcc,
ada8de
 
ada8de
 	pcc->init_tss = init_tss;
ada8de
 	if (machine_type("X86")) {
ada8de
-		pcc->sp.esp0 = ULONG(tss + XEN_HYPER_OFFSET(tss_struct_esp0));
ada8de
+		pcc->sp.esp0 = ULONG(tss + XEN_HYPER_OFFSET(tss_esp0));
ada8de
 	} else if (machine_type("X86_64")) {
ada8de
-		pcc->sp.rsp0 = ULONG(tss + XEN_HYPER_OFFSET(tss_struct_rsp0));
ada8de
-		ist_p = (uint64_t *)(tss + XEN_HYPER_OFFSET(tss_struct_ist));
ada8de
+		pcc->sp.rsp0 = ULONG(tss + XEN_HYPER_OFFSET(tss_rsp0));
ada8de
+		ist_p = (uint64_t *)(tss + XEN_HYPER_OFFSET(tss_ist));
ada8de
 		for (i = 0; i < XEN_HYPER_TSS_IST_MAX; i++, ist_p++) {
ada8de
 			pcc->ist[i] = ULONG(ist_p);
ada8de
 		}
ada8de
diff --git a/xen_hyper_defs.h b/xen_hyper_defs.h
ada8de
index b871bdd..acf910a 100644
ada8de
--- a/xen_hyper_defs.h
ada8de
+++ b/xen_hyper_defs.h
ada8de
@@ -598,7 +598,7 @@ struct xen_hyper_size_table {
ada8de
 	long scheduler;
ada8de
 	long shared_info;
ada8de
 	long timer;
ada8de
-	long tss_struct;
ada8de
+	long tss;
ada8de
 	long vcpu;
ada8de
 	long vcpu_runstate_info;
ada8de
 	long xen_crash_xen_regs_t;		/* elf note v2 */
ada8de
@@ -727,9 +727,9 @@ struct xen_hyper_offset_table {
ada8de
 	long timer_heap_offset;
ada8de
 	long timer_killed;
ada8de
 	/* tss */
ada8de
-	long tss_struct_rsp0;
ada8de
-	long tss_struct_esp0;
ada8de
-	long tss_struct_ist;
ada8de
+	long tss_rsp0;
ada8de
+	long tss_esp0;
ada8de
+	long tss_ist;
ada8de
 	/* vcpu */
ada8de
 	long vcpu_vcpu_id;
ada8de
 	long vcpu_processor;
ada8de
diff --git a/xen_hyper_dump_tables.c b/xen_hyper_dump_tables.c
ada8de
index eb646b6..0360d25 100644
ada8de
--- a/xen_hyper_dump_tables.c
ada8de
+++ b/xen_hyper_dump_tables.c
ada8de
@@ -636,8 +636,8 @@ xen_hyper_dump_xen_hyper_size_table(char *spec, ulong makestruct)
ada8de
 		(buf, "%ld\n", xen_hyper_size_table.shared_info));
ada8de
 	XEN_HYPER_PRI(fp, len, "timer: ", buf, flag,
ada8de
 		(buf, "%ld\n", xen_hyper_size_table.timer));
ada8de
-	XEN_HYPER_PRI(fp, len, "tss_struct: ", buf, flag,
ada8de
-		(buf, "%ld\n", xen_hyper_size_table.tss_struct));
ada8de
+	XEN_HYPER_PRI(fp, len, "tss: ", buf, flag,
ada8de
+		(buf, "%ld\n", xen_hyper_size_table.tss));
ada8de
 	XEN_HYPER_PRI(fp, len, "vcpu: ", buf, flag,
ada8de
 		(buf, "%ld\n", xen_hyper_size_table.vcpu));
ada8de
 	XEN_HYPER_PRI(fp, len, "vcpu_runstate_info: ", buf, flag,
ada8de
@@ -868,9 +868,9 @@ xen_hyper_dump_xen_hyper_offset_table(char *spec, ulong makestruct)
ada8de
 		(buf, "%ld\n", xen_hyper_offset_table.timer_killed));
ada8de
 
ada8de
 	XEN_HYPER_PRI(fp, len, "tss_struct_rsp0: ", buf, flag,
ada8de
-		(buf, "%ld\n", xen_hyper_offset_table.tss_struct_rsp0));
ada8de
+		(buf, "%ld\n", xen_hyper_offset_table.tss_rsp0));
ada8de
 	XEN_HYPER_PRI(fp, len, "tss_struct_esp0: ", buf, flag,
ada8de
-		(buf, "%ld\n", xen_hyper_offset_table.tss_struct_esp0));
ada8de
+		(buf, "%ld\n", xen_hyper_offset_table.tss_esp0));
ada8de
 
ada8de
 	XEN_HYPER_PRI(fp, len, "vcpu_vcpu_id: ", buf, flag,
ada8de
 		(buf, "%ld\n", xen_hyper_offset_table.vcpu_vcpu_id));
ada8de
ada8de
commit c408862daff0b07f0d98a1c309febcf6590ccf0c
ada8de
Author: Dave Anderson <anderson@redhat.com>
ada8de
Date:   Sun Dec 15 12:24:13 2019 -0500
ada8de
ada8de
    When accessing the ARM64 kernel's "crash_notes" array, continue to
ada8de
    read the per-cpu NT_PRSTATUS note contents if an invalid note is
ada8de
    encountered.  Without the patch, if an invalid note is found, all
ada8de
    other notes were ignored, and subsequent "bt" attempts on the active
ada8de
    tasks would fail.
ada8de
    (chenqiwu@xiaomi.com, anderson@redhat.com)
ada8de
ada8de
diff --git a/arm64.c b/arm64.c
ada8de
index 233029d..1b024a4 100644
ada8de
--- a/arm64.c
ada8de
+++ b/arm64.c
ada8de
@@ -81,7 +81,7 @@ static int arm64_on_irq_stack(int, ulong);
ada8de
 static void arm64_set_irq_stack(struct bt_info *);
ada8de
 static void arm64_set_process_stack(struct bt_info *);
ada8de
 static int arm64_get_kvaddr_ranges(struct vaddr_range *);
ada8de
-static int arm64_get_crash_notes(void);
ada8de
+static void arm64_get_crash_notes(void);
ada8de
 static void arm64_calc_VA_BITS(void);
ada8de
 static int arm64_is_uvaddr(ulong, struct task_context *);
ada8de
 
ada8de
@@ -465,11 +465,8 @@ arm64_init(int when)
ada8de
 		 * of the crash. We need this information to extract correct
ada8de
 		 * backtraces from the panic task.
ada8de
 		 */
ada8de
-		if (!LIVE() && !arm64_get_crash_notes())
ada8de
-			error(WARNING, 
ada8de
-			    "cannot retrieve registers for active task%s\n\n",
ada8de
-				kt->cpus > 1 ? "s" : "");
ada8de
-
ada8de
+		if (!LIVE()) 
ada8de
+			arm64_get_crash_notes();
ada8de
 		break;
ada8de
 
ada8de
 	case LOG_ONLY:
ada8de
@@ -3578,7 +3575,7 @@ arm64_get_smp_cpus(void)
ada8de
 /*
ada8de
  * Retrieve task registers for the time of the crash.
ada8de
  */
ada8de
-static int
ada8de
+static void
ada8de
 arm64_get_crash_notes(void)
ada8de
 {
ada8de
 	struct machine_specific *ms = machdep->machspec;
ada8de
@@ -3587,10 +3584,10 @@ arm64_get_crash_notes(void)
ada8de
 	ulong offset;
ada8de
 	char *buf, *p;
ada8de
 	ulong *notes_ptrs;
ada8de
-	ulong i;
ada8de
+	ulong i, found;
ada8de
 
ada8de
 	if (!symbol_exists("crash_notes"))
ada8de
-		return FALSE;
ada8de
+		return;
ada8de
 
ada8de
 	crash_notes = symbol_value("crash_notes");
ada8de
 
ada8de
@@ -3602,9 +3599,9 @@ arm64_get_crash_notes(void)
ada8de
 	 */
ada8de
 	if (!readmem(crash_notes, KVADDR, &notes_ptrs[kt->cpus-1], 
ada8de
 	    sizeof(notes_ptrs[kt->cpus-1]), "crash_notes", RETURN_ON_ERROR)) {
ada8de
-		error(WARNING, "cannot read crash_notes\n");
ada8de
+		error(WARNING, "cannot read \"crash_notes\"\n");
ada8de
 		FREEBUF(notes_ptrs);
ada8de
-		return FALSE;
ada8de
+		return;
ada8de
 	}
ada8de
 
ada8de
 	if (symbol_exists("__per_cpu_offset")) {
ada8de
@@ -3620,12 +3617,11 @@ arm64_get_crash_notes(void)
ada8de
 	if (!(ms->panic_task_regs = calloc((size_t)kt->cpus, sizeof(struct arm64_pt_regs))))
ada8de
 		error(FATAL, "cannot calloc panic_task_regs space\n");
ada8de
 	
ada8de
-	for  (i = 0; i < kt->cpus; i++) {
ada8de
-
ada8de
+	for  (i = found = 0; i < kt->cpus; i++) {
ada8de
 		if (!readmem(notes_ptrs[i], KVADDR, buf, SIZE(note_buf), 
ada8de
 		    "note_buf_t", RETURN_ON_ERROR)) {
ada8de
-			error(WARNING, "failed to read note_buf_t\n");
ada8de
-			goto fail;
ada8de
+			error(WARNING, "cpu %d: cannot read NT_PRSTATUS note\n", i);
ada8de
+			continue;
ada8de
 		}
ada8de
 
ada8de
 		/*
ada8de
@@ -3655,19 +3651,24 @@ arm64_get_crash_notes(void)
ada8de
 				    note->n_descsz == notesz)
ada8de
 					BCOPY((char *)note, buf, notesz);
ada8de
 			} else {
ada8de
-				error(WARNING,
ada8de
-					"cannot find NT_PRSTATUS note for cpu: %d\n", i);
ada8de
+				error(WARNING, "cpu %d: cannot find NT_PRSTATUS note\n", i);
ada8de
 				continue;
ada8de
 			}
ada8de
 		}
ada8de
 
ada8de
+		/*
ada8de
+		 * Check the sanity of NT_PRSTATUS note only for each online cpu.
ada8de
+		 * If this cpu has invalid note, continue to find the crash notes
ada8de
+		 * for other online cpus.
ada8de
+		 */
ada8de
 		if (note->n_type != NT_PRSTATUS) {
ada8de
-			error(WARNING, "invalid note (n_type != NT_PRSTATUS)\n");
ada8de
-			goto fail;
ada8de
+			error(WARNING, "cpu %d: invalid NT_PRSTATUS note (n_type != NT_PRSTATUS)\n", i);
ada8de
+			continue;
ada8de
 		}
ada8de
-		if (p[0] != 'C' || p[1] != 'O' || p[2] != 'R' || p[3] != 'E') {
ada8de
-			error(WARNING, "invalid note (name != \"CORE\"\n");
ada8de
-			goto fail;
ada8de
+
ada8de
+		if (!STRNEQ(p, "CORE")) {
ada8de
+			error(WARNING, "cpu %d: invalid NT_PRSTATUS note (name != \"CORE\")\n", i);
ada8de
+			continue;
ada8de
 		}
ada8de
 
ada8de
 		/*
ada8de
@@ -3680,18 +3681,17 @@ arm64_get_crash_notes(void)
ada8de
 
ada8de
 		BCOPY(p + OFFSET(elf_prstatus_pr_reg), &ms->panic_task_regs[i],
ada8de
 		      sizeof(struct arm64_pt_regs));
ada8de
+
ada8de
+		found++;
ada8de
 	}
ada8de
 
ada8de
 	FREEBUF(buf);
ada8de
 	FREEBUF(notes_ptrs);
ada8de
-	return TRUE;
ada8de
 
ada8de
-fail:
ada8de
-	FREEBUF(buf);
ada8de
-	FREEBUF(notes_ptrs);
ada8de
-	free(ms->panic_task_regs);
ada8de
-	ms->panic_task_regs = NULL;
ada8de
-	return FALSE;
ada8de
+	if (!found) {
ada8de
+		free(ms->panic_task_regs);
ada8de
+		ms->panic_task_regs = NULL;
ada8de
+	}
ada8de
 }
ada8de
 
ada8de
 static void
ada8de
ada8de
commit 63df9c067de0b2017f50f5d236954890bbb42fe3
ada8de
Author: Dave Anderson <anderson@redhat.com>
ada8de
Date:   Mon Dec 16 11:28:46 2019 -0500
ada8de
ada8de
    When accessing the 32-bit ARM kernel's "crash_notes" array, continue
ada8de
    to read the per-cpu NT_PRSTATUS note contents if an invalid note is
ada8de
    encountered.  Without the patch, if an invalid note is found, all
ada8de
    other notes were ignored, and subsequent "bt" attempts on the active
ada8de
    tasks would fail.
ada8de
    (chenqiwu@xiaomi.com, anderson@redhat.com)
ada8de
ada8de
diff --git a/arm.c b/arm.c
ada8de
index b05b0b3..e52d29f 100644
ada8de
--- a/arm.c
ada8de
+++ b/arm.c
ada8de
@@ -26,7 +26,7 @@
ada8de
 #include "defs.h"
ada8de
 
ada8de
 static void arm_parse_cmdline_args(void);
ada8de
-static int arm_get_crash_notes(void);
ada8de
+static void arm_get_crash_notes(void);
ada8de
 static int arm_verify_symbol(const char *, ulong, char);
ada8de
 static int arm_is_module_addr(ulong);
ada8de
 static int arm_is_kvaddr(ulong);
ada8de
@@ -348,10 +348,8 @@ arm_init(int when)
ada8de
 		 * of the crash. We need this information to extract correct
ada8de
 		 * backtraces from the panic task.
ada8de
 		 */
ada8de
-		if (!ACTIVE() && !arm_get_crash_notes())
ada8de
-			error(WARNING, 
ada8de
-			    "cannot retrieve registers for active task%s\n\n",
ada8de
-				kt->cpus > 1 ? "s" : "");
ada8de
+		if (!ACTIVE())
ada8de
+			arm_get_crash_notes();
ada8de
 
ada8de
 		if (init_unwind_tables()) {
ada8de
 			if (CRASHDEBUG(1))
ada8de
@@ -543,7 +541,7 @@ arm_parse_cmdline_args(void)
ada8de
 /*
ada8de
  * Retrieve task registers for the time of the crash.
ada8de
  */
ada8de
-static int
ada8de
+static void
ada8de
 arm_get_crash_notes(void)
ada8de
 {
ada8de
 	struct machine_specific *ms = machdep->machspec;
ada8de
@@ -552,10 +550,10 @@ arm_get_crash_notes(void)
ada8de
 	ulong offset;
ada8de
 	char *buf, *p;
ada8de
 	ulong *notes_ptrs;
ada8de
-	ulong i;
ada8de
+	ulong i, found;
ada8de
 
ada8de
 	if (!symbol_exists("crash_notes"))
ada8de
-		return FALSE;
ada8de
+		return;
ada8de
 
ada8de
 	crash_notes = symbol_value("crash_notes");
ada8de
 
ada8de
@@ -570,11 +568,10 @@ arm_get_crash_notes(void)
ada8de
 		     RETURN_ON_ERROR)) {
ada8de
 		error(WARNING, "cannot read crash_notes\n");
ada8de
 		FREEBUF(notes_ptrs);
ada8de
-		return FALSE;
ada8de
+		return;
ada8de
 	}
ada8de
 
ada8de
 	if (symbol_exists("__per_cpu_offset")) {
ada8de
-
ada8de
 		/* Add __per_cpu_offset for each cpu to form the pointer to the notes */
ada8de
 		for (i = 0; i<kt->cpus; i++)
ada8de
 			notes_ptrs[i] = notes_ptrs[kt->cpus-1] + kt->__per_cpu_offset[i];	
ada8de
@@ -585,12 +582,11 @@ arm_get_crash_notes(void)
ada8de
 	if (!(panic_task_regs = calloc((size_t)kt->cpus, sizeof(*panic_task_regs))))
ada8de
 		error(FATAL, "cannot calloc panic_task_regs space\n");
ada8de
 	
ada8de
-	for  (i=0;i<kt->cpus;i++) {
ada8de
-
ada8de
+	for  (i = found = 0; i<kt->cpus; i++) {
ada8de
 		if (!readmem(notes_ptrs[i], KVADDR, buf, SIZE(note_buf), "note_buf_t",
ada8de
 			     RETURN_ON_ERROR)) {
ada8de
-			error(WARNING, "failed to read note_buf_t\n");
ada8de
-			goto fail;
ada8de
+			error(WARNING, "cpu %d: cannot read NT_PRSTATUS note\n", i);
ada8de
+			continue;
ada8de
 		}
ada8de
 
ada8de
 		/*
ada8de
@@ -620,19 +616,23 @@ arm_get_crash_notes(void)
ada8de
 				    note->n_descsz == notesz)
ada8de
 					BCOPY((char *)note, buf, notesz);
ada8de
 			} else {
ada8de
-				error(WARNING,
ada8de
-					"cannot find NT_PRSTATUS note for cpu: %d\n", i);
ada8de
+				error(WARNING, "cpu %d: cannot find NT_PRSTATUS note\n", i);
ada8de
 				continue;
ada8de
 			}
ada8de
 		}
ada8de
-
ada8de
+		/*
ada8de
+		 * Check the sanity of NT_PRSTATUS note only for each online cpu.
ada8de
+		 * If this cpu has invalid note, continue to find the crash notes
ada8de
+		 * for other online cpus.
ada8de
+		 */
ada8de
 		if (note->n_type != NT_PRSTATUS) {
ada8de
-			error(WARNING, "invalid note (n_type != NT_PRSTATUS)\n");
ada8de
-			goto fail;
ada8de
+			error(WARNING, "cpu %d: invalid NT_PRSTATUS note (n_type != NT_PRSTATUS)\n", i);
ada8de
+			continue;
ada8de
 		}
ada8de
-		if (p[0] != 'C' || p[1] != 'O' || p[2] != 'R' || p[3] != 'E') {
ada8de
-			error(WARNING, "invalid note (name != \"CORE\"\n");
ada8de
-			goto fail;
ada8de
+
ada8de
+		if (!STRNEQ(p, "CORE")) {
ada8de
+			error(WARNING, "cpu %d: invalid NT_PRSTATUS note (name != \"CORE\")\n", i);
ada8de
+			continue;
ada8de
 		}
ada8de
 
ada8de
 		/*
ada8de
@@ -646,6 +646,7 @@ arm_get_crash_notes(void)
ada8de
 		BCOPY(p + OFFSET(elf_prstatus_pr_reg), &panic_task_regs[i],
ada8de
 		      sizeof(panic_task_regs[i]));
ada8de
 
ada8de
+		found++;
ada8de
 	}
ada8de
 
ada8de
 	/*
ada8de
@@ -656,13 +657,10 @@ arm_get_crash_notes(void)
ada8de
 
ada8de
 	FREEBUF(buf);
ada8de
 	FREEBUF(notes_ptrs);
ada8de
-	return TRUE;
ada8de
-
ada8de
-fail:
ada8de
-	FREEBUF(buf);
ada8de
-	FREEBUF(notes_ptrs);
ada8de
-	free(panic_task_regs);
ada8de
-	return FALSE;
ada8de
+	if (!found) {
ada8de
+		free(panic_task_regs);
ada8de
+		ms->crash_task_regs = NULL;
ada8de
+	}
ada8de
 }
ada8de
 
ada8de
 /*
ada8de
ada8de
commit af7f78dc501b8acf7fee3f924f69e93513d0a74b
ada8de
Author: Dave Anderson <anderson@redhat.com>
ada8de
Date:   Fri Dec 20 14:33:11 2019 -0500
ada8de
ada8de
    Fix for the "log -a" option.  The kernel's sk_buff.len field is a
ada8de
    32-bit unsigned int, but crash was reading its 32-bit value into a
ada8de
    64-bit unsigned long stack variable.  All extra bits that pre-existed
ada8de
    in the upper 32-bits of the stack variable were passed along as part
ada8de
    of a buffer size request; if the upper 32-bit bits were non-zero,
ada8de
    then the command would fail with a dump of the internal buffer
ada8de
    allocation stats followed by the message "log: cannot allocate any
ada8de
    more memory!".
ada8de
    (anderson@redhat.com)
ada8de
ada8de
diff --git a/kernel.c b/kernel.c
ada8de
index 80486ba..68ee282 100644
ada8de
--- a/kernel.c
ada8de
+++ b/kernel.c
ada8de
@@ -11284,7 +11284,8 @@ dump_audit_skb_queue(ulong audit_skb_queue)
ada8de
 
ada8de
 	p = skb_buff_head_next;
ada8de
 	do {
ada8de
-		ulong data, len, data_len;
ada8de
+		ulong data, data_len;
ada8de
+		uint len;
ada8de
 		uint16_t nlmsg_type;
ada8de
 		char *buf = NULL;
ada8de
 
ada8de
@@ -11295,7 +11296,7 @@ dump_audit_skb_queue(ulong audit_skb_queue)
ada8de
 			KVADDR,
ada8de
 			&len,
ada8de
 			SIZE(sk_buff_len),
ada8de
-			"sk_buff.data",
ada8de
+			"sk_buff.len",
ada8de
 			FAULT_ON_ERROR);
ada8de
 
ada8de
 		data_len = len - roundup(SIZE(nlmsghdr), NLMSG_ALIGNTO);
ada8de
ada8de
commit 5e975dd8c817ea6aea35e1e15b83c378aee9c136
ada8de
Author: Dave Anderson <anderson@redhat.com>
ada8de
Date:   Tue Dec 24 08:43:52 2019 -0500
ada8de
ada8de
    When determining the ARM64 kernel's "vabits_actual" value by reading
ada8de
    the new TCR_EL1.T1SZ vmcoreinfo entry, display its value during
ada8de
    session initialization only when invoking crash with "-d1" or larger
ada8de
    -d debug value.
ada8de
    (anderson@redhat.com)
ada8de
ada8de
diff --git a/arm64.c b/arm64.c
ada8de
index 1b024a4..6c2c58f 100644
ada8de
--- a/arm64.c
ada8de
+++ b/arm64.c
ada8de
@@ -3864,7 +3864,8 @@ arm64_calc_VA_BITS(void)
ada8de
 				 * vabits_actual = 64 - T1SZ;
ada8de
 				 */
ada8de
 				value = 64 - strtoll(string, NULL, 0);
ada8de
-				fprintf(fp,  "vmcoreinfo : vabits_actual: %ld\n", value);
ada8de
+				if (CRASHDEBUG(1))
ada8de
+					fprintf(fp,  "vmcoreinfo : vabits_actual: %ld\n", value);
ada8de
 				free(string);
ada8de
 				machdep->machspec->VA_BITS_ACTUAL = value;
ada8de
 				machdep->machspec->VA_BITS = value;
ada8de
ada8de
commit 0ab7ac3bea5deaa3da894247ffab9ef2433c1b9b
ada8de
Author: Dave Anderson <anderson@redhat.com>
ada8de
Date:   Tue Jan 7 09:34:38 2020 -0500
ada8de
ada8de
    Update copyright to 2020 in crash version output.
ada8de
ada8de
diff --git a/help.c b/help.c
ada8de
index eed249b..a481850 100644
ada8de
--- a/help.c
ada8de
+++ b/help.c
ada8de
@@ -1,8 +1,8 @@
ada8de
 /* help.c - core analysis suite
ada8de
  *
ada8de
  * Copyright (C) 1999, 2000, 2001, 2002 Mission Critical Linux, Inc.
ada8de
- * Copyright (C) 2002-2019 David Anderson
ada8de
- * Copyright (C) 2002-2019 Red Hat, Inc. All rights reserved.
ada8de
+ * Copyright (C) 2002-2020 David Anderson
ada8de
+ * Copyright (C) 2002-2020 Red Hat, Inc. All rights reserved.
ada8de
  *
ada8de
  * This program is free software; you can redistribute it and/or modify
ada8de
  * it under the terms of the GNU General Public License as published by
ada8de
@@ -8269,7 +8269,7 @@ display_version(void)
ada8de
 static 
ada8de
 char *version_info[] = {
ada8de
 
ada8de
-"Copyright (C) 2002-2019  Red Hat, Inc.",
ada8de
+"Copyright (C) 2002-2020  Red Hat, Inc.",
ada8de
 "Copyright (C) 2004, 2005, 2006, 2010  IBM Corporation", 
ada8de
 "Copyright (C) 1999-2006  Hewlett-Packard Co",
ada8de
 "Copyright (C) 2005, 2006, 2011, 2012  Fujitsu Limited",
ada8de
ada8de
commit 08b01834641b0a387c86adf651c660df0fe37ae1
ada8de
Author: Dave Anderson <anderson@redhat.com>
ada8de
Date:   Tue Jan 7 11:07:12 2020 -0500
ada8de
ada8de
    Fix for ARM64 when running against Linux 5.5-rc1 and later kernels
ada8de
    that contain commit b6e43c0e3129ffe87e65c85f20fcbdf0eb86fba0, titled
ada8de
    "arm64: remove __exception annotations".  Without the patch, the
ada8de
    ARM64 crash session fails during initialization with the error
ada8de
    message "crash: cannot resolve __exception_text_start".
ada8de
    (anderson@redhat.com)
ada8de
ada8de
diff --git a/arm64.c b/arm64.c
ada8de
index 6c2c58f..7662d71 100644
ada8de
--- a/arm64.c
ada8de
+++ b/arm64.c
ada8de
@@ -1,8 +1,8 @@
ada8de
 /*
ada8de
  * arm64.c - core analysis suite
ada8de
  *
ada8de
- * Copyright (C) 2012-2019 David Anderson
ada8de
- * Copyright (C) 2012-2019 Red Hat, Inc. All rights reserved.
ada8de
+ * Copyright (C) 2012-2020 David Anderson
ada8de
+ * Copyright (C) 2012-2020 Red Hat, Inc. All rights reserved.
ada8de
  *
ada8de
  * This program is free software; you can redistribute it and/or modify
ada8de
  * it under the terms of the GNU General Public License as published by
ada8de
@@ -1644,10 +1644,11 @@ arm64_stackframe_init(void)
ada8de
 		machdep->machspec->kern_eframe_offset = SIZE(pt_regs);
ada8de
 	}
ada8de
 
ada8de
-	machdep->machspec->__exception_text_start = 
ada8de
-		symbol_value("__exception_text_start");
ada8de
-	machdep->machspec->__exception_text_end = 
ada8de
-		symbol_value("__exception_text_end");
ada8de
+	if ((sp1 = kernel_symbol_search("__exception_text_start")) &&
ada8de
+	    (sp2 = kernel_symbol_search("__exception_text_end"))) {
ada8de
+		machdep->machspec->__exception_text_start = sp1->value;
ada8de
+		machdep->machspec->__exception_text_end = sp2->value;
ada8de
+	}
ada8de
 	if ((sp1 = kernel_symbol_search("__irqentry_text_start")) &&
ada8de
 	    (sp2 = kernel_symbol_search("__irqentry_text_end"))) {
ada8de
 		machdep->machspec->__irqentry_text_start = sp1->value; 
ada8de
@@ -1856,20 +1857,38 @@ arm64_eframe_search(struct bt_info *bt)
ada8de
 	return count;
ada8de
 }
ada8de
 
ada8de
+static char *arm64_exception_functions[] = {
ada8de
+        "do_undefinstr",
ada8de
+        "do_sysinstr",
ada8de
+        "do_debug_exception",
ada8de
+        "do_mem_abort",
ada8de
+        "do_el0_irq_bp_hardening",
ada8de
+        "do_sp_pc_abort",
ada8de
+        NULL
ada8de
+};
ada8de
+
ada8de
 static int
ada8de
 arm64_in_exception_text(ulong ptr)
ada8de
 {
ada8de
 	struct machine_specific *ms = machdep->machspec;
ada8de
-
ada8de
-	if ((ptr >= ms->__exception_text_start) &&
ada8de
-	    (ptr < ms->__exception_text_end))
ada8de
-		return TRUE;
ada8de
+	char *name, **func;
ada8de
 
ada8de
 	if (ms->__irqentry_text_start && ms->__irqentry_text_end &&
ada8de
 	    ((ptr >= ms->__irqentry_text_start) && 
ada8de
 	    (ptr < ms->__irqentry_text_end)))
ada8de
 		return TRUE;
ada8de
 
ada8de
+	if (ms->__exception_text_start && ms->__exception_text_end) {
ada8de
+		if ((ptr >= ms->__exception_text_start) &&
ada8de
+		    (ptr < ms->__exception_text_end))
ada8de
+			return TRUE;
ada8de
+	} else if ((name = closest_symbol(ptr))) {  /* Linux 5.5 and later */
ada8de
+		for (func = &arm64_exception_functions[0]; *func; func++) {
ada8de
+			if (STREQ(name, *func))
ada8de
+				return TRUE;
ada8de
+		}
ada8de
+	}
ada8de
+
ada8de
 	return FALSE;
ada8de
 }
ada8de
 
ada8de
ada8de
commit 7c2d41e1b25e9fec50d525361bcfa29bdaa410b2
ada8de
Author: Dave Anderson <anderson@redhat.com>
ada8de
Date:   Wed Jan 8 14:28:39 2020 -0500
ada8de
ada8de
    Fix for support of ELF format kdump vmcores from S390X KASLR kernels.
ada8de
    Without the patch, the crash session fails during initialization with
ada8de
    the error message "crash: vmlinux and vmcore do not match!".
ada8de
    (anderson@redhat.com)
ada8de
ada8de
diff --git a/symbols.c b/symbols.c
ada8de
index 7e1bca7..82ac549 100644
ada8de
--- a/symbols.c
ada8de
+++ b/symbols.c
ada8de
@@ -1,8 +1,8 @@
ada8de
 /* symbols.c - core analysis suite
ada8de
  *
ada8de
  * Copyright (C) 1999, 2000, 2001, 2002 Mission Critical Linux, Inc.
ada8de
- * Copyright (C) 2002-2019 David Anderson
ada8de
- * Copyright (C) 2002-2019 Red Hat, Inc. All rights reserved.
ada8de
+ * Copyright (C) 2002-2020 David Anderson
ada8de
+ * Copyright (C) 2002-2020 Red Hat, Inc. All rights reserved.
ada8de
  *
ada8de
  * This program is free software; you can redistribute it and/or modify
ada8de
  * it under the terms of the GNU General Public License as published by
ada8de
@@ -597,6 +597,11 @@ kaslr_init(void)
ada8de
 	    !machine_type("S390X")) || (kt->flags & RELOC_SET))
ada8de
 		return;
ada8de
 
ada8de
+	if ((string = pc->read_vmcoreinfo("SYMBOL(_stext)"))) {
ada8de
+		kt->vmcoreinfo._stext_SYMBOL = htol(string, RETURN_ON_ERROR, NULL);
ada8de
+		free(string);
ada8de
+	}
ada8de
+
ada8de
 	/*
ada8de
 	 *  --kaslr=auto
ada8de
 	 */
ada8de
@@ -609,8 +614,7 @@ kaslr_init(void)
ada8de
 		st->_stext_vmlinux = UNINITIALIZED;
ada8de
 	}
ada8de
 
ada8de
-	if (machine_type("S390X") &&  /* Linux 5.2 */
ada8de
-	    (symbol_value_from_proc_kallsyms("__kaslr_offset") != BADVAL)) {
ada8de
+	if (machine_type("S390X")) { 
ada8de
 		kt->flags2 |= (RELOC_AUTO|KASLR);
ada8de
 		st->_stext_vmlinux = UNINITIALIZED;
ada8de
 	}
ada8de
@@ -622,12 +626,6 @@ kaslr_init(void)
ada8de
 			kt->flags2 |= KASLR_CHECK;
ada8de
 		}
ada8de
 	} else if (KDUMP_DUMPFILE() || DISKDUMP_DUMPFILE()) {
ada8de
-		if ((string = pc->read_vmcoreinfo("SYMBOL(_stext)"))) {
ada8de
-			kt->vmcoreinfo._stext_SYMBOL =
ada8de
-				htol(string, RETURN_ON_ERROR, NULL);
ada8de
-			free(string);
ada8de
-		}
ada8de
-
ada8de
 		/* Linux 3.14 */
ada8de
 		if ((string = pc->read_vmcoreinfo("KERNELOFFSET"))) {
ada8de
 			free(string);
ada8de
ada8de
commit 6e033fe099f8faea8fe284b9f7c08da7bc3af7a7
ada8de
Author: Dave Anderson <anderson@redhat.com>
ada8de
Date:   Thu Jan 16 11:46:10 2020 -0500
ada8de
ada8de
    Fix for support of S390X standalone dumpfiles and LKCD dumpfiles that
ada8de
    were taken from S390X KASLR kernels.
ada8de
    (zaslonko@linux.ibm.com)
ada8de
ada8de
diff --git a/defs.h b/defs.h
ada8de
index efa40b9..88a47d6 100644
ada8de
--- a/defs.h
ada8de
+++ b/defs.h
ada8de
@@ -6267,6 +6267,8 @@ void get_s390_panicmsg(char *);
ada8de
 /*
ada8de
  *  s390x.c
ada8de
  */
ada8de
+ulong get_stext_relocated_s390x(void);
ada8de
+
ada8de
 #ifdef S390X
ada8de
 void s390x_init(int);
ada8de
 void s390x_dump_machdep_table(ulong);
ada8de
diff --git a/s390x.c b/s390x.c
ada8de
index 8840cc7..e030f93 100644
ada8de
--- a/s390x.c
ada8de
+++ b/s390x.c
ada8de
@@ -455,6 +455,78 @@ static void s390x_check_live(void)
ada8de
 		pc->flags2 |= LIVE_DUMP;
ada8de
 }
ada8de
 
ada8de
+static char *
ada8de
+vmcoreinfo_read_string_s390x(const char *vmcoreinfo, const char *key)
ada8de
+{
ada8de
+	char *value_string = NULL;
ada8de
+	size_t value_length;
ada8de
+	char keybuf[128];
ada8de
+	char *p1, *p2;
ada8de
+
ada8de
+	sprintf(keybuf, "%s=", key);
ada8de
+
ada8de
+	if ((p1 = strstr(vmcoreinfo, keybuf))) {
ada8de
+		p2 = p1 + strlen(keybuf);
ada8de
+		p1 = strstr(p2, "\n");
ada8de
+		value_length = p1-p2;
ada8de
+		value_string = calloc(value_length + 1, sizeof(char));
ada8de
+		strncpy(value_string, p2, value_length);
ada8de
+		value_string[value_length] = NULLCHAR;
ada8de
+	}
ada8de
+
ada8de
+	return value_string;
ada8de
+}
ada8de
+
ada8de
+/*
ada8de
+ * Read _stext symbol from vmcoreinfo when lowcore vmcoreinfo pointer is present
ada8de
+ * in the dump (can be relevant for s390 and lkcd dump formats).
ada8de
+ */
ada8de
+ulong get_stext_relocated_s390x(void)
ada8de
+{
ada8de
+	char *_stext_string, *vmcoreinfo;
ada8de
+	Elf64_Nhdr note;
ada8de
+	char str[128];
ada8de
+	ulong val = 0;
ada8de
+	ulong addr;
ada8de
+
ada8de
+	if (!readmem(S390X_LC_VMCORE_INFO, PHYSADDR, &addr,
ada8de
+		    sizeof(addr), "s390x vmcoreinfo ptr",
ada8de
+		    QUIET|RETURN_ON_ERROR))
ada8de
+		return 0;
ada8de
+	if (addr == 0 ||  addr & 0x1)
ada8de
+		return 0;
ada8de
+	if (!readmem(addr, PHYSADDR, &note,
ada8de
+		     sizeof(note), "Elf64_Nhdr vmcoreinfo",
ada8de
+		     QUIET|RETURN_ON_ERROR))
ada8de
+		return 0;
ada8de
+	memset(str, 0, sizeof(str));
ada8de
+	if (!readmem(addr + sizeof(note), PHYSADDR, str,
ada8de
+		     note.n_namesz, "VMCOREINFO",
ada8de
+		     QUIET|RETURN_ON_ERROR))
ada8de
+		return 0;
ada8de
+	if (memcmp(str, "VMCOREINFO", sizeof("VMCOREINFO")) != 0)
ada8de
+		return 0;
ada8de
+	if ((vmcoreinfo = malloc(note.n_descsz + 1)) == NULL) {
ada8de
+		error(INFO, "s390x: cannot malloc vmcoreinfo buffer\n");
ada8de
+		return 0;
ada8de
+	}
ada8de
+	addr = addr + sizeof(note) + note.n_namesz + 1;
ada8de
+	if (!readmem(addr, PHYSADDR, vmcoreinfo,
ada8de
+		     note.n_descsz, "s390x vmcoreinfo",
ada8de
+		     QUIET|RETURN_ON_ERROR)) {
ada8de
+		free(vmcoreinfo);
ada8de
+		return 0;
ada8de
+	}
ada8de
+	vmcoreinfo[note.n_descsz] = 0;
ada8de
+	if ((_stext_string = vmcoreinfo_read_string_s390x(vmcoreinfo,
ada8de
+							  "SYMBOL(_stext)"))) {
ada8de
+		val = htol(_stext_string, RETURN_ON_ERROR, NULL);
ada8de
+		free(_stext_string);
ada8de
+	}
ada8de
+	free(vmcoreinfo);
ada8de
+	return val;
ada8de
+}
ada8de
+
ada8de
 /*
ada8de
  *  Do all necessary machine-specific setup here.  This is called several
ada8de
  *  times during initialization.
ada8de
@@ -1948,4 +2020,10 @@ s390x_get_kvaddr_ranges(struct vaddr_range *vrp)
ada8de
 
ada8de
 	return cnt;
ada8de
 }
ada8de
-#endif 
ada8de
+#else
ada8de
+#include "defs.h"
ada8de
+ulong get_stext_relocated_s390x(void)
ada8de
+{
ada8de
+	return 0;
ada8de
+}
ada8de
+#endif  /* S390X */
ada8de
diff --git a/symbols.c b/symbols.c
ada8de
index 82ac549..6df3358 100644
ada8de
--- a/symbols.c
ada8de
+++ b/symbols.c
ada8de
@@ -614,7 +614,9 @@ kaslr_init(void)
ada8de
 		st->_stext_vmlinux = UNINITIALIZED;
ada8de
 	}
ada8de
 
ada8de
-	if (machine_type("S390X")) { 
ada8de
+	if (machine_type("S390X")) {
ada8de
+		if (!kt->vmcoreinfo._stext_SYMBOL)
ada8de
+			kt->vmcoreinfo._stext_SYMBOL = get_stext_relocated_s390x();
ada8de
 		kt->flags2 |= (RELOC_AUTO|KASLR);
ada8de
 		st->_stext_vmlinux = UNINITIALIZED;
ada8de
 	}
ada8de
ada8de
commit c6b19715495221dca52a57690419f9df9777573d
ada8de
Author: Dave Anderson <anderson@redhat.com>
ada8de
Date:   Fri Jan 17 13:34:53 2020 -0500
ada8de
ada8de
    Rework the previous patch for support of S390X standalone dumpfiles
ada8de
    and LKCD dumpfiles that were taken from S390X KASLR kernels to avoid
ada8de
    calling an s390x-specific function from generic code.
ada8de
    (zaslonko@linux.ibm.com)
ada8de
ada8de
diff --git a/defs.h b/defs.h
ada8de
index 88a47d6..efa40b9 100644
ada8de
--- a/defs.h
ada8de
+++ b/defs.h
ada8de
@@ -6267,8 +6267,6 @@ void get_s390_panicmsg(char *);
ada8de
 /*
ada8de
  *  s390x.c
ada8de
  */
ada8de
-ulong get_stext_relocated_s390x(void);
ada8de
-
ada8de
 #ifdef S390X
ada8de
 void s390x_init(int);
ada8de
 void s390x_dump_machdep_table(ulong);
ada8de
diff --git a/s390x.c b/s390x.c
ada8de
index e030f93..c07d283 100644
ada8de
--- a/s390x.c
ada8de
+++ b/s390x.c
ada8de
@@ -478,53 +478,72 @@ vmcoreinfo_read_string_s390x(const char *vmcoreinfo, const char *key)
ada8de
 }
ada8de
 
ada8de
 /*
ada8de
- * Read _stext symbol from vmcoreinfo when lowcore vmcoreinfo pointer is present
ada8de
- * in the dump (can be relevant for s390 and lkcd dump formats).
ada8de
+ * Check the value in well-known lowcore location and process it as either
ada8de
+ * an explicit KASLR offset (early dump case) or as vmcoreinfo pointer to
ada8de
+ * read the relocated _stext symbol value (important for s390 and lkcd dump
ada8de
+ * formats).
ada8de
  */
ada8de
-ulong get_stext_relocated_s390x(void)
ada8de
+static void s390x_check_kaslr(void)
ada8de
 {
ada8de
 	char *_stext_string, *vmcoreinfo;
ada8de
 	Elf64_Nhdr note;
ada8de
 	char str[128];
ada8de
-	ulong val = 0;
ada8de
 	ulong addr;
ada8de
 
ada8de
+	/* Read the value from well-known lowcore location*/
ada8de
 	if (!readmem(S390X_LC_VMCORE_INFO, PHYSADDR, &addr,
ada8de
 		    sizeof(addr), "s390x vmcoreinfo ptr",
ada8de
 		    QUIET|RETURN_ON_ERROR))
ada8de
-		return 0;
ada8de
-	if (addr == 0 ||  addr & 0x1)
ada8de
-		return 0;
ada8de
+		return;
ada8de
+	if (addr == 0)
ada8de
+		return;
ada8de
+	/* Check for explicit kaslr offset flag */
ada8de
+	if (addr & 0x1UL) {
ada8de
+		/* Drop the last bit to get an offset value */
ada8de
+		addr &= ~(0x1UL);
ada8de
+		/* Make sure the offset is aligned by 0x1000 */
ada8de
+		if (addr && !(addr & 0xfff)) {
ada8de
+					kt->relocate = addr * (-1);
ada8de
+					kt->flags |= RELOC_SET;
ada8de
+					kt->flags2 |= KASLR;
ada8de
+		}
ada8de
+		return;
ada8de
+	}
ada8de
+	/* Use the addr value as vmcoreinfo pointer */
ada8de
 	if (!readmem(addr, PHYSADDR, &note,
ada8de
 		     sizeof(note), "Elf64_Nhdr vmcoreinfo",
ada8de
 		     QUIET|RETURN_ON_ERROR))
ada8de
-		return 0;
ada8de
+		return;
ada8de
 	memset(str, 0, sizeof(str));
ada8de
 	if (!readmem(addr + sizeof(note), PHYSADDR, str,
ada8de
 		     note.n_namesz, "VMCOREINFO",
ada8de
 		     QUIET|RETURN_ON_ERROR))
ada8de
-		return 0;
ada8de
+		return;
ada8de
 	if (memcmp(str, "VMCOREINFO", sizeof("VMCOREINFO")) != 0)
ada8de
-		return 0;
ada8de
+		return;
ada8de
 	if ((vmcoreinfo = malloc(note.n_descsz + 1)) == NULL) {
ada8de
-		error(INFO, "s390x: cannot malloc vmcoreinfo buffer\n");
ada8de
-		return 0;
ada8de
+		error(INFO, "s390x_check_kaslr: cannot malloc vmcoreinfo buffer\n");
ada8de
+		return;
ada8de
 	}
ada8de
 	addr = addr + sizeof(note) + note.n_namesz + 1;
ada8de
 	if (!readmem(addr, PHYSADDR, vmcoreinfo,
ada8de
 		     note.n_descsz, "s390x vmcoreinfo",
ada8de
 		     QUIET|RETURN_ON_ERROR)) {
ada8de
 		free(vmcoreinfo);
ada8de
-		return 0;
ada8de
+		return;
ada8de
 	}
ada8de
-	vmcoreinfo[note.n_descsz] = 0;
ada8de
+	vmcoreinfo[note.n_descsz] = NULLCHAR;
ada8de
+	/*
ada8de
+	 * Read relocated _stext symbol value and store it in the kernel_table
ada8de
+	 * for further processing within derive_kaslr_offset().
ada8de
+	 */
ada8de
 	if ((_stext_string = vmcoreinfo_read_string_s390x(vmcoreinfo,
ada8de
 							  "SYMBOL(_stext)"))) {
ada8de
-		val = htol(_stext_string, RETURN_ON_ERROR, NULL);
ada8de
+		kt->vmcoreinfo._stext_SYMBOL = htol(_stext_string,
ada8de
+						    RETURN_ON_ERROR, NULL);
ada8de
 		free(_stext_string);
ada8de
 	}
ada8de
 	free(vmcoreinfo);
ada8de
-	return val;
ada8de
 }
ada8de
 
ada8de
 /*
ada8de
@@ -534,8 +553,6 @@ ulong get_stext_relocated_s390x(void)
ada8de
 void
ada8de
 s390x_init(int when)
ada8de
 {
ada8de
-	ulong s390x_lc_kaslr;
ada8de
-
ada8de
 	switch (when)
ada8de
 	{
ada8de
 	case SETUP_ENV:
ada8de
@@ -562,24 +579,8 @@ s390x_init(int when)
ada8de
 		machdep->verify_paddr = generic_verify_paddr;
ada8de
 		machdep->get_kvaddr_ranges = s390x_get_kvaddr_ranges;
ada8de
 		machdep->ptrs_per_pgd = PTRS_PER_PGD;
ada8de
-		if (DUMPFILE() && !(kt->flags & RELOC_SET)) {
ada8de
-			/* Read the value from well-known lowcore location*/
ada8de
-			if (readmem(S390X_LC_VMCORE_INFO, PHYSADDR, &s390x_lc_kaslr,
ada8de
-			    sizeof(s390x_lc_kaslr), "s390x_lc_kaslr",
ada8de
-			    QUIET|RETURN_ON_ERROR)) {
ada8de
-				/* Check for explicit kaslr offset flag */
ada8de
-				if (s390x_lc_kaslr & 0x1UL) {
ada8de
-					/* Drop the last bit to get an offset value */
ada8de
-					s390x_lc_kaslr &= ~(0x1UL);
ada8de
-					/* Make sure the offset is aligned by 0x1000 */
ada8de
-					if (s390x_lc_kaslr && !(s390x_lc_kaslr & 0xfff)) {
ada8de
-						kt->relocate = s390x_lc_kaslr * (-1);
ada8de
-						kt->flags |= RELOC_SET;
ada8de
-						kt->flags2 |= KASLR;
ada8de
-					}
ada8de
-				}
ada8de
-			}
ada8de
-		}
ada8de
+		if (DUMPFILE() && !(kt->flags & RELOC_SET))
ada8de
+			s390x_check_kaslr();
ada8de
 		break;
ada8de
 
ada8de
 	case PRE_GDB:
ada8de
@@ -2020,10 +2021,4 @@ s390x_get_kvaddr_ranges(struct vaddr_range *vrp)
ada8de
 
ada8de
 	return cnt;
ada8de
 }
ada8de
-#else
ada8de
-#include "defs.h"
ada8de
-ulong get_stext_relocated_s390x(void)
ada8de
-{
ada8de
-	return 0;
ada8de
-}
ada8de
 #endif  /* S390X */
ada8de
diff --git a/symbols.c b/symbols.c
ada8de
index 6df3358..f04e8b5 100644
ada8de
--- a/symbols.c
ada8de
+++ b/symbols.c
ada8de
@@ -597,7 +597,8 @@ kaslr_init(void)
ada8de
 	    !machine_type("S390X")) || (kt->flags & RELOC_SET))
ada8de
 		return;
ada8de
 
ada8de
-	if ((string = pc->read_vmcoreinfo("SYMBOL(_stext)"))) {
ada8de
+	if (!kt->vmcoreinfo._stext_SYMBOL &&
ada8de
+	    (string = pc->read_vmcoreinfo("SYMBOL(_stext)"))) {
ada8de
 		kt->vmcoreinfo._stext_SYMBOL = htol(string, RETURN_ON_ERROR, NULL);
ada8de
 		free(string);
ada8de
 	}
ada8de
@@ -615,8 +616,6 @@ kaslr_init(void)
ada8de
 	}
ada8de
 
ada8de
 	if (machine_type("S390X")) {
ada8de
-		if (!kt->vmcoreinfo._stext_SYMBOL)
ada8de
-			kt->vmcoreinfo._stext_SYMBOL = get_stext_relocated_s390x();
ada8de
 		kt->flags2 |= (RELOC_AUTO|KASLR);
ada8de
 		st->_stext_vmlinux = UNINITIALIZED;
ada8de
 	}
ada8de
ada8de
commit 6c1c8ac6b3c877e6facd6f2807ba721ddbc4597b
ada8de
Author: Dave Anderson <anderson@redhat.com>
ada8de
Date:   Wed Jan 29 11:10:26 2020 -0500
ada8de
ada8de
    Fix for a gcc-10 compilation error.  Without the patch, the build of
ada8de
    the crash library fails with a stream of error messages indicating
ada8de
    "multiple definition of 'diskdump_flags'"
ada8de
    (anderson@redhat.com)
ada8de
ada8de
diff --git a/defs.h b/defs.h
ada8de
index efa40b9..ac24a5d 100644
ada8de
--- a/defs.h
ada8de
+++ b/defs.h
ada8de
@@ -1,8 +1,8 @@
ada8de
 /* defs.h - core analysis suite
ada8de
  *
ada8de
  * Copyright (C) 1999, 2000, 2001, 2002 Mission Critical Linux, Inc.
ada8de
- * Copyright (C) 2002-2019 David Anderson
ada8de
- * Copyright (C) 2002-2019 Red Hat, Inc. All rights reserved.
ada8de
+ * Copyright (C) 2002-2020 David Anderson
ada8de
+ * Copyright (C) 2002-2020 Red Hat, Inc. All rights reserved.
ada8de
  * Copyright (C) 2002 Silicon Graphics, Inc.
ada8de
  *
ada8de
  * This program is free software; you can redistribute it and/or modify
ada8de
@@ -6447,7 +6447,7 @@ FILE *set_diskdump_fp(FILE *);
ada8de
 void get_diskdump_regs(struct bt_info *, ulong *, ulong *);
ada8de
 int diskdump_phys_base(unsigned long *);
ada8de
 int diskdump_set_phys_base(unsigned long);
ada8de
-ulong *diskdump_flags;
ada8de
+extern ulong *diskdump_flags;
ada8de
 int is_partial_diskdump(void);
ada8de
 int get_dump_level(void);
ada8de
 int dumpfile_is_split(void);