Host Executable
Create CMake project
Start by creating a typical CMake project:
main.cpp
#include <iostream>
int main() {
std::cout << "Hello from host!" << std::endl;
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(libriscv-host)
add_executable(main main.cpp)
Download libriscv
If the current directory is not a git project, initialize it as one:
git init
Download libriscv as a git submodule:
git submodule add git@github.com:fwsGonzo/libriscv.git
Link dependency
Configure CMake to build and link libriscv to the program:
CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(libriscv-host)
add_subdirectory(libriscv/lib)
add_executable(main main.cpp)
target_link_libraries(main riscv)
target_include_directories(main PRIVATE libriscv/lib)
Setup your build directory:
mkdir build
cd build
cmake ..
cd ..
Setup sandbox
We should have a riscv64 binary at ./guest.bin
from the Guest VM section.
main.cpp
#include <iostream>
#include <vector>
#include <libriscv/machine.hpp>
#include <libriscv/util/load_binary_file.hpp>
using RiscvMachine = riscv::Machine<riscv::RISCV64>;
int main() {
std::cout << "Hello from host!" << std::endl;
std::vector<unsigned char> guest_data = load_binary_file("./guest.bin");
RiscvMachine machine(guest_data);
machine.setup_linux_syscalls(false, false);
machine.simulate();
machine.vmcall("say_hello", "from riscv64 guest");
return 0;
}
Run program
Compile and run the host program:
make -C build
./build/main
It works!
Hello from host!
Hello world!
Hello from riscv64 guest!
Note
Host programs may also be written in other languages.