12ba7088 |
diff -Naur crash-gcore-command-1.3.1_orig/libgcore/gcore_x86.c crash-gcore-command-1.3.1/libgcore/gcore_x86.c
--- crash-gcore-command-1.3.1_orig/libgcore/gcore_x86.c 2014-11-06 09:58:47.000000000 +0000
+++ crash-gcore-command-1.3.1/libgcore/gcore_x86.c 2016-10-01 06:18:32.201965162 +0000
@@ -1648,17 +1648,27 @@
{
const int nr_syscall = (int)regs->orig_ax;
- /*
- * rsp is saved in per-CPU old_rsp, which is saved in
- * thread->usersp at each context switch.
- */
- if (is_task_active(target->task)) {
- regs->sp = gxt->get_old_rsp(target->processor);
- } else {
- readmem(target->task + OFFSET(task_struct_thread) +
- GCORE_OFFSET(thread_struct_usersp), KVADDR, ®s->sp,
- sizeof(regs->sp),
- "genregs_get: usersp", gcore_verbose_error_handle());
+ if (THIS_KERNEL_VERSION < LINUX(4,4,0) /* not sure */) {
+ /*
+ * rsp is saved in per-CPU old_rsp, which is saved in
+ * thread->usersp at each context switch.
+ */
+ if (is_task_active(target->task)) {
+ regs->sp = gxt->get_old_rsp(target->processor);
+ } else {
+ readmem(target->task + OFFSET(task_struct_thread) +
+ GCORE_OFFSET(thread_struct_usersp), KVADDR, ®s->sp,
+ sizeof(regs->sp),
+ "genregs_get: usersp", gcore_verbose_error_handle());
+ }
+
+ /*
+ * See FIXUP_TOP_OF_STACK in arch/x86/kernel/entry_64.S.
+ */
+ regs->ss = __USER_DS;
+ regs->cs = __USER_CS;
+ regs->cx = (ulong)-1;
+ regs->flags = regs->r11;
}
/*
@@ -1667,14 +1677,6 @@
if (!gxt->is_special_syscall(nr_syscall))
restore_rest(target->task, regs, active_regs);
- /*
- * See FIXUP_TOP_OF_STACK in arch/x86/kernel/entry_64.S.
- */
- regs->ss = __USER_DS;
- regs->cs = __USER_CS;
- regs->cx = (ulong)-1;
- regs->flags = regs->r11;
-
restore_segment_registers(target->task, regs);
}
|