Exemple #1
0
/* 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;
}
Exemple #2
0
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);
}
Exemple #3
0
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;
}
Exemple #4
0
/* 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;
}