On Mon, Jan 2, 2023 at 5:55 AM David Laight <David.Laight@xxxxxxxxxx> wrote: > > > It would just turn all kernel addresses into all ones, which is then > > guaranteed to fault. So no need for any conditional that never > > triggers in real life anyway. > > Are byte loads guaranteed to fault? Yeah, we don't map the highest address on x86-64. And we don't want to in the future either, because of how our error pointers work (ie if somebody misses an "IS_ERR()" check and uses an error pointer as a pointer, we want that to fault, rather than do random things). It's not a hard requirement architecturally (either hardware or software), and iirc on 32-bit we used to use the last virtual page for something, so maybe I'm missing some odd use on 64-bit too, but accessing the top-of-virtual address space on x86-64 should always cause a clear fault afaik. A byte access would always be a page fault, while a wrapping access might trigger a GP fault first (probably not - on 32-bit it would be a segment size violation, on 64-bit we've left those bad old days behind and I don't think wrapping matters either) > Presumably the fault handler already has the code to untag addresses. More importantly, the fault handler isn't in any critical path. By the time you've taken a page fault, the extra instructions to mask off any bits are entirely irrelevant. > It has to be said that I don't really see why tagging addresses is a > significant benefit unless the hardware checks than the PTE/TLB is > also set with the correct tag. You can certainly pair it with hardware support for checking the tag, but even without it, it can be a useful acceleration for doing software pointer tag checking without having to always add the extra code (and extra register pressure) to mask things off manually to dereference it. And traditionally, in various virtual machine environments, it's been used for hiding information about what the pointer _points_ to, without having to use up extra memory for some kind of type lookup. Old old LISP being the traditional case (not because of some "top byte ignore" flag, but simply because the address space was smaller than the word size). People did the same on the original m68k - and for the exact same reason. Of course, on m68k it was a horrible mistake that people still remember ("You're telling me 24 bits wasn't enough after all?") but it's a new day, and 64 bits is a _lot)_ more than 32 bits. The new world order of "56 bits is actually enough" is likely to remain true in a lot of environments for the foreseeable future - the people who already disagree tend to special, either because they want to use the virtual address bits for *other* things (ie sparse address spaces etc) or because they are doing globally addressable memory on truly large machines. A lot of "normal" use scenarios will be fundamentally limited by physics to "56 bits is a *lot*", and using high pointer address bits is unquestionably a good thing. So enforcing some hardware tag check is not always what you want, because while that is useful for *one* particular use case (ie the ARM64 MTE extension, and hw-tagged KASAN), and that may be the only particular use in some scenarios, other environments might use the top bits for other pointer information. Linus