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