Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 14 Apr 2008 15:31:37 +0300
From:      Kostik Belousov <kostikbel@gmail.com>
To:        Chagin Dmitry <chagin.dmitry@gmail.com>
Cc:        freebsd-emulation@freebsd.org
Subject:   Re: Call for review && test: linux_kdump-1.6
Message-ID:  <20080414123137.GH18958@deviant.kiev.zoral.com.ua>
In-Reply-To: <20080413234359.H1165@ora.chd.net>
References:  <20080412181712.Y38920@ora.chd.net> <20080412145401.GA4139@freebsd.org> <20080413214624.S7426@ora.chd.net> <20080413183248.GA68642@freebsd.org> <20080413183659.GA18958@deviant.kiev.zoral.com.ua> <20080413231135.K1079@ora.chd.net> <20080413192614.GC18958@deviant.kiev.zoral.com.ua> <20080413234359.H1165@ora.chd.net>

next in thread | previous in thread | raw e-mail | index | archive | help

--LiQwW4YX+w4axhAx
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Mon, Apr 14, 2008 at 12:42:29AM +0400, Chagin Dmitry wrote:
> On Sun, 13 Apr 2008, Kostik Belousov wrote:
>=20
> >On Sun, Apr 13, 2008 at 11:11:55PM +0400, Chagin Dmitry wrote:
> >>On Sun, 13 Apr 2008, Kostik Belousov wrote:
> >>
> >>>On Sun, Apr 13, 2008 at 08:32:48PM +0200, Roman Divacky wrote:
> >>>>On Sun, Apr 13, 2008 at 09:58:08PM +0400, Chagin Dmitry wrote:
> >>>>>On Sat, 12 Apr 2008, Roman Divacky wrote:
> >>>>>
> >>>>>>>And question: whether i can add to linuxolator some ktr_struct
> >>>>>>>  functionality?
> >>>>>>
> >>>>>>sure... please provide a patch and I'll take care about it.
> >>>>>
> >>>>>ok, thnx :)
> >>>>>what about EJUSTRETURN?
> >>>>>i attached simple patch for demo only (not tested).
> >>>>
> >>>>uh... can you provide diff -u ? I dont understand the diff at all ;)
> >>>
> >>>Also, please note that the ML software strips your attachments. Either
> >>>inline the patch, or use the plain-text content-type for it.
> >>>
> >>
> >>ups... ah google ))
> >>i have understood, sorry and thnx.
> >>Speech about that in linux_kdump it is impossible to distinguish
> >>EJUSTRETURN from a real error. look:
> >>
> >>--- sys/i386/i386/trap.c.orig	2008-04-13 21:39:18.000000000 +0400
> >>+++ sys/i386/i386/trap.c	2008-04-13 22:35:25.000000000 +0400
> >>@@ -1091,8 +1091,12 @@
> >>  	    td->td_proc->p_pid, td->td_name, code);
> >>
> >>  #ifdef KTRACE
> >>-	if (KTRPOINT(td, KTR_SYSRET))
> >>-		ktrsysret(code, error, td->td_retval[0]);
> >>+	if (KTRPOINT(td, KTR_SYSRET)) {
> >>+		if (error =3D=3D EJUSTRETURN)
> >>+			ktrsysret(code, 0, td->td_retval[0]);
> >>+		else
> >>+			ktrsysret(code, error, td->td_retval[0]);
> >>+	}
> >>  #endif
> >>
> >>  	/*
> >>@@ -1104,4 +1108,3 @@
> >>
> >>  	PTRACESTOP_SC(p, td, S_PT_SCX);
> >>  }
> >>-
> >
> >I do not quite understand the intent of this change.
> >
> >EJUSTRETURN is used for two different purposes in the kernel.
> >1. The sigreturn family of the syscalls use it after the interrupted
> >frame is restored to avoid the normal syscall return sequence to modify
> >the machine state.
> >2. It is used by the kernel to notify the in-kernel caller code about
> >some special condition, that nonetheless shall not be returned to the
> >userspace.
> >
> >Only the first case is applicable to the kdump, and IMHO you actually
> >destroy some information, since error =3D=3D EJUSTRETURN is reported as =
0.
> >
> >Could you, please, provide some more arguments in the support of your
> >proposed change ?
> >
>=20
> Thanks for you informative reply Kostya.
> The problem arises only in linux_kdump. Because linux error
> codes negative and EJUSTRETURN coincides with ENOENT.
> Before a call ktr_sysret we decode return codes of emulators syscalls.

Ah, I see. Then, we shall never dump the ERESTART and EJUSTRETURN
for the emulated ABIs. At least, this is true for Linux, I am not
so sure about iBCS2 and SVR4.

Could you test the patch below, instead ?

diff --git a/sys/amd64/amd64/trap.c b/sys/amd64/amd64/trap.c
index b6a454d..9ccbd4b 100644
--- a/sys/amd64/amd64/trap.c
+++ b/sys/amd64/amd64/trap.c
@@ -912,8 +912,23 @@ syscall(struct trapframe *frame)
 	    td->td_proc->p_pid, td->td_name, code);
=20
 #ifdef KTRACE
-	if (KTRPOINT(td, KTR_SYSRET))
-		ktrsysret(code, error, td->td_retval[0]);
+	if (KTRPOINT(td, KTR_SYSRET)) {
+		int error1;
+
+		/*
+		 * The ABIs that use the negative error codes, like
+		 * Linux, would confuse the in-kernel errno values
+		 * with proper userspace errno. Clean these values to
+		 * avoid a confusion in the kdump.
+		 */
+		if (p->p_sysent->sv_errsize &&
+		    (error =3D=3D EJUSTRETURN || error =3D=3D ERESTART))
+			error1 =3D 0;
+		else
+			error1 =3D error;
+
+		ktrsysret(code, error1, td->td_retval[0]);
+	}
 #endif
=20
 	/*
diff --git a/sys/i386/i386/trap.c b/sys/i386/i386/trap.c
index e7de579..55642d1 100644
--- a/sys/i386/i386/trap.c
+++ b/sys/i386/i386/trap.c
@@ -1091,8 +1091,22 @@ syscall(struct trapframe *frame)
 	    td->td_proc->p_pid, td->td_name, code);
=20
 #ifdef KTRACE
-	if (KTRPOINT(td, KTR_SYSRET))
-		ktrsysret(code, error, td->td_retval[0]);
+	if (KTRPOINT(td, KTR_SYSRET)) {
+		int error1;
+
+		/*
+		 * The ABIs that use the negative error codes, like
+		 * Linux, would confuse the in-kernel errno values
+		 * with proper userspace errno. Clean these values to
+		 * avoid a confusion in the kdump.
+		 */
+		if (p->p_sysent->sv_errsize &&
+		    (error =3D=3D EJUSTRETURN || error =3D=3D ERESTART))
+			error1 =3D 0;
+		else
+			error1 =3D error;
+		ktrsysret(code, error1, td->td_retval[0]);
+	}
 #endif
=20
 	/*

--LiQwW4YX+w4axhAx
Content-Type: application/pgp-signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.8 (FreeBSD)

iEYEARECAAYFAkgDTqkACgkQC3+MBN1Mb4jprgCgp4mCU+ZN5pVIE5ou5CJumCKl
egEAoI+ZkemjvkyonzDvdduetOq6+y6f
=fb2Y
-----END PGP SIGNATURE-----

--LiQwW4YX+w4axhAx--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20080414123137.GH18958>