use crate::abi::ProgressFn;
pub const BARYL_ARCH_ABI_VERSION: u32 = 8;
pub const BARYL_ARCH_MIN_ABI_VERSION: u32 = 8;
pub const BARYL_ARCH_X86_64: u32 = 1;
pub const BARYL_ARCH_VM_DESCRIPTOR: u32 = 1;
pub const X64_EXCP_DE: u32 = 0;
pub const X64_EXCP_DB: u32 = 1;
pub const X64_EXCP_NMI: u32 = 2;
pub const X64_EXCP_BP: u32 = 3;
pub const X64_EXCP_OF: u32 = 4;
pub const X64_EXCP_BR: u32 = 5;
pub const X64_EXCP_UD: u32 = 6;
pub const X64_EXCP_NM: u32 = 7;
pub const X64_EXCP_DF: u32 = 8;
pub const X64_EXCP_TS: u32 = 10;
pub const X64_EXCP_NP: u32 = 11;
pub const X64_EXCP_SS: u32 = 12;
pub const X64_EXCP_GP: u32 = 13;
pub const X64_EXCP_PF: u32 = 14;
pub const X64_EXCP_MF: u32 = 16;
pub const X64_EXCP_AC: u32 = 17;
pub const X64_EXCP_MC: u32 = 18;
pub const X64_EXCP_XF: u32 = 19;
pub const X64_PF_ERR_PRESENT: u32 = 1;
pub const X64_PF_ERR_WRITE: u32 = 2;
pub const X64_PF_ERR_USER: u32 = 4;
pub const X64_PF_ERR_RESERVED: u32 = 8;
pub const X64_PF_ERR_INSN_FETCH: u32 = 16;
pub const BARYL_BLOCK_HASH_C1: i64 = -4658895280553007687;
pub const BARYL_BLOCK_HASH_C2: i64 = -7723592293110705685;
pub const BARYL_BLOCK_HASH_SHIFT1: u32 = 30;
pub const BARYL_BLOCK_HASH_SHIFT2: u32 = 27;
pub const BARYL_X64_PTE_PRESENT: u32 = 1;
pub const BARYL_X64_PTE_WRITE: u32 = 2;
pub const BARYL_X64_PTE_USER: u32 = 4;
pub const BARYL_X64_PTE_EXEC: u32 = 8;
pub const BARYL_ARCH_VTABLE: u32 = 1;
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct ArchRef {
pub ctx: *mut ::core::ffi::c_void,
pub vtable: *const ArchVtable,
}
impl Default for ArchRef {
fn default() -> Self {
let mut s = ::core::mem::MaybeUninit::<Self>::uninit();
unsafe {
::core::ptr::write_bytes(s.as_mut_ptr(), 0, 1);
s.assume_init()
}
}
}
pub type CpuExcFn = ::core::option::Option<
unsafe extern "C" fn(
obj: *mut ::core::ffi::c_void,
ctl: *mut ::core::ffi::c_void,
ctx: *const CpuExceptionContext,
),
>;
pub type AddrSpaceFn = ::core::option::Option<
unsafe extern "C" fn(obj: *mut ::core::ffi::c_void, ctl: *mut ::core::ffi::c_void, root: u64),
>;
pub type MappingFn = ::core::option::Option<
unsafe extern "C" fn(
obj: *mut ::core::ffi::c_void,
addr: *const GuestAddr,
) -> ::core::ffi::c_int,
>;
#[repr(C)]
#[derive(Debug, Default, Copy, Clone)]
pub struct ArchCallbacks {
pub on_cpu_exception: CpuExcFn,
pub on_address_space_change: AddrSpaceFn,
}
#[repr(u32)]
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
pub enum X64GPR {
Rax = 0,
Rcx = 1,
Rdx = 2,
Rbx = 3,
Rsp = 4,
Rbp = 5,
Rsi = 6,
Rdi = 7,
R8 = 8,
R9 = 9,
R10 = 10,
R11 = 11,
R12 = 12,
R13 = 13,
R14 = 14,
R15 = 15,
}
pub type X64Gpr = [u64; 16usize];
#[repr(u32)]
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
pub enum X64Seg {
Es = 0,
Cs = 1,
Ss = 2,
Ds = 3,
Fs = 4,
Gs = 5,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone)]
pub struct X64Segment {
pub base: u64,
pub limit: u32,
pub flags: u32,
pub selector: u32,
pub _reserved: u32,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct RegLayout {
pub version: u32,
pub gpr: *mut X64Gpr,
pub rip: *mut u64,
pub rflags: *mut u64,
pub seg: *mut X64Segment,
pub ldtr: *mut X64Segment,
pub tr: *mut X64Segment,
pub gdtr: *mut X64Segment,
pub idtr: *mut X64Segment,
pub cr: *mut u64,
pub dr: *mut u64,
pub efer: *mut u64,
pub lstar: *mut u64,
pub kernel_gs_base: *mut u64,
}
impl Default for RegLayout {
fn default() -> Self {
let mut s = ::core::mem::MaybeUninit::<Self>::uninit();
unsafe {
::core::ptr::write_bytes(s.as_mut_ptr(), 0, 1);
s.assume_init()
}
}
}
pub type RegLayoutX64 = RegLayout;
#[repr(C)]
#[derive(Debug, Default, Copy, Clone)]
pub struct CpuExceptionContext {
pub vector: u32,
pub error: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, PartialEq, Eq, Hash, zerocopy :: FromZeros)]
pub struct GuestAddr {
pub va: u64,
pub cr3: u64,
}
pub type GuestAddrX64 = GuestAddr;
#[repr(C)]
#[derive(Debug, Default, Copy, Clone)]
pub struct MemAttr {
pub perms: u32,
pub _reserved: u32,
}
pub type MemAttrX64 = MemAttr;
#[repr(C)]
#[derive(Debug, Default, Copy, Clone)]
pub struct ArchVtable {
pub translate: ::core::option::Option<
unsafe extern "C" fn(
arch: ArchRef,
va: u64,
cr3: u64,
phys_out: *mut u64,
attr_out: *mut MemAttr,
) -> ::core::ffi::c_int,
>,
pub read_virt: ::core::option::Option<
unsafe extern "C" fn(
arch: ArchRef,
va: u64,
cr3: u64,
buf: *mut u8,
len: u64,
) -> ::core::ffi::c_int,
>,
pub write_virt: ::core::option::Option<
unsafe extern "C" fn(
arch: ArchRef,
va: u64,
cr3: u64,
buf: *const u8,
len: u64,
) -> ::core::ffi::c_int,
>,
pub tlb_invalidate: ::core::option::Option<unsafe extern "C" fn(arch: ArchRef)>,
pub virt_scan_for_pattern: ::core::option::Option<
unsafe extern "C" fn(
arch: ArchRef,
cr3: u64,
start: u64,
end: u64,
stride: u64,
pat: *const u8,
pat_len: u64,
obj: *mut ::core::ffi::c_void,
progress: ProgressFn,
) -> u64,
>,
pub virt_scan_for_u64: ::core::option::Option<
unsafe extern "C" fn(
arch: ArchRef,
cr3: u64,
start: u64,
end: u64,
stride: u64,
target: u64,
obj: *mut ::core::ffi::c_void,
progress: ProgressFn,
) -> u64,
>,
pub virt_scan_for_u32: ::core::option::Option<
unsafe extern "C" fn(
arch: ArchRef,
cr3: u64,
start: u64,
end: u64,
stride: u64,
target: u32,
obj: *mut ::core::ffi::c_void,
progress: ProgressFn,
) -> u64,
>,
pub virt_walk_mappings: ::core::option::Option<
unsafe extern "C" fn(
arch: ArchRef,
cr3: u64,
pa: u64,
obj: *mut ::core::ffi::c_void,
fn_: MappingFn,
progress: ProgressFn,
) -> u64,
>,
}
pub type ArchVtableX64 = ArchVtable;