diff options
author | iximeow <me@iximeow.net> | 2024-03-17 02:45:36 +0000 |
---|---|---|
committer | iximeow <me@iximeow.net> | 2024-03-17 02:45:36 +0000 |
commit | 9afd2dfc74b16144712bc5c3ea7583fcb639be9d (patch) | |
tree | f9771f6291e19ff11a4d5c169c9041501712bfd6 | |
parent | a91c1c50a39ff68a7e73cef70829e8a5b08b4b6b (diff) |
differential test: remove many exceptions, refine mrs exception
-rw-r--r-- | differential-tests/tests/capstone-differential.rs | 80 |
1 files changed, 11 insertions, 69 deletions
diff --git a/differential-tests/tests/capstone-differential.rs b/differential-tests/tests/capstone-differential.rs index cbed59f..2137e95 100644 --- a/differential-tests/tests/capstone-differential.rs +++ b/differential-tests/tests/capstone-differential.rs @@ -395,6 +395,17 @@ fn capstone_differential() { eprintln!("cs: {} -> {:?}", cs_text, parsed_cs); } + if parsed_yax.opcode == parsed_cs.opcode && parsed_yax.opcode == "mrs" && parsed_yax.operands[0] == parsed_cs.operands[0] { + if let Some(ParsedOperand::Other(o)) = parsed_yax.operands[1].as_ref() { + if o.starts_with("s") { + // capstone knows about more system registers than yaxpeax-arm at the + // moment, so this is likely a case where the disagreement is on the + // name of the system register. + return true; + } + } + } + if cs_text .replace("uxtw #0", "uxtw") .replace("uxtx #0", "uxtx") == yax_text { @@ -423,14 +434,6 @@ fn capstone_differential() { return true; } - if yax_text.starts_with("adrp ") { - return true; - } - - if yax_text.starts_with("adr ") { - return true; - } - // some instructions like `11400000` have an immeidate lsl #12 as their // last operand. yax normalizes this to an unshifted `imm << 12`, capstone // just prints lsl #12. @@ -471,31 +474,6 @@ fn capstone_differential() { return true; } - // differences on displaying immediates.. - let new_cs_text = cs_text - .replace("#0x", "") - .replace("#-0x", "") - .replace("#-", "") - .replace("#", ""); - let new_yax_text = yax_text - .replace("#0x", "") - .replace("#-0x", "") - .replace("#-", "") - .replace("#", "") - .replace("$+0x", ""); - if new_cs_text == new_yax_text { - return true; - } - - if cs_text.len() > 7 && yax_text.len() > 7 { - if &cs_text[..7] == &yax_text[..7] && (cs_text.contains("#-") || yax_text.contains("#-")) { - return true; - } - if &cs_text[..7] == &yax_text[..7] && (cs_text.contains("shll") || yax_text.contains("shll")) { - return true; - } - } - if parsed_yax.opcode == "mov" && parsed_cs.opcode == "dup" { if parsed_yax.operands == parsed_cs.operands { return true; @@ -510,34 +488,12 @@ fn capstone_differential() { return true; } - if cs_text.len() > 10 && yax_text.len() > 10 { - // eh they're probably the same but yax has a signed hex and capstone has - // unsigned - if &cs_text[..10] == &yax_text[..10] && cs_text.contains("ffffffff") && yax_text.contains("#-0x") { - return true; - } - // yax, for reg + shifted-reg operands, does not omit shift amount - if &cs_text[..10] == &yax_text[..10] && yax_text.contains(" #0x0]") { - return true; - } - - // postindex offsets are base 10 in capstone sometimes? - if yax_text.contains("], #0x") && cs_text.contains("], #") && - &cs_text[..20] == &yax_text[..20] { - return true; - } - } - // yax omits `uxt{w,x}` for extended reg where extension matches the // register size if cs_text.starts_with(yax_text) && (cs_text.ends_with("uxtx") || cs_text.ends_with("uxtw")) { return true; } - if cs_text.starts_with(yax_text) && cs_text.ends_with("0") { - return true; - } - // S being present or not has no bearing on the shift amount, #0 either // way. // yax will not print shift because of its ineffectual nature. @@ -545,10 +501,6 @@ fn capstone_differential() { return true; } - if cs_text == yax_text.replace(" #0", "") { - return true; - } - // yax uses lsl instead of uxtx when the reg size is uxtx. same for // uxtw/w-regs if cs_text.replace("uxtx", "lsl") == yax_text || @@ -595,20 +547,10 @@ fn capstone_differential() { if cs_text.starts_with("sev ") { return true; } - if cs_text.starts_with("mrs ") { - return true; - } - if cs_text.starts_with("sysl ") { - return true; - } if yax_text.starts_with("hint ") { return true; } - if yax_text == &cs_text[..cs_text.len() - 1] && cs_text.ends_with(" ") { - return true; - } - return false; } |