|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* pfmlib_os_linux_v2.c: Perfmon2 syscall API
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
* Copyright (c) 2003-2006 Hewlett-Packard Development Company, L.P.
|
|
Packit |
577717 |
* Contributed by Stephane Eranian <eranian@hpl.hp.com>
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
Packit |
577717 |
* of this software and associated documentation files (the "Software"), to deal
|
|
Packit |
577717 |
* in the Software without restriction, including without limitation the rights
|
|
Packit |
577717 |
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
Packit |
577717 |
* of the Software, and to permit persons to whom the Software is furnished to do so,
|
|
Packit |
577717 |
* subject to the following conditions:
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
* The above copyright notice and this permission notice shall be included in all
|
|
Packit |
577717 |
* copies or substantial portions of the Software.
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
Packit |
577717 |
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
|
Packit |
577717 |
* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
Packit |
577717 |
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
|
|
Packit |
577717 |
* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
|
|
Packit |
577717 |
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
#include <sys/types.h>
|
|
Packit |
577717 |
#include <stdint.h>
|
|
Packit |
577717 |
#include <stdio.h>
|
|
Packit |
577717 |
#include <stdarg.h>
|
|
Packit |
577717 |
#include <string.h>
|
|
Packit |
577717 |
#include <stdlib.h>
|
|
Packit |
577717 |
#include <unistd.h>
|
|
Packit |
577717 |
#include <errno.h>
|
|
Packit |
577717 |
#include <syscall.h>
|
|
Packit |
577717 |
#include <perfmon/perfmon.h>
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include <perfmon/pfmlib.h>
|
|
Packit |
577717 |
#include "pfmlib_priv.h"
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* v2.x interface
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
#define PFM_pfm_create_context (_pfmlib_get_sys_base()+0)
|
|
Packit |
577717 |
#define PFM_pfm_write_pmcs (_pfmlib_get_sys_base()+1)
|
|
Packit |
577717 |
#define PFM_pfm_write_pmds (_pfmlib_get_sys_base()+2)
|
|
Packit |
577717 |
#define PFM_pfm_read_pmds (_pfmlib_get_sys_base()+3)
|
|
Packit |
577717 |
#define PFM_pfm_load_context (_pfmlib_get_sys_base()+4)
|
|
Packit |
577717 |
#define PFM_pfm_start (_pfmlib_get_sys_base()+5)
|
|
Packit |
577717 |
#define PFM_pfm_stop (_pfmlib_get_sys_base()+6)
|
|
Packit |
577717 |
#define PFM_pfm_restart (_pfmlib_get_sys_base()+7)
|
|
Packit |
577717 |
#define PFM_pfm_create_evtsets (_pfmlib_get_sys_base()+8)
|
|
Packit |
577717 |
#define PFM_pfm_getinfo_evtsets (_pfmlib_get_sys_base()+9)
|
|
Packit |
577717 |
#define PFM_pfm_delete_evtsets (_pfmlib_get_sys_base()+10)
|
|
Packit |
577717 |
#define PFM_pfm_unload_context (_pfmlib_get_sys_base()+11)
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* argument to v2.2 pfm_create_context()
|
|
Packit |
577717 |
* ALWAYS use pfarg_ctx_t in programs, libpfm
|
|
Packit |
577717 |
* does convert ths structure on the fly if v2.2. is detected
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
typedef struct {
|
|
Packit |
577717 |
unsigned char ctx_smpl_buf_id[16]; /* which buffer format to use */
|
|
Packit |
577717 |
uint32_t ctx_flags; /* noblock/block/syswide */
|
|
Packit |
577717 |
int32_t ctx_fd; /* ret arg: fd for context */
|
|
Packit |
577717 |
uint64_t ctx_smpl_buf_size; /* ret arg: actual buffer sz */
|
|
Packit |
577717 |
uint64_t ctx_reserved3[12]; /* for future use */
|
|
Packit |
577717 |
} pfarg_ctx22_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* perfmon2 compatibility layer with perfmon3
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
#ifndef PFMLIB_OLD_PFMV2
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
pfm_create_context_2v3(pfarg_ctx_t *ctx, char *name, void *smpl_arg, size_t smpl_size)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
pfarg_sinfo_t cinfo;
|
|
Packit |
577717 |
uint32_t fl;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* simulate kernel returning error on NULL ctx
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
if (!ctx) {
|
|
Packit |
577717 |
errno = EINVAL;
|
|
Packit |
577717 |
return -1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* if sampling format is used, then force SMPL_FMT
|
|
Packit |
577717 |
* and PFM_FL_SINFO because it comes first
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
fl = ctx->ctx_flags;
|
|
Packit |
577717 |
if (name || smpl_arg || smpl_size)
|
|
Packit |
577717 |
fl |= PFM_FL_SMPL_FMT;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return pfm_create(fl, &cinfo, name, smpl_arg, smpl_size);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
pfm_write_pmcs_2v3(int fd, pfarg_pmc_t *pmcs, int count)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
pfarg_pmr_t *pmrs;
|
|
Packit |
577717 |
int errno_save;
|
|
Packit |
577717 |
int i, ret;
|
|
Packit |
577717 |
size_t sz;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
sz = count * sizeof(pfarg_pmr_t);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (!pmcs)
|
|
Packit |
577717 |
return pfm_write(fd, 0, PFM_RW_PMC, NULL, sz);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
pmrs = calloc(count, sizeof(*pmrs));
|
|
Packit |
577717 |
if (!pmrs) {
|
|
Packit |
577717 |
errno = ENOMEM;
|
|
Packit |
577717 |
return -1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for (i=0 ; i < count; i++) {
|
|
Packit |
577717 |
pmrs[i].reg_num = pmcs[i].reg_num;
|
|
Packit |
577717 |
pmrs[i].reg_set = pmcs[i].reg_set;
|
|
Packit |
577717 |
pmrs[i].reg_flags = pmcs[i].reg_flags;
|
|
Packit |
577717 |
pmrs[i].reg_value = pmcs[i].reg_value;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
ret = pfm_write(fd, 0, PFM_RW_PMC, pmrs, sz);
|
|
Packit |
577717 |
errno_save = errno;
|
|
Packit |
577717 |
free(pmrs);
|
|
Packit |
577717 |
errno = errno_save;
|
|
Packit |
577717 |
return ret;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
pfm_write_pmds_2v3(int fd, pfarg_pmd_t *pmds, int count)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
pfarg_pmd_attr_t *pmas;
|
|
Packit |
577717 |
size_t sz;
|
|
Packit |
577717 |
int errno_save;
|
|
Packit |
577717 |
int i, ret;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
sz = count * sizeof(*pmas);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (!pmds)
|
|
Packit |
577717 |
return pfm_write(fd, 0, PFM_RW_PMD, NULL, sz);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
pmas = calloc(count, sizeof(*pmas));
|
|
Packit |
577717 |
if (!pmas) {
|
|
Packit |
577717 |
errno = ENOMEM;
|
|
Packit |
577717 |
return -1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for (i=0 ; i < count; i++) {
|
|
Packit |
577717 |
pmas[i].reg_num = pmds[i].reg_num;
|
|
Packit |
577717 |
pmas[i].reg_set = pmds[i].reg_set;
|
|
Packit |
577717 |
pmas[i].reg_flags = pmds[i].reg_flags;
|
|
Packit |
577717 |
pmas[i].reg_value = pmds[i].reg_value;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
pmas[i].reg_long_reset = pmds[i].reg_long_reset;
|
|
Packit |
577717 |
pmas[i].reg_short_reset = pmds[i].reg_short_reset;
|
|
Packit |
577717 |
/* skip last_value not used on write */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
pmas[i].reg_ovfl_swcnt = pmds[i].reg_ovfl_switch_cnt;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
memcpy(pmas[i].reg_smpl_pmds, pmds[i].reg_smpl_pmds, sizeof(pmds[i].reg_smpl_pmds));
|
|
Packit |
577717 |
memcpy(pmas[i].reg_reset_pmds, pmds[i].reg_reset_pmds, sizeof(pmds[i].reg_reset_pmds));
|
|
Packit |
577717 |
|
|
Packit |
577717 |
pmas[i].reg_smpl_eventid = pmds[i].reg_smpl_eventid;
|
|
Packit |
577717 |
pmas[i].reg_random_mask = pmds[i].reg_random_mask;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
ret = pfm_write(fd, 0, PFM_RW_PMD_ATTR, pmas, sz);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
errno_save = errno;
|
|
Packit |
577717 |
free(pmas);
|
|
Packit |
577717 |
errno = errno_save;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return ret;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
pfm_read_pmds_2v3(int fd, pfarg_pmd_t *pmds, int count)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
pfarg_pmd_attr_t *pmas;
|
|
Packit |
577717 |
int errno_save;
|
|
Packit |
577717 |
int i, ret;
|
|
Packit |
577717 |
size_t sz;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
sz = count * sizeof(*pmas);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (!pmds)
|
|
Packit |
577717 |
return pfm_write(fd, 0, PFM_RW_PMD, NULL, sz);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
pmas = calloc(count, sizeof(*pmas));
|
|
Packit |
577717 |
if (!pmas) {
|
|
Packit |
577717 |
errno = ENOMEM;
|
|
Packit |
577717 |
return -1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for (i=0 ; i < count; i++) {
|
|
Packit |
577717 |
pmas[i].reg_num = pmds[i].reg_num;
|
|
Packit |
577717 |
pmas[i].reg_set = pmds[i].reg_set;
|
|
Packit |
577717 |
pmas[i].reg_flags = pmds[i].reg_flags;
|
|
Packit |
577717 |
pmas[i].reg_value = pmds[i].reg_value;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
ret = pfm_read(fd, 0, PFM_RW_PMD_ATTR, pmas, sz);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
errno_save = errno;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for (i=0 ; i < count; i++) {
|
|
Packit |
577717 |
pmds[i].reg_value = pmas[i].reg_value;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
pmds[i].reg_long_reset = pmas[i].reg_long_reset;
|
|
Packit |
577717 |
pmds[i].reg_short_reset = pmas[i].reg_short_reset;
|
|
Packit |
577717 |
pmds[i].reg_last_reset_val = pmas[i].reg_last_value;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
pmds[i].reg_ovfl_switch_cnt = pmas[i].reg_ovfl_swcnt;
|
|
Packit |
577717 |
/* skip reg_smpl_pmds */
|
|
Packit |
577717 |
/* skip reg_reset_pmds */
|
|
Packit |
577717 |
/* skip reg_smpl_eventid */
|
|
Packit |
577717 |
/* skip reg_random_mask */
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
free(pmas);
|
|
Packit |
577717 |
errno = errno_save;
|
|
Packit |
577717 |
return ret;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
pfm_load_context_2v3(int fd, pfarg_load_t *load)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
if (!load) {
|
|
Packit |
577717 |
errno = EINVAL;
|
|
Packit |
577717 |
return -1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
return pfm_attach(fd, 0, load->load_pid);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
pfm_start_2v3(int fd, pfarg_start_t *start)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
if (start) {
|
|
Packit |
577717 |
__pfm_vbprintf("pfarg_start_t not supported in v3.x\n");
|
|
Packit |
577717 |
errno = EINVAL;
|
|
Packit |
577717 |
return -1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
return pfm_set_state(fd, 0, PFM_ST_START);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
pfm_stop_2v3(int fd)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
return pfm_set_state(fd, 0, PFM_ST_STOP);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
pfm_restart_2v3(int fd)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
return pfm_set_state(fd, 0, PFM_ST_RESTART);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
pfm_create_evtsets_2v3(int fd, pfarg_setdesc_t *setd, int count)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
/* set_desc an setdesc are identical so we can cast */
|
|
Packit |
577717 |
return pfm_create_sets(fd, 0, (pfarg_set_desc_t *)setd, count * sizeof(pfarg_setdesc_t));
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
pfm_delete_evtsets_2v3(int fd, pfarg_setdesc_t *setd, int count)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
__pfm_vbprintf("pfm_delete_evtsets not supported in v3.x\n");
|
|
Packit |
577717 |
errno = EINVAL;
|
|
Packit |
577717 |
return -1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
pfm_getinfo_evtsets_2v3(int fd, pfarg_setinfo_t *info, int count)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
pfarg_sinfo_t cinfo;
|
|
Packit |
577717 |
pfarg_set_info_t *sif;
|
|
Packit |
577717 |
int fdx, i, ret, errno_save;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (!info) {
|
|
Packit |
577717 |
errno = EFAULT;
|
|
Packit |
577717 |
return -1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* initialize bitmask to all available and defer checking
|
|
Packit |
577717 |
* until kernel. That means libpfm must be misled but we
|
|
Packit |
577717 |
* have no other way of fixing this
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
memset(&cinfo, -1, sizeof(cinfo));
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* XXX: relies on the fact that cinfo is independent
|
|
Packit |
577717 |
* of the session type (which is wrong in the future)
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
fdx = pfm_create(0, &cinfo);
|
|
Packit |
577717 |
if (fdx > -1)
|
|
Packit |
577717 |
close(fdx);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
sif = calloc(count, sizeof(*sif));
|
|
Packit |
577717 |
if (!sif) {
|
|
Packit |
577717 |
errno = ENOMEM;
|
|
Packit |
577717 |
return -1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for (i=0 ; i < count; i++)
|
|
Packit |
577717 |
sif[i].set_id = info[i].set_id;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
ret = pfm_getinfo_sets(fd, 0, sif, count * sizeof(pfarg_set_info_t));
|
|
Packit |
577717 |
errno_save = errno;
|
|
Packit |
577717 |
if (ret)
|
|
Packit |
577717 |
goto skip;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for (i=0 ; i < count; i++) {
|
|
Packit |
577717 |
info[i].set_flags = 0;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
memcpy(info[i].set_ovfl_pmds,
|
|
Packit |
577717 |
sif[i].set_ovfl_pmds,
|
|
Packit |
577717 |
sizeof(info[i].set_ovfl_pmds));
|
|
Packit |
577717 |
|
|
Packit |
577717 |
info[i].set_runs = sif[i].set_runs;
|
|
Packit |
577717 |
info[i].set_timeout = sif[i].set_timeout;
|
|
Packit |
577717 |
info[i].set_act_duration = sif[i].set_duration;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
memcpy(info[i].set_avail_pmcs,
|
|
Packit |
577717 |
cinfo.sif_avail_pmcs,
|
|
Packit |
577717 |
sizeof(info[i].set_avail_pmcs));
|
|
Packit |
577717 |
|
|
Packit |
577717 |
memcpy(info[i].set_avail_pmds,
|
|
Packit |
577717 |
cinfo.sif_avail_pmds,
|
|
Packit |
577717 |
sizeof(info[i].set_avail_pmds));
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
skip:
|
|
Packit |
577717 |
free(sif);
|
|
Packit |
577717 |
errno = errno_save;
|
|
Packit |
577717 |
return ret;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
pfm_unload_context_2v3(int fd)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
return pfm_attach(fd, 0, PFM_NO_TARGET);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#else /* PFMLIB_OLD_PFMV2 */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
pfm_create_context_2v3(pfarg_ctx_t *ctx, char *name, void *smpl_arg, size_t smpl_size)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
return -1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
pfm_write_pmcs_2v3(int fd, pfarg_pmc_t *pmcs, int count)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
return -1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
pfm_write_pmds_2v3(int fd, pfarg_pmd_t *pmds, int count)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
return -1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
pfm_read_pmds_2v3(int fd, pfarg_pmd_t *pmds, int count)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
return -1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
pfm_load_context_2v3(int fd, pfarg_load_t *load)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
return -1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
pfm_start_2v3(int fd, pfarg_start_t *start)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
return -1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
pfm_stop_2v3(int fd)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
return -1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
pfm_restart_2v3(int fd)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
return -1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
pfm_create_evtsets_2v3(int fd, pfarg_setdesc_t *setd, int count)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
return -1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
pfm_delete_evtsets_2v3(int fd, pfarg_setdesc_t *setd, int count)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
return -1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
pfm_getinfo_evtsets_2v3(int fd, pfarg_setinfo_t *info, int count)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
return -1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
pfm_unload_context_2v3(int fd)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
return -1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
#endif /* PFMLIB_OLD_PFMV2 */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
pfm_load_context(int fd, pfarg_load_t *load)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
if (_pfmlib_major_version < 3)
|
|
Packit |
577717 |
return (int)syscall(PFM_pfm_load_context, fd, load);
|
|
Packit |
577717 |
return pfm_load_context_2v3(fd, load);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
pfm_start(int fd, pfarg_start_t *start)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
if (_pfmlib_major_version < 3)
|
|
Packit |
577717 |
return (int)syscall(PFM_pfm_start, fd, start);
|
|
Packit |
577717 |
return pfm_start_2v3(fd, start);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
pfm_stop(int fd)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
if (_pfmlib_major_version < 3)
|
|
Packit |
577717 |
return (int)syscall(PFM_pfm_stop, fd);
|
|
Packit |
577717 |
return pfm_stop_2v3(fd);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
pfm_restart(int fd)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
if (_pfmlib_major_version < 3)
|
|
Packit |
577717 |
return (int)syscall(PFM_pfm_restart, fd);
|
|
Packit |
577717 |
return pfm_restart_2v3(fd);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
pfm_create_evtsets(int fd, pfarg_setdesc_t *setd, int count)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
if (_pfmlib_major_version < 3)
|
|
Packit |
577717 |
return (int)syscall(PFM_pfm_create_evtsets, fd, setd, count);
|
|
Packit |
577717 |
return pfm_create_evtsets_2v3(fd, setd, count);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
pfm_delete_evtsets(int fd, pfarg_setdesc_t *setd, int count)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
if (_pfmlib_major_version < 3)
|
|
Packit |
577717 |
return (int)syscall(PFM_pfm_delete_evtsets, fd, setd, count);
|
|
Packit |
577717 |
return pfm_delete_evtsets_2v3(fd, setd, count);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
pfm_getinfo_evtsets(int fd, pfarg_setinfo_t *info, int count)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
if (_pfmlib_major_version < 3)
|
|
Packit |
577717 |
return (int)syscall(PFM_pfm_getinfo_evtsets, fd, info, count);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return pfm_getinfo_evtsets_2v3(fd, info, count);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
pfm_unload_context(int fd)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
if (_pfmlib_major_version < 3)
|
|
Packit |
577717 |
return (int)syscall(PFM_pfm_unload_context, fd);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return pfm_unload_context_2v3(fd);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
pfm_create_context(pfarg_ctx_t *ctx, char *name, void *smpl_arg, size_t smpl_size)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
if (_pfmlib_major_version < 3) {
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* In perfmon v2.2, the pfm_create_context() call had a
|
|
Packit |
577717 |
* different return value. It used to return errno, in v2.3
|
|
Packit |
577717 |
* it returns the file descriptor.
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
if (_pfmlib_minor_version < 3) {
|
|
Packit |
577717 |
int r;
|
|
Packit |
577717 |
pfarg_ctx22_t ctx22;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* transfer the v2.3 contents to v2.2 for sys call */
|
|
Packit |
577717 |
memset (&ctx22, 0, sizeof(ctx22));
|
|
Packit |
577717 |
if (name != NULL) {
|
|
Packit |
577717 |
memcpy (ctx22.ctx_smpl_buf_id, name, 16);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
ctx22.ctx_flags = ctx->ctx_flags;
|
|
Packit |
577717 |
/* ctx22.ctx_fd returned */
|
|
Packit |
577717 |
/* ctx22.ctx_smpl_buf_size returned */
|
|
Packit |
577717 |
memcpy (ctx22.ctx_reserved3, &ctx->ctx_reserved1, 64);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
r = syscall (PFM_pfm_create_context, &ctx22, smpl_arg, smpl_size);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* transfer the v2.2 contents back to v2.3 */
|
|
Packit |
577717 |
ctx->ctx_flags = ctx22.ctx_flags;
|
|
Packit |
577717 |
memcpy (&ctx->ctx_reserved1, ctx22.ctx_reserved3, 64);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return (r < 0 ? r : ctx22.ctx_fd);
|
|
Packit |
577717 |
} else {
|
|
Packit |
577717 |
return (int)syscall(PFM_pfm_create_context, ctx, name, smpl_arg, smpl_size);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
return pfm_create_context_2v3(ctx, name, smpl_arg, smpl_size);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
pfm_write_pmcs(int fd, pfarg_pmc_t *pmcs, int count)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
if (_pfmlib_major_version < 3)
|
|
Packit |
577717 |
return (int)syscall(PFM_pfm_write_pmcs, fd, pmcs, count);
|
|
Packit |
577717 |
return pfm_write_pmcs_2v3(fd, pmcs, count);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
pfm_write_pmds(int fd, pfarg_pmd_t *pmds, int count)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
if (_pfmlib_major_version < 3)
|
|
Packit |
577717 |
return (int)syscall(PFM_pfm_write_pmds, fd, pmds, count);
|
|
Packit |
577717 |
return pfm_write_pmds_2v3(fd, pmds, count);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
pfm_read_pmds(int fd, pfarg_pmd_t *pmds, int count)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
if (_pfmlib_major_version < 3)
|
|
Packit |
577717 |
return (int)syscall(PFM_pfm_read_pmds, fd, pmds, count);
|
|
Packit |
577717 |
return pfm_read_pmds_2v3(fd, pmds, count);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#ifdef __ia64__
|
|
Packit |
577717 |
#define __PFMLIB_OS_COMPILE
|
|
Packit |
577717 |
#include <perfmon/pfmlib.h>
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* this is the old perfmon2 interface, maintained for backward
|
|
Packit |
577717 |
* compatibility reasons with older applications. This is for IA-64 ONLY.
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
perfmonctl(int fd, int cmd, void *arg, int narg)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
return syscall(__NR_perfmonctl, fd, cmd, arg, narg);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
#endif /* __ia64__ */
|