Bump solana_rbpf to version 0.2.13 (#18068)

* Moves syscall_registry into the rbpf Executable constructor.

* Adds the reject_unresolved_syscalls flag which is only set when deploying programs via the CLI.
This commit is contained in:
Alexander Meißner
2021-12-03 23:43:38 +01:00
committed by Trent Nelson
parent 231a3bda8e
commit 765fbc9a8c
12 changed files with 104 additions and 69 deletions

8
Cargo.lock generated
View File

@@ -1640,9 +1640,9 @@ dependencies = [
[[package]] [[package]]
name = "goblin" name = "goblin"
version = "0.3.0" version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c69552f48b18aa6102ce0c82dd9bc9d3f8af5fc0a5797069b1b466b90570e39c" checksum = "0b1800b95efee8ad4ef04517d4d69f8e209e763b1668f1179aeeedd0e454da55"
dependencies = [ dependencies = [
"log 0.4.14", "log 0.4.14",
"plain", "plain",
@@ -5898,9 +5898,9 @@ dependencies = [
[[package]] [[package]]
name = "solana_rbpf" name = "solana_rbpf"
version = "0.2.12" version = "0.2.13"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c44596a3613a44f76a7f6e5205464a1e78d1529fa19e8eacde0b9e55a6387f50" checksum = "fc1dced9892c2b0273318ef4d8486112ea7c7a7b8eb563a20e7858ad921b4719"
dependencies = [ dependencies = [
"byteorder", "byteorder",
"combine", "combine",

View File

@@ -40,7 +40,7 @@ solana-config-program = { path = "../programs/config", version = "=1.8.7" }
solana-faucet = { path = "../faucet", version = "=1.8.7" } solana-faucet = { path = "../faucet", version = "=1.8.7" }
solana-logger = { path = "../logger", version = "=1.8.7" } solana-logger = { path = "../logger", version = "=1.8.7" }
solana-net-utils = { path = "../net-utils", version = "=1.8.7" } solana-net-utils = { path = "../net-utils", version = "=1.8.7" }
solana_rbpf = "=0.2.12" solana_rbpf = "=0.2.13"
solana-remote-wallet = { path = "../remote-wallet", version = "=1.8.7" } solana-remote-wallet = { path = "../remote-wallet", version = "=1.8.7" }
solana-sdk = { path = "../sdk", version = "=1.8.7" } solana-sdk = { path = "../sdk", version = "=1.8.7" }
solana-transaction-status = { path = "../transaction-status", version = "=1.8.7" } solana-transaction-status = { path = "../transaction-status", version = "=1.8.7" }

View File

@@ -10,7 +10,7 @@ use {
clap::{App, AppSettings, Arg, ArgMatches, SubCommand}, clap::{App, AppSettings, Arg, ArgMatches, SubCommand},
log::*, log::*,
solana_account_decoder::{UiAccountEncoding, UiDataSliceConfig}, solana_account_decoder::{UiAccountEncoding, UiDataSliceConfig},
solana_bpf_loader_program::{BpfError, ThisInstructionMeter}, solana_bpf_loader_program::{syscalls::register_syscalls, BpfError, ThisInstructionMeter},
solana_clap_utils::{self, input_parsers::*, input_validators::*, keypair::*}, solana_clap_utils::{self, input_parsers::*, input_validators::*, keypair::*},
solana_cli_output::{ solana_cli_output::{
CliProgram, CliProgramAccountType, CliProgramAuthority, CliProgramBuffer, CliProgramId, CliProgram, CliProgramAccountType, CliProgramAuthority, CliProgramBuffer, CliProgramId,
@@ -39,6 +39,7 @@ use {
message::Message, message::Message,
native_token::Sol, native_token::Sol,
packet::PACKET_DATA_SIZE, packet::PACKET_DATA_SIZE,
process_instruction::MockInvokeContext,
pubkey::Pubkey, pubkey::Pubkey,
signature::{keypair_from_seed, read_keypair_file, Keypair, Signature, Signer}, signature::{keypair_from_seed, read_keypair_file, Keypair, Signature, Signer},
system_instruction::{self, SystemError}, system_instruction::{self, SystemError},
@@ -1985,12 +1986,17 @@ fn read_and_verify_elf(program_location: &str) -> Result<Vec<u8>, Box<dyn std::e
let mut program_data = Vec::new(); let mut program_data = Vec::new();
file.read_to_end(&mut program_data) file.read_to_end(&mut program_data)
.map_err(|err| format!("Unable to read program file: {}", err))?; .map_err(|err| format!("Unable to read program file: {}", err))?;
let mut invoke_context = MockInvokeContext::new(vec![]);
// Verify the program // Verify the program
<dyn Executable<BpfError, ThisInstructionMeter>>::from_elf( <dyn Executable<BpfError, ThisInstructionMeter>>::from_elf(
&program_data, &program_data,
Some(|x| verifier::check(x)), Some(|x| verifier::check(x)),
Config::default(), Config {
reject_unresolved_syscalls: true,
..Config::default()
},
register_syscalls(&mut invoke_context).unwrap(),
) )
.map_err(|err| format!("ELF error: {}", err))?; .map_err(|err| format!("ELF error: {}", err))?;

Binary file not shown.

View File

@@ -1159,9 +1159,9 @@ checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
[[package]] [[package]]
name = "goblin" name = "goblin"
version = "0.3.0" version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c69552f48b18aa6102ce0c82dd9bc9d3f8af5fc0a5797069b1b466b90570e39c" checksum = "0b1800b95efee8ad4ef04517d4d69f8e209e763b1668f1179aeeedd0e454da55"
dependencies = [ dependencies = [
"log", "log",
"plain", "plain",
@@ -3698,9 +3698,9 @@ dependencies = [
[[package]] [[package]]
name = "solana_rbpf" name = "solana_rbpf"
version = "0.2.12" version = "0.2.13"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c44596a3613a44f76a7f6e5205464a1e78d1529fa19e8eacde0b9e55a6387f50" checksum = "fc1dced9892c2b0273318ef4d8486112ea7c7a7b8eb563a20e7858ad921b4719"
dependencies = [ dependencies = [
"byteorder 1.3.4", "byteorder 1.3.4",
"combine", "combine",

View File

@@ -30,7 +30,7 @@ solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.8.7" }
solana-cli-output = { path = "../../cli-output", version = "=1.8.7" } solana-cli-output = { path = "../../cli-output", version = "=1.8.7" }
solana-logger = { path = "../../logger", version = "=1.8.7" } solana-logger = { path = "../../logger", version = "=1.8.7" }
solana-measure = { path = "../../measure", version = "=1.8.7" } solana-measure = { path = "../../measure", version = "=1.8.7" }
solana_rbpf = "=0.2.12" solana_rbpf = "=0.2.13"
solana-runtime = { path = "../../runtime", version = "=1.8.7" } solana-runtime = { path = "../../runtime", version = "=1.8.7" }
solana-sdk = { path = "../../sdk", version = "=1.8.7" } solana-sdk = { path = "../../sdk", version = "=1.8.7" }
solana-transaction-status = { path = "../../transaction-status", version = "=1.8.7" } solana-transaction-status = { path = "../../transaction-status", version = "=1.8.7" }

View File

@@ -11,7 +11,7 @@ use solana_bpf_loader_program::{
ThisInstructionMeter, ThisInstructionMeter,
}; };
use solana_measure::measure::Measure; use solana_measure::measure::Measure;
use solana_rbpf::vm::{Config, Executable, InstructionMeter}; use solana_rbpf::vm::{Config, Executable, InstructionMeter, SyscallRegistry};
use solana_runtime::{ use solana_runtime::{
bank::Bank, bank::Bank,
bank_client::BankClient, bank_client::BankClient,
@@ -79,6 +79,7 @@ fn bench_program_create_executable(bencher: &mut Bencher) {
&elf, &elf,
None, None,
Config::default(), Config::default(),
SyscallRegistry::default(),
) )
.unwrap(); .unwrap();
}); });
@@ -97,10 +98,13 @@ fn bench_program_alu(bencher: &mut Bencher) {
let mut invoke_context = MockInvokeContext::new(vec![]); let mut invoke_context = MockInvokeContext::new(vec![]);
let elf = load_elf("bench_alu").unwrap(); let elf = load_elf("bench_alu").unwrap();
let mut executable = let mut executable = <dyn Executable<BpfError, ThisInstructionMeter>>::from_elf(
<dyn Executable<BpfError, ThisInstructionMeter>>::from_elf(&elf, None, Config::default()) &elf,
.unwrap(); None,
executable.set_syscall_registry(register_syscalls(&mut invoke_context).unwrap()); Config::default(),
register_syscalls(&mut invoke_context).unwrap(),
)
.unwrap();
executable.jit_compile().unwrap(); executable.jit_compile().unwrap();
let compute_meter = invoke_context.get_compute_meter(); let compute_meter = invoke_context.get_compute_meter();
let mut instruction_meter = ThisInstructionMeter { compute_meter }; let mut instruction_meter = ThisInstructionMeter { compute_meter };
@@ -225,10 +229,13 @@ fn bench_create_vm(bencher: &mut Bencher) {
.unwrap(); .unwrap();
let elf = load_elf("noop").unwrap(); let elf = load_elf("noop").unwrap();
let mut executable = let executable = <dyn Executable<BpfError, ThisInstructionMeter>>::from_elf(
<dyn Executable<BpfError, ThisInstructionMeter>>::from_elf(&elf, None, Config::default()) &elf,
.unwrap(); None,
executable.set_syscall_registry(register_syscalls(&mut invoke_context).unwrap()); Config::default(),
register_syscalls(&mut invoke_context).unwrap(),
)
.unwrap();
bencher.iter(|| { bencher.iter(|| {
let _ = create_vm( let _ = create_vm(
@@ -273,10 +280,13 @@ fn bench_instruction_count_tuner(_bencher: &mut Bencher) {
.unwrap(); .unwrap();
let elf = load_elf("tuner").unwrap(); let elf = load_elf("tuner").unwrap();
let mut executable = let executable = <dyn Executable<BpfError, ThisInstructionMeter>>::from_elf(
<dyn Executable<BpfError, ThisInstructionMeter>>::from_elf(&elf, None, Config::default()) &elf,
.unwrap(); None,
executable.set_syscall_registry(register_syscalls(&mut invoke_context).unwrap()); Config::default(),
register_syscalls(&mut invoke_context).unwrap(),
)
.unwrap();
let compute_meter = invoke_context.get_compute_meter(); let compute_meter = invoke_context.get_compute_meter();
let mut instruction_meter = ThisInstructionMeter { compute_meter }; let mut instruction_meter = ThisInstructionMeter { compute_meter };
let mut vm = create_vm( let mut vm = create_vm(

View File

@@ -211,14 +211,16 @@ fn run_program(
let mut instruction_meter = ThisInstructionMeter { compute_meter }; let mut instruction_meter = ThisInstructionMeter { compute_meter };
let config = Config { let config = Config {
max_call_depth: 20,
stack_frame_size: 4096,
enable_instruction_meter: true,
enable_instruction_tracing: true, enable_instruction_tracing: true,
..Config::default()
}; };
let mut executable = let mut executable = <dyn Executable<BpfError, ThisInstructionMeter>>::from_elf(
<dyn Executable<BpfError, ThisInstructionMeter>>::from_elf(&data, None, config).unwrap(); &data,
executable.set_syscall_registry(register_syscalls(&mut invoke_context).unwrap()); None,
config,
register_syscalls(&mut invoke_context).unwrap(),
)
.unwrap();
executable.jit_compile().unwrap(); executable.jit_compile().unwrap();
let mut instruction_count = 0; let mut instruction_count = 0;

View File

@@ -21,7 +21,7 @@ sha3 = "0.9.1"
solana-measure = { path = "../../measure", version = "=1.8.7" } solana-measure = { path = "../../measure", version = "=1.8.7" }
solana-runtime = { path = "../../runtime", version = "=1.8.7" } solana-runtime = { path = "../../runtime", version = "=1.8.7" }
solana-sdk = { path = "../../sdk", version = "=1.8.7" } solana-sdk = { path = "../../sdk", version = "=1.8.7" }
solana_rbpf = "=0.2.12" solana_rbpf = "=0.2.13"
thiserror = "1.0" thiserror = "1.0"
[dev-dependencies] [dev-dependencies]

View File

@@ -88,15 +88,20 @@ pub fn create_executor(
let config = Config { let config = Config {
max_call_depth: bpf_compute_budget.max_call_depth, max_call_depth: bpf_compute_budget.max_call_depth,
stack_frame_size: bpf_compute_budget.stack_frame_size, stack_frame_size: bpf_compute_budget.stack_frame_size,
enable_instruction_meter: true,
enable_instruction_tracing: log_enabled!(Trace), enable_instruction_tracing: log_enabled!(Trace),
..Config::default()
}; };
let mut executable = { let mut executable = {
let keyed_accounts = invoke_context.get_keyed_accounts()?; let keyed_accounts = invoke_context.get_keyed_accounts()?;
let program = keyed_account_at_index(keyed_accounts, program_account_index)?; let program = keyed_account_at_index(keyed_accounts, program_account_index)?;
let account = program.try_account_ref()?; let account = program.try_account_ref()?;
let data = &account.data()[program_data_offset..]; let data = &account.data()[program_data_offset..];
<dyn Executable<BpfError, ThisInstructionMeter>>::from_elf(data, None, config) <dyn Executable<BpfError, ThisInstructionMeter>>::from_elf(
data,
None,
config,
syscall_registry,
)
} }
.map_err(|e| map_ebpf_error(invoke_context, e))?; .map_err(|e| map_ebpf_error(invoke_context, e))?;
let (_, elf_bytes) = executable let (_, elf_bytes) = executable
@@ -104,7 +109,6 @@ pub fn create_executor(
.map_err(|e| map_ebpf_error(invoke_context, e))?; .map_err(|e| map_ebpf_error(invoke_context, e))?;
verifier::check(elf_bytes) verifier::check(elf_bytes)
.map_err(|e| map_ebpf_error(invoke_context, EbpfError::UserError(e.into())))?; .map_err(|e| map_ebpf_error(invoke_context, EbpfError::UserError(e.into())))?;
executable.set_syscall_registry(syscall_registry);
if use_jit { if use_jit {
if let Err(err) = executable.jit_compile() { if let Err(err) = executable.jit_compile() {
ic_msg!(invoke_context, "Failed to compile program {:?}", err); ic_msg!(invoke_context, "Failed to compile program {:?}", err);
@@ -1004,6 +1008,7 @@ mod tests {
use { use {
super::*, super::*,
rand::Rng, rand::Rng,
solana_rbpf::vm::SyscallRegistry,
solana_runtime::{bank::Bank, bank_client::BankClient}, solana_runtime::{bank::Bank, bank_client::BankClient},
solana_sdk::{ solana_sdk::{
account::{ account::{
@@ -1057,9 +1062,10 @@ mod tests {
solana_rbpf::elf::register_bpf_function(&mut bpf_functions, 0, "entrypoint").unwrap(); solana_rbpf::elf::register_bpf_function(&mut bpf_functions, 0, "entrypoint").unwrap();
let program = <dyn Executable<BpfError, TestInstructionMeter>>::from_text_bytes( let program = <dyn Executable<BpfError, TestInstructionMeter>>::from_text_bytes(
program, program,
bpf_functions,
None, None,
Config::default(), Config::default(),
SyscallRegistry::default(),
bpf_functions,
) )
.unwrap(); .unwrap();
let mut vm = let mut vm =

View File

@@ -2778,13 +2778,6 @@ mod tests {
std::str::FromStr, 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 { macro_rules! assert_access_violation {
($result:expr, $va:expr, $len:expr) => { ($result:expr, $va:expr, $len:expr) => {
match $result { match $result {
@@ -2806,9 +2799,10 @@ mod tests {
const LENGTH: u64 = 1000; const LENGTH: u64 = 1000;
let data = vec![0u8; LENGTH as usize]; let data = vec![0u8; LENGTH as usize];
let addr = data.as_ptr() as u64; let addr = data.as_ptr() as u64;
let config = Config::default();
let memory_mapping = MemoryMapping::new::<UserError>( let memory_mapping = MemoryMapping::new::<UserError>(
vec![MemoryRegion::new_from_slice(&data, START, 0, false)], vec![MemoryRegion::new_from_slice(&data, START, 0, false)],
&DEFAULT_CONFIG, &config,
) )
.unwrap(); .unwrap();
@@ -2845,6 +2839,7 @@ mod tests {
// Pubkey // Pubkey
let pubkey = solana_sdk::pubkey::new_rand(); let pubkey = solana_sdk::pubkey::new_rand();
let addr = &pubkey as *const _ as u64; let addr = &pubkey as *const _ as u64;
let config = Config::default();
let memory_mapping = MemoryMapping::new::<UserError>( let memory_mapping = MemoryMapping::new::<UserError>(
vec![MemoryRegion { vec![MemoryRegion {
host_addr: addr, host_addr: addr,
@@ -2853,7 +2848,7 @@ mod tests {
vm_gap_shift: 63, vm_gap_shift: 63,
is_writable: false, is_writable: false,
}], }],
&DEFAULT_CONFIG, &config,
) )
.unwrap(); .unwrap();
let translated_pubkey = let translated_pubkey =
@@ -2875,7 +2870,7 @@ mod tests {
vm_gap_shift: 63, vm_gap_shift: 63,
is_writable: false, is_writable: false,
}], }],
&DEFAULT_CONFIG, &config,
) )
.unwrap(); .unwrap();
let translated_instruction = let translated_instruction =
@@ -2894,6 +2889,7 @@ mod tests {
let data: Vec<u8> = vec![]; let data: Vec<u8> = vec![];
assert_eq!(0x1 as *const u8, data.as_ptr()); assert_eq!(0x1 as *const u8, data.as_ptr());
let addr = good_data.as_ptr() as *const _ as u64; let addr = good_data.as_ptr() as *const _ as u64;
let config = Config::default();
let memory_mapping = MemoryMapping::new::<UserError>( let memory_mapping = MemoryMapping::new::<UserError>(
vec![MemoryRegion { vec![MemoryRegion {
host_addr: addr, host_addr: addr,
@@ -2902,7 +2898,7 @@ mod tests {
vm_gap_shift: 63, vm_gap_shift: 63,
is_writable: false, is_writable: false,
}], }],
&DEFAULT_CONFIG, &config,
) )
.unwrap(); .unwrap();
let translated_data = translate_slice::<u8>( let translated_data = translate_slice::<u8>(
@@ -2927,7 +2923,7 @@ mod tests {
vm_gap_shift: 63, vm_gap_shift: 63,
is_writable: false, is_writable: false,
}], }],
&DEFAULT_CONFIG, &config,
) )
.unwrap(); .unwrap();
let translated_data = translate_slice::<u8>( let translated_data = translate_slice::<u8>(
@@ -2970,7 +2966,7 @@ mod tests {
vm_gap_shift: 63, vm_gap_shift: 63,
is_writable: false, is_writable: false,
}], }],
&DEFAULT_CONFIG, &config,
) )
.unwrap(); .unwrap();
let translated_data = translate_slice::<u64>( let translated_data = translate_slice::<u64>(
@@ -3000,7 +2996,7 @@ mod tests {
vm_gap_shift: 63, vm_gap_shift: 63,
is_writable: false, is_writable: false,
}], }],
&DEFAULT_CONFIG, &config,
) )
.unwrap(); .unwrap();
let translated_data = translate_slice::<Pubkey>( let translated_data = translate_slice::<Pubkey>(
@@ -3020,6 +3016,7 @@ mod tests {
fn test_translate_string_and_do() { fn test_translate_string_and_do() {
let string = "Gaggablaghblagh!"; let string = "Gaggablaghblagh!";
let addr = string.as_ptr() as *const _ as u64; let addr = string.as_ptr() as *const _ as u64;
let config = Config::default();
let memory_mapping = MemoryMapping::new::<UserError>( let memory_mapping = MemoryMapping::new::<UserError>(
vec![MemoryRegion { vec![MemoryRegion {
host_addr: addr, host_addr: addr,
@@ -3028,7 +3025,7 @@ mod tests {
vm_gap_shift: 63, vm_gap_shift: 63,
is_writable: false, is_writable: false,
}], }],
&DEFAULT_CONFIG, &config,
) )
.unwrap(); .unwrap();
assert_eq!( assert_eq!(
@@ -3051,9 +3048,9 @@ mod tests {
#[test] #[test]
#[should_panic(expected = "UserError(SyscallError(Abort))")] #[should_panic(expected = "UserError(SyscallError(Abort))")]
fn test_syscall_abort() { fn test_syscall_abort() {
let config = Config::default();
let memory_mapping = let memory_mapping =
MemoryMapping::new::<UserError>(vec![MemoryRegion::default()], &DEFAULT_CONFIG) MemoryMapping::new::<UserError>(vec![MemoryRegion::default()], &config).unwrap();
.unwrap();
let mut result: Result<u64, EbpfError<BpfError>> = Ok(0); let mut result: Result<u64, EbpfError<BpfError>> = Ok(0);
SyscallAbort::call( SyscallAbort::call(
&mut SyscallAbort {}, &mut SyscallAbort {},
@@ -3073,6 +3070,7 @@ mod tests {
fn test_syscall_sol_panic() { fn test_syscall_sol_panic() {
let string = "Gaggablaghblagh!"; let string = "Gaggablaghblagh!";
let addr = string.as_ptr() as *const _ as u64; let addr = string.as_ptr() as *const _ as u64;
let config = Config::default();
let memory_mapping = MemoryMapping::new::<UserError>( let memory_mapping = MemoryMapping::new::<UserError>(
vec![MemoryRegion { vec![MemoryRegion {
host_addr: addr, host_addr: addr,
@@ -3081,7 +3079,7 @@ mod tests {
vm_gap_shift: 63, vm_gap_shift: 63,
is_writable: false, is_writable: false,
}], }],
&DEFAULT_CONFIG, &config,
) )
.unwrap(); .unwrap();
@@ -3149,6 +3147,7 @@ mod tests {
loader_id: &bpf_loader::id(), loader_id: &bpf_loader::id(),
enforce_aligned_host_addrs: true, enforce_aligned_host_addrs: true,
}; };
let config = Config::default();
let memory_mapping = MemoryMapping::new::<UserError>( let memory_mapping = MemoryMapping::new::<UserError>(
vec![MemoryRegion { vec![MemoryRegion {
host_addr: addr, host_addr: addr,
@@ -3157,7 +3156,7 @@ mod tests {
vm_gap_shift: 63, vm_gap_shift: 63,
is_writable: false, is_writable: false,
}], }],
&DEFAULT_CONFIG, &config,
) )
.unwrap(); .unwrap();
@@ -3262,7 +3261,8 @@ mod tests {
compute_meter, compute_meter,
logger, logger,
}; };
let memory_mapping = MemoryMapping::new::<UserError>(vec![], &DEFAULT_CONFIG).unwrap(); let config = Config::default();
let memory_mapping = MemoryMapping::new::<UserError>(vec![], &config).unwrap();
let mut result: Result<u64, EbpfError<BpfError>> = Ok(0); let mut result: Result<u64, EbpfError<BpfError>> = Ok(0);
syscall_sol_log_u64.call(1, 2, 3, 4, 5, &memory_mapping, &mut result); syscall_sol_log_u64.call(1, 2, 3, 4, 5, &memory_mapping, &mut result);
@@ -3289,6 +3289,7 @@ mod tests {
loader_id: &bpf_loader::id(), loader_id: &bpf_loader::id(),
enforce_aligned_host_addrs: true, enforce_aligned_host_addrs: true,
}; };
let config = Config::default();
let memory_mapping = MemoryMapping::new::<UserError>( let memory_mapping = MemoryMapping::new::<UserError>(
vec![MemoryRegion { vec![MemoryRegion {
host_addr: addr, host_addr: addr,
@@ -3297,7 +3298,7 @@ mod tests {
vm_gap_shift: 63, vm_gap_shift: 63,
is_writable: false, is_writable: false,
}], }],
&DEFAULT_CONFIG, &config,
) )
.unwrap(); .unwrap();
@@ -3332,6 +3333,7 @@ mod tests {
#[test] #[test]
fn test_syscall_sol_alloc_free() { fn test_syscall_sol_alloc_free() {
let config = Config::default();
// large alloc // large alloc
{ {
let heap = AlignedMemory::new_with_size(100, HOST_ALIGN); let heap = AlignedMemory::new_with_size(100, HOST_ALIGN);
@@ -3342,7 +3344,7 @@ mod tests {
0, 0,
true, true,
)], )],
&DEFAULT_CONFIG, &config,
) )
.unwrap(); .unwrap();
let mut syscall = SyscallAllocFree { let mut syscall = SyscallAllocFree {
@@ -3369,7 +3371,7 @@ mod tests {
0, 0,
true, true,
)], )],
&DEFAULT_CONFIG, &config,
) )
.unwrap(); .unwrap();
let mut syscall = SyscallAllocFree { let mut syscall = SyscallAllocFree {
@@ -3395,7 +3397,7 @@ mod tests {
0, 0,
true, true,
)], )],
&DEFAULT_CONFIG, &config,
) )
.unwrap(); .unwrap();
let mut syscall = SyscallAllocFree { let mut syscall = SyscallAllocFree {
@@ -3415,6 +3417,7 @@ mod tests {
fn check_alignment<T>() { fn check_alignment<T>() {
let heap = AlignedMemory::new_with_size(100, HOST_ALIGN); let heap = AlignedMemory::new_with_size(100, HOST_ALIGN);
let config = Config::default();
let memory_mapping = MemoryMapping::new::<UserError>( let memory_mapping = MemoryMapping::new::<UserError>(
vec![MemoryRegion::new_from_slice( vec![MemoryRegion::new_from_slice(
heap.as_slice(), heap.as_slice(),
@@ -3422,7 +3425,7 @@ mod tests {
0, 0,
true, true,
)], )],
&DEFAULT_CONFIG, &config,
) )
.unwrap(); .unwrap();
let mut syscall = SyscallAllocFree { let mut syscall = SyscallAllocFree {
@@ -3468,6 +3471,7 @@ mod tests {
let ro_len = bytes_to_hash.len() as u64; let ro_len = bytes_to_hash.len() as u64;
let ro_va = 96; let ro_va = 96;
let rw_va = 192; let rw_va = 192;
let config = Config::default();
let memory_mapping = MemoryMapping::new::<UserError>( let memory_mapping = MemoryMapping::new::<UserError>(
vec![ vec![
MemoryRegion { MemoryRegion {
@@ -3499,7 +3503,7 @@ mod tests {
is_writable: true, is_writable: true,
}, },
], ],
&DEFAULT_CONFIG, &config,
) )
.unwrap(); .unwrap();
let compute_meter: Rc<RefCell<dyn ComputeMeter>> = let compute_meter: Rc<RefCell<dyn ComputeMeter>> =
@@ -3565,6 +3569,7 @@ mod tests {
#[test] #[test]
fn test_syscall_get_sysvar() { fn test_syscall_get_sysvar() {
let config = Config::default();
// Test clock sysvar // Test clock sysvar
{ {
let got_clock = Clock::default(); let got_clock = Clock::default();
@@ -3578,7 +3583,7 @@ mod tests {
vm_gap_shift: 63, vm_gap_shift: 63,
is_writable: true, is_writable: true,
}], }],
&DEFAULT_CONFIG, &config,
) )
.unwrap(); .unwrap();
@@ -3620,7 +3625,7 @@ mod tests {
vm_gap_shift: 63, vm_gap_shift: 63,
is_writable: true, is_writable: true,
}], }],
&DEFAULT_CONFIG, &config,
) )
.unwrap(); .unwrap();
@@ -3670,7 +3675,7 @@ mod tests {
vm_gap_shift: 63, vm_gap_shift: 63,
is_writable: true, is_writable: true,
}], }],
&DEFAULT_CONFIG, &config,
) )
.unwrap(); .unwrap();
@@ -3710,7 +3715,7 @@ mod tests {
vm_gap_shift: 63, vm_gap_shift: 63,
is_writable: true, is_writable: true,
}], }],
&DEFAULT_CONFIG, &config,
) )
.unwrap(); .unwrap();

View File

@@ -185,14 +185,21 @@ native machine code before execting it in the virtual machine.",
file.seek(SeekFrom::Start(0)).unwrap(); file.seek(SeekFrom::Start(0)).unwrap();
let mut contents = Vec::new(); let mut contents = Vec::new();
file.read_to_end(&mut contents).unwrap(); file.read_to_end(&mut contents).unwrap();
let syscall_registry = register_syscalls(&mut invoke_context).unwrap();
let mut executable = if magic == [0x7f, 0x45, 0x4c, 0x46] { let mut executable = if magic == [0x7f, 0x45, 0x4c, 0x46] {
<dyn Executable<BpfError, ThisInstructionMeter>>::from_elf(&contents, None, config) <dyn Executable<BpfError, ThisInstructionMeter>>::from_elf(
.map_err(|err| format!("Executable constructor failed: {:?}", err)) &contents,
None,
config,
syscall_registry,
)
.map_err(|err| format!("Executable constructor failed: {:?}", err))
} else { } else {
assemble::<BpfError, ThisInstructionMeter>( assemble::<BpfError, ThisInstructionMeter>(
std::str::from_utf8(contents.as_slice()).unwrap(), std::str::from_utf8(contents.as_slice()).unwrap(),
None, None,
config, config,
syscall_registry,
) )
} }
.unwrap(); .unwrap();
@@ -201,7 +208,6 @@ native machine code before execting it in the virtual machine.",
let (_, elf_bytes) = executable.get_text_bytes().unwrap(); let (_, elf_bytes) = executable.get_text_bytes().unwrap();
check(elf_bytes).unwrap(); check(elf_bytes).unwrap();
} }
executable.set_syscall_registry(register_syscalls(&mut invoke_context).unwrap());
executable.jit_compile().unwrap(); executable.jit_compile().unwrap();
let analysis = Analysis::from_executable(executable.as_ref()); let analysis = Analysis::from_executable(executable.as_ref());