2014-11-28 2 views
0

Я попытался выяснить функциональность этой функции, но я не мог .. Он определен в Linux/арка/Sparc/ядра/process_32.c СпасибоЧто именно делает sparc_do_fork()?

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

Это, кажется, прямо в исходный код.

Это обертка вокруг обычной Linux do_fork() вызова, один, который сохраняет и восстанавливает данные (в частности, regs->u_regs[UREG_I1], который приравнивает к СПАРКУ выходного регистру 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. 
Смежные вопросы