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>