Author: jhibbits
Date: Sat May 26 00:41:50 2018
New Revision: 334230
URL: https://svnweb.freebsd.org/changeset/base/334230

Log:
  Only crop the VPN on POWER4 and derivatives for TLBIE operations
  
  Summary:
  PowerISA 2.03 and later require bits 14:65 in the RB register argument,
  which is the full value of the vpn argument post-shift.  Only POWER4, POWER4+,
  and PPC970* need the upper 16 bits cropped.
  
  With this change FreeBSD can boot to multi-user on POWER9.
  
  Reviewed by:  nwhitehorn
  Differential Revision: https://reviews.freebsd.org/D15581

Modified:
  head/sys/powerpc/aim/moea64_native.c

Modified: head/sys/powerpc/aim/moea64_native.c
==============================================================================
--- head/sys/powerpc/aim/moea64_native.c        Fri May 25 23:18:06 2018        
(r334229)
+++ head/sys/powerpc/aim/moea64_native.c        Sat May 26 00:41:50 2018        
(r334230)
@@ -133,6 +133,8 @@ __FBSDID("$FreeBSD$");
 /* POWER9 only permits a 64k partition table size. */
 #define        PART_SIZE       0x10000
 
+static int moea64_crop_tlbie;
+
 static __inline void
 TLBIE(uint64_t vpn) {
 #ifndef __powerpc64__
@@ -144,12 +146,14 @@ TLBIE(uint64_t vpn) {
        static volatile u_int tlbie_lock = 0;
 
        vpn <<= ADDR_PIDX_SHFT;
-       vpn &= ~(0xffffULL << 48);
 
        /* Hobo spinlock: we need stronger guarantees than mutexes provide */
        while (!atomic_cmpset_int(&tlbie_lock, 0, 1));
        isync(); /* Flush instruction queue once lock acquired */
 
+       if (moea64_crop_tlbie)
+               vpn &= ~(0xffffULL << 48);
+
 #ifdef __powerpc64__
        __asm __volatile("tlbie %0" :: "r"(vpn) : "memory");
        __asm __volatile("eieio; tlbsync; ptesync" ::: "memory");
@@ -428,6 +432,15 @@ moea64_bootstrap_native(mmu_t mmup, vm_offset_t kernel
 
        moea64_early_bootstrap(mmup, kernelstart, kernelend);
 
+       switch (mfpvr() >> 16) {
+       case IBMPOWER4:
+       case IBMPOWER4PLUS:
+       case IBM970:
+       case IBM970FX:
+       case IBM970GX:
+       case IBM970MP:
+               moea64_crop_tlbie = true;
+       }
        /*
         * Allocate PTEG table.
         */
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to