Date: Fri, 27 Jul 2007 08:19:07 -0400 From: John Baldwin <jhb@freebsd.org> To: Don Lewis <truckman@freebsd.org> Cc: cvs-src@freebsd.org, src-committers@freebsd.org, cvs-all@freebsd.org Subject: Re: cvs commit: src/sys/i386/i386 trap.c Message-ID: <200707270819.08197.jhb@freebsd.org> In-Reply-To: <200707271042.l6RAgKhZ082086@gw.catspoiler.org> References: <200707271042.l6RAgKhZ082086@gw.catspoiler.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Friday 27 July 2007 06:42:20 am Don Lewis wrote:
> On 13 Jun, John Baldwin wrote:
> > jhb 2007-06-13 22:37:48 UTC
> >
> > FreeBSD src repository
> >
> > Modified files:
> > sys/i386/i386 trap.c
> > Log:
> > Don't clobber tf_err with the eva from a page fault as the page fault
> > address is saved in ksi_addr already.
> >
> > PR: i386/101379
> > Submitted by: Tijl Coosemans : tijl ulyssis org
> >
> > Revision Changes Path
> > 1.306 +0 -3 src/sys/i386/i386/trap.c
>
> This change appears to have broken the garbage collector in
> ports/lang/pm3-base, which means that cvsup no longer works on -CURRENT.
> The garbage collector uses the old sigvec() interface, and counts on
> getting the fault address from the sc_err field in struct sigcontext,
> which is copied from tf_err.
>
> The Modula-3 source code for the handler and the sigvec() call is in
> pm3-1.1.15/libs/m3core/src/runtime/FreeBSD4/RTHeapDep.m3 under the port
> work directory. Since Modula-3 compiler uses this code, the compiler is
> bootstrapped from a version of this file that has already been
> translated to i386 assembly language. The latter lives in
> pm3-1.1.15/boot-FreeBSD4/m3core/FreeBSD4/RTHeapDep.ms.
>
> Modifying the assembly code to convert it to use sigaction() and to pull
> the fault address out of the siginfo structure is left as an exercise
> for someone more masochistic than me.
Assuming wine doesn't use sigvec() this should work. I noticed while looking
at this that ddb's backtrace had some special handling that assumes tf_err ==
faulting address as well. :-/
Index: machdep.c
===================================================================
RCS file: /usr/cvs/src/sys/i386/i386/machdep.c,v
retrieving revision 1.657
diff -u -r1.657 machdep.c
--- machdep.c 6 Jun 2007 07:35:07 -0000 1.657
+++ machdep.c 27 Jul 2007 12:17:22 -0000
@@ -352,7 +352,12 @@
sf.sf_siginfo.si_sc.sc_pc = regs->tf_eip;
sf.sf_siginfo.si_sc.sc_ps = regs->tf_eflags;
sf.sf_siginfo.si_sc.sc_trapno = regs->tf_trapno;
- sf.sf_siginfo.si_sc.sc_err = regs->tf_err;
+
+ /*
+ * XXX: Some old binaries using sigvec() such as cvsup depend
+ * on this.
+ */
+ sf.sf_siginfo.si_sc.sc_err = (register_t)ksi->ksi_addr;
/*
* If we're a vm86 process, we want to save the segment registers.
--
John Baldwin
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200707270819.08197.jhb>
