Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 30 Sep 2014 08:22:52 -0700
From:      Nathan Whitehorn <nwhitehorn@freebsd.org>
To:        Mark Millard <markmi@dsl-only.net>, FreeBSD PowerPC ML <freebsd-ppc@freebsd.org>
Cc:        Justin Hibbits <chmeeedalf@gmail.com>
Subject:   Re: powerpc64/GENERIC64: possible misuse of tlbsync instruction for moea64_cpu_bootstrap_native? Possible lack of isync instruction?
Message-ID:  <542ACACC.1010208@freebsd.org>
In-Reply-To: <901E3FCC-1387-46B0-98D4-78EF286D6E6C@dsl-only.net>
References:  <901E3FCC-1387-46B0-98D4-78EF286D6E6C@dsl-only.net>

next in thread | previous in thread | raw e-mail | index | archive | help
This is all fine. These two sets of instructions are somewhat special 
(and one-offs). The tlbsync here is unnecessary, as you note, but 
harmless (it dates to when using tlbie instead of tlbiel). If you think 
it is causing a problem for some reason, you can try swapping it with a 
ptesync only.
-Nathan

On 09/30/14 06:37, Mark Millard wrote:
> PowerISA_V2.07_PUBLIC.pdf page labeled 935, section 5.10.1 Page table 
> Updates says of tlbsync...
>
> Software must execute */tlbie /*and */tlbsync /*instructions only as 
> part of the following sequence, and must ensure that no other thread 
> will execute a “conflicting instruction” while the instructions in the 
> sequence are executing on the given thread. In addition to achieving 
> the required system synchronization, the sequence will cause 
> transactions that include accesses to the affected page(s) to fail.
>
> */tlbie /*instruction(s) specifying the same LPID oper- and value
> */eieio
> tlbsync/*
>
> */ptesync/*
>
> There is also the prior page (labeled 934) which says (and older 
> documentation seems to agree)...
>
> */tlbsync /*should not be used to synchronize the completion of 
> */tlbiel/*.
>
> [Other places in the document also report that. Some older documents 
> are explicit about ptesync use: "To synchronize the completion of this 
> processor local form of *tlbie*, only a *ptesync *is required 
> (*tlbsync *should not be used)." ]
>
> But /usr/src/sys/powerpc/aim/moea64_native.c has 
> moea64_cpu_bootstrap_native(...) doing...
>
> ...
>         /*
>          * Install page table
>          */
>
>         __asm __volatile ("ptesync; mtsdr1 %0; isync"
>             :: "r"((uintptr_t)moea64_pteg_table
>                      | (uintptr_t)(flsl(moea64_pteg_mask >> 11))));
>         tlbia();
> }
>
> which in turn does...
>
> static void
> tlbia(void)
> {
>         vm_offset_t i;
>         #ifndef __powerpc64__
>         register_t msr, scratch;
>         #endif
>
>         TLBSYNC();
>
>         for (i = 0; i < 0xFF000; i += 0x00001000) {
>                 #ifdef __powerpc64__
>                 __asm __volatile("tlbiel %0" :: "r"(i));
>                 #else
>                 __asm __volatile("\
>                     mfmsr %0; \
>                     mr %1, %0; \
>                     insrdi %1,%3,1,0; \
>                     mtmsrd %1; \
>                     isync; \
>                     \
>                     tlbiel %2; \
>                     \
>                     mtmsrd %0; \
>                     isync;"
>                 : "=r"(msr), "=r"(scratch) : "r"(i), "r"(1));
>                 #endif
>         }
>
>         EIEIO();
>         TLBSYNC();
> }
>
> which involves...
>
> #define TLBSYNC()       __asm __volatile("tlbsync; ptesync");
>
> The first TLBSYNC() above uses tlbsync without being part of a tlbie; 
> eieio; tlbsync; ptesync sequence, violating the first point that I quoted.
>
> The second also has that property but there was also a tlbiel used 
> first, apparently violating the second point that I quoted.
>
>
> tlbiel is documented in boot III-S as requiring a 
> context-synchronizing instruction first and a ptesync after for data 
> access. For instruction access: nothing before but 
> context-synchronizing after. No tlbsync is listed as required.
>
> For the __powerpc64__ above the tlbiel's are not followed by a 
> context-sychronizing instruction (sc, isync, rfid, mtmsr[d] with L=0, 
> etc.) and so would need to not effectively be involved in later 
> instruction access. (The ptesync is listed as execution synchronizing, 
> not context synchronizing.)
>
>
>
> Another quote about tlbiel (page labeled 933):
>
> The primary use of this instruction by operating system software is to 
> invalidate TLB entries that were created by the hypervisor using an 
> implemen- tation-specific hypervisor-managed TLB facility, if such a 
> facility is provided.
>
>
>
>
>
>
> ===
> Mark Millard
> markmi at dsl-only.net <http://dsl-only.net>;
>




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