llvm-project
ed48aead - [lldb][AArch64][Linux] Add support for SME only systems (#165413)

Commit
7 days ago
[lldb][AArch64][Linux] Add support for SME only systems (#165413) This is the implementation part of #138717, tests and documentation will be in a separate PR. SME only systems have SME but not SVE. Previously we assumed that you would either have SVE, SVE+SME, or neither. On an SME only system, the SVE register state exists only in streaming mode. SVE instructions may be used, but only in streaming mode. The Linux kernel will report that such a processor has SME features but no SVE features. This means that the non-streaming SVE ptrace register set is inaccessible (with one exception mentioned below). So the main change here is around the management of FP registers. * In non-streaming mode, FP registers must be accessed via the FP register set. Not the non-streaming SVE register set. * In streaming mode, FP registers are a subset of the streaming SVE registers, accessed via the streaming SVE register set. The one exception the kernel allows is: > On systems that do not support SVE it is permitted to use SETREGSET to write SVE_PT_REGS_FPSIMD formatted data via NT_ARM_SVE, in this case the vector length should be specified as 0. This allows streaming mode to be disabled on systems with SME but not SVE. https://docs.kernel.org/arch/arm64/sve.html This is how we are able to restore to a non-streaming state when an expression leaves us in streaming mode. The major changes to LLDB are: * If we receive only SVG in the expedited registers, we now assume it's an SME only system and therefore VG == SVG. * A new state SVEState::StreamingFPSIMD is added to mark the mode where we are in FPSIMD mode on an SME only system (as opposed to the FPSIMD state of an SVE or SVE+SME system). * CalculateFprOffset now returns different results depending on whether we have only SIMD or we have streaming SVE. In the latter case, the stored register offsets are relative to the SVE registers, but actual accesses need to be relative to the ptrace FP register set. * In WriteAllRegisters, if we have an FP set to restore on an SME only system we assume we must have been in non-streaming mode at the time of the save. So we restore it using the previously mentioned non-streaming SVE write. * GetSVERegSet and ConfigureRegisterContext were updated to handle the new StreamingFPSIMDOnly state.
Author
Parents
Loading