Revert "Updates rbpf to v0.2.0, (#12951)"

This reverts commit 6606590b81.
This commit is contained in:
Michael Vines
2020-10-29 19:48:00 -07:00
parent 7d686b72a0
commit da361afbb9
11 changed files with 458 additions and 630 deletions

View File

@ -12,7 +12,6 @@ use crate::{
};
use num_derive::{FromPrimitive, ToPrimitive};
use solana_rbpf::{
ebpf::MM_HEAP_START,
error::{EbpfError, UserDefinedError},
memory_region::MemoryRegion,
vm::{Config, EbpfVm, Executable, InstructionMeter},
@ -21,7 +20,7 @@ use solana_sdk::{
bpf_loader, bpf_loader_deprecated,
decode_error::DecodeError,
entrypoint::SUCCESS,
feature_set::{bpf_compute_budget_balancing, bpf_just_in_time_compilation},
feature_set::bpf_compute_budget_balancing,
instruction::InstructionError,
keyed_account::{is_executable, next_keyed_account, KeyedAccount},
loader_instruction::LoaderInstruction,
@ -93,7 +92,7 @@ pub fn create_and_cache_executor(
program: &KeyedAccount,
invoke_context: &mut dyn InvokeContext,
) -> Result<Arc<BPFExecutor>, InstructionError> {
let executable = Executable::from_elf(&program.try_account_ref()?.data, None)
let executable = EbpfVm::create_executable_from_elf(&program.try_account_ref()?.data, None)
.map_err(|e| map_ebpf_error(invoke_context, e))?;
let (_, elf_bytes) = executable
.get_text_bytes()
@ -108,20 +107,13 @@ pub fn create_and_cache_executor(
Ok(executor)
}
/// Default program heap size, allocators
/// are expected to enforce this
const DEFAULT_HEAP_SIZE: usize = 32 * 1024;
/// Create the BPF virtual machine
pub fn create_vm<'a>(
loader_id: &'a Pubkey,
executable: &'a dyn Executable<BPFError>,
parameter_bytes: &[u8],
parameter_accounts: &'a [KeyedAccount<'a>],
invoke_context: &'a mut dyn InvokeContext,
) -> Result<EbpfVm<'a, BPFError, ThisInstructionMeter>, EbpfError<BPFError>> {
let heap = vec![0_u8; DEFAULT_HEAP_SIZE];
let heap_region = MemoryRegion::new_from_slice(&heap, MM_HEAP_START, true);
) -> Result<(EbpfVm<'a, BPFError>, MemoryRegion), EbpfError<BPFError>> {
let bpf_compute_budget = invoke_context.get_bpf_compute_budget();
let mut vm = EbpfVm::new(
executable,
@ -129,11 +121,10 @@ pub fn create_vm<'a>(
max_call_depth: bpf_compute_budget.max_call_depth,
stack_frame_size: bpf_compute_budget.stack_frame_size,
},
parameter_bytes,
&[heap_region],
)?;
syscalls::register_syscalls(loader_id, &mut vm, parameter_accounts, invoke_context, heap)?;
Ok(vm)
let heap_region =
syscalls::register_syscalls(loader_id, &mut vm, parameter_accounts, invoke_context)?;
Ok((vm, heap_region))
}
pub fn process_instruction(
@ -198,8 +189,8 @@ pub fn process_instruction(
}
/// Passed to the VM to enforce the compute budget
pub struct ThisInstructionMeter {
pub compute_meter: Rc<RefCell<dyn ComputeMeter>>,
struct ThisInstructionMeter {
compute_meter: Rc<RefCell<dyn ComputeMeter>>,
}
impl ThisInstructionMeter {
fn new(compute_meter: Rc<RefCell<dyn ComputeMeter>>) -> Self {
@ -251,12 +242,9 @@ impl Executor for BPFExecutor {
)?;
{
let compute_meter = invoke_context.get_compute_meter();
let is_jit_enabled =
invoke_context.is_feature_active(&bpf_just_in_time_compilation::id());
let mut vm = match create_vm(
let (mut vm, heap_region) = match create_vm(
program_id,
self.executable.as_ref(),
parameter_bytes.as_slice(),
&parameter_accounts,
invoke_context,
) {
@ -268,16 +256,14 @@ impl Executor for BPFExecutor {
};
log!(logger, "Call BPF program {}", program.unsigned_key());
let mut instruction_meter = ThisInstructionMeter::new(compute_meter.clone());
let instruction_meter = ThisInstructionMeter::new(compute_meter.clone());
let before = compute_meter.borrow().get_remaining();
let result = if is_jit_enabled {
if vm.jit_compile().is_err() {
return Err(BPFLoaderError::VirtualMachineCreationFailed.into());
}
unsafe { vm.execute_program_jit(&mut instruction_meter) }
} else {
vm.execute_program_interpreted(&mut instruction_meter)
};
let result = vm.execute_program_metered(
parameter_bytes.as_slice(),
&[],
&[heap_region],
instruction_meter,
);
let after = compute_meter.borrow().get_remaining();
log!(
logger,
@ -347,7 +333,7 @@ mod tests {
}
#[test]
#[should_panic(expected = "ExceededMaxInstructions(31, 10)")]
#[should_panic(expected = "ExceededMaxInstructions(10)")]
fn test_bpf_loader_non_terminating_program() {
#[rustfmt::skip]
let program = &[
@ -357,16 +343,10 @@ mod tests {
];
let input = &mut [0x00];
let executable = Executable::<BPFError>::from_text_bytes(program, None).unwrap();
let mut vm = EbpfVm::<BPFError, TestInstructionMeter>::new(
executable.as_ref(),
Config::default(),
input,
&[],
)
.unwrap();
let mut instruction_meter = TestInstructionMeter { remaining: 10 };
vm.execute_program_interpreted(&mut instruction_meter)
let executable = EbpfVm::create_executable_from_text_bytes(program, None).unwrap();
let mut vm = EbpfVm::<BPFError>::new(executable.as_ref(), Config::default()).unwrap();
let instruction_meter = TestInstructionMeter { remaining: 10 };
vm.execute_program_metered(input, &[], &[], instruction_meter)
.unwrap();
}

File diff suppressed because it is too large Load Diff