diff --git a/programs/native/bpf_loader/Cargo.toml b/programs/native/bpf_loader/Cargo.toml index 9974613f51..1dac73af6c 100644 --- a/programs/native/bpf_loader/Cargo.toml +++ b/programs/native/bpf_loader/Cargo.toml @@ -10,7 +10,7 @@ elf = "0.0.10" env_logger = "0.5.12" libc = "0.2.43" log = "0.4.2" -rbpf = { git = "https://github.com/qmonnet/rbpf", rev="bc41ec47d9b51751585f6ddcde1d1eb1afe2be69" } +rbpf = "0.1.0" serde = "1.0.27" serde_derive = "1.0.27" solana_program_interface = { path = "../../../common" } diff --git a/programs/native/bpf_loader/src/lib.rs b/programs/native/bpf_loader/src/lib.rs index 4b9cda6a17..4daa1c5892 100644 --- a/programs/native/bpf_loader/src/lib.rs +++ b/programs/native/bpf_loader/src/lib.rs @@ -21,18 +21,18 @@ use std::sync::{Once, ONCE_INIT}; fn create_vm(prog: &[u8]) -> Result { let mut vm = rbpf::EbpfVmRaw::new(None)?; vm.set_verifier(bpf_verifier::check)?; - vm.set_prog(&prog)?; + vm.set_program(&prog)?; vm.register_helper( rbpf::helpers::BPF_TRACE_PRINTK_IDX, rbpf::helpers::bpf_trace_printf, - ); + )?; Ok(vm) } #[allow(dead_code)] -fn dump_prog(name: &str, prog: &[u8]) { +fn dump_program(key: &Pubkey, prog: &[u8]) { let mut eight_bytes: Vec = Vec::new(); - println!("BPF Program: {}", name); + println!("BPF Program: {:?}", key); for i in prog.iter() { if eight_bytes.len() >= 7 { println!("{:02X?}", eight_bytes); @@ -91,6 +91,7 @@ pub extern "C" fn process(keyed_accounts: &mut [KeyedAccount], tx_data: &[u8]) - if keyed_accounts[0].account.executable { let prog = keyed_accounts[0].account.userdata.clone(); trace!("Call BPF, {} Instructions", prog.len() / 8); + //dump_program(keyed_accounts[0].key, &prog); let vm = match create_vm(&prog) { Ok(vm) => vm, Err(e) => { @@ -99,9 +100,14 @@ pub extern "C" fn process(keyed_accounts: &mut [KeyedAccount], tx_data: &[u8]) - } }; let mut v = serialize_parameters(&mut keyed_accounts[1..], &tx_data); - if 0 == vm.prog_exec(v.as_mut_slice()) { - warn!("BPF program failed"); - return false; + match vm.execute_program(v.as_mut_slice()) { + Ok(status) => if 0 == status { + return false; + }, + Err(e) => { + warn!("{}", e); + return false; + } } deserialize_parameters(&mut keyed_accounts[1..], &v); } else if let Ok(instruction) = deserialize(tx_data) {