PAPI 7.1.0.0
Loading...
Searching...
No Matches
template.c
Go to the documentation of this file.
1#include <string.h>
2#include "papi.h"
3#include "papi_internal.h"
4#include "papi_vector.h"
5#include "papi_memory.h"
6#include "extras.h"
7#include "vendor_dispatch.h"
8
9#define TEMPLATE_MAX_COUNTERS (16)
10
11/* Init and finalize */
12static int templ_init_component(int cid);
13static int templ_init_thread(hwd_context_t *ctx);
15static int templ_init_private(void);
16static int templ_shutdown_component(void);
19
20/* Set and update component state */
21static int templ_update_control_state(hwd_control_state_t *ctl, NativeInfo_t *ntv_info, int ntv_count, hwd_context_t *ctx);
22
23/* Start and stop profiling of hardware events */
24static int templ_start(hwd_context_t *ctx, hwd_control_state_t *ctl);
25static int templ_read(hwd_context_t *ctx, hwd_control_state_t *ctl, long long **val, int flags);
26static int templ_stop(hwd_context_t *ctx, hwd_control_state_t *ctl);
28
29/* Event conversion */
30static int templ_ntv_enum_events(unsigned int *event_code, int modifier);
31static int templ_ntv_code_to_name(unsigned int event_code, char *name, int len);
32static int templ_ntv_name_to_code(const char *name, unsigned int *event_code);
33static int templ_ntv_code_to_descr(unsigned int event_code, char *descr, int len);
34static int templ_ntv_code_to_info(unsigned int event_code, PAPI_event_info_t *info);
35
36static int templ_set_domain(hwd_control_state_t *ctl, int domain);
37static int templ_ctl(hwd_context_t *ctx, int code, _papi_int_option_t *option);
38
39typedef struct {
41 int state;
44
45typedef struct {
46 unsigned int *events_id;
48 vendord_ctx_t vendor_ctx;
50
52 .cmp_info = {
53 .name = "templ",
54 .short_name = "templ",
55 .version = "1.0",
56 .description = "Template component for new components",
57 .initialized = 0,
58 .num_mpx_cntrs = TEMPLATE_MAX_COUNTERS,
59 },
60
61 .size = {
62 .context = sizeof(templ_context_t),
63 .control_state = sizeof(templ_control_t),
64 .reg_value = 1,
65 .reg_alloc = 1,
66 },
67
68 .init_component = templ_init_component,
69 .init_thread = templ_init_thread,
70 .init_control_state = templ_init_control_state,
71 .shutdown_component = templ_shutdown_component,
72 .shutdown_thread = templ_shutdown_thread,
73 .cleanup_eventset = templ_cleanup_eventset,
74
75 .update_control_state = templ_update_control_state,
76 .start = templ_start,
77 .stop = templ_stop,
78 .read = templ_read,
79 .reset = templ_reset,
80
81 .ntv_enum_events = templ_ntv_enum_events,
82 .ntv_code_to_name = templ_ntv_code_to_name,
83 .ntv_name_to_code = templ_ntv_name_to_code,
84 .ntv_code_to_descr = templ_ntv_code_to_descr,
85 .ntv_code_to_info = templ_ntv_code_to_info,
86
87 .set_domain = templ_set_domain,
88 .ctl = templ_ctl,
89};
90
91static int check_n_initialize(void);
92
93int
95{
100
101 int papi_errno = vendord_init_pre();
102 if (papi_errno != PAPI_OK) {
105 const char *err_string;
106 vendord_err_get_last(&err_string);
107 snprintf(_template_vector.cmp_info.disabled_reason, PAPI_MAX_STR_LEN, "%s", err_string);
108 return papi_errno;
109 }
110
111 sprintf(_template_vector.cmp_info.disabled_reason, "Not initialized. Access component events to initialize it.");
113 return PAPI_EDELAY_INIT;
114}
115
116int
118{
119 templ_context_t *templ_ctx = (templ_context_t *) ctx;
120 memset(templ_ctx, 0, sizeof(*templ_ctx));
121 templ_ctx->initialized = 1;
123 return PAPI_OK;
124}
125
126int
128{
129 return check_n_initialize();
130}
131
132static int
134{
135 unsigned int event_code = 0;
136
137 if (vendord_evt_enum(&event_code, PAPI_ENUM_FIRST) == PAPI_OK) {
138 ++(*count);
139 }
140 while (vendord_evt_enum(&event_code, PAPI_ENUM_EVENTS) == PAPI_OK) {
141 ++(*count);
142 }
143
144 return PAPI_OK;
145}
146
147int
149{
150 int papi_errno = PAPI_OK;
151
153
156 goto fn_exit;
157 }
158
159 papi_errno = vendord_init();
160 if (papi_errno != PAPI_OK) {
162 const char *err_string;
163 vendord_err_get_last(&err_string);
164 snprintf(_template_vector.cmp_info.disabled_reason, PAPI_MAX_STR_LEN, "%s", err_string);
165 goto fn_fail;
166 }
167
168 int count = 0;
169 papi_errno = evt_get_count(&count);
172
173 fn_exit:
177 return papi_errno;
178 fn_fail:
179 goto fn_exit;
180}
181
182int
184{
186 return vendord_shutdown();
187}
188
189int
191{
192 templ_context_t *templ_ctx = (templ_context_t *) ctx;
193 templ_ctx->initialized = 0;
194 templ_ctx->state = 0;
195 return PAPI_OK;
196}
197
198int
200{
202 papi_free(templ_ctl->events_id);
203 templ_ctl->events_id = NULL;
204 templ_ctl->num_events = 0;
205 return PAPI_OK;
206}
207
209static int try_open_events(templ_control_t *);
210
211int
213{
214 int papi_errno = check_n_initialize();
215 if (papi_errno != PAPI_OK) {
216 return papi_errno;
217 }
218
220 if (templ_ctl->vendor_ctx != NULL) {
221 return PAPI_ECMP;
222 }
223
224 papi_errno = update_native_events(templ_ctl, ntv_info, ntv_count);
225 if (papi_errno != PAPI_OK) {
226 return papi_errno;
227 }
228
230}
231
232int
233update_native_events(templ_control_t *ctl, NativeInfo_t *ntv_info, int ntv_count)
234{
235 int papi_errno = PAPI_OK;
236
237 if (ntv_count != ctl->num_events) {
238 ctl->events_id = papi_realloc(ctl->events_id, ntv_count * sizeof(*ctl->events_id));
239 if (NULL == ctl->events_id) {
240 papi_errno = PAPI_ENOMEM;
241 goto fn_fail;
242 }
243 ctl->num_events = ntv_count;
244 }
245
246 int i;
247 for (i = 0; i < ntv_count; ++i) {
248 ctl->events_id[i] = ntv_info[i].ni_event;
249 ntv_info[i].ni_position = i;
250 }
251
252 fn_exit:
253 return papi_errno;
254 fn_fail:
255 ctl->num_events = 0;
256 goto fn_exit;
257}
258
259int
261{
262 int papi_errno = PAPI_OK;
263 vendord_ctx_t vendor_ctx;
264
265 papi_errno = vendord_ctx_open(templ_ctl->events_id, templ_ctl->num_events, &vendor_ctx);
266 if (papi_errno != PAPI_OK) {
268 return papi_errno;
269 }
270
271 return vendord_ctx_close(vendor_ctx);
272}
273
274int
276{
277 int papi_errno = PAPI_OK;
278 templ_context_t *templ_ctx = (templ_context_t *) ctx;
280
281 if (templ_ctx->state & TEMPL_CTX_OPENED) {
282 return PAPI_EINVAL;
283 }
284
285 papi_errno = vendord_ctx_open(templ_ctl->events_id, templ_ctl->num_events, &templ_ctl->vendor_ctx);
286 if (papi_errno != PAPI_OK) {
287 goto fn_fail;
288 }
289 templ_ctx->state = TEMPL_CTX_OPENED;
290
291 papi_errno = vendord_ctx_start(templ_ctl->vendor_ctx);
292 if (papi_errno != PAPI_OK) {
293 goto fn_fail;
294 }
295 templ_ctx->state |= TEMPL_CTX_RUNNING;
296
297 fn_exit:
298 return papi_errno;
299 fn_fail:
300 vendord_ctx_close(templ_ctl->vendor_ctx);
301 templ_ctx->state = 0;
302 goto fn_exit;
303}
304
305int
306templ_read(hwd_context_t *ctx __attribute__((unused)), hwd_control_state_t *ctl, long long **val, int flags __attribute__((unused)))
307{
309 return vendord_ctx_read(templ_ctl->vendor_ctx, val);
310}
311
312int
314{
315 int papi_errno = PAPI_OK;
316 templ_context_t *templ_ctx = (templ_context_t *) ctx;
318
319 if (!(templ_ctx->state & TEMPL_CTX_OPENED)) {
320 return PAPI_EINVAL;
321 }
322
323 papi_errno = vendord_ctx_stop(templ_ctl->vendor_ctx);
324 if (papi_errno != PAPI_OK) {
325 return papi_errno;
326 }
327 templ_ctx->state &= ~TEMPL_CTX_RUNNING;
328
329 papi_errno = vendord_ctx_close(templ_ctl->vendor_ctx);
330 if (papi_errno != PAPI_OK) {
331 return papi_errno;
332 }
333 templ_ctx->state = 0;
334 templ_ctl->vendor_ctx = NULL;
335
336 return papi_errno;
337}
338
339int
341{
343 return vendord_ctx_reset(templ_ctl->vendor_ctx);
344}
345
346int
347templ_ntv_enum_events(unsigned int *event_code, int modifier)
348{
349 int papi_errno = check_n_initialize();
350 if (papi_errno != PAPI_OK) {
351 return papi_errno;
352 }
353 return vendord_evt_enum(event_code, modifier);
354}
355
356int
357templ_ntv_code_to_name(unsigned int event_code, char *name, int len)
358{
359 int papi_errno = check_n_initialize();
360 if (papi_errno != PAPI_OK) {
361 return papi_errno;
362 }
363 return vendord_evt_code_to_name(event_code, name, len);
364}
365
366int
367templ_ntv_name_to_code(const char *name, unsigned int *code)
368{
369 int papi_errno = check_n_initialize();
370 if (papi_errno != PAPI_OK) {
371 return papi_errno;
372 }
373 return vendord_evt_name_to_code(name, code);
374}
375
376int
377templ_ntv_code_to_descr(unsigned int event_code, char *descr, int len)
378{
379 int papi_errno = check_n_initialize();
380 if (papi_errno != PAPI_OK) {
381 return papi_errno;
382 }
383 return vendord_evt_code_to_descr(event_code, descr, len);
384}
385
386int
387templ_ntv_code_to_info(unsigned int event_code, PAPI_event_info_t *info)
388{
389 int papi_errno = check_n_initialize();
390 if (papi_errno != PAPI_OK) {
391 return papi_errno;
392 }
393 return vendord_evt_code_to_info(event_code, info);
394}
395
396int
398{
399 return PAPI_OK;
400}
401
402int
403templ_ctl(hwd_context_t *ctx __attribute__((unused)), int code __attribute__((unused)), _papi_int_option_t *option __attribute__((unused)))
404{
405 return PAPI_OK;
406}
407
408int
410{
412 return templ_init_private();
413 }
415}
int i
static long count
#define PAPI_ENUM_EVENTS
Definition: f90papi.h:224
#define PAPI_OK
Definition: f90papi.h:73
#define PAPI_ENUM_FIRST
Definition: f90papi.h:85
#define PAPI_NUM_LOCK
Definition: f90papi.h:80
#define PAPI_EDELAY_INIT
Definition: f90papi.h:271
#define PAPI_EINVAL
Definition: f90papi.h:115
#define PAPI_MAX_STR_LEN
Definition: f90papi.h:77
#define PAPI_ECMP
Definition: f90papi.h:214
#define PAPI_ENOMEM
Definition: f90papi.h:16
unsigned long AO_t __attribute__((__aligned__(4)))
Definition: m68k.h:21
Return codes and api definitions.
#define COMPONENT_LOCK
Definition: papi_internal.h:90
#define NUM_INNER_LOCK
Definition: papi_lock.h:17
#define papi_free(a)
Definition: papi_memory.h:35
#define papi_realloc(a, b)
Definition: papi_memory.h:36
const char * name
Definition: rocs.c:225
char name[PAPI_MAX_STR_LEN]
Definition: papi.h:627
char disabled_reason[PAPI_HUGE_STR_LEN]
Definition: papi.h:634
PAPI_component_info_t cmp_info
Definition: papi_vector.h:20
int component_id
Definition: template.c:42
unsigned int * events_id
Definition: template.c:46
vendord_ctx_t vendor_ctx
Definition: template.c:48
static int templ_ntv_enum_events(unsigned int *event_code, int modifier)
Definition: template.c:347
static int templ_init_component(int cid)
Definition: template.c:94
#define TEMPLATE_MAX_COUNTERS
Definition: template.c:9
static int templ_ntv_code_to_descr(unsigned int event_code, char *descr, int len)
Definition: template.c:377
static int templ_shutdown_thread(hwd_context_t *ctx)
Definition: template.c:190
static int templ_reset(hwd_context_t *ctx, hwd_control_state_t *ctl)
static int templ_ntv_name_to_code(const char *name, unsigned int *event_code)
Definition: template.c:367
static int templ_shutdown_component(void)
Definition: template.c:183
static int templ_stop(hwd_context_t *ctx, hwd_control_state_t *ctl)
Definition: template.c:313
static int templ_read(hwd_context_t *ctx, hwd_control_state_t *ctl, long long **val, int flags)
static int evt_get_count(int *count)
Definition: template.c:133
static int templ_start(hwd_context_t *ctx, hwd_control_state_t *ctl)
Definition: template.c:275
static int templ_ntv_code_to_info(unsigned int event_code, PAPI_event_info_t *info)
Definition: template.c:387
static int templ_cleanup_eventset(hwd_control_state_t *ctl)
Definition: template.c:199
static int templ_update_control_state(hwd_control_state_t *ctl, NativeInfo_t *ntv_info, int ntv_count, hwd_context_t *ctx)
papi_vector_t _template_vector
Definition: template.c:51
static int templ_init_thread(hwd_context_t *ctx)
Definition: template.c:117
static int templ_set_domain(hwd_control_state_t *ctl, int domain)
static int templ_init_private(void)
Definition: template.c:148
static int templ_ntv_code_to_name(unsigned int event_code, char *name, int len)
Definition: template.c:357
static int try_open_events(templ_control_t *)
Definition: template.c:260
static int update_native_events(templ_control_t *, NativeInfo_t *, int)
Definition: template.c:233
static int check_n_initialize(void)
Definition: template.c:409
static int templ_init_control_state(hwd_control_state_t *ctl)
static int templ_ctl(hwd_context_t *ctx, int code, _papi_int_option_t *option)
inline_static int _papi_hwi_lock(int lck)
Definition: threads.h:69
inline_static int _papi_hwi_unlock(int lck)
Definition: threads.h:83
unsigned int _templ_lock
Definition: vendor_common.c:4
#define TEMPL_CTX_RUNNING
Definition: vendor_config.h:5
#define TEMPL_CTX_OPENED
Definition: vendor_config.h:4
int vendord_ctx_reset(vendord_ctx_t ctx)
int vendord_evt_name_to_code(const char *name, unsigned int *event_code)
int vendord_ctx_start(vendord_ctx_t ctx)
int vendord_evt_code_to_name(unsigned int event_code, char *name, int len)
int vendord_shutdown(void)
int vendord_ctx_stop(vendord_ctx_t ctx)
int vendord_init_pre(void)
int vendord_err_get_last(const char **error)
int vendord_init(void)
int vendord_ctx_open(unsigned int *events_id, int num_events, vendord_ctx_t *ctx)
int vendord_evt_code_to_descr(unsigned int event_code, char *descr, int len)
int vendord_ctx_close(vendord_ctx_t ctx)
int vendord_ctx_read(vendord_ctx_t ctx, long long **counters)
int vendord_evt_code_to_info(unsigned int event_code, PAPI_event_info_t *info)
int vendord_evt_enum(unsigned int *event_code, int modifier)
char * descr