Skip to content

0.5.0

Compare
Choose a tag to compare
@daniel5151 daniel5151 released this 22 May 23:44
· 137 commits to master since this release

0.5.0

While the overall structure of the API has remained the same, 0.5.0 does introduce a few breaking API changes that require some attention. That being said, it should not be a difficult migration, and updating to 0.5.0 from 0.4 shouldn't take more than 10 mins of refactoring.

Check out transition_guide.md for guidance on upgrading from 0.4.x to 0.5.

New Features

  • Implement Run-Length-Encoding (RLE) on outgoing packets
    • This significantly cuts down on the data being transferred over the wire when reading from registers/memory
  • Add target-specific kind: Arch::BreakpointKind parameters to the Breakpoint API
    • While emulated systems typically implement breakpoints by pausing execution once the PC hits a certain value, "real" systems typically need to patch the instruction stream with a breakpoint instruction. On systems with variable-sized instructions, this kind parameter specifies the size of the instruction that should be injected.
  • Implement ResumeAction::{Step,Continue}WithSignal
  • Added the Exited(u8), Terminated(u8), and ReplayLog("begin"|"end") stop reasons.
  • Added DisconnectReason::Exited(u8) and DisconnectReason::Terminated(u8).
  • Reworked the MultiThreadOps::resume API to be significantly more ergonomic and efficient

New Protocol Extensions

  • {Single,Multi}ThreadReverse{Step,Continue} - Support for reverse-step and reverse-continue. #48 (DrChat)
  • {Single,Multi}ThreadRangeStepping - Optional optimized range stepping support.

Breaking Arch Changes

  • gdbstub::arch has been moved into a separate gdbstub_arch crate
    • See #45 for details on why this was done.
  • (x86) Break GPRs & SRs into individual fields/variants #34

Breaking API Changes

  • Base Protocol Refactors
    • Reworked the MultiThreadOps::resume API
    • Added a wrapper around the raw check_gdb_interrupt callback, hiding the underlying implementation details
    • Extracted base protocol single-register access methods ({read,write}_register) into separate SingleRegisterAccess trait
      • These are optional GDB protocol methods, and as such, should be modeled as IDETs
  • Protocol Extension Refactors
    • Consolidated the {Hw,Sw}Breakpoints/Watchpoints IDETs under a single Breakpoints IDET + sub-IDETs
    • Added new arch-specific kind: Arch::BreakpointKind parameter to add_{hw,sw}_breakpoint methods
    • Renamed target::ext::extended_mod::ConfigureASLR{Ops} to ConfigureAslr{Ops} (clippy::upper_case_acronyms)
  • Added {Step,Continue}WithSignal variants to target::ext::base::ResumeAction
  • Trait Changes
    • arch::Arch: Added type BreakpointKind. Required to support arch-specific breakpoint kinds
    • arch::Arch: (very minor) Added num_traits::FromPrimitive bound to Arch::Usize
    • arch::Registers: Added type ProgramCounter and associated fn pc(&self) -> Self::ProgramCounter method. Added preemptively in anticipation of future GDB Agent support
  • Removed the Halted stop reason (more accurate to simply return {Exited|Terminated}(SIGSTOP) instead).
  • Removed the Halted disconnect reason (replaced with the Exited and Terminated stop reasons instead).
  • Removed the implicit ExtendedMode attached PID tracking when alloc was available. See 23b56038 rationale behind this change.

Internal Improvements

  • Split monolithic GdbStubImpl implementation into separate files (by protocol extension)
  • Finally rewrite + optimize GdbStubImpl::do_vcont, along with streamlining its interactions with the legacy s and c packets
  • Sprinkle more IDET-based dead code elimination hints (notably wrt. stop reasons)
  • Remove the default self.current_mem_tid hack, replacing it with a much more elegant solution
  • Packet Parser improvements
    • Remove last remaining bit of UTF-8 related code
    • Eliminate as much panicking bounds-checking code as possible
    • support efficient parsing of packets that are parsed differently depending on active protocol extension (namely, the breakpoint packets)
    • (currently unused) Zero-cost support for parsing Z and z packets with embedded agent bytecode expressions
  • Use intra-doc links whenever possible

Bugfixes

  • Fix RiscvRegId for arch::riscv::Riscv64 #46 (fzyz999)