Updates rbpf to v0.2.2 (#14036)

* Updates rbpf to v0.2.2
This commit is contained in:
Alexander Meißner 2020-12-10 16:32:54 +01:00 committed by GitHub
parent f02d4cdb37
commit 201637b326
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 174 additions and 145 deletions

8
Cargo.lock generated
View File

@ -1370,9 +1370,9 @@ dependencies = [
[[package]]
name = "goblin"
version = "0.2.3"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d20fd25aa456527ce4f544271ae4fea65d2eda4a6561ea56f39fb3ee4f7e3884"
checksum = "c69552f48b18aa6102ce0c82dd9bc9d3f8af5fc0a5797069b1b466b90570e39c"
dependencies = [
"log 0.4.8",
"plain",
@ -5177,9 +5177,9 @@ dependencies = [
[[package]]
name = "solana_rbpf"
version = "0.2.1"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8fad65297e2bd080468cb57a97e6a62e9a92928a45960496338e997e8270fa00"
checksum = "a3f14c9649bc6c2dfc205b3450007ef02ec7331c1ea8f109468d53d159a09f3a"
dependencies = [
"byteorder",
"combine",

View File

@ -37,7 +37,7 @@ solana-config-program = { path = "../programs/config", version = "1.5.0" }
solana-faucet = { path = "../faucet", version = "1.5.0" }
solana-logger = { path = "../logger", version = "1.5.0" }
solana-net-utils = { path = "../net-utils", version = "1.5.0" }
solana_rbpf = "=0.2.1"
solana_rbpf = "=0.2.2"
solana-remote-wallet = { path = "../remote-wallet", version = "1.5.0" }
solana-sdk = { path = "../sdk", version = "1.5.0" }
solana-stake-program = { path = "../programs/stake", version = "1.5.0" }

View File

@ -749,9 +749,9 @@ checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
[[package]]
name = "goblin"
version = "0.2.3"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d20fd25aa456527ce4f544271ae4fea65d2eda4a6561ea56f39fb3ee4f7e3884"
checksum = "c69552f48b18aa6102ce0c82dd9bc9d3f8af5fc0a5797069b1b466b90570e39c"
dependencies = [
"log",
"plain",
@ -2410,9 +2410,9 @@ dependencies = [
[[package]]
name = "solana_rbpf"
version = "0.2.1"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8fad65297e2bd080468cb57a97e6a62e9a92928a45960496338e997e8270fa00"
checksum = "a3f14c9649bc6c2dfc205b3450007ef02ec7331c1ea8f109468d53d159a09f3a"
dependencies = [
"byteorder 1.3.4",
"combine",

View File

@ -27,7 +27,7 @@ solana-logger = { path = "../../logger", version = "1.5.0" }
solana-measure = { path = "../../measure", version = "1.5.0" }
solana-runtime = { path = "../../runtime", version = "1.5.0" }
solana-sdk = { path = "../../sdk", version = "1.5.0" }
solana_rbpf = "=0.2.1"
solana_rbpf = "=0.2.2"
[[bench]]
name = "bpf_loader"

View File

@ -16,7 +16,7 @@ num-derive = "0.3"
num-traits = "0.2"
solana-runtime = { path = "../../runtime", version = "1.5.0" }
solana-sdk = { path = "../../sdk", version = "1.5.0" }
solana_rbpf = "=0.2.1"
solana_rbpf = "=0.2.2"
thiserror = "1.0"
[dev-dependencies]

View File

@ -1396,7 +1396,7 @@ fn call<'a>(
#[cfg(test)]
mod tests {
use super::*;
use solana_rbpf::memory_region::MemoryRegion;
use solana_rbpf::{memory_region::MemoryRegion, vm::Config};
use solana_sdk::{
bpf_loader,
hash::hashv,
@ -1404,6 +1404,13 @@ mod tests {
};
use std::str::FromStr;
const DEFAULT_CONFIG: Config = Config {
max_call_depth: 20,
stack_frame_size: 4_096,
enable_instruction_meter: true,
enable_instruction_tracing: false,
};
macro_rules! assert_access_violation {
($result:expr, $va:expr, $len:expr) => {
match $result {
@ -1419,9 +1426,10 @@ mod tests {
const LENGTH: u64 = 1000;
let data = vec![0u8; LENGTH as usize];
let addr = data.as_ptr() as u64;
let memory_mapping = MemoryMapping::new_from_regions(vec![MemoryRegion::new_from_slice(
&data, START, 0, false,
)]);
let memory_mapping = MemoryMapping::new(
vec![MemoryRegion::new_from_slice(&data, START, 0, false)],
&DEFAULT_CONFIG,
);
let cases = vec![
(true, START, 0, addr),
@ -1456,13 +1464,16 @@ mod tests {
// Pubkey
let pubkey = solana_sdk::pubkey::new_rand();
let addr = &pubkey as *const _ as u64;
let memory_mapping = MemoryMapping::new_from_regions(vec![MemoryRegion {
host_addr: addr,
vm_addr: 100,
len: std::mem::size_of::<Pubkey>() as u64,
vm_gap_shift: 63,
is_writable: false,
}]);
let memory_mapping = MemoryMapping::new(
vec![MemoryRegion {
host_addr: addr,
vm_addr: 100,
len: std::mem::size_of::<Pubkey>() as u64,
vm_gap_shift: 63,
is_writable: false,
}],
&DEFAULT_CONFIG,
);
let translated_pubkey =
translate_type::<Pubkey>(&memory_mapping, 100, &bpf_loader::id()).unwrap();
assert_eq!(pubkey, *translated_pubkey);
@ -1474,13 +1485,16 @@ mod tests {
vec![AccountMeta::new(solana_sdk::pubkey::new_rand(), false)],
);
let addr = &instruction as *const _ as u64;
let mut memory_mapping = MemoryMapping::new_from_regions(vec![MemoryRegion {
host_addr: addr,
vm_addr: 96,
len: std::mem::size_of::<Instruction>() as u64,
vm_gap_shift: 63,
is_writable: false,
}]);
let mut memory_mapping = MemoryMapping::new(
vec![MemoryRegion {
host_addr: addr,
vm_addr: 96,
len: std::mem::size_of::<Instruction>() as u64,
vm_gap_shift: 63,
is_writable: false,
}],
&DEFAULT_CONFIG,
);
let translated_instruction =
translate_type::<Instruction>(&memory_mapping, 96, &bpf_loader::id()).unwrap();
assert_eq!(instruction, *translated_instruction);
@ -1495,13 +1509,16 @@ mod tests {
let data: Vec<u8> = vec![];
assert_eq!(0x1 as *const u8, data.as_ptr());
let addr = good_data.as_ptr() as *const _ as u64;
let memory_mapping = MemoryMapping::new_from_regions(vec![MemoryRegion {
host_addr: addr,
vm_addr: 100,
len: good_data.len() as u64,
vm_gap_shift: 63,
is_writable: false,
}]);
let memory_mapping = MemoryMapping::new(
vec![MemoryRegion {
host_addr: addr,
vm_addr: 100,
len: good_data.len() as u64,
vm_gap_shift: 63,
is_writable: false,
}],
&DEFAULT_CONFIG,
);
let translated_data =
translate_slice::<u8>(&memory_mapping, data.as_ptr() as u64, 0, &bpf_loader::id())
.unwrap();
@ -1511,13 +1528,16 @@ mod tests {
// u8
let mut data = vec![1u8, 2, 3, 4, 5];
let addr = data.as_ptr() as *const _ as u64;
let memory_mapping = MemoryMapping::new_from_regions(vec![MemoryRegion {
host_addr: addr,
vm_addr: 100,
len: data.len() as u64,
vm_gap_shift: 63,
is_writable: false,
}]);
let memory_mapping = MemoryMapping::new(
vec![MemoryRegion {
host_addr: addr,
vm_addr: 100,
len: data.len() as u64,
vm_gap_shift: 63,
is_writable: false,
}],
&DEFAULT_CONFIG,
);
let translated_data =
translate_slice::<u8>(&memory_mapping, 100, data.len() as u64, &bpf_loader::id())
.unwrap();
@ -1543,13 +1563,16 @@ mod tests {
// u64
let mut data = vec![1u64, 2, 3, 4, 5];
let addr = data.as_ptr() as *const _ as u64;
let memory_mapping = MemoryMapping::new_from_regions(vec![MemoryRegion {
host_addr: addr,
vm_addr: 96,
len: (data.len() * size_of::<u64>()) as u64,
vm_gap_shift: 63,
is_writable: false,
}]);
let memory_mapping = MemoryMapping::new(
vec![MemoryRegion {
host_addr: addr,
vm_addr: 96,
len: (data.len() * size_of::<u64>()) as u64,
vm_gap_shift: 63,
is_writable: false,
}],
&DEFAULT_CONFIG,
);
let translated_data =
translate_slice::<u64>(&memory_mapping, 96, data.len() as u64, &bpf_loader::id())
.unwrap();
@ -1561,13 +1584,16 @@ mod tests {
// Pubkeys
let mut data = vec![solana_sdk::pubkey::new_rand(); 5];
let addr = data.as_ptr() as *const _ as u64;
let memory_mapping = MemoryMapping::new_from_regions(vec![MemoryRegion {
host_addr: addr,
vm_addr: 100,
len: (data.len() * std::mem::size_of::<Pubkey>()) as u64,
vm_gap_shift: 63,
is_writable: false,
}]);
let memory_mapping = MemoryMapping::new(
vec![MemoryRegion {
host_addr: addr,
vm_addr: 100,
len: (data.len() * std::mem::size_of::<Pubkey>()) as u64,
vm_gap_shift: 63,
is_writable: false,
}],
&DEFAULT_CONFIG,
);
let translated_data =
translate_slice::<Pubkey>(&memory_mapping, 100, data.len() as u64, &bpf_loader::id())
.unwrap();
@ -1580,13 +1606,16 @@ mod tests {
fn test_translate_string_and_do() {
let string = "Gaggablaghblagh!";
let addr = string.as_ptr() as *const _ as u64;
let memory_mapping = MemoryMapping::new_from_regions(vec![MemoryRegion {
host_addr: addr,
vm_addr: 100,
len: string.len() as u64,
vm_gap_shift: 63,
is_writable: false,
}]);
let memory_mapping = MemoryMapping::new(
vec![MemoryRegion {
host_addr: addr,
vm_addr: 100,
len: string.len() as u64,
vm_gap_shift: 63,
is_writable: false,
}],
&DEFAULT_CONFIG,
);
assert_eq!(
42,
translate_string_and_do(
@ -1606,7 +1635,7 @@ mod tests {
#[test]
#[should_panic(expected = "UserError(SyscallError(Abort))")]
fn test_syscall_abort() {
let memory_mapping = MemoryMapping::new_from_regions(vec![MemoryRegion::default()]);
let memory_mapping = MemoryMapping::new(vec![MemoryRegion::default()], &DEFAULT_CONFIG);
let mut result: Result<u64, EbpfError<BPFError>> = Ok(0);
SyscallAbort::call(
&mut SyscallAbort {},
@ -1626,13 +1655,16 @@ mod tests {
fn test_syscall_sol_panic() {
let string = "Gaggablaghblagh!";
let addr = string.as_ptr() as *const _ as u64;
let memory_mapping = MemoryMapping::new_from_regions(vec![MemoryRegion {
host_addr: addr,
vm_addr: 100,
len: string.len() as u64,
vm_gap_shift: 63,
is_writable: false,
}]);
let memory_mapping = MemoryMapping::new(
vec![MemoryRegion {
host_addr: addr,
vm_addr: 100,
len: string.len() as u64,
vm_gap_shift: 63,
is_writable: false,
}],
&DEFAULT_CONFIG,
);
let mut syscall_panic = SyscallPanic {
loader_id: &bpf_loader::id(),
};
@ -1665,13 +1697,16 @@ mod tests {
logger,
loader_id: &bpf_loader::id(),
};
let memory_mapping = MemoryMapping::new_from_regions(vec![MemoryRegion {
host_addr: addr,
vm_addr: 100,
len: string.len() as u64,
vm_gap_shift: 63,
is_writable: false,
}]);
let memory_mapping = MemoryMapping::new(
vec![MemoryRegion {
host_addr: addr,
vm_addr: 100,
len: string.len() as u64,
vm_gap_shift: 63,
is_writable: false,
}],
&DEFAULT_CONFIG,
);
let mut result: Result<u64, EbpfError<BPFError>> = Ok(0);
syscall_sol_log.call(
@ -1741,7 +1776,7 @@ mod tests {
compute_meter,
logger,
};
let memory_mapping = MemoryMapping::new_from_regions(vec![]);
let memory_mapping = MemoryMapping::new(vec![], &DEFAULT_CONFIG);
let mut result: Result<u64, EbpfError<BPFError>> = Ok(0);
syscall_sol_log_u64.call(1, 2, 3, 4, 5, &memory_mapping, &mut result);
@ -1767,13 +1802,16 @@ mod tests {
logger,
loader_id: &bpf_loader::id(),
};
let memory_mapping = MemoryMapping::new_from_regions(vec![MemoryRegion {
host_addr: addr,
vm_addr: 100,
len: 32,
vm_gap_shift: 63,
is_writable: false,
}]);
let memory_mapping = MemoryMapping::new(
vec![MemoryRegion {
host_addr: addr,
vm_addr: 100,
len: 32,
vm_gap_shift: 63,
is_writable: false,
}],
&DEFAULT_CONFIG,
);
let mut result: Result<u64, EbpfError<BPFError>> = Ok(0);
syscall_sol_pubkey.call(100, 0, 0, 0, 0, &memory_mapping, &mut result);
@ -1809,13 +1847,10 @@ mod tests {
// large alloc
{
let heap = vec![0_u8; 100];
let memory_mapping =
MemoryMapping::new_from_regions(vec![MemoryRegion::new_from_slice(
&heap,
MM_HEAP_START,
0,
true,
)]);
let memory_mapping = MemoryMapping::new(
vec![MemoryRegion::new_from_slice(&heap, MM_HEAP_START, 0, true)],
&DEFAULT_CONFIG,
);
let mut syscall = SyscallAllocFree {
aligned: true,
allocator: BPFAllocator::new(heap, MM_HEAP_START),
@ -1833,13 +1868,10 @@ mod tests {
// many small unaligned allocs
{
let heap = vec![0_u8; 100];
let memory_mapping =
MemoryMapping::new_from_regions(vec![MemoryRegion::new_from_slice(
&heap,
MM_HEAP_START,
0,
true,
)]);
let memory_mapping = MemoryMapping::new(
vec![MemoryRegion::new_from_slice(&heap, MM_HEAP_START, 0, true)],
&DEFAULT_CONFIG,
);
let mut syscall = SyscallAllocFree {
aligned: false,
allocator: BPFAllocator::new(heap, MM_HEAP_START),
@ -1856,13 +1888,10 @@ mod tests {
// many small aligned allocs
{
let heap = vec![0_u8; 100];
let memory_mapping =
MemoryMapping::new_from_regions(vec![MemoryRegion::new_from_slice(
&heap,
MM_HEAP_START,
0,
true,
)]);
let memory_mapping = MemoryMapping::new(
vec![MemoryRegion::new_from_slice(&heap, MM_HEAP_START, 0, true)],
&DEFAULT_CONFIG,
);
let mut syscall = SyscallAllocFree {
aligned: true,
allocator: BPFAllocator::new(heap, MM_HEAP_START),
@ -1880,13 +1909,10 @@ mod tests {
fn check_alignment<T>() {
let heap = vec![0_u8; 100];
let memory_mapping =
MemoryMapping::new_from_regions(vec![MemoryRegion::new_from_slice(
&heap,
MM_HEAP_START,
0,
true,
)]);
let memory_mapping = MemoryMapping::new(
vec![MemoryRegion::new_from_slice(&heap, MM_HEAP_START, 0, true)],
&DEFAULT_CONFIG,
);
let mut syscall = SyscallAllocFree {
aligned: true,
allocator: BPFAllocator::new(heap, MM_HEAP_START),
@ -1934,36 +1960,39 @@ mod tests {
let ro_len = bytes_to_hash.len() as u64;
let ro_va = 96;
let rw_va = 192;
let memory_mapping = MemoryMapping::new_from_regions(vec![
MemoryRegion {
host_addr: bytes1.as_ptr() as *const _ as u64,
vm_addr: 4096,
len: bytes1.len() as u64,
vm_gap_shift: 63,
is_writable: false,
},
MemoryRegion {
host_addr: bytes2.as_ptr() as *const _ as u64,
vm_addr: 8192,
len: bytes2.len() as u64,
vm_gap_shift: 63,
is_writable: false,
},
MemoryRegion {
host_addr: bytes_to_hash.as_ptr() as *const _ as u64,
vm_addr: 96,
len: 32,
vm_gap_shift: 63,
is_writable: false,
},
MemoryRegion {
host_addr: hash_result.as_ptr() as *const _ as u64,
vm_addr: rw_va,
len: HASH_BYTES as u64,
vm_gap_shift: 63,
is_writable: true,
},
]);
let memory_mapping = MemoryMapping::new(
vec![
MemoryRegion {
host_addr: bytes1.as_ptr() as *const _ as u64,
vm_addr: 4096,
len: bytes1.len() as u64,
vm_gap_shift: 63,
is_writable: false,
},
MemoryRegion {
host_addr: bytes2.as_ptr() as *const _ as u64,
vm_addr: 8192,
len: bytes2.len() as u64,
vm_gap_shift: 63,
is_writable: false,
},
MemoryRegion {
host_addr: bytes_to_hash.as_ptr() as *const _ as u64,
vm_addr: 96,
len: 32,
vm_gap_shift: 63,
is_writable: false,
},
MemoryRegion {
host_addr: hash_result.as_ptr() as *const _ as u64,
vm_addr: rw_va,
len: HASH_BYTES as u64,
vm_gap_shift: 63,
is_writable: true,
},
],
&DEFAULT_CONFIG,
);
let compute_meter: Rc<RefCell<dyn ComputeMeter>> =
Rc::new(RefCell::new(MockComputeMeter {
remaining: (bytes1.len() + bytes2.len()) as u64,