Skip to main content

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

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.