diff options
-rw-r--r-- | Cargo.lock | 58 | ||||
-rw-r--r-- | Cargo.toml | 5 | ||||
-rw-r--r-- | src/main.rs | 94 |
3 files changed, 53 insertions, 104 deletions
@@ -357,12 +357,6 @@ dependencies = [ ] [[package]] -name = "take_mut" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" - -[[package]] name = "tap" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -431,31 +425,18 @@ checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" [[package]] name = "yaxpeax-6502" -version = "0.0.1" +version = "0.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53afe49cd799784eeefe7108efd48852ea83673d55d98389a563532f05c5ea3" +checksum = "7e89d220a799f57094ad0a58c16b2c3b7730e8f1404665bee5f10e039e7c17c3" dependencies = [ - "take_mut", - "yaxpeax-arch 0.0.5", + "yaxpeax-arch", ] [[package]] name = "yaxpeax-arch" -version = "0.0.5" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6d51fa58dc03a872cf25e864c5edeb57a00a0be1e99112fe9b620eed839f035" -dependencies = [ - "crossterm", - "num-traits", - "serde", - "serde_derive", -] - -[[package]] -name = "yaxpeax-arch" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c90868b68ae34284714134e827062757881ab642e5746ecdcd567ffd582ff7" +checksum = "f1ba5c2f163fa2f866c36750c6c931566c6d93231ae9410083b0738953b609d5" dependencies = [ "crossterm", "num-traits", @@ -472,7 +453,7 @@ dependencies = [ "bitvec", "serde", "serde_derive", - "yaxpeax-arch 0.2.5", + "yaxpeax-arch", ] [[package]] @@ -481,7 +462,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94153e4e363dd4b0bea761ce9615647f2a29a9c3d46d3467c776969eb2b4e91c" dependencies = [ - "yaxpeax-arch 0.2.5", + "yaxpeax-arch", ] [[package]] @@ -492,8 +473,7 @@ dependencies = [ "hex", "num-traits", "yaxpeax-6502", - "yaxpeax-arch 0.0.5", - "yaxpeax-arch 0.2.5", + "yaxpeax-arch", "yaxpeax-arm", "yaxpeax-avr", "yaxpeax-ia64", @@ -514,7 +494,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3ea0f2b5728fb7eb1861532cd755ff7dd993843778d548df70a4aca95f9914e" dependencies = [ "bitvec", - "yaxpeax-arch 0.2.5", + "yaxpeax-arch", ] [[package]] @@ -523,7 +503,7 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2cf556f365c2fa2104e4e9a36105d9a2f72085dfd7168c95abf4f0d7cdac0cff" dependencies = [ - "yaxpeax-arch 0.2.5", + "yaxpeax-arch", ] [[package]] @@ -535,7 +515,7 @@ dependencies = [ "num-traits", "serde", "serde_derive", - "yaxpeax-arch 0.2.5", + "yaxpeax-arch", ] [[package]] @@ -545,7 +525,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d83d243a75ff9312b78ef761596cf0bf3b625786176363d65e653a75042873a" dependencies = [ "num_enum", - "yaxpeax-arch 0.2.5", + "yaxpeax-arch", ] [[package]] @@ -554,7 +534,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63962bd68624664aa3a3391785f95388001e9d6107cdf8557e962153e4a854c5" dependencies = [ - "yaxpeax-arch 0.2.5", + "yaxpeax-arch", ] [[package]] @@ -563,7 +543,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb717c23e96ce83de1569c512ab5508a6e39a194a73662e618608f0f1c41ada4" dependencies = [ - "yaxpeax-arch 0.2.5", + "yaxpeax-arch", ] [[package]] @@ -572,16 +552,16 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf1fb0d482f0f7d23394e31e50bce78d8320760c790d86e324c1a1e49710097a" dependencies = [ - "yaxpeax-arch 0.2.5", + "yaxpeax-arch", ] [[package]] name = "yaxpeax-superh" -version = "0.1.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c04d16d2b60e7961ace2b8624c12295e86babb3b8a6615a4238bbb823ba0936e" +checksum = "8c8cc1c381ba557a8d7e9fdb1399c36e4d9ce5a517b3e2bb504b261012403f4f" dependencies = [ - "yaxpeax-arch 0.0.5", + "yaxpeax-arch", ] [[package]] @@ -593,5 +573,5 @@ dependencies = [ "num-traits", "serde", "serde_derive", - "yaxpeax-arch 0.2.5", + "yaxpeax-arch", ] @@ -20,7 +20,6 @@ num-traits = "0.2.10" # common interfaces for all yaxpeax decoders yaxpeax-arch-02 = { package = "yaxpeax-arch", version = "0.2.4" } -yaxpeax-arch-01 = { package = "yaxpeax-arch", version = "0.0.5" } yaxpeax-arm = { version = "0.1.1" } yaxpeax-avr = { version = "0.1.0" } @@ -32,5 +31,5 @@ yaxpeax-pic17 = { version = "0.1.0" } yaxpeax-pic18 = { version = "0.1.0" } yaxpeax-x86 = { version = "1.0.4" } yaxpeax-ia64 = { version = "0.2.1" } -yaxpeax-superh = { version = "0.1.0" } -yaxpeax-6502 = { version = "0.0.1" } +yaxpeax-superh = { version = "0.3.0" } +yaxpeax-6502 = { version = "0.0.2", features = ["std"] } diff --git a/src/main.rs b/src/main.rs index fe531dd..02e0974 100644 --- a/src/main.rs +++ b/src/main.rs @@ -85,27 +85,27 @@ fn main() { match arch_str { "x86_64" | - "x86:64" => crate::current_arch::decode_input::<yaxpeax_x86::long_mode::Arch>(&buf, &printer), + "x86:64" => arch_02::decode_input::<yaxpeax_x86::long_mode::Arch>(&buf, &printer), "x86_32" | - "x86:32" => crate::current_arch::decode_input::<yaxpeax_x86::protected_mode::Arch>(&buf, &printer), + "x86:32" => arch_02::decode_input::<yaxpeax_x86::protected_mode::Arch>(&buf, &printer), "x86_16" | - "x86:16" => crate::current_arch::decode_input::<yaxpeax_x86::real_mode::Arch>(&buf, &printer), - "ia64" => crate::current_arch::decode_input::<yaxpeax_ia64::IA64>(&buf, &printer), - "avr" => crate::current_arch::decode_input::<yaxpeax_avr::AVR>(&buf, &printer), - "armv7" => crate::current_arch::decode_input::<yaxpeax_arm::armv7::ARMv7>(&buf, &printer), - "armv8" => crate::current_arch::decode_input::<yaxpeax_arm::armv8::a64::ARMv8>(&buf, &printer), - "mips" => crate::current_arch::decode_input::<yaxpeax_mips::MIPS>(&buf, &printer), - "msp430" => crate::current_arch::decode_input::<yaxpeax_msp430::MSP430>(&buf, &printer), - "pic17" => crate::current_arch::decode_input::<yaxpeax_pic17::PIC17>(&buf, &printer), - "pic18" => crate::current_arch::decode_input::<yaxpeax_pic18::PIC18>(&buf, &printer), - "m16c" => crate::current_arch::decode_input::<yaxpeax_m16c::M16C>(&buf, &printer), - "6502" => crate::legacy_arch::decode_input::<yaxpeax_6502::N6502>(&buf, &printer), - "lc87" => crate::current_arch::decode_input::<yaxpeax_lc87::LC87>(&buf, &printer), + "x86:16" => arch_02::decode_input::<yaxpeax_x86::real_mode::Arch>(&buf, &printer), + "ia64" => arch_02::decode_input::<yaxpeax_ia64::IA64>(&buf, &printer), + "avr" => arch_02::decode_input::<yaxpeax_avr::AVR>(&buf, &printer), + "armv7" => arch_02::decode_input::<yaxpeax_arm::armv7::ARMv7>(&buf, &printer), + "armv8" => arch_02::decode_input::<yaxpeax_arm::armv8::a64::ARMv8>(&buf, &printer), + "mips" => arch_02::decode_input::<yaxpeax_mips::MIPS>(&buf, &printer), + "msp430" => arch_02::decode_input::<yaxpeax_msp430::MSP430>(&buf, &printer), + "pic17" => arch_02::decode_input::<yaxpeax_pic17::PIC17>(&buf, &printer), + "pic18" => arch_02::decode_input::<yaxpeax_pic18::PIC18>(&buf, &printer), + "m16c" => arch_02::decode_input::<yaxpeax_m16c::M16C>(&buf, &printer), + "6502" => arch_02::decode_input::<yaxpeax_6502::N6502>(&buf, &printer), + "lc87" => arch_02::decode_input::<yaxpeax_lc87::LC87>(&buf, &printer), // "pic24" => decode_input::<yaxpeax_pic24::PIC24>(buf), other => { let seg_idx = arch_str.find(|c| c == '+' || c == '-').unwrap_or(arch_str.len()); let wps = |base| with_parsed_superh(base, &arch_str[seg_idx..], - |decoder| crate::legacy_arch::decode_input_with_decoder::<yaxpeax_superh::SuperH>(decoder, &buf, &printer)); + |decoder| arch_02::decode_input_with_decoder::<yaxpeax_superh::SuperH>(decoder, &buf, &printer)); match &arch_str[0..seg_idx] { "sh" => wps(yaxpeax_superh::SuperHDecoder::SH1), "sh2" => wps(yaxpeax_superh::SuperHDecoder::SH2), @@ -188,67 +188,37 @@ impl Printer { } } -// yaxpeax-arch, implemented by all decoders here, is required at incompatible versions by -// different decoders. implement the actual decode-and-print behavior on both versions of -// yaxpeax-arch while older decoders are still being updated. -mod current_arch { - use yaxpeax_arch_02::{AddressBase, Arch, Decoder, Instruction, LengthedInstruction, Reader, U8Reader}; - use std::fmt; - use num_traits::identities::Zero; +// yaxpeax-arch, implemented by all decoders here, may be required at incompatible versions by +// different decoders if/when a new version releases. implement the actual decode-and-print +// behavior independent of yaxpeax-arch so decoders using different version can exist in parallel. +mod arch_02 { use super::Printer; - - pub(crate) fn decode_input<A: Arch>(buf: &[u8], printer: &Printer) - where - A::Instruction: fmt::Display, for<'data> U8Reader<'data>: Reader<A::Address, A::Word>, - { - decode_input_with_decoder::<A>(A::Decoder::default(), buf, printer); - } - - pub(crate) fn decode_input_with_decoder<A: Arch>(decoder: A::Decoder, buf: &[u8], printer: &Printer) - where - A::Instruction: fmt::Display, for<'data> U8Reader<'data>: Reader<A::Address, A::Word>, - { - let mut addr = A::Address::zero(); - while let Some(rest) = buf.get(addr.to_linear()..).filter(|v| !v.is_empty()) { - let mut reader = U8Reader::new(rest); - let res = decoder.decode(&mut reader); - let advance_addr = match &res { - Ok(inst) => inst.len(), - Err(_) => A::Instruction::min_size(), - }; - let generic_res = res.map(|inst| { - ( - A::Address::zero().wrapping_offset(inst.len()).to_linear(), - inst.well_defined(), - inst, - ) - }); - printer.print_instr(rest, addr.to_linear(), generic_res); - addr += advance_addr; - } - } -} - -mod legacy_arch { - use yaxpeax_arch_01::{AddressBase, Arch, Decoder, Instruction, LengthedInstruction}; - use std::fmt; use num_traits::identities::Zero; - use super::Printer; + use std::fmt; + use yaxpeax_arch_02::{ + AddressBase, Arch, Decoder, Instruction, LengthedInstruction, Reader, U8Reader, + }; pub(crate) fn decode_input<A: Arch>(buf: &[u8], printer: &Printer) where A::Instruction: fmt::Display, + for<'data> U8Reader<'data>: Reader<A::Address, A::Word>, { decode_input_with_decoder::<A>(A::Decoder::default(), buf, printer); } - pub(crate) fn decode_input_with_decoder<A: Arch>(decoder: A::Decoder, buf: &[u8], printer: &Printer) - where + pub(crate) fn decode_input_with_decoder<A: Arch>( + decoder: A::Decoder, + buf: &[u8], + printer: &Printer, + ) where A::Instruction: fmt::Display, + for<'data> U8Reader<'data>: Reader<A::Address, A::Word>, { let mut addr = A::Address::zero(); while let Some(rest) = buf.get(addr.to_linear()..).filter(|v| !v.is_empty()) { - let res = decoder.decode(rest.iter().copied()); + let mut reader = U8Reader::new(rest); + let res = decoder.decode(&mut reader); let advance_addr = match &res { Ok(inst) => inst.len(), Err(_) => A::Instruction::min_size(), |