|
@@ -1676,21 +1676,33 @@ const struct user_regset_view *task_user_regset_view(struct task_struct *task)
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
-void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs,
|
|
|
- int error_code, int si_code)
|
|
|
+static void fill_sigtrap_info(struct task_struct *tsk,
|
|
|
+ struct pt_regs *regs,
|
|
|
+ int error_code, int si_code,
|
|
|
+ struct siginfo *info)
|
|
|
{
|
|
|
- struct siginfo info;
|
|
|
-
|
|
|
tsk->thread.trap_no = 1;
|
|
|
tsk->thread.error_code = error_code;
|
|
|
|
|
|
- memset(&info, 0, sizeof(info));
|
|
|
- info.si_signo = SIGTRAP;
|
|
|
- info.si_code = si_code;
|
|
|
+ memset(info, 0, sizeof(*info));
|
|
|
+ info->si_signo = SIGTRAP;
|
|
|
+ info->si_code = si_code;
|
|
|
+ info->si_addr = user_mode_vm(regs) ? (void __user *)regs->ip : NULL;
|
|
|
+}
|
|
|
+
|
|
|
+void user_single_step_siginfo(struct task_struct *tsk,
|
|
|
+ struct pt_regs *regs,
|
|
|
+ struct siginfo *info)
|
|
|
+{
|
|
|
+ fill_sigtrap_info(tsk, regs, 0, TRAP_BRKPT, info);
|
|
|
+}
|
|
|
|
|
|
- /* User-mode ip? */
|
|
|
- info.si_addr = user_mode_vm(regs) ? (void __user *) regs->ip : NULL;
|
|
|
+void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs,
|
|
|
+ int error_code, int si_code)
|
|
|
+{
|
|
|
+ struct siginfo info;
|
|
|
|
|
|
+ fill_sigtrap_info(tsk, regs, error_code, si_code, &info);
|
|
|
/* Send us the fake SIGTRAP */
|
|
|
force_sig_info(SIGTRAP, &info, tsk);
|
|
|
}
|