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