7#include <sys/utsname.h>
31#define START_OF_TEXT &_text
32#define END_OF_TEXT &_etext
33#define START_OF_DATA &_data
34#define END_OF_DATA &_edata
35#define START_OF_BSS &_edata
36#define END_OF_BSS &_end
76 for ( gnum = 0; gnum <
pmgroups.maxgroups; gnum++ ) {
78 pmgroups.event_groups[gnum].events[j] ) {
83 1 << (
pmgroups.event_groups[gnum].group_id % 32 );
90 for ( gnum = 0; gnum <
pmgroups.maxgroups; gnum++ ) {
94 fprintf(
stderr,
"ERROR, group number trying to go past MAX GROUPS\n");
110 int pmc, ev,
i, j, index;
115 for ( pmc = 0; pmc < info->maxpmcs; pmc++ ) {
116 wevp = info->list_events[pmc];
117 for ( ev = 0; ev < info->maxevents[pmc]; ev++, wevp++ ) {
118 for (
i = 0;
i < index;
i++ ) {
150 strncpy(
names, nam, len );
151 names[len - 1] =
'\0';
162 int i, j, group = -1;
166 map[
i] = event_list[0].ra_group[
i];
168 for (
i = 1;
i < size;
i++ ) {
170 map[j] &= event_list[
i].ra_group[j];
175 group = ffs( map[
i] ) - 1 +
i * 32;
183 for (
i = 0;
i < size;
i++ ) {
185 if ( event_list[
i].ra_counter_cmd[j] >= 0
186 && event_list[
i].ra_counter_cmd[j] ==
204 unsigned char selector;
205 int i, j, natNum, index;
215 for (
i = 0;
i < natNum;
i++ ) {
242 this_state->group_id = group;
243 for (
i = 0;
i < natNum;
i++ )
278 this_state->
counter_cmd.events[0] = this_state->group_id;
337 index].description, len );
342 description ) > len - 1 )
376 *EventCode = *EventCode + 1;
381#if defined(_POWER5) || defined(_POWER6)
384 int index = *EventCode & 0x000000FF;
388 *EventCode = *EventCode & ( ~PAPI_NTV_GROUP_SHIFT );
392 while ( ( ffs( tmpg ) +
i * 32 ) <= group && tmpg != 0 )
393 tmpg = tmpg ^ ( 1 << ( ffs( tmpg ) - 1 ) );
396 group = ffs( tmpg ) +
i * 32;
426#ifdef _AIXVERSION_510
427 if (
pminfo.proc_feature.b.hypervisor ) {
438 pm_mode_t *mode = &( this_state->
counter_cmd.mode );
452#ifdef _AIXVERSION_510
455 mode->b.hypervisor = 1;
488 pm_mode_t *mode = &( this_state->
counter_cmd.mode );
493 mode->b.proctree = 0;
532 if (
AixVer.version[0] ==
'4' ) {
564 struct procsinfo psi = { 0 };
578 if ( realpath( maxargs, pname ) )
586 basename( maxargs ) );
591#elif defined(_POWER6)
597#ifdef _AIXVERSION_510
599 SUBDBG(
"Calling AIX 5 version of pm_initialize...\n" );
605 SUBDBG(
"Calling AIX 5 version of pm_init...\n" );
610 SUBDBG(
"Calling AIX 4 version of pm_init...\n" );
614 SUBDBG(
"...Back from pm_init\n" );
631 ( float ) _system_configuration.version;
659 read_real_time( &t, TIMEBASE_SZ );
660 time_base_to_time( &t, TIMEBASE_SZ );
661 retval = ( t.tb_high * 1000000 ) + t.tb_low / 1000;
679 SUBDBG(
"user %d system %d\n", (
int ) buffer.tms_utime,
680 (
int ) buffer.tms_stime );
682 (
long long ) ( ( buffer.tms_utime + buffer.tms_stime ) *
683 ( 1000000 / CLK_TCK ) );
716 SUBDBG(
"Found %d %s %s CPUs at %d Mhz.\n",
725 procidx = pm_get_procindex( );
743 fprintf(
stderr,
"%s is not supported!\n",
pminfo.proc_name );
771 tmp =
i & cntr_avail_bits;
785 useme = ( 1 <<
i ) & selector;
797 SUBDBG(
"mode.b.threshold %d\n", t->mode.b.threshold );
798 SUBDBG(
"mode.b.spare %d\n", t->mode.b.spare );
799 SUBDBG(
"mode.b.process %d\n", t->mode.b.process );
800 SUBDBG(
"mode.b.kernel %d\n", t->mode.b.kernel );
801 SUBDBG(
"mode.b.user %d\n", t->mode.b.user );
802 SUBDBG(
"mode.b.count %d\n", t->mode.b.count );
803 SUBDBG(
"mode.b.proctree %d\n", t->mode.b.proctree );
804 SUBDBG(
"events[0] %d\n", t->events[0] );
805 SUBDBG(
"events[1] %d\n", t->events[1] );
806 SUBDBG(
"events[2] %d\n", t->events[2] );
807 SUBDBG(
"events[3] %d\n", t->events[3] );
808 SUBDBG(
"events[4] %d\n", t->events[4] );
809 SUBDBG(
"events[5] %d\n", t->events[5] );
810 SUBDBG(
"events[6] %d\n", t->events[6] );
811 SUBDBG(
"events[7] %d\n", t->events[7] );
812 SUBDBG(
"reserved %d\n", t->reserved );
821 SUBDBG(
"counter[%d] = %lld\n",
i, vals[
i] );
829 int retval = pm_reset_data_mythread( );
832 pm_error(
"PAPI Error: pm_reset_data_mythread",
retval );
841 long long **vals,
int flags )
845 retval = pm_get_data_mythread( &spc->state );
848 pm_error(
"PAPI Error: pm_get_data_mythread",
retval );
852 *vals = spc->state.accu;
958 location = (
void * ) info->sc_jmpbuf.jmp_context.iar;
979 SUBDBG(
"Copying states\n" );
985 retval = pm_delete_program_mythread( );
988 pm_error(
"PAPI Error: pm_delete_program_mythread",
995 pm_error(
"PAPI Error: pm_set_program_mythread",
retval );
1000 pm_error(
"PAPI Error: pm_set_program_mythread",
retval );
1013 retval = pm_start_mythread( );
1016 pm_error(
"pm_start_mythread()",
retval );
1028 retval = pm_stop_mythread( );
1031 pm_error(
"pm_stop_mythread()",
retval );
1035 retval = pm_delete_program_mythread( );
1038 pm_error(
"pm_delete_program_mythread()",
retval );
1048#if ( ( defined( _AIXVERSION_510) || defined(_AIXVERSION_520)))
1055 MA_MAINEXEC,
"MAINEXEC"}, {
1056 MA_KERNTEXT,
"KERNTEXT"}, {
1058 MA_WRITE,
"WRITE"}, {
1060 MA_SHARED,
"SHARED"}, {
1061 MA_BREAK,
"BREAK"}, {
1062 MA_STACK,
"STACK"},};
1069 prmap_t *tmp1 = NULL;
1072 sprintf( fname,
"/proc/%d/map", getpid( ) );
1073 map_f = fopen( fname,
"r" );
1075 PAPIERROR(
"fopen(%s) returned < 0", fname );
1082 while ( (
retval =
fread( &newp,
sizeof ( prmap_t ), 1, map_f ) ) > 0 ) {
1083 if ( newp.pr_pathoff > 0 && newp.pr_mapname[0] !=
'\0' ) {
1084 if ( newp.pr_mflags & MA_STACK )
1089 newp.pr_pathoff, newp.pr_mapname );
1091 if ( ( newp.pr_mflags & MA_READ ) && ( newp.pr_mflags & MA_EXEC ) )
1108 while ( (
retval =
fread( &tmp1[
i],
sizeof ( prmap_t ), 1, map_f ) ) > 0 ) {
1109 if ( tmp1[
i].pr_pathoff > 0 && tmp1[
i].pr_mapname[0] !=
'\0' )
1110 if ( !( tmp1[
i].pr_mflags & MA_STACK ) )
1117 retval = fseek( map_f, tmp1[
i].pr_pathoff, SEEK_SET );
1120 while ( fscanf( map_f,
"%c", &
c ) != EOF ) {
1132 basename(
name ), cc - 1 ) == 0 ) {
1136 (
"executable name too long (%d char). Match of first %d char only",
1140 if ( tmp1[
i].pr_mflags & MA_READ ) {
1141 if ( tmp1[
i].pr_mflags & MA_EXEC ) {
1143 text_start = (
vptr_t ) tmp1[
i].pr_vaddr;
1146 (
vptr_t ) ( tmp1[
i].pr_vaddr + tmp1[
i].pr_size );
1147 }
else if ( tmp1[
i].pr_mflags & MA_WRITE ) {
1149 data_start = (
vptr_t ) tmp1[
i].pr_vaddr;
1152 (
vptr_t ) ( tmp1[
i].pr_vaddr + tmp1[
i].pr_size );
1163 PAPIERROR(
"executable name not recognized" );
1165 if ( tmp1[
i].pr_mflags & MA_READ ) {
1166 if ( tmp1[
i].pr_mflags & MA_EXEC ) {
1170 (
vptr_t ) ( tmp1[
i].pr_vaddr + tmp1[
i].pr_size );
1172 }
else if ( tmp1[
i].pr_mflags & MA_WRITE ) {
1175 (
vptr_t ) ( tmp1[
i].pr_vaddr + tmp1[
i].pr_size );
1215 struct utsname uname_buffer;
1217 uname(&uname_buffer);
1238 .description =
"AIX pmapi CPU counters",
1246 .fast_real_timer = 1,
1247 .fast_virtual_timer = 1,
1249 .attach_must_ptrace = 1,
#define GET_OVERFLOW_ADDRESS(ctx)
int _aix_get_memory_info(PAPI_hw_info_t *mem_info, int type)
int _aix_get_dmem_info(PAPI_dmem_info_t *d)
int _aix_reset(hwd_context_t *ESI, hwd_control_state_t *zero)
int _aix_init_component(int cidx)
int _aix_start(hwd_context_t *ctx, hwd_control_state_t *cntrl)
int _aix_update_shlib_info(papi_mdi_t *mdi)
int _aix_ntv_name_to_code(const char *name, unsigned int *evtcode)
pm_groups_info_t pmgroups
atomic_p lock[PAPI_MAX_LOCK]
long long _aix_get_real_cycles(void)
int _aix_ntv_code_to_descr(unsigned int EventCode, char *ntv_descr, int len)
static void set_hwcntr_codes(int selector, unsigned char *from, int *to)
int _aix_init_thread(hwd_context_t *context)
hwd_groups_t group_map[MAX_GROUPS]
void * _aix_get_overflow_address(void *context)
PPC64_native_map_t native_name_map[PAPI_MAX_NATIVE_EVENTS]
int _aix_set_granularity(hwd_control_state_t *this_state, int domain)
static int _aix_set_domain(hwd_control_state_t *this_state, int domain)
int _aix_ctl(hwd_context_t *ctx, int code, _papi_int_option_t *option)
static int set_default_granularity(EventSetInfo_t *zero, int granularity)
long long _aix_get_virt_usec(void)
int _aix_set_overflow(EventSetInfo_t *ESI, int EventIndex, int threshold)
int _aix_read(hwd_context_t *ctx, hwd_control_state_t *spc, long long **vals, int flags)
static void unset_config(hwd_control_state_t *ptr, int arg1)
int _aix_init_control_state(hwd_control_state_t *ptr)
volatile int lock_var[PAPI_MAX_LOCK]
int _papi_hwi_init_os(void)
int _aix_ntv_enum_events(unsigned int *EventCode, int modifier)
papi_vector_t _aix_vector
native_event_entry_t native_table[PAPI_MAX_NATIVE_EVENTS]
void aix_initialize_native_table()
static void aix_ppc64_setup_gps(int total)
PAPI_os_info_t _papi_os_info
static void copy_value(unsigned int val, char *nam, char *names, unsigned int *values, int len)
void dump_cmd(pm_prog_t *t)
static int set_default_domain(EventSetInfo_t *zero, int domain)
static int do_counter_allocation(ppc64_reg_alloc_t *event_list, int size)
int _aix_stop(hwd_context_t *ctx, hwd_control_state_t *cntrl)
int _aix_ntv_code_to_name(unsigned int EventCode, char *ntv_name, int len)
static int round_requested_ns(int ns)
static void set_config(hwd_control_state_t *ptr, int arg1, int arg2)
long long _aix_get_real_usec(void)
int _aix_shutdown_thread(hwd_context_t *ctx)
static void _aix_lock_init(void)
void _aix_dispatch_timer(int signal, siginfo_t *si, void *i)
static char * trim_string(char *in)
int aix_ppc64_setup_native_table()
int _aix_update_control_state(hwd_control_state_t *this_state, NativeInfo_t *native, int count, hwd_context_t *context)
static int get_avail_hwcntr_bits(int cntr_avail_bits)
int _aix_allocate_registers(EventSetInfo_t *ESI)
void dump_data(long long *vals)
papi_os_vector_t _papi_os_vector
int _aix_ntv_code_to_bits(unsigned int EventCode, hwd_register_t *bits)
static int _aix_get_system_info(papi_mdi_t *mdi)
pm_events_t hwd_pmevents_t
#define POWER_MAX_COUNTERS
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
const char * names[NUM_EVENTS]
#define PAPI_MAX_NATIVE_EVENTS
#define PAPI_NTV_GROUP_AND_MASK
#define PAPI_DOM_SUPERVISOR
#define PAPI_NTV_GROUP_SHIFT
#define PAPI_HUGE_STR_LEN
#define PAPI_DEF_ITIMER_NS
static long long values[NUM_EVENTS]
static struct timeval start
static double c[MATRIX_SIZE][MATRIX_SIZE]
#define PAPI_NATIVE_AND_MASK
Return codes and api definitions.
#define SUBDBG(format, args...)
__sighandler_t signal(int __sig, __sighandler_t __handler) __attribute__((__nothrow__
int fclose(FILE *__stream)
void PAPIERROR(char *format,...)
int _papi_hwi_error_level
#define PAPI_INT_MPX_SIGNAL
#define PAPI_INT_MPX_DEF_US
#define papi_calloc(a, b)
int _papi_load_preset_table(char *pmu_str, int pmu_type, int cidx)
papi_mdi_t _papi_hwi_system_info
static int set_inherit(int arg)
hwd_control_state_t * ctl_state
NativeInfo_t * NativeInfoArray
get the executable's address space info
char name[PAPI_HUGE_STR_LEN]
int available_granularities
char name[PAPI_MAX_STR_LEN]
char fullname[PAPI_HUGE_STR_LEN]
PAPI_address_map_t address_info
char vendor_string[PAPI_MAX_STR_LEN]
char model_string[PAPI_MAX_STR_LEN]
char version[PAPI_MAX_STR_LEN]
char name[PAPI_MAX_STR_LEN]
unsigned int counter_cmd[MAX_COUNTERS]
hwd_ucontext_t * ucontext
papi_cpc_event_t counter_cmd
char name[PAPI_MAX_STR_LEN]
PAPI_shlib_info_t shlib_info
int(* get_system_info)(papi_mdi_t *mdi)
int(* get_memory_info)(PAPI_hw_info_t *, int)
PAPI_component_info_t cmp_info
int(* set_domain)(hwd_control_state_t *, int)
int ra_counter_cmd[MAX_COUNTERS]
unsigned int ra_group[GROUP_INTS]
_papi_int_domain_t domain
_papi_int_multiplex_t multiplex
_papi_int_granularity_t granularity
_papi_int_inherit_t inherit
_papi_int_itimer_t itimer