From f13cd06e819ac630dfa30446aa9fe4c1c8c83dc9 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Wed, 3 Sep 2025 21:08:50 +0200 Subject: feat: DebuggerKit: NeKernel debugger protocol client. what: A new protocol to debug the NeKernel image. Signed-off-by: Amlal El Mahrouss --- dev/DebuggerKit/src/NeKernelContract.cc | 53 ++++++++++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 4 deletions(-) (limited to 'dev/DebuggerKit/src/NeKernelContract.cc') diff --git a/dev/DebuggerKit/src/NeKernelContract.cc b/dev/DebuggerKit/src/NeKernelContract.cc index a071431..53017d6 100644 --- a/dev/DebuggerKit/src/NeKernelContract.cc +++ b/dev/DebuggerKit/src/NeKernelContract.cc @@ -16,6 +16,7 @@ #include using namespace DebuggerKit::NeKernel; +using namespace DebuggerKit::NeKernel::Detail; NeKernelContract::NeKernelContract() = default; @@ -24,23 +25,67 @@ NeKernelContract::~NeKernelContract() = default; BOOL NeKernelContract::Attach(CompilerKit::STLString path, CompilerKit::STLString argv, ProcessID& pid) noexcept { if (path.empty() || argv.empty()) return NO; - return NO; + + m_socket = ::socket(AF_INET, SOCK_STREAM, 0); + + if (m_socket == -1) return NO; + + struct sockaddr_in server_addr; + + server_addr.sin_family = AF_INET; + server_addr.sin_port = htons(kDebugPort); + + if (::inet_pton(AF_INET, argv.c_str(), &server_addr.sin_addr) <= 0) return NO; + + auto ret = (::connect(m_socket, (struct sockaddr*) &server_addr, sizeof(server_addr)) == -1); + + if (ret) return NO; + + CompilerKit::STLString pkt = Detail::kDebugMagic; + pkt += ";\r"; + + ret = ::send(m_socket, pkt.data(), pkt.size(), 0) > 0; + return ret; } BOOL NeKernelContract::BreakAt(CompilerKit::STLString symbol) noexcept { - return NO; + CompilerKit::STLString pkt = Detail::kDebugMagic; + pkt += ";SYM="; + pkt += symbol; + pkt += ";\r"; + + if (pkt.size() > kDebugCmdLen) return NO; + + auto ret = ::send(m_socket, pkt.data(), pkt.size(), 0) > 0; + return ret; } BOOL NeKernelContract::Break() noexcept { - return NO; + CompilerKit::STLString pkt = Detail::kDebugMagic; + pkt += ";BRK=1;\r"; + + auto ret = ::send(m_socket, pkt.data(), pkt.size(), 0) > 0; + return ret; } BOOL NeKernelContract::Continue() noexcept { + CompilerKit::STLString pkt = Detail::kDebugMagic; + pkt += ";CONT=1;\r"; + + auto ret = ::send(m_socket, pkt.data(), pkt.size(), 0) > 0; + return ret; return NO; } BOOL NeKernelContract::Detach() noexcept { - return NO; + CompilerKit::STLString pkt = Detail::kDebugMagic; + pkt += ";DTCH=1;\r"; + + auto ret = ::send(m_socket, pkt.data(), pkt.size(), 0) > 0; + + if (ret) ::close(m_socket); + + return ret; } #endif // DK_NEKERNEL_DEBUGGER -- cgit v1.2.3