Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 01 Jul 2000 01:29:41 +0900
From:      KATO Takenori <kato@ganko.eps.nagoya-u.ac.jp>
To:        hackers@FreeBSD.ORG
Subject:   invlpg produces strange sig11 on PentiumPro box
Message-ID:  <20000701012941S.kato@gneiss.eps.nagoya-u.ac.jp>

next in thread | raw e-mail | index | archive | help
The invlpg instruction causes strange signal 11 problem on some
PentiumPro box.  This problem seems to hapen when (1) mother board is
very old and (2) BIOS update is not available and (3) cpuid < 0x619.

Following patch automatically disables invlpg when PentiumPro with
cpuid < 0x619 is found.

Please comment to this patch.

---------- BEGIN ----------
*** sys/i386/isa/initcpu.c.ORIG	Sat Jul  1 01:03:40 2000
--- sys/i386/isa/initcpu.c	Sat Jul  1 01:06:28 2000
***************
*** 46,51 ****
--- 46,55 ----
  void	enable_K6_2_wt_alloc(void);
  #endif
  
+ #ifdef I686_CPU
+ extern	int invlpgbug;
+ #endif
+ 
  #ifdef I486_CPU
  static void init_5x86(void);
  static void init_bluelightning(void);
***************
*** 449,454 ****
--- 453,462 ----
  	apicbase = rdmsr(0x1b);
  	apicbase &= ~0x800LL;
  	wrmsr(0x1b, apicbase);
+ #endif
+ #ifndef CPU_DONT_DISABLE_INVLPG
+ 	if (cpu_id < 0x619)
+ 		invlpgbug = 1;
  #endif
  }
  
*** sys/i386/isa/pmap.c.ORIG	Sat Jul  1 01:06:46 2000
--- sys/i386/isa/pmap.c	Sat Jul  1 01:13:37 2000
***************
*** 171,176 ****
--- 171,181 ----
  static struct pv_entry *pvinit;
  
  /*
+  * When invlpgbug = 1, we don't use invlpg instruction.
+  */
+ int	invlpgbug;
+ 
+ /*
   * All those kernel PT submaps that BSD is so fond of
   */
  pt_entry_t *CMAP1 = 0;
***************
*** 358,364 ****
  
  	pgeflag = 0;
  #if !defined(SMP)
! 	if (cpu_feature & CPUID_PGE) {
  		pgeflag = PG_G;
  	}
  #endif
--- 363,369 ----
  
  	pgeflag = 0;
  #if !defined(SMP)
! 	if (cpu_feature & CPUID_PGE && !invlpg) {
  		pgeflag = PG_G;
  	}
  #endif
***************
*** 581,587 ****
  	} else
  #endif
  	{
! 		invlpg(va);
  	}
  }
  
--- 586,595 ----
  	} else
  #endif
  	{
! 		if (invlpgbug)
! 			invltlb();
! 		else
! 			invlpg(va);
  	}
  }
  
***************
*** 884,890 ****
  		 */
  		*(ptek + i) = VM_PAGE_TO_PHYS(m) | PG_RW | PG_V | pgeflag;
  		if (oldpte) {
! 			if ((oldpte & PG_G) || (cpu_class > CPUCLASS_386)) {
  				invlpg((vm_offset_t) up + i * PAGE_SIZE);
  			} else {
  				updateneeded = 1;
--- 892,899 ----
  		 */
  		*(ptek + i) = VM_PAGE_TO_PHYS(m) | PG_RW | PG_V | pgeflag;
  		if (oldpte) {
! 			if (((oldpte & PG_G) || (cpu_class > CPUCLASS_386)) &&
! 			    !invlpgbug) {
  				invlpg((vm_offset_t) up + i * PAGE_SIZE);
  			} else {
  				updateneeded = 1;
***************
*** 925,931 ****
  
  		oldpte = *(ptek + i);
  		*(ptek + i) = 0;
! 		if ((oldpte & PG_G) || (cpu_class > CPUCLASS_386))
  			invlpg((vm_offset_t) p->p_addr + i * PAGE_SIZE);
  		vm_page_unwire(m, 0);
  		vm_page_free(m);
--- 934,940 ----
  
  		oldpte = *(ptek + i);
  		*(ptek + i) = 0;
! 		if (((oldpte & PG_G) || (cpu_class > CPUCLASS_386)) && !invlpgbug)
  			invlpg((vm_offset_t) p->p_addr + i * PAGE_SIZE);
  		vm_page_unwire(m, 0);
  		vm_page_free(m);
***************
*** 933,938 ****
--- 942,950 ----
  #if defined(I386_CPU)
  	if (cpu_class <= CPUCLASS_386)
  		invltlb();
+ #else
+ 	if (invlpgbug)
+ 		invltlb();
  #endif
  }
  
***************
*** 2785,2792 ****
  	} else
  #endif
  	{
! 		invlpg((u_int)CADDR1);
! 		invlpg((u_int)CADDR2);
  	}
  
  	bcopy(CADDR1, CADDR2, PAGE_SIZE);
--- 2797,2808 ----
  	} else
  #endif
  	{
! 		if (invlpgbug)
! 			invltlb();
! 		else {
! 			invlpg((u_int)CADDR1);
! 			invlpg((u_int)CADDR2);
! 		}
  	}
  
  	bcopy(CADDR1, CADDR2, PAGE_SIZE);
---------- END ----------

-----------------------------------------------+--------------------------+
KATO Takenori <kato@ganko.eps.nagoya-u.ac.jp>  |        FreeBSD           |
Dept. Earth Planet. Sci, Nagoya Univ.          |    The power to serve!   |
Nagoya, 464-8602, Japan                        |  http://www.FreeBSD.org/ |
++++ FreeBSD(98) 4.0R-Rev. 01 available!       |http://www.jp.FreeBSD.org/|
++++ FreeBSD(98) 3.4R-Rev. 01 available!       +==========================+



To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20000701012941S.kato>