use mach2::exception_types::EXC_GUARD;
#[derive(Copy, Clone, Debug)]
#[repr(u8)]
pub enum GuardKind {
None = 0,
MachPort = 1,
Fd = 2,
User = 3,
Vnode = 4,
VirtualMemory = 5,
RejectedSyscall = 6,
}
#[inline]
pub fn extract_guard_kind(code: u64) -> u8 {
((code >> 61) & 0x7) as u8
}
#[inline]
pub fn extract_guard_flavor(code: u64) -> u32 {
((code >> 32) & 0x1fffffff) as u32
}
#[inline]
pub fn extract_guard_target(code: u64) -> u32 {
code as u32
}
pub struct GuardException {
pub kind: u8,
pub flavor: u32,
pub target: u32,
pub identifier: u64,
}
#[inline]
pub fn extract_guard_exception(code: u64, subcode: u64) -> GuardException {
GuardException {
kind: extract_guard_kind(code),
flavor: extract_guard_flavor(code),
target: extract_guard_target(code),
identifier: subcode,
}
}
impl super::ExceptionInfo {
pub fn guard_exception(&self) -> Option<GuardException> {
if self.kind != EXC_GUARD {
return None;
}
Some(extract_guard_exception(
self.code,
self.subcode.unwrap_or_default(),
))
}
}