This is an automatic generated email to let you know that the following patch 
were queued at the 
http://git.linuxtv.org/cgit.cgi/v4l-utils.git tree:

Subject: keytable: ensure BPF IR decoders use correct section name
Author:  Sean Young <s...@mess.org>
Date:    Wed Jun 16 11:48:08 2021 +0100

The convention is to have the type ("lirc_mode2/") prefixed so the
BPF loader knows what type it is.

Signed-off-by: Sean Young <s...@mess.org>

 utils/keytable/bpf_load.c                     | 29 ++++++++++++++++++++-------
 utils/keytable/bpf_protocols/grundig.c        |  6 +++---
 utils/keytable/bpf_protocols/imon_rsc.c       |  6 +++---
 utils/keytable/bpf_protocols/manchester.c     |  6 +++---
 utils/keytable/bpf_protocols/pulse_distance.c |  6 +++---
 utils/keytable/bpf_protocols/pulse_length.c   |  6 +++---
 utils/keytable/bpf_protocols/raw.c            |  8 ++++----
 utils/keytable/bpf_protocols/rc_mm.c          |  6 +++---
 utils/keytable/bpf_protocols/samsung36.c      |  6 +++---
 utils/keytable/bpf_protocols/xbox-dvd.c       |  6 +++---
 10 files changed, 50 insertions(+), 35 deletions(-)

---

http://git.linuxtv.org/cgit.cgi/v4l-utils.git/commit/?id=150de0ac2d15b82d874937fcca59675f8b24a13f
diff --git a/utils/keytable/bpf_load.c b/utils/keytable/bpf_load.c
index ec6eb98e8c4b..7c633dac3893 100644
--- a/utils/keytable/bpf_load.c
+++ b/utils/keytable/bpf_load.c
@@ -58,16 +58,24 @@ struct bpf_file {
        int strtabidx;
        Elf_Data *symbols;
        struct protocol_param *param;
+       char name[128];
 };
 
 static int load_and_attach(int lirc_fd, struct bpf_file *bpf_file, struct 
bpf_insn *prog, int size)
 {
-        size_t insns_cnt = size / sizeof(struct bpf_insn);
+       struct bpf_load_program_attr load_attr;
        int fd, err;
 
-       fd = bpf_load_program(BPF_PROG_TYPE_LIRC_MODE2, prog, insns_cnt,
-                             bpf_file->license, 0,
-                             bpf_log_buf, LOG_BUF_SIZE);
+       memset(&load_attr, 0, sizeof(struct bpf_load_program_attr));
+
+       load_attr.prog_type = BPF_PROG_TYPE_LIRC_MODE2;
+       load_attr.expected_attach_type = BPF_LIRC_MODE2;
+       load_attr.name = bpf_file->name;
+       load_attr.insns = prog;
+       load_attr.insns_cnt = size / sizeof(struct bpf_insn);
+       load_attr.license = bpf_file->license;
+
+       fd = bpf_load_program_xattr(&load_attr, bpf_log_buf, LOG_BUF_SIZE);
        if (fd < 0) {
                printf("bpf_load_program() err=%m\n%s", bpf_log_buf);
                return -1;
@@ -78,6 +86,7 @@ static int load_and_attach(int lirc_fd, struct bpf_file 
*bpf_file, struct bpf_in
                printf("bpf_prog_attach: err=%m\n");
                return -1;
        }
+
        return 0;
 }
 
@@ -260,7 +269,7 @@ static int parse_relo_and_apply(struct bpf_file *bpf_file, 
GElf_Shdr *shdr,
                        }
 
                        if (match) {
-                               insn[insn_idx].src_reg = BPF_PSEUDO_MAP_FD;
+                               insn[insn_idx].src_reg = BPF_PSEUDO_MAP_FD;
                                insn[insn_idx].imm = 
bpf_file->map_data[map_idx].fd;
                                continue;
                        }
@@ -427,7 +436,7 @@ static int load_elf_maps_section(struct bpf_file *bpf_file)
 }
 
 int load_bpf_file(const char *path, int lirc_fd, struct protocol_param *param,
-                 struct raw_entry *raw)
+                 struct raw_entry *raw)
 {
        struct bpf_file bpf_file = { .param = param };
        int fd, i, ret;
@@ -469,7 +478,8 @@ int load_bpf_file(const char *path, int lirc_fd, struct 
protocol_param *param,
                if (strcmp(shname, "license") == 0) {
                        bpf_file.processed_sec[i] = true;
                        memcpy(bpf_file.license, data->d_buf, data->d_size);
-               } else if (strcmp(shname, "maps") == 0) {
+               } else if (strcmp(shname, "lirc_mode2/maps") == 0 ||
+                          strcmp(shname, "maps") == 0) {
                        int j;
 
                        bpf_file.maps_shidx = i;
@@ -530,6 +540,11 @@ int load_bpf_file(const char *path, int lirc_fd, struct 
protocol_param *param,
                            !(shdr_prog.sh_flags & SHF_EXECINSTR))
                                continue;
 
+                       if (strncmp(shname_prog, "lirc_mode2/", 11))
+                               strncpy(bpf_file.name, shname_prog, 
sizeof(bpf_file.name) - 1);
+                       else
+                               strncpy(bpf_file.name, shname_prog + 11, 
sizeof(bpf_file.name) - 1);
+
                        insns = (struct bpf_insn *) data_prog->d_buf;
                        bpf_file.processed_sec[i] = true; /* relo section */
 
diff --git a/utils/keytable/bpf_protocols/grundig.c 
b/utils/keytable/bpf_protocols/grundig.c
index 4d8cc4b92a23..cdd551f93985 100644
--- a/utils/keytable/bpf_protocols/grundig.c
+++ b/utils/keytable/bpf_protocols/grundig.c
@@ -22,7 +22,7 @@ struct decoder_state {
        unsigned int last_space;
 };
 
-struct bpf_map_def SEC("maps") decoder_state_map = {
+struct bpf_map_def SEC("lirc_mode2/maps") decoder_state_map = {
        .type = BPF_MAP_TYPE_ARRAY,
        .key_size = sizeof(unsigned int),
        .value_size = sizeof(struct decoder_state),
@@ -44,9 +44,9 @@ int header_pulse = 900;
 int header_space = 2900;
 int leader_pulse = 1300;
 
-#define BPF_PARAM(x) (int)(&(x))
+#define BPF_PARAM(x) (int)(long)(&(x))
 
-SEC("grundig")
+SEC("lirc_mode2/grundig")
 int bpf_decoder(unsigned int *sample)
 {
        unsigned int key = 0;
diff --git a/utils/keytable/bpf_protocols/imon_rsc.c 
b/utils/keytable/bpf_protocols/imon_rsc.c
index 14c4ec37cac9..e163f217a011 100644
--- a/utils/keytable/bpf_protocols/imon_rsc.c
+++ b/utils/keytable/bpf_protocols/imon_rsc.c
@@ -19,7 +19,7 @@ struct decoder_state {
        unsigned int count;
 };
 
-struct bpf_map_def SEC("maps") decoder_state_map = {
+struct bpf_map_def SEC("lirc_mode2/maps") decoder_state_map = {
        .type = BPF_MAP_TYPE_ARRAY,
        .key_size = sizeof(unsigned int),
        .value_size = sizeof(struct decoder_state),
@@ -34,14 +34,14 @@ struct bpf_map_def SEC("maps") decoder_state_map = {
 // actual value (either overridden or taken from the data segment).
 int margin = 325;
 
-#define BPF_PARAM(x) (int)(&(x))
+#define BPF_PARAM(x) (int)(long)(&(x))
 
 static inline int eq_margin(unsigned d1, unsigned d2)
 {
        return ((d1 > (d2 - BPF_PARAM(margin))) && (d1 < (d2 + 
BPF_PARAM(margin))));
 }
 
-SEC("imon_rsc")
+SEC("lirc_mode2/imon_rsc")
 int bpf_decoder(unsigned int *sample)
 {
        unsigned int key = 0;
diff --git a/utils/keytable/bpf_protocols/manchester.c 
b/utils/keytable/bpf_protocols/manchester.c
index 94b53fd055b9..0310f37e9ab5 100644
--- a/utils/keytable/bpf_protocols/manchester.c
+++ b/utils/keytable/bpf_protocols/manchester.c
@@ -13,7 +13,7 @@ struct decoder_state {
        unsigned long bits;
 };
 
-struct bpf_map_def SEC("maps") decoder_state_map = {
+struct bpf_map_def SEC("lirc_mode2/maps") decoder_state_map = {
        .type = BPF_MAP_TYPE_ARRAY,
        .key_size = sizeof(unsigned int),
        .value_size = sizeof(struct decoder_state),
@@ -41,7 +41,7 @@ int bits = 14;
 int scancode_mask = 0;
 int rc_protocol = 66;
 
-#define BPF_PARAM(x) (int)(&(x))
+#define BPF_PARAM(x) (int)(long)(&(x))
 
 static inline int eq_margin(unsigned d1, unsigned d2)
 {
@@ -79,7 +79,7 @@ static int emitBit(unsigned int *sample, struct decoder_state 
*s, int bit, int s
        return state;
 }
 
-SEC("manchester")
+SEC("lirc_mode2/manchester")
 int bpf_decoder(unsigned int *sample)
 {
        unsigned int key = 0;
diff --git a/utils/keytable/bpf_protocols/pulse_distance.c 
b/utils/keytable/bpf_protocols/pulse_distance.c
index 9e9ea4ad935e..f2de8d2745de 100644
--- a/utils/keytable/bpf_protocols/pulse_distance.c
+++ b/utils/keytable/bpf_protocols/pulse_distance.c
@@ -22,7 +22,7 @@ struct decoder_state {
        unsigned int count;
 };
 
-struct bpf_map_def SEC("maps") decoder_state_map = {
+struct bpf_map_def SEC("lirc_mode2/maps") decoder_state_map = {
        .type = BPF_MAP_TYPE_ARRAY,
        .key_size = sizeof(unsigned int),
        .value_size = sizeof(struct decoder_state),
@@ -49,14 +49,14 @@ int reverse = 0;
 int header_optional = 0;
 int rc_protocol = 64;
 
-#define BPF_PARAM(x) (int)(&(x))
+#define BPF_PARAM(x) (int)(long)(&(x))
 
 static inline int eq_margin(unsigned d1, unsigned d2)
 {
        return ((d1 > (d2 - BPF_PARAM(margin))) && (d1 < (d2 + 
BPF_PARAM(margin))));
 }
 
-SEC("pulse_distance")
+SEC("lirc_mode2/pulse_distance")
 int bpf_decoder(unsigned int *sample)
 {
        unsigned int key = 0;
diff --git a/utils/keytable/bpf_protocols/pulse_length.c 
b/utils/keytable/bpf_protocols/pulse_length.c
index e33f08993f68..1c9e1948216d 100644
--- a/utils/keytable/bpf_protocols/pulse_length.c
+++ b/utils/keytable/bpf_protocols/pulse_length.c
@@ -22,7 +22,7 @@ struct decoder_state {
        unsigned int count;
 };
 
-struct bpf_map_def SEC("maps") decoder_state_map = {
+struct bpf_map_def SEC("lirc_mode2/maps") decoder_state_map = {
        .type = BPF_MAP_TYPE_ARRAY,
        .key_size = sizeof(unsigned int),
        .value_size = sizeof(struct decoder_state),
@@ -49,14 +49,14 @@ int reverse = 0;
 int header_optional = 0;
 int rc_protocol = 67;
 
-#define BPF_PARAM(x) (int)(&(x))
+#define BPF_PARAM(x) (int)(long)(&(x))
 
 static inline int eq_margin(unsigned d1, unsigned d2)
 {
        return ((d1 > (d2 - BPF_PARAM(margin))) && (d1 < (d2 + 
BPF_PARAM(margin))));
 }
 
-SEC("pulse_length")
+SEC("lirc_mode2/pulse_length")
 int bpf_decoder(unsigned int *sample)
 {
        unsigned int key = 0;
diff --git a/utils/keytable/bpf_protocols/raw.c 
b/utils/keytable/bpf_protocols/raw.c
index a0ee78b478d4..5084264d061b 100644
--- a/utils/keytable/bpf_protocols/raw.c
+++ b/utils/keytable/bpf_protocols/raw.c
@@ -27,7 +27,7 @@ struct decoder_state {
        DECLARE_BITMAP(nomatch, MAX_PATTERNS);
 };
 
-struct bpf_map_def SEC("maps") decoder_state_map = {
+struct bpf_map_def SEC("lirc_mode2/maps") decoder_state_map = {
        .type = BPF_MAP_TYPE_ARRAY,
        .key_size = sizeof(unsigned int),
        .value_size = sizeof(struct decoder_state),
@@ -40,7 +40,7 @@ struct raw_pattern {
 };
 
 // ir-keytable will load the raw patterns here
-struct bpf_map_def SEC("maps") raw_map = {
+struct bpf_map_def SEC("lirc_mode2/maps") raw_map = {
        .type = BPF_MAP_TYPE_ARRAY,
        .key_size = sizeof(unsigned int),
        .value_size = sizeof(struct raw_pattern), // this is not used
@@ -60,14 +60,14 @@ int rc_protocol = 68;
 int trail_space = 1000;
 int max_length = 1;
 
-#define BPF_PARAM(x) (int)(&(x))
+#define BPF_PARAM(x) (int)(long)(&(x))
 
 static inline int eq_margin(unsigned d1, unsigned d2)
 {
        return ((d1 > (d2 - BPF_PARAM(margin))) && (d1 < (d2 + 
BPF_PARAM(margin))));
 }
 
-SEC("raw")
+SEC("lirc_mode2/raw")
 int bpf_decoder(unsigned int *sample)
 {
        unsigned int key = 0;
diff --git a/utils/keytable/bpf_protocols/rc_mm.c 
b/utils/keytable/bpf_protocols/rc_mm.c
index 034d39b9e99e..117f7d62094b 100644
--- a/utils/keytable/bpf_protocols/rc_mm.c
+++ b/utils/keytable/bpf_protocols/rc_mm.c
@@ -21,7 +21,7 @@ struct decoder_state {
        unsigned int count;
 };
 
-struct bpf_map_def SEC("maps") decoder_state_map = {
+struct bpf_map_def SEC("lirc_mode2/maps") decoder_state_map = {
        .type = BPF_MAP_TYPE_ARRAY,
        .key_size = sizeof(unsigned int),
        .value_size = sizeof(struct decoder_state),
@@ -37,7 +37,7 @@ struct bpf_map_def SEC("maps") decoder_state_map = {
 //
 // This is why they should be accessed through the BPF_PARAM() macro.
 
-#define BPF_PARAM(x) (int)(&(x))
+#define BPF_PARAM(x) (int)(long)(&(x))
 
 int margin = 100;
 int header_pulse = 417;
@@ -56,7 +56,7 @@ static inline int eq_margin(unsigned d1, unsigned d2)
        return ((d1 > (d2 - BPF_PARAM(margin))) && (d1 < (d2 + 
BPF_PARAM(margin))));
 }
 
-SEC("rc_mm")
+SEC("lirc_mode2/rc_mm")
 int bpf_decoder(unsigned int *sample)
 {
        unsigned int key = 0;
diff --git a/utils/keytable/bpf_protocols/samsung36.c 
b/utils/keytable/bpf_protocols/samsung36.c
index 1b09365fcb67..a83137e49aed 100644
--- a/utils/keytable/bpf_protocols/samsung36.c
+++ b/utils/keytable/bpf_protocols/samsung36.c
@@ -26,7 +26,7 @@ struct decoder_state {
        unsigned int count;
 };
 
-struct bpf_map_def SEC("maps") decoder_state_map = {
+struct bpf_map_def SEC("lirc_mode2/maps") decoder_state_map = {
        .type = BPF_MAP_TYPE_ARRAY,
        .key_size = sizeof(unsigned int),
        .value_size = sizeof(struct decoder_state),
@@ -42,14 +42,14 @@ struct bpf_map_def SEC("maps") decoder_state_map = {
 int margin = 300;
 int rc_protocol = 69;
 
-#define BPF_PARAM(x) (int)(&(x))
+#define BPF_PARAM(x) (int)(long)(&(x))
 
 static inline int eq_margin(unsigned d1, unsigned d2)
 {
        return ((d1 > (d2 - BPF_PARAM(margin))) && (d1 < (d2 + 
BPF_PARAM(margin))));
 }
 
-SEC("samsung36")
+SEC("lirc_mode2/samsung36")
 int bpf_decoder(unsigned int *sample)
 {
        unsigned int key = 0;
diff --git a/utils/keytable/bpf_protocols/xbox-dvd.c 
b/utils/keytable/bpf_protocols/xbox-dvd.c
index 18225453e30c..c0b57a7ce5f8 100644
--- a/utils/keytable/bpf_protocols/xbox-dvd.c
+++ b/utils/keytable/bpf_protocols/xbox-dvd.c
@@ -21,7 +21,7 @@ struct decoder_state {
        unsigned int count;
 };
 
-struct bpf_map_def SEC("maps") decoder_state_map = {
+struct bpf_map_def SEC("lirc_mode2/maps") decoder_state_map = {
        .type = BPF_MAP_TYPE_ARRAY,
        .key_size = sizeof(unsigned int),
        .value_size = sizeof(struct decoder_state),
@@ -44,14 +44,14 @@ int trailer_pulse = 550;
 int bits = 24;
 int rc_protocol = 68;
 
-#define BPF_PARAM(x) (int)(&(x))
+#define BPF_PARAM(x) (int)(long)(&(x))
 
 static inline int eq_margin(unsigned d1, unsigned d2)
 {
        return ((d1 > (d2 - BPF_PARAM(margin))) && (d1 < (d2 + 
BPF_PARAM(margin))));
 }
 
-SEC("xbox_dvd")
+SEC("lirc_mode2/xbox_dvd")
 int bpf_decoder(unsigned int *sample)
 {
        unsigned int key = 0;

_______________________________________________
linuxtv-commits mailing list
linuxtv-commits@linuxtv.org
https://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to