From: Simon Horman <horms@verge.net.au>
To: Dave Anderson <anderson@redhat.com>
Cc: kexec@lists.infradead.org
Subject: Re: FYI: x86_64 bug when using gdb with vmcore
Date: Wed, 17 Feb 2010 18:18:39 +1100 [thread overview]
Message-ID: <20100217071839.GB27742@verge.net.au> (raw)
In-Reply-To: <773792816.1109361265388798774.JavaMail.root@zmail05.collab.prod.int.phx2.redhat.com>
On Fri, Feb 05, 2010 at 11:53:18AM -0500, Dave Anderson wrote:
>
> The kexec/arch/x86_64/crashdump-x86_64.h file contains a
> stale PAGE_OFFSET value. In 2.6.27 it was changed from
> 0xffff810000000000UL to 0xffff880000000000UL. This is
> only a problem when using gdb with the vmlinux/vmcore
> pair, because gdb relies upon the PT_LOAD segment's p_vaddr
> values in the ELF header to be correct.
>
> Anyway, in the RHEL6 kexec-tools, this simple patch
> was made:
>
> -#define PAGE_OFFSET 0xffff810000000000UL
> +#define PAGE_OFFSET 0xffff880000000000UL
>
> which is OK since the RHEL6 version of kexec-tools
> will only be used with RHEL6 kernels.
>
> But for backwards compatibility, the better way to do
> it would be to check the utsname of the running kernel,
> and use the right value.
>
> But again, this is only required for gdb usage. The
> crash utility (and makedumpfile) make kernel version checks
> to determine which x86_64 PAGE_OFFSET value is applicable,
> and don't rely on the ELF header p_vaddr values for
> the unity-mapped regions.
Hi Dave,
Something like this?
----------------------------------------------------------------------
x86_64: use correct PAGE_OFFSET
This fixes a bug when using gdb with vmcore
as explained by Dave Anderson:
The kexec/arch/x86_64/crashdump-x86_64.h file contains a
stale PAGE_OFFSET value. In 2.6.27 it was changed from
0xffff810000000000UL to 0xffff880000000000UL. This is
only a problem when using gdb with the vmlinux/vmcore
pair, because gdb relies upon the PT_LOAD segment's p_vaddr
values in the ELF header to be correct.
Cc: Dave Anderson <anderson@redhat.com>
Signed-off-by: Simon Horman <horms@verge.net.au>
Index: kexec-tools/kexec/arch/x86_64/crashdump-x86_64.c
===================================================================
--- kexec-tools.orig/kexec/arch/x86_64/crashdump-x86_64.c 2010-02-17 16:04:18.000000000 +1100
+++ kexec-tools/kexec/arch/x86_64/crashdump-x86_64.c 2010-02-17 16:18:42.000000000 +1100
@@ -36,15 +36,6 @@
#include "crashdump-x86_64.h"
#include <x86/x86-linux.h>
-static struct crash_elf_info elf_info =
-{
- class: ELFCLASS64,
- data: ELFDATA2LSB,
- machine: EM_X86_64,
- backup_src_start: BACKUP_SRC_START,
- backup_src_end: BACKUP_SRC_END,
- page_offset: PAGE_OFFSET,
-};
/* Forward Declaration. */
static int exclude_region(int *nr_ranges, uint64_t start, uint64_t end);
@@ -604,6 +595,16 @@ int load_crashdump_segments(struct kexec
int nr_ranges, align = 1024, i;
struct memory_range *mem_range, *memmap_p;
+ struct crash_elf_info elf_info =
+ {
+ class: ELFCLASS64,
+ data: ELFDATA2LSB,
+ machine: EM_X86_64,
+ backup_src_start: BACKUP_SRC_START,
+ backup_src_end: BACKUP_SRC_END,
+ page_offset: page_offset,
+ };
+
if (get_kernel_paddr(info))
return -1;
Index: kexec-tools/kexec/arch/x86_64/crashdump-x86_64.h
===================================================================
--- kexec-tools.orig/kexec/arch/x86_64/crashdump-x86_64.h 2010-02-17 16:04:18.000000000 +1100
+++ kexec-tools/kexec/arch/x86_64/crashdump-x86_64.h 2010-02-17 17:41:10.000000000 +1100
@@ -1,12 +1,16 @@
#ifndef CRASHDUMP_X86_64_H
#define CRASHDUMP_X86_64_H
+#include "../../kexec.h"
+
int load_crashdump_segments(struct kexec_info *info, char *mod_cmdline,
unsigned long max_addr, unsigned long min_base);
#define __START_KERNEL_map 0xffffffff80000000UL
-#define PAGE_OFFSET 0xffff810000000000UL
-#define __pa(x) (((unsigned long)(x)>=__START_KERNEL_map)?(unsigned long)(x) - (unsigned long)__START_KERNEL_map:(unsigned long)(x) - PAGE_OFFSET)
+
+extern unsigned long page_offset;
+
+#define __pa(x) (((unsigned long)(x)>=__START_KERNEL_map)?(unsigned long)(x) - (unsigned long)__START_KERNEL_map:(unsigned long)(x) - page_offset)
#define MAXMEM 0x3fffffffffffUL
Index: kexec-tools/kexec/kexec.c
===================================================================
--- kexec-tools.orig/kexec/kexec.c 2010-02-17 16:04:18.000000000 +1100
+++ kexec-tools/kexec/kexec.c 2010-02-17 16:11:06.000000000 +1100
@@ -1041,6 +1041,8 @@ int main(int argc, char *argv[])
};
static const char short_options[] = KEXEC_OPT_STR;
+ arch_init();
+
opterr = 0; /* Don't complain about unrecognized options here */
while ((opt = getopt_long(argc, argv, short_options,
options, 0)) != -1) {
Index: kexec-tools/kexec/Makefile
===================================================================
--- kexec-tools.orig/kexec/Makefile 2010-02-17 16:06:32.000000000 +1100
+++ kexec-tools/kexec/Makefile 2010-02-17 16:11:11.000000000 +1100
@@ -44,6 +44,8 @@ $(ARCH)_ADD_BUFFER = kexec/add_buffer.c
KEXEC_SRCS += $($(ARCH)_ADD_BUFFER)
$(ARCH)_ARCH_REUSE_INITRD = kexec/arch_reuse_initrd.c
KEXEC_SRCS += $($(ARCH)_ARCH_REUSE_INITRD)
+$(ARCH)_ARCH_INIT = kexec/arch_init.c
+KEXEC_SRCS += $($(ARCH)_ARCH_INIT)
include $(srcdir)/kexec/arch/alpha/Makefile
include $(srcdir)/kexec/arch/arm/Makefile
Index: kexec-tools/kexec/arch/x86_64/Makefile
===================================================================
--- kexec-tools.orig/kexec/arch/x86_64/Makefile 2010-02-17 17:33:59.000000000 +1100
+++ kexec-tools/kexec/arch/x86_64/Makefile 2010-02-17 17:36:22.000000000 +1100
@@ -13,6 +13,8 @@ x86_64_KEXEC_SRCS += kexec/arch/x86_64/k
x86_64_KEXEC_SRCS += kexec/arch/x86_64/kexec-elf-x86_64.c
x86_64_KEXEC_SRCS += kexec/arch/x86_64/kexec-elf-rel-x86_64.c
+x86_64_ARCH_INIT = kexec/arch/x86_64/arch_init.c
+
dist += kexec/arch/x86_64/Makefile $(x86_64_KEXEC_SRCS) \
kexec/arch/x86_64/kexec-x86_64.h kexec/arch/x86_64/crashdump-x86_64.h \
kexec/arch/x86_64/include/arch/options.h
Index: kexec-tools/kexec/arch/x86_64/arch_init.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ kexec-tools/kexec/arch/x86_64/arch_init.c 2010-02-17 18:06:52.000000000 +1100
@@ -0,0 +1,83 @@
+#include <errno.h>
+#include <string.h>
+#include <sys/utsname.h>
+#include <stdlib.h>
+#include <limits.h>
+#include <stdio.h>
+
+#include "crashdump-x86_64.h"
+
+#define KERNEL_VERSION(major, minor, patch) \
+ (((major) << 16) | ((minor) << 8) | patch)
+
+long kernel_version(void)
+{
+ struct utsname utsname;
+ unsigned long major, minor, patch;
+ char *p;
+
+ if (uname(&utsname) < 0) {
+ fprintf(stderr, "uname failed: %s\n", strerror(errno));
+ return -1;
+ }
+
+ p = utsname.release;
+ major = strtoul(p, &p, 10);
+ if (major == ULONG_MAX) {
+ fprintf(stderr, "strtoul failed: %s\n", strerror(errno));
+ return -1;
+ }
+
+ if (*p++ != '.') {
+ fprintf(stderr, "Unsupported utsname.release: %s\n",
+ utsname.release);
+ return -1;
+ }
+
+ minor = strtoul(p, &p, 10);
+ if (major == ULONG_MAX) {
+ fprintf(stderr, "strtoul failed: %s\n", strerror(errno));
+ return -1;
+ }
+
+ if (*p++ != '.') {
+ fprintf(stderr, "Unsupported utsname.release: %s\n",
+ utsname.release);
+ return -1;
+ }
+
+ patch = strtoul(p, &p, 10);
+ if (major == ULONG_MAX) {
+ fprintf(stderr, "strtoul failed: %s\n", strerror(errno));
+ return -1;
+ }
+
+ if (major >= 256 || minor >= 256 || patch >= 256) {
+ fprintf(stderr, "Unsupported utsname.release: %s\n",
+ utsname.release);
+ return -1;
+ }
+
+ return KERNEL_VERSION(major, minor, patch);
+}
+
+#define PAGE_OFFSET_PRE_2_6_27 0xffff810000000000UL
+#define PAGE_OFFSET 0xffff880000000000UL
+
+unsigned long page_offset;
+
+int arch_init(void)
+{
+ int kv;
+
+ kv = kernel_version();
+ if (kv < 0)
+ return -1;
+
+ if (kv < KERNEL_VERSION(2, 4, 27))
+ page_offset = PAGE_OFFSET_PRE_2_6_27;
+ else
+ page_offset = PAGE_OFFSET;
+
+ return 0;
+}
Index: kexec-tools/kexec/arch_init.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ kexec-tools/kexec/arch_init.c 2010-02-17 16:12:14.000000000 +1100
@@ -0,0 +1,4 @@
+int arch_init(void)
+{
+ return 0;
+}
Index: kexec-tools/kexec/kexec.h
===================================================================
--- kexec-tools.orig/kexec/kexec.h 2010-02-17 16:12:44.000000000 +1100
+++ kexec-tools/kexec/kexec.h 2010-02-17 16:13:03.000000000 +1100
@@ -249,6 +249,8 @@ int kexec_iomem_for_each_line(char *matc
int parse_iomem_single(char *str, uint64_t *start, uint64_t *end);
const char * proc_iomem(void);
+int arch_init(void);
+
extern int add_backup_segments(struct kexec_info *info,
unsigned long backup_base,
unsigned long backup_size);
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
next prev parent reply other threads:[~2010-02-17 7:18 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <539140123.1108061265388145735.JavaMail.root@zmail05.collab.prod.int.phx2.redhat.com>
2010-02-05 16:53 ` FYI: x86_64 bug when using gdb with vmcore Dave Anderson
2010-02-17 7:18 ` Simon Horman [this message]
[not found] <571350993.1786101266414411140.JavaMail.root@zmail05.collab.prod.int.phx2.redhat.com>
2010-02-17 13:49 ` Dave Anderson
2010-02-18 0:40 ` Simon Horman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20100217071839.GB27742@verge.net.au \
--to=horms@verge.net.au \
--cc=anderson@redhat.com \
--cc=kexec@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.