|
@@ -8,75 +8,75 @@ use ebpf;
|
|
|
|
|
|
#[inline]
|
|
#[inline]
|
|
fn alu_imm_str(name: &str, insn: &ebpf::Insn) -> String {
|
|
fn alu_imm_str(name: &str, insn: &ebpf::Insn) -> String {
|
|
- format!("{} r{}, {:#x}", name, insn.dst, insn.imm)
|
|
|
|
|
|
+ format!("{name} r{}, {:#x}", insn.dst, insn.imm)
|
|
}
|
|
}
|
|
|
|
|
|
#[inline]
|
|
#[inline]
|
|
fn alu_reg_str(name: &str, insn: &ebpf::Insn) -> String {
|
|
fn alu_reg_str(name: &str, insn: &ebpf::Insn) -> String {
|
|
- format!("{} r{}, r{}", name, insn.dst, insn.src)
|
|
|
|
|
|
+ format!("{name} r{}, r{}", insn.dst, insn.src)
|
|
}
|
|
}
|
|
|
|
|
|
#[inline]
|
|
#[inline]
|
|
fn byteswap_str(name: &str, insn: &ebpf::Insn) -> String {
|
|
fn byteswap_str(name: &str, insn: &ebpf::Insn) -> String {
|
|
match insn.imm {
|
|
match insn.imm {
|
|
16 | 32 | 64 => {},
|
|
16 | 32 | 64 => {},
|
|
- _ => println!("[Disassembler] Warning: Invalid offset value for {} insn", name)
|
|
|
|
|
|
+ _ => println!("[Disassembler] Warning: Invalid offset value for {name} insn")
|
|
}
|
|
}
|
|
- format!("{}{} r{}", name, insn.imm, insn.dst)
|
|
|
|
|
|
+ format!("{name}{} r{}", insn.imm, insn.dst)
|
|
}
|
|
}
|
|
|
|
|
|
#[inline]
|
|
#[inline]
|
|
fn ld_st_imm_str(name: &str, insn: &ebpf::Insn) -> String {
|
|
fn ld_st_imm_str(name: &str, insn: &ebpf::Insn) -> String {
|
|
if insn.off >= 0 {
|
|
if insn.off >= 0 {
|
|
- format!("{} [r{}+{:#x}], {:#x}", name, insn.dst, insn.off, insn.imm)
|
|
|
|
|
|
+ format!("{name} [r{}+{:#x}], {:#x}", insn.dst, insn.off, insn.imm)
|
|
} else {
|
|
} else {
|
|
- format!("{} [r{}-{:#x}], {:#x}", name, insn.dst, -insn.off, insn.imm)
|
|
|
|
|
|
+ format!("{name} [r{}-{:#x}], {:#x}", insn.dst, -insn.off, insn.imm)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
#[inline]
|
|
#[inline]
|
|
fn ld_reg_str(name: &str, insn: &ebpf::Insn) -> String {
|
|
fn ld_reg_str(name: &str, insn: &ebpf::Insn) -> String {
|
|
if insn.off >= 0 {
|
|
if insn.off >= 0 {
|
|
- format!("{} r{}, [r{}+{:#x}]", name, insn.dst, insn.src, insn.off)
|
|
|
|
|
|
+ format!("{name} r{}, [r{}+{:#x}]", insn.dst, insn.src, insn.off)
|
|
} else {
|
|
} else {
|
|
- format!("{} r{}, [r{}-{:#x}]", name, insn.dst, insn.src, -insn.off)
|
|
|
|
|
|
+ format!("{name} r{}, [r{}-{:#x}]", insn.dst, insn.src, -insn.off)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
#[inline]
|
|
#[inline]
|
|
fn st_reg_str(name: &str, insn: &ebpf::Insn) -> String {
|
|
fn st_reg_str(name: &str, insn: &ebpf::Insn) -> String {
|
|
if insn.off >= 0 {
|
|
if insn.off >= 0 {
|
|
- format!("{} [r{}+{:#x}], r{}", name, insn.dst, insn.off, insn.src)
|
|
|
|
|
|
+ format!("{name} [r{}+{:#x}], r{}", insn.dst, insn.off, insn.src)
|
|
} else {
|
|
} else {
|
|
- format!("{} [r{}-{:#x}], r{}", name, insn.dst, -insn.off, insn.src)
|
|
|
|
|
|
+ format!("{name} [r{}-{:#x}], r{}", insn.dst, -insn.off, insn.src)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
#[inline]
|
|
#[inline]
|
|
fn ldabs_str(name: &str, insn: &ebpf::Insn) -> String {
|
|
fn ldabs_str(name: &str, insn: &ebpf::Insn) -> String {
|
|
- format!("{} {:#x}", name, insn.imm)
|
|
|
|
|
|
+ format!("{name} {:#x}", insn.imm)
|
|
}
|
|
}
|
|
|
|
|
|
#[inline]
|
|
#[inline]
|
|
fn ldind_str(name: &str, insn: &ebpf::Insn) -> String {
|
|
fn ldind_str(name: &str, insn: &ebpf::Insn) -> String {
|
|
- format!("{} r{}, {:#x}", name, insn.src, insn.imm)
|
|
|
|
|
|
+ format!("{name} r{}, {:#x}", insn.src, insn.imm)
|
|
}
|
|
}
|
|
|
|
|
|
#[inline]
|
|
#[inline]
|
|
fn jmp_imm_str(name: &str, insn: &ebpf::Insn) -> String {
|
|
fn jmp_imm_str(name: &str, insn: &ebpf::Insn) -> String {
|
|
if insn.off >= 0 {
|
|
if insn.off >= 0 {
|
|
- format!("{} r{}, {:#x}, +{:#x}", name, insn.dst, insn.imm, insn.off)
|
|
|
|
|
|
+ format!("{name} r{}, {:#x}, +{:#x}", insn.dst, insn.imm, insn.off)
|
|
} else {
|
|
} else {
|
|
- format!("{} r{}, {:#x}, -{:#x}", name, insn.dst, insn.imm, -insn.off)
|
|
|
|
|
|
+ format!("{name} r{}, {:#x}, -{:#x}", insn.dst, insn.imm, -insn.off)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
#[inline]
|
|
#[inline]
|
|
fn jmp_reg_str(name: &str, insn: &ebpf::Insn) -> String {
|
|
fn jmp_reg_str(name: &str, insn: &ebpf::Insn) -> String {
|
|
if insn.off >= 0 {
|
|
if insn.off >= 0 {
|
|
- format!("{} r{}, r{}, +{:#x}", name, insn.dst, insn.src, insn.off)
|
|
|
|
|
|
+ format!("{name} r{}, r{}, +{:#x}", insn.dst, insn.src, insn.off)
|
|
} else {
|
|
} else {
|
|
- format!("{} r{}, r{}, -{:#x}", name, insn.dst, insn.src, -insn.off)
|
|
|
|
|
|
+ format!("{name} r{}, r{}, -{:#x}", insn.dst, insn.src, -insn.off)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -199,7 +199,7 @@ pub fn to_insn_vec(prog: &[u8]) -> Vec<HLInsn> {
|
|
insn_ptr += 1;
|
|
insn_ptr += 1;
|
|
let next_insn = ebpf::get_insn(prog, insn_ptr);
|
|
let next_insn = ebpf::get_insn(prog, insn_ptr);
|
|
imm = ((insn.imm as u32) as u64 + ((next_insn.imm as u64) << 32)) as i64;
|
|
imm = ((insn.imm as u32) as u64 + ((next_insn.imm as u64) << 32)) as i64;
|
|
- name = "lddw"; desc = format!("{} r{:}, {:#x}", name, insn.dst, imm);
|
|
|
|
|
|
+ name = "lddw"; desc = format!("{name} r{:}, {imm:#x}", insn.dst);
|
|
},
|
|
},
|
|
|
|
|
|
// BPF_LDX class
|
|
// BPF_LDX class
|
|
@@ -239,7 +239,7 @@ pub fn to_insn_vec(prog: &[u8]) -> Vec<HLInsn> {
|
|
ebpf::LSH32_REG => { name = "lsh32"; desc = alu_reg_str(name, &insn); },
|
|
ebpf::LSH32_REG => { name = "lsh32"; desc = alu_reg_str(name, &insn); },
|
|
ebpf::RSH32_IMM => { name = "rsh32"; desc = alu_imm_str(name, &insn); },
|
|
ebpf::RSH32_IMM => { name = "rsh32"; desc = alu_imm_str(name, &insn); },
|
|
ebpf::RSH32_REG => { name = "rsh32"; desc = alu_reg_str(name, &insn); },
|
|
ebpf::RSH32_REG => { name = "rsh32"; desc = alu_reg_str(name, &insn); },
|
|
- ebpf::NEG32 => { name = "neg32"; desc = format!("{} r{:}", name, insn.dst); },
|
|
|
|
|
|
+ ebpf::NEG32 => { name = "neg32"; desc = format!("{name} r{:}", insn.dst); },
|
|
ebpf::MOD32_IMM => { name = "mod32"; desc = alu_imm_str(name, &insn); },
|
|
ebpf::MOD32_IMM => { name = "mod32"; desc = alu_imm_str(name, &insn); },
|
|
ebpf::MOD32_REG => { name = "mod32"; desc = alu_reg_str(name, &insn); },
|
|
ebpf::MOD32_REG => { name = "mod32"; desc = alu_reg_str(name, &insn); },
|
|
ebpf::XOR32_IMM => { name = "xor32"; desc = alu_imm_str(name, &insn); },
|
|
ebpf::XOR32_IMM => { name = "xor32"; desc = alu_imm_str(name, &insn); },
|
|
@@ -268,7 +268,7 @@ pub fn to_insn_vec(prog: &[u8]) -> Vec<HLInsn> {
|
|
ebpf::LSH64_REG => { name = "lsh64"; desc = alu_reg_str(name, &insn); },
|
|
ebpf::LSH64_REG => { name = "lsh64"; desc = alu_reg_str(name, &insn); },
|
|
ebpf::RSH64_IMM => { name = "rsh64"; desc = alu_imm_str(name, &insn); },
|
|
ebpf::RSH64_IMM => { name = "rsh64"; desc = alu_imm_str(name, &insn); },
|
|
ebpf::RSH64_REG => { name = "rsh64"; desc = alu_reg_str(name, &insn); },
|
|
ebpf::RSH64_REG => { name = "rsh64"; desc = alu_reg_str(name, &insn); },
|
|
- ebpf::NEG64 => { name = "neg64"; desc = format!("{} r{:}", name, insn.dst); },
|
|
|
|
|
|
+ ebpf::NEG64 => { name = "neg64"; desc = format!("{name} r{:}", insn.dst); },
|
|
ebpf::MOD64_IMM => { name = "mod64"; desc = alu_imm_str(name, &insn); },
|
|
ebpf::MOD64_IMM => { name = "mod64"; desc = alu_imm_str(name, &insn); },
|
|
ebpf::MOD64_REG => { name = "mod64"; desc = alu_reg_str(name, &insn); },
|
|
ebpf::MOD64_REG => { name = "mod64"; desc = alu_reg_str(name, &insn); },
|
|
ebpf::XOR64_IMM => { name = "xor64"; desc = alu_imm_str(name, &insn); },
|
|
ebpf::XOR64_IMM => { name = "xor64"; desc = alu_imm_str(name, &insn); },
|
|
@@ -279,7 +279,7 @@ pub fn to_insn_vec(prog: &[u8]) -> Vec<HLInsn> {
|
|
ebpf::ARSH64_REG => { name = "arsh64"; desc = alu_reg_str(name, &insn); },
|
|
ebpf::ARSH64_REG => { name = "arsh64"; desc = alu_reg_str(name, &insn); },
|
|
|
|
|
|
// BPF_JMP class
|
|
// BPF_JMP class
|
|
- ebpf::JA => { name = "ja"; desc = if insn.off >= 0 { format!("{} +{:#x}", name, insn.off) } else { format!("{} -{:#x}", name, -insn.off) } },
|
|
|
|
|
|
+ ebpf::JA => { name = "ja"; desc = if insn.off >= 0 { format!("{name} +{:#x}", insn.off) } else { format!("{name} -{:#x}", -insn.off) } },
|
|
ebpf::JEQ_IMM => { name = "jeq"; desc = jmp_imm_str(name, &insn); },
|
|
ebpf::JEQ_IMM => { name = "jeq"; desc = jmp_imm_str(name, &insn); },
|
|
ebpf::JEQ_REG => { name = "jeq"; desc = jmp_reg_str(name, &insn); },
|
|
ebpf::JEQ_REG => { name = "jeq"; desc = jmp_reg_str(name, &insn); },
|
|
ebpf::JGT_IMM => { name = "jgt"; desc = jmp_imm_str(name, &insn); },
|
|
ebpf::JGT_IMM => { name = "jgt"; desc = jmp_imm_str(name, &insn); },
|
|
@@ -302,7 +302,7 @@ pub fn to_insn_vec(prog: &[u8]) -> Vec<HLInsn> {
|
|
ebpf::JSLT_REG => { name = "jslt"; desc = jmp_reg_str(name, &insn); },
|
|
ebpf::JSLT_REG => { name = "jslt"; desc = jmp_reg_str(name, &insn); },
|
|
ebpf::JSLE_IMM => { name = "jsle"; desc = jmp_imm_str(name, &insn); },
|
|
ebpf::JSLE_IMM => { name = "jsle"; desc = jmp_imm_str(name, &insn); },
|
|
ebpf::JSLE_REG => { name = "jsle"; desc = jmp_reg_str(name, &insn); },
|
|
ebpf::JSLE_REG => { name = "jsle"; desc = jmp_reg_str(name, &insn); },
|
|
- ebpf::CALL => { name = "call"; desc = format!("{} {:#x}", name, insn.imm); },
|
|
|
|
|
|
+ ebpf::CALL => { name = "call"; desc = format!("{name} {:#x}", insn.imm); },
|
|
ebpf::TAIL_CALL => { name = "tail_call"; desc = name.to_string(); },
|
|
ebpf::TAIL_CALL => { name = "tail_call"; desc = name.to_string(); },
|
|
ebpf::EXIT => { name = "exit"; desc = name.to_string(); },
|
|
ebpf::EXIT => { name = "exit"; desc = name.to_string(); },
|
|
|
|
|