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); }