Module Name:    src
Committed By:   scole
Date:           Fri Apr 19 16:28:32 UTC 2019

Modified Files:
        src/sys/arch/ia64/ia64: machdep.c

Log Message:
In map_vhpt(), read pmap_vhpt_log2size before any memory translation
instructions to avoid "Data Nested TLB faults" with GCC 7.4.0


To generate a diff of this commit:
cvs rdiff -u -r1.42 -r1.43 src/sys/arch/ia64/ia64/machdep.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/ia64/ia64/machdep.c
diff -u src/sys/arch/ia64/ia64/machdep.c:1.42 src/sys/arch/ia64/ia64/machdep.c:1.43
--- src/sys/arch/ia64/ia64/machdep.c:1.42	Sat Apr  6 03:06:25 2019
+++ src/sys/arch/ia64/ia64/machdep.c	Fri Apr 19 16:28:32 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.42 2019/04/06 03:06:25 thorpej Exp $	*/
+/*	$NetBSD: machdep.c,v 1.43 2019/04/19 16:28:32 scole Exp $	*/
 
 /*-
  * Copyright (c) 2003,2004 Marcel Moolenaar
@@ -267,18 +267,24 @@ map_vhpt(uintptr_t vhpt)
         pt_entry_t pte;
         uint64_t psr;
 
+	/*
+	 * XXX read pmap_vhpt_log2size before any memory translation
+	 * instructions to avoid "Data Nested TLB faults".  Not
+	 * exactly sure why this is needed with GCC 7.4
+	 */
+	register uint64_t log2size = pmap_vhpt_log2size << 2;
+	
         pte = PTE_PRESENT | PTE_MA_WB | PTE_ACCESSED | PTE_DIRTY |
 		PTE_PL_KERN | PTE_AR_RW;
         pte |= vhpt & PTE_PPN_MASK;
 
-        __asm __volatile("ptr.d %0,%1" :: "r"(vhpt),
-			 "r"(pmap_vhpt_log2size << 2));
+        __asm __volatile("ptr.d %0,%1" :: "r"(vhpt), "r"(log2size));
 
         __asm __volatile("mov   %0=psr" : "=r"(psr));
         __asm __volatile("rsm   psr.ic|psr.i");
         ia64_srlz_i();
         ia64_set_ifa(vhpt);
-        ia64_set_itir(pmap_vhpt_log2size << 2);
+	ia64_set_itir(log2size);
         ia64_srlz_d();
         __asm __volatile("itr.d dtr[%0]=%1" :: "r"(3), "r"(pte));
         __asm __volatile("mov   psr.l=%0" :: "r" (psr));

Reply via email to