Linux相当于FreeBSD';s cpu_set_syscall_retval()
标题几乎说明了一切。正在查找/usr/src/sys/amd64/amd64/vm_machdep.c中的cpu_set_syscall_retval()的Linux等价物。不确定Linux中是否有这样的东西,但我想我还是会问Linux相当于FreeBSD';s cpu_set_syscall_retval(),linux,kernel,system-calls,bsd,errno,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->t
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中没有办法做到同样的效果。系统调用的返回值通过内部调用的任何函数的返回值传播,以实现该函数,一直返回到用户模式。一般惯例是,非负返回值表示成功,负值表示错误(errno是否定的返回值:例如,-2”表示errno值为2[enoint]的错误) 您可以查找存储的寄存器值,这些值将在返回到用户模式时弹出并替换其中一个(这里的BSD代码正在执行的操作),但是包含返回值的关键寄存器值将在返回到用户模式之前被系统调用路径的正常返回覆盖