Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/ia64/ia64 In map_vhpt(), read pmap_vhpt_log2size be...



details:   https://anonhg.NetBSD.org/src/rev/111d16588c70
branches:  trunk
changeset: 450595:111d16588c70
user:      scole <scole%NetBSD.org@localhost>
date:      Fri Apr 19 16:28:32 2019 +0000

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

diffstat:

 sys/arch/ia64/ia64/machdep.c |  14 ++++++++++----
 1 files changed, 10 insertions(+), 4 deletions(-)

diffs (37 lines):

diff -r 797c6b17b00e -r 111d16588c70 sys/arch/ia64/ia64/machdep.c
--- a/sys/arch/ia64/ia64/machdep.c      Fri Apr 19 01:52:55 2019 +0000
+++ b/sys/arch/ia64/ia64/machdep.c      Fri Apr 19 16:28:32 2019 +0000
@@ -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 @@
         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));



Home | Main Index | Thread Index | Old Index