https://github.com/mchoo7 updated 
https://github.com/llvm/llvm-project/pull/180222

>From cdb644c0f10eed626480e434366b0d78d16d8d17 Mon Sep 17 00:00:00 2001
From: Minsoo Choo <[email protected]>
Date: Fri, 6 Feb 2026 11:15:14 -0500
Subject: [PATCH 1/2] [lldb][Process/FreeBSDKernel] Fix broken debugging on
 aarch64

Signed-off-by: Minsoo Choo <[email protected]>
---
 .../RegisterContextFreeBSDKernel_arm64.cpp    | 40 ++++++-------------
 1 file changed, 12 insertions(+), 28 deletions(-)

diff --git 
a/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm64.cpp
 
b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm64.cpp
index 11843ddc82d97..f8e7570548053 100644
--- 
a/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm64.cpp
+++ 
b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm64.cpp
@@ -43,9 +43,9 @@ bool RegisterContextFreeBSDKernel_arm64::ReadRegister(
     return false;
 
   struct {
-    llvm::support::ulittle64_t x[30];
-    llvm::support::ulittle64_t lr;
-    llvm::support::ulittle64_t _reserved;
+#define PCB_FP 10
+#define PCB_LR 11
+    llvm::support::ulittle64_t x[12];
     llvm::support::ulittle64_t sp;
   } pcb;
 
@@ -57,25 +57,6 @@ bool RegisterContextFreeBSDKernel_arm64::ReadRegister(
 
   uint32_t reg = reg_info->kinds[lldb::eRegisterKindLLDB];
   switch (reg) {
-  case gpr_x0_arm64:
-  case gpr_x1_arm64:
-  case gpr_x2_arm64:
-  case gpr_x3_arm64:
-  case gpr_x4_arm64:
-  case gpr_x5_arm64:
-  case gpr_x6_arm64:
-  case gpr_x7_arm64:
-  case gpr_x8_arm64:
-  case gpr_x9_arm64:
-  case gpr_x10_arm64:
-  case gpr_x11_arm64:
-  case gpr_x12_arm64:
-  case gpr_x13_arm64:
-  case gpr_x14_arm64:
-  case gpr_x15_arm64:
-  case gpr_x16_arm64:
-  case gpr_x17_arm64:
-  case gpr_x18_arm64:
   case gpr_x19_arm64:
   case gpr_x20_arm64:
   case gpr_x21_arm64:
@@ -87,16 +68,19 @@ bool RegisterContextFreeBSDKernel_arm64::ReadRegister(
   case gpr_x27_arm64:
   case gpr_x28_arm64:
   case gpr_fp_arm64:
-    static_assert(gpr_fp_arm64 - gpr_x0_arm64 == 29,
+    static_assert(gpr_fp_arm64 - gpr_x19_arm64 == PCB_FP,
                   "nonconsecutive arm64 register numbers");
-    value = pcb.x[reg - gpr_x0_arm64];
-    break;
-  case gpr_sp_arm64:
-    value = pcb.sp;
+    value = pcb.x[reg - gpr_x19_arm64];
     break;
+  case gpr_lr_arm64:
   case gpr_pc_arm64:
     // The pc of crashing thread is stored in lr.
-    value = pcb.lr;
+    static_assert(gpr_lr_arm64 - gpr_x19_arm64 == PCB_LR,
+                  "nonconsecutive arm64 register numbers");
+    value = pcb.x[reg - gpr_x19_arm64];
+    break;
+  case gpr_sp_arm64:
+    value = pcb.sp;
     break;
   default:
     return false;

>From cb9a9da3af89b1d551e8b16494358f570b4f855b Mon Sep 17 00:00:00 2001
From: Minsoo Choo <[email protected]>
Date: Fri, 6 Feb 2026 13:43:31 -0500
Subject: [PATCH 2/2] fixup! [lldb][Process/FreeBSDKernel] Fix broken debugging
 on aarch64

Signed-off-by: Minsoo Choo <[email protected]>
---
 .../RegisterContextFreeBSDKernel_arm64.cpp    | 145 ++++++++++++++----
 .../RegisterContextFreeBSDKernel_arm64.h      |   4 +
 2 files changed, 116 insertions(+), 33 deletions(-)

diff --git 
a/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm64.cpp
 
b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm64.cpp
index f8e7570548053..c78dec908dba4 100644
--- 
a/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm64.cpp
+++ 
b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm64.cpp
@@ -9,7 +9,9 @@
 #include "RegisterContextFreeBSDKernel_arm64.h"
 #include "Plugins/Process/Utility/lldb-arm64-register-enums.h"
 
+#include "lldb/Expression/UserExpression.h"
 #include "lldb/Target/Process.h"
+#include "lldb/Target/Target.h"
 #include "lldb/Target/Thread.h"
 #include "lldb/Utility/RegisterValue.h"
 #include "llvm/Support/Endian.h"
@@ -49,41 +51,102 @@ bool RegisterContextFreeBSDKernel_arm64::ReadRegister(
     llvm::support::ulittle64_t sp;
   } pcb;
 
+  struct {
+    llvm::support::ulittle64_t x[30];
+    llvm::support::ulittle64_t lr;
+    llvm::support::ulittle64_t _reserved;
+    llvm::support::ulittle64_t sp;
+  } pcb13;
+
   Status error;
-  size_t rd =
-      m_thread.GetProcess()->ReadMemory(m_pcb_addr, &pcb, sizeof(pcb), error);
-  if (rd != sizeof(pcb))
-    return false;
+  if (GetOsreldate() > 1400084) {
+    size_t rd =
+        m_thread.GetProcess()->ReadMemory(m_pcb_addr, &pcb, sizeof(pcb), 
error);
+    if (rd != sizeof(pcb))
+      return false;
 
-  uint32_t reg = reg_info->kinds[lldb::eRegisterKindLLDB];
-  switch (reg) {
-  case gpr_x19_arm64:
-  case gpr_x20_arm64:
-  case gpr_x21_arm64:
-  case gpr_x22_arm64:
-  case gpr_x23_arm64:
-  case gpr_x24_arm64:
-  case gpr_x25_arm64:
-  case gpr_x26_arm64:
-  case gpr_x27_arm64:
-  case gpr_x28_arm64:
-  case gpr_fp_arm64:
-    static_assert(gpr_fp_arm64 - gpr_x19_arm64 == PCB_FP,
-                  "nonconsecutive arm64 register numbers");
-    value = pcb.x[reg - gpr_x19_arm64];
-    break;
-  case gpr_lr_arm64:
-  case gpr_pc_arm64:
-    // The pc of crashing thread is stored in lr.
-    static_assert(gpr_lr_arm64 - gpr_x19_arm64 == PCB_LR,
-                  "nonconsecutive arm64 register numbers");
-    value = pcb.x[reg - gpr_x19_arm64];
-    break;
-  case gpr_sp_arm64:
-    value = pcb.sp;
-    break;
-  default:
-    return false;
+    uint32_t reg = reg_info->kinds[lldb::eRegisterKindLLDB];
+    switch (reg) {
+    case gpr_x19_arm64:
+    case gpr_x20_arm64:
+    case gpr_x21_arm64:
+    case gpr_x22_arm64:
+    case gpr_x23_arm64:
+    case gpr_x24_arm64:
+    case gpr_x25_arm64:
+    case gpr_x26_arm64:
+    case gpr_x27_arm64:
+    case gpr_x28_arm64:
+    case gpr_fp_arm64:
+      static_assert(gpr_fp_arm64 - gpr_x19_arm64 == PCB_FP,
+                    "nonconsecutive arm64 register numbers");
+      value = pcb.x[reg - gpr_x19_arm64];
+      break;
+    case gpr_lr_arm64:
+    case gpr_pc_arm64:
+      // The pc of crashing thread is stored in lr.
+      static_assert(gpr_lr_arm64 - gpr_x19_arm64 == PCB_LR,
+                    "nonconsecutive arm64 register numbers");
+      value = pcb.x[reg - gpr_x19_arm64];
+      break;
+    case gpr_sp_arm64:
+      value = pcb.sp;
+      break;
+    default:
+      return false;
+    }
+  } else {
+    size_t rd = m_thread.GetProcess()->ReadMemory(m_pcb_addr, &pcb13,
+                                                  sizeof(pcb13), error);
+    if (rd != sizeof(pcb13))
+      return false;
+
+    uint32_t reg = reg_info->kinds[lldb::eRegisterKindLLDB];
+    switch (reg) {
+    case gpr_x0_arm64:
+    case gpr_x1_arm64:
+    case gpr_x2_arm64:
+    case gpr_x3_arm64:
+    case gpr_x4_arm64:
+    case gpr_x5_arm64:
+    case gpr_x6_arm64:
+    case gpr_x7_arm64:
+    case gpr_x8_arm64:
+    case gpr_x9_arm64:
+    case gpr_x10_arm64:
+    case gpr_x11_arm64:
+    case gpr_x12_arm64:
+    case gpr_x13_arm64:
+    case gpr_x14_arm64:
+    case gpr_x15_arm64:
+    case gpr_x16_arm64:
+    case gpr_x17_arm64:
+    case gpr_x18_arm64:
+    case gpr_x19_arm64:
+    case gpr_x20_arm64:
+    case gpr_x21_arm64:
+    case gpr_x22_arm64:
+    case gpr_x23_arm64:
+    case gpr_x24_arm64:
+    case gpr_x25_arm64:
+    case gpr_x26_arm64:
+    case gpr_x27_arm64:
+    case gpr_x28_arm64:
+    case gpr_fp_arm64:
+      static_assert(gpr_fp_arm64 - gpr_x0_arm64 == 29,
+                    "nonconsecutive arm64 register numbers");
+      value = pcb13.x[reg - gpr_x0_arm64];
+      break;
+    case gpr_sp_arm64:
+      value = pcb13.sp;
+      break;
+    case gpr_pc_arm64:
+      // The pc of crashing thread is stored in lr.
+      value = pcb13.lr;
+      break;
+    default:
+      return false;
+    }
   }
   return true;
 }
@@ -92,3 +155,19 @@ bool RegisterContextFreeBSDKernel_arm64::WriteRegister(
     const RegisterInfo *reg_info, const RegisterValue &value) {
   return false;
 }
+
+int64_t RegisterContextFreeBSDKernel_arm64::GetOsreldate() {
+  Target &target = GetTarget();
+
+  if (!target)
+    return 0;
+
+  ValueObjectSP val_sp =
+      target->FindFirstGlobalVariable(ConstString("osreldate"));
+
+  if (val_sp && val_sp->GetError().Success()) {
+    return val_sp->GetValueAsSigned(0);
+  }
+
+  return 0;
+}
diff --git 
a/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm64.h
 
b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm64.h
index 155dda6e748f5..6763bec1ba686 100644
--- 
a/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm64.h
+++ 
b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm64.h
@@ -12,6 +12,8 @@
 #include "Plugins/Process/Utility/RegisterContextPOSIX_arm64.h"
 #include "Plugins/Process/elf-core/RegisterUtilities.h"
 
+#include "lldb/Target/Target.h"
+
 class RegisterContextFreeBSDKernel_arm64 : public RegisterContextPOSIX_arm64 {
 public:
   RegisterContextFreeBSDKernel_arm64(
@@ -36,6 +38,8 @@ class RegisterContextFreeBSDKernel_arm64 : public 
RegisterContextPOSIX_arm64 {
 
 private:
   lldb::addr_t m_pcb_addr;
+
+  int64_t GetOsreldate();
 };
 
 #endif // 
LLDB_SOURCE_PLUGINS_PROCESS_FREEBSDKERNEL_REGISTERCONTEXTFREEBSDKERNEL_ARM64_H

_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to