Blame src/papi_libpfm4_events.c

Packit Service a1973e
/*
Packit Service a1973e
* File:    papi_libpfm4_events.c
Packit Service a1973e
* Author:  Vince Weaver vincent.weaver @ maine.edu
Packit Service a1973e
*          based heavily on existing papi_libpfm3_events.c
Packit Service a1973e
*/
Packit Service a1973e
Packit Service a1973e
#include <string.h>
Packit Service a1973e
Packit Service a1973e
#include "papi.h"
Packit Service a1973e
#include "papi_internal.h"
Packit Service a1973e
#include "papi_vector.h"
Packit Service a1973e
Packit Service a1973e
#include "papi_libpfm4_events.h"
Packit Service a1973e
Packit Service a1973e
#include "perfmon/pfmlib.h"
Packit Service a1973e
#include "perfmon/pfmlib_perf_event.h"
Packit Service a1973e
Packit Service a1973e
/**********************************************************/
Packit Service a1973e
/* Local scope globals                                    */
Packit Service a1973e
/**********************************************************/
Packit Service a1973e
Packit Service a1973e
static int libpfm4_users=0;
Packit Service a1973e
Packit Service a1973e
/***********************************************************/
Packit Service a1973e
/* Exported functions                                      */
Packit Service a1973e
/***********************************************************/
Packit Service a1973e
Packit Service a1973e
/** @class  _papi_libpfm4_error
Packit Service a1973e
 *  @brief  convert libpfm error codes to PAPI error codes
Packit Service a1973e
 *
Packit Service a1973e
 *  @param[in] pfm_error
Packit Service a1973e
 *             -- a libpfm4 error code
Packit Service a1973e
 *
Packit Service a1973e
 *  @returns returns a PAPI error code
Packit Service a1973e
 *
Packit Service a1973e
 */
Packit Service a1973e
Packit Service a1973e
int
Packit Service a1973e
_papi_libpfm4_error( int pfm_error ) {
Packit Service a1973e
Packit Service a1973e
  switch ( pfm_error ) {
Packit Service a1973e
  case PFM_SUCCESS:      return PAPI_OK;       /* success */
Packit Service a1973e
  case PFM_ERR_NOTSUPP:  return PAPI_ENOSUPP;  /* function not supported */
Packit Service a1973e
  case PFM_ERR_INVAL:    return PAPI_EINVAL;   /* invalid parameters */
Packit Service a1973e
  case PFM_ERR_NOINIT:   return PAPI_ENOINIT;  /* library not initialized */
Packit Service a1973e
  case PFM_ERR_NOTFOUND: return PAPI_ENOEVNT;  /* event not found */
Packit Service a1973e
  case PFM_ERR_FEATCOMB: return PAPI_ECOMBO;   /* invalid combination of features */
Packit Service a1973e
  case PFM_ERR_UMASK:    return PAPI_EATTR;    /* invalid or missing unit mask */
Packit Service a1973e
  case PFM_ERR_NOMEM:    return PAPI_ENOMEM;   /* out of memory */
Packit Service a1973e
  case PFM_ERR_ATTR:     return PAPI_EATTR;    /* invalid event attribute */
Packit Service a1973e
  case PFM_ERR_ATTR_VAL: return PAPI_EATTR;    /* invalid event attribute value */
Packit Service a1973e
  case PFM_ERR_ATTR_SET: return PAPI_EATTR;    /* attribute value already set */
Packit Service a1973e
  case PFM_ERR_TOOMANY:  return PAPI_ECOUNT;   /* too many parameters */
Packit Service a1973e
  case PFM_ERR_TOOSMALL: return PAPI_ECOUNT;   /* parameter is too small */
Packit Service a1973e
  default:
Packit Service a1973e
	PAPIWARN("Unknown libpfm error code %d, returning PAPI_EINVAL",pfm_error);
Packit Service a1973e
	return PAPI_EINVAL;
Packit Service a1973e
  }
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
/** @class  _papi_libpfm4_shutdown
Packit Service a1973e
 *  @brief  Shutdown any initialization done by the libpfm4 code
Packit Service a1973e
 *
Packit Service a1973e
 *  @param[in] component
Packit Service a1973e
 *        -- component doing the shutdown
Packit Service a1973e
 *
Packit Service a1973e
 *  @retval PAPI_OK       Success
Packit Service a1973e
 *
Packit Service a1973e
 */
Packit Service a1973e
Packit Service a1973e
int
Packit Service a1973e
_papi_libpfm4_shutdown(papi_vector_t *my_vector) {
Packit Service a1973e
Packit Service a1973e
	/* clean out and free the native events structure */
Packit Service a1973e
	_papi_hwi_lock( NAMELIB_LOCK );
Packit Service a1973e
Packit Service a1973e
	libpfm4_users--;
Packit Service a1973e
Packit Service a1973e
	/* Only free if we're the last user */
Packit Service a1973e
Packit Service a1973e
	if (!libpfm4_users) {
Packit Service a1973e
		pfm_terminate();
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	_papi_hwi_unlock( NAMELIB_LOCK );
Packit Service a1973e
Packit Service a1973e
	strcpy(my_vector->cmp_info.support_version,"");
Packit Service a1973e
Packit Service a1973e
	return PAPI_OK;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
/** @class  _papi_libpfm4_init
Packit Service a1973e
 *  @brief  Initialize the libpfm4 code
Packit Service a1973e
 *
Packit Service a1973e
 *  @param[in] my_vector
Packit Service a1973e
 *        -- vector of the component doing the initialization
Packit Service a1973e
 *
Packit Service a1973e
 *  @retval PAPI_OK       Success
Packit Service a1973e
 *  @retval PAPI_ECMP     There was an error initializing
Packit Service a1973e
 *
Packit Service a1973e
 */
Packit Service a1973e
Packit Service a1973e
int
Packit Service a1973e
_papi_libpfm4_init(papi_vector_t *my_vector) {
Packit Service a1973e
Packit Service a1973e
	int version;
Packit Service a1973e
	pfm_err_t retval = PFM_SUCCESS;
Packit Service a1973e
Packit Service a1973e
	_papi_hwi_lock( NAMELIB_LOCK );
Packit Service a1973e
Packit Service a1973e
	if (!libpfm4_users) {
Packit Service a1973e
		retval = pfm_initialize();
Packit Service a1973e
		if ( retval == PFM_SUCCESS ) {
Packit Service a1973e
			libpfm4_users++;
Packit Service a1973e
		}
Packit Service a1973e
		else {
Packit Service a1973e
			strncpy(my_vector->cmp_info.disabled_reason,
Packit Service a1973e
				pfm_strerror(retval),PAPI_MAX_STR_LEN);
Packit Service a1973e
			_papi_hwi_unlock( NAMELIB_LOCK );
Packit Service a1973e
			return PAPI_ESBSTR;
Packit Service a1973e
		}
Packit Service a1973e
	}
Packit Service a1973e
	else {
Packit Service a1973e
		libpfm4_users++;
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	_papi_hwi_unlock( NAMELIB_LOCK );
Packit Service a1973e
Packit Service a1973e
	/* get the libpfm4 version */
Packit Service a1973e
Packit Service a1973e
	version=pfm_get_version( );
Packit Service a1973e
	if (version >= 0) {
Packit Service a1973e
Packit Service a1973e
		/* Complain if the compiled-against version */
Packit Service a1973e
		/* doesn't match current version            */
Packit Service a1973e
Packit Service a1973e
		if ( PFM_MAJ_VERSION( version ) !=
Packit Service a1973e
			PFM_MAJ_VERSION( LIBPFM_VERSION ) ) {
Packit Service a1973e
Packit Service a1973e
			PAPIWARN( "Version mismatch of libpfm: "
Packit Service a1973e
				"compiled %#x vs. installed %#x\n",
Packit Service a1973e
				PFM_MAJ_VERSION( LIBPFM_VERSION ),
Packit Service a1973e
				PFM_MAJ_VERSION( version ) );
Packit Service a1973e
Packit Service a1973e
		}
Packit Service a1973e
Packit Service a1973e
		/* Set the version */
Packit Service a1973e
		sprintf( my_vector->cmp_info.support_version, "%d.%d",
Packit Service a1973e
			PFM_MAJ_VERSION( version ),
Packit Service a1973e
			PFM_MIN_VERSION( version ) );
Packit Service a1973e
Packit Service a1973e
	} else {
Packit Service a1973e
		PAPIWARN( "pfm_get_version(): %s", pfm_strerror( retval ) );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	return PAPI_OK;
Packit Service a1973e
}