[RFC] Saving the latest errno from syscalls.

Jung-uk Kim jkim at FreeBSD.org
Thu Mar 11 21:24:58 UTC 2010


While I was debugging syscalls, I found a very useful field in struct 
thread, td_errno.  It seems it was added for dtrace but it is only 
populated on amd64 and i386.  Is the attached patch acceptable for 
maintainers of other platforms?

Thanks,

Jung-uk Kim
-------------- next part --------------
Index: sys/arm/arm/trap.c
===================================================================
--- sys/arm/arm/trap.c	(revision 205027)
+++ sys/arm/arm/trap.c	(working copy)
@@ -928,6 +928,10 @@ syscall(struct thread *td, trapframe_t *frame, u_i
 		AUDIT_SYSCALL_ENTER(code, td);
 		error = (*callp->sy_call)(td, args);
 		AUDIT_SYSCALL_EXIT(error, td);
+
+		/* Save the latest error return value. */
+		td->td_errno = error;
+
 		KASSERT(td->td_ar == NULL, 
 		    ("returning from syscall with td_ar set!"));
 	}
Index: sys/powerpc/booke/trap.c
===================================================================
--- sys/powerpc/booke/trap.c	(revision 205027)
+++ sys/powerpc/booke/trap.c	(working copy)
@@ -413,6 +413,9 @@ syscall(struct trapframe *frame)
 		error = (*callp->sy_call)(td, params);
 		AUDIT_SYSCALL_EXIT(error, td);
 
+		/* Save the latest error return value. */
+		td->td_errno = error;
+
 		CTR3(KTR_SYSC, "syscall: p=%s %s ret=%x", p->p_comm,
 		     syscallnames[code], td->td_retval[0]);
 	}
Index: sys/powerpc/aim/trap.c
===================================================================
--- sys/powerpc/aim/trap.c	(revision 205027)
+++ sys/powerpc/aim/trap.c	(working copy)
@@ -409,6 +409,9 @@ syscall(struct trapframe *frame)
 		error = (*callp->sy_call)(td, params);
 		AUDIT_SYSCALL_EXIT(error, td);
 
+		/* Save the latest error return value. */
+		td->td_errno = error;
+
 		CTR3(KTR_SYSC, "syscall: p=%s %s ret=%x", td->td_name,
 		     syscallnames[code], td->td_retval[0]);
 	}
Index: sys/sparc64/sparc64/trap.c
===================================================================
--- sys/sparc64/sparc64/trap.c	(revision 205027)
+++ sys/sparc64/sparc64/trap.c	(working copy)
@@ -652,6 +652,9 @@ syscall(struct trapframe *tf)
 		error = (*sa.callp->sy_call)(td, sa.argp);
 		AUDIT_SYSCALL_EXIT(error, td);
 
+		/* Save the latest error return value. */
+		td->td_errno = error;
+
 		CTR5(KTR_SYSC, "syscall: p=%p error=%d %s return %#lx %#lx",
 		    p, error, syscallnames[sa.code], td->td_retval[0],
 		    td->td_retval[1]);
Index: sys/ia64/ia64/trap.c
===================================================================
--- sys/ia64/ia64/trap.c	(revision 205027)
+++ sys/ia64/ia64/trap.c	(working copy)
@@ -974,6 +974,9 @@ syscall(struct trapframe *tf)
 	error = (*callp->sy_call)(td, args);
 	AUDIT_SYSCALL_EXIT(error, td);
 
+	/* Save the latest error return value. */
+	td->td_errno = error;
+
 	cpu_set_syscall_retval(td, error);
 	td->td_syscalls++;
 
Index: sys/ia64/ia32/ia32_trap.c
===================================================================
--- sys/ia64/ia32/ia32_trap.c	(revision 205027)
+++ sys/ia64/ia32/ia32_trap.c	(working copy)
@@ -127,6 +127,9 @@ ia32_syscall(struct trapframe *tf)
 		AUDIT_SYSCALL_ENTER(code, td);
 		error = (*callp->sy_call)(td, args64);
 		AUDIT_SYSCALL_EXIT(error, td);
+
+		/* Save the latest error return value. */
+		td->td_errno = error;
 	}
 
 	switch (error) {
Index: sys/sun4v/sun4v/trap.c
===================================================================
--- sys/sun4v/sun4v/trap.c	(revision 205027)
+++ sys/sun4v/sun4v/trap.c	(working copy)
@@ -666,6 +666,9 @@ syscall(struct trapframe *tf)
 		error = (*callp->sy_call)(td, argp);
 		AUDIT_SYSCALL_EXIT(error, td);
 
+		/* Save the latest error return value. */
+		td->td_errno = error;
+
 		CTR5(KTR_SYSC, "syscall: p=%p error=%d %s return %#lx %#lx ", p,
 		    error, syscallnames[code], td->td_retval[0],
 		    td->td_retval[1]);


More information about the freebsd-hackers mailing list