gpt4 book ai didi

Linux 相当于 FreeBSD 的 cpu_set_syscall_retval()

转载 作者:太空宇宙 更新时间:2023-11-04 04:01:25 25 4
gpt4 key购买 nike

标题几乎说明了一切。在/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 中没有办法做同样的事情。系统调用的返回值通过内部调用的任何函数的返回值传播,以实现该函数一直返回到用户模式。一般约定是,非负返回值表示成功,负值表示错误(errno 是取反的返回值:例如,“-2”表示 errno 值为 2 [ENOENT] 的错误)。

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

关于Linux 相当于 FreeBSD 的 cpu_set_syscall_retval(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22821934/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com