Message ID | 20180424041559.32410-1-mpe@ellerman.id.au (mailing list archive) |
---|---|
State | Accepted |
Commit | a6b3964ad71a61bb7c61d80a60bea7d42187b2eb |
Headers | show |
Series | [1/6] powerpc/64s: Add barrier_nospec | expand |
On Tue, 24 Apr 2018 14:15:54 +1000 Michael Ellerman <mpe@ellerman.id.au> wrote: > From: Michal Suchanek <msuchanek@suse.de> > > A no-op form of ori (or immediate of 0 into r31 and the result stored > in r31) has been re-tasked as a speculation barrier. The instruction > only acts as a barrier on newer machines with appropriate firmware > support. On older CPUs it remains a harmless no-op. > > Implement barrier_nospec using this instruction. > > mpe: The semantics of the instruction are believed to be that it > prevents execution of subsequent instructions until preceding branches > have been fully resolved and are no longer executing speculatively. > There is no further documentation available at this time. > > Signed-off-by: Michal Suchanek <msuchanek@suse.de> > Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> > --- > mpe: Make it Book3S64 only, update comment & change log, add a > memory clobber to the asm. These all seem good to me. Thanks Michal. We should (eventually) work on the module patching problem too. Thanks, Nick
On Tue, 2018-04-24 at 04:15:54 UTC, Michael Ellerman wrote: > From: Michal Suchanek <msuchanek@suse.de> > > A no-op form of ori (or immediate of 0 into r31 and the result stored > in r31) has been re-tasked as a speculation barrier. The instruction > only acts as a barrier on newer machines with appropriate firmware > support. On older CPUs it remains a harmless no-op. > > Implement barrier_nospec using this instruction. > > mpe: The semantics of the instruction are believed to be that it > prevents execution of subsequent instructions until preceding branches > have been fully resolved and are no longer executing speculatively. > There is no further documentation available at this time. > > Signed-off-by: Michal Suchanek <msuchanek@suse.de> > Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Series applied to powerpc next. https://git.kernel.org/powerpc/c/a6b3964ad71a61bb7c61d80a60bea7 cheers
diff --git a/arch/powerpc/include/asm/barrier.h b/arch/powerpc/include/asm/barrier.h index c7c63959ba91..e582d2c88092 100644 --- a/arch/powerpc/include/asm/barrier.h +++ b/arch/powerpc/include/asm/barrier.h @@ -76,6 +76,21 @@ do { \ ___p1; \ }) +#ifdef CONFIG_PPC_BOOK3S_64 +/* + * Prevent execution of subsequent instructions until preceding branches have + * been fully resolved and are no longer executing speculatively. + */ +#define barrier_nospec_asm ori 31,31,0 + +// This also acts as a compiler barrier due to the memory clobber. +#define barrier_nospec() asm (stringify_in_c(barrier_nospec_asm) ::: "memory") + +#else /* !CONFIG_PPC_BOOK3S_64 */ +#define barrier_nospec_asm +#define barrier_nospec() +#endif + #include <asm-generic/barrier.h> #endif /* _ASM_POWERPC_BARRIER_H */