labath added inline comments.

================
Comment at: 
lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm64.cpp:82-106
+uint32_t
+RegisterContextCorePOSIX_arm64::CalculateSVEOffset(uint32_t reg_num) const {
+  uint32_t sve_offset = 0;
+  if (m_sve_state == SVE_STATE::SVE_STATE_FPSIMD) {
+    if (IsSVEZ(reg_num))
+      sve_offset = (reg_num - GetRegNumSVEZ0()) * 16;
+    else if (reg_num == GetRegNumFPSR())
----------------
omjavaid wrote:
> labath wrote:
> > omjavaid wrote:
> > > labath wrote:
> > > > I'm confused by this function. If I understant the SVE_PT macros and 
> > > > the logic in `RegisterInfoPOSIX_arm64::ConfigureVectorRegisterInfos` 
> > > > correctly, then they both seem to encode the same information. And it 
> > > > seems to me that this function should just be 
> > > > `reg_infos[reg_num].offset - some_constant`, which is the same thing 
> > > > that we're doing for the arm FP registers when SVE is disabled, and 
> > > > also for most other architectures too.
> > > > 
> > > > Why is that not the case? Am I missing something? If they are not 
> > > > encoding the same thing, could they be made to encode the same thing?
> > > This function calculates offset of a particular register in core note 
> > > data. SVE data in core dump is similar to what PTrace emits and offsets 
> > > into this data is not linear. SVE macros are used to access those offsets 
> > > based on register numbers and currently selected vector length.
> > > Also for the purpose of ease we have linear offsets in SVE register infos 
> > > and it helps us simplify register data once it makes way to 
> > > GDBRemoteRegisterContext on the client side.
> > Could you give an example of the non-linearity of the core dump data? (Some 
> > registers, and their respective core file and gdb-remote offsets)
> In case of core file we create a buffer m_sveregset which stores SVE core 
> note information
> m_sveregset =
>       getRegset(notes, 
> m_register_info_up->GetTargetArchitecture().GetTriple(),
>                 AARCH64_SVE_Desc);
> 
> At this point we do not know what was the vector length and at what offsets 
> in the data our registers are located. We read top bytes of size 
> use_sve_header and read vector length. Based on this information we configure 
> vector length in Register infos. While the SVE payload starts with 
> user_sve_header then there are some allignment bytes followed by vector 
> length based Z registers followed by P and FFR, then there are some more 
> allginment bytes followd by FPCR and FPSR. Macros provided by Linux help us 
> jump to the desired offset by providing register number and vq into the core 
> note or Ptrace payload.
> 
> In case of client side storage we store GPRs at linear offset followed by 
> Vector Granule register. Then there are SVE registers Z, P, FFR, FPSR and 
> FPCR. Offsets of V, D and S registers in FPR regset overlap with 
> corresponding first bytes of Z registers and will be same as corresponding Z 
> register. While both FP/SVE FPSR share same register offset, size and 
> register number.
> 
> Here is an excerpt from 
> https://github.com/torvalds/linux/blob/master/Documentation/arm64/sve.rst
> 
> SVE_PT_REGS_FPSIMD
> SVE registers are not live (GETREGSET) or are to be made non-live (SETREGSET).
> The payload is of type struct user_fpsimd_state, with the same meaning as for 
> NT_PRFPREG, starting at offset SVE_PT_FPSIMD_OFFSET from the start of 
> user_sve_header.
> Extra data might be appended in the future: the size of the payload should be 
> obtained using SVE_PT_FPSIMD_SIZE(vq, flags).
> vq should be obtained using sve_vq_from_vl(vl).
> 
> or
> 
> SVE_PT_REGS_SVE
> SVE registers are live (GETREGSET) or are to be made live (SETREGSET).
> The payload contains the SVE register data, starting at offset 
> SVE_PT_SVE_OFFSET from the start of user_sve_header, and with size 
> SVE_PT_SVE_SIZE(vq, flags);
Given this
> SVE payload starts with ... followed by vector length based Z registers 
> followed by P and FFR,
and this
> In case of client side storage we store GPRs ... Then there are SVE registers 
> Z, P, FFR, FPSR and FPCR
I would expect that for each of the Z, P and FFR registers, the expression 
`offset_in_core(reg) - offset_in_gdb_remote(reg)` is always the same constant 
(and is basically equal to `SVE_PT_SVE_ZREG_OFFSET(vq, 0) - 
reg_info[Z0].byte_offset`). So we could just add/subtract that constant to the 
gdb-remote byte_offset field instead of painstakingly decomposing the register 
number only for the linux macros to reconstruct it back again. Is that not so?


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