<div dir="ltr"><div>Hi David,</div><div><br></div><div>Sending this message again as I'm now back from vacation (and I was finally able to subscribe to lldb-dev - non-subscribers are prevented from sending email to it).</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Dec 10, 2021 at 1:56 AM David Spickett <<a href="mailto:david.spickett@linaro.org">david.spickett@linaro.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">(Peter and Stephen on CC since you've previously asked about this sort of thing)<br>
<br>
This relates to <a href="https://reviews.llvm.org/D103626" rel="noreferrer" target="_blank">https://reviews.llvm.org/D103626</a> and other recent<br>
patches about non-address bits.<br>
<br>
On AArch64 we've got a few extensions that use "non address bits".<br>
These are bits beyond the (in most cases) 48 bit virtual address size.<br>
Currently we have pointer authentication (armv8.3), memory tagging<br>
(armv8.5) and top byte ignore (a feature of armv8.0-a).<br>
<br>
This means we need to know about these bits when doing some<br>
operations. One such time is when passing addresses to memory read.<br>
Consider two pointers to the same location where the first one has a<br>
greater memory tag (bits 56-60) than the second. This is what happens<br>
if we don't remove the non-address bits:<br>
(lldb) memory read mte_buf_alt_tag mte_buf+16<br>
error: end address (0x900fffff7ff8010) must be greater than the start<br>
address (0xa00fffff7ff8000).<br>
<br>
A pure number comparison is going to think that end < begin address.<br>
If we use the ABI plugin's FixDataAddress we can remove those bits and<br>
read normally.<br>
<br>
With one caveat. The output will not include those non address bits<br>
unless we make special effort to do so, here's an example:<br>
(lldb) p ptr1<br>
(char *) $4 = 0x3400fffffffff140 "\x80\xf1\xff\xff\xff\xff"<br>
(lldb) p ptr2<br>
(char *) $5 = 0x5600fffffffff140 "\x80\xf1\xff\xff\xff\xff"<br>
(lldb) memory read ptr1 ptr2+16<br>
0xfffffffff140: 80 f1 ff ff ff ff 00 00 38 70 bc f7 ff ff 00 00<br>
........8p......<br>
<br>
My current opinion is that in this case the output should not include<br>
the non address bits:<br>
* The actual memory being read is not at the virtual address the raw<br>
pointer value gives.<br>
* Many, if not all, non address bits cannot be incremented as the<br>
memory address we're showing is incremented. (not in a way that makes<br>
sense if you think about how the core interprets them)<br>
<br></blockquote><div><br></div><div>I agree that the printed addresses should not include any of the ignored top byte, because lldb is displaying what's at the actual virtual address now, and not how we got there (i.e. the pointer).<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
For example once you get into the next memory granule, the memory tag<br>
attached to it in hardware may be different. (and FWIW I have a series<br>
to show the actual memory tags <a href="https://reviews.llvm.org/D107140" rel="noreferrer" target="_blank">https://reviews.llvm.org/D107140</a>)<br>
You could perhaps argue that if the program itself used that pointer,<br>
it would use those non address bits as well so show the user *how* it<br>
would access the memory. However I don't think that justifies<br>
complicating the implementation and output.<br>
<br>
So what do people think of that direction? I've thought about this for<br>
too long before asking for feedback, so I'm definitely missing some of<br>
the wood for the trees.<br>
<br>
Input/bug reports/complaints from anyone who (unlike me) has debugged<br>
a large program that uses these non-address features is most welcome!<br>
<br>
Thanks,<br>
David Spickett.<br></blockquote><div><br></div><div>We have a customer who is encountering issues with this in LLDB today, so I asked them to comment on this thread (but I'm not sure if they will). The current behavior prevents them from using LLDB with their core dumps.</div><div><br></div><div>Thanks,</div><div>Steve</div></div></div>