Skip to content
This repository has been archived by the owner on Jan 10, 2025. It is now read-only.

Commit

Permalink
Disables the old opcodes conditionally.
Browse files Browse the repository at this point in the history
  • Loading branch information
Lichtso committed Oct 3, 2024
1 parent 551b20b commit 92d1d5a
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 48 deletions.
24 changes: 12 additions & 12 deletions src/disassembler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -124,22 +124,22 @@ pub fn disassemble_instruction<C: ContextObject>(
ebpf::LD_DW_IMM => { name = "lddw"; desc = format!("{} r{:}, {:#x}", name, insn.dst, insn.imm); },

// BPF_LDX class
ebpf::LD_B_REG => { name = "ldxb"; desc = ld_reg_str(name, insn); },
ebpf::LD_H_REG => { name = "ldxh"; desc = ld_reg_str(name, insn); },
ebpf::LD_W_REG => { name = "ldxw"; desc = ld_reg_str(name, insn); },
ebpf::LD_DW_REG => { name = "ldxdw"; desc = ld_reg_str(name, insn); },
ebpf::LD_B_REG if !sbpf_version.move_memory_instruction_classes() => { name = "ldxb"; desc = ld_reg_str(name, insn); },
ebpf::LD_H_REG if !sbpf_version.move_memory_instruction_classes() => { name = "ldxh"; desc = ld_reg_str(name, insn); },
ebpf::LD_W_REG if !sbpf_version.move_memory_instruction_classes() => { name = "ldxw"; desc = ld_reg_str(name, insn); },
ebpf::LD_DW_REG if !sbpf_version.move_memory_instruction_classes() => { name = "ldxdw"; desc = ld_reg_str(name, insn); },

// BPF_ST class
ebpf::ST_B_IMM => { name = "stb"; desc = ld_st_imm_str(name, insn); },
ebpf::ST_H_IMM => { name = "sth"; desc = ld_st_imm_str(name, insn); },
ebpf::ST_W_IMM => { name = "stw"; desc = ld_st_imm_str(name, insn); },
ebpf::ST_DW_IMM => { name = "stdw"; desc = ld_st_imm_str(name, insn); },
ebpf::ST_B_IMM if !sbpf_version.move_memory_instruction_classes() => { name = "stb"; desc = ld_st_imm_str(name, insn); },
ebpf::ST_H_IMM if !sbpf_version.move_memory_instruction_classes() => { name = "sth"; desc = ld_st_imm_str(name, insn); },
ebpf::ST_W_IMM if !sbpf_version.move_memory_instruction_classes() => { name = "stw"; desc = ld_st_imm_str(name, insn); },
ebpf::ST_DW_IMM if !sbpf_version.move_memory_instruction_classes() => { name = "stdw"; desc = ld_st_imm_str(name, insn); },

// BPF_STX class
ebpf::ST_B_REG => { name = "stxb"; desc = st_reg_str(name, insn); },
ebpf::ST_H_REG => { name = "stxh"; desc = st_reg_str(name, insn); },
ebpf::ST_W_REG => { name = "stxw"; desc = st_reg_str(name, insn); },
ebpf::ST_DW_REG => { name = "stxdw"; desc = st_reg_str(name, insn); },
ebpf::ST_B_REG if !sbpf_version.move_memory_instruction_classes() => { name = "stxb"; desc = st_reg_str(name, insn); },
ebpf::ST_H_REG if !sbpf_version.move_memory_instruction_classes() => { name = "stxh"; desc = st_reg_str(name, insn); },
ebpf::ST_W_REG if !sbpf_version.move_memory_instruction_classes() => { name = "stxw"; desc = st_reg_str(name, insn); },
ebpf::ST_DW_REG if !sbpf_version.move_memory_instruction_classes() => { name = "stxdw"; desc = st_reg_str(name, insn); },

// BPF_ALU class
ebpf::ADD32_IMM => { name = "add32"; desc = alu_imm_str(name, insn); },
Expand Down
24 changes: 12 additions & 12 deletions src/interpreter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -194,55 +194,55 @@ impl<'a, 'b, C: ContextObject> Interpreter<'a, 'b, C> {
},

// BPF_LDX class
ebpf::LD_B_REG => {
ebpf::LD_B_REG if !self.executable.get_sbpf_version().move_memory_instruction_classes() => {
let vm_addr = (self.reg[src] as i64).wrapping_add(insn.off as i64) as u64;
self.reg[dst] = translate_memory_access!(self, load, vm_addr, u8);
},
ebpf::LD_H_REG => {
ebpf::LD_H_REG if !self.executable.get_sbpf_version().move_memory_instruction_classes() => {
let vm_addr = (self.reg[src] as i64).wrapping_add(insn.off as i64) as u64;
self.reg[dst] = translate_memory_access!(self, load, vm_addr, u16);
},
ebpf::LD_W_REG => {
ebpf::LD_W_REG if !self.executable.get_sbpf_version().move_memory_instruction_classes() => {
let vm_addr = (self.reg[src] as i64).wrapping_add(insn.off as i64) as u64;
self.reg[dst] = translate_memory_access!(self, load, vm_addr, u32);
},
ebpf::LD_DW_REG => {
ebpf::LD_DW_REG if !self.executable.get_sbpf_version().move_memory_instruction_classes() => {
let vm_addr = (self.reg[src] as i64).wrapping_add(insn.off as i64) as u64;
self.reg[dst] = translate_memory_access!(self, load, vm_addr, u64);
},

// BPF_ST class
ebpf::ST_B_IMM => {
ebpf::ST_B_IMM if !self.executable.get_sbpf_version().move_memory_instruction_classes() => {
let vm_addr = (self.reg[dst] as i64).wrapping_add( insn.off as i64) as u64;
translate_memory_access!(self, store, insn.imm, vm_addr, u8);
},
ebpf::ST_H_IMM => {
ebpf::ST_H_IMM if !self.executable.get_sbpf_version().move_memory_instruction_classes() => {
let vm_addr = (self.reg[dst] as i64).wrapping_add(insn.off as i64) as u64;
translate_memory_access!(self, store, insn.imm, vm_addr, u16);
},
ebpf::ST_W_IMM => {
ebpf::ST_W_IMM if !self.executable.get_sbpf_version().move_memory_instruction_classes() => {
let vm_addr = (self.reg[dst] as i64).wrapping_add(insn.off as i64) as u64;
translate_memory_access!(self, store, insn.imm, vm_addr, u32);
},
ebpf::ST_DW_IMM => {
ebpf::ST_DW_IMM if !self.executable.get_sbpf_version().move_memory_instruction_classes() => {
let vm_addr = (self.reg[dst] as i64).wrapping_add(insn.off as i64) as u64;
translate_memory_access!(self, store, insn.imm, vm_addr, u64);
},

// BPF_STX class
ebpf::ST_B_REG => {
ebpf::ST_B_REG if !self.executable.get_sbpf_version().move_memory_instruction_classes() => {
let vm_addr = (self.reg[dst] as i64).wrapping_add(insn.off as i64) as u64;
translate_memory_access!(self, store, self.reg[src], vm_addr, u8);
},
ebpf::ST_H_REG => {
ebpf::ST_H_REG if !self.executable.get_sbpf_version().move_memory_instruction_classes() => {
let vm_addr = (self.reg[dst] as i64).wrapping_add(insn.off as i64) as u64;
translate_memory_access!(self, store, self.reg[src], vm_addr, u16);
},
ebpf::ST_W_REG => {
ebpf::ST_W_REG if !self.executable.get_sbpf_version().move_memory_instruction_classes() => {
let vm_addr = (self.reg[dst] as i64).wrapping_add(insn.off as i64) as u64;
translate_memory_access!(self, store, self.reg[src], vm_addr, u32);
},
ebpf::ST_DW_REG => {
ebpf::ST_DW_REG if !self.executable.get_sbpf_version().move_memory_instruction_classes() => {
let vm_addr = (self.reg[dst] as i64).wrapping_add(insn.off as i64) as u64;
translate_memory_access!(self, store, self.reg[src], vm_addr, u64);
},
Expand Down
24 changes: 12 additions & 12 deletions src/jit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -439,44 +439,44 @@ impl<'a, C: ContextObject> JitCompiler<'a, C> {
},

// BPF_LDX class
ebpf::LD_B_REG => {
ebpf::LD_B_REG if !self.executable.get_sbpf_version().move_memory_instruction_classes() => {
self.emit_address_translation(Some(dst), Value::RegisterPlusConstant64(src, insn.off as i64, true), 1, None);
},
ebpf::LD_H_REG => {
ebpf::LD_H_REG if !self.executable.get_sbpf_version().move_memory_instruction_classes() => {
self.emit_address_translation(Some(dst), Value::RegisterPlusConstant64(src, insn.off as i64, true), 2, None);
},
ebpf::LD_W_REG => {
ebpf::LD_W_REG if !self.executable.get_sbpf_version().move_memory_instruction_classes() => {
self.emit_address_translation(Some(dst), Value::RegisterPlusConstant64(src, insn.off as i64, true), 4, None);
},
ebpf::LD_DW_REG => {
ebpf::LD_DW_REG if !self.executable.get_sbpf_version().move_memory_instruction_classes() => {
self.emit_address_translation(Some(dst), Value::RegisterPlusConstant64(src, insn.off as i64, true), 8, None);
},

// BPF_ST class
ebpf::ST_B_IMM => {
ebpf::ST_B_IMM if !self.executable.get_sbpf_version().move_memory_instruction_classes() => {
self.emit_address_translation(None, Value::RegisterPlusConstant64(dst, insn.off as i64, true), 1, Some(Value::Constant64(insn.imm, true)));
},
ebpf::ST_H_IMM => {
ebpf::ST_H_IMM if !self.executable.get_sbpf_version().move_memory_instruction_classes() => {
self.emit_address_translation(None, Value::RegisterPlusConstant64(dst, insn.off as i64, true), 2, Some(Value::Constant64(insn.imm, true)));
},
ebpf::ST_W_IMM => {
ebpf::ST_W_IMM if !self.executable.get_sbpf_version().move_memory_instruction_classes() => {
self.emit_address_translation(None, Value::RegisterPlusConstant64(dst, insn.off as i64, true), 4, Some(Value::Constant64(insn.imm, true)));
},
ebpf::ST_DW_IMM => {
ebpf::ST_DW_IMM if !self.executable.get_sbpf_version().move_memory_instruction_classes() => {
self.emit_address_translation(None, Value::RegisterPlusConstant64(dst, insn.off as i64, true), 8, Some(Value::Constant64(insn.imm, true)));
},

// BPF_STX class
ebpf::ST_B_REG => {
ebpf::ST_B_REG if !self.executable.get_sbpf_version().move_memory_instruction_classes() => {
self.emit_address_translation(None, Value::RegisterPlusConstant64(dst, insn.off as i64, true), 1, Some(Value::Register(src)));
},
ebpf::ST_H_REG => {
ebpf::ST_H_REG if !self.executable.get_sbpf_version().move_memory_instruction_classes() => {
self.emit_address_translation(None, Value::RegisterPlusConstant64(dst, insn.off as i64, true), 2, Some(Value::Register(src)));
},
ebpf::ST_W_REG => {
ebpf::ST_W_REG if !self.executable.get_sbpf_version().move_memory_instruction_classes() => {
self.emit_address_translation(None, Value::RegisterPlusConstant64(dst, insn.off as i64, true), 4, Some(Value::Register(src)));
},
ebpf::ST_DW_REG => {
ebpf::ST_DW_REG if !self.executable.get_sbpf_version().move_memory_instruction_classes() => {
self.emit_address_translation(None, Value::RegisterPlusConstant64(dst, insn.off as i64, true), 8, Some(Value::Register(src)));
},

Expand Down
24 changes: 12 additions & 12 deletions src/verifier.rs
Original file line number Diff line number Diff line change
Expand Up @@ -250,22 +250,22 @@ impl Verifier for RequisiteVerifier {
},

// BPF_LDX class
ebpf::LD_B_REG => {},
ebpf::LD_H_REG => {},
ebpf::LD_W_REG => {},
ebpf::LD_DW_REG => {},
ebpf::LD_B_REG if !sbpf_version.move_memory_instruction_classes() => {},
ebpf::LD_H_REG if !sbpf_version.move_memory_instruction_classes() => {},
ebpf::LD_W_REG if !sbpf_version.move_memory_instruction_classes() => {},
ebpf::LD_DW_REG if !sbpf_version.move_memory_instruction_classes() => {},

// BPF_ST class
ebpf::ST_B_IMM => store = true,
ebpf::ST_H_IMM => store = true,
ebpf::ST_W_IMM => store = true,
ebpf::ST_DW_IMM => store = true,
ebpf::ST_B_IMM if !sbpf_version.move_memory_instruction_classes() => store = true,
ebpf::ST_H_IMM if !sbpf_version.move_memory_instruction_classes() => store = true,
ebpf::ST_W_IMM if !sbpf_version.move_memory_instruction_classes() => store = true,
ebpf::ST_DW_IMM if !sbpf_version.move_memory_instruction_classes() => store = true,

// BPF_STX class
ebpf::ST_B_REG => store = true,
ebpf::ST_H_REG => store = true,
ebpf::ST_W_REG => store = true,
ebpf::ST_DW_REG => store = true,
ebpf::ST_B_REG if !sbpf_version.move_memory_instruction_classes() => store = true,
ebpf::ST_H_REG if !sbpf_version.move_memory_instruction_classes() => store = true,
ebpf::ST_W_REG if !sbpf_version.move_memory_instruction_classes() => store = true,
ebpf::ST_DW_REG if !sbpf_version.move_memory_instruction_classes() => store = true,

// BPF_ALU class
ebpf::ADD32_IMM => {},
Expand Down

0 comments on commit 92d1d5a

Please sign in to comment.