Compare commits

..

No commits in common. "c9s" and "c8" have entirely different histories.
c9s ... c8

19 changed files with 714 additions and 338 deletions

View File

@ -0,0 +1 @@
70f9352418f658080e988d5b7e7d3b4ce6a98f99 SOURCES/crash-gcore-command-1.6.3.tar.gz

2
.gitignore vendored
View File

@ -1 +1 @@
/crash-gcore-command-1.6.4.tar.gz
SOURCES/crash-gcore-command-1.6.3.tar.gz

View File

@ -1,60 +0,0 @@
From 33f3c97f7d45c8bb1b43a8d551cb01a9873bb123 Mon Sep 17 00:00:00 2001
From: HATAYAMA Daisuke <d.hatayama@fujitsu.com>
Date: Tue, 28 Feb 2023 03:59:16 -0500
Subject: [PATCH 1/2] coredump: fix building failure due to undefined macros
MAPLE_TREE_{COUNT,GATHER}
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
As of the commit 13794ace3830bf0274fe7b2e0e579ad72e31848f (coredump:
fix failure of executing gcore command due to introduction of maple
tree management on vma list), gcore.so fails to get built with the
following error messages with defs.h without maple tree API support:
libgcore/gcore_coredump.c:189:50: error: MAPLE_TREE_COUNT undeclared (first use in this function); did you mean RADIX_TREE_COUNT?
189 | entry_num = do_maple_tree(mm_mt, MAPLE_TREE_COUNT, NULL);
| ^~~~~~~~~~~~~~~~
| RADIX_TREE_COUNT
libgcore/gcore_coredump.c:189:50: note: each undeclared identifier is reported only once for each function it appears in
libgcore/gcore_coredump.c:191:38: error: MAPLE_TREE_GATHER undeclared (first use in this function); did you mean RADIX_TREE_GATHER?
191 | do_maple_tree(mm_mt, MAPLE_TREE_GATHER, entry_list);
| ^~~~~~~~~~~~~~~~~
| RADIX_TREE_GATHER
This is caused by the missing macros MAPLE_TREE_COUNT and
MAPLE_TREE_GATHER.
To fix the issue, define the two macros within crash gcore so that
build is successfully done expecting the resulting binary works well
when it is ran against new crash utility that has maple tree API
support.
Signed-off-by: HATAYAMA Daisuke <d.hatayama@fujitsu.com>
Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
---
src/libgcore/gcore_coredump.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/src/libgcore/gcore_coredump.c b/src/libgcore/gcore_coredump.c
index fa744d4c26a5..8eece96777be 100644
--- a/src/libgcore/gcore_coredump.c
+++ b/src/libgcore/gcore_coredump.c
@@ -128,6 +128,14 @@ void gcore_readmem_user(ulong addr, void *buf, long size, char *type)
}
}
+#if !defined(MAPLE_TREE_COUNT)
+#define MAPLE_TREE_COUNT (1)
+#endif
+
+#if !defined(MAPLE_TREE_GATHER)
+#define MAPLE_TREE_GATHER (4)
+#endif
+
ulong __attribute__((weak))
do_maple_tree(ulong root, int flag, struct list_pair *lp)
{
--
2.45.1

View File

@ -1,47 +0,0 @@
From 62b8d5005eaa9014467db85cfe268e65c6679f4c Mon Sep 17 00:00:00 2001
From: Tao Liu <ltao@redhat.com>
Date: Mon, 4 Nov 2024 17:11:19 +1300
Subject: [PATCH 1/2] gcore: update set_context with upstream counterpart
With the introduction of upstream commit "Preparing for gdb stack unwind
support" [1], the function set_context() is added by a 3rd parameter. Without
this patch, the compiliation of gcore will fail.
The 3rd parameter of set_context() is used to sync the context of crash and
gdb, so gdb can hold the the value of registers of current crash's task
context, and gdb can output the stack unwinding for current task.
This have nothing to do with gcore, so simply set the 3rd parameter as FALSE.
[1]: https://github.com/lian-bo/crash/commit/d75d15d31b92f8882ccb15c960665e2c8a8d1c28
Signed-off-by: Tao Liu <ltao@redhat.com>
---
src/gcore.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/gcore.c b/src/gcore.c
index 47a9c0d..a79f69b 100644
--- a/src/gcore.c
+++ b/src/gcore.c
@@ -306,7 +306,7 @@ static void do_gcore(char *arg)
if (tc != CURRENT_CONTEXT()) {
gcore->orig_task = CURRENT_TASK();
- (void) set_context(tc->task, NO_PID);
+ (void) set_context(tc->task, NO_PID, FALSE);
}
snprintf(gcore->corename, CORENAME_MAX_SIZE + 1, "core.%lu.%s",
@@ -340,7 +340,7 @@ static void do_gcore(char *arg)
}
if (gcore->orig_task)
- (void)set_context(gcore->orig_task, NO_PID);
+ (void)set_context(gcore->orig_task, NO_PID, FALSE);
}
--
2.47.0

View File

@ -1,67 +0,0 @@
From b3af265aa60251f282145bb0eee3b83d8a15ebb7 Mon Sep 17 00:00:00 2001
From: HATAYAMA Daisuke <d.hatayama@fujitsu.com>
Date: Mon, 18 Sep 2023 20:45:11 -0400
Subject: [PATCH 2/2] x86: fix extend gcore.so taking much time like more than
1 hour when huge thread group is present
extend gcore.so command takes lengthy time such as more than 1 hour
when huge thread group is present.
The root cause of this issue is that we never take into account time
complexity of function gcore_arch_vsyscall_has_vm_alwaysdump_flag()
sufficiently, which iterates the task list and vma lists of each task
to detect existence of VM_ALWAYS flag in a given crash dump and so has
O(nm) where the n is the length of the task list and the m is the
total number of vma among all tasks.
To fix this issue, skip this process for the kernels whose version is
equal to or larger than v3.4.0.
Originally, this process was implemented to detect existence of
VM_ALWAYS flag that was removed at the commit
909af768e88867016f427264ae39d27a57b6a8ed (coredump: remove
VM_ALWAYSDUMP flag) included at Linux kernel v3.4. However, the base
kernel version of RHEL7.0 GA is 3.10.0-123.el7. Hence, the kernels for
RHEL7 and later have included the commit. For RHEL7 and later, it's
sufficient to conclude absence of the flag by checking kernel version
of a given crash dump.
The issue could still remain on RHEL6 and older, but we think it's
acceptable because today we rarely handle crash dump files of RHEL6
and older.
Signed-off-by: HATAYAMA Daisuke <d.hatayama@fujitsu.com>
Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
---
src/libgcore/gcore_x86.c | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/src/libgcore/gcore_x86.c b/src/libgcore/gcore_x86.c
index 8878f79d4c08..3ddf5109ade0 100644
--- a/src/libgcore/gcore_x86.c
+++ b/src/libgcore/gcore_x86.c
@@ -2502,6 +2502,21 @@ int gcore_arch_vsyscall_has_vm_alwaysdump_flag(void)
struct task_context *tc;
int i;
+ /*
+ * The commit 909af768e88867016f427264ae39d27a57b6a8ed
+ * (coredump: remove VM_ALWAYSDUMP flag) of the Linux kernel
+ * was merged at v3.4. We can say VM_ALWAYSDUMP flag doesn't
+ * exist for the version 3.4.0 or later. The base kernel
+ * version of RHEL7.0 GA is 3.10.0-123.el7. Hence, this
+ * condition is expected to match RHEL7 and later RHEL major
+ * versions. On the other hand, the commit
+ * 909af768e88867016f427264ae39d27a57b6a8ed was backported
+ * into the kernel package in RHEL6 and the exploring code is
+ * still needed.
+ */
+ if (THIS_KERNEL_VERSION >= LINUX(3, 4, 0))
+ return FALSE;
+
/*
* For simplicity, consider that VM_ALWAYSDUMP was already not
* present when maple tree was introduced.
--
2.45.1

View File

@ -1,85 +0,0 @@
From e03ff7341a9a624a46cea4e60ee097606b1687a8 Mon Sep 17 00:00:00 2001
From: HATAYAMA Daisuke <d.hatayama@fujitsu.com>
Date: Sat, 23 Nov 2024 17:30:41 +0900
Subject: [PATCH 2/2] x86: fix the issue that core files for 64-bit tasks are
generated in the 32-bit format
Core files for 64-bit tasks are falsely generated in the 32-bit
formats.
The root cause of this issue is that location of saving register
values on kernel stacks is changed by the kernel commit
65c9cc9e2c14602d98f1ca61c51ac954e9529303 (x86/fred: Reserve space for
the FRED stack frame) in Linux kernel 6.9-rc1 to add some reserved
area for FRED feature and gcore doesn't take this into
consideration. Hence, the value of CS register retrieved from kernel
stacks based on the existing logic is wrong and thus checking
execution mode of a given task based on the value also works wrong.
To fix this issue, let's take the FRED feature into account. If FRED
data structure is defined, retrieve register values from the address
next to the reserved for the FRED feature.
This logic is borrowed from the commit
48764a14bc5856f0b0bb30685336c68b832154fc (x86_64: fix for adding
top_of_kernel_stack_padding for kernel stack) and the commit
196c4b79c13d1c0e6d7b21c8321eca07d3838d6a (X86 64: fix a regression
issue about kernel stack padding) of crash utility.
---
src/libgcore/gcore_x86.c | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/src/libgcore/gcore_x86.c b/src/libgcore/gcore_x86.c
index 3ddf510..4f43956 100644
--- a/src/libgcore/gcore_x86.c
+++ b/src/libgcore/gcore_x86.c
@@ -514,10 +514,11 @@ convert_from_fxsr(struct user_i387_ia32_struct *env, struct task_context *target
char *pt_regs_buf;
uint16_t ds;
struct machine_specific *ms = machdep->machspec;
+ ulong padding_size = VALID_SIZE(fred_frame) > 0 ? (2 * 8) : 0;
pt_regs_buf = GETBUF(SIZE(pt_regs));
- readmem(machdep->get_stacktop(target->task) - SIZE(pt_regs),
+ readmem(machdep->get_stacktop(target->task) - padding_size - SIZE(pt_regs),
KVADDR, pt_regs_buf, SIZE(pt_regs),
"convert_from_fxsr: regs",
gcore_verbose_error_handle());
@@ -1837,6 +1838,7 @@ static int genregs_get(struct task_context *target,
struct user_regs_struct active_regs;
const int active = is_task_active(target->task);
struct machine_specific *ms = machdep->machspec;
+ ulong padding_size = VALID_SIZE(fred_frame) > 0 ? (2 * 8) : 0;
BZERO(regs, sizeof(*regs));
@@ -1854,7 +1856,7 @@ static int genregs_get(struct task_context *target,
*/
pt_regs_buf = GETBUF(SIZE(pt_regs));
- readmem(machdep->get_stacktop(target->task) - SIZE(pt_regs), KVADDR,
+ readmem(machdep->get_stacktop(target->task) - padding_size - SIZE(pt_regs), KVADDR,
pt_regs_buf, SIZE(pt_regs), "genregs_get: pt_regs",
gcore_verbose_error_handle());
@@ -2188,6 +2190,7 @@ static int genregs_get32(struct task_context *target,
struct user_regs_struct *regs = (struct user_regs_struct *)buf;
char *pt_regs_buf;
ulonglong pt_regs_addr;
+ ulong padding_size = VALID_SIZE(fred_frame) > 0 ? (2 * 8) : 0;
if (is_task_active(target->task) && KVMDUMP_DUMPFILE()) {
get_regs_from_kvmdump_notes(target, regs);
@@ -2198,7 +2201,7 @@ static int genregs_get32(struct task_context *target,
pt_regs_buf = GETBUF(SIZE(pt_regs));
- pt_regs_addr = machdep->get_stacktop(target->task) - SIZE(pt_regs);
+ pt_regs_addr = machdep->get_stacktop(target->task) - padding_size - SIZE(pt_regs);
/*
* The commit 07b047fc2466249aff7cdb23fa0b0955a7a00d48
--
2.47.0

View File

@ -1,3 +0,0 @@
# crash-gcore-command
The crash-gcore-command package

View File

@ -0,0 +1,53 @@
From 4731ebf085fe6322ba8c7ca14918d3cab2186cf0 Mon Sep 17 00:00:00 2001
From: HATAYAMA Daisuke <d.hatayama@fujitsu.com>
Date: Fri, 25 Feb 2022 04:45:37 -0500
Subject: [PATCH 1/3] coredump: use MEMBER_{OFFSET, SIZE} instead of
GCORE_{OFFSET, SIZE}
fill_auxv_note() and compat_fill_auxv_note() is called just once each
time gcore command is invoked because each process has just one
NT_AUXV. This means using MEMBER_{OFFSET, SIZE} is enough; using
GCORE_{OFFSET, SIZE} is overkill.
Signed-off-by: HATAYAMA Daisuke <d.hatayama@fujitsu.com>
---
src/libgcore/gcore_coredump.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/src/libgcore/gcore_coredump.c b/src/libgcore/gcore_coredump.c
index 3d0c0fcce61e..6f57b21b62b6 100644
--- a/src/libgcore/gcore_coredump.c
+++ b/src/libgcore/gcore_coredump.c
@@ -930,11 +930,11 @@ fill_auxv_note(struct elf_note_info *info, struct task_context *tc,
ulong *auxv;
int i;
- auxv = (ulong *)GETBUF(GCORE_SIZE(mm_struct_saved_auxv));
+ auxv = (ulong *)GETBUF(MEMBER_SIZE("mm_struct", "saved_auxv"));
readmem(task_mm(tc->task, FALSE) +
- GCORE_OFFSET(mm_struct_saved_auxv), KVADDR, auxv,
- GCORE_SIZE(mm_struct_saved_auxv), "fill_auxv_note",
+ MEMBER_OFFSET("mm_struct", "saved_auxv"), KVADDR, auxv,
+ MEMBER_SIZE("mm_struct", "saved_auxv"), "fill_auxv_note",
gcore_verbose_error_handle());
i = 0;
@@ -956,11 +956,11 @@ compat_fill_auxv_note(struct elf_note_info *info,
uint32_t *auxv;
int i;
- auxv = (uint32_t *)GETBUF(GCORE_SIZE(mm_struct_saved_auxv));
+ auxv = (uint32_t *)GETBUF(MEMBER_SIZE("mm_struct", "saved_auxv"));
readmem(task_mm(tc->task, FALSE) +
- GCORE_OFFSET(mm_struct_saved_auxv), KVADDR, auxv,
- GCORE_SIZE(mm_struct_saved_auxv), "fill_auxv_note32",
+ MEMBER_OFFSET("mm_struct", "saved_auxv"), KVADDR, auxv,
+ MEMBER_SIZE("mm_struct", "saved_auxv"), "fill_auxv_note32",
gcore_verbose_error_handle());
i = 0;
--
2.30.2

View File

@ -0,0 +1,114 @@
From 03f9360715731f18e4fdae7b30aa34b30dddcd57 Mon Sep 17 00:00:00 2001
From: HATAYAMA Daisuke <d.hatayama@fujitsu.com>
Date: Sat, 26 Mar 2022 21:42:02 +0900
Subject: [PATCH 1/5] x86: Fix failure of collecting vsyscall mapping due to
change of enum type of vsyscall_mode
vsyscall mapping fails to get collected because the commit
bd49e16e3339 (x86/vsyscall: Add a new vsyscall=xonly mode) merged at
kernel v5.2-rc7 added constant XONLY to the anonymous enumeration type
of variable vsyscall_mode, which made the value of constant NONE
change from 1 to 2.
This commit fixes the issue by checking the value of constant NONE
using gdb's print command and typeof operator since there's no utility
function to handle such anonymous enumeration type currently in crash
utility.
Signed-off-by: HATAYAMA Daisuke <d.hatayama@fujitsu.com>
Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
---
src/libgcore/gcore_x86.c | 56 ++++++++++++++++++++++++++++++++++++++--
1 file changed, 54 insertions(+), 2 deletions(-)
diff --git a/src/libgcore/gcore_x86.c b/src/libgcore/gcore_x86.c
index 08e573c741f6..f334a85d4240 100644
--- a/src/libgcore/gcore_x86.c
+++ b/src/libgcore/gcore_x86.c
@@ -41,6 +41,9 @@ struct gcore_x86_table
static struct gcore_x86_table gcore_x86_table;
struct gcore_x86_table *gxt = &gcore_x86_table;
+static void gdb_run_command(char *cmd, char *buf, size_t size);
+static int get_vsyscall_mode_none(void);
+
#ifdef X86_64
static ulong gcore_x86_64_get_old_rsp(int cpu);
static ulong gcore_x86_64_get_per_cpu__old_rsp(int cpu);
@@ -2367,6 +2370,54 @@ int gcore_is_arch_32bit_emulation(struct task_context *tc)
return FALSE;
}
+static void gdb_run_command(char *cmd, char *buf, size_t size)
+{
+ open_tmpfile();
+ if (!gdb_pass_through(cmd,
+ pc->tmpfile,
+ GNU_RETURN_ON_ERROR)) {
+ close_tmpfile();
+ error(FATAL, "gdb command failed: %s", cmd);
+ }
+ rewind(pc->tmpfile);
+ fgets(buf, size, pc->tmpfile);
+ close_tmpfile();
+}
+
+static int get_vsyscall_mode_none(void)
+{
+ static int none = -1;
+ char cmd[32], buf[BUFSIZE];
+ int i;
+
+ if (none != -1)
+ return none;
+
+ /*
+ * Variable vsyscall_mode is of anonymous enumeration
+ * type. Because there's no utility function in crash utility
+ * to get value of each constant in specified anonymous
+ * enumeration type, we have no choice but rely on gdb's print
+ * command in combination with typeof operator.
+ */
+ for (i = 0; i < 10; ++i) {
+ snprintf(cmd, sizeof(cmd), "p (typeof(vsyscall_mode))%d", i);
+ gdb_run_command(cmd, buf, sizeof(buf));
+ if (strstr(buf, "NONE"))
+ return none = i;
+ }
+
+ /*
+ * When the above logic doesn't work as expected, use 2, which
+ * is the value on the definition where vsyscall_mode was
+ * first introduced at the commit 3ae36655b97a (x86-64: Rework
+ * vsyscall emulation and add vsyscall= parameter).
+ */
+ none = 2;
+
+ return none;
+}
+
/**
* Return an address to gate_vma.
*/
@@ -2377,7 +2428,8 @@ ulong gcore_arch_get_gate_vma(void)
return 0UL;
if (symbol_exists("vsyscall_mode")) {
- enum { ENUMERATE, NONE } vsyscall_mode;
+ int vsyscall_mode;
+ int none = get_vsyscall_mode_none();
readmem(symbol_value("vsyscall_mode"),
KVADDR,
@@ -2386,7 +2438,7 @@ ulong gcore_arch_get_gate_vma(void)
"gcore_arch_get_gate_vma: vsyscall_mode",
gcore_verbose_error_handle());
- if (vsyscall_mode == NONE)
+ if (vsyscall_mode == none)
return 0UL;
}
--
2.37.1

View File

@ -0,0 +1,59 @@
From 1ba701c1d7bd94cc5a02f51652712acdcbf0875c Mon Sep 17 00:00:00 2001
From: Vincent Whitchurch <vincent.whitchurch@axis.com>
Date: Tue, 21 Jun 2022 09:15:33 +0000
Subject: [PATCH 2/5] coredump: fix segmentation fault caused by type mismatch
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
crash gcore command on ARM sometimes results in segmentation fault:
crash> gcore -v 0
Segmentation fault (core dumped)
This is caused by type mismatch of a variable paddr in function
gcore_readmem_user() to hold a physical address, which is indicated by
the following warning message:
libgcore/gcore_coredump.c: In function gcore_readmem_user:
libgcore/gcore_coredump.c:85:26: warning: passing argument 2 of
uvtop_quiet from incompatible pointer type
[-Wincompatible-pointer-types]
if (!uvtop_quiet(addr, &paddr)) {
^~~~~~
libgcore/gcore_coredump.c:71:49: note: expected physaddr_t * {aka
long long unsigned int *} but argument is of type ulong * {aka long
unsigned int *}
static int uvtop_quiet(ulong vaddr, physaddr_t *paddr);
~~~~~~~~~~~~^~~~~
On ARM, long unsigned int has 4 byte length, while physaddr_t has 8
byte length. The mismatch causes overwriting of stack variables.
Fix this by changing the type of the variable paddr to physaddr_t.
Signed-off-by: Vincent Whitchurch <vincent.whitchurch@axis.com>
Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
---
src/libgcore/gcore_coredump.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/libgcore/gcore_coredump.c b/src/libgcore/gcore_coredump.c
index c14cc116e951..424b0a40a42b 100644
--- a/src/libgcore/gcore_coredump.c
+++ b/src/libgcore/gcore_coredump.c
@@ -78,7 +78,8 @@ readswap(ulonglong pte_val, char *buf, ulong len, ulonglong vaddr)
void gcore_readmem_user(ulong addr, void *buf, long size, char *type)
{
- ulong paddr, cnt;
+ physaddr_t paddr;
+ ulong cnt;
char *bufptr = buf;
while (size > 0) {
--
2.37.1

View File

@ -0,0 +1,59 @@
From 6f4357340807f70bd1999f0b88435361c583f0b9 Mon Sep 17 00:00:00 2001
From: HATAYAMA Daisuke <d.hatayama@fujitsu.com>
Date: Fri, 25 Feb 2022 04:51:06 -0500
Subject: [PATCH 2/3] gcore, defs: remove definitions and initializations for
saved_auxv entries of offset and size tables
saved_auxv entries of offset and size tables are now not used in the
source code by the previous commit. Let's remove definitions and
initializations for them.
Signed-off-by: HATAYAMA Daisuke <d.hatayama@fujitsu.com>
---
src/gcore.c | 2 --
src/libgcore/gcore_defs.h | 2 --
2 files changed, 4 deletions(-)
diff --git a/src/gcore.c b/src/gcore.c
index 5b78d9980887..f86b15f8a9f6 100644
--- a/src/gcore.c
+++ b/src/gcore.c
@@ -371,7 +371,6 @@ static void gcore_offset_table_init(void)
GCORE_MEMBER_OFFSET_INIT(mm_struct_arg_end, "mm_struct", "arg_end");
GCORE_MEMBER_OFFSET_INIT(mm_struct_map_count, "mm_struct", "map_count");
GCORE_MEMBER_OFFSET_INIT(mm_struct_reserved_vm, "mm_struct", "reserved_vm");
- GCORE_MEMBER_OFFSET_INIT(mm_struct_saved_auxv, "mm_struct", "saved_auxv");
GCORE_MEMBER_OFFSET_INIT(mm_struct_saved_files, "mm_struct", "saved_files");
GCORE_MEMBER_OFFSET_INIT(mm_struct_context, "mm_struct", "context");
GCORE_MEMBER_OFFSET_INIT(pid_level, "pid", "level");
@@ -520,7 +519,6 @@ static void gcore_size_table_init(void)
{
GCORE_STRUCT_SIZE_INIT(i387_union, "i387_union");
GCORE_STRUCT_SIZE_INIT(mm_context_t, "mm_context_t");
- GCORE_MEMBER_SIZE_INIT(mm_struct_saved_auxv, "mm_struct", "saved_auxv");
GCORE_MEMBER_SIZE_INIT(mm_struct_saved_files, "mm_struct", "saved_files");
GCORE_MEMBER_SIZE_INIT(thread_struct_ds, "thread_struct", "ds");
GCORE_MEMBER_SIZE_INIT(thread_struct_es, "thread_struct", "es");
diff --git a/src/libgcore/gcore_defs.h b/src/libgcore/gcore_defs.h
index df87851d23a1..3233ea533ca0 100644
--- a/src/libgcore/gcore_defs.h
+++ b/src/libgcore/gcore_defs.h
@@ -1072,7 +1072,6 @@ struct gcore_offset_table
long mm_struct_arg_end;
long mm_struct_map_count;
long mm_struct_reserved_vm;
- long mm_struct_saved_auxv;
long mm_struct_saved_files;
long mm_struct_context;
long pid_level;
@@ -1148,7 +1147,6 @@ struct gcore_offset_table
struct gcore_size_table
{
long mm_context_t;
- long mm_struct_saved_auxv;
long mm_struct_saved_files;
long thread_struct_ds;
long thread_struct_es;
--
2.30.2

View File

@ -0,0 +1,66 @@
From 8ff3de974aa9fdf8934797122dc55428ef571ab2 Mon Sep 17 00:00:00 2001
From: Vincent Whitchurch <vincent.whitchurch@axis.com>
Date: Tue, 21 Jun 2022 09:15:34 +0000
Subject: [PATCH 3/5] elf: fix warning message caused by type mismatch of
offset types
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Use loff_t consistently to fix these warnings on -m32 builds on 64-bit:
libgcore/gcore_coredump.c: In function writenote:
libgcore/gcore_coredump.c:701:58: warning: passing argument 3 of
gcore->elf->ops->write_note_header from incompatible pointer type
[-Wincompatible-pointer-types]
if (!gcore->elf->ops->write_note_header(gcore->elf, fp, foffset))
^~~~~~~
libgcore/gcore_coredump.c:701:58: note: expected off_t * {aka long
int *} but argument is of type loff_t * {aka long long int *}
Signed-off-by: Vincent Whitchurch <vincent.whitchurch@axis.com>
Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
---
src/libgcore/gcore_defs.h | 2 +-
src/libgcore/gcore_elf_struct.c | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/libgcore/gcore_defs.h b/src/libgcore/gcore_defs.h
index 3233ea533ca0..409678e1ad68 100644
--- a/src/libgcore/gcore_defs.h
+++ b/src/libgcore/gcore_defs.h
@@ -1232,7 +1232,7 @@ struct gcore_elf_operations
int (*write_section_header)(struct gcore_elf_struct *this, FILE *fp);
int (*write_program_header)(struct gcore_elf_struct *this, FILE *fp);
int (*write_note_header)(struct gcore_elf_struct *this, FILE *fp,
- off_t *offset);
+ loff_t *offset);
uint64_t (*get_e_phoff)(struct gcore_elf_struct *this);
uint64_t (*get_e_shoff)(struct gcore_elf_struct *this);
diff --git a/src/libgcore/gcore_elf_struct.c b/src/libgcore/gcore_elf_struct.c
index 2aca984cf90f..b31388aa7e28 100644
--- a/src/libgcore/gcore_elf_struct.c
+++ b/src/libgcore/gcore_elf_struct.c
@@ -141,7 +141,7 @@ static int elf64_write_program_header(struct gcore_elf_struct *this, FILE *fp)
}
static int elf64_write_note_header(struct gcore_elf_struct *this, FILE *fp,
- off_t *offset)
+ loff_t *offset)
{
Elf64_Nhdr *n = &((struct gcore_elf64_struct *)this)->nhdr;
@@ -314,7 +314,7 @@ static int elf32_write_program_header(struct gcore_elf_struct *this, FILE *fp)
}
static int elf32_write_note_header(struct gcore_elf_struct *this, FILE *fp,
- off_t *offset)
+ loff_t *offset)
{
Elf32_Nhdr *n = &((struct gcore_elf32_struct *)this)->nhdr;
--
2.37.1

View File

@ -0,0 +1,128 @@
From 4cb65a0d9168778d120920418b968d05da10989f Mon Sep 17 00:00:00 2001
From: HATAYAMA Daisuke <d.hatayama@fujitsu.com>
Date: Fri, 25 Feb 2022 04:59:48 -0500
Subject: [PATCH 3/3] gcore: fix memory allocation failure during processing
NT_AUXV note
For crash dumps generated using kernel-4.18.0-365.el8 or later on
CentOS stream 8, crash gcore command fails as follows:
crash> gcore -v 7 -f 128 10604
gcore: Opening file core.10604.test-dumpfilter ...
gcore: done.
gcore: Writing ELF header ...
gcore: done.
gcore: Retrieving and writing note information ...
gcore: zero-size memory allocation! (called from 7fd558ce1e05)
Failed.
This memory allocation failure occurs in fill_auxv_note() that creates
NT_AUXV note due to saved_auxv entries of size and offset tables are
somehow 0.
This is because during the merge of the upstream kernel commit
1c33bb0507508af24fd754dd7123bd8e997fab2f (x86/elf: Support a new ELF
aux vector AT_MINSIGSTKSZ), location of saved_auxv of struct mm_struct
has been moved as workaround in order to avoid kABI breakage.
Fix this by using RHEL-specific location for saved_auxv if there is
member rh_reserved_saved_auxv in struct mm_struct.
Signed-off-by: HATAYAMA Daisuke <d.hatayama@fujitsu.com>
---
src/libgcore/gcore_coredump.c | 54 +++++++++++++++++++++++++++++------
1 file changed, 46 insertions(+), 8 deletions(-)
diff --git a/src/libgcore/gcore_coredump.c b/src/libgcore/gcore_coredump.c
index 6f57b21b62b6..c14cc116e951 100644
--- a/src/libgcore/gcore_coredump.c
+++ b/src/libgcore/gcore_coredump.c
@@ -18,6 +18,10 @@
static struct elf_note_info *elf_note_info_init(void);
+static void get_auxv_size_addr(struct task_context *tc,
+ size_t *size,
+ ulong *addr);
+
static void fill_prstatus_note(struct elf_note_info *info,
struct task_context *tc,
struct memelfnote *memnote);
@@ -923,18 +927,49 @@ compat_fill_prstatus_note(struct elf_note_info *info,
#endif /* GCORE_ARCH_COMPAT */
+static void get_auxv_size_addr(struct task_context *tc,
+ size_t *psize,
+ ulong *paddr)
+{
+ size_t size;
+ ulong addr;
+
+ if (MEMBER_EXISTS("mm_struct", "rh_reserved_saved_auxv")) {
+ ulong mm_rh;
+
+ size = MEMBER_SIZE("mm_struct_rh", "saved_auxv");
+ readmem(task_mm(tc->task, FALSE) + MEMBER_OFFSET("mm_struct", "mm_rh"),
+ KVADDR,
+ &mm_rh,
+ sizeof(mm_rh),
+ "mm_struct mm_rh",
+ gcore_verbose_error_handle());
+ addr = mm_rh + MEMBER_OFFSET("mm_struct_rh", "saved_auxv");
+ } else {
+ size = MEMBER_SIZE("mm_struct", "saved_auxv");
+ addr = task_mm(tc->task, FALSE) +
+ MEMBER_OFFSET("mm_struct", "saved_auxv");
+ }
+
+ *psize = size;
+ *paddr = addr;
+}
+
static void
fill_auxv_note(struct elf_note_info *info, struct task_context *tc,
struct memelfnote *memnote)
{
ulong *auxv;
+ ulong addr;
+ size_t size;
int i;
- auxv = (ulong *)GETBUF(MEMBER_SIZE("mm_struct", "saved_auxv"));
+ get_auxv_size_addr(tc, &size, &addr);
- readmem(task_mm(tc->task, FALSE) +
- MEMBER_OFFSET("mm_struct", "saved_auxv"), KVADDR, auxv,
- MEMBER_SIZE("mm_struct", "saved_auxv"), "fill_auxv_note",
+ auxv = (ulong *)GETBUF(size);
+
+ readmem(addr, KVADDR, auxv,
+ size, "fill_auxv_note",
gcore_verbose_error_handle());
i = 0;
@@ -954,13 +989,16 @@ compat_fill_auxv_note(struct elf_note_info *info,
struct memelfnote *memnote)
{
uint32_t *auxv;
+ ulong addr;
+ size_t size;
int i;
- auxv = (uint32_t *)GETBUF(MEMBER_SIZE("mm_struct", "saved_auxv"));
+ get_auxv_size_addr(tc, &size, &addr);
+
+ auxv = (uint32_t *)GETBUF(size);
- readmem(task_mm(tc->task, FALSE) +
- MEMBER_OFFSET("mm_struct", "saved_auxv"), KVADDR, auxv,
- MEMBER_SIZE("mm_struct", "saved_auxv"), "fill_auxv_note32",
+ readmem(addr, KVADDR, auxv,
+ size, "fill_auxv_note32",
gcore_verbose_error_handle());
i = 0;
--
2.30.2

View File

@ -0,0 +1,53 @@
From dbb542e10bfe1b2e21c7927bda9be1d301cfef65 Mon Sep 17 00:00:00 2001
From: HATAYAMA Daisuke <d.hatayama@fujitsu.com>
Date: Fri, 17 Jun 2022 20:38:19 +0900
Subject: [PATCH 4/5] coredump: fix unexpected truncation of generated core
files
Core files generated by crash gcore command are sometimes unexpectedly
truncated. Then, we can get aware of this from the following warning
message output by gdb:
BFD: warning: /root/./core.1.systemd is truncated: expected core file size >= 43606016, found: 43597824
From the investigation, it turned out that this truncation is
occurring when there is no write() operation after the area skipped by
lseek(). Holes are generated only when there is write() operation.
To fix this issue, use ftruncate() to allocate holes explicitly.
Signed-off-by: HATAYAMA Daisuke <d.hatayama@fujitsu.com>
Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
---
src/libgcore/gcore_coredump.c | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/src/libgcore/gcore_coredump.c b/src/libgcore/gcore_coredump.c
index 424b0a40a42b..27086d91468b 100644
--- a/src/libgcore/gcore_coredump.c
+++ b/src/libgcore/gcore_coredump.c
@@ -331,6 +331,21 @@ void gcore_coredump(void)
}
progressf("done.\n");
+ /*
+ * Use ftruncate() to generate holes explicitly, or core file
+ * gets truncated if there is no write() operation after the
+ * area skipped by lseek().
+ */
+ if (fflush(gcore->fp))
+ error(FATAL, "%s: fflush: %s\n",
+ gcore->corename,
+ strerror(errno));
+
+ if (ftruncate(fileno(gcore->fp), ftell(gcore->fp)) < 0)
+ error(FATAL, "%s: ftruncate: %s\n",
+ gcore->corename,
+ strerror(errno));
+
gcore->flags |= GCF_SUCCESS;
}
--
2.37.1

View File

@ -0,0 +1,43 @@
From d2795659986dacc51e98a3d1dbc8b673582c20fe Mon Sep 17 00:00:00 2001
From: HATAYAMA Daisuke <d.hatayama@fujitsu.com>
Date: Tue, 28 Jun 2022 03:54:46 +0900
Subject: [PATCH 5/5] gcore.mk: fix mismatch of _FILE_OFFSET_BITS when building
gcore.so
On arm and mips, while _FILE_OFFSET_BITS=64 is used when building
gcore.so by make extensions, it is not used by gcore.mk.
Fix this inconsistency by using _FILE_OFFSET_BITS=64 in gcore.mk on
arm and mips.
Signed-off-by: HATAYAMA Daisuke <d.hatayama@fujitsu.com>
Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
---
src/gcore.mk | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/gcore.mk b/src/gcore.mk
index 4af292b79c60..1fd4d84c2ded 100644
--- a/src/gcore.mk
+++ b/src/gcore.mk
@@ -32,7 +32,7 @@ endif
ifeq ($(shell arch), arm)
TARGET=ARM
- TARGET_CFLAGS=
+ TARGET_CFLAGS=-D_FILE_OFFSET_BITS=64
ARCH=SUPPORTED
endif
@@ -44,7 +44,7 @@ endif
ifeq ($(shell arch), mips)
TARGET=MIPS
- TARGET_CFLAGS=
+ TARGET_CFLAGS=-D_FILE_OFFSET_BITS=64
ARCH=SUPPORTED
endif
--
2.37.1

View File

@ -0,0 +1,137 @@
#
# crash core analysis suite
#
%global reponame crash-gcore
Summary: Gcore extension module for the crash utility
Name: crash-gcore-command
Version: 1.6.3
Release: 3%{?dist}
License: GPLv2
Group: Development/Debuggers
Source: https://github.com/fujitsu/crash-gcore/archive/v%{version}/%{name}-%{version}.tar.gz
URL: https://github.com/fujitsu/crash-gcore
# Vendor: FUJITSU LIMITED
# Packager: HATAYAMA Daisuke <d.hatayama@jp.fujitsu.com>
ExclusiveOS: Linux
ExclusiveArch: x86_64 %{ix86} arm aarch64 ppc64 ppc64le
Buildroot: %{_tmppath}/%{name}-root
BuildRequires: crash-devel >= 5.1.5, zlib-devel lzo-devel snappy-devel
Requires: crash >= 5.1.5
Patch0: 0001-coredump-use-MEMBER_-OFFSET-SIZE-instead-of-GCORE_-O.patch
Patch1: 0002-gcore-defs-remove-definitions-and-initializations-fo.patch
Patch2: 0003-gcore-fix-memory-allocation-failure-during-processin.patch
Patch3: 0001-x86-Fix-failure-of-collecting-vsyscall-mapping-due-t.patch
Patch4: 0002-coredump-fix-segmentation-fault-caused-by-type-misma.patch
Patch5: 0003-elf-fix-warning-message-caused-by-type-mismatch-of-o.patch
Patch6: 0004-coredump-fix-unexpected-truncation-of-generated-core.patch
Patch7: 0005-gcore.mk-fix-mismatch-of-_FILE_OFFSET_BITS-when-buil.patch
%description
Command for creating a core dump file of a user-space task that was
running in a kernel dumpfile.
%prep
%setup -q -n %{reponame}-%{version}
%patch0 -p1
%patch1 -p1
%patch2 -p1
%patch3 -p1
%patch4 -p1
%patch5 -p1
%patch6 -p1
%patch7 -p1
%build
make CFLAGS="%{optflags} -Wl,-z,now" -C src -f gcore.mk
%install
rm -Rf $RPM_BUILD_ROOT
mkdir -p %{buildroot}%{_libdir}/crash/extensions/
cp %{_builddir}/%{reponame}-%{version}/src/gcore.so %{buildroot}%{_libdir}/crash/extensions/
%clean
rm -rf %{buildroot}
rm -Rf $RPM_BUILD_ROOT
%files
%defattr(-,root,root)
%{_libdir}/crash/extensions/gcore.so
%doc COPYING
%changelog
* Fri Nov 18 2022 Lianbo Jiang <lijiang@redhat.com> - 1.6.3-3
- Update to upstream commit d2795659986d
- Resolves: rhbz#2119697
* Tue Apr 12 2022 Tao Liu <ltao@redhat.com> - 1.6.3-2
- Rebase to upstream crash-gcore-command-1.6.3
- Fix memory allocation failure issue
- Resolves: rhbz#2060355
* Wed Dec 2 2020 Bhupesh Sharma <bhsharma@redhat.com> - 1.6.0-1
- Rebase crash-gcore-command to github upstream version crash-gcore-command-1.6.0
Resolves: rhbz#1903465
* Wed Jul 8 2020 Bhupesh Sharma <bhsharma@redhat.com> - 1.5.1-1
- Rebase crash-gcore-command to github upstream version crash-gcore-command-1.5.1
Resolves: rhbz#1851747
* Tue Jun 25 2019 Dave Anderson <anderson@redhat.com> - 1.3.1-4
- Fix "invalid structure size: pid_link"
Resolves: rhbz#1722726
* Tue Dec 4 2018 Dave Anderson <anderson@redhat.com> - 1.3.1-3
- Fix x86_64 "invalid structure member offset: thread_struct_fs"
Resolves: rhbz#1589019
- Fix arm64 "invalid structure member offset: thread_struct_fpsimd_state"
Resolves: rhbz#1625810
* Wed Sep 10 2018 Dave Anderson <anderson@redhat.com> - 1.3.1-2
- Address annocheck link issue
Resolves: rhbz#1630556
* Mon Aug 13 2018 Dave Anderson <anderson@redhat.com> - 1.3.1-1
- Bump release for mass rebuild
Resolves: rhbz#1615509
* Thu Nov 6 2014 Dave Anderson <anderson@redhat.com> - 1.3.1-0
- Rebase to 1.3.1 to address 32-bit x86 build error.
- Resolves: rhbz#1077311
* Tue Nov 4 2014 Dave Anderson <anderson@redhat.com> - 1.3.0-0
- Add aarch64 support
- Resolves: rhbz#1077311
- Add ppc64/ppc64le support
- Resolves: rhbz#1125485
* Fri Dec 27 2013 Daniel Mach <dmach@redhat.com> - 1.2.1-2
- Mass rebuild 2013-12-27
* Tue Aug 20 2013 Dave Anderson <anderson@redhat.com> - 1.2.1-1
crash utility has added LZO and snappy compression in addition to zlib.
* Thu May 23 2013 HATAYAMA Daisuke <d.hatayama@jp.fujitsu.com> - 1.2.1-0
Fixes for missing VDSO and vsyscall pages in core dump.
* Wed Nov 21 2012 HATAYAMA Daisuke <d.hatayama@jp.fujitsu.com> - 1.2-0
Support recent kernels around 3.6.
* Tue Jan 31 2012 Dave Anderson <anderson@redhat.com> - 1.0-3
Address Pkgwrangler/rpmlint issues.
Resolves: rbhz#692799
* Wed Jan 25 2012 Dave Anderson <anderson@redhat.com> - 1.0-2
Compile with RPM_OPT_FLAGS and fix warnings generated from using it.
Resolves: rbhz#692799
* Thu Apr 13 2011 HATAYAMA Daisuke <d.hatayama@jp.fujitsu.com> - 1.0-1
- Remove inclusion of kvmdump.h and unwind_x86_64.h due to non-supporting issue
on crash-devel package. Instead, use a new interface for them.
- Remove ppc64, ia64, s390 and s390x from ExclusiveArch, leave x86_64
and %%{ix86} there.
- Add descriptions in BuildRequires and Requires about crash and crash-devel.
* Wed Apr 6 2011 HATAYAMA Daisuke <d.hatayama@jp.fujitsu.com> - 1.0-0
- Initial crash-gcore-command package

View File

@ -1,68 +0,0 @@
%global reponame crash-gcore
Summary: Gcore extension module for the crash utility
Name: crash-gcore-command
Version: 1.6.4
Release: 2%{?dist}
License: GPLv2
Source0: https://github.com/fujitsu/crash-gcore/archive/v%{version}/%{name}-%{version}.tar.gz
URL: https://github.com/fujitsu/crash-gcore
ExclusiveOS: Linux
ExclusiveArch: aarch64 ppc64le x86_64
BuildRequires: crash-devel >= 5.1.5
BuildRequires: gcc
Requires: crash >= 5.1.5
Patch0: 0001-coredump-fix-building-failure-due-to-undefined-macro.patch
Patch1: 0002-x86-fix-extend-gcore.so-taking-much-time-like-more-t.patch
Patch2: 0001-gcore-update-set_context-with-upstream-counterpart.patch
Patch3: 0002-x86-fix-the-issue-that-core-files-for-64-bit-tasks-a.patch
%description
Command for creating a core dump file of a user-space task that was
running in a kernel dump file.
%prep
%autosetup -n %{reponame}-%{version} -p1
%build
%make_build CFLAGS="%{optflags} -Wl,-z,now" -C src -f gcore.mk
%install
install -m 0755 -d %{buildroot}%{_libdir}/crash/extensions
install -m 0755 -t %{buildroot}%{_libdir}/crash/extensions %{_builddir}/%{reponame}-%{version}/src/gcore.so
%files
%dir %{_libdir}/crash
%dir %{_libdir}/crash/extensions
%{_libdir}/crash/extensions/gcore.so
%license COPYING
%changelog
* Mon May 05 2025 Lianbo Jiang <lijiang@redhat.com> - 1.6.4-2
- Rebase to latest upstream e03ff7341a9a
* Fri Jul 05 2024 Lianbo Jiang <lijiang@redhat.com> - 1.6.4-1
- Rebase to upstream 1.6.4
* Fri Nov 18 2022 Lianbo Jiang <lijiang@redhat.com> - 1.6.3-2
- Update to the latest commit d2795659986d
* Mon Dec 27 2021 Lianbo Jiang <lijiang@redhat.com> - 1.6.3-1
- Rebase to upstream 1.6.3
* Wed Dec 15 2021 Lianbo Jiang <lijiang@redhat.com> - 1.6.2-5
- Rebuild for the compatibility issue
* Tue Dec 07 2021 Lianbo Jiang <lijiang@redhat.com> - 1.6.2-4
- Fix the hardening issue "FAIL: bind-now test because not linked with -Wl,-z,now"
* Mon Aug 09 2021 Mohan Boddu <mboddu@redhat.com> - 1.6.2-3
- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags
Related: rhbz#1991688
* Thu Apr 15 2021 Mohan Boddu <mboddu@redhat.com> - 1.6.2-2
- Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937
* Fri Jan 22 2021 HATAYAMA Daisuke <d.hatayama@fujitsu.com> - 1.6.2-1
- Initial crash-gcore-command package

View File

@ -1,6 +0,0 @@
--- !Policy
product_versions:
- rhel-9
decision_context: osci_compose_gate
rules:
- !PassingTestCaseRule {test_case_name: kernel-qe.kernel-ci.general-crash.tier0.functional}

View File

@ -1 +0,0 @@
SHA512 (crash-gcore-command-1.6.4.tar.gz) = 5799337cea3459e122f6ed3a3c8a375ff950477d00a46bc0428e1771dd6d99d4c3470f2514c1b299ab403bbe0b1b46b169243d581ea54ec6109ad42aa7aa3406