133 {
134
135 SUBDBG(
"ENTER: name: %s, libpfm4_index: %#x, event_table: %p, "
136 "event_table->pmu_type: %d\n",
137 name, libpfm4_index, event_table, event_table->
pmu_type);
138
139 int nevt_idx;
140 int event_num;
141 int encode_failed=0;
142
144 char *event_string=NULL;
145 char *pmu_name;
146 char *event;
147 char *masks;
148 char fullname[BUFSIZ];
150
151 pfm_perf_encode_arg_t perf_arg;
152 pfm_event_info_t einfo;
153 pfm_event_attr_info_t ainfo;
154 pfm_pmu_info_t pinfo;
155
156
158 SUBDBG(
"EXIT: no place to put native events\n");
159 return NULL;
160 }
161
162
164
165
167
168
169
170
171 if (event_num >= 0) {
172 nevt_idx = event_num;
174 } else {
175
176
177
180 }
181
182 SUBDBG(
"event_num: %d, nevt_idx: %d, ntv_evt: %p\n",
183 event_num, nevt_idx, ntv_evt);
184
185
186 memset(&perf_arg,0,sizeof(pfm_perf_encode_arg_t));
188
189
190
191 perf_arg.attr=&ntv_evt->
attr;
192 perf_arg.fstr=&event_string;
193
194
196
197
198
199 ret = pfm_get_os_event_encoding(
name,
201 PFM_OS_PERF_EVENT_EXT,
202 &perf_arg);
203
204
205 if ((ret != PFM_SUCCESS) || (event_string == NULL)) {
206 SUBDBG(
"encode failed for event: %s, returned: %d\n",
208
209
210
211
212
213
214
215 encode_failed = 1;
216
217
218
219
220
221 ntv_evt->
attr.config = 0xFFFFFF;
222
223
224
225 perf_arg.cpu = -1;
226
227
228
229 }
230
231
232 free(*(perf_arg.fstr));
233
234 event_string = strdup(
name);
235
236 SUBDBG(
"event_string: %s\n", event_string);
237
238
239
240 event = strstr (event_string, "::");
241 if (event != NULL) {
242 *event = 0;
243 event += 2;
244 pmu_name = strdup(event_string);
245 } else {
246
247 pmu_name = malloc(2);
248 pmu_name[0] = 0;
249 event = event_string;
250 }
251 masks = strstr (event, ":");
252 if (masks != NULL) {
253 *masks = 0;
254 masks += 1;
255 } else {
256 masks = "";
257 }
258
259
260 if (strlen(pmu_name) == 0) {
261 sprintf(fullname,"%s", event);
262 } else {
263 sprintf(fullname,"%s::%s", pmu_name, event);
264 }
265
266 SUBDBG(
"pmu_name: %s, event: %s, masks: %s, fullname: %s\n",
267 pmu_name, event, masks, fullname);
268
269
270
271
272
273 if (libpfm4_index == -1) {
275 if (libpfm4_index < 0) {
276 free(event_string);
277 free(pmu_name);
279 SUBDBG(
"EXIT: error from libpfm4 find event\n");
280 return NULL;
281 }
282 SUBDBG(
"libpfm4_index: %#x\n", libpfm4_index);
283 }
284
285
286
287 memset( &einfo, 0, sizeof( pfm_event_info_t ));
288 einfo.size = sizeof(pfm_event_info_t);
289 if ((ret = pfm_get_event_info(libpfm4_index,
290 PFM_OS_PERF_EVENT_EXT, &einfo)) != PFM_SUCCESS) {
291 free(event_string);
292 free(pmu_name);
294 SUBDBG(
"EXIT: pfm_get_event_info failed with %d\n", ret);
295 return NULL;
296 }
297
298
299
300 memset(&pinfo,0,sizeof(pfm_pmu_info_t));
301 pinfo.size = sizeof(pfm_pmu_info_t);
302 pfm_get_pmu_info(einfo.pmu, &pinfo);
304 free(event_string);
305 free(pmu_name);
307 SUBDBG(
"EXIT: PMU not supported by this component: einfo.pmu: %d, PFM_PMU_TYPE_CORE: %d\n", einfo.pmu, PFM_PMU_TYPE_CORE);
308 return NULL;
309 }
310
314 ntv_evt->
pmu=pmu_name;
320 ntv_evt->
cpu=perf_arg.cpu;
321
322 SUBDBG(
"ntv_evt->mask_string: %p (%s)\n",
324 char *msk_ptr = strdup(masks);
325 free(event_string);
326
328
329
330 if ((msk_ptr != NULL) && (strlen(msk_ptr) > 0)) {
331
332
333 char *ptr = msk_ptr;
334 SUBDBG(
"ptr: %p (%s)\n", ptr, ptr);
335 while (ptr != NULL) {
336 char *ptrm = strstr(ptr, ":");
337 if (ptrm != NULL) {
338 *ptrm = '\0';
339 ptrm++;
340 }
341
342
343 char *wrk = strchr(ptr, '=');
344 unsigned int msk_name_len;
345 if (wrk != NULL) {
346 msk_name_len = wrk - ptr;
347 SUBDBG(
"Found =, length=%d\n",msk_name_len);
348 } else {
349 msk_name_len = strlen (ptr);
350 SUBDBG(
"No =, length=%d\n",msk_name_len);
351 }
352
354 for (
i=0 ;
i<einfo.nattrs ;
i++) {
355
356
357
358 memset (&ainfo, 0,
359 sizeof(pfm_event_attr_info_t));
360 ainfo.size = sizeof(pfm_event_attr_info_t);
361 ret = pfm_get_event_attr_info(libpfm4_index,
362 i, PFM_OS_PERF_EVENT_EXT, &ainfo);
363 if (ret != PFM_SUCCESS) {
364 free (msk_ptr);
365 free(pmu_name);
366 SUBDBG(
"EXIT: error libpfm4 find event: Attribute info not found, libpfm4_index: %#x, ret: %d\n", libpfm4_index,
_papi_libpfm4_error(ret));
368 return NULL;
369 }
370
371
372
373 if ((msk_name_len == strlen(ainfo.name)) &&
374 (strncmp(ptr, ainfo.name, msk_name_len) == 0)) {
375 mask_found=1;
376 SUBDBG(
"Found mask: libpfm4=%s -- matches %s -- i: %d, %d %zu\n",
377 ainfo.name, ptr,
i, msk_name_len, strlen(ainfo.name));
378
379 unsigned int mskleft = sizeof(mask_desc) - strlen(mask_desc);
380
381 if (mskleft <= 1) {
382 SUBDBG(
"EXIT: Attribute description discarded: %s\n", ainfo.desc);
383 break;
384 }
385
386 if (strlen(mask_desc) > 0) {
387 strcat (mask_desc, ":");
388 mskleft--;
389 }
390
391 if (mskleft < (strlen(ainfo.desc) + 1)) {
392 SUBDBG(
"EXIT: Attribute description truncated: %s\n", ainfo.desc);
393 }
394
395 strncat (mask_desc, ainfo.desc, mskleft-1);
396 mask_desc[mskleft-1] = '\0';
397 break;
398 }
399 }
400
401
402 if (!mask_found) {
403 free(msk_ptr);
404 free(pmu_name);
405 SUBDBG(
"EXIT: error libpfm4 find event: Mask not found: %s.\n", ptr);
407 return NULL;
408 }
409
410
411 if ( (sizeof(mask_desc) - strlen(mask_desc)) <= 1) {
412 break;
413 }
414 ptr = ptrm;
415 }
416 }
419
420
421 if (msk_ptr != NULL) {
422 free (msk_ptr);
423 }
424
425
429
431
434 SUBDBG(
"Native Event: papi_event_code: %#x, libpfm4_idx: %#x, pmu: %s, base_name: %s, mask_string: %s, allocated_name: %s\n",
436 SUBDBG(
"event_table->native_events[%d]: %p, cpu: %d, attr.config: 0x%"PRIx64
", attr.config1: 0x%"PRIx64
", attr.config2: 0x%"PRIx64
", attr.type: 0x%"PRIx32
", attr.exclude_user: %d, attr.exclude_kernel: %d, attr.exclude_guest: %d\n",
438 ntv_evt->
attr.config1, ntv_evt->
attr.config2, ntv_evt->
attr.type,
439 ntv_evt->
attr.exclude_user, ntv_evt->
attr.exclude_kernel, ntv_evt->
attr.exclude_guest);
440
441
442
445
446 SUBDBG(
"Allocating more room for native events (%d %ld)\n",
450
454
456
457
458
460 }
461
462
463
464
466 SUBDBG(
"EXIT: attempt to get more space for "
467 "native events failed\n");
468 return NULL;
469 }
470
471
472 if (event_num < 0) {
474 }
475
477
478 if (encode_failed != 0) {
479 SUBDBG(
"EXIT: encoding event failed\n");
480 return NULL;
481 }
482
483 SUBDBG(
"EXIT: new_event: %p\n", ntv_evt);
484 return ntv_evt;
485}
#define PAPI_HUGE_STR_LEN
int _papi_hwi_native_to_eventcode(int cidx, int event_code, int ntv_idx, const char *event_name)
void _papi_hwi_set_papi_event_string(const char *event_string)
pfm_err_t pfm_find_event(const char *str, unsigned int *idx)