For ia32 syscall(), call cpu_set_syscall_retval(). Update comment inside

cpu_set_syscall_retval() accordingly.

MFC after:	1 week
This commit is contained in:
kib 2009-12-12 20:11:31 +00:00
parent 6f2f9130ae
commit 38d112ae45
2 changed files with 6 additions and 30 deletions

View File

@ -330,10 +330,14 @@ cpu_set_syscall_retval(struct thread *td, int error)
case ERESTART:
/*
* Reconstruct pc, we know that 'syscall' is 2 bytes.
* 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.
* We have to do a full context restore so that %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;

View File

@ -183,35 +183,7 @@ ia32_syscall(struct trapframe *frame)
AUDIT_SYSCALL_EXIT(error, td);
}
switch (error) {
case 0:
frame->tf_rax = td->td_retval[0];
frame->tf_rdx = td->td_retval[1];
frame->tf_rflags &= ~PSL_C;
break;
case ERESTART:
/*
* Reconstruct pc, assuming lcall $X,y is 7 bytes,
* int 0x80 is 2 bytes. We saved this in tf_err.
*/
frame->tf_rip -= frame->tf_err;
break;
case EJUSTRETURN:
break;
default:
if (p->p_sysent->sv_errsize) {
if (error >= p->p_sysent->sv_errsize)
error = -1; /* XXX */
else
error = p->p_sysent->sv_errtbl[error];
}
frame->tf_rax = error;
frame->tf_rflags |= PSL_C;
break;
}
cpu_set_syscall_retval(td, error);
/*
* Traced syscall.