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