blob: cdb3584be5f44639cd25f54e5d3413a4d3ed8edf [file] [view] [edit]
# Intel Hardware Performance Monitor Data Collection
See chapters 18,19 of the Intel Architecture Software Developer's Manual.
## IOCTLs
Several ioctls are provided to control performance data collection.
### *ioctl_cpuperf_get_properties*
```
ssize_t ioctl_cpuperf_get_properties(int fd, cpuperf_properties_t* props);
```
Return various aspects of PMU properties in |*props|.
Returns 0 on success or a negative error code.
### *ioctl_cpuperf_alloc_trace*
```
ssize_t ioctl_cpuperf_alloc_trace(int fd, const ioctl_cpuperf_alloc_t* alloc);
```
Allocate various resources needed to perform a trace.
This must be called before staging a configuration and starting a trace.
This must be called while tracing is stopped.
Returns 0 on success or a negative error code.
### *ioctl_cpuperf_free_trace*
```
ssize_t ioctl_cpuperf_free_trace(int fd);
```
Free all resources allocated by a preceding all to
*ioctl_cpuperf_alloc_trace()*.
This must be called while tracing is stopped.
Returns 0 on success or a negative error code.
### *ioctl_cpuperf_get_alloc*
```
ssize_t ioctl_cpuperf_get_alloc(int fd, cpuperf_alloc_t* alloc);
```
Fetch the trace configuration passed in to a preceding call to
*ioctl_cpuperf_alloc_trace()*.
Returns 0 on success or a negative error code.
### *ioctl_cpuperf_stage_config*
```
ssize_t ioctl_cpuperf_stage_config(int fd, const cpuperf_config_t* config);
```
Configure data collection. |*config| specifies the events to collect
and the rate at which to collect them.
This must be called while tracing is stopped.
Returns 0 on success or a negative error code.
### *ioctl_cpuperf_get_config*
```
ssize_t ioctl_cpuperf_get_config(int fd, cpuperf_config_t* config);
```
Fetch the configuration passed in to a preceding call to
*ioctl_cpuperf_stage_config()*.
Returns 0 on success or a negative error code.
### *ioctl_pmu_get_buffer_handle*
```
ssize_t ioctl_cpuperf_get_buffer_handle(
int fd, const ioctl_cpuperf_buffer_handle_req_t* rqst,
zx_handle_t* handle);
```
Fetch the handle of the VMO for the given descriptor.
Each CPU is given a separate VMO and the descriptor is the cpu's number.
This must be called while tracing is stopped.
Returns 0 on success or a negative error code.
### *ioctl_cpuperf_start*
```
ssize_t ioctl_cpuperf_start(int fd);
```
Start data collection.
This must be called while tracing is stopped.
Returns 0 on success or a negative error code.
### *ioctl_cpuperf_stop*
```
ssize_t ioctl_cpuperf_stop(int fd);
```
Stop tracing and collect any remaining data from each cpu.
This may be called even if tracing is already stopped.
Returns 0 on success or a negative error code.
## Usage
Here's a sketch of typical usage:
1) *ioctl_cpuperf_alloc_trace(fd, &alloc)*
2) *ioctl_cpuperf_stage_config(fd, &config)*
3) *ioctl_cpuperf_start(fd)*
4) launch program one wishes to trace
5) *ioctl_cpuperf_stop(fd)*
6) fetch handles for each vmo, and process data
7) *ioctl_cpuperf_free_trace(fd)* [this will free each buffer as well]