4 个版本

0.2.5 2023年1月2日
0.2.4 2023年1月2日
0.2.2 2023年1月1日
0.2.1 2023年1月1日

#138 in 模拟器

自定义许可证

660KB
16K SLoC

C 15K SLoC // 0.1% comments Rust 1K SLoC // 0.1% comments C++ 272 SLoC // 0.1% comments

rvvm [WIP]

RVVM 公共 API 的安全 Rust 绑定。

提供对 RVVM 公共 API 的 Rust 风格接口。

示例

use rvvm::prelude::*;

#[type_handler(ty = "()")]
fn on_reset(dev: &Device<()>) {
    println!("Reset");
}

#[type_handler(ty = "()")]
fn on_update(dev: &Device<()>) {
    println!("Update");
}

#[on_remove(ty = "()")]
fn on_remove(dev: &mut Device<()>) {
    println!("I'm being removed");
}

fn main() {
    // Creates the RVVM instance with the 4KB of memory and 1
    // hart, see `rvvm::builders::instance::InstanceBuilder`
    // documentation for more detailed information or use the
    // `rvvm::instance::Instance::new` for direct creation
    let mut instance = Instance::builder().build();

    let test_type =
        DeviceType::custom("Test", on_remove, on_update, on_reset);
    let test_dev = Device::builder()
        .address(0x1024)
        .size(1024)
        .device_type(test_type)
        .op_size(1..=1) // inclusive range [from; to]
        .data(()) // Data for ZST types will not be allocated, but dropped
        .build();
    let handle: DeviceHandle<()> = instance
        .try_attach_device(test_dev)
        .expect("Failed to attach MMIO device");

    dbg!(handle);
}

实现

  • 虚拟机创建

  • RAM 读写

  • 声音(在安全性方面)和设备类型安全的 API

    • 完整的 API(需要重新检查)
  • 扁平化的设备树库绑定

  • 访问虚拟机的 FDT

  • pause/start/powered_on API

  • 加载内核/引导程序/dtb

  • 运行虚拟机的事件循环

  • PLIC/i2c

  • 用户空间 API

  • DMA

  • 测试 UART 设备

  • rvvm-sys 功能(如 fdt,jit 或其他)

可能遗漏了一些内容,因此列表将补充/更新。

依赖项

~0.7–3MB
~60K SLoC