From 0fc4819beec7a29b8a0b2b055694bd662d404c4a Mon Sep 17 00:00:00 2001 From: Bet4 <0xbet4@gmail.com> Date: Thu, 30 Mar 2023 20:30:06 +0800 Subject: [PATCH] Toggle support for `QStartNoAckMode` --- example_no_std/src/gdb.rs | 6 ++++++ src/stub/core_impl/base.rs | 5 ++++- src/target/mod.rs | 9 +++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/example_no_std/src/gdb.rs b/example_no_std/src/gdb.rs index ea6612b..76fa51d 100644 --- a/example_no_std/src/gdb.rs +++ b/example_no_std/src/gdb.rs @@ -22,6 +22,12 @@ impl Target for DummyTarget { target::ext::base::BaseOps::MultiThread(self) } + // disable `QStartNoAckMode` + #[inline(always)] + fn use_no_ack_mode(&self) -> bool { + false + } + // disable X packet optimization in order to save space #[inline(always)] fn use_x_upcase_packet(&self) -> bool { diff --git a/src/stub/core_impl/base.rs b/src/stub/core_impl/base.rs index d5fe3b2..1fe6f0c 100644 --- a/src/stub/core_impl/base.rs +++ b/src/stub/core_impl/base.rs @@ -103,9 +103,12 @@ impl GdbStubImpl { res.write_str(concat!( ";vContSupported+", ";multiprocess+", - ";QStartNoAckMode+", ))?; + if target.use_no_ack_mode() { + res.write_str(";QStartNoAckMode+",)?; + } + if let Some(resume_ops) = target.base_ops().resume_ops() { let (reverse_cont, reverse_step) = match resume_ops { ResumeOps::MultiThread(ops) => ( diff --git a/src/target/mod.rs b/src/target/mod.rs index 985eea6..accc6ee 100644 --- a/src/target/mod.rs +++ b/src/target/mod.rs @@ -543,6 +543,14 @@ pub trait Target { true } + /// Enable/disable `QStartNoAckMode` + /// + /// By default, this method returns `true`. + #[inline(always)] + fn use_no_ack_mode(&self) -> bool { + true + } + /// Whether `gdbstub` should provide a "stub" `resume` implementation on /// targets without support for resumption. /// @@ -728,6 +736,7 @@ macro_rules! impl_dyn_target { __delegate!(fn guard_rail_single_step_gdb_behavior(&self) -> SingleStepGdbBehavior); __delegate!(fn use_x_upcase_packet(&self) -> bool); + __delegate!(fn use_no_ack_mode(&self) -> bool); __delegate!(fn use_resume_stub(&self) -> bool); __delegate!(fn use_rle(&self) -> bool); __delegate!(fn use_target_description_xml(&self) -> bool);