use std::os::raw::c_ulong; pub const HYPERVISOR_TURNSTILE: c_ulong = 50; pub const TURNSTILE_OP_SET_POLICY: u32 = 0; pub const TURNSTILE_OP_PROTECT_RANGE: u32 = 1; pub const TURNSTILE_OP_UNPROTECT_RANGE: u32 = 2; pub const TURNSTILE_OP_REQUEST_WRITE: u32 = 3; pub const TURNSTILE_OP_GET_VIOLATIONS: u32 = 4; pub const TURNSTILE_OP_GET_STATS: u32 = 5; pub const TURNSTILE_OP_UPLOAD_METADATA: u32 = 6; pub const TURNSTILE_POLICY_DISABLED: u32 = 0; pub const TURNSTILE_POLICY_AUDIT: u32 = 1; pub const TURNSTILE_POLICY_ENFORCE: u32 = 2; pub const TURNSTILE_MAX_RANGES: usize = 256; pub const TURNSTILE_RING_SIZE: usize = 4096; pub const TURNSTILE_MAX_FUNC_ENTRIES: usize = 65536; pub const TURNSTILE_MAX_JUMP_ENTRIES: usize = 32768; pub const TURNSTILE_META_FUNC_ENTRIES: u32 = 0; pub const TURNSTILE_META_JUMP_ENTRIES: u32 = 1; #[repr(C)] #[derive(Debug, Clone, Copy, Default)] pub struct TurnstileViolation { pub timestamp: u64, pub gpa: u64, pub rip: u64, pub cr3: u64, pub access_flags: u32, pub response: u32, pub insn_bytes: [u8; 16], pub seq: u32, pub _pad: u32, } #[repr(C)] #[derive(Debug, Clone, Copy, Default)] pub struct TurnstileRange { pub gpa_start: u64, pub length: u64, pub original_type: u32, pub flags: u32, } #[repr(C)] #[derive(Debug, Clone, Copy, Default)] pub struct TurnstileStats { pub violations_total: u64, pub violations_blocked: u64, pub violations_allowed: u64, pub implicit_ftrace: u64, pub implicit_static_key: u64, pub explicit_write_grants: u64, pub ring_overflows: u64, } #[repr(C)] #[derive(Debug, Clone, Copy)] pub struct TurnstileOpSetPolicy { pub policy: u32, pub _pad: u32, } #[repr(C)] #[derive(Debug, Clone, Copy)] pub struct TurnstileOpProtectRange { pub gpa_start: u64, pub length: u64, } #[repr(C)] #[derive(Debug, Clone, Copy)] pub struct TurnstileOpRequestWrite { pub gpa_start: u64, pub length: u64, pub timeout_ms: u32, pub _pad: u32, } #[repr(C)] #[derive(Debug, Clone, Copy)] pub struct TurnstileOpGetViolations { pub buffer_ptr: u64, pub max_entries: u32, pub entries_returned: u32, pub overflow_count: u32, pub _pad: u32, } #[repr(C)] #[derive(Debug, Clone, Copy)] pub struct TurnstileOpUploadMetadata { pub buffer_ptr: u64, pub metadata_type: u32, pub count: u32, } #[repr(C)] #[derive(Debug, Clone, Copy)] pub struct JumpEntryUpload { pub code_addr: u64, pub target_addr: u64, pub key_addr: u64, } #[repr(C)] #[derive(Debug)] pub struct PrivcmdHypercall { pub op: c_ulong, pub arg: [c_ulong; 5], } nix::ioctl_readwrite!(privcmd_hypercall, b'P', 0, PrivcmdHypercall);