Add BPF-to-BPF and PC relative call tests (#2395)

This commit is contained in:
Jak May
2019-01-11 19:33:08 -08:00
committed by GitHub
parent 1724430489
commit e9a0b3a8f3
9 changed files with 226 additions and 162 deletions

View File

@ -0,0 +1,16 @@
/**
* @brief test program that generates BPF PC relative call instructions
*/
#include <solana_sdk.h>
void __attribute__ ((noinline)) helper() {
sol_log(__func__);
}
extern bool entrypoint(const uint8_t *input) {
sol_log(__func__);
helper();
return true;
}

View File

@ -1,11 +0,0 @@
#include <criterion/criterion.h>
#include "../src/bench_alu.c"
Test(bench_alu, sanity) {
uint64_t input[] = {500, 0};
cr_assert(entrypoint((uint8_t *) input));
cr_assert_eq(input[0], 500);
cr_assert_eq(input[1], 5);
}

View File

@ -18,7 +18,7 @@ byteorder = "1.2.1"
elf = "0.0.10"
libc = "0.2.46"
log = "0.4.2"
solana_rbpf = "=0.1.6"
solana_rbpf = "=0.1.8"
serde = "1.0.84"
solana-logger = { path = "../../../logger", version = "0.12.0" }
solana-sdk = { path = "../../../sdk", version = "0.12.0" }

View File

@ -3,7 +3,7 @@ pub mod bpf_verifier;
use byteorder::{ByteOrder, LittleEndian, WriteBytesExt};
use libc::c_char;
use log::*;
use solana_rbpf::EbpfVmRaw;
use solana_rbpf::{EbpfVmRaw, RegionPtrs};
use solana_sdk::account::KeyedAccount;
use solana_sdk::loader_instruction::LoaderInstruction;
use solana_sdk::native_program::ProgramError;
@ -36,15 +36,13 @@ pub fn helper_sol_log_verify(
unused3: u64,
unused4: u64,
unused5: u64,
ro_regions: &[&[u8]],
unused7: &[&[u8]],
ro_regions: &[RegionPtrs],
unused7: &[RegionPtrs],
) -> Result<(()), Error> {
for region in ro_regions.iter() {
if region.as_ptr() as u64 <= addr
&& addr as u64 <= region.as_ptr() as u64 + region.len() as u64
{
if region.bot <= addr && addr as u64 <= region.top {
let c_buf: *const c_char = addr as *const c_char;
let max_size = (region.as_ptr() as u64 + region.len() as u64) - addr;
let max_size = region.top - addr;
unsafe {
for i in 0..max_size {
if std::ptr::read(c_buf.offset(i as isize)) == 0 {