summaryrefslogtreecommitdiffhomepage
path: root/dev/DebuggerKit/src/NeKernelContract.cc
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-09-03 21:08:50 +0200
committerAmlal El Mahrouss <amlal@nekernel.org>2025-09-03 21:09:12 +0200
commitf13cd06e819ac630dfa30446aa9fe4c1c8c83dc9 (patch)
tree0628b588c4fe99facad47e453d673a3ae96099ed /dev/DebuggerKit/src/NeKernelContract.cc
parentd84a951e42b69a1c2665548fa5d5f621b91e51ec (diff)
feat: DebuggerKit: NeKernel debugger protocol client.
what: A new protocol to debug the NeKernel image. Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'dev/DebuggerKit/src/NeKernelContract.cc')
-rw-r--r--dev/DebuggerKit/src/NeKernelContract.cc53
1 files changed, 49 insertions, 4 deletions
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 <ThirdParty/Dialogs.h>
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