Explorar el Código

fix how the disassembler handles offsets

see 038ddf78 for reasoning
ttlajus hace 3 años
padre
commit
4ed652ec41
Se han modificado 1 ficheros con 25 adiciones y 5 borrados
  1. 25 5
      src/disassembler.rs

+ 25 - 5
src/disassembler.rs

@@ -31,17 +31,29 @@ fn byteswap_str(name: &str, insn: &ebpf::Insn) -> String {
 
 #[inline]
 fn ld_st_imm_str(name: &str, insn: &ebpf::Insn) -> String {
-    format!("{} [r{}+{:#x}], {:#x}", name, insn.dst, insn.off, insn.imm)
+    if insn.off >= 0 {
+        format!("{} [r{}+{:#x}], {:#x}", name, insn.dst, insn.off, insn.imm)
+    } else {
+        format!("{} [r{}-{:#x}], {:#x}", name, insn.dst, -insn.off, insn.imm)
+    }
 }
 
 #[inline]
 fn ld_reg_str(name: &str, insn: &ebpf::Insn) -> String {
-    format!("{} r{}, [r{}+{:#x}]", name, insn.dst, insn.src, insn.off)
+    if insn.off >= 0 {
+        format!("{} r{}, [r{}+{:#x}]", name, insn.dst, insn.src, insn.off)
+    } else {
+        format!("{} r{}, [r{}-{:#x}]", name, insn.dst, insn.src, -insn.off)
+    }
 }
 
 #[inline]
 fn st_reg_str(name: &str, insn: &ebpf::Insn) -> String {
-    format!("{} [r{}+{:#x}], r{}", name, insn.dst, insn.off, insn.src)
+    if insn.off >= 0 {
+        format!("{} [r{}+{:#x}], r{}", name, insn.dst, insn.off, insn.src)
+    } else {
+        format!("{} [r{}-{:#x}], r{}", name, insn.dst, -insn.off, insn.src)
+    }
 }
 
 #[inline]
@@ -56,12 +68,20 @@ fn ldind_str(name: &str, insn: &ebpf::Insn) -> String {
 
 #[inline]
 fn jmp_imm_str(name: &str, insn: &ebpf::Insn) -> String {
-    format!("{} r{}, {:#x}, {:+#x}", name, insn.dst, insn.imm, insn.off)
+    if insn.off >= 0 {
+        format!("{} r{}, {:#x}, +{:#x}", name, insn.dst, insn.imm, insn.off)
+    } else {
+        format!("{} r{}, {:#x}, -{:#x}", name, insn.dst, insn.imm, -insn.off)
+    }
 }
 
 #[inline]
 fn jmp_reg_str(name: &str, insn: &ebpf::Insn) -> String {
-    format!("{} r{}, r{}, {:+#x}", name, insn.dst, insn.src, insn.off)
+    if insn.off >= 0 {
+        format!("{} r{}, r{}, +{:#x}", name, insn.dst, insn.src, insn.off)
+    } else {
+        format!("{} r{}, r{}, -{:#x}", name, insn.dst, insn.src, -insn.off)
+    }
 }
 
 /// High-level representation of an eBPF instruction.