sparc_do_fork()到底做了什么?

时间:2014-11-28 06:37:56

标签: c linux kernel

我试图找出这个功能的功能,但我不能..它在Linux / arch / sparc / kernel / process_32.c中定义,谢谢

asmlinkage int sparc_do_fork(unsigned long clone_flags,
                             unsigned long stack_start,
                             struct pt_regs *regs,
                             unsigned long stack_size)
{
    unsigned long parent_tid_ptr, child_tid_ptr;
    unsigned long orig_i1 = regs->u_regs[UREG_I1];
    long ret;

    parent_tid_ptr = regs->u_regs[UREG_I2];
    child_tid_ptr = regs->u_regs[UREG_I4];

    ret = do_fork(clone_flags, stack_start, stack_size,
        (int __user *) parent_tid_ptr,
        (int __user *) child_tid_ptr);

    /* If we get an error and potentially restart the system
     * call, we're screwed because copy_thread() clobbered
     * the parent's %o1.  So detect that case and restore it
     * here.
     */
    if ((unsigned long)ret >= -ERESTART_RESTARTBLOCK)
        regs->u_regs[UREG_I1] = orig_i1;

    return ret;
}

1 个答案:

答案 0 :(得分:1)

它似乎就在源代码中。

它是常规Linux do_fork()调用的包装器,用于保存和恢复数据(具体地,regs->u_regs[UREG_I1],等同于SPARC输出寄存器1),否则将被破坏某些情况:

/* If we get an error and potentially restart the system
     * call, we're screwed because copy_thread() clobbered
     * the parent's %o1.  So detect that case and restore it
     * here.
     */

它通过以下方式实现:

unsigned long orig_i1 = regs->u_regs[UREG_I1];      // Save it.

ret = do_fork(...);

if ((unsigned long)ret >= -ERESTART_RESTARTBLOCK)   // It may be corrupt
    regs->u_regs[UREG_I1] = orig_i1;                //   so restore it.