|
@@ -35,6 +35,7 @@ extern crate cranelift_native;
|
|
|
|
|
|
use crate::lib::*;
|
|
use crate::lib::*;
|
|
use byteorder::{ByteOrder, LittleEndian};
|
|
use byteorder::{ByteOrder, LittleEndian};
|
|
|
|
+use core::ops::Range;
|
|
use stack::{StackUsage, StackVerifier};
|
|
use stack::{StackUsage, StackVerifier};
|
|
|
|
|
|
mod asm_parser;
|
|
mod asm_parser;
|
|
@@ -70,6 +71,7 @@ pub mod lib {
|
|
pub use self::core::mem;
|
|
pub use self::core::mem;
|
|
pub use self::core::mem::ManuallyDrop;
|
|
pub use self::core::mem::ManuallyDrop;
|
|
pub use self::core::ptr;
|
|
pub use self::core::ptr;
|
|
|
|
+ pub use hashbrown::{HashMap,HashSet};
|
|
|
|
|
|
#[cfg(feature = "std")]
|
|
#[cfg(feature = "std")]
|
|
pub use std::println;
|
|
pub use std::println;
|
|
@@ -97,9 +99,9 @@ pub mod lib {
|
|
// BTree-based implementations of Maps and Sets. The cranelift module uses
|
|
// BTree-based implementations of Maps and Sets. The cranelift module uses
|
|
// BTrees by default, hence we need to expose it twice here.
|
|
// BTrees by default, hence we need to expose it twice here.
|
|
#[cfg(not(feature = "std"))]
|
|
#[cfg(not(feature = "std"))]
|
|
- pub use alloc::collections::{BTreeMap as HashMap, BTreeMap, BTreeSet as HashSet, BTreeSet};
|
|
|
|
|
|
+ pub use alloc::collections::{BTreeMap};
|
|
#[cfg(feature = "std")]
|
|
#[cfg(feature = "std")]
|
|
- pub use std::collections::{BTreeMap, HashMap, HashSet};
|
|
|
|
|
|
+ pub use std::collections::{BTreeMap};
|
|
|
|
|
|
/// In no_std we use a custom implementation of the error which acts as a
|
|
/// In no_std we use a custom implementation of the error which acts as a
|
|
/// replacement for the io Error.
|
|
/// replacement for the io Error.
|
|
@@ -180,7 +182,7 @@ pub struct EbpfVmMbuff<'a> {
|
|
#[cfg(feature = "cranelift")]
|
|
#[cfg(feature = "cranelift")]
|
|
cranelift_prog: Option<cranelift::CraneliftProgram>,
|
|
cranelift_prog: Option<cranelift::CraneliftProgram>,
|
|
helpers: HashMap<u32, ebpf::Helper>,
|
|
helpers: HashMap<u32, ebpf::Helper>,
|
|
- allowed_memory: HashSet<u64>,
|
|
|
|
|
|
+ allowed_memory: HashSet<Range<u64>>,
|
|
stack_usage: Option<StackUsage>,
|
|
stack_usage: Option<StackUsage>,
|
|
stack_verifier: StackVerifier,
|
|
stack_verifier: StackVerifier,
|
|
}
|
|
}
|
|
@@ -386,7 +388,6 @@ impl<'a> EbpfVmMbuff<'a> {
|
|
/// # Examples
|
|
/// # Examples
|
|
///
|
|
///
|
|
/// ```
|
|
/// ```
|
|
- /// use std::iter::FromIterator;
|
|
|
|
/// use std::ptr::addr_of;
|
|
/// use std::ptr::addr_of;
|
|
///
|
|
///
|
|
/// struct MapValue {
|
|
/// struct MapValue {
|
|
@@ -402,13 +403,10 @@ impl<'a> EbpfVmMbuff<'a> {
|
|
/// // Instantiate a VM.
|
|
/// // Instantiate a VM.
|
|
/// let mut vm = rbpf::EbpfVmMbuff::new(Some(prog)).unwrap();
|
|
/// let mut vm = rbpf::EbpfVmMbuff::new(Some(prog)).unwrap();
|
|
/// let start = addr_of!(VALUE) as u64;
|
|
/// let start = addr_of!(VALUE) as u64;
|
|
- /// let addrs = Vec::from_iter(start..start+size_of::<MapValue>() as u64);
|
|
|
|
- /// vm.register_allowed_memory(&addrs);
|
|
|
|
|
|
+ /// vm.register_allowed_memory(start..start+size_of::<MapValue>() as u64);
|
|
/// ```
|
|
/// ```
|
|
- pub fn register_allowed_memory(&mut self, addrs: &[u64]) {
|
|
|
|
- for i in addrs {
|
|
|
|
- self.allowed_memory.insert(*i);
|
|
|
|
- }
|
|
|
|
|
|
+ pub fn register_allowed_memory(&mut self, addrs_range: Range<u64>) {
|
|
|
|
+ self.allowed_memory.insert(addrs_range);
|
|
}
|
|
}
|
|
|
|
|
|
/// Execute the program loaded, with the given packet data and metadata buffer.
|
|
/// Execute the program loaded, with the given packet data and metadata buffer.
|
|
@@ -998,7 +996,6 @@ impl<'a> EbpfVmFixedMbuff<'a> {
|
|
/// # Examples
|
|
/// # Examples
|
|
///
|
|
///
|
|
/// ```
|
|
/// ```
|
|
- /// use std::iter::FromIterator;
|
|
|
|
/// use std::ptr::addr_of;
|
|
/// use std::ptr::addr_of;
|
|
///
|
|
///
|
|
/// struct MapValue {
|
|
/// struct MapValue {
|
|
@@ -1014,11 +1011,10 @@ impl<'a> EbpfVmFixedMbuff<'a> {
|
|
/// // Instantiate a VM.
|
|
/// // Instantiate a VM.
|
|
/// let mut vm = rbpf::EbpfVmFixedMbuff::new(Some(prog), 0x40, 0x50).unwrap();
|
|
/// let mut vm = rbpf::EbpfVmFixedMbuff::new(Some(prog), 0x40, 0x50).unwrap();
|
|
/// let start = addr_of!(VALUE) as u64;
|
|
/// let start = addr_of!(VALUE) as u64;
|
|
- /// let addrs = Vec::from_iter(start..start+size_of::<MapValue>() as u64);
|
|
|
|
- /// vm.register_allowed_memory(&addrs);
|
|
|
|
|
|
+ /// vm.register_allowed_memory(start..start+size_of::<MapValue>() as u64);
|
|
/// ```
|
|
/// ```
|
|
- pub fn register_allowed_memory(&mut self, allowed: &[u64]) {
|
|
|
|
- self.parent.register_allowed_memory(allowed)
|
|
|
|
|
|
+ pub fn register_allowed_memory(&mut self, addrs_range: Range<u64>) {
|
|
|
|
+ self.parent.register_allowed_memory(addrs_range)
|
|
}
|
|
}
|
|
|
|
|
|
/// Execute the program loaded, with the given packet data.
|
|
/// Execute the program loaded, with the given packet data.
|
|
@@ -1528,7 +1524,6 @@ impl<'a> EbpfVmRaw<'a> {
|
|
/// # Examples
|
|
/// # Examples
|
|
///
|
|
///
|
|
/// ```
|
|
/// ```
|
|
- /// use std::iter::FromIterator;
|
|
|
|
/// use std::ptr::addr_of;
|
|
/// use std::ptr::addr_of;
|
|
///
|
|
///
|
|
/// struct MapValue {
|
|
/// struct MapValue {
|
|
@@ -1544,11 +1539,10 @@ impl<'a> EbpfVmRaw<'a> {
|
|
/// // Instantiate a VM.
|
|
/// // Instantiate a VM.
|
|
/// let mut vm = rbpf::EbpfVmRaw::new(Some(prog)).unwrap();
|
|
/// let mut vm = rbpf::EbpfVmRaw::new(Some(prog)).unwrap();
|
|
/// let start = addr_of!(VALUE) as u64;
|
|
/// let start = addr_of!(VALUE) as u64;
|
|
- /// let addrs = Vec::from_iter(start..start+size_of::<MapValue>() as u64);
|
|
|
|
- /// vm.register_allowed_memory(&addrs);
|
|
|
|
|
|
+ /// vm.register_allowed_memory(start..start+size_of::<MapValue>() as u64);
|
|
/// ```
|
|
/// ```
|
|
- pub fn register_allowed_memory(&mut self, allowed: &[u64]) {
|
|
|
|
- self.parent.register_allowed_memory(allowed)
|
|
|
|
|
|
+ pub fn register_allowed_memory(&mut self, addrs_range: Range<u64>) {
|
|
|
|
+ self.parent.register_allowed_memory(addrs_range)
|
|
}
|
|
}
|
|
|
|
|
|
/// Execute the program loaded, with the given packet data.
|
|
/// Execute the program loaded, with the given packet data.
|
|
@@ -1966,7 +1960,6 @@ impl<'a> EbpfVmNoData<'a> {
|
|
/// # Examples
|
|
/// # Examples
|
|
///
|
|
///
|
|
/// ```
|
|
/// ```
|
|
- /// use std::iter::FromIterator;
|
|
|
|
/// use std::ptr::addr_of;
|
|
/// use std::ptr::addr_of;
|
|
///
|
|
///
|
|
/// struct MapValue {
|
|
/// struct MapValue {
|
|
@@ -1982,11 +1975,10 @@ impl<'a> EbpfVmNoData<'a> {
|
|
/// // Instantiate a VM.
|
|
/// // Instantiate a VM.
|
|
/// let mut vm = rbpf::EbpfVmNoData::new(Some(prog)).unwrap();
|
|
/// let mut vm = rbpf::EbpfVmNoData::new(Some(prog)).unwrap();
|
|
/// let start = addr_of!(VALUE) as u64;
|
|
/// let start = addr_of!(VALUE) as u64;
|
|
- /// let addrs = Vec::from_iter(start..start+size_of::<MapValue>() as u64);
|
|
|
|
- /// vm.register_allowed_memory(&addrs);
|
|
|
|
|
|
+ /// vm.register_allowed_memory(start..start+size_of::<MapValue>() as u64);
|
|
/// ```
|
|
/// ```
|
|
- pub fn register_allowed_memory(&mut self, allowed: &[u64]) {
|
|
|
|
- self.parent.register_allowed_memory(allowed)
|
|
|
|
|
|
+ pub fn register_allowed_memory(&mut self, addrs_range: Range<u64>) {
|
|
|
|
+ self.parent.register_allowed_memory(addrs_range)
|
|
}
|
|
}
|
|
|
|
|
|
/// JIT-compile the loaded program. No argument required for this.
|
|
/// JIT-compile the loaded program. No argument required for this.
|