https://github.com/mchoo7 updated https://github.com/llvm/llvm-project/pull/183237
>From b7c6d7687c89c6cb94123261d728ad8bc7a5f74f Mon Sep 17 00:00:00 2001 From: Minsoo Choo <[email protected]> Date: Tue, 24 Feb 2026 23:06:23 -0500 Subject: [PATCH 1/2] [lldb][Process/FreeBSDKernelCore] Implement DoWriteMemory() Signed-off-by: Minsoo Choo <[email protected]> --- .../FreeBSD-Kernel-Core/CMakeLists.txt | 12 ++++ .../ProcessFreeBSDKernelCore.cpp | 56 +++++++++++++++++++ .../ProcessFreeBSDKernelCore.h | 3 + .../ProcessFreeBSDKernelCoreProperties.td | 8 +++ llvm/docs/ReleaseNotes.md | 2 + 5 files changed, 81 insertions(+) create mode 100644 lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCoreProperties.td diff --git a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/CMakeLists.txt b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/CMakeLists.txt index 8aafee3e43314..399baf432dcf8 100644 --- a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/CMakeLists.txt +++ b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/CMakeLists.txt @@ -1,3 +1,11 @@ +lldb_tablegen(ProcessFreeBSDKernelCoreProperties.inc -gen-lldb-property-defs + SOURCE ProcessFreeBSDKernelCoreProperties.td + TARGET LLDBPluginProcessFreeBSDKernelCorePropertiesGen) + +lldb_tablegen(ProcessFreeBSDKernelCorePropertiesEnum.inc -gen-lldb-property-enum-defs + SOURCE ProcessFreeBSDKernelCoreProperties.td + TARGET LLDBPluginProcessFreeBSDKernelCorePropertiesEnumGen) + add_lldb_library(lldbPluginProcessFreeBSDKernelCore PLUGIN ProcessFreeBSDKernelCore.cpp RegisterContextFreeBSDKernelCore_arm64.cpp @@ -12,3 +20,7 @@ add_lldb_library(lldbPluginProcessFreeBSDKernelCore PLUGIN lldbTarget kvm ) + +add_dependencies(lldbPluginProcessFreeBSDKernelCore + LLDBPluginProcessFreeBSDKernelCorePropertiesGen + LLDBPluginProcessFreeBSDKernelCorePropertiesEnumGen) diff --git a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp index ebbf89669cc40..57c4170b8425f 100644 --- a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp +++ b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp @@ -25,6 +25,42 @@ using namespace lldb_private; LLDB_PLUGIN_DEFINE(ProcessFreeBSDKernelCore) +namespace { + +#define LLDB_PROPERTIES_processfreebsdkernelcore +#include "ProcessFreeBSDKernelCoreProperties.inc" + +enum { +#define LLDB_PROPERTIES_processfreebsdkernelcore +#include "ProcessFreeBSDKernelCorePropertiesEnum.inc" +}; + +class PluginProperties : public Properties { +public: + static llvm::StringRef GetSettingName() { + return ProcessFreeBSDKernelCore::GetPluginNameStatic(); + } + + PluginProperties() : Properties() { + m_collection_sp = std::make_shared<OptionValueProperties>(GetSettingName()); + m_collection_sp->Initialize(g_processfreebsdkernelcore_properties_def); + } + + ~PluginProperties() override = default; + + bool GetReadOnly() const { + const uint32_t idx = ePropertyReadOnly; + return GetPropertyAtIndexAs<bool>(idx, true); + } +}; + +} // namespace + +static PluginProperties &GetGlobalPluginProperties() { + static PluginProperties g_settings; + return g_settings; +} + ProcessFreeBSDKernelCore::ProcessFreeBSDKernelCore(lldb::TargetSP target_sp, ListenerSP listener_sp, kvm_t *kvm, @@ -90,6 +126,26 @@ void ProcessFreeBSDKernelCore::RefreshStateAfterStop() { } } +size_t ProcessFreeBSDKernelCore::DoWriteMemory(lldb::addr_t addr, + const void *buf, size_t size, + Status &error) { + if (GetGlobalPluginProperties().GetReadOnly()) { + error = Status::FromErrorString( + "Memory writes are disabled in read-only mode. Disable with 'settings " + "set plugin.process.freebsd-kernel-core.read-only false'"); + return 0; + } + + ssize_t rd = 0; + rd = kvm_write(m_kvm, addr, buf, size); + if (rd < 0 || static_cast<size_t>(rd) != size) { + error = Status::FromErrorStringWithFormat("Writing memory failed: %s", + GetError()); + return rd > 0 ? rd : 0; + } + return rd; +} + bool ProcessFreeBSDKernelCore::DoUpdateThreadList(ThreadList &old_thread_list, ThreadList &new_thread_list) { if (old_thread_list.GetSize(false) == 0) { diff --git a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.h b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.h index c677c236ddc21..2cbd537c30bc5 100644 --- a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.h +++ b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.h @@ -48,6 +48,9 @@ class ProcessFreeBSDKernelCore : public lldb_private::PostMortemProcess { void RefreshStateAfterStop() override; + size_t DoWriteMemory(lldb::addr_t addr, const void *buf, size_t size, + lldb_private::Status &error) override; + protected: bool DoUpdateThreadList(lldb_private::ThreadList &old_thread_list, lldb_private::ThreadList &new_thread_list) override; diff --git a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCoreProperties.td b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCoreProperties.td new file mode 100644 index 0000000000000..30986bf71aab4 --- /dev/null +++ b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCoreProperties.td @@ -0,0 +1,8 @@ +include "../../../../include/lldb/Core/PropertiesBase.td" + +let Definition = "processfreebsdkernelcore", Path = "plugin.process.freebsd-kernel-core" in { + def ReadOnly: Property<"read-only", "Boolean">, + Global, + DefaultTrue, + Desc<"Disable memory writes to the core. This is enabled by default for safety.">; +} diff --git a/llvm/docs/ReleaseNotes.md b/llvm/docs/ReleaseNotes.md index d9fb4ddc36c9d..9cb0ff059719c 100644 --- a/llvm/docs/ReleaseNotes.md +++ b/llvm/docs/ReleaseNotes.md @@ -220,6 +220,8 @@ Changes to LLDB * 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 when lldb is in the interactive mode (i.e. not in batch mode). +* Writing to core is now supported. For security, `plugin.process.freebsd-kernel-core.read-only` must be set + to `false` to enable this feature. ### Linux >From 76fd8bcbe00c973475869d24b2e79acac717b972 Mon Sep 17 00:00:00 2001 From: Minsoo Choo <[email protected]> Date: Wed, 25 Feb 2026 10:54:16 -0500 Subject: [PATCH 2/2] fixup! [lldb][Process/FreeBSDKernelCore] Implement DoWriteMemory() Signed-off-by: Minsoo Choo <[email protected]> --- .../ProcessFreeBSDKernelCore.cpp | 15 +++++++++++++-- .../ProcessFreeBSDKernelCore.h | 3 +++ llvm/docs/ReleaseNotes.md | 3 +-- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp index 57c4170b8425f..1e47c67ae5865 100644 --- a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp +++ b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp @@ -6,7 +6,6 @@ // //===----------------------------------------------------------------------===// -#include "lldb/Core/Debugger.h" #include "lldb/Core/Module.h" #include "lldb/Core/PluginManager.h" #include "lldb/Interpreter/CommandInterpreter.h" @@ -92,10 +91,22 @@ void ProcessFreeBSDKernelCore::Initialize() { llvm::call_once(g_once_flag, []() { PluginManager::RegisterPlugin(GetPluginNameStatic(), - GetPluginDescriptionStatic(), CreateInstance); + GetPluginDescriptionStatic(), CreateInstance, + DebuggerInitialize); }); } +void ProcessGDBRemote::DebuggerInitialize(Debugger &debugger) { + if (!PluginManager::GetSettingForProcessPlugin( + debugger, PluginProperties::GetSettingName())) { + const bool is_global_setting = true; + PluginManager::CreateSettingForProcessPlugin( + debugger, GetGlobalPluginProperties().GetValueProperties(), + "Properties for the freebsd-kernel process plug-in.", + is_global_setting); + } +} + void ProcessFreeBSDKernelCore::Terminate() { PluginManager::UnregisterPlugin(ProcessFreeBSDKernelCore::CreateInstance); } diff --git a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.h b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.h index 2cbd537c30bc5..fb5b0b7858ecd 100644 --- a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.h +++ b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.h @@ -9,6 +9,7 @@ #ifndef LLDB_SOURCE_PLUGINS_PROCESS_FREEBSDKERNEL_PROCESSFREEBSDKERNELCORE_H #define LLDB_SOURCE_PLUGINS_PROCESS_FREEBSDKERNEL_PROCESSFREEBSDKERNELCORE_H +#include "lldb/Core/Debugger.h" #include "lldb/Target/PostMortemProcess.h" #include <kvm.h> @@ -27,6 +28,8 @@ class ProcessFreeBSDKernelCore : public lldb_private::PostMortemProcess { static void Initialize(); + static void DebuggerInitialize(Debugger &debugger); + static void Terminate(); static llvm::StringRef GetPluginNameStatic() { return "freebsd-kernel-core"; } diff --git a/llvm/docs/ReleaseNotes.md b/llvm/docs/ReleaseNotes.md index 9cb0ff059719c..0578a2d5604f2 100644 --- a/llvm/docs/ReleaseNotes.md +++ b/llvm/docs/ReleaseNotes.md @@ -220,8 +220,7 @@ Changes to LLDB * 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 when lldb is in the interactive mode (i.e. not in batch mode). -* Writing to core is now supported. For security, `plugin.process.freebsd-kernel-core.read-only` must be set - to `false` to enable this feature. +* Memory writes are currently disabled. You can enable them with `set plugin.process.freebsd-kernel-core.read-only false`. ### Linux _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
