From 8b6b2e4804fd7c94898022435a698bf797c614f0 Mon Sep 17 00:00:00 2001 From: PandasAreBears Date: Sat, 28 Feb 2026 10:36:29 +0000 Subject: [PATCH 1/5] feat: Add a method to Arm64InsnDetail to expose the post_index flag --- capstone-rs/src/arch/arm64.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/capstone-rs/src/arch/arm64.rs b/capstone-rs/src/arch/arm64.rs index 11e97fd3..fe0b88fb 100644 --- a/capstone-rs/src/arch/arm64.rs +++ b/capstone-rs/src/arch/arm64.rs @@ -167,6 +167,11 @@ impl Arm64InsnDetail<'_> { self.0.update_flags } + /// Whether this is a post-index writeback (only applicable when `writeback` is true) + pub fn post_index(&self) -> bool { + self.0.post_index + } + /// Whether writeback is required pub fn writeback(&self) -> bool { self.0.writeback @@ -174,7 +179,7 @@ impl Arm64InsnDetail<'_> { } impl_PartialEq_repr_fields!(Arm64InsnDetail<'a> [ 'a ]; - cc, update_flags, writeback, operands + cc, update_flags, post_index, writeback, operands ); impl Arm64OpMem { From 079889447c505b3b40331b1395fd9f1d37f8b68b Mon Sep 17 00:00:00 2001 From: PandasAreBears Date: Wed, 4 Mar 2026 20:21:32 +0000 Subject: [PATCH 2/5] Add post_index field to arm arch --- capstone-rs/src/arch/arm.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/capstone-rs/src/arch/arm.rs b/capstone-rs/src/arch/arm.rs index c9d0c148..909d2c66 100644 --- a/capstone-rs/src/arch/arm.rs +++ b/capstone-rs/src/arch/arm.rs @@ -206,6 +206,11 @@ impl ArmInsnDetail<'_> { pub fn update_flags(&self) -> bool { self.0.update_flags } + + /// Whether this is a post-index writeback (only applicable when `writeback` is true) + pub fn post_index(&self) -> bool { + self.0.post_index + } /// Whether writeback is required pub fn writeback(&self) -> bool { @@ -219,7 +224,7 @@ impl ArmInsnDetail<'_> { } impl_PartialEq_repr_fields!(ArmInsnDetail<'a> [ 'a ]; - usermode, vector_size, vector_data, cps_mode, cps_flag, cc, update_flags, writeback, + usermode, vector_size, vector_data, cps_mode, cps_flag, cc, update_flags, post_index, writeback, mem_barrier, operands ); From 08c8fe5ba1b58f230c94769cce5f36b0dd2a9d49 Mon Sep 17 00:00:00 2001 From: PandasAreBears Date: Wed, 4 Mar 2026 20:21:50 +0000 Subject: [PATCH 3/5] Add test for arm64 writeback and post_index to assert correctness --- capstone-rs/src/test.rs | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/capstone-rs/src/test.rs b/capstone-rs/src/test.rs index 2b3a66c5..6f779a95 100644 --- a/capstone-rs/src/test.rs +++ b/capstone-rs/src/test.rs @@ -1186,6 +1186,46 @@ fn test_arch_arm_detail() { ); } +#[cfg(feature = "arch_arm64")] +#[test] +fn test_arch_arm64_writeback() { + let mut cs = Capstone::new() + .arm64() + .mode(arm64::ArchMode::Arm) + .build() + .unwrap(); + cs.set_detail(true).unwrap(); + + // ldr x0, [x19] + // ldr x8, [x16, #0x28]! + // ldp x24, x23, [sp], #0x40 + let insns = cs + .disasm_all(b"\x60\x02\x40\xf9\x08\x8e\x42\xf8\xf8\x5f\xc4\xa8", START_TEST_ADDR) + .expect("Failed to disassemble"); + let insns: Vec<_> = insns.iter().collect(); + + let insn = insns[0]; + let detail = cs.insn_detail(insn).expect("Could not get detail"); + let arch_detail = detail.arch_detail(); + let arm64_detail = arch_detail.arm64().expect("Failed to get arm64 detail"); + assert_eq!(false, arm64_detail.writeback()); + assert_eq!(false, arm64_detail.post_index()); + + let insn = insns[1]; + let detail = cs.insn_detail(insn).expect("Could not get detail"); + let arch_detail = detail.arch_detail(); + let arm64_detail = arch_detail.arm64().expect("Failed to get arm64 detail"); + assert_eq!(true, arm64_detail.writeback()); + assert_eq!(false, arm64_detail.post_index()); + + let insn = insns[2]; + let detail = cs.insn_detail(insn).expect("Could not get detail"); + let arch_detail = detail.arch_detail(); + let arm64_detail = arch_detail.arm64().expect("Failed to get arm64 detail"); + assert_eq!(true, arm64_detail.writeback()); + assert_eq!(true, arm64_detail.post_index()); +} + #[cfg(feature = "arch_arm64")] #[test] fn test_arch_arm64() { From 726ce9907c22060f147fa797bf7261857a5b50f2 Mon Sep 17 00:00:00 2001 From: PandasAreBears Date: Fri, 13 Mar 2026 17:01:27 +0000 Subject: [PATCH 4/5] Fix formatting --- capstone-rs/src/test.rs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/capstone-rs/src/test.rs b/capstone-rs/src/test.rs index 6f779a95..79e2ebab 100644 --- a/capstone-rs/src/test.rs +++ b/capstone-rs/src/test.rs @@ -1190,17 +1190,20 @@ fn test_arch_arm_detail() { #[test] fn test_arch_arm64_writeback() { let mut cs = Capstone::new() - .arm64() - .mode(arm64::ArchMode::Arm) - .build() - .unwrap(); + .arm64() + .mode(arm64::ArchMode::Arm) + .build() + .unwrap(); cs.set_detail(true).unwrap(); // ldr x0, [x19] // ldr x8, [x16, #0x28]! // ldp x24, x23, [sp], #0x40 let insns = cs - .disasm_all(b"\x60\x02\x40\xf9\x08\x8e\x42\xf8\xf8\x5f\xc4\xa8", START_TEST_ADDR) + .disasm_all( + b"\x60\x02\x40\xf9\x08\x8e\x42\xf8\xf8\x5f\xc4\xa8", + START_TEST_ADDR, + ) .expect("Failed to disassemble"); let insns: Vec<_> = insns.iter().collect(); From 106b19fd6ac65f2d53f8bacc7479d17191532c09 Mon Sep 17 00:00:00 2001 From: Jiajie Chen Date: Wed, 15 Apr 2026 02:30:14 +0800 Subject: [PATCH 5/5] Add test for arm writeback and post_index to assert correctness --- capstone-rs/src/test.rs | 43 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/capstone-rs/src/test.rs b/capstone-rs/src/test.rs index 79e2ebab..c8fc2601 100644 --- a/capstone-rs/src/test.rs +++ b/capstone-rs/src/test.rs @@ -1186,6 +1186,49 @@ fn test_arch_arm_detail() { ); } +#[cfg(feature = "arch_arm")] +#[test] +fn test_arch_arm_writeback() { + let mut cs = Capstone::new() + .arm() + .mode(arm::ArchMode::Arm) + .build() + .unwrap(); + cs.set_detail(true).unwrap(); + + // ldr r0, [r1] + // ldr r0, [r1], #4 + // ldr r0, [r1, #4]! + let insns = cs + .disasm_all( + b"\x00\x00\x91\xe5\x04\x00\x91\xe4\x04\x00\xb1\xe5", + START_TEST_ADDR, + ) + .expect("Failed to disassemble"); + let insns: Vec<_> = insns.iter().collect(); + + let insn = insns[0]; + let detail = cs.insn_detail(insn).expect("Could not get detail"); + let arch_detail = detail.arch_detail(); + let arm_detail = arch_detail.arm().expect("Failed to get arm detail"); + assert_eq!(false, arm_detail.writeback()); + assert_eq!(false, arm_detail.post_index()); + + let insn = insns[1]; + let detail = cs.insn_detail(insn).expect("Could not get detail"); + let arch_detail = detail.arch_detail(); + let arm_detail = arch_detail.arm().expect("Failed to get arm detail"); + assert_eq!(true, arm_detail.writeback()); + assert_eq!(true, arm_detail.post_index()); + + let insn = insns[2]; + let detail = cs.insn_detail(insn).expect("Could not get detail"); + let arch_detail = detail.arch_detail(); + let arm_detail = arch_detail.arm().expect("Failed to get arm detail"); + assert_eq!(true, arm_detail.writeback()); + assert_eq!(false, arm_detail.post_index()); +} + #[cfg(feature = "arch_arm64")] #[test] fn test_arch_arm64_writeback() {