See Chapters 18,19 of the Intel Architecture Software Developer's Manual.
Several ioctls are provided to control performance data collection.
ssize_t ioctl_ipm_get_state(int fd, mx_x86_ipm_state_t* state);
Return various aspects of IPM state in |state|.
Returns 0 on success or a negative error code.
ssize_t ioctl_ipm_init(int fd);
Allocate various resources needed. This must be called before configuring the hardware and collecting data.
Returns 0 on success or a negative error code.
ssize_t ioctl_ipm_stage_simple_config(int fd, ioctl_ipm_simple_config_t* config);
Configure data collection by specifying a mask of what data to collect. The device driver will convert this to the needed configuration data.
Returns 0 on success or a negative error code.
ssize_t ioctl_ipm_stage_cpu_config(int fd, ioctl_ipm_cpu_config_t* config);
Configure data collection by specifying the raw values for the hardware configuration registers.
Returns 0 on success or a negative error code.
ssize_t ioctl_ipm_get_cpu_config(int fd, uint32_t *cpu, const mx_x86_ipm_config_t* config);
Fetch the configuration for |cpu|.
Returns 0 on success or a negative error code.
ssize_t ioctl_ipm_get_cpu_data(int fd, uint32_t *cpu, const mx_x86_ipm_counters_t* config);
Fetch the collected data for |cpu|.
Returns 0 on success or a negative error code.
ssize_t ioctl_ipm_start(int fd);
Start data collection.
Returns 0 on success or a negative error code.
ssize_t ioctl_ipm_stop(int fd);
Stop tracing and collect current data from each cpu.
Returns 0 on success or a negative error code.
ssize_t ioctl_ipm_free(int fd);
Request the kernel free all internal data structures for managing IPM.
Returns 0 on success or a negative error code.
Here's a sketch of typical usage: