Linux相当于FreeBSD的cpu_set_syscall_retval()

时间:2014-04-02 20:08:13

标签: linux kernel system-calls bsd errno

标题几乎说明了一切。在/usr/src/sys/amd64/amd64/vm_machdep.c中找到与cpu_set_syscall_retval()相当的Linux。不确定Linux中是否有这样的东西,但我想我还是要问。

   cpu_set_syscall_retval(struct thread *td, int error)
   {
       switch (error) {
       case 0:
               td->td_frame->tf_rax = td->td_retval[0];
               td->td_frame->tf_rdx = td->td_retval[1];
               td->td_frame->tf_rflags &= ~PSL_C;
               break;

       case ERESTART:
               /*
                * Reconstruct pc, we know that 'syscall' is 2 bytes,
                * lcall $X,y is 7 bytes, int 0x80 is 2 bytes.
                * We saved this in tf_err.
                * %r10 (which was holding the value of %rcx) is restored
                * for the next iteration.
                * %r10 restore is only required for freebsd/amd64 processes,
                * but shall be innocent for any ia32 ABI.
                */
               td->td_frame->tf_rip -= td->td_frame->tf_err;
               td->td_frame->tf_r10 = td->td_frame->tf_rcx;
               break;

       case EJUSTRETURN:
               break;

       default:
               if (td->td_proc->p_sysent->sv_errsize) {
                       if (error >= td->td_proc->p_sysent->sv_errsize)
                               error = -1;     /* XXX */
                       else
                               error = td->td_proc->p_sysent->sv_errtbl[error];
               }
               td->td_frame->tf_rax = error;
               td->td_frame->tf_rflags |= PSL_C;
               break;
       }
}

1 个答案:

答案 0 :(得分:0)

没有办法在linux中做同等的事情。系统调用的返回值通过内部调用的任何函数的返回值传播,以实现函数一直返回到用户模式。一般约定是非负返回值表示成功,负值表示错误(errno是否定返回值:例如," -2"表示错误值为errno值2 [ENOENT])。

您可以查找存储的寄存器值,这些值将在返回用户模式时弹出并替换其中一个(这里的BSD代码正在做什么),但包含返回值的关键值将被覆盖无论如何,在返回用户模式之前,正常的系统调用返回路径。