jasonmolenda added a comment.

I don't want to add noise to this, but there's a related change that I'd like 
to upstream soon -- ARMv8.3 pointer authentication bits in addresses.  With the 
ARMv8.3 ISA, higher bits that aren't used for addressing can be used to sign & 
authenticate pointers that are saved in memory, where they may be overwritten 
via buffer over-runs et al, to verify that they have not been modified before 
they are used.  I hope to put together a patchset for upstreaming the changes I 
made to lldb to support this soon.

This is similar to the 0th bit set for the lr on Aarch32 code, to indicate that 
the caller function is thumb; when lldb reads the lr value, it has to strip the 
0th bit before it does a symbol lookup to find the caller.  With PAC bits, lldb 
needs to do the same -- clear or set the top bits of the address before symbol 
lookup.

However, the PAC bits give us two complications that the thumb bit does not 
have:  First, the number of bits used for ptrauth are variable - depending on 
how many page tables the operating system is using for processes, we need to 
strip more/fewer bits.  So we need access to a Process object to determine this 
at runtime.  Second, people may need to debug issues with their PAC bits, so we 
want to print the real unadulterated pointer value, and if it resolves to a 
symbol address, we print the stripped value and the symbol.  For instance, 
where we might show the lr value like this for register read:

  lr = 0x00000001bfe03b48  libdispatch.dylib`dispatch_mig_server + 272

once authentication bits have been added, we'll show:

  lr = 0x4051f781bfe03b48 (0x00000001bfe03b48) 
libdispatch.dylib`dispatch_mig_server + 272

I'm not sure we should try to handle both the thumb bit and pac bits in the 
same mechanism, but it's close enough that I wanted to bring it up.

I currently have my method in the ABI (my method name is poorly chosen, but I'd 
go with StripAuthenticationBits right now if I were putting it in the ABI) 
because I have a weak pointer to the Process from there.

I also added a SBValue::GetValueAsAddress API similar to GetValueAsUnsigned, 
which runs the value through the strip method.  At the API level, script 
writers may want to show the pointer value with PAC bits and/or the actual 
pointer value, depending on what they are doing.

I have calls to this ABI method scattered across lldb, although unlike the 
thumb bit, it won't show up in the DWARF at all.

I haven't thought about moving this StripAuthenticationBits method into 
Architecture - the callers would all need to provide a Process*, but that's how 
everyone gets an ABI already, so it might be straightforward to do that.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D70840/new/

https://reviews.llvm.org/D70840



_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to