ssize_t LocalDebuggerInterface::ReadMemory(target_addr_t address, void* buffer, size_t size) { DebugContextGetter contextGetter(fDebugContextPool); return debug_read_memory(contextGetter.Context(), (const void*)(addr_t)address, buffer, size); }
status_t LocalDebuggerInterface::UninstallWatchpoint(target_addr_t address) { DebugContextGetter contextGetter(fDebugContextPool); debug_nub_clear_watchpoint message; message.address = (void*)(addr_t)address; return write_port(fNubPort, B_DEBUG_MESSAGE_CLEAR_WATCHPOINT, &message, sizeof(message)); }
status_t LocalDebuggerInterface::InstallBreakpoint(target_addr_t address) { DebugContextGetter contextGetter(fDebugContextPool); debug_nub_set_breakpoint message; message.reply_port = contextGetter.Context()->reply_port; message.address = (void*)(addr_t)address; debug_nub_set_breakpoint_reply reply; status_t error = send_debug_message(contextGetter.Context(), B_DEBUG_MESSAGE_SET_BREAKPOINT, &message, sizeof(message), &reply, sizeof(reply)); return error == B_OK ? reply.error : error; }
status_t LocalDebuggerInterface::WriteCoreFile(const char* path) { DebugContextGetter contextGetter(fDebugContextPool); debug_nub_write_core_file_reply reply; debug_nub_write_core_file message; message.reply_port = contextGetter.Context()->reply_port; strlcpy(message.path, path, sizeof(message.path)); status_t error = send_debug_message(contextGetter.Context(), B_DEBUG_WRITE_CORE_FILE, &message, sizeof(message), &reply, sizeof(reply)); if (error == B_OK) error = reply.error; return error; }
status_t LocalDebuggerInterface::InstallWatchpoint(target_addr_t address, uint32 type, int32 length) { DebugContextGetter contextGetter(fDebugContextPool); debug_nub_set_watchpoint message; message.reply_port = contextGetter.Context()->reply_port; message.address = (void*)(addr_t)address; message.type = type; message.length = length; debug_nub_set_watchpoint_reply reply; status_t error = send_debug_message(contextGetter.Context(), B_DEBUG_MESSAGE_SET_WATCHPOINT, &message, sizeof(message), &reply, sizeof(reply)); return error == B_OK ? reply.error : error; }
status_t DebuggerInterface::GetCpuState(thread_id thread, CpuState*& _state) { DebugContextGetter contextGetter(fDebugContextPool); debug_nub_get_cpu_state message; message.reply_port = contextGetter.Context()->reply_port; message.thread = thread; debug_nub_get_cpu_state_reply reply; status_t error = send_debug_message(contextGetter.Context(), B_DEBUG_MESSAGE_GET_CPU_STATE, &message, sizeof(message), &reply, sizeof(reply)); if (error != B_OK) return error; if (reply.error != B_OK) return reply.error; return fArchitecture->CreateCpuState(&reply.cpu_state, sizeof(debug_cpu_state), _state); }
status_t LocalDebuggerInterface::_GetDebugCpuState(thread_id thread, debug_cpu_state& _state) { DebugContextGetter contextGetter(fDebugContextPool); debug_nub_get_cpu_state message; message.reply_port = contextGetter.Context()->reply_port; message.thread = thread; debug_nub_get_cpu_state_reply reply; status_t error = send_debug_message(contextGetter.Context(), B_DEBUG_MESSAGE_GET_CPU_STATE, &message, sizeof(message), &reply, sizeof(reply)); if (error != B_OK) return error; if (reply.error != B_OK) return reply.error; memcpy(&_state, &reply.cpu_state, sizeof(debug_cpu_state)); return B_OK; }
status_t LocalDebuggerInterface::SetCpuState(thread_id thread, const CpuState* state) { debug_cpu_state debugState; status_t error = _GetDebugCpuState(thread, debugState); if (error != B_OK) return error; DebugContextGetter contextGetter(fDebugContextPool); error = state->UpdateDebugState(&debugState, sizeof(debugState)); if (error != B_OK) return error; debug_nub_set_cpu_state message; message.thread = thread; memcpy(&message.cpu_state, &debugState, sizeof(debugState)); return send_debug_message(contextGetter.Context(), B_DEBUG_MESSAGE_SET_CPU_STATE, &message, sizeof(message), NULL, 0); }