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

Commit 2f40b4b

Browse files
authored
Feature - EbpfVm::invoke_function() (#543)
* Adds EbpfVm::invoke_function(). * Makes Result type in declare_builtin_function!() parametric too.
1 parent 47f57fa commit 2f40b4b

File tree

3 files changed

+22
-13
lines changed

3 files changed

+22
-13
lines changed

src/interpreter.rs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use crate::{
1616
ebpf::{self, STACK_PTR_REG},
1717
elf::Executable,
1818
error::{EbpfError, ProgramResult},
19-
vm::{get_runtime_environment_key, Config, ContextObject, EbpfVm},
19+
vm::{Config, ContextObject, EbpfVm},
2020
};
2121

2222
/// Virtual memory operation helper.
@@ -475,14 +475,8 @@ impl<'a, 'b, C: ContextObject> Interpreter<'a, 'b, C> {
475475
resolved = true;
476476

477477
self.vm.due_insn_count = self.vm.previous_instruction_meter - self.vm.due_insn_count;
478-
function(
479-
unsafe { (self.vm as *mut _ as *mut u64).offset(get_runtime_environment_key() as isize) as *mut _ },
480-
self.reg[1],
481-
self.reg[2],
482-
self.reg[3],
483-
self.reg[4],
484-
self.reg[5],
485-
);
478+
self.vm.registers[0..6].copy_from_slice(&self.reg[0..6]);
479+
self.vm.invoke_function(function);
486480
self.vm.due_insn_count = 0;
487481
self.reg[0] = match &self.vm.program_result {
488482
ProgramResult::Ok(value) => *value,

src/program.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ macro_rules! declare_builtin_function {
296296
$arg_d:ident : u64,
297297
$arg_e:ident : u64,
298298
$memory_mapping:ident : &mut $MemoryMapping:ty,
299-
) -> Result<u64, $Error:ty> $rust:tt) => {
299+
) -> $Result:ty { $($rust:tt)* }) => {
300300
$(#[$attr])*
301301
pub struct $name {}
302302
impl $name {
@@ -309,8 +309,8 @@ macro_rules! declare_builtin_function {
309309
$arg_d: u64,
310310
$arg_e: u64,
311311
$memory_mapping: &mut $MemoryMapping,
312-
) -> Result<u64, $Error> {
313-
$rust
312+
) -> $Result {
313+
$($rust)*
314314
}
315315
/// VM interface
316316
#[allow(clippy::too_many_arguments)]

src/vm.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use crate::{
1818
error::{EbpfError, ProgramResult},
1919
interpreter::Interpreter,
2020
memory_region::MemoryMapping,
21-
program::{BuiltinProgram, FunctionRegistry, SBPFVersion},
21+
program::{BuiltinFunction, BuiltinProgram, FunctionRegistry, SBPFVersion},
2222
static_analysis::{Analysis, TraceLogEntry},
2323
};
2424
use rand::Rng;
@@ -421,4 +421,19 @@ impl<'a, C: ContextObject> EbpfVm<'a, C> {
421421
std::mem::swap(&mut result, &mut self.program_result);
422422
(instruction_count, result)
423423
}
424+
425+
/// Invokes a built-in function
426+
pub fn invoke_function(&mut self, function: BuiltinFunction<C>) {
427+
function(
428+
unsafe {
429+
(self as *mut _ as *mut u64).offset(get_runtime_environment_key() as isize)
430+
as *mut _
431+
},
432+
self.registers[1],
433+
self.registers[2],
434+
self.registers[3],
435+
self.registers[4],
436+
self.registers[5],
437+
);
438+
}
424439
}

0 commit comments

Comments
 (0)