Crate gdbstub_arch
source ·Expand description
Community-created implementations of gdbstub::arch::Arch
for various
architectures.
Note: If an architecture is missing from this crate, that does not mean
that it can’t be used with gdbstub
! So-long as there’s support for the
target architecture in GDB, it should be fairly straightforward to implement
Arch
manually.
Please consider upstreaming any missing Arch
implementations you happen to
implement yourself! Aside from the altruistic motive of improving gdbstub
,
upstreaming your Arch
implementation will ensure that it’s kept up-to-date
with any future breaking API changes.
Disclaimer: These implementations are all community contributions, and while they are tested (by the PR’s author) and code-reviewed, it’s not particularly feasible to write detailed tests for each architecture! If you spot a bug in any of the implementations, please file an issue / open a PR!
§What’s with RegIdImpl
?
Supporting the Target::read/write_register
API required introducing a new
RegId
trait + Arch::RegId
associated type. RegId
is used by
gdbstub
to translate raw GDB register ids (a protocol level arch-dependent
usize
) into human-readable enum variants.
Unfortunately, this API was added after several contributors had already
upstreamed their Arch
implementations, and as a result, there are several
built-in arch implementations which are missing proper RegId
enums
(tracked under issue #29).
As a stop-gap measure, affected Arch
implementations have been modified to
accept a RegIdImpl
type parameter, which requires users to manually
specify a RegId
implementation.
If you’re not interested in implementing the Target::read/write_register
methods and just want to get up-and-running with gdbstub
, it’s fine to
set RegIdImpl
to ()
and use the built-in stubbed impl RegId for ()
.
A better approach would be to implement (and hopefully upstream!) a proper
RegId
enum. While this will require doing a bit of digging through the GDB
docs + architecture XML definitions,
it’s not too tricky to get a working implementation up and running, and
makes it possible to safely and efficiently implement the
Target::read/write_register
API. As an example, check out
ArmCoreRegId
.
Whenever a RegId
enum is upstreamed, the associated Arch
’s RegIdImpl
parameter will be defaulted to the newly added enum. This will simplify the
API without requiring an explicit breaking API change. Once all RegIdImpl
have a default implementation, only a single breaking API change will be
required to remove RegIdImpl
entirely (along with this documentation).
Modules§
- Implementation for the AArch64 ARM architecture.
- Implementations for various ARM architectures.
- Implementations for the MIPS architecture.
- Implementations for the TI-MSP430 family of MCUs.
- Implementations for various PowerPC architectures.
- Implementations for the RISC-V architecture.
- Implementations for various x86 architectures.