2012-06-15 14:31:39 +08:00
|
|
|
%pure-parser
|
2012-06-15 14:31:38 +08:00
|
|
|
%parse-param {void *_data}
|
2012-06-15 14:31:39 +08:00
|
|
|
%parse-param {void *scanner}
|
|
|
|
%lex-param {void* scanner}
|
2015-04-23 03:10:17 +08:00
|
|
|
%locations
|
2012-03-16 03:09:15 +08:00
|
|
|
|
|
|
|
%{
|
|
|
|
|
|
|
|
#define YYDEBUG 1
|
|
|
|
|
|
|
|
#include <linux/compiler.h>
|
|
|
|
#include <linux/list.h>
|
2014-04-26 03:31:02 +08:00
|
|
|
#include <linux/types.h>
|
2012-03-16 03:09:15 +08:00
|
|
|
#include "util.h"
|
|
|
|
#include "parse-events.h"
|
2012-06-15 14:31:39 +08:00
|
|
|
#include "parse-events-bison.h"
|
2012-03-16 03:09:15 +08:00
|
|
|
|
|
|
|
#define ABORT_ON(val) \
|
|
|
|
do { \
|
|
|
|
if (val) \
|
|
|
|
YYABORT; \
|
|
|
|
} while (0)
|
|
|
|
|
2013-07-03 03:27:25 +08:00
|
|
|
#define ALLOC_LIST(list) \
|
|
|
|
do { \
|
|
|
|
list = malloc(sizeof(*list)); \
|
|
|
|
ABORT_ON(!list); \
|
|
|
|
INIT_LIST_HEAD(list); \
|
|
|
|
} while (0)
|
|
|
|
|
2013-01-22 17:09:29 +08:00
|
|
|
static inc_group_count(struct list_head *list,
|
|
|
|
struct parse_events_evlist *data)
|
|
|
|
{
|
|
|
|
/* Count groups only have more than 1 members */
|
|
|
|
if (!list_is_last(list->next, list))
|
|
|
|
data->nr_groups++;
|
|
|
|
}
|
|
|
|
|
2012-03-16 03:09:15 +08:00
|
|
|
%}
|
|
|
|
|
2012-06-15 14:31:40 +08:00
|
|
|
%token PE_START_EVENTS PE_START_TERMS
|
2012-07-04 06:00:43 +08:00
|
|
|
%token PE_VALUE PE_VALUE_SYM_HW PE_VALUE_SYM_SW PE_RAW PE_TERM
|
2012-08-17 03:10:21 +08:00
|
|
|
%token PE_EVENT_NAME
|
2012-03-16 03:09:15 +08:00
|
|
|
%token PE_NAME
|
2015-10-14 20:41:20 +08:00
|
|
|
%token PE_BPF_OBJECT PE_BPF_SOURCE
|
2012-03-16 03:09:15 +08:00
|
|
|
%token PE_MODIFIER_EVENT PE_MODIFIER_BP
|
|
|
|
%token PE_NAME_CACHE_TYPE PE_NAME_CACHE_OP_RESULT
|
2012-08-08 18:14:14 +08:00
|
|
|
%token PE_PREFIX_MEM PE_PREFIX_RAW PE_PREFIX_GROUP
|
2012-03-16 03:09:15 +08:00
|
|
|
%token PE_ERROR
|
2014-10-07 23:08:51 +08:00
|
|
|
%token PE_PMU_EVENT_PRE PE_PMU_EVENT_SUF PE_KERNEL_PMU_EVENT
|
2012-03-16 03:09:15 +08:00
|
|
|
%type <num> PE_VALUE
|
2012-07-04 06:00:43 +08:00
|
|
|
%type <num> PE_VALUE_SYM_HW
|
|
|
|
%type <num> PE_VALUE_SYM_SW
|
2012-03-16 03:09:15 +08:00
|
|
|
%type <num> PE_RAW
|
2012-03-16 03:09:16 +08:00
|
|
|
%type <num> PE_TERM
|
2012-03-16 03:09:15 +08:00
|
|
|
%type <str> PE_NAME
|
perf tools: Enable passing bpf object file to --event
By introducing new rules in tools/perf/util/parse-events.[ly], this
patch enables 'perf record --event bpf_file.o' to select events by an
eBPF object file. It calls parse_events_load_bpf() to load that file,
which uses bpf__prepare_load() and finally calls bpf_object__open() for
the object files.
After applying this patch, commands like:
# perf record --event foo.o sleep
become possible.
However, at this point it is unable to link any useful things onto the
evsel list because the creating of probe points and BPF program
attaching have not been implemented. Before real events are possible to
be extracted, to avoid perf report error because of empty evsel list,
this patch link a dummy evsel. The dummy event related code will be
removed when probing and extracting code is ready.
Commiter notes:
Using it:
$ ls -la foo.o
ls: cannot access foo.o: No such file or directory
$ perf record --event foo.o sleep
libbpf: failed to open foo.o: No such file or directory
event syntax error: 'foo.o'
\___ BPF object file 'foo.o' is invalid
(add -v to see detail)
Run 'perf list' for a list of valid events
Usage: perf record [<options>] [<command>]
or: perf record [<options>] -- <command> [<options>]
-e, --event <event> event selector. use 'perf list' to list available events
$
$ file /tmp/build/perf/perf.o
/tmp/build/perf/perf.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
$ perf record --event /tmp/build/perf/perf.o sleep
libbpf: /tmp/build/perf/perf.o is not an eBPF object file
event syntax error: '/tmp/build/perf/perf.o'
\___ BPF object file '/tmp/build/perf/perf.o' is invalid
(add -v to see detail)
Run 'perf list' for a list of valid events
Usage: perf record [<options>] [<command>]
or: perf record [<options>] -- <command> [<options>]
-e, --event <event> event selector. use 'perf list' to list available events
$
$ file /tmp/foo.o
/tmp/foo.o: ELF 64-bit LSB relocatable, no machine, version 1 (SYSV), not stripped
$ perf record --event /tmp/foo.o sleep 1
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.013 MB perf.data ]
$ perf evlist
/tmp/foo.o
$ perf evlist -v
/tmp/foo.o: type: 1, size: 112, config: 0x9, { sample_period, sample_freq }: 4000, sample_type: IP|TID|TIME|PERIOD, disabled: 1, inherit: 1, mmap: 1, comm: 1, freq: 1, enable_on_exec: 1, task: 1, sample_id_all: 1, exclude_guest: 1, mmap2: 1, comm_exec: 1
$
So, type 1 is PERF_TYPE_SOFTWARE, config 0x9 is PERF_COUNT_SW_DUMMY, ok.
$ perf report --stdio
Error:
The perf.data file has no samples!
# To display the perf.data header info, please use --header/--header-only options.
#
$
Signed-off-by: Wang Nan <wangnan0@huawei.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Alexei Starovoitov <ast@plumgrid.com>
Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
Cc: Daniel Borkmann <daniel@iogearbox.net>
Cc: David Ahern <dsahern@gmail.com>
Cc: He Kuang <hekuang@huawei.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kaixu Xia <xiakaixu@huawei.com>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
Link: http://lkml.kernel.org/r/1444826502-49291-4-git-send-email-wangnan0@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2015-10-14 20:41:14 +08:00
|
|
|
%type <str> PE_BPF_OBJECT
|
2015-10-14 20:41:20 +08:00
|
|
|
%type <str> PE_BPF_SOURCE
|
2012-03-16 03:09:15 +08:00
|
|
|
%type <str> PE_NAME_CACHE_TYPE
|
|
|
|
%type <str> PE_NAME_CACHE_OP_RESULT
|
|
|
|
%type <str> PE_MODIFIER_EVENT
|
|
|
|
%type <str> PE_MODIFIER_BP
|
2012-08-17 03:10:21 +08:00
|
|
|
%type <str> PE_EVENT_NAME
|
2014-10-07 23:08:51 +08:00
|
|
|
%type <str> PE_PMU_EVENT_PRE PE_PMU_EVENT_SUF PE_KERNEL_PMU_EVENT
|
2012-07-04 06:00:43 +08:00
|
|
|
%type <num> value_sym
|
2012-03-16 03:09:16 +08:00
|
|
|
%type <head> event_config
|
|
|
|
%type <term> event_term
|
2012-05-21 15:12:51 +08:00
|
|
|
%type <head> event_pmu
|
|
|
|
%type <head> event_legacy_symbol
|
|
|
|
%type <head> event_legacy_cache
|
|
|
|
%type <head> event_legacy_mem
|
|
|
|
%type <head> event_legacy_tracepoint
|
2015-09-28 11:52:15 +08:00
|
|
|
%type <tracepoint_name> tracepoint_name
|
2012-05-21 15:12:51 +08:00
|
|
|
%type <head> event_legacy_numeric
|
|
|
|
%type <head> event_legacy_raw
|
perf tools: Enable passing bpf object file to --event
By introducing new rules in tools/perf/util/parse-events.[ly], this
patch enables 'perf record --event bpf_file.o' to select events by an
eBPF object file. It calls parse_events_load_bpf() to load that file,
which uses bpf__prepare_load() and finally calls bpf_object__open() for
the object files.
After applying this patch, commands like:
# perf record --event foo.o sleep
become possible.
However, at this point it is unable to link any useful things onto the
evsel list because the creating of probe points and BPF program
attaching have not been implemented. Before real events are possible to
be extracted, to avoid perf report error because of empty evsel list,
this patch link a dummy evsel. The dummy event related code will be
removed when probing and extracting code is ready.
Commiter notes:
Using it:
$ ls -la foo.o
ls: cannot access foo.o: No such file or directory
$ perf record --event foo.o sleep
libbpf: failed to open foo.o: No such file or directory
event syntax error: 'foo.o'
\___ BPF object file 'foo.o' is invalid
(add -v to see detail)
Run 'perf list' for a list of valid events
Usage: perf record [<options>] [<command>]
or: perf record [<options>] -- <command> [<options>]
-e, --event <event> event selector. use 'perf list' to list available events
$
$ file /tmp/build/perf/perf.o
/tmp/build/perf/perf.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
$ perf record --event /tmp/build/perf/perf.o sleep
libbpf: /tmp/build/perf/perf.o is not an eBPF object file
event syntax error: '/tmp/build/perf/perf.o'
\___ BPF object file '/tmp/build/perf/perf.o' is invalid
(add -v to see detail)
Run 'perf list' for a list of valid events
Usage: perf record [<options>] [<command>]
or: perf record [<options>] -- <command> [<options>]
-e, --event <event> event selector. use 'perf list' to list available events
$
$ file /tmp/foo.o
/tmp/foo.o: ELF 64-bit LSB relocatable, no machine, version 1 (SYSV), not stripped
$ perf record --event /tmp/foo.o sleep 1
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.013 MB perf.data ]
$ perf evlist
/tmp/foo.o
$ perf evlist -v
/tmp/foo.o: type: 1, size: 112, config: 0x9, { sample_period, sample_freq }: 4000, sample_type: IP|TID|TIME|PERIOD, disabled: 1, inherit: 1, mmap: 1, comm: 1, freq: 1, enable_on_exec: 1, task: 1, sample_id_all: 1, exclude_guest: 1, mmap2: 1, comm_exec: 1
$
So, type 1 is PERF_TYPE_SOFTWARE, config 0x9 is PERF_COUNT_SW_DUMMY, ok.
$ perf report --stdio
Error:
The perf.data file has no samples!
# To display the perf.data header info, please use --header/--header-only options.
#
$
Signed-off-by: Wang Nan <wangnan0@huawei.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Alexei Starovoitov <ast@plumgrid.com>
Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
Cc: Daniel Borkmann <daniel@iogearbox.net>
Cc: David Ahern <dsahern@gmail.com>
Cc: He Kuang <hekuang@huawei.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kaixu Xia <xiakaixu@huawei.com>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
Link: http://lkml.kernel.org/r/1444826502-49291-4-git-send-email-wangnan0@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2015-10-14 20:41:14 +08:00
|
|
|
%type <head> event_bpf_file
|
2012-05-21 15:12:51 +08:00
|
|
|
%type <head> event_def
|
2012-08-17 03:10:21 +08:00
|
|
|
%type <head> event_mod
|
|
|
|
%type <head> event_name
|
2012-08-08 18:14:14 +08:00
|
|
|
%type <head> event
|
|
|
|
%type <head> events
|
|
|
|
%type <head> group_def
|
|
|
|
%type <head> group
|
|
|
|
%type <head> groups
|
2012-03-16 03:09:15 +08:00
|
|
|
|
|
|
|
%union
|
|
|
|
{
|
|
|
|
char *str;
|
2012-08-08 01:43:13 +08:00
|
|
|
u64 num;
|
2012-03-16 03:09:16 +08:00
|
|
|
struct list_head *head;
|
2013-01-19 03:29:49 +08:00
|
|
|
struct parse_events_term *term;
|
2015-09-28 11:52:15 +08:00
|
|
|
struct tracepoint_name {
|
|
|
|
char *sys;
|
|
|
|
char *event;
|
|
|
|
} tracepoint_name;
|
2012-03-16 03:09:15 +08:00
|
|
|
}
|
|
|
|
%%
|
|
|
|
|
2012-06-15 14:31:40 +08:00
|
|
|
start:
|
2012-08-08 18:14:14 +08:00
|
|
|
PE_START_EVENTS start_events
|
2012-06-15 14:31:40 +08:00
|
|
|
|
|
2012-08-08 18:14:14 +08:00
|
|
|
PE_START_TERMS start_terms
|
|
|
|
|
|
|
|
start_events: groups
|
|
|
|
{
|
2013-01-19 03:56:57 +08:00
|
|
|
struct parse_events_evlist *data = _data;
|
2012-08-08 18:14:14 +08:00
|
|
|
|
|
|
|
parse_events_update_lists($1, &data->list);
|
|
|
|
}
|
|
|
|
|
|
|
|
groups:
|
|
|
|
groups ',' group
|
|
|
|
{
|
|
|
|
struct list_head *list = $1;
|
|
|
|
struct list_head *group = $3;
|
|
|
|
|
|
|
|
parse_events_update_lists(group, list);
|
|
|
|
$$ = list;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
groups ',' event
|
|
|
|
{
|
|
|
|
struct list_head *list = $1;
|
|
|
|
struct list_head *event = $3;
|
|
|
|
|
|
|
|
parse_events_update_lists(event, list);
|
|
|
|
$$ = list;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
group
|
|
|
|
|
|
|
|
|
event
|
|
|
|
|
|
|
|
group:
|
|
|
|
group_def ':' PE_MODIFIER_EVENT
|
|
|
|
{
|
|
|
|
struct list_head *list = $1;
|
|
|
|
|
|
|
|
ABORT_ON(parse_events__modifier_group(list, $3));
|
|
|
|
$$ = list;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
group_def
|
|
|
|
|
|
|
|
group_def:
|
|
|
|
PE_NAME '{' events '}'
|
|
|
|
{
|
|
|
|
struct list_head *list = $3;
|
|
|
|
|
2013-01-22 17:09:29 +08:00
|
|
|
inc_group_count(list, _data);
|
2012-08-15 03:35:48 +08:00
|
|
|
parse_events__set_leader($1, list);
|
2012-08-08 18:14:14 +08:00
|
|
|
$$ = list;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
'{' events '}'
|
|
|
|
{
|
|
|
|
struct list_head *list = $2;
|
|
|
|
|
2013-01-22 17:09:29 +08:00
|
|
|
inc_group_count(list, _data);
|
2012-08-15 03:35:48 +08:00
|
|
|
parse_events__set_leader(NULL, list);
|
2012-08-08 18:14:14 +08:00
|
|
|
$$ = list;
|
|
|
|
}
|
2012-06-15 14:31:40 +08:00
|
|
|
|
2012-03-16 03:09:15 +08:00
|
|
|
events:
|
2012-08-08 18:14:14 +08:00
|
|
|
events ',' event
|
|
|
|
{
|
|
|
|
struct list_head *event = $3;
|
|
|
|
struct list_head *list = $1;
|
|
|
|
|
|
|
|
parse_events_update_lists(event, list);
|
|
|
|
$$ = list;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
event
|
2012-03-16 03:09:15 +08:00
|
|
|
|
2012-08-17 03:10:21 +08:00
|
|
|
event: event_mod
|
|
|
|
|
|
|
|
event_mod:
|
|
|
|
event_name PE_MODIFIER_EVENT
|
2012-03-16 03:09:15 +08:00
|
|
|
{
|
2012-08-08 18:14:14 +08:00
|
|
|
struct list_head *list = $1;
|
2012-06-15 14:31:38 +08:00
|
|
|
|
2012-03-21 02:15:40 +08:00
|
|
|
/*
|
|
|
|
* Apply modifier on all events added by single event definition
|
|
|
|
* (there could be more events added for multiple tracepoint
|
|
|
|
* definitions via '*?'.
|
|
|
|
*/
|
2012-08-08 18:21:54 +08:00
|
|
|
ABORT_ON(parse_events__modifier_event(list, $2, false));
|
2012-08-08 18:14:14 +08:00
|
|
|
$$ = list;
|
2012-03-16 03:09:15 +08:00
|
|
|
}
|
|
|
|
|
|
2012-08-17 03:10:21 +08:00
|
|
|
event_name
|
|
|
|
|
|
|
|
event_name:
|
|
|
|
PE_EVENT_NAME event_def
|
|
|
|
{
|
|
|
|
ABORT_ON(parse_events_name($2, $1));
|
|
|
|
free($1);
|
|
|
|
$$ = $2;
|
|
|
|
}
|
|
|
|
|
|
2012-03-16 03:09:15 +08:00
|
|
|
event_def
|
|
|
|
|
2012-03-16 03:09:18 +08:00
|
|
|
event_def: event_pmu |
|
|
|
|
event_legacy_symbol |
|
2012-03-16 03:09:15 +08:00
|
|
|
event_legacy_cache sep_dc |
|
|
|
|
event_legacy_mem |
|
|
|
|
event_legacy_tracepoint sep_dc |
|
|
|
|
event_legacy_numeric sep_dc |
|
perf tools: Enable passing bpf object file to --event
By introducing new rules in tools/perf/util/parse-events.[ly], this
patch enables 'perf record --event bpf_file.o' to select events by an
eBPF object file. It calls parse_events_load_bpf() to load that file,
which uses bpf__prepare_load() and finally calls bpf_object__open() for
the object files.
After applying this patch, commands like:
# perf record --event foo.o sleep
become possible.
However, at this point it is unable to link any useful things onto the
evsel list because the creating of probe points and BPF program
attaching have not been implemented. Before real events are possible to
be extracted, to avoid perf report error because of empty evsel list,
this patch link a dummy evsel. The dummy event related code will be
removed when probing and extracting code is ready.
Commiter notes:
Using it:
$ ls -la foo.o
ls: cannot access foo.o: No such file or directory
$ perf record --event foo.o sleep
libbpf: failed to open foo.o: No such file or directory
event syntax error: 'foo.o'
\___ BPF object file 'foo.o' is invalid
(add -v to see detail)
Run 'perf list' for a list of valid events
Usage: perf record [<options>] [<command>]
or: perf record [<options>] -- <command> [<options>]
-e, --event <event> event selector. use 'perf list' to list available events
$
$ file /tmp/build/perf/perf.o
/tmp/build/perf/perf.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
$ perf record --event /tmp/build/perf/perf.o sleep
libbpf: /tmp/build/perf/perf.o is not an eBPF object file
event syntax error: '/tmp/build/perf/perf.o'
\___ BPF object file '/tmp/build/perf/perf.o' is invalid
(add -v to see detail)
Run 'perf list' for a list of valid events
Usage: perf record [<options>] [<command>]
or: perf record [<options>] -- <command> [<options>]
-e, --event <event> event selector. use 'perf list' to list available events
$
$ file /tmp/foo.o
/tmp/foo.o: ELF 64-bit LSB relocatable, no machine, version 1 (SYSV), not stripped
$ perf record --event /tmp/foo.o sleep 1
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.013 MB perf.data ]
$ perf evlist
/tmp/foo.o
$ perf evlist -v
/tmp/foo.o: type: 1, size: 112, config: 0x9, { sample_period, sample_freq }: 4000, sample_type: IP|TID|TIME|PERIOD, disabled: 1, inherit: 1, mmap: 1, comm: 1, freq: 1, enable_on_exec: 1, task: 1, sample_id_all: 1, exclude_guest: 1, mmap2: 1, comm_exec: 1
$
So, type 1 is PERF_TYPE_SOFTWARE, config 0x9 is PERF_COUNT_SW_DUMMY, ok.
$ perf report --stdio
Error:
The perf.data file has no samples!
# To display the perf.data header info, please use --header/--header-only options.
#
$
Signed-off-by: Wang Nan <wangnan0@huawei.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Alexei Starovoitov <ast@plumgrid.com>
Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
Cc: Daniel Borkmann <daniel@iogearbox.net>
Cc: David Ahern <dsahern@gmail.com>
Cc: He Kuang <hekuang@huawei.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kaixu Xia <xiakaixu@huawei.com>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
Link: http://lkml.kernel.org/r/1444826502-49291-4-git-send-email-wangnan0@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2015-10-14 20:41:14 +08:00
|
|
|
event_legacy_raw sep_dc |
|
|
|
|
event_bpf_file
|
2012-03-16 03:09:15 +08:00
|
|
|
|
2012-03-16 03:09:18 +08:00
|
|
|
event_pmu:
|
|
|
|
PE_NAME '/' event_config '/'
|
|
|
|
{
|
2013-01-19 03:56:57 +08:00
|
|
|
struct parse_events_evlist *data = _data;
|
2013-07-03 03:27:25 +08:00
|
|
|
struct list_head *list;
|
2012-05-21 15:12:51 +08:00
|
|
|
|
2013-07-03 03:27:25 +08:00
|
|
|
ALLOC_LIST(list);
|
2015-04-23 03:10:19 +08:00
|
|
|
ABORT_ON(parse_events_add_pmu(data, list, $1, $3));
|
2016-02-13 04:09:17 +08:00
|
|
|
parse_events_terms__delete($3);
|
2012-05-21 15:12:51 +08:00
|
|
|
$$ = list;
|
2012-03-16 03:09:18 +08:00
|
|
|
}
|
2014-08-16 03:08:40 +08:00
|
|
|
|
|
|
|
|
PE_NAME '/' '/'
|
|
|
|
{
|
|
|
|
struct parse_events_evlist *data = _data;
|
|
|
|
struct list_head *list;
|
|
|
|
|
|
|
|
ALLOC_LIST(list);
|
2015-04-23 03:10:19 +08:00
|
|
|
ABORT_ON(parse_events_add_pmu(data, list, $1, NULL));
|
2014-08-16 03:08:40 +08:00
|
|
|
$$ = list;
|
|
|
|
}
|
2014-10-07 23:08:51 +08:00
|
|
|
|
|
|
|
|
PE_KERNEL_PMU_EVENT sep_dc
|
|
|
|
{
|
|
|
|
struct parse_events_evlist *data = _data;
|
|
|
|
struct list_head *head;
|
|
|
|
struct parse_events_term *term;
|
|
|
|
struct list_head *list;
|
|
|
|
|
|
|
|
ALLOC_LIST(head);
|
|
|
|
ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
|
2015-04-23 03:10:20 +08:00
|
|
|
$1, 1, &@1, NULL));
|
2014-10-07 23:08:51 +08:00
|
|
|
list_add_tail(&term->list, head);
|
|
|
|
|
|
|
|
ALLOC_LIST(list);
|
2015-04-23 03:10:19 +08:00
|
|
|
ABORT_ON(parse_events_add_pmu(data, list, "cpu", head));
|
2016-02-13 04:09:17 +08:00
|
|
|
parse_events_terms__delete(head);
|
2014-10-07 23:08:51 +08:00
|
|
|
$$ = list;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
PE_PMU_EVENT_PRE '-' PE_PMU_EVENT_SUF sep_dc
|
|
|
|
{
|
|
|
|
struct parse_events_evlist *data = _data;
|
|
|
|
struct list_head *head;
|
|
|
|
struct parse_events_term *term;
|
|
|
|
struct list_head *list;
|
|
|
|
char pmu_name[128];
|
|
|
|
snprintf(&pmu_name, 128, "%s-%s", $1, $3);
|
|
|
|
|
|
|
|
ALLOC_LIST(head);
|
|
|
|
ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
|
2015-04-23 03:10:20 +08:00
|
|
|
&pmu_name, 1, &@1, NULL));
|
2014-10-07 23:08:51 +08:00
|
|
|
list_add_tail(&term->list, head);
|
|
|
|
|
|
|
|
ALLOC_LIST(list);
|
2015-09-02 15:56:31 +08:00
|
|
|
ABORT_ON(parse_events_add_pmu(data, list, "cpu", head));
|
2016-02-13 04:09:17 +08:00
|
|
|
parse_events_terms__delete(head);
|
2014-10-07 23:08:51 +08:00
|
|
|
$$ = list;
|
|
|
|
}
|
2012-03-16 03:09:18 +08:00
|
|
|
|
2012-07-04 06:00:43 +08:00
|
|
|
value_sym:
|
|
|
|
PE_VALUE_SYM_HW
|
|
|
|
|
|
|
|
|
PE_VALUE_SYM_SW
|
|
|
|
|
2012-03-16 03:09:15 +08:00
|
|
|
event_legacy_symbol:
|
2012-07-04 06:00:43 +08:00
|
|
|
value_sym '/' event_config '/'
|
2012-03-16 03:09:15 +08:00
|
|
|
{
|
2013-01-19 03:56:57 +08:00
|
|
|
struct parse_events_evlist *data = _data;
|
2013-07-03 03:27:25 +08:00
|
|
|
struct list_head *list;
|
2012-03-16 03:09:15 +08:00
|
|
|
int type = $1 >> 16;
|
|
|
|
int config = $1 & 255;
|
|
|
|
|
2013-07-03 03:27:25 +08:00
|
|
|
ALLOC_LIST(list);
|
2015-04-23 03:10:24 +08:00
|
|
|
ABORT_ON(parse_events_add_numeric(data, list, type, config, $3));
|
2016-02-13 04:09:17 +08:00
|
|
|
parse_events_terms__delete($3);
|
2012-05-21 15:12:51 +08:00
|
|
|
$$ = list;
|
2012-03-16 03:09:16 +08:00
|
|
|
}
|
|
|
|
|
|
2012-07-04 06:00:43 +08:00
|
|
|
value_sym sep_slash_dc
|
2012-03-16 03:09:16 +08:00
|
|
|
{
|
2013-01-19 03:56:57 +08:00
|
|
|
struct parse_events_evlist *data = _data;
|
2013-07-03 03:27:25 +08:00
|
|
|
struct list_head *list;
|
2012-03-16 03:09:16 +08:00
|
|
|
int type = $1 >> 16;
|
|
|
|
int config = $1 & 255;
|
|
|
|
|
2013-07-03 03:27:25 +08:00
|
|
|
ALLOC_LIST(list);
|
2015-04-23 03:10:24 +08:00
|
|
|
ABORT_ON(parse_events_add_numeric(data, list, type, config, NULL));
|
2012-05-21 15:12:51 +08:00
|
|
|
$$ = list;
|
2012-03-16 03:09:15 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
event_legacy_cache:
|
|
|
|
PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT '-' PE_NAME_CACHE_OP_RESULT
|
|
|
|
{
|
2013-01-19 03:56:57 +08:00
|
|
|
struct parse_events_evlist *data = _data;
|
2013-07-03 03:27:25 +08:00
|
|
|
struct list_head *list;
|
2012-05-21 15:12:51 +08:00
|
|
|
|
2013-07-03 03:27:25 +08:00
|
|
|
ALLOC_LIST(list);
|
|
|
|
ABORT_ON(parse_events_add_cache(list, &data->idx, $1, $3, $5));
|
2012-05-21 15:12:51 +08:00
|
|
|
$$ = list;
|
2012-03-16 03:09:15 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT
|
|
|
|
{
|
2013-01-19 03:56:57 +08:00
|
|
|
struct parse_events_evlist *data = _data;
|
2013-07-03 03:27:25 +08:00
|
|
|
struct list_head *list;
|
2012-05-21 15:12:51 +08:00
|
|
|
|
2013-07-03 03:27:25 +08:00
|
|
|
ALLOC_LIST(list);
|
|
|
|
ABORT_ON(parse_events_add_cache(list, &data->idx, $1, $3, NULL));
|
2012-05-21 15:12:51 +08:00
|
|
|
$$ = list;
|
2012-03-16 03:09:15 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
PE_NAME_CACHE_TYPE
|
|
|
|
{
|
2013-01-19 03:56:57 +08:00
|
|
|
struct parse_events_evlist *data = _data;
|
2013-07-03 03:27:25 +08:00
|
|
|
struct list_head *list;
|
2012-05-21 15:12:51 +08:00
|
|
|
|
2013-07-03 03:27:25 +08:00
|
|
|
ALLOC_LIST(list);
|
|
|
|
ABORT_ON(parse_events_add_cache(list, &data->idx, $1, NULL, NULL));
|
2012-05-21 15:12:51 +08:00
|
|
|
$$ = list;
|
2012-03-16 03:09:15 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
event_legacy_mem:
|
2014-05-29 23:26:51 +08:00
|
|
|
PE_PREFIX_MEM PE_VALUE '/' PE_VALUE ':' PE_MODIFIER_BP sep_dc
|
|
|
|
{
|
|
|
|
struct parse_events_evlist *data = _data;
|
|
|
|
struct list_head *list;
|
|
|
|
|
|
|
|
ALLOC_LIST(list);
|
|
|
|
ABORT_ON(parse_events_add_breakpoint(list, &data->idx,
|
|
|
|
(void *) $2, $6, $4));
|
|
|
|
$$ = list;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
PE_PREFIX_MEM PE_VALUE '/' PE_VALUE sep_dc
|
|
|
|
{
|
|
|
|
struct parse_events_evlist *data = _data;
|
|
|
|
struct list_head *list;
|
|
|
|
|
|
|
|
ALLOC_LIST(list);
|
|
|
|
ABORT_ON(parse_events_add_breakpoint(list, &data->idx,
|
|
|
|
(void *) $2, NULL, $4));
|
|
|
|
$$ = list;
|
|
|
|
}
|
|
|
|
|
|
2012-03-16 03:09:15 +08:00
|
|
|
PE_PREFIX_MEM PE_VALUE ':' PE_MODIFIER_BP sep_dc
|
|
|
|
{
|
2013-01-19 03:56:57 +08:00
|
|
|
struct parse_events_evlist *data = _data;
|
2013-07-03 03:27:25 +08:00
|
|
|
struct list_head *list;
|
2012-05-21 15:12:51 +08:00
|
|
|
|
2013-07-03 03:27:25 +08:00
|
|
|
ALLOC_LIST(list);
|
|
|
|
ABORT_ON(parse_events_add_breakpoint(list, &data->idx,
|
2014-05-29 23:26:51 +08:00
|
|
|
(void *) $2, $4, 0));
|
2012-05-21 15:12:51 +08:00
|
|
|
$$ = list;
|
2012-03-16 03:09:15 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
PE_PREFIX_MEM PE_VALUE sep_dc
|
|
|
|
{
|
2013-01-19 03:56:57 +08:00
|
|
|
struct parse_events_evlist *data = _data;
|
2013-07-03 03:27:25 +08:00
|
|
|
struct list_head *list;
|
2012-05-21 15:12:51 +08:00
|
|
|
|
2013-07-03 03:27:25 +08:00
|
|
|
ALLOC_LIST(list);
|
|
|
|
ABORT_ON(parse_events_add_breakpoint(list, &data->idx,
|
2014-05-29 23:26:51 +08:00
|
|
|
(void *) $2, NULL, 0));
|
2012-05-21 15:12:51 +08:00
|
|
|
$$ = list;
|
2012-03-16 03:09:15 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
event_legacy_tracepoint:
|
2015-09-28 11:52:15 +08:00
|
|
|
tracepoint_name
|
2014-04-25 23:34:05 +08:00
|
|
|
{
|
|
|
|
struct parse_events_evlist *data = _data;
|
2015-09-07 16:38:07 +08:00
|
|
|
struct parse_events_error *error = data->error;
|
2014-04-25 23:34:05 +08:00
|
|
|
struct list_head *list;
|
|
|
|
|
|
|
|
ALLOC_LIST(list);
|
2015-09-28 11:52:16 +08:00
|
|
|
if (error)
|
|
|
|
error->idx = @1.first_column;
|
|
|
|
|
2015-09-28 11:52:15 +08:00
|
|
|
if (parse_events_add_tracepoint(list, &data->idx, $1.sys, $1.event,
|
2015-09-28 11:52:16 +08:00
|
|
|
error, NULL))
|
2015-09-07 16:38:07 +08:00
|
|
|
return -1;
|
2015-09-28 11:52:16 +08:00
|
|
|
|
|
|
|
$$ = list;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
tracepoint_name '/' event_config '/'
|
|
|
|
{
|
|
|
|
struct parse_events_evlist *data = _data;
|
|
|
|
struct parse_events_error *error = data->error;
|
|
|
|
struct list_head *list;
|
|
|
|
|
|
|
|
ALLOC_LIST(list);
|
|
|
|
if (error)
|
|
|
|
error->idx = @1.first_column;
|
|
|
|
|
|
|
|
if (parse_events_add_tracepoint(list, &data->idx, $1.sys, $1.event,
|
|
|
|
error, $3))
|
|
|
|
return -1;
|
|
|
|
|
2014-04-25 23:34:05 +08:00
|
|
|
$$ = list;
|
|
|
|
}
|
2015-09-28 11:52:15 +08:00
|
|
|
|
|
|
|
tracepoint_name:
|
|
|
|
PE_NAME '-' PE_NAME ':' PE_NAME
|
|
|
|
{
|
|
|
|
char sys_name[128];
|
|
|
|
struct tracepoint_name tracepoint;
|
|
|
|
|
|
|
|
snprintf(&sys_name, 128, "%s-%s", $1, $3);
|
|
|
|
tracepoint.sys = &sys_name;
|
|
|
|
tracepoint.event = $5;
|
|
|
|
|
|
|
|
$$ = tracepoint;
|
|
|
|
}
|
2014-04-25 23:34:05 +08:00
|
|
|
|
|
2012-03-16 03:09:15 +08:00
|
|
|
PE_NAME ':' PE_NAME
|
|
|
|
{
|
2015-09-28 11:52:15 +08:00
|
|
|
struct tracepoint_name tracepoint = {$1, $3};
|
2012-05-21 15:12:51 +08:00
|
|
|
|
2015-09-28 11:52:15 +08:00
|
|
|
$$ = tracepoint;
|
2012-03-16 03:09:15 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
event_legacy_numeric:
|
|
|
|
PE_VALUE ':' PE_VALUE
|
|
|
|
{
|
2013-01-19 03:56:57 +08:00
|
|
|
struct parse_events_evlist *data = _data;
|
2013-07-03 03:27:25 +08:00
|
|
|
struct list_head *list;
|
2012-05-21 15:12:51 +08:00
|
|
|
|
2013-07-03 03:27:25 +08:00
|
|
|
ALLOC_LIST(list);
|
2015-04-23 03:10:24 +08:00
|
|
|
ABORT_ON(parse_events_add_numeric(data, list, (u32)$1, $3, NULL));
|
2012-05-21 15:12:51 +08:00
|
|
|
$$ = list;
|
2012-03-16 03:09:15 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
event_legacy_raw:
|
|
|
|
PE_RAW
|
|
|
|
{
|
2013-01-19 03:56:57 +08:00
|
|
|
struct parse_events_evlist *data = _data;
|
2013-07-03 03:27:25 +08:00
|
|
|
struct list_head *list;
|
2012-05-21 15:12:51 +08:00
|
|
|
|
2013-07-03 03:27:25 +08:00
|
|
|
ALLOC_LIST(list);
|
2015-04-23 03:10:24 +08:00
|
|
|
ABORT_ON(parse_events_add_numeric(data, list, PERF_TYPE_RAW, $1, NULL));
|
2012-05-21 15:12:51 +08:00
|
|
|
$$ = list;
|
2012-03-16 03:09:16 +08:00
|
|
|
}
|
|
|
|
|
perf tools: Enable passing bpf object file to --event
By introducing new rules in tools/perf/util/parse-events.[ly], this
patch enables 'perf record --event bpf_file.o' to select events by an
eBPF object file. It calls parse_events_load_bpf() to load that file,
which uses bpf__prepare_load() and finally calls bpf_object__open() for
the object files.
After applying this patch, commands like:
# perf record --event foo.o sleep
become possible.
However, at this point it is unable to link any useful things onto the
evsel list because the creating of probe points and BPF program
attaching have not been implemented. Before real events are possible to
be extracted, to avoid perf report error because of empty evsel list,
this patch link a dummy evsel. The dummy event related code will be
removed when probing and extracting code is ready.
Commiter notes:
Using it:
$ ls -la foo.o
ls: cannot access foo.o: No such file or directory
$ perf record --event foo.o sleep
libbpf: failed to open foo.o: No such file or directory
event syntax error: 'foo.o'
\___ BPF object file 'foo.o' is invalid
(add -v to see detail)
Run 'perf list' for a list of valid events
Usage: perf record [<options>] [<command>]
or: perf record [<options>] -- <command> [<options>]
-e, --event <event> event selector. use 'perf list' to list available events
$
$ file /tmp/build/perf/perf.o
/tmp/build/perf/perf.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
$ perf record --event /tmp/build/perf/perf.o sleep
libbpf: /tmp/build/perf/perf.o is not an eBPF object file
event syntax error: '/tmp/build/perf/perf.o'
\___ BPF object file '/tmp/build/perf/perf.o' is invalid
(add -v to see detail)
Run 'perf list' for a list of valid events
Usage: perf record [<options>] [<command>]
or: perf record [<options>] -- <command> [<options>]
-e, --event <event> event selector. use 'perf list' to list available events
$
$ file /tmp/foo.o
/tmp/foo.o: ELF 64-bit LSB relocatable, no machine, version 1 (SYSV), not stripped
$ perf record --event /tmp/foo.o sleep 1
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.013 MB perf.data ]
$ perf evlist
/tmp/foo.o
$ perf evlist -v
/tmp/foo.o: type: 1, size: 112, config: 0x9, { sample_period, sample_freq }: 4000, sample_type: IP|TID|TIME|PERIOD, disabled: 1, inherit: 1, mmap: 1, comm: 1, freq: 1, enable_on_exec: 1, task: 1, sample_id_all: 1, exclude_guest: 1, mmap2: 1, comm_exec: 1
$
So, type 1 is PERF_TYPE_SOFTWARE, config 0x9 is PERF_COUNT_SW_DUMMY, ok.
$ perf report --stdio
Error:
The perf.data file has no samples!
# To display the perf.data header info, please use --header/--header-only options.
#
$
Signed-off-by: Wang Nan <wangnan0@huawei.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Alexei Starovoitov <ast@plumgrid.com>
Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
Cc: Daniel Borkmann <daniel@iogearbox.net>
Cc: David Ahern <dsahern@gmail.com>
Cc: He Kuang <hekuang@huawei.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kaixu Xia <xiakaixu@huawei.com>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
Link: http://lkml.kernel.org/r/1444826502-49291-4-git-send-email-wangnan0@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2015-10-14 20:41:14 +08:00
|
|
|
event_bpf_file:
|
|
|
|
PE_BPF_OBJECT
|
|
|
|
{
|
|
|
|
struct parse_events_evlist *data = _data;
|
|
|
|
struct parse_events_error *error = data->error;
|
|
|
|
struct list_head *list;
|
|
|
|
|
|
|
|
ALLOC_LIST(list);
|
2015-10-14 20:41:20 +08:00
|
|
|
ABORT_ON(parse_events_load_bpf(data, list, $1, false));
|
|
|
|
$$ = list;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
PE_BPF_SOURCE
|
|
|
|
{
|
|
|
|
struct parse_events_evlist *data = _data;
|
|
|
|
struct list_head *list;
|
|
|
|
|
|
|
|
ALLOC_LIST(list);
|
|
|
|
ABORT_ON(parse_events_load_bpf(data, list, $1, true));
|
perf tools: Enable passing bpf object file to --event
By introducing new rules in tools/perf/util/parse-events.[ly], this
patch enables 'perf record --event bpf_file.o' to select events by an
eBPF object file. It calls parse_events_load_bpf() to load that file,
which uses bpf__prepare_load() and finally calls bpf_object__open() for
the object files.
After applying this patch, commands like:
# perf record --event foo.o sleep
become possible.
However, at this point it is unable to link any useful things onto the
evsel list because the creating of probe points and BPF program
attaching have not been implemented. Before real events are possible to
be extracted, to avoid perf report error because of empty evsel list,
this patch link a dummy evsel. The dummy event related code will be
removed when probing and extracting code is ready.
Commiter notes:
Using it:
$ ls -la foo.o
ls: cannot access foo.o: No such file or directory
$ perf record --event foo.o sleep
libbpf: failed to open foo.o: No such file or directory
event syntax error: 'foo.o'
\___ BPF object file 'foo.o' is invalid
(add -v to see detail)
Run 'perf list' for a list of valid events
Usage: perf record [<options>] [<command>]
or: perf record [<options>] -- <command> [<options>]
-e, --event <event> event selector. use 'perf list' to list available events
$
$ file /tmp/build/perf/perf.o
/tmp/build/perf/perf.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
$ perf record --event /tmp/build/perf/perf.o sleep
libbpf: /tmp/build/perf/perf.o is not an eBPF object file
event syntax error: '/tmp/build/perf/perf.o'
\___ BPF object file '/tmp/build/perf/perf.o' is invalid
(add -v to see detail)
Run 'perf list' for a list of valid events
Usage: perf record [<options>] [<command>]
or: perf record [<options>] -- <command> [<options>]
-e, --event <event> event selector. use 'perf list' to list available events
$
$ file /tmp/foo.o
/tmp/foo.o: ELF 64-bit LSB relocatable, no machine, version 1 (SYSV), not stripped
$ perf record --event /tmp/foo.o sleep 1
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.013 MB perf.data ]
$ perf evlist
/tmp/foo.o
$ perf evlist -v
/tmp/foo.o: type: 1, size: 112, config: 0x9, { sample_period, sample_freq }: 4000, sample_type: IP|TID|TIME|PERIOD, disabled: 1, inherit: 1, mmap: 1, comm: 1, freq: 1, enable_on_exec: 1, task: 1, sample_id_all: 1, exclude_guest: 1, mmap2: 1, comm_exec: 1
$
So, type 1 is PERF_TYPE_SOFTWARE, config 0x9 is PERF_COUNT_SW_DUMMY, ok.
$ perf report --stdio
Error:
The perf.data file has no samples!
# To display the perf.data header info, please use --header/--header-only options.
#
$
Signed-off-by: Wang Nan <wangnan0@huawei.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Alexei Starovoitov <ast@plumgrid.com>
Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
Cc: Daniel Borkmann <daniel@iogearbox.net>
Cc: David Ahern <dsahern@gmail.com>
Cc: He Kuang <hekuang@huawei.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kaixu Xia <xiakaixu@huawei.com>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
Link: http://lkml.kernel.org/r/1444826502-49291-4-git-send-email-wangnan0@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2015-10-14 20:41:14 +08:00
|
|
|
$$ = list;
|
|
|
|
}
|
|
|
|
|
2012-08-08 18:14:14 +08:00
|
|
|
start_terms: event_config
|
2012-06-15 14:31:40 +08:00
|
|
|
{
|
2013-01-19 03:56:57 +08:00
|
|
|
struct parse_events_terms *data = _data;
|
2012-06-15 14:31:40 +08:00
|
|
|
data->terms = $1;
|
|
|
|
}
|
|
|
|
|
2012-03-16 03:09:16 +08:00
|
|
|
event_config:
|
|
|
|
event_config ',' event_term
|
|
|
|
{
|
|
|
|
struct list_head *head = $1;
|
2013-01-19 03:29:49 +08:00
|
|
|
struct parse_events_term *term = $3;
|
2012-03-16 03:09:16 +08:00
|
|
|
|
|
|
|
ABORT_ON(!head);
|
|
|
|
list_add_tail(&term->list, head);
|
|
|
|
$$ = $1;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
event_term
|
|
|
|
{
|
|
|
|
struct list_head *head = malloc(sizeof(*head));
|
2013-01-19 03:29:49 +08:00
|
|
|
struct parse_events_term *term = $1;
|
2012-03-16 03:09:16 +08:00
|
|
|
|
|
|
|
ABORT_ON(!head);
|
|
|
|
INIT_LIST_HEAD(head);
|
|
|
|
list_add_tail(&term->list, head);
|
|
|
|
$$ = head;
|
|
|
|
}
|
|
|
|
|
|
|
|
event_term:
|
|
|
|
PE_NAME '=' PE_NAME
|
|
|
|
{
|
2013-01-19 03:29:49 +08:00
|
|
|
struct parse_events_term *term;
|
2012-03-16 03:09:16 +08:00
|
|
|
|
2013-01-19 03:29:49 +08:00
|
|
|
ABORT_ON(parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER,
|
2015-04-23 03:10:20 +08:00
|
|
|
$1, $3, &@1, &@3));
|
2012-03-16 03:09:16 +08:00
|
|
|
$$ = term;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
PE_NAME '=' PE_VALUE
|
|
|
|
{
|
2013-01-19 03:29:49 +08:00
|
|
|
struct parse_events_term *term;
|
2012-03-16 03:09:16 +08:00
|
|
|
|
2013-01-19 03:29:49 +08:00
|
|
|
ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
|
2015-04-23 03:10:20 +08:00
|
|
|
$1, $3, &@1, &@3));
|
2012-03-16 03:09:16 +08:00
|
|
|
$$ = term;
|
|
|
|
}
|
|
|
|
|
|
2012-10-10 20:53:17 +08:00
|
|
|
PE_NAME '=' PE_VALUE_SYM_HW
|
|
|
|
{
|
2013-01-19 03:29:49 +08:00
|
|
|
struct parse_events_term *term;
|
2012-10-10 20:53:17 +08:00
|
|
|
int config = $3 & 255;
|
|
|
|
|
2013-01-19 03:29:49 +08:00
|
|
|
ABORT_ON(parse_events_term__sym_hw(&term, $1, config));
|
2012-10-10 20:53:17 +08:00
|
|
|
$$ = term;
|
|
|
|
}
|
|
|
|
|
|
2012-03-16 03:09:16 +08:00
|
|
|
PE_NAME
|
|
|
|
{
|
2013-01-19 03:29:49 +08:00
|
|
|
struct parse_events_term *term;
|
2012-03-16 03:09:16 +08:00
|
|
|
|
2013-01-19 03:29:49 +08:00
|
|
|
ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
|
2015-04-23 03:10:20 +08:00
|
|
|
$1, 1, &@1, NULL));
|
2012-03-16 03:09:16 +08:00
|
|
|
$$ = term;
|
|
|
|
}
|
|
|
|
|
|
2012-10-10 20:53:17 +08:00
|
|
|
PE_VALUE_SYM_HW
|
|
|
|
{
|
2013-01-19 03:29:49 +08:00
|
|
|
struct parse_events_term *term;
|
2012-10-10 20:53:17 +08:00
|
|
|
int config = $1 & 255;
|
|
|
|
|
2013-01-19 03:29:49 +08:00
|
|
|
ABORT_ON(parse_events_term__sym_hw(&term, NULL, config));
|
2012-10-10 20:53:17 +08:00
|
|
|
$$ = term;
|
|
|
|
}
|
|
|
|
|
|
2012-05-21 15:12:53 +08:00
|
|
|
PE_TERM '=' PE_NAME
|
|
|
|
{
|
2013-01-19 03:29:49 +08:00
|
|
|
struct parse_events_term *term;
|
2012-05-21 15:12:53 +08:00
|
|
|
|
2015-04-23 03:10:20 +08:00
|
|
|
ABORT_ON(parse_events_term__str(&term, (int)$1, NULL, $3, &@1, &@3));
|
2012-05-21 15:12:53 +08:00
|
|
|
$$ = term;
|
|
|
|
}
|
|
|
|
|
|
2012-03-16 03:09:16 +08:00
|
|
|
PE_TERM '=' PE_VALUE
|
|
|
|
{
|
2013-01-19 03:29:49 +08:00
|
|
|
struct parse_events_term *term;
|
2012-03-16 03:09:16 +08:00
|
|
|
|
2015-04-23 03:10:20 +08:00
|
|
|
ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, $3, &@1, &@3));
|
2012-03-16 03:09:16 +08:00
|
|
|
$$ = term;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
PE_TERM
|
|
|
|
{
|
2013-01-19 03:29:49 +08:00
|
|
|
struct parse_events_term *term;
|
2012-03-16 03:09:16 +08:00
|
|
|
|
2015-04-23 03:10:20 +08:00
|
|
|
ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, 1, &@1, NULL));
|
2012-03-16 03:09:16 +08:00
|
|
|
$$ = term;
|
2012-03-16 03:09:15 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
sep_dc: ':' |
|
|
|
|
|
2012-03-16 03:09:16 +08:00
|
|
|
sep_slash_dc: '/' | ':' |
|
|
|
|
|
2012-03-16 03:09:15 +08:00
|
|
|
%%
|
|
|
|
|
2015-04-23 03:10:17 +08:00
|
|
|
void parse_events_error(YYLTYPE *loc, void *data,
|
|
|
|
void *scanner __maybe_unused,
|
2012-09-11 06:15:03 +08:00
|
|
|
char const *msg __maybe_unused)
|
2012-03-16 03:09:15 +08:00
|
|
|
{
|
2015-04-23 03:10:17 +08:00
|
|
|
parse_events_evlist_error(data, loc->last_column, "parser error");
|
2012-03-16 03:09:15 +08:00
|
|
|
}
|