#architecture #disassembly #instructions #disassembler #decoder #traits #yaxpeax

no-std yaxpeax-arch

fundamental traits to describe an architecture in the yaxpeax project

17 releases

0.3.2 Jun 26, 2024
0.2.8 May 14, 2024
0.2.7 Aug 22, 2021
0.2.5 Jul 18, 2021
0.0.3 Jan 20, 2020

#90 in Hardware support

Download history 1162/week @ 2024-08-12 864/week @ 2024-08-19 880/week @ 2024-08-26 898/week @ 2024-09-02 1024/week @ 2024-09-09 1261/week @ 2024-09-16 1821/week @ 2024-09-23 1553/week @ 2024-09-30 2073/week @ 2024-10-07 1720/week @ 2024-10-14 1840/week @ 2024-10-21 1783/week @ 2024-10-28 1727/week @ 2024-11-04 2186/week @ 2024-11-11 1801/week @ 2024-11-18 2460/week @ 2024-11-25

8,269 downloads per month
Used in 30 crates (26 directly)

0BSD license

140KB
2K SLoC

yaxpeax-arch

crate documentation

shared traits for architecture definitions, instruction decoders, and related interfaces for instruction decoders from the yaxpeax project.

typically this crate is only interesting if you're writing code to operate on multiple architectures that all implement yaxpeax-arch traits. for example, yaxpeax-dis implements disassembly and display logic generic over the traits defined here, so adding a new decoder is usually only a one or two line addition.

yaxpeax-arch has several crate features, which implementers are encouraged to also support:

  • std: opt-in for std-specific support - in this crate, std enables a std::error::Error requirement on DecodeError, allowing users to ?-unwrap decode results.
  • color_new: enables traits and structs to stylize formatted instructions, including ANSI colorization.
  • colors: DEPRECATED. enables (optional) crossterm-based ANSI colorization. default coloring rules are defined by ColorSettings, when enabled.
  • address-parse: enable a requirement that yaxpeax_arch::Address be parsable from &str. this is useful for use cases that, for example, read addresses from humans.
  • use-serde: enable serde serialization and deserialization bounds for types like Address.

with all features disabled, yaxpeax-arch's only direct dependency is num-traits, and is suitable for #![no_std] usage.

design

yaxpeax-arch has backwards-incompatible changes from time to time, but there's not much to make incompatible. the main benefit of this crate is the Arch trait, for other libraries to build architecture-agnostic functionality.

nontrivial additions to yaxpeax-arch should include some discussion summarized by an addition to the crate docs/. you may ask, "where does discussion happen?", and the answer currently is in my (iximeow's) head, or various discord/irc/discord/email conversations. if there's need in the future, yaxpeax may develop a more consistent process.

yaxpeax-arch intends to support ad-hoc development of architecture support. maintainers of various architectures' crates may not want to implement all available interfaces to a complete level of detail, and must not be required to. incomplete implementations may be an issue for downstream users, but library quality is mediated by human conversation, not yaxpeax-arch interfaces. extensions to these fundamental definitions should be considerate of partial and incomplete implementations.

implementations

there are numerous architectures for which decoders are implemented, at varying levels of completion. now and in the future, they will be enumerated here:

symbol meaning
🥳 complete, reliable
⚠️ "complete", likely has gaps
🚧 incomplete
unimplemented
architecture library decode tests benchmarks note
x86_64 yaxpeax-x86 🥳 🥳 🥳
x86:32 yaxpeax-x86 🥳 🥳 sse and sse2 support cannot be disabled
x86:16 yaxpeax-x86 🥳 🥳 instructions above the 8086 or 286 cannot be disabled
ia64 yaxpeax-ia64 🥳 ⚠️ lack of a good oracle has complicated testing
armv7 yaxpeax-arm 🚧 🚧 NEON is not yet supported
armv8 yaxpeax-arm 🚧 🚧 a32 decoding is not yet supported, NEON is not supported
m16c yaxpeax-m16c ⚠️ 🚧
mips yaxpeax-mips 🚧 🚧
msp430 yaxpeax-msp430 🚧 🚧
pic17 yaxpeax-pic17 🚧 🚧
pic18 yaxpeax-pic18 🚧 🚧
pic24 yaxpeax-pic24 exists, but only decodes NOP
sm83 yaxpeax-sm83 🥳 🚧
avr yaxpeax-avr 🥳 🚧 contributed by @the6p4c!
sh/sh2/j2/sh3/sh4 yaxpeax-superh 🥳 🚧 contributed by наб
MOS 6502 yaxpeax-6502 ⚠️ contributed by @cr1901
lc87 yaxpeax-lc87 🥳 ⚠️

feature support

yaxpeax-arch defines a few typically-optional features that decoders can also implement, in addition to simple (bytes) -> instruction decoding. these are yaxpeax-arch traits (or collections thereof) which architectures implement, not crate features.

description_spans: implementation of AnnotatingDecoder, to decode instructions with bit-level details of what incoming bitstreams mean. contextualize: implementation of ShowContextual, to display instructions with user-defined information in place of default instruction data. typically expected to show label names instead of relative branch addresses. i do not recommend implementing this trait, it needs significant reconsideration.

architecture description_spans contextualize
x86_64 🥳
ia64 ⚠️
msp430 🥳

mirrors

the canonical copy of yaxpeax-arch is at https://git.iximeow.net/yaxpeax-arch.

yaxpeax-arch is also mirrored on GitHub at https://www.github.com/iximeow/yaxpeax-arch.

Dependencies

~0.1–5MB
~10K SLoC