From 0cda60e3347e8f5ebe184b7cdcd00328dc45aa58 Mon Sep 17 00:00:00 2001 From: Andrey Vagin Date: Fri, 24 May 2013 16:20:13 +0400 Subject: [PATCH] dump: update task registers if a signal is started handling When we try to execute a parasite code, a signal can be started handling, so we need to update a task registers, which will be saved in a core file. Signed-off-by: Andrey Vagin Signed-off-by: Pavel Emelyanov --- arch/arm/crtools.c | 3 ++- arch/x86/crtools.c | 3 ++- include/parasite-syscall.h | 4 +++- parasite-syscall.c | 8 +++++--- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/arch/arm/crtools.c b/arch/arm/crtools.c index 286c5fe83..45c43e9b9 100644 --- a/arch/arm/crtools.c +++ b/arch/arm/crtools.c @@ -77,7 +77,8 @@ int syscall_seized(struct parasite_ctl *ctl, int nr, unsigned long *ret, regs.ARM_r5 = arg6; parasite_setup_regs(ctl->syscall_ip, 0, ®s); - err = __parasite_execute(ctl, ctl->pid.real, ®s); + err = __parasite_execute(ctl, ctl->pid.real, ®s, + &ctl->threads[0].regs_orig); if (err) return err; diff --git a/arch/x86/crtools.c b/arch/x86/crtools.c index 39bbefc1c..2d26aacc8 100644 --- a/arch/x86/crtools.c +++ b/arch/x86/crtools.c @@ -101,7 +101,8 @@ int syscall_seized(struct parasite_ctl *ctl, int nr, unsigned long *ret, regs.r9 = arg6; parasite_setup_regs(ctl->syscall_ip, 0, ®s); - err = __parasite_execute(ctl, ctl->pid.real, ®s); + err = __parasite_execute(ctl, ctl->pid.real, ®s, + &ctl->threads[0].regs_orig); if (err) return err; diff --git a/include/parasite-syscall.h b/include/parasite-syscall.h index 4494ef429..9b02a9644 100644 --- a/include/parasite-syscall.h +++ b/include/parasite-syscall.h @@ -93,7 +93,9 @@ int syscall_seized(struct parasite_ctl *ctl, int nr, unsigned long *ret, unsigned long arg5, unsigned long arg6); -extern int __parasite_execute(struct parasite_ctl *ctl, pid_t pid, user_regs_struct_t *regs); +extern int __parasite_execute(struct parasite_ctl *ctl, pid_t pid, + user_regs_struct_t *regs, + user_regs_struct_t *regs_orig); extern bool arch_can_dump_task(pid_t pid); extern int parasite_fixup_vdso(struct parasite_ctl *ctl, pid_t pid, diff --git a/parasite-syscall.c b/parasite-syscall.c index eadcd1a31..4c8c1771e 100644 --- a/parasite-syscall.c +++ b/parasite-syscall.c @@ -63,7 +63,9 @@ static struct vma_area *get_vma_by_ip(struct list_head *vma_area_list, unsigned } /* we run at @regs->ip */ -int __parasite_execute(struct parasite_ctl *ctl, pid_t pid, user_regs_struct_t *regs) +int __parasite_execute(struct parasite_ctl *ctl, pid_t pid, + user_regs_struct_t *regs, + user_regs_struct_t *regs_orig) { siginfo_t siginfo; int status; @@ -171,7 +173,7 @@ retry_signal: pr_perror("Can't obtain registers (pid: %d)", pid); goto err; } - ctl->threads[0].regs_orig = r; + *regs_orig = r; } goto again; @@ -208,7 +210,7 @@ static int parasite_execute_by_id(unsigned int cmd, struct parasite_ctl *ctl, in parasite_setup_regs(ctl->parasite_ip, thread->rstack, ®s); - ret = __parasite_execute(ctl, pid, ®s); + ret = __parasite_execute(ctl, pid, ®s, &thread->regs_orig); if (ret == 0) ret = (int)REG_RES(regs);