mirror of
https://github.com/checkpoint-restore/criu
synced 2025-08-31 06:15:24 +00:00
Set descriptors to restart a current syscall
If a task is sleep in syscall, it should be restared. This logic is moved from kernel do_signal(). Signed-off-by: Andrey Vagin <avagin@openvz.org> Acked-by: Pavel Emelyanov <xemul@parallels.com> Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
This commit is contained in:
committed by
Cyrill Gorcunov
parent
5a49b9e216
commit
04f36aed0a
17
cr-dump.c
17
cr-dump.c
@@ -556,6 +556,23 @@ static int get_task_regs(pid_t pid, struct core_entry *core)
|
||||
jerr(ptrace(PTRACE_GETREGS, pid, NULL, ®s), err);
|
||||
jerr(ptrace(PTRACE_GETFPREGS, pid, NULL, &fpregs), err);
|
||||
|
||||
/* Did we come from a system call? */
|
||||
if (regs.orig_ax >= 0)
|
||||
/* Restart the system call */
|
||||
switch (regs.ax) {
|
||||
case -ERESTARTNOHAND:
|
||||
case -ERESTARTSYS:
|
||||
case -ERESTARTNOINTR:
|
||||
regs.ax = regs.orig_ax;
|
||||
regs.ip -= 2;
|
||||
break;
|
||||
|
||||
case -ERESTART_RESTARTBLOCK:
|
||||
regs.ax = __NR_restart_syscall;
|
||||
regs.ip -= 2;
|
||||
break;
|
||||
}
|
||||
|
||||
assign_reg(core->u.arch.gpregs, regs, r15);
|
||||
assign_reg(core->u.arch.gpregs, regs, r14);
|
||||
assign_reg(core->u.arch.gpregs, regs, r13);
|
||||
|
@@ -31,6 +31,7 @@
|
||||
#define __NR_futex 202
|
||||
#define __NR_set_thread_area 205
|
||||
#define __NR_get_thread_area 211
|
||||
#define __NR_restart_syscall 219
|
||||
|
||||
#else /* CONFIG_X86_64 */
|
||||
# error x86-32 bit mode not yet implemented
|
||||
|
@@ -76,6 +76,11 @@
|
||||
|
||||
#define SIGMAX 32
|
||||
|
||||
#define ERESTARTSYS 512
|
||||
#define ERESTARTNOINTR 513
|
||||
#define ERESTARTNOHAND 514
|
||||
#define ERESTART_RESTARTBLOCK 516
|
||||
|
||||
typedef uint64_t u64;
|
||||
typedef int64_t s64;
|
||||
typedef unsigned int u32;
|
||||
|
Reference in New Issue
Block a user