At the end is a potentially longer term fix for the ABI breakage that was introduced when the i386 mcontext_t was changed/enlarged.
Someone other than I (Bruce?) should vet this. It should solve the libc_r binary compatibility problem, but it may not fix everything. Applications that copy ucontext_t's around (without changing corrupting the mc_fpformat field) will still break, but there may not be many (if any) of those. -- Dan Eischen Index: i386/i386/machdep.c =================================================================== RCS file: /opt/d/CVS/src/sys/i386/i386/machdep.c,v retrieving revision 1.539 diff -u -r1.539 machdep.c --- i386/i386/machdep.c 30 Sep 2002 07:02:22 -0000 1.539 +++ i386/i386/machdep.c 30 Sep 2002 20:42:30 -0000 @@ -680,7 +680,7 @@ struct proc *p = td->td_proc; struct trapframe *regs; const ucontext_t *ucp; - int cs, eflags, error, ret; + int cs, eflags, error; error = copyin(uap->sigcntxp, &uc, sizeof(uc)); if (error != 0) @@ -754,9 +754,15 @@ return (EINVAL); } - ret = set_fpcontext(td, &ucp->uc_mcontext); - if (ret != 0) - return (ret); + /* + * Intentionally ignore the error to keep binary + * compatibility with applications that fiddle with + * the FPU save area in the context. The kernel + * now saves the FPU state in the context, but it + * gets corrupted by those applications that try + * to work around the kernel NOT saving it. + */ + (void)set_fpcontext(td, &ucp->uc_mcontext); bcopy(&ucp->uc_mcontext.mc_fs, regs, sizeof(*regs)); } @@ -2109,7 +2115,7 @@ * Set machine context. * * However, we don't set any but the user modifyable flags, and - * we we won't touch the cs selector. + * we won't touch the cs selector. */ int set_mcontext(struct thread *td, const mcontext_t *mcp) @@ -2147,10 +2153,6 @@ static void get_fpcontext(struct thread *td, mcontext_t *mcp) { -#if 1 /* XXX: tmp hack to restore ability to run releng4 binaries */ - /* For now, always store the FP state in the PCB. */ - (void)npxgetregs(td, (union savefpu *)&td->td_pcb->pcb_save); -#else #ifndef DEV_NPX mcp->mc_fpformat = _MC_FPFMT_NODEV; mcp->mc_ownedfp = _MC_FPOWNED_NONE; @@ -2186,16 +2188,11 @@ } mcp->mc_fpformat = npxformat(); #endif -#endif /* tmp hack to restore ability to run releng4 binaries */ } static int set_fpcontext(struct thread *td, const mcontext_t *mcp) { -#if 1 /* XXX: tmp hack to restore ability to run releng4 binaries */ - /* For now, the FP state is always stored in the PCB. */ - npxsetregs(td, (union savefpu *)&td->td_pcb->pcb_save); -#else union savefpu *addr; if (mcp->mc_fpformat == _MC_FPFMT_NODEV) @@ -2234,7 +2231,6 @@ */ } else return (EINVAL); -#endif /* tmp hack to restore ability to run releng4 binaries */ return (0); } To Unsubscribe: send mail to [EMAIL PROTECTED] with "unsubscribe freebsd-current" in the body of the message