标题几乎说明了一切。在/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;
}
}
答案 0 :(得分:0)
没有办法在linux中做同等的事情。系统调用的返回值通过内部调用的任何函数的返回值传播,以实现函数一直返回到用户模式。一般约定是非负返回值表示成功,负值表示错误(errno是否定返回值:例如," -2"表示错误值为errno值2 [ENOENT])。
您可以查找存储的寄存器值,这些值将在返回用户模式时弹出并替换其中一个(这里的BSD代码正在做什么),但包含返回值的关键值将被覆盖无论如何,在返回用户模式之前,正常的系统调用返回路径。