[Lldb-commits] [PATCH] D96460: [LLDB] Arm64/Linux Add MTE and Pointer Authentication registers

David Spickett via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Thu Feb 11 06:20:54 PST 2021


DavidSpickett added inline comments.


================
Comment at: lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp:79
 
+  m_mte_ctrl_reg = 0;
+
----------------
Should m_pac_mask also be initialised or is it already?


================
Comment at: lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp:120
+  uint32_t result = 0;
+  if (*auxv_at_hwcap & HWCAP_PACA)
+    result |= ARM64_REGS_CONFIG_PAUTH;
----------------
I think this should be more defensive:
```
if (auxv_at_hwcap && (*auxv_at_hwcap & HWCAP_PACA))
```

Otherwise you'll deference an invalid optional, which might work if its storage happens to be zeroed but it's not intended use.


================
Comment at: lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp:126
+
+  if (*auxv_at_hwcap2 & HWCAP2_MTE)
+    result |= ARM64_REGS_CONFIG_MTE;
----------------
Same here, auxv_at_hwcap2 could be llvm::None.


================
Comment at: lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp:531
 
+bool NativeRegisterContextLinux_arm64::IsPAuth(unsigned reg) const {
+  if (GetRegisterInfo().IsPAuthReg(reg))
----------------
Can you simplify these?
```
return GetRegisterInfo().IsPAuthReg(reg);
```

(the others could do that too, but obviously we're ignoring those ones here)


================
Comment at: lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp:1100
   m_sve_header_is_valid = false;
+  m_pac_mask_is_valid = false;
 
----------------
I think `m_mte_ctrl_is_valid` is missing here.


================
Comment at: lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp:1198
+
+  if (m_mte_ctrl_is_valid)
+    return error;
----------------
Just to confirm I understand this logic.

If `m_mte_ctrl_is_valid` would mean that our cached value of the register is valid. So if something tries to read a new copy of it we fail because they should have used the cached version?

Then if `m_mte_ctrl_is_valid` is false, our cache is out of date so we do the read.

Seems odd to error on asking for a read of a value that is cached but then again I don't know the surrounding code too well. If that pattern is already established no point disturbing it now.


================
Comment at: lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp:1216
+
+  error = ReadMTEControl();
+  if (error.Fail())
----------------
This is a sanity check that we didn't ask to write this register on a system that doesn't have it?


================
Comment at: lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h:182
+
+  void *GetMTEControl() { return &m_pac_mask; }
+
----------------
This looks like a mistake.


================
Comment at: lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_arm64.cpp:320
+  uint32_t pa_regnum = m_dynamic_reg_infos.size();
+  for (uint32_t i = 0; i < 2; i++) {
+    pauth_regnum_collection.push_back(pa_regnum + i);
----------------
Can you get this 2 from some list somewhere in this class? E.g. PauthRegs.Size(). Or add a comment if not.

g_register_infos_pauth perhaps?


================
Comment at: lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_arm64.cpp:324
+    m_dynamic_reg_infos[pa_regnum + i].byte_offset =
+        m_dynamic_reg_infos[pa_regnum + i - 1].byte_offset +
+        m_dynamic_reg_infos[pa_regnum + i - 1].byte_size;
----------------
Is it possible at this point that `m_dynamic_reg_infos.size()` is 0 making `m_dynamic_reg_infos[pa_regnum + i - 1]` into `m_dynamic_reg_infos[0 + 0 - 1]` ?

I guess this could happen if SVE wasn't present but maybe you already account for that.


================
Comment at: lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_arm64.cpp:326
+        m_dynamic_reg_infos[pa_regnum + i - 1].byte_size;
+    m_dynamic_reg_infos[pa_regnum + i].kinds[4] = pa_regnum + i;
+  }
----------------
Please comment what the [4] is getting.


================
Comment at: lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_arm64.cpp:330
+  m_dynamic_reg_sets.push_back(g_reg_set_pauth_arm64);
+  m_dynamic_reg_sets[m_dynamic_reg_sets.size() - 1].registers =
+      pauth_regnum_collection.data();
----------------
You could simplify this with back (https://www.cplusplus.com/reference/vector/vector/back/) assuming this is a vector-ish type.


================
Comment at: lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_arm64.cpp:336
+  uint32_t mte_regnum = m_dynamic_reg_infos.size();
+  for (uint32_t i = 0; i < 1; i++) {
+    m_mte_regnum_collection.push_back(mte_regnum + i);
----------------
Same as above

Given that there's only one MTE register you could also remove the for since we'll only ever have i==0. If we want to be nice and handle future expansion some MTERegs.size() would be preferred.


================
Comment at: lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_arm64.cpp:434
+bool RegisterInfoPOSIX_arm64::IsPAuthReg(unsigned reg) const {
+  if (std::find(pauth_regnum_collection.begin(), pauth_regnum_collection.end(),
+                reg) != pauth_regnum_collection.end())
----------------
```
return std::find(pauth_regnum_collection.begin(), pauth_regnum_collection.end(),
                reg) != pauth_regnum_collection.end();
```


================
Comment at: lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_arm64.cpp:440
+
+bool RegisterInfoPOSIX_arm64::IsMTEReg(unsigned reg) const {
+  if (std::find(m_mte_regnum_collection.begin(), m_mte_regnum_collection.end(),
----------------
as above


================
Comment at: lldb/source/Plugins/Process/Utility/RegisterInfos_arm64.h:537
+// Defines pointer authentication mask registers
+#define DEFINE_PAUTH_REGS(reg)                                                 \
+  {                                                                            \
----------------
`DEFINE_PAUTH_REGS` is an odd name considering we use it for MTE too. `DEFINE_EXTENSION_REGS` ?

Also I would make it singular "REG"


================
Comment at: lldb/source/Plugins/Process/Utility/RegisterInfos_arm64_sve.h:64
 
-  sve_ffr,
+  sve_ffr
 };
----------------
This seems unrelated


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

https://reviews.llvm.org/D96460



More information about the lldb-commits mailing list