labath added inline comments.

================
Comment at: 
lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm64.cpp:63-66
+    m_sve_note_payload.resize(m_sveregset.GetByteSize());
+    ::memcpy(GetSVEBuffer(), m_sveregset.GetDataStart(),
+             m_sveregset.GetByteSize());
+    ::memcpy(&m_sve_header, m_sveregset.GetDataStart(), sizeof(m_sve_header));
----------------
omjavaid wrote:
> labath wrote:
> > What's up with this copying? We already have the data in the `m_sveregset` 
> > DataExtractor. What's the reason for copying it into the 
> > `m_sve_note_payload` vector? Also, `m_sve_header` seems like it could just 
> > be a `reinterpret_cast`ed pointer into that buffer instead of a copy. 
> > (Maybe not even a pointer, just a utility function which performs the cast 
> > when called).
> > 
> > Actually, when I think about casts and data extractors, I am reminded of 
> > endianness. This will access those fields using host endianness, which is 
> > most likely not what we want to do. So, probably the best/simplest solution 
> > would be to indeed declare a `user_sve_header` struct, but don't populate 
> > it via memcpy, but rather via the appropriate DataExtractor extraction 
> > methods. Since the only field of the user_sve_header used outside this 
> > function is the `vl` field, perhaps the struct could be a local variable 
> > and only the vector length would be persisted. That would be consistent 
> > with how the `flags` field is decoded and stored into the `m_sve_state` 
> > field.
> > 
> > (If the struct fields are always little-endian (if that's true, I thought 
> > arm has BE variants) then you could also stick to the `reinterpret_cast` 
> > idea, but change the types of the struct fields to 
> > `llvm::support::ulittleXX_t` to read them as LE independently of the host.)
> Agreed m_sve_note_payload is redundant. Most of the implementation was 
> mirrored from ptrace implementation and I was lazy enough and did not remove 
> the redundancies which are not needed in case of core dump. 
> 
> About endianess of SVE data I dont think it will create any problem as the 
> data is transferred in endian invariant format. According to the standard 
> here:
> 
> * Whenever SVE scalable register values (Zn, Pn, FFR) are exchanged in memory
>   between userspace and the kernel, the register value is encoded in memory in
>   an endianness-invariant layout, with bits [(8 * i + 7) : (8 * i)] encoded at
>   byte offset i from the start of the memory representation.  This affects for
>   example the signal frame (struct sve_context) and ptrace interface
>   (struct user_sve_header) and associated data.
Ok, so if I parse that correctly, this is basically saying that the register 
values are always little-endian. Fair enough. However, lldb will be reading 
these things using the host endianness, so the values will be incorrect on a 
big-endian host.

Also, the are you sure that this includes the metadata in the `user_sve_header` 
field? The documentation does mention the struct explicitly, but then it also 
very explicitly speaks about **register** values. The data in the struct is not 
a register value, and I can find no evidence of byte-swapping in the linux 
kernel 
(https://github.com/torvalds/linux/blob/master/arch/arm64/kernel/ptrace.c#L769).


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

https://reviews.llvm.org/D77047



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

Reply via email to