1 %define api.pure full
2 %parse-param {void *format}
3 %parse-param {void *scanner}
4 %lex-param {void* scanner}
5
6 %{
7
8 #include <linux/compiler.h>
9 #include <linux/list.h>
10 #include <linux/bitmap.h>
11 #include <string.h>
12 #include "pmu.h"
13 #include "pmu-bison.h"
14
15 int perf_pmu_lex(YYSTYPE * yylval_param , void *yyscanner);
16
17 #define ABORT_ON(val) \
18 do { \
19 if (val) \
20 YYABORT; \
21 } while (0)
22
23 static void perf_pmu_error(void *format, void *scanner, const char *msg);
24
perf_pmu__set_format(unsigned long * bits,long from,long to)25 static void perf_pmu__set_format(unsigned long *bits, long from, long to)
26 {
27 long b;
28
29 if (!to)
30 to = from;
31
32 memset(bits, 0, BITS_TO_BYTES(PERF_PMU_FORMAT_BITS));
33 for (b = from; b <= to; b++)
34 __set_bit(b, bits);
35 }
36
37 %}
38
39 %token PP_CONFIG
40 %token PP_VALUE PP_ERROR
41 %type <num> PP_VALUE
42 %type <bits> bit_term
43 %type <bits> bits
44
45 %union
46 {
47 unsigned long num;
48 DECLARE_BITMAP(bits, PERF_PMU_FORMAT_BITS);
49 }
50
51 %%
52
53 format:
54 format format_term
55 |
56 format_term
57
58 format_term:
59 PP_CONFIG ':' bits
60 {
61 perf_pmu_format__set_value(format, PERF_PMU_FORMAT_VALUE_CONFIG, $3);
62 }
63 |
64 PP_CONFIG PP_VALUE ':' bits
65 {
66 perf_pmu_format__set_value(format, $2, $4);
67 }
68
69 bits:
70 bits ',' bit_term
71 {
72 bitmap_or($$, $1, $3, 64);
73 }
74 |
75 bit_term
76 {
77 memcpy($$, $1, sizeof($1));
78 }
79
80 bit_term:
81 PP_VALUE '-' PP_VALUE
82 {
83 perf_pmu__set_format($$, $1, $3);
84 }
85 |
86 PP_VALUE
87 {
88 perf_pmu__set_format($$, $1, 0);
89 }
90
91 %%
92
93 static void perf_pmu_error(void *format __maybe_unused,
94 void *scanner __maybe_unused,
95 const char *msg __maybe_unused)
96 {
97 }
98