Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 26 May 2018 00:41:50 +0000 (UTC)
From:      Justin Hibbits <jhibbits@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r334230 - head/sys/powerpc/aim
Message-ID:  <201805260041.w4Q0foJ7097994@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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.
 	 */



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