diff options
Diffstat (limited to 'src/lib.rs')
-rw-r--r-- | src/lib.rs | 46 |
1 files changed, 15 insertions, 31 deletions
@@ -16,7 +16,7 @@ use core::fmt; pub struct IA64; impl Arch for IA64 { - type Word = IA64InstWord; + type Word = u8; type Address = u64; type Instruction = InstructionBundle; type DecodeError = DecodeError; @@ -1349,12 +1349,8 @@ pub enum DecodeError { } impl fmt::Display for DecodeError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match self { - DecodeError::ExhaustedInput => f.write_str("exhausted input"), - DecodeError::BadBundle => f.write_str("bad bundle"), - DecodeError::BadOpcode => f.write_str("bad opcode"), - DecodeError::BadOperand => f.write_str("bad operand"), - } + use yaxpeax_arch::DecodeError; + f.write_str(self.description()) } } impl yaxpeax_arch::DecodeError for DecodeError { @@ -1381,6 +1377,14 @@ impl yaxpeax_arch::DecodeError for DecodeError { false } } + fn description(&self) -> &'static str { + match self { + DecodeError::ExhaustedInput => "exhausted input", + DecodeError::BadBundle => "bad bundle", + DecodeError::BadOpcode => "bad opcode", + DecodeError::BadOperand => "bad operand", + } + } } #[derive(Default)] pub struct InstDecoder {} @@ -1696,28 +1700,13 @@ impl From<ReadError> for DecodeError { } } -#[derive(Debug, PartialEq, Eq)] -pub struct IA64InstWord([u8; 16]); -impl IA64InstWord { - fn bytes(&self) -> &[u8; 16] { - &self.0 - } -} - -impl fmt::Display for IA64InstWord { - fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { - write!(fmt, "{:02x?}", self.0) - } -} - impl Decoder<IA64> for InstDecoder { - type Error = DecodeError; - - fn decode_into<T: Reader<<IA64 as Arch>::Word>>(&self, inst: &mut InstructionBundle, bytes: &mut T) -> Result<(), Self::Error> { - let word = bytes.next()?; + fn decode_into<T: Reader<<IA64 as Arch>::Address, <IA64 as Arch>::Word>>(&self, inst: &mut InstructionBundle, bytes: &mut T) -> Result<(), <IA64 as Arch>::DecodeError> { + let mut ia64_word = [0u8; 16]; + bytes.next_n(&mut ia64_word)?; let mut instruction_bytes = bitarr![Lsb0, u8; 0u8; 128]; for i in 0..0u64.wrapping_offset(InstructionBundle::min_size()).to_linear() { - instruction_bytes[(i * 8)..(i * 8 + 8)].store(word.bytes()[i]); + instruction_bytes[(i * 8)..(i * 8 + 8)].store(ia64_word[i]); } // let instruction_bits = instruction_bytes.view_bits::<Lsb0>(); let bundle_tag = instruction_bytes[0..5].load::<u8>(); @@ -1980,11 +1969,6 @@ impl Decoder<IA64> for InstDecoder { // remaining necessary details Ok(()) } - fn decode<T: Reader<<IA64 as Arch>::Word>>(&self, words: &mut T) -> Result<InstructionBundle, Self::Error> { - let mut inst = InstructionBundle::default(); - self.decode_into(&mut inst, words)?; - Ok(inst) - } } fn one_op(dest: bool, op: Operand) -> (Option<u8>, [Operand; 5]) { |