in reverie-ptrace/src/validation.rs [432:455]
fn check_for_kvm_in_txcp_bug() -> Result<(), PmuValidationError> {
let mut count: i64 = 0;
let mut attr = ticks_attr(false);
attr.config |= IN_TXCP;
attr.__bindgen_anon_1.sample_period = 0;
let mut disabled_txcp = false;
let fd = start_counter(0, -1, &mut attr, Some(&mut disabled_txcp))?;
let mut arg = 0_u64;
if !disabled_txcp {
ioctl(&fd, perf::perf_event_ioctls_DISABLE.into(), &mut arg)?;
ioctl(&fd, perf::perf_event_ioctls_ENABLE.into(), &mut arg)?;
do_branches(NUM_BRANCHES);
count = read_counter(&fd)?;
}
let supports_txcp = count > 0;
if supports_txcp && count < NUM_BRANCHES as i64 {
Err(PmuValidationError::IntelKvmInTxcpBugDetected)
} else {
Ok(())
}
}