summaryrefslogtreecommitdiffstats
path: root/sys/i386
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2009-11-10 11:43:07 +0000
committerkib <kib@FreeBSD.org>2009-11-10 11:43:07 +0000
commit3cf53f181e7360f48fecc50a925d46029888af1d (patch)
treebba1aed931ce7ad22617119eb8a0f3b4e1652845 /sys/i386
parente256ac508b1a8eb7aedb8f720f3e650ecd273b53 (diff)
downloadFreeBSD-src-3cf53f181e7360f48fecc50a925d46029888af1d.zip
FreeBSD-src-3cf53f181e7360f48fecc50a925d46029888af1d.tar.gz
Extract the code that records syscall results in the frame into MD
function cpu_set_syscall_retval(). Suggested by: marcel Reviewed by: marcel, davidxu PowerPC, ARM, ia64 changes: marcel Sparc64 tested and reviewed by: marius, also sunv reviewed MIPS tested by: gonzo MFC after: 1 month
Diffstat (limited to 'sys/i386')
-rw-r--r--sys/i386/i386/trap.c30
-rw-r--r--sys/i386/i386/vm_machdep.c36
2 files changed, 37 insertions, 29 deletions
diff --git a/sys/i386/i386/trap.c b/sys/i386/i386/trap.c
index f4df668..f8d0ea0 100644
--- a/sys/i386/i386/trap.c
+++ b/sys/i386/i386/trap.c
@@ -1093,35 +1093,7 @@ syscall(struct trapframe *frame)
#endif
}
- switch (error) {
- case 0:
- frame->tf_eax = td->td_retval[0];
- frame->tf_edx = td->td_retval[1];
- frame->tf_eflags &= ~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_eip -= 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_eax = error;
- frame->tf_eflags |= PSL_C;
- break;
- }
+ cpu_set_syscall_retval(td, error);
/*
* Traced syscall.
diff --git a/sys/i386/i386/vm_machdep.c b/sys/i386/i386/vm_machdep.c
index e7f55a1..2948eb7 100644
--- a/sys/i386/i386/vm_machdep.c
+++ b/sys/i386/i386/vm_machdep.c
@@ -61,6 +61,7 @@ __FBSDID("$FreeBSD$");
#include <sys/mutex.h>
#include <sys/pioctl.h>
#include <sys/proc.h>
+#include <sys/sysent.h>
#include <sys/sf_buf.h>
#include <sys/smp.h>
#include <sys/sched.h>
@@ -380,6 +381,41 @@ cpu_thread_free(struct thread *td)
cpu_thread_clean(td);
}
+void
+cpu_set_syscall_retval(struct thread *td, int error)
+{
+
+ switch (error) {
+ case 0:
+ td->td_frame->tf_eax = td->td_retval[0];
+ td->td_frame->tf_edx = td->td_retval[1];
+ td->td_frame->tf_eflags &= ~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.
+ */
+ td->td_frame->tf_eip -= td->td_frame->tf_err;
+ 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_eax = error;
+ td->td_frame->tf_eflags |= PSL_C;
+ break;
+ }
+}
+
/*
* Initialize machine state (pcb and trap frame) for a new thread about to
* upcall. Put enough state in the new thread's PCB to get it to go back
OpenPOWER on IntegriCloud