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
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-APACHE 和 LICENSE-MIT。