Date: Thu, 15 Nov 2001 23:56:13 EET From: Maxim Sobolev <sobomax@FreeBSD.org> To: marcus@marcuscom.com Cc: freebsd-ports@FreeBSD.org, hackers@FreeBSD.org Subject: Using bit 21 of EFLAGS in user-mode [was: Re: sigreturn: eflags creash (fixed!)] Message-ID: <200111152156.XAA79972@ipcard.iptcom.net> In-Reply-To: <20011115145029.G47613-200000@shumai.marcuscom.com>
index | next in thread | previous in thread | raw e-mail
[-- Attachment #1 --] On Thu, 15 Nov 2001 14:56:31 -0500 (EST), Joe Clarke wrote: > > I learned about this by reading through some of the -hackers archives. > One person complained of similar errors trying to get xine to work on > FreeBSD. Removing the MMX detection code fixed it. I remembered libpng > also used MMX, so I removed the pnggccrd.c source, and voila! > > Based on core dumps, strace output, and a lot of code surfing, this makes > sense to me. Basically, any png-dependent app's thread that runs longer > than what ITIMER_PROF is set to gets hit with a SIGPROF. When that > happens, things context switch. eflags must have been corrupted by the > MMX code, thus sigreturn() bombs out, and causes uthread_kern to die as > well. Here's what strace looks like when balsa tries to read a 33 MB > mailbox: > > 74202 sigreturn(0x81f2c64 > > When this happens, strace politely dies with a bus error. > > Thanks for testing this, Maxim. Hopefully someone can find the problem > and fix it for good. That explains... After a quick glance at png code I found that the only place where EFLAGS is altered is CPUID code, where the library flips bit 21 of EFLAGS in order to ensure that the CPUID instruction is supported (otherwise it will get SIGILL on older processors). Unfortunately, for some reason FreeBSB kernel considers bit 21 of EFLAGS as one that should not be altered in the user mode, thus making it illegal to use standard user-mode processor-detection routines based around that bit. AFAIK, it is a bug in FreeBSD, because there is actually nothing wrong with altering bit 21 in the user mode - it doesn't have any side effects and pretty much any of the currently available on the i386 OSes allows it. Therefore, I would like to ask you to test attached patch and if it works and there are no other objections I would like to commit it shortly. To test the patch, you need to recompile kernel with patch applied, reboot, recompile/reinstall png with MXX support turned on and try to run Nautilus. Please let me know if it helped or not. Thanks! -Maxim [-- Attachment #2 --] Index: sys/i386/include/psl.h =================================================================== RCS file: /home/ncvs/src/sys/i386/include/psl.h,v retrieving revision 1.10 diff -d -u -r1.10 psl.h --- sys/i386/include/psl.h 28 Aug 1999 00:44:22 -0000 1.10 +++ sys/i386/include/psl.h 15 Nov 2001 21:25:02 -0000 @@ -83,6 +83,6 @@ * 386's. */ #define PSL_USERCHANGE (PSL_C | PSL_PF | PSL_AF | PSL_Z | PSL_N | PSL_T \ - | PSL_D | PSL_V | PSL_NT | PSL_AC) + | PSL_D | PSL_V | PSL_NT | PSL_AC | PSL_ID) #endif /* !_MACHINE_PSL_H_ */help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200111152156.XAA79972>
