Files
wash 4d30949a4d meta: add debugging library
the debug library can be used by both server (the kernel) and client
(the debugger) applications. the library implements the protocol
that is used for communication between the kernel and debugger, as
well as handling for any requests supported by the protocol.
2026-06-06 17:25:00 +01:00

111 lines
2.1 KiB
C

#include "magenta/debug/util.h"
#include <magenta/debug/host.h>
#include <magenta/debug/packet.h>
#include <magenta/debug/request.h>
enum mxdbg_status mxdbg_host_handle_request(struct mxdbg_host *host)
{
struct mxdbg_packet packet = {0};
enum mxdbg_status status = mxdbg_host_recv(host, &packet);
if (status != MXDBG_SUCCESS) {
debug_printf("debug: failed to read packet");
return status;
}
if (packet.pkt_magic != MXDBG_PACKET_MAGIC) {
debug_printf(
"debug: packet is malformed (magic=%08x)",
packet.pkt_magic);
return MXDBG_ERR_BAD_FORMAT;
}
return mxdbg_handle_request(host, &packet);
}
enum mxdbg_status mxdbg_host_recv(
struct mxdbg_host *host,
struct mxdbg_packet *packet)
{
size_t r;
if (host->read_remote) {
return host->read_remote(host, packet, sizeof *packet, &r);
}
return MXDBG_ERR_NOT_SUPPORTED;
}
enum mxdbg_status mxdbg_host_recv_packet_data(
struct mxdbg_host *host,
struct mxdbg_packet *packet)
{
if (packet->pkt_magic != MXDBG_PACKET_MAGIC) {
return MXDBG_ERR_INVALID_ARGUMENT;
}
if (!packet->pkt_length) {
return MXDBG_SUCCESS;
}
size_t r;
void *dest = packet + 1;
if (host->read_remote) {
return host->read_remote(
host,
dest,
packet->pkt_length - sizeof *packet,
&r);
}
return MXDBG_ERR_NOT_SUPPORTED;
}
enum mxdbg_status mxdbg_host_send(
struct mxdbg_host *host,
const struct mxdbg_packet *packet)
{
size_t w;
if (host->write_remote) {
return host->write_remote(host, packet, packet->pkt_length, &w);
}
return MXDBG_ERR_NOT_SUPPORTED;
}
enum mxdbg_status mxdbg_host_identify(
struct mxdbg_host *host,
enum mxdbg_identity_key key,
void *out,
size_t max)
{
if (host->identify) {
return host->identify(host, key, out, max);
}
return MXDBG_ERR_NOT_SUPPORTED;
}
enum mxdbg_status mxdbg_host_identify_task(
struct mxdbg_host *host,
unsigned int tid,
enum mxdbg_identity_key key,
void *out,
size_t max)
{
if (host->identify_task) {
return host->identify_task(host, tid, key, out, max);
}
return MXDBG_ERR_NOT_SUPPORTED;
}
enum mxdbg_status mxdbg_host_resume(struct mxdbg_host *host)
{
if (host->resume) {
return host->resume(host);
}
return MXDBG_ERR_NOT_SUPPORTED;
}