From a91c1c50a39ff68a7e73cef70829e8a5b08b4b6b Mon Sep 17 00:00:00 2001 From: iximeow Date: Sun, 17 Mar 2024 02:44:57 +0000 Subject: be more explicit about undefined system instructions being invalid --- differential-tests/tests/capstone-differential.rs | 9 ++++++++- src/armv8/a64.rs | 6 ++++++ tests/armv8/a64.rs | 5 +++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/differential-tests/tests/capstone-differential.rs b/differential-tests/tests/capstone-differential.rs index 3db6fdd..cbed59f 100644 --- a/differential-tests/tests/capstone-differential.rs +++ b/differential-tests/tests/capstone-differential.rs @@ -368,7 +368,14 @@ fn capstone_differential() { stats.missed_incomplete.fetch_add(1, Ordering::SeqCst); continue; } else { - panic!("yax errored where capstone succeeded. cs text: '{}', bytes: {:x?}", cs_text, bytes); + // capstone dedodes the UNDEFINED encodings in C5.1.2 as "mrs", yax returns + // a decode error. + if cs_text.starts_with("mrs ") { + stats.yax_reject.fetch_add(1, Ordering::SeqCst); + continue; + } else { + panic!("yax errored where capstone succeeded. cs text: '{}', bytes: {:x?}", cs_text, bytes); + } }; fn acceptable_match(yax_text: &str, cs_text: &str) -> bool { diff --git a/src/armv8/a64.rs b/src/armv8/a64.rs index 19440ba..a228027 100644 --- a/src/armv8/a64.rs +++ b/src/armv8/a64.rs @@ -10454,7 +10454,12 @@ impl Decoder for InstDecoder { ]; } 0b100 => { + // quote C5.1.2: + // All encodings with L==1 and op0==0b0x are UNDEFINED, except + // for encodings in the area reserved for IMPLEMENTATION + // DEFINED use inst.opcode = Opcode::Invalid; + return Err(DecodeError::InvalidOpcode); } 0b101 => { let Rt = word & 0b11111; @@ -10484,6 +10489,7 @@ impl Decoder for InstDecoder { } _ => { inst.opcode = Opcode::Invalid; + return Err(DecodeError::InvalidOpcode); } } } diff --git a/tests/armv8/a64.rs b/tests/armv8/a64.rs index a3ec96e..00f53e6 100644 --- a/tests/armv8/a64.rs +++ b/tests/armv8/a64.rs @@ -4753,6 +4753,11 @@ fn test_vec_shift() { } #[test] +fn test_reserved() { + test_err([0x00, 0x00, 0x20, 0xd5], DecodeError::InvalidOpcode); +} + +#[test] fn test_system() { const TESTS: &[([u8; 4], &'static str)] = &[ ([0x00, 0x00, 0x08, 0xd5], "sys #0x0, c0, c0, #0x0, x0"), -- cgit v1.1