]> granicus.if.org Git - strace/commitdiff
bpf: implement decoding of BPF_BTF_GET_FD_BY_ID command
authorDmitry V. Levin <ldv@altlinux.org>
Wed, 13 Mar 2019 18:38:51 +0000 (18:38 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Wed, 13 Mar 2019 18:38:51 +0000 (18:38 +0000)
BPF_BTF_GET_FD_BY_ID command was introduced by Linux commit
v4.18-rc1~114^2~223^2~21^2~4.

* bpf_attr.h (struct BPF_BTF_GET_FD_BY_ID_struct): New type.
(BPF_BTF_GET_FD_BY_ID_struct_size,
expected_BPF_BTF_GET_FD_BY_ID_struct_size): New macros.
* bpf.c (BEGIN_BPF_CMD_DECODER(BPF_BTF_GET_FD_BY_ID)): New bpf command
decoder.
(SYS_FUNC(bpf)) <bpf_cmd_decoders[]>: Add
BPF_CMD_ENTRY(BPF_BTF_GET_FD_BY_ID).
* tests/bpf.c (union bpf_attr_data): Add
BPF_ATTR_DATA_FIELD(BPF_BTF_GET_FD_BY_ID).
(BPF_BTF_GET_FD_BY_ID_checks): New checks array.
(main) <checks>: Add CHK(BPF_BTF_GET_FD_BY_ID).

bpf.c
bpf_attr.h
tests/bpf.c

diff --git a/bpf.c b/bpf.c
index 5fedbd18945c9661c6c5918fd0724f430e4d25fb..69c9a4f5591df30b2c3417d0bd807f7a10dd2ed0 100644 (file)
--- a/bpf.c
+++ b/bpf.c
@@ -837,6 +837,12 @@ BEGIN_BPF_CMD_DECODER(BPF_BTF_LOAD)
 }
 END_BPF_CMD_DECODER(RVAL_DECODED | RVAL_FD)
 
+BEGIN_BPF_CMD_DECODER(BPF_BTF_GET_FD_BY_ID)
+{
+       PRINT_FIELD_U("{", attr, btf_id);
+}
+END_BPF_CMD_DECODER(RVAL_DECODED | RVAL_FD)
+
 SYS_FUNC(bpf)
 {
        static const bpf_cmd_decoder_t bpf_cmd_decoders[] = {
@@ -859,6 +865,7 @@ SYS_FUNC(bpf)
                BPF_CMD_ENTRY(BPF_PROG_QUERY),
                BPF_CMD_ENTRY(BPF_RAW_TRACEPOINT_OPEN),
                BPF_CMD_ENTRY(BPF_BTF_LOAD),
+               BPF_CMD_ENTRY(BPF_BTF_GET_FD_BY_ID),
        };
 
        const unsigned int cmd = tcp->u_arg[0];
index a04f79ee1612c16cd2cccea1a0f37c5f33819738..37ddc41b4578bfad1d8a90b59393c779d551e4d5 100644 (file)
@@ -239,6 +239,14 @@ struct BPF_BTF_LOAD_struct {
        offsetofend(struct BPF_BTF_LOAD_struct, btf_log_level)
 # define expected_BPF_BTF_LOAD_struct_size 28
 
+struct BPF_BTF_GET_FD_BY_ID_struct {
+       uint32_t btf_id;
+};
+
+# define BPF_BTF_GET_FD_BY_ID_struct_size \
+       sizeof(struct BPF_BTF_GET_FD_BY_ID_struct)
+# define expected_BPF_BTF_GET_FD_BY_ID_struct_size 4
+
 struct bpf_map_info_struct {
        uint32_t type;
        uint32_t id;
index 85b27d5dc21345ec5c75b0feeb5c95214a391d09..8f887fb04654cd89eef6a4b7f3ecb21349f63bf0 100644 (file)
@@ -72,6 +72,7 @@ union bpf_attr_data {
        BPF_ATTR_DATA_FIELD(BPF_PROG_QUERY);
        BPF_ATTR_DATA_FIELD(BPF_RAW_TRACEPOINT_OPEN);
        BPF_ATTR_DATA_FIELD(BPF_BTF_LOAD);
+       BPF_ATTR_DATA_FIELD(BPF_BTF_GET_FD_BY_ID);
        char char_data[256];
 };
 
@@ -1117,6 +1118,14 @@ static struct bpf_attr_check BPF_BTF_LOAD_checks[] = {
        }
 };
 
+static const struct bpf_attr_check BPF_BTF_GET_FD_BY_ID_checks[] = {
+       {
+               .data = { .BPF_BTF_GET_FD_BY_ID_data = { .btf_id = 0xdeadbeef } },
+               .size = offsetofend(struct BPF_BTF_GET_FD_BY_ID_struct, btf_id),
+               .str = "btf_id=3735928559"
+       }
+};
+
 
 #define CHK(cmd_) \
        { \
@@ -1148,6 +1157,7 @@ main(void)
                CHK(BPF_PROG_QUERY),
                CHK(BPF_RAW_TRACEPOINT_OPEN),
                CHK(BPF_BTF_LOAD),
+               CHK(BPF_BTF_GET_FD_BY_ID),
        };
 
        page_size = get_page_size();