linux/tools/perf/tests/parse-events.c
<<
>>
Prefs
   1
   2#include "parse-events.h"
   3#include "evsel.h"
   4#include "evlist.h"
   5#include "fs.h"
   6#include <api/fs/debugfs.h>
   7#include "tests.h"
   8#include <linux/hw_breakpoint.h>
   9
  10#define PERF_TP_SAMPLE_TYPE (PERF_SAMPLE_RAW | PERF_SAMPLE_TIME | \
  11                             PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD)
  12
  13static int test__checkevent_tracepoint(struct perf_evlist *evlist)
  14{
  15        struct perf_evsel *evsel = perf_evlist__first(evlist);
  16
  17        TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
  18        TEST_ASSERT_VAL("wrong number of groups", 0 == evlist->nr_groups);
  19        TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->attr.type);
  20        TEST_ASSERT_VAL("wrong sample_type",
  21                PERF_TP_SAMPLE_TYPE == evsel->attr.sample_type);
  22        TEST_ASSERT_VAL("wrong sample_period", 1 == evsel->attr.sample_period);
  23        return 0;
  24}
  25
  26static int test__checkevent_tracepoint_multi(struct perf_evlist *evlist)
  27{
  28        struct perf_evsel *evsel;
  29
  30        TEST_ASSERT_VAL("wrong number of entries", evlist->nr_entries > 1);
  31        TEST_ASSERT_VAL("wrong number of groups", 0 == evlist->nr_groups);
  32
  33        evlist__for_each(evlist, evsel) {
  34                TEST_ASSERT_VAL("wrong type",
  35                        PERF_TYPE_TRACEPOINT == evsel->attr.type);
  36                TEST_ASSERT_VAL("wrong sample_type",
  37                        PERF_TP_SAMPLE_TYPE == evsel->attr.sample_type);
  38                TEST_ASSERT_VAL("wrong sample_period",
  39                        1 == evsel->attr.sample_period);
  40        }
  41        return 0;
  42}
  43
  44static int test__checkevent_raw(struct perf_evlist *evlist)
  45{
  46        struct perf_evsel *evsel = perf_evlist__first(evlist);
  47
  48        TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
  49        TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
  50        TEST_ASSERT_VAL("wrong config", 0x1a == evsel->attr.config);
  51        return 0;
  52}
  53
  54static int test__checkevent_numeric(struct perf_evlist *evlist)
  55{
  56        struct perf_evsel *evsel = perf_evlist__first(evlist);
  57
  58        TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
  59        TEST_ASSERT_VAL("wrong type", 1 == evsel->attr.type);
  60        TEST_ASSERT_VAL("wrong config", 1 == evsel->attr.config);
  61        return 0;
  62}
  63
  64static int test__checkevent_symbolic_name(struct perf_evlist *evlist)
  65{
  66        struct perf_evsel *evsel = perf_evlist__first(evlist);
  67
  68        TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
  69        TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
  70        TEST_ASSERT_VAL("wrong config",
  71                        PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
  72        return 0;
  73}
  74
  75static int test__checkevent_symbolic_name_config(struct perf_evlist *evlist)
  76{
  77        struct perf_evsel *evsel = perf_evlist__first(evlist);
  78
  79        TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
  80        TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
  81        TEST_ASSERT_VAL("wrong config",
  82                        PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
  83        TEST_ASSERT_VAL("wrong period",
  84                        100000 == evsel->attr.sample_period);
  85        TEST_ASSERT_VAL("wrong config1",
  86                        0 == evsel->attr.config1);
  87        TEST_ASSERT_VAL("wrong config2",
  88                        1 == evsel->attr.config2);
  89        return 0;
  90}
  91
  92static int test__checkevent_symbolic_alias(struct perf_evlist *evlist)
  93{
  94        struct perf_evsel *evsel = perf_evlist__first(evlist);
  95
  96        TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
  97        TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->attr.type);
  98        TEST_ASSERT_VAL("wrong config",
  99                        PERF_COUNT_SW_PAGE_FAULTS == evsel->attr.config);
 100        return 0;
 101}
 102
 103static int test__checkevent_genhw(struct perf_evlist *evlist)
 104{
 105        struct perf_evsel *evsel = perf_evlist__first(evlist);
 106
 107        TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
 108        TEST_ASSERT_VAL("wrong type", PERF_TYPE_HW_CACHE == evsel->attr.type);
 109        TEST_ASSERT_VAL("wrong config", (1 << 16) == evsel->attr.config);
 110        return 0;
 111}
 112
 113static int test__checkevent_breakpoint(struct perf_evlist *evlist)
 114{
 115        struct perf_evsel *evsel = perf_evlist__first(evlist);
 116
 117        TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
 118        TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->attr.type);
 119        TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
 120        TEST_ASSERT_VAL("wrong bp_type", (HW_BREAKPOINT_R | HW_BREAKPOINT_W) ==
 121                                         evsel->attr.bp_type);
 122        TEST_ASSERT_VAL("wrong bp_len", HW_BREAKPOINT_LEN_4 ==
 123                                        evsel->attr.bp_len);
 124        return 0;
 125}
 126
 127static int test__checkevent_breakpoint_x(struct perf_evlist *evlist)
 128{
 129        struct perf_evsel *evsel = perf_evlist__first(evlist);
 130
 131        TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
 132        TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->attr.type);
 133        TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
 134        TEST_ASSERT_VAL("wrong bp_type",
 135                        HW_BREAKPOINT_X == evsel->attr.bp_type);
 136        TEST_ASSERT_VAL("wrong bp_len", sizeof(long) == evsel->attr.bp_len);
 137        return 0;
 138}
 139
 140static int test__checkevent_breakpoint_r(struct perf_evlist *evlist)
 141{
 142        struct perf_evsel *evsel = perf_evlist__first(evlist);
 143
 144        TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
 145        TEST_ASSERT_VAL("wrong type",
 146                        PERF_TYPE_BREAKPOINT == evsel->attr.type);
 147        TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
 148        TEST_ASSERT_VAL("wrong bp_type",
 149                        HW_BREAKPOINT_R == evsel->attr.bp_type);
 150        TEST_ASSERT_VAL("wrong bp_len",
 151                        HW_BREAKPOINT_LEN_4 == evsel->attr.bp_len);
 152        return 0;
 153}
 154
 155static int test__checkevent_breakpoint_w(struct perf_evlist *evlist)
 156{
 157        struct perf_evsel *evsel = perf_evlist__first(evlist);
 158
 159        TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
 160        TEST_ASSERT_VAL("wrong type",
 161                        PERF_TYPE_BREAKPOINT == evsel->attr.type);
 162        TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
 163        TEST_ASSERT_VAL("wrong bp_type",
 164                        HW_BREAKPOINT_W == evsel->attr.bp_type);
 165        TEST_ASSERT_VAL("wrong bp_len",
 166                        HW_BREAKPOINT_LEN_4 == evsel->attr.bp_len);
 167        return 0;
 168}
 169
 170static int test__checkevent_breakpoint_rw(struct perf_evlist *evlist)
 171{
 172        struct perf_evsel *evsel = perf_evlist__first(evlist);
 173
 174        TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
 175        TEST_ASSERT_VAL("wrong type",
 176                        PERF_TYPE_BREAKPOINT == evsel->attr.type);
 177        TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
 178        TEST_ASSERT_VAL("wrong bp_type",
 179                (HW_BREAKPOINT_R|HW_BREAKPOINT_W) == evsel->attr.bp_type);
 180        TEST_ASSERT_VAL("wrong bp_len",
 181                        HW_BREAKPOINT_LEN_4 == evsel->attr.bp_len);
 182        return 0;
 183}
 184
 185static int test__checkevent_tracepoint_modifier(struct perf_evlist *evlist)
 186{
 187        struct perf_evsel *evsel = perf_evlist__first(evlist);
 188
 189        TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
 190        TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
 191        TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
 192        TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
 193
 194        return test__checkevent_tracepoint(evlist);
 195}
 196
 197static int
 198test__checkevent_tracepoint_multi_modifier(struct perf_evlist *evlist)
 199{
 200        struct perf_evsel *evsel;
 201
 202        TEST_ASSERT_VAL("wrong number of entries", evlist->nr_entries > 1);
 203
 204        evlist__for_each(evlist, evsel) {
 205                TEST_ASSERT_VAL("wrong exclude_user",
 206                                !evsel->attr.exclude_user);
 207                TEST_ASSERT_VAL("wrong exclude_kernel",
 208                                evsel->attr.exclude_kernel);
 209                TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
 210                TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
 211        }
 212
 213        return test__checkevent_tracepoint_multi(evlist);
 214}
 215
 216static int test__checkevent_raw_modifier(struct perf_evlist *evlist)
 217{
 218        struct perf_evsel *evsel = perf_evlist__first(evlist);
 219
 220        TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
 221        TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
 222        TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
 223        TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
 224
 225        return test__checkevent_raw(evlist);
 226}
 227
 228static int test__checkevent_numeric_modifier(struct perf_evlist *evlist)
 229{
 230        struct perf_evsel *evsel = perf_evlist__first(evlist);
 231
 232        TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
 233        TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
 234        TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
 235        TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
 236
 237        return test__checkevent_numeric(evlist);
 238}
 239
 240static int test__checkevent_symbolic_name_modifier(struct perf_evlist *evlist)
 241{
 242        struct perf_evsel *evsel = perf_evlist__first(evlist);
 243
 244        TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
 245        TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
 246        TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
 247        TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
 248
 249        return test__checkevent_symbolic_name(evlist);
 250}
 251
 252static int test__checkevent_exclude_host_modifier(struct perf_evlist *evlist)
 253{
 254        struct perf_evsel *evsel = perf_evlist__first(evlist);
 255
 256        TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
 257        TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
 258
 259        return test__checkevent_symbolic_name(evlist);
 260}
 261
 262static int test__checkevent_exclude_guest_modifier(struct perf_evlist *evlist)
 263{
 264        struct perf_evsel *evsel = perf_evlist__first(evlist);
 265
 266        TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
 267        TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
 268
 269        return test__checkevent_symbolic_name(evlist);
 270}
 271
 272static int test__checkevent_symbolic_alias_modifier(struct perf_evlist *evlist)
 273{
 274        struct perf_evsel *evsel = perf_evlist__first(evlist);
 275
 276        TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
 277        TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
 278        TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
 279        TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
 280
 281        return test__checkevent_symbolic_alias(evlist);
 282}
 283
 284static int test__checkevent_genhw_modifier(struct perf_evlist *evlist)
 285{
 286        struct perf_evsel *evsel = perf_evlist__first(evlist);
 287
 288        TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
 289        TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
 290        TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
 291        TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
 292
 293        return test__checkevent_genhw(evlist);
 294}
 295
 296static int test__checkevent_breakpoint_modifier(struct perf_evlist *evlist)
 297{
 298        struct perf_evsel *evsel = perf_evlist__first(evlist);
 299
 300
 301        TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
 302        TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
 303        TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
 304        TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
 305        TEST_ASSERT_VAL("wrong name",
 306                        !strcmp(perf_evsel__name(evsel), "mem:0:u"));
 307
 308        return test__checkevent_breakpoint(evlist);
 309}
 310
 311static int test__checkevent_breakpoint_x_modifier(struct perf_evlist *evlist)
 312{
 313        struct perf_evsel *evsel = perf_evlist__first(evlist);
 314
 315        TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
 316        TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
 317        TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
 318        TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
 319        TEST_ASSERT_VAL("wrong name",
 320                        !strcmp(perf_evsel__name(evsel), "mem:0:x:k"));
 321
 322        return test__checkevent_breakpoint_x(evlist);
 323}
 324
 325static int test__checkevent_breakpoint_r_modifier(struct perf_evlist *evlist)
 326{
 327        struct perf_evsel *evsel = perf_evlist__first(evlist);
 328
 329        TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
 330        TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
 331        TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
 332        TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
 333        TEST_ASSERT_VAL("wrong name",
 334                        !strcmp(perf_evsel__name(evsel), "mem:0:r:hp"));
 335
 336        return test__checkevent_breakpoint_r(evlist);
 337}
 338
 339static int test__checkevent_breakpoint_w_modifier(struct perf_evlist *evlist)
 340{
 341        struct perf_evsel *evsel = perf_evlist__first(evlist);
 342
 343        TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
 344        TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
 345        TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
 346        TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
 347        TEST_ASSERT_VAL("wrong name",
 348                        !strcmp(perf_evsel__name(evsel), "mem:0:w:up"));
 349
 350        return test__checkevent_breakpoint_w(evlist);
 351}
 352
 353static int test__checkevent_breakpoint_rw_modifier(struct perf_evlist *evlist)
 354{
 355        struct perf_evsel *evsel = perf_evlist__first(evlist);
 356
 357        TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
 358        TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
 359        TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
 360        TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
 361        TEST_ASSERT_VAL("wrong name",
 362                        !strcmp(perf_evsel__name(evsel), "mem:0:rw:kp"));
 363
 364        return test__checkevent_breakpoint_rw(evlist);
 365}
 366
 367static int test__checkevent_pmu(struct perf_evlist *evlist)
 368{
 369
 370        struct perf_evsel *evsel = perf_evlist__first(evlist);
 371
 372        TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
 373        TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
 374        TEST_ASSERT_VAL("wrong config",    10 == evsel->attr.config);
 375        TEST_ASSERT_VAL("wrong config1",    1 == evsel->attr.config1);
 376        TEST_ASSERT_VAL("wrong config2",    3 == evsel->attr.config2);
 377        TEST_ASSERT_VAL("wrong period",  1000 == evsel->attr.sample_period);
 378
 379        return 0;
 380}
 381
 382static int test__checkevent_list(struct perf_evlist *evlist)
 383{
 384        struct perf_evsel *evsel = perf_evlist__first(evlist);
 385
 386        TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->nr_entries);
 387
 388        /* r1 */
 389        TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
 390        TEST_ASSERT_VAL("wrong config", 1 == evsel->attr.config);
 391        TEST_ASSERT_VAL("wrong config1", 0 == evsel->attr.config1);
 392        TEST_ASSERT_VAL("wrong config2", 0 == evsel->attr.config2);
 393        TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
 394        TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
 395        TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
 396        TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
 397
 398        /* syscalls:sys_enter_open:k */
 399        evsel = perf_evsel__next(evsel);
 400        TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->attr.type);
 401        TEST_ASSERT_VAL("wrong sample_type",
 402                PERF_TP_SAMPLE_TYPE == evsel->attr.sample_type);
 403        TEST_ASSERT_VAL("wrong sample_period", 1 == evsel->attr.sample_period);
 404        TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
 405        TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
 406        TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
 407        TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
 408
 409        /* 1:1:hp */
 410        evsel = perf_evsel__next(evsel);
 411        TEST_ASSERT_VAL("wrong type", 1 == evsel->attr.type);
 412        TEST_ASSERT_VAL("wrong config", 1 == evsel->attr.config);
 413        TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
 414        TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
 415        TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
 416        TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
 417
 418        return 0;
 419}
 420
 421static int test__checkevent_pmu_name(struct perf_evlist *evlist)
 422{
 423        struct perf_evsel *evsel = perf_evlist__first(evlist);
 424
 425        /* cpu/config=1,name=krava/u */
 426        TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
 427        TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
 428        TEST_ASSERT_VAL("wrong config",  1 == evsel->attr.config);
 429        TEST_ASSERT_VAL("wrong name", !strcmp(perf_evsel__name(evsel), "krava"));
 430
 431        /* cpu/config=2/u" */
 432        evsel = perf_evsel__next(evsel);
 433        TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
 434        TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
 435        TEST_ASSERT_VAL("wrong config",  2 == evsel->attr.config);
 436        TEST_ASSERT_VAL("wrong name",
 437                        !strcmp(perf_evsel__name(evsel), "cpu/config=2/u"));
 438
 439        return 0;
 440}
 441
 442static int test__checkevent_pmu_events(struct perf_evlist *evlist)
 443{
 444        struct perf_evsel *evsel = perf_evlist__first(evlist);
 445
 446        TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
 447        TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
 448        TEST_ASSERT_VAL("wrong exclude_user",
 449                        !evsel->attr.exclude_user);
 450        TEST_ASSERT_VAL("wrong exclude_kernel",
 451                        evsel->attr.exclude_kernel);
 452        TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
 453        TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
 454        TEST_ASSERT_VAL("wrong pinned", !evsel->attr.pinned);
 455
 456        return 0;
 457}
 458
 459static int test__checkterms_simple(struct list_head *terms)
 460{
 461        struct parse_events_term *term;
 462
 463        /* config=10 */
 464        term = list_entry(terms->next, struct parse_events_term, list);
 465        TEST_ASSERT_VAL("wrong type term",
 466                        term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG);
 467        TEST_ASSERT_VAL("wrong type val",
 468                        term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
 469        TEST_ASSERT_VAL("wrong val", term->val.num == 10);
 470        TEST_ASSERT_VAL("wrong config", !term->config);
 471
 472        /* config1 */
 473        term = list_entry(term->list.next, struct parse_events_term, list);
 474        TEST_ASSERT_VAL("wrong type term",
 475                        term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG1);
 476        TEST_ASSERT_VAL("wrong type val",
 477                        term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
 478        TEST_ASSERT_VAL("wrong val", term->val.num == 1);
 479        TEST_ASSERT_VAL("wrong config", !term->config);
 480
 481        /* config2=3 */
 482        term = list_entry(term->list.next, struct parse_events_term, list);
 483        TEST_ASSERT_VAL("wrong type term",
 484                        term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG2);
 485        TEST_ASSERT_VAL("wrong type val",
 486                        term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
 487        TEST_ASSERT_VAL("wrong val", term->val.num == 3);
 488        TEST_ASSERT_VAL("wrong config", !term->config);
 489
 490        /* umask=1*/
 491        term = list_entry(term->list.next, struct parse_events_term, list);
 492        TEST_ASSERT_VAL("wrong type term",
 493                        term->type_term == PARSE_EVENTS__TERM_TYPE_USER);
 494        TEST_ASSERT_VAL("wrong type val",
 495                        term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
 496        TEST_ASSERT_VAL("wrong val", term->val.num == 1);
 497        TEST_ASSERT_VAL("wrong config", !strcmp(term->config, "umask"));
 498
 499        return 0;
 500}
 501
 502static int test__group1(struct perf_evlist *evlist)
 503{
 504        struct perf_evsel *evsel, *leader;
 505
 506        TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
 507        TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
 508
 509        /* instructions:k */
 510        evsel = leader = perf_evlist__first(evlist);
 511        TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
 512        TEST_ASSERT_VAL("wrong config",
 513                        PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
 514        TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
 515        TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
 516        TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
 517        TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
 518        TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
 519        TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
 520        TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
 521        TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
 522        TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
 523        TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
 524
 525        /* cycles:upp */
 526        evsel = perf_evsel__next(evsel);
 527        TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
 528        TEST_ASSERT_VAL("wrong config",
 529                        PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
 530        TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
 531        TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
 532        TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
 533        /* use of precise requires exclude_guest */
 534        TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
 535        TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
 536        TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip == 2);
 537        TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
 538        TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
 539        TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
 540
 541        return 0;
 542}
 543
 544static int test__group2(struct perf_evlist *evlist)
 545{
 546        struct perf_evsel *evsel, *leader;
 547
 548        TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->nr_entries);
 549        TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
 550
 551        /* faults + :ku modifier */
 552        evsel = leader = perf_evlist__first(evlist);
 553        TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->attr.type);
 554        TEST_ASSERT_VAL("wrong config",
 555                        PERF_COUNT_SW_PAGE_FAULTS == evsel->attr.config);
 556        TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
 557        TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
 558        TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
 559        TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
 560        TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
 561        TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
 562        TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
 563        TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
 564        TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
 565        TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
 566
 567        /* cache-references + :u modifier */
 568        evsel = perf_evsel__next(evsel);
 569        TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
 570        TEST_ASSERT_VAL("wrong config",
 571                        PERF_COUNT_HW_CACHE_REFERENCES == evsel->attr.config);
 572        TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
 573        TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
 574        TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
 575        TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
 576        TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
 577        TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
 578        TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
 579        TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
 580        TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
 581
 582        /* cycles:k */
 583        evsel = perf_evsel__next(evsel);
 584        TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
 585        TEST_ASSERT_VAL("wrong config",
 586                        PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
 587        TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
 588        TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
 589        TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
 590        TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
 591        TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
 592        TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
 593        TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
 594        TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
 595
 596        return 0;
 597}
 598
 599static int test__group3(struct perf_evlist *evlist __maybe_unused)
 600{
 601        struct perf_evsel *evsel, *leader;
 602
 603        TEST_ASSERT_VAL("wrong number of entries", 5 == evlist->nr_entries);
 604        TEST_ASSERT_VAL("wrong number of groups", 2 == evlist->nr_groups);
 605
 606        /* group1 syscalls:sys_enter_open:H */
 607        evsel = leader = perf_evlist__first(evlist);
 608        TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->attr.type);
 609        TEST_ASSERT_VAL("wrong sample_type",
 610                PERF_TP_SAMPLE_TYPE == evsel->attr.sample_type);
 611        TEST_ASSERT_VAL("wrong sample_period", 1 == evsel->attr.sample_period);
 612        TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
 613        TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
 614        TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
 615        TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
 616        TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
 617        TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
 618        TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
 619        TEST_ASSERT_VAL("wrong group name",
 620                !strcmp(leader->group_name, "group1"));
 621        TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
 622        TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
 623        TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
 624
 625        /* group1 cycles:kppp */
 626        evsel = perf_evsel__next(evsel);
 627        TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
 628        TEST_ASSERT_VAL("wrong config",
 629                        PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
 630        TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
 631        TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
 632        TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
 633        /* use of precise requires exclude_guest */
 634        TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
 635        TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
 636        TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip == 3);
 637        TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
 638        TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
 639        TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
 640        TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
 641
 642        /* group2 cycles + G modifier */
 643        evsel = leader = perf_evsel__next(evsel);
 644        TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
 645        TEST_ASSERT_VAL("wrong config",
 646                        PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
 647        TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
 648        TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
 649        TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
 650        TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
 651        TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
 652        TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
 653        TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
 654        TEST_ASSERT_VAL("wrong group name",
 655                !strcmp(leader->group_name, "group2"));
 656        TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
 657        TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
 658        TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
 659
 660        /* group2 1:3 + G modifier */
 661        evsel = perf_evsel__next(evsel);
 662        TEST_ASSERT_VAL("wrong type", 1 == evsel->attr.type);
 663        TEST_ASSERT_VAL("wrong config", 3 == evsel->attr.config);
 664        TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
 665        TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
 666        TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
 667        TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
 668        TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
 669        TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
 670        TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
 671        TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
 672        TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
 673
 674        /* instructions:u */
 675        evsel = perf_evsel__next(evsel);
 676        TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
 677        TEST_ASSERT_VAL("wrong config",
 678                        PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
 679        TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
 680        TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
 681        TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
 682        TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
 683        TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
 684        TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
 685        TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
 686        TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
 687
 688        return 0;
 689}
 690
 691static int test__group4(struct perf_evlist *evlist __maybe_unused)
 692{
 693        struct perf_evsel *evsel, *leader;
 694
 695        TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
 696        TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
 697
 698        /* cycles:u + p */
 699        evsel = leader = perf_evlist__first(evlist);
 700        TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
 701        TEST_ASSERT_VAL("wrong config",
 702                        PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
 703        TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
 704        TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
 705        TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
 706        /* use of precise requires exclude_guest */
 707        TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
 708        TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
 709        TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip == 1);
 710        TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
 711        TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
 712        TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
 713        TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
 714        TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
 715
 716        /* instructions:kp + p */
 717        evsel = perf_evsel__next(evsel);
 718        TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
 719        TEST_ASSERT_VAL("wrong config",
 720                        PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
 721        TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
 722        TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
 723        TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
 724        /* use of precise requires exclude_guest */
 725        TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
 726        TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
 727        TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip == 2);
 728        TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
 729        TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
 730        TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
 731
 732        return 0;
 733}
 734
 735static int test__group5(struct perf_evlist *evlist __maybe_unused)
 736{
 737        struct perf_evsel *evsel, *leader;
 738
 739        TEST_ASSERT_VAL("wrong number of entries", 5 == evlist->nr_entries);
 740        TEST_ASSERT_VAL("wrong number of groups", 2 == evlist->nr_groups);
 741
 742        /* cycles + G */
 743        evsel = leader = perf_evlist__first(evlist);
 744        TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
 745        TEST_ASSERT_VAL("wrong config",
 746                        PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
 747        TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
 748        TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
 749        TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
 750        TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
 751        TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
 752        TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
 753        TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
 754        TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
 755        TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
 756        TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
 757        TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
 758
 759        /* instructions + G */
 760        evsel = perf_evsel__next(evsel);
 761        TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
 762        TEST_ASSERT_VAL("wrong config",
 763                        PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
 764        TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
 765        TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
 766        TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
 767        TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
 768        TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
 769        TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
 770        TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
 771        TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
 772        TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
 773
 774        /* cycles:G */
 775        evsel = leader = perf_evsel__next(evsel);
 776        TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
 777        TEST_ASSERT_VAL("wrong config",
 778                        PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
 779        TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
 780        TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
 781        TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
 782        TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
 783        TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
 784        TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
 785        TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
 786        TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
 787        TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
 788        TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
 789        TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
 790
 791        /* instructions:G */
 792        evsel = perf_evsel__next(evsel);
 793        TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
 794        TEST_ASSERT_VAL("wrong config",
 795                        PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
 796        TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
 797        TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
 798        TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
 799        TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
 800        TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
 801        TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
 802        TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
 803        TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
 804
 805        /* cycles */
 806        evsel = perf_evsel__next(evsel);
 807        TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
 808        TEST_ASSERT_VAL("wrong config",
 809                        PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
 810        TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
 811        TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
 812        TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
 813        TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
 814        TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
 815        TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
 816        TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
 817
 818        return 0;
 819}
 820
 821static int test__group_gh1(struct perf_evlist *evlist)
 822{
 823        struct perf_evsel *evsel, *leader;
 824
 825        TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
 826        TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
 827
 828        /* cycles + :H group modifier */
 829        evsel = leader = perf_evlist__first(evlist);
 830        TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
 831        TEST_ASSERT_VAL("wrong config",
 832                        PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
 833        TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
 834        TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
 835        TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
 836        TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
 837        TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
 838        TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
 839        TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
 840        TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
 841        TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
 842        TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
 843
 844        /* cache-misses:G + :H group modifier */
 845        evsel = perf_evsel__next(evsel);
 846        TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
 847        TEST_ASSERT_VAL("wrong config",
 848                        PERF_COUNT_HW_CACHE_MISSES == evsel->attr.config);
 849        TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
 850        TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
 851        TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
 852        TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
 853        TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
 854        TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
 855        TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
 856        TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
 857
 858        return 0;
 859}
 860
 861static int test__group_gh2(struct perf_evlist *evlist)
 862{
 863        struct perf_evsel *evsel, *leader;
 864
 865        TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
 866        TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
 867
 868        /* cycles + :G group modifier */
 869        evsel = leader = perf_evlist__first(evlist);
 870        TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
 871        TEST_ASSERT_VAL("wrong config",
 872                        PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
 873        TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
 874        TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
 875        TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
 876        TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
 877        TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
 878        TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
 879        TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
 880        TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
 881        TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
 882        TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
 883
 884        /* cache-misses:H + :G group modifier */
 885        evsel = perf_evsel__next(evsel);
 886        TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
 887        TEST_ASSERT_VAL("wrong config",
 888                        PERF_COUNT_HW_CACHE_MISSES == evsel->attr.config);
 889        TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
 890        TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
 891        TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
 892        TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
 893        TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
 894        TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
 895        TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
 896        TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
 897
 898        return 0;
 899}
 900
 901static int test__group_gh3(struct perf_evlist *evlist)
 902{
 903        struct perf_evsel *evsel, *leader;
 904
 905        TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
 906        TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
 907
 908        /* cycles:G + :u group modifier */
 909        evsel = leader = perf_evlist__first(evlist);
 910        TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
 911        TEST_ASSERT_VAL("wrong config",
 912                        PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
 913        TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
 914        TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
 915        TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
 916        TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
 917        TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
 918        TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
 919        TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
 920        TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
 921        TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
 922        TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
 923
 924        /* cache-misses:H + :u group modifier */
 925        evsel = perf_evsel__next(evsel);
 926        TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
 927        TEST_ASSERT_VAL("wrong config",
 928                        PERF_COUNT_HW_CACHE_MISSES == evsel->attr.config);
 929        TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
 930        TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
 931        TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
 932        TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
 933        TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
 934        TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
 935        TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
 936        TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
 937
 938        return 0;
 939}
 940
 941static int test__group_gh4(struct perf_evlist *evlist)
 942{
 943        struct perf_evsel *evsel, *leader;
 944
 945        TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
 946        TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
 947
 948        /* cycles:G + :uG group modifier */
 949        evsel = leader = perf_evlist__first(evlist);
 950        TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
 951        TEST_ASSERT_VAL("wrong config",
 952                        PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
 953        TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
 954        TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
 955        TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
 956        TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
 957        TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
 958        TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
 959        TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
 960        TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
 961        TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
 962        TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
 963
 964        /* cache-misses:H + :uG group modifier */
 965        evsel = perf_evsel__next(evsel);
 966        TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
 967        TEST_ASSERT_VAL("wrong config",
 968                        PERF_COUNT_HW_CACHE_MISSES == evsel->attr.config);
 969        TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
 970        TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
 971        TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
 972        TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
 973        TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
 974        TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
 975        TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
 976        TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
 977
 978        return 0;
 979}
 980
 981static int test__leader_sample1(struct perf_evlist *evlist)
 982{
 983        struct perf_evsel *evsel, *leader;
 984
 985        TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->nr_entries);
 986
 987        /* cycles - sampling group leader */
 988        evsel = leader = perf_evlist__first(evlist);
 989        TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
 990        TEST_ASSERT_VAL("wrong config",
 991                        PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
 992        TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
 993        TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
 994        TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
 995        TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
 996        TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
 997        TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
 998        TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
 999        TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
1000        TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
1001
1002        /* cache-misses - not sampling */
1003        evsel = perf_evsel__next(evsel);
1004        TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
1005        TEST_ASSERT_VAL("wrong config",
1006                        PERF_COUNT_HW_CACHE_MISSES == evsel->attr.config);
1007        TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
1008        TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
1009        TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
1010        TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
1011        TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
1012        TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
1013        TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
1014        TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
1015
1016        /* branch-misses - not sampling */
1017        evsel = perf_evsel__next(evsel);
1018        TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
1019        TEST_ASSERT_VAL("wrong config",
1020                        PERF_COUNT_HW_BRANCH_MISSES == evsel->attr.config);
1021        TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
1022        TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
1023        TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
1024        TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
1025        TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
1026        TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
1027        TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
1028        TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
1029        TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
1030
1031        return 0;
1032}
1033
1034static int test__leader_sample2(struct perf_evlist *evlist __maybe_unused)
1035{
1036        struct perf_evsel *evsel, *leader;
1037
1038        TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
1039
1040        /* instructions - sampling group leader */
1041        evsel = leader = perf_evlist__first(evlist);
1042        TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
1043        TEST_ASSERT_VAL("wrong config",
1044                        PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
1045        TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
1046        TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
1047        TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
1048        TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
1049        TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
1050        TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
1051        TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
1052        TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
1053        TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
1054
1055        /* branch-misses - not sampling */
1056        evsel = perf_evsel__next(evsel);
1057        TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
1058        TEST_ASSERT_VAL("wrong config",
1059                        PERF_COUNT_HW_BRANCH_MISSES == evsel->attr.config);
1060        TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
1061        TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
1062        TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
1063        TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
1064        TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
1065        TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
1066        TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
1067        TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
1068        TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
1069
1070        return 0;
1071}
1072
1073static int test__checkevent_pinned_modifier(struct perf_evlist *evlist)
1074{
1075        struct perf_evsel *evsel = perf_evlist__first(evlist);
1076
1077        TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
1078        TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
1079        TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
1080        TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
1081        TEST_ASSERT_VAL("wrong pinned", evsel->attr.pinned);
1082
1083        return test__checkevent_symbolic_name(evlist);
1084}
1085
1086static int test__pinned_group(struct perf_evlist *evlist)
1087{
1088        struct perf_evsel *evsel, *leader;
1089
1090        TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->nr_entries);
1091
1092        /* cycles - group leader */
1093        evsel = leader = perf_evlist__first(evlist);
1094        TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
1095        TEST_ASSERT_VAL("wrong config",
1096                        PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
1097        TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
1098        TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
1099        TEST_ASSERT_VAL("wrong pinned", evsel->attr.pinned);
1100
1101        /* cache-misses - can not be pinned, but will go on with the leader */
1102        evsel = perf_evsel__next(evsel);
1103        TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
1104        TEST_ASSERT_VAL("wrong config",
1105                        PERF_COUNT_HW_CACHE_MISSES == evsel->attr.config);
1106        TEST_ASSERT_VAL("wrong pinned", !evsel->attr.pinned);
1107
1108        /* branch-misses - ditto */
1109        evsel = perf_evsel__next(evsel);
1110        TEST_ASSERT_VAL("wrong config",
1111                        PERF_COUNT_HW_BRANCH_MISSES == evsel->attr.config);
1112        TEST_ASSERT_VAL("wrong pinned", !evsel->attr.pinned);
1113
1114        return 0;
1115}
1116
1117static int count_tracepoints(void)
1118{
1119        char events_path[PATH_MAX];
1120        struct dirent *events_ent;
1121        DIR *events_dir;
1122        int cnt = 0;
1123
1124        scnprintf(events_path, PATH_MAX, "%s/tracing/events",
1125                  debugfs_find_mountpoint());
1126
1127        events_dir = opendir(events_path);
1128
1129        TEST_ASSERT_VAL("Can't open events dir", events_dir);
1130
1131        while ((events_ent = readdir(events_dir))) {
1132                char sys_path[PATH_MAX];
1133                struct dirent *sys_ent;
1134                DIR *sys_dir;
1135
1136                if (!strcmp(events_ent->d_name, ".")
1137                    || !strcmp(events_ent->d_name, "..")
1138                    || !strcmp(events_ent->d_name, "enable")
1139                    || !strcmp(events_ent->d_name, "header_event")
1140                    || !strcmp(events_ent->d_name, "header_page"))
1141                        continue;
1142
1143                scnprintf(sys_path, PATH_MAX, "%s/%s",
1144                          events_path, events_ent->d_name);
1145
1146                sys_dir = opendir(sys_path);
1147                TEST_ASSERT_VAL("Can't open sys dir", sys_dir);
1148
1149                while ((sys_ent = readdir(sys_dir))) {
1150                        if (!strcmp(sys_ent->d_name, ".")
1151                            || !strcmp(sys_ent->d_name, "..")
1152                            || !strcmp(sys_ent->d_name, "enable")
1153                            || !strcmp(sys_ent->d_name, "filter"))
1154                                continue;
1155
1156                        cnt++;
1157                }
1158
1159                closedir(sys_dir);
1160        }
1161
1162        closedir(events_dir);
1163        return cnt;
1164}
1165
1166static int test__all_tracepoints(struct perf_evlist *evlist)
1167{
1168        TEST_ASSERT_VAL("wrong events count",
1169                        count_tracepoints() == evlist->nr_entries);
1170
1171        return test__checkevent_tracepoint_multi(evlist);
1172}
1173
1174struct evlist_test {
1175        const char *name;
1176        __u32 type;
1177        int (*check)(struct perf_evlist *evlist);
1178};
1179
1180static struct evlist_test test__events[] = {
1181        [0] = {
1182                .name  = "syscalls:sys_enter_open",
1183                .check = test__checkevent_tracepoint,
1184        },
1185        [1] = {
1186                .name  = "syscalls:*",
1187                .check = test__checkevent_tracepoint_multi,
1188        },
1189        [2] = {
1190                .name  = "r1a",
1191                .check = test__checkevent_raw,
1192        },
1193        [3] = {
1194                .name  = "1:1",
1195                .check = test__checkevent_numeric,
1196        },
1197        [4] = {
1198                .name  = "instructions",
1199                .check = test__checkevent_symbolic_name,
1200        },
1201        [5] = {
1202                .name  = "cycles/period=100000,config2/",
1203                .check = test__checkevent_symbolic_name_config,
1204        },
1205        [6] = {
1206                .name  = "faults",
1207                .check = test__checkevent_symbolic_alias,
1208        },
1209        [7] = {
1210                .name  = "L1-dcache-load-miss",
1211                .check = test__checkevent_genhw,
1212        },
1213        [8] = {
1214                .name  = "mem:0",
1215                .check = test__checkevent_breakpoint,
1216        },
1217        [9] = {
1218                .name  = "mem:0:x",
1219                .check = test__checkevent_breakpoint_x,
1220        },
1221        [10] = {
1222                .name  = "mem:0:r",
1223                .check = test__checkevent_breakpoint_r,
1224        },
1225        [11] = {
1226                .name  = "mem:0:w",
1227                .check = test__checkevent_breakpoint_w,
1228        },
1229        [12] = {
1230                .name  = "syscalls:sys_enter_open:k",
1231                .check = test__checkevent_tracepoint_modifier,
1232        },
1233        [13] = {
1234                .name  = "syscalls:*:u",
1235                .check = test__checkevent_tracepoint_multi_modifier,
1236        },
1237        [14] = {
1238                .name  = "r1a:kp",
1239                .check = test__checkevent_raw_modifier,
1240        },
1241        [15] = {
1242                .name  = "1:1:hp",
1243                .check = test__checkevent_numeric_modifier,
1244        },
1245        [16] = {
1246                .name  = "instructions:h",
1247                .check = test__checkevent_symbolic_name_modifier,
1248        },
1249        [17] = {
1250                .name  = "faults:u",
1251                .check = test__checkevent_symbolic_alias_modifier,
1252        },
1253        [18] = {
1254                .name  = "L1-dcache-load-miss:kp",
1255                .check = test__checkevent_genhw_modifier,
1256        },
1257        [19] = {
1258                .name  = "mem:0:u",
1259                .check = test__checkevent_breakpoint_modifier,
1260        },
1261        [20] = {
1262                .name  = "mem:0:x:k",
1263                .check = test__checkevent_breakpoint_x_modifier,
1264        },
1265        [21] = {
1266                .name  = "mem:0:r:hp",
1267                .check = test__checkevent_breakpoint_r_modifier,
1268        },
1269        [22] = {
1270                .name  = "mem:0:w:up",
1271                .check = test__checkevent_breakpoint_w_modifier,
1272        },
1273        [23] = {
1274                .name  = "r1,syscalls:sys_enter_open:k,1:1:hp",
1275                .check = test__checkevent_list,
1276        },
1277        [24] = {
1278                .name  = "instructions:G",
1279                .check = test__checkevent_exclude_host_modifier,
1280        },
1281        [25] = {
1282                .name  = "instructions:H",
1283                .check = test__checkevent_exclude_guest_modifier,
1284        },
1285        [26] = {
1286                .name  = "mem:0:rw",
1287                .check = test__checkevent_breakpoint_rw,
1288        },
1289        [27] = {
1290                .name  = "mem:0:rw:kp",
1291                .check = test__checkevent_breakpoint_rw_modifier,
1292        },
1293        [28] = {
1294                .name  = "{instructions:k,cycles:upp}",
1295                .check = test__group1,
1296        },
1297        [29] = {
1298                .name  = "{faults:k,cache-references}:u,cycles:k",
1299                .check = test__group2,
1300        },
1301        [30] = {
1302                .name  = "group1{syscalls:sys_enter_open:H,cycles:kppp},group2{cycles,1:3}:G,instructions:u",
1303                .check = test__group3,
1304        },
1305        [31] = {
1306                .name  = "{cycles:u,instructions:kp}:p",
1307                .check = test__group4,
1308        },
1309        [32] = {
1310                .name  = "{cycles,instructions}:G,{cycles:G,instructions:G},cycles",
1311                .check = test__group5,
1312        },
1313        [33] = {
1314                .name  = "*:*",
1315                .check = test__all_tracepoints,
1316        },
1317        [34] = {
1318                .name  = "{cycles,cache-misses:G}:H",
1319                .check = test__group_gh1,
1320        },
1321        [35] = {
1322                .name  = "{cycles,cache-misses:H}:G",
1323                .check = test__group_gh2,
1324        },
1325        [36] = {
1326                .name  = "{cycles:G,cache-misses:H}:u",
1327                .check = test__group_gh3,
1328        },
1329        [37] = {
1330                .name  = "{cycles:G,cache-misses:H}:uG",
1331                .check = test__group_gh4,
1332        },
1333        [38] = {
1334                .name  = "{cycles,cache-misses,branch-misses}:S",
1335                .check = test__leader_sample1,
1336        },
1337        [39] = {
1338                .name  = "{instructions,branch-misses}:Su",
1339                .check = test__leader_sample2,
1340        },
1341        [40] = {
1342                .name  = "instructions:uDp",
1343                .check = test__checkevent_pinned_modifier,
1344        },
1345        [41] = {
1346                .name  = "{cycles,cache-misses,branch-misses}:D",
1347                .check = test__pinned_group,
1348        },
1349};
1350
1351static struct evlist_test test__events_pmu[] = {
1352        [0] = {
1353                .name  = "cpu/config=10,config1,config2=3,period=1000/u",
1354                .check = test__checkevent_pmu,
1355        },
1356        [1] = {
1357                .name  = "cpu/config=1,name=krava/u,cpu/config=2/u",
1358                .check = test__checkevent_pmu_name,
1359        },
1360};
1361
1362struct terms_test {
1363        const char *str;
1364        __u32 type;
1365        int (*check)(struct list_head *terms);
1366};
1367
1368static struct terms_test test__terms[] = {
1369        [0] = {
1370                .str   = "config=10,config1,config2=3,umask=1",
1371                .check = test__checkterms_simple,
1372        },
1373};
1374
1375static int test_event(struct evlist_test *e)
1376{
1377        struct perf_evlist *evlist;
1378        int ret;
1379
1380        evlist = perf_evlist__new();
1381        if (evlist == NULL)
1382                return -ENOMEM;
1383
1384        ret = parse_events(evlist, e->name);
1385        if (ret) {
1386                pr_debug("failed to parse event '%s', err %d\n",
1387                         e->name, ret);
1388        } else {
1389                ret = e->check(evlist);
1390        }
1391        
1392        perf_evlist__delete(evlist);
1393
1394        return ret;
1395}
1396
1397static int test_events(struct evlist_test *events, unsigned cnt)
1398{
1399        int ret1, ret2 = 0;
1400        unsigned i;
1401
1402        for (i = 0; i < cnt; i++) {
1403                struct evlist_test *e = &events[i];
1404
1405                pr_debug("running test %d '%s'\n", i, e->name);
1406                ret1 = test_event(e);
1407                if (ret1)
1408                        ret2 = ret1;
1409        }
1410
1411        return ret2;
1412}
1413
1414static int test_term(struct terms_test *t)
1415{
1416        struct list_head terms;
1417        int ret;
1418
1419        INIT_LIST_HEAD(&terms);
1420
1421        ret = parse_events_terms(&terms, t->str);
1422        if (ret) {
1423                pr_debug("failed to parse terms '%s', err %d\n",
1424                         t->str , ret);
1425                return ret;
1426        }
1427
1428        ret = t->check(&terms);
1429        parse_events__free_terms(&terms);
1430
1431        return ret;
1432}
1433
1434static int test_terms(struct terms_test *terms, unsigned cnt)
1435{
1436        int ret = 0;
1437        unsigned i;
1438
1439        for (i = 0; i < cnt; i++) {
1440                struct terms_test *t = &terms[i];
1441
1442                pr_debug("running test %d '%s'\n", i, t->str);
1443                ret = test_term(t);
1444                if (ret)
1445                        break;
1446        }
1447
1448        return ret;
1449}
1450
1451static int test_pmu(void)
1452{
1453        struct stat st;
1454        char path[PATH_MAX];
1455        int ret;
1456
1457        snprintf(path, PATH_MAX, "%s/bus/event_source/devices/cpu/format/",
1458                 sysfs__mountpoint());
1459
1460        ret = stat(path, &st);
1461        if (ret)
1462                pr_debug("omitting PMU cpu tests\n");
1463        return !ret;
1464}
1465
1466static int test_pmu_events(void)
1467{
1468        struct stat st;
1469        char path[PATH_MAX];
1470        struct dirent *ent;
1471        DIR *dir;
1472        int ret;
1473
1474        snprintf(path, PATH_MAX, "%s/bus/event_source/devices/cpu/events/",
1475                 sysfs__mountpoint());
1476
1477        ret = stat(path, &st);
1478        if (ret) {
1479                pr_debug("omitting PMU cpu events tests\n");
1480                return 0;
1481        }
1482
1483        dir = opendir(path);
1484        if (!dir) {
1485                pr_debug("can't open pmu event dir");
1486                return -1;
1487        }
1488
1489        while (!ret && (ent = readdir(dir))) {
1490#define MAX_NAME 100
1491                struct evlist_test e;
1492                char name[MAX_NAME];
1493
1494                if (!strcmp(ent->d_name, ".") ||
1495                    !strcmp(ent->d_name, ".."))
1496                        continue;
1497
1498                snprintf(name, MAX_NAME, "cpu/event=%s/u", ent->d_name);
1499
1500                e.name  = name;
1501                e.check = test__checkevent_pmu_events;
1502
1503                ret = test_event(&e);
1504#undef MAX_NAME
1505        }
1506
1507        closedir(dir);
1508        return ret;
1509}
1510
1511int test__parse_events(void)
1512{
1513        int ret1, ret2 = 0;
1514
1515#define TEST_EVENTS(tests)                              \
1516do {                                                    \
1517        ret1 = test_events(tests, ARRAY_SIZE(tests));   \
1518        if (!ret2)                                      \
1519                ret2 = ret1;                            \
1520} while (0)
1521
1522        TEST_EVENTS(test__events);
1523
1524        if (test_pmu())
1525                TEST_EVENTS(test__events_pmu);
1526
1527        if (test_pmu()) {
1528                int ret = test_pmu_events();
1529                if (ret)
1530                        return ret;
1531        }
1532
1533        ret1 = test_terms(test__terms, ARRAY_SIZE(test__terms));
1534        if (!ret2)
1535                ret2 = ret1;
1536
1537        return ret2;
1538}
1539