Author: Minsoo Choo
Date: 2026-02-28T15:59:16-05:00
New Revision: 4a602c03ea050d7adf666d5a440164ca6f78707c

URL: 
https://github.com/llvm/llvm-project/commit/4a602c03ea050d7adf666d5a440164ca6f78707c
DIFF: 
https://github.com/llvm/llvm-project/commit/4a602c03ea050d7adf666d5a440164ca6f78707c.diff

LOG: [lldb][Process/FreeBSDKernelCore] Add riscv64 support (#180670)

This is LLDB version of
https://cgit.freebsd.org/ports/tree/devel/gdb/files/kgdb/riscv-fbsd-kern.c.
This enables selecting riscv64 and reading registers from PCB structure
on core dump and live kenrel debugging while trapframe unwinding support
will be implemented in future. Test files using core dump from riscv64
will be implemented once other kernel debugging improvements are done.

---------

Signed-off-by: Minsoo Choo <[email protected]>

Added: 
    
lldb/source/Plugins/Process/FreeBSD-Kernel-Core/RegisterContextFreeBSDKernelCore_riscv64.cpp
    
lldb/source/Plugins/Process/FreeBSD-Kernel-Core/RegisterContextFreeBSDKernelCore_riscv64.h

Modified: 
    lldb/docs/index.rst
    lldb/source/Plugins/Process/FreeBSD-Kernel-Core/CMakeLists.txt
    lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ThreadFreeBSDKernelCore.cpp
    llvm/docs/ReleaseNotes.md

Removed: 
    


################################################################################
diff  --git a/lldb/docs/index.rst b/lldb/docs/index.rst
index bbf6a84d34d9e..2d05e4f95852b 100644
--- a/lldb/docs/index.rst
+++ b/lldb/docs/index.rst
@@ -74,7 +74,7 @@ are welcome:
 * iOS, tvOS, and watchOS device debugging on ARM and AArch64
 * Linux user-space debugging for i386, x86_64, ARM, AArch64, PPC64le, s390x
 * FreeBSD user-space debugging for i386, x86_64, ARM, AArch64, PPC
-* FreeBSD kernel debugging for i386, x86_64, ARM, AArch64, PPC64le
+* FreeBSD kernel debugging for i386, x86_64, ARM, AArch64, PPC64le, RISCV64
 * NetBSD user-space debugging for i386 and x86_64
 * Windows user-space debugging for i386, x86_64, ARM and AArch64 (*)
 

diff  --git a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/CMakeLists.txt 
b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/CMakeLists.txt
index c23af7c345853..1937143171369 100644
--- a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/CMakeLists.txt
+++ b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/CMakeLists.txt
@@ -12,6 +12,7 @@ add_lldb_library(lldbPluginProcessFreeBSDKernelCore PLUGIN
   RegisterContextFreeBSDKernelCore_arm64.cpp
   RegisterContextFreeBSDKernelCore_i386.cpp
   RegisterContextFreeBSDKernelCore_ppc64le.cpp
+  RegisterContextFreeBSDKernelCore_riscv64.cpp
   RegisterContextFreeBSDKernelCore_x86_64.cpp
   ThreadFreeBSDKernelCore.cpp
 

diff  --git 
a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/RegisterContextFreeBSDKernelCore_riscv64.cpp
 
b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/RegisterContextFreeBSDKernelCore_riscv64.cpp
new file mode 100644
index 0000000000000..b705c6d6d43bd
--- /dev/null
+++ 
b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/RegisterContextFreeBSDKernelCore_riscv64.cpp
@@ -0,0 +1,105 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "RegisterContextFreeBSDKernelCore_riscv64.h"
+
+#include "lldb/Target/Process.h"
+#include "lldb/Target/Thread.h"
+#include "lldb/Utility/RegisterValue.h"
+#include "llvm/Support/Endian.h"
+
+using namespace lldb;
+using namespace lldb_private;
+
+RegisterContextFreeBSDKernelCore_riscv64::
+    RegisterContextFreeBSDKernelCore_riscv64(
+        Thread &thread,
+        std::unique_ptr<RegisterInfoPOSIX_riscv64> register_info_up,
+        lldb::addr_t pcb_addr)
+    : RegisterContextPOSIX_riscv64(thread, std::move(register_info_up)),
+      m_pcb_addr(pcb_addr) {}
+
+bool RegisterContextFreeBSDKernelCore_riscv64::ReadGPR() { return true; }
+
+bool RegisterContextFreeBSDKernelCore_riscv64::ReadFPR() { return true; }
+
+bool RegisterContextFreeBSDKernelCore_riscv64::WriteGPR() {
+  assert(0);
+  return false;
+}
+
+bool RegisterContextFreeBSDKernelCore_riscv64::WriteFPR() {
+  assert(0);
+  return false;
+}
+
+bool RegisterContextFreeBSDKernelCore_riscv64::ReadRegister(
+    const RegisterInfo *reg_info, RegisterValue &value) {
+  if (m_pcb_addr == LLDB_INVALID_ADDRESS)
+    return false;
+
+  // https://cgit.freebsd.org/src/tree/sys/riscv/include/pcb.h
+  struct {
+    llvm::support::ulittle64_t ra;
+    llvm::support::ulittle64_t sp;
+    llvm::support::ulittle64_t gp;
+    llvm::support::ulittle64_t tp;
+    llvm::support::ulittle64_t s[12];
+  } pcb;
+
+  Status error;
+  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_pc_riscv:
+  case gpr_ra_riscv:
+    // Supply the RA as PC as well to simulate the PC as if the thread had just
+    // returned.
+    value = pcb.ra;
+    break;
+  case gpr_sp_riscv:
+    value = pcb.sp;
+    break;
+  case gpr_gp_riscv:
+    value = pcb.gp;
+    break;
+  case gpr_tp_riscv:
+    value = pcb.tp;
+    break;
+  case gpr_fp_riscv:
+    value = pcb.s[0];
+    break;
+  case gpr_s1_riscv:
+    value = pcb.s[1];
+    break;
+  case gpr_s2_riscv:
+  case gpr_s3_riscv:
+  case gpr_s4_riscv:
+  case gpr_s5_riscv:
+  case gpr_s6_riscv:
+  case gpr_s7_riscv:
+  case gpr_s8_riscv:
+  case gpr_s9_riscv:
+  case gpr_s10_riscv:
+  case gpr_s11_riscv:
+    value = pcb.s[reg - gpr_s2_riscv + 2];
+    break;
+  default:
+    return false;
+  }
+  return true;
+}
+
+bool RegisterContextFreeBSDKernelCore_riscv64::WriteRegister(
+    const RegisterInfo *reg_info, const RegisterValue &value) {
+  return false;
+}

diff  --git 
a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/RegisterContextFreeBSDKernelCore_riscv64.h
 
b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/RegisterContextFreeBSDKernelCore_riscv64.h
new file mode 100644
index 0000000000000..033671da8ff7d
--- /dev/null
+++ 
b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/RegisterContextFreeBSDKernelCore_riscv64.h
@@ -0,0 +1,42 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef 
LLDB_SOURCE_PLUGINS_PROCESS_FREEBSDKERNEL_REGISTERCONTEXTFREEBSDKERNELCORE_RISCV64_H
+#define 
LLDB_SOURCE_PLUGINS_PROCESS_FREEBSDKERNEL_REGISTERCONTEXTFREEBSDKERNELCORE_RISCV64_H
+
+#include "Plugins/Process/Utility/RegisterContextPOSIX_riscv64.h"
+#include "Plugins/Process/elf-core/RegisterUtilities.h"
+
+class RegisterContextFreeBSDKernelCore_riscv64
+    : public RegisterContextPOSIX_riscv64 {
+public:
+  RegisterContextFreeBSDKernelCore_riscv64(
+      lldb_private::Thread &thread,
+      std::unique_ptr<RegisterInfoPOSIX_riscv64> register_info_up,
+      lldb::addr_t pcb_addr);
+
+  bool ReadRegister(const lldb_private::RegisterInfo *reg_info,
+                    lldb_private::RegisterValue &value) override;
+
+  bool WriteRegister(const lldb_private::RegisterInfo *reg_info,
+                     const lldb_private::RegisterValue &value) override;
+
+protected:
+  bool ReadGPR() override;
+
+  bool ReadFPR() override;
+
+  bool WriteGPR() override;
+
+  bool WriteFPR() override;
+
+private:
+  lldb::addr_t m_pcb_addr;
+};
+
+#endif // 
LLDB_SOURCE_PLUGINS_PROCESS_FREEBSDKERNEL_REGISTERCONTEXTFREEBSDKERNELCORE_RISCV64_H

diff  --git 
a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ThreadFreeBSDKernelCore.cpp 
b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ThreadFreeBSDKernelCore.cpp
index 386a2ab29ec24..b98ed1208f5ef 100644
--- 
a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ThreadFreeBSDKernelCore.cpp
+++ 
b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ThreadFreeBSDKernelCore.cpp
@@ -17,11 +17,13 @@
 #include "Plugins/Process/Utility/RegisterInfoPOSIX_arm.h"
 #include "Plugins/Process/Utility/RegisterInfoPOSIX_arm64.h"
 #include "Plugins/Process/Utility/RegisterInfoPOSIX_ppc64le.h"
+#include "Plugins/Process/Utility/RegisterInfoPOSIX_riscv64.h"
 #include "ProcessFreeBSDKernelCore.h"
 #include "RegisterContextFreeBSDKernelCore_arm.h"
 #include "RegisterContextFreeBSDKernelCore_arm64.h"
 #include "RegisterContextFreeBSDKernelCore_i386.h"
 #include "RegisterContextFreeBSDKernelCore_ppc64le.h"
+#include "RegisterContextFreeBSDKernelCore_riscv64.h"
 #include "RegisterContextFreeBSDKernelCore_x86_64.h"
 
 using namespace lldb;
@@ -77,6 +79,12 @@ 
ThreadFreeBSDKernelCore::CreateRegisterContextForFrame(StackFrame *frame) {
           std::make_shared<RegisterContextFreeBSDKernelCore_ppc64le>(
               *this, new RegisterInfoPOSIX_ppc64le(arch), m_pcb_addr);
       break;
+    case llvm::Triple::riscv64:
+      m_thread_reg_ctx_sp =
+          std::make_shared<RegisterContextFreeBSDKernelCore_riscv64>(
+              *this, std::make_unique<RegisterInfoPOSIX_riscv64>(arch, 0),
+              m_pcb_addr);
+      break;
     case llvm::Triple::x86:
       m_thread_reg_ctx_sp =
           std::make_shared<RegisterContextFreeBSDKernelCore_i386>(

diff  --git a/llvm/docs/ReleaseNotes.md b/llvm/docs/ReleaseNotes.md
index 0c0fa1b940645..2e0c5c5cb9370 100644
--- a/llvm/docs/ReleaseNotes.md
+++ b/llvm/docs/ReleaseNotes.md
@@ -221,7 +221,7 @@ Changes to LLDB
 * Support for libfbsdvmcore has been removed. As a result, FreeBSD kernel dump 
debugging is now only
   available on FreeBSD hosts. Live kernel debugging through the GDB remote 
protocol is still available
   from any platform.
-* Support for ARM and PPC64le has been added.
+* Support for ARM, PPC64le, and RISCV64 has been added.
 * The crashed thread is now automatically selected on start.
 * Threads are listed in incrmental order by pid then by tid.
 * Unread kernel messages saved in msgbufp are now printed when lldb starts. 
This information is printed only


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

Reply via email to