Subject: FYI: FreeBSD Pentium Bug fix (proposed)
To: None <port-i386@NetBSD.ORG>
From: Matt Thomas <matt@3am-software.com>
List: port-i386
Date: 11/15/1997 11:03:03
>Date: Fri, 14 Nov 1997 17:12:15 -0600
>From: Jonathan Lemon <jlemon@americantv.com>
>To: hackers@FreeBSD.ORG
>Subject: FreeBSD Pentium Bug fix (proposed)
>X-Mailer: Mutt 0.61.1
>Sender: owner-freebsd-hackers@FreeBSD.ORG
>X-Loop: FreeBSD.org
>
>Alright, I've been watching the debate about the LOCK CMPXCHG8 bug, 
>and decided to take a crack at it.  While I believe that for the most
>case, this is probably just a tempest in a teapot, for some, it probably
>represents a serious DOS that should be addressed.
>
>IMHO, the "take page fault on any trapno < 7" solution is a very ugly
>hack, but it got me thinking about a better way to solve this.  The 
>solution seems to depend on the fact that a page fault has a higher 
>priority than an illegal instruction fault, and thus, if both are posted
>first, then the page fault takes precedence.
>
>This made me think that there might be other faults that also have higher
>precedence than the illegal instruction fault, and which could be localized
>to just the #UD handler.  It turns out that exceeding the segment limit
>is one of them.
>
>My ``fix'' is to have the IDT descriptor reference a segemnt which has
>a length of 0.  This has the effect of mapping SIGILL into SIGBUS, so that
>the `cmpxchg8' crash now generates a Bus error.  (I didn't bother returning
>the correct signal; it can probably be added if it is important) 
>
>This fix works on my machine, takes no overhead, and the only breaks
>BDE_DEBUGGER, which wants to hoard all the GDT entries for itself.  :-)
>
>I'd appreciate it if interested parties could try this out and see if 
>it also fixes the problem on other machines.
>--
>Jonathan
>
>--------------------------------- cut here ---------------------------------
>Index: machdep.c
>===================================================================
>RCS file: /tuna/ncvs/src/sys/i386/i386/machdep.c,v
>retrieving revision 1.270
>diff -c -r1.270 machdep.c
>***************
>*** 981,986 ****
>--- 993,1009 ----
>  	0, 0,
>  	1,			/* default 32 vs 16 bit size */
>  	1  			/* limit granularity (byte/page units)*/ },
>+ #ifdef CMPXCHG8_BUG
>+ /* GBUG_SEL	11 Invalid Descriptor for CMPXCHG8_BUG */
>+ {	0x0,			/* segment base address  */
>+ 	0x0,			/* length - none */
>+ 	SDT_MEMERA,		/* segment type */
>+ 	0,			/* segment descriptor priority level */
>+ 	1,			/* segment descriptor present */
>+ 	0, 0,
>+ 	1,			/* default 32 vs 16 bit size */
>+ 	1  			/* limit granularity (byte/page units)*/ },
>+ #endif
>  };
>  
>  static struct soft_segment_descriptor ldt_segs[] = {
>***************
>*** 1209,1216 ****
>--- 1232,1244 ----
>  #endif
>  
>  	finishidentcpu();	/* Final stage of CPU initialization */
>+ #ifdef CMPXCHG8_BUG
>+ 	setidt(6, &IDTVEC(ill),  SDT_SYS386TGT, SEL_KPL, GSEL(GBUG_SEL, SEL_KPL));
>+ #else
>  	setidt(6, &IDTVEC(ill),  SDT_SYS386TGT, SEL_KPL, GSEL(GCODE_SEL, SEL_KPL));
>+ #endif
>  	initializecpu();	/* Initialize CPU registers */
>+ 
>  
>  	/* Use BIOS values stored in RTC CMOS RAM, since probing
>  	 * breaks certain 386 AT relics.
>Index: include/segments.h
>===================================================================
>RCS file: /tuna/ncvs/src/sys/i386/include/segments.h,v
>retrieving revision 1.17
>diff -c -r1.17 segments.h
>*** segments.h	1997/08/21 06:32:49	1.17
>--- segments.h	1997/11/14 22:34:58
>***************
>*** 215,225 ****
>--- 215,232 ----
>  #define GAPMCODE32_SEL	8	/* APM BIOS 32-bit interface (32bit Code) */
>  #define GAPMCODE16_SEL	9	/* APM BIOS 32-bit interface (16bit Code) */
>  #define GAPMDATA_SEL	10	/* APM BIOS 32-bit interface (Data) */
>+ #ifdef CMPXCHG8_BUG
>+ #define GBUG_SEL	11	/* Invalid Descriptor for CMPXCHG8_BUG */
>+ #endif
>  
>  #ifdef BDE_DEBUGGER
>  #define	NGDT		18	/* some of 11-17 are reserved for debugger */
>  #else
>+ #ifdef CMPXCHG8_BUG
>+ #define NGDT 		(GBUG_SEL + 1)
>+ #else
>  #define NGDT 		(GAPMDATA_SEL + 1)
>+ #endif
>  #endif
>  
>  /*
>
>
-- 
Matt Thomas               Internet:   matt@3am-software.com
3am Software Foundry      WWW URL:    http://www.3am-software.com/bio/matt/
Nashua, NH                Disclaimer: I disavow all knowledge of this message