1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
use libc::{c_char, c_uint, c_uchar, c_void, size_t, c_ulonglong};
#[allow(non_camel_case_types)]
pub type kpc_config_t = u64;
/// KPEP event (size: 48/28 bytes on 64/32 bit OS)
#[repr(C)]
#[allow(non_camel_case_types)]
pub struct kpep_event {
pub name: *const c_char, ///< Unique name of a event, such as "INST_RETIRED.ANY".
pub description: *const c_char, ///< Description for this event.
pub errata: *const c_char, ///< Errata, currently NULL.
pub alias: *const c_char, ///< Alias name, such as "Instructions", "Cycles".
pub fallback: *const c_char, ///< Fallback event name for fixed counter.
pub mask: c_uint,
pub number: c_uchar,
pub umask: c_uchar,
pub reserved: c_uchar,
pub is_fixed: c_uchar,
}
/// KPEP database (size: 144/80 bytes on 64/32 bit OS)
#[allow(non_camel_case_types)]
#[repr(C)]
pub struct kpep_db {
pub name: *const c_char, ///< Database name, such as "haswell".
pub cpu_id: *const c_char, ///< Plist name, such as "cpu_7_8_10b282dc".
pub marketing_name: *const c_char, ///< Marketing name, such as "Intel Haswell".
pub plist_data: *mut c_void, ///< Plist data (CFDataRef), currently NULL.
pub event_map: *mut c_void, ///< All events (CFDict<CFSTR(event_name), kpep_event *>).
pub event_arr: *mut kpep_event, ///< Event struct buffer (sizeof(kpep_event) * events_count).
pub fixed_event_arr: *mut *mut kpep_event, ///< Fixed counter events (sizeof(kpep_event *)
///< * fixed_counter_count)
pub alias_map: *mut c_void, ///< All aliases (CFDict<CFSTR(event_name), kpep_event *>).
pub reserved_1: size_t,
pub reserved_2: size_t,
pub reserved_3: size_t,
pub event_count: size_t, ///< All events count.
pub alias_count: size_t,
pub fixed_counter_count: size_t,
pub config_counter_count: size_t,
pub power_counter_count: size_t,
pub archtecture: c_uint, ///< see `KPEP CPU archtecture constants` above.
pub fixed_counter_bits: c_uint,
pub config_counter_bits: c_uint,
pub power_counter_bits: c_uint,
}
/// KPEP config (size: 80/44 bytes on 64/32 bit OS)
#[repr(C)]
#[allow(non_camel_case_types)]
pub struct kpep_config {
pub db: *mut kpep_db,
pub ev_arr: *mut *mut kpep_event, ///< (sizeof(kpep_event *) * counter_count), init NULL
pub ev_map: *mut size_t, ///< (sizeof(size_t *) * counter_count), init 0
pub ev_idx: *mut size_t, ///< (sizeof(size_t *) * counter_count), init -1
pub flags: *mut c_uint, ///< (sizeof(c_uint *) * counter_count), init 0
pub kpc_periods: *mut c_ulonglong, ///< (sizeof(c_ulonglong *) * counter_count), init 0
pub event_count: size_t, /// kpep_config_events_count()
pub counter_count: size_t,
pub classes: c_uint, ///< See `class mask constants` above.
pub config_counter: c_uint,
pub power_counter: c_uint,
pub reserved: c_uint,
}