On Fri, May 10, 2024 at 04:45:37PM +1000, Michael Ellerman wrote: > Segher Boessenkool <seg...@kernel.crashing.org> writes: > > On Thu, May 09, 2024 at 10:12:48PM +1000, Michael Ellerman wrote: > >> cpu_has_feature()/mmu_has_feature() are only able to check a single > >> feature at a time, but there is no enforcement of that. > >> > >> In fact, as fixed in the previous commit, there was code that was > >> passing multiple values to cpu_has_feature(). > >> > >> So add a check that only a single feature is passed using popcount. > >> > >> Note that the test allows 0 or 1 bits to be set, because some code > >> relies on cpu_has_feature(0) being false, the check with > >> CPU_FTRS_POSSIBLE ensures that. See for example CPU_FTR_PPC_LE. > > > > This btw is exactly > > > > BUILD_BUG_ON(feature & (feature - 1)); > > > > but the popcount is more readable :-) > > Yeah for those of us who don't see bits cascading in our sleep I think > the popcount is easier to understand ;)
Absolutely :-) This is just one of the most well-known bittricks, for seeing if x is a power of two you write x && x & (x-1) but here you do not need to test for x not being zero. Hardly ever get to use that simpler thing, so it jumped out at me here :-) [ For understanding the x & (x-1) thing, it is perhaps easiest if you first consider an x with more than one bit set: x-1 will have the same topmost set bit. ] Segher