cvs commit: src/sys/i386/i386 trap.c
Don Lewis
truckman at FreeBSD.org
Mon Jul 30 07:17:47 UTC 2007
On 27 Jul, John Baldwin wrote:
> 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.
After installing this patch, the bootstrap in the pm3-base port still
fails. I installed pm3-base from the 6-STABLE package, and it isn't
able to compile any of the other ports. I suspect the reason for the
latter is that it is new enough to use sendsig() and not osendsig().
This makes sense because osendsig is a COMPAT_43 function and the binary
is a lot newer than that.
To preserve the "kludge" ABI as much as possible, I think it would be
necessary to move the assignment to sc_err into the if-else block that
checks to see if the signal handler was installed with the SA_SIGIFNO
flag, and to make the same change in sendsig(), osendsig(), and
freebsd4_sendsig(). This will break the wine port unless it uses
SA_SIGINFO.
As an alternative, I've got a set of patches to pm3-base to get it
working on -CURRENT. It wasn't too hard to fix the bootstrap to use the
"undocumented 4th arg" to the signal handler that is mentioned in
i386/include/sigframe.h. The rest of the patches change the low-level
Module-3 code to use sigaction() with the SA_SIGINFO flag instead of
using a mixture of sigaction() (without SA_SIGINFO) and sigvec().
I'll post the patches for testing once I've had a chance to clean them
up some more.
More information about the cvs-src
mailing list