/* Let exactly one thread-group leader do a full undump, and * ensure everyone else does REGSONLY. * This and the matching logic at dump time together ensure that we * preserve the thread-group structure that was spawned in user-space. * * Returns original pid (>0), or <0 on error */ long cr_thaw_threads(cr_rstrt_proc_req_t *proc_req, int flags, int i_am_leader) { struct pt_regs *regs = get_pt_regs(current); long retval = 0; if (i_am_leader) { down(&proc_req->serial_mutex); retval = vmadump_thaw_proc(proc_req, proc_req->file, regs, flags); if (retval < 0) { proc_req->thaw_error = retval; } proc_req->done_leader = 1; wake_up(&proc_req->wait); up(&proc_req->serial_mutex); } else if (wait_event_interruptible(proc_req->wait, proc_req->done_leader) < 0) { retval = -EINTR; } else if (proc_req->thaw_error) { retval = proc_req->thaw_error; } else { down(&proc_req->serial_mutex); retval = vmadump_thaw_proc(proc_req, proc_req->file, regs, flags | VMAD_DUMP_REGSONLY); if (retval < 0) { proc_req->thaw_error = retval; } up(&proc_req->serial_mutex); } return retval; }
pid_t sys_fork(void) { u32 flag = 0; pt_regs *regs = get_pt_regs(); flag |= PROCESS_TYPE_USER | PROCESS_FLAG_FORK; return do_fork(NULL, regs, regs->sp, flag); }
int sys_execve(char __user *filename, char __user **argv, char __user **envp) { int ret = 0; pt_regs *regs = get_pt_regs(); ret = do_exec(filename, argv, envp, regs); if (!ret) ret = regs->r0; return ret; }
/* Let exactly one thread-group leader do a full dump, and * ensure everyone else does REGSONLY. * This and the matching logic at undump time together ensure that we * preserve the thread-group structure that was spawned in user-space. * * Returns bytes written (>0), or <0 on error */ loff_t cr_freeze_threads(cr_chkpt_proc_req_t *proc_req, int flags, int i_am_leader) { struct pt_regs *regs = get_pt_regs(current); loff_t retval = 0; if (i_am_leader) { down(&proc_req->serial_mutex); retval = vmadump_freeze_proc(proc_req, proc_req->file, regs, flags | VMAD_DUMP_NOSHANON); proc_req->done_leader = 1; wake_up(&proc_req->wait); up(&proc_req->serial_mutex); } else if (wait_event_interruptible(proc_req->wait, proc_req->done_leader) < 0) { retval = -EINTR; } else { down(&proc_req->serial_mutex); retval = vmadump_freeze_proc(proc_req, proc_req->file, regs, flags | VMAD_DUMP_REGSONLY); up(&proc_req->serial_mutex); } return retval; }