SPECS/crash/gcore-support-linux-4.4.patch
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, &regs->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, &regs->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);
  }