Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 14 Apr 2008 16:49:35 +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:  <20080414134935.GI18958@deviant.kiev.zoral.com.ua>
In-Reply-To: <20080414123137.GH18958@deviant.kiev.zoral.com.ua>
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> <20080414123137.GH18958@deviant.kiev.zoral.com.ua>

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

--VaKJWhUROU/xPxjb
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Mon, Apr 14, 2008 at 03:31:37PM +0300, Kostik Belousov wrote:
> 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. Eith=
er
> > >>>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 a=
s 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.
>=20
> 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.
>=20
> Could you test the patch below, instead ?

> 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

The patch is obviously wrong, it just prevents the Linux ENOENT to be
dumped. Please, try this one instead.

diff --git a/sys/amd64/amd64/trap.c b/sys/amd64/amd64/trap.c
index b6a454d..3b1368a 100644
--- a/sys/amd64/amd64/trap.c
+++ b/sys/amd64/amd64/trap.c
@@ -861,9 +861,18 @@ syscall(struct trapframe *frame)
 		frame->tf_rip -=3D frame->tf_err;
 		frame->tf_r10 =3D frame->tf_rcx;
 		td->td_pcb->pcb_flags |=3D PCB_FULLCTX;
-		break;
-
+		/* FALLTHROUGH */
 	case EJUSTRETURN:
+#ifdef KTRACE
+		/*
+		 * 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 0;
+#endif
 		break;
=20
 	default:
diff --git a/sys/i386/i386/trap.c b/sys/i386/i386/trap.c
index e7de579..6ec04b0 100644
--- a/sys/i386/i386/trap.c
+++ b/sys/i386/i386/trap.c
@@ -1040,9 +1040,18 @@ syscall(struct trapframe *frame)
 		 * int 0x80 is 2 bytes. We saved this in tf_err.
 		 */
 		frame->tf_eip -=3D frame->tf_err;
-		break;
-
+		/* FALLTHROUGH */
 	case EJUSTRETURN:
+#ifdef KTRACE
+		/*
+		 * 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 0;
+#endif
 		break;
=20
 	default:

--VaKJWhUROU/xPxjb
Content-Type: application/pgp-signature
Content-Disposition: inline

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

iEYEARECAAYFAkgDYO8ACgkQC3+MBN1Mb4iZAgCfaIJomsC7FhgFeMixLPWWXc4F
EvEAnjVy/jjNkuu9iKYEyH5u98n9axku
=/lAo
-----END PGP SIGNATURE-----

--VaKJWhUROU/xPxjb--



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