4个版本 (2个破坏性更新)

0.3.0 2023年7月15日
0.2.0 2022年10月1日
0.1.1 2020年12月30日
0.1.0 2020年12月27日

macOS和iOS API 中排名 60

Apache-2.0 OR MIT

81KB
1K SLoC

ahv

Apple硅 Hypervisor绑定。

用法

要使用 ahv,将以下内容添加到您的 Cargo.toml

[dependencies]
ahv = "0.3.0"

示例

以下示例在EL1中将立即值2移动到寄存器x0,然后调用HVC 0。

use ahv::*;

fn main() -> Result<()> {
    let el1_user_payload = [
        0x40, 0x00, 0x80, 0xD2, // mov x0, #2
        0x02, 0x00, 0x00, 0xD4, // hvc #0
    ];

    const EL1_USER_PAYLOAD_ADDRESS: hv_ipa_t = 0x20000;
    let mut virtual_machine: VirtualMachine = VirtualMachine::new(None)?;
    let el1_user_payload_allocation_handle = virtual_machine.allocate_from(&el1_user_payload)?;
    virtual_machine.map(el1_user_payload_allocation_handle,
                        EL1_USER_PAYLOAD_ADDRESS,
                        MemoryPermission::READ_WRITE_EXECUTE)?;

    {
        // vCPU scope
        let mut vcpu = virtual_machine.create_vcpu(None)?;

        vcpu.set_register(Register::CPSR, 0x3c4)?;
        vcpu.set_register(Register::PC, EL1_USER_PAYLOAD_ADDRESS)?;
        vcpu.set_trap_debug_exceptions(true)?;
    
        loop {
            let result = vcpu.run()?;
    
            match result {
                VirtualCpuExitReason::Exception { exception } => {
                    let ec = (exception.syndrome >> 26) & 0x3f;
    
                    if ec == 0x16 {
                        println!("HVC executed! x0 is {}", vcpu.get_register(Register::X0)?);
                        break;
                    } else {
                        println!("Unknown exception class 0x{:x}", ec);
                        break;
                    }
                }
                reason => {
                    println!("Unexpected exit! Reason: {:?}", reason);
                    break;
                }
            }
        }
    }

    // VirtualMachine will unmap and deallocate on drop.

    Ok(())
}

要运行此示例,请确保为构建的二进制文件提供 com.apple.security.hypervisor 权限。

MSRV

当前MSRV是1.65.0。

许可证

ahv根据用户的选择,在MIT许可证或Apache许可证(版本2.0)的条款下分发。

请参阅LICENSE-APACHELICENSE-MIT

无运行时依赖

功能