1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
#[macro_use] extern crate derive_more; pub mod bits; pub mod debugger; pub mod decoder; pub mod error; pub mod instructions; pub mod machine; pub mod memory; pub mod syscalls; pub use crate::{ debugger::Debugger, instructions::{Instruction, Register}, machine::{ trace::TraceMachine, CoreMachine, DefaultCoreMachine, DefaultMachine, DefaultMachineBuilder, InstructionCycleFunc, Machine, SupportMachine, }, memory::{flat::FlatMemory, sparse::SparseMemory, wxorx::WXorXMemory, Memory}, syscalls::Syscalls, }; use bytes::Bytes; pub use ckb_vm_definitions::{ registers, DEFAULT_STACK_SIZE, RISCV_GENERAL_REGISTER_NUMBER, RISCV_MAX_MEMORY, RISCV_PAGES, RISCV_PAGESIZE, }; pub use error::Error; pub fn run<R: Register, M: Memory<R> + Default>( program: &Bytes, args: &[Bytes], ) -> Result<i8, Error> { let mut machine = TraceMachine::new(DefaultMachine::<DefaultCoreMachine<R, WXorXMemory<R, M>>>::default()); machine.load_program(program, args)?; machine.run() } #[cfg(test)] mod tests { use super::*; #[test] fn test_max_memory_must_be_multiple_of_pages() { assert_eq!(RISCV_MAX_MEMORY % RISCV_PAGESIZE, 0); } #[test] fn test_page_size_be_power_of_2() { assert!(RISCV_PAGESIZE.is_power_of_two()); } }