【问题标题】:Linux equivalent of FreeBSD's cpu_set_syscall_retval()Linux 等效于 FreeBSD 的 cpu_set_syscall_retval()
【发布时间】:2014-05-14 08:31:11
【问题描述】:

标题几乎说明了一切。在 /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;
       }
}

【问题讨论】:

    标签: linux kernel system-calls bsd errno


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-06-26
      • 1970-01-01
      • 1970-01-01
      • 2011-02-26
      • 1970-01-01
      • 2012-06-08
      • 2018-01-30
      • 1970-01-01
      相关资源
      最近更新 更多