*             larger than the size of the ring buffer, or which cannot fit
  *             within a struct bpf_dynptr.
  */
-#define __BPF_FUNC_MAPPER(FN)          \
-       FN(unspec),                     \
-       FN(map_lookup_elem),            \
-       FN(map_update_elem),            \
-       FN(map_delete_elem),            \
-       FN(probe_read),                 \
-       FN(ktime_get_ns),               \
-       FN(trace_printk),               \
-       FN(get_prandom_u32),            \
-       FN(get_smp_processor_id),       \
-       FN(skb_store_bytes),            \
-       FN(l3_csum_replace),            \
-       FN(l4_csum_replace),            \
-       FN(tail_call),                  \
-       FN(clone_redirect),             \
-       FN(get_current_pid_tgid),       \
-       FN(get_current_uid_gid),        \
-       FN(get_current_comm),           \
-       FN(get_cgroup_classid),         \
-       FN(skb_vlan_push),              \
-       FN(skb_vlan_pop),               \
-       FN(skb_get_tunnel_key),         \
-       FN(skb_set_tunnel_key),         \
-       FN(perf_event_read),            \
-       FN(redirect),                   \
-       FN(get_route_realm),            \
-       FN(perf_event_output),          \
-       FN(skb_load_bytes),             \
-       FN(get_stackid),                \
-       FN(csum_diff),                  \
-       FN(skb_get_tunnel_opt),         \
-       FN(skb_set_tunnel_opt),         \
-       FN(skb_change_proto),           \
-       FN(skb_change_type),            \
-       FN(skb_under_cgroup),           \
-       FN(get_hash_recalc),            \
-       FN(get_current_task),           \
-       FN(probe_write_user),           \
-       FN(current_task_under_cgroup),  \
-       FN(skb_change_tail),            \
-       FN(skb_pull_data),              \
-       FN(csum_update),                \
-       FN(set_hash_invalid),           \
-       FN(get_numa_node_id),           \
-       FN(skb_change_head),            \
-       FN(xdp_adjust_head),            \
-       FN(probe_read_str),             \
-       FN(get_socket_cookie),          \
-       FN(get_socket_uid),             \
-       FN(set_hash),                   \
-       FN(setsockopt),                 \
-       FN(skb_adjust_room),            \
-       FN(redirect_map),               \
-       FN(sk_redirect_map),            \
-       FN(sock_map_update),            \
-       FN(xdp_adjust_meta),            \
-       FN(perf_event_read_value),      \
-       FN(perf_prog_read_value),       \
-       FN(getsockopt),                 \
-       FN(override_return),            \
-       FN(sock_ops_cb_flags_set),      \
-       FN(msg_redirect_map),           \
-       FN(msg_apply_bytes),            \
-       FN(msg_cork_bytes),             \
-       FN(msg_pull_data),              \
-       FN(bind),                       \
-       FN(xdp_adjust_tail),            \
-       FN(skb_get_xfrm_state),         \
-       FN(get_stack),                  \
-       FN(skb_load_bytes_relative),    \
-       FN(fib_lookup),                 \
-       FN(sock_hash_update),           \
-       FN(msg_redirect_hash),          \
-       FN(sk_redirect_hash),           \
-       FN(lwt_push_encap),             \
-       FN(lwt_seg6_store_bytes),       \
-       FN(lwt_seg6_adjust_srh),        \
-       FN(lwt_seg6_action),            \
-       FN(rc_repeat),                  \
-       FN(rc_keydown),                 \
-       FN(skb_cgroup_id),              \
-       FN(get_current_cgroup_id),      \
-       FN(get_local_storage),          \
-       FN(sk_select_reuseport),        \
-       FN(skb_ancestor_cgroup_id),     \
-       FN(sk_lookup_tcp),              \
-       FN(sk_lookup_udp),              \
-       FN(sk_release),                 \
-       FN(map_push_elem),              \
-       FN(map_pop_elem),               \
-       FN(map_peek_elem),              \
-       FN(msg_push_data),              \
-       FN(msg_pop_data),               \
-       FN(rc_pointer_rel),             \
-       FN(spin_lock),                  \
-       FN(spin_unlock),                \
-       FN(sk_fullsock),                \
-       FN(tcp_sock),                   \
-       FN(skb_ecn_set_ce),             \
-       FN(get_listener_sock),          \
-       FN(skc_lookup_tcp),             \
-       FN(tcp_check_syncookie),        \
-       FN(sysctl_get_name),            \
-       FN(sysctl_get_current_value),   \
-       FN(sysctl_get_new_value),       \
-       FN(sysctl_set_new_value),       \
-       FN(strtol),                     \
-       FN(strtoul),                    \
-       FN(sk_storage_get),             \
-       FN(sk_storage_delete),          \
-       FN(send_signal),                \
-       FN(tcp_gen_syncookie),          \
-       FN(skb_output),                 \
-       FN(probe_read_user),            \
-       FN(probe_read_kernel),          \
-       FN(probe_read_user_str),        \
-       FN(probe_read_kernel_str),      \
-       FN(tcp_send_ack),               \
-       FN(send_signal_thread),         \
-       FN(jiffies64),                  \
-       FN(read_branch_records),        \
-       FN(get_ns_current_pid_tgid),    \
-       FN(xdp_output),                 \
-       FN(get_netns_cookie),           \
-       FN(get_current_ancestor_cgroup_id),     \
-       FN(sk_assign),                  \
-       FN(ktime_get_boot_ns),          \
-       FN(seq_printf),                 \
-       FN(seq_write),                  \
-       FN(sk_cgroup_id),               \
-       FN(sk_ancestor_cgroup_id),      \
-       FN(ringbuf_output),             \
-       FN(ringbuf_reserve),            \
-       FN(ringbuf_submit),             \
-       FN(ringbuf_discard),            \
-       FN(ringbuf_query),              \
-       FN(csum_level),                 \
-       FN(skc_to_tcp6_sock),           \
-       FN(skc_to_tcp_sock),            \
-       FN(skc_to_tcp_timewait_sock),   \
-       FN(skc_to_tcp_request_sock),    \
-       FN(skc_to_udp6_sock),           \
-       FN(get_task_stack),             \
-       FN(load_hdr_opt),               \
-       FN(store_hdr_opt),              \
-       FN(reserve_hdr_opt),            \
-       FN(inode_storage_get),          \
-       FN(inode_storage_delete),       \
-       FN(d_path),                     \
-       FN(copy_from_user),             \
-       FN(snprintf_btf),               \
-       FN(seq_printf_btf),             \
-       FN(skb_cgroup_classid),         \
-       FN(redirect_neigh),             \
-       FN(per_cpu_ptr),                \
-       FN(this_cpu_ptr),               \
-       FN(redirect_peer),              \
-       FN(task_storage_get),           \
-       FN(task_storage_delete),        \
-       FN(get_current_task_btf),       \
-       FN(bprm_opts_set),              \
-       FN(ktime_get_coarse_ns),        \
-       FN(ima_inode_hash),             \
-       FN(sock_from_file),             \
-       FN(check_mtu),                  \
-       FN(for_each_map_elem),          \
-       FN(snprintf),                   \
-       FN(sys_bpf),                    \
-       FN(btf_find_by_name_kind),      \
-       FN(sys_close),                  \
-       FN(timer_init),                 \
-       FN(timer_set_callback),         \
-       FN(timer_start),                \
-       FN(timer_cancel),               \
-       FN(get_func_ip),                \
-       FN(get_attach_cookie),          \
-       FN(task_pt_regs),               \
-       FN(get_branch_snapshot),        \
-       FN(trace_vprintk),              \
-       FN(skc_to_unix_sock),           \
-       FN(kallsyms_lookup_name),       \
-       FN(find_vma),                   \
-       FN(loop),                       \
-       FN(strncmp),                    \
-       FN(get_func_arg),               \
-       FN(get_func_ret),               \
-       FN(get_func_arg_cnt),           \
-       FN(get_retval),                 \
-       FN(set_retval),                 \
-       FN(xdp_get_buff_len),           \
-       FN(xdp_load_bytes),             \
-       FN(xdp_store_bytes),            \
-       FN(copy_from_user_task),        \
-       FN(skb_set_tstamp),             \
-       FN(ima_file_hash),              \
-       FN(kptr_xchg),                  \
-       FN(map_lookup_percpu_elem),     \
-       FN(skc_to_mptcp_sock),          \
-       FN(dynptr_from_mem),            \
-       FN(ringbuf_reserve_dynptr),     \
-       FN(ringbuf_submit_dynptr),      \
-       FN(ringbuf_discard_dynptr),     \
-       FN(dynptr_read),                \
-       FN(dynptr_write),               \
-       FN(dynptr_data),                \
-       FN(tcp_raw_gen_syncookie_ipv4), \
-       FN(tcp_raw_gen_syncookie_ipv6), \
-       FN(tcp_raw_check_syncookie_ipv4),       \
-       FN(tcp_raw_check_syncookie_ipv6),       \
-       FN(ktime_get_tai_ns),           \
-       FN(user_ringbuf_drain),         \
+#define ___BPF_FUNC_MAPPER(FN, ctx...)                 \
+       FN(unspec, 0, ##ctx)                            \
+       FN(map_lookup_elem, 1, ##ctx)                   \
+       FN(map_update_elem, 2, ##ctx)                   \
+       FN(map_delete_elem, 3, ##ctx)                   \
+       FN(probe_read, 4, ##ctx)                        \
+       FN(ktime_get_ns, 5, ##ctx)                      \
+       FN(trace_printk, 6, ##ctx)                      \
+       FN(get_prandom_u32, 7, ##ctx)                   \
+       FN(get_smp_processor_id, 8, ##ctx)              \
+       FN(skb_store_bytes, 9, ##ctx)                   \
+       FN(l3_csum_replace, 10, ##ctx)                  \
+       FN(l4_csum_replace, 11, ##ctx)                  \
+       FN(tail_call, 12, ##ctx)                        \
+       FN(clone_redirect, 13, ##ctx)                   \
+       FN(get_current_pid_tgid, 14, ##ctx)             \
+       FN(get_current_uid_gid, 15, ##ctx)              \
+       FN(get_current_comm, 16, ##ctx)                 \
+       FN(get_cgroup_classid, 17, ##ctx)               \
+       FN(skb_vlan_push, 18, ##ctx)                    \
+       FN(skb_vlan_pop, 19, ##ctx)                     \
+       FN(skb_get_tunnel_key, 20, ##ctx)               \
+       FN(skb_set_tunnel_key, 21, ##ctx)               \
+       FN(perf_event_read, 22, ##ctx)                  \
+       FN(redirect, 23, ##ctx)                         \
+       FN(get_route_realm, 24, ##ctx)                  \
+       FN(perf_event_output, 25, ##ctx)                \
+       FN(skb_load_bytes, 26, ##ctx)                   \
+       FN(get_stackid, 27, ##ctx)                      \
+       FN(csum_diff, 28, ##ctx)                        \
+       FN(skb_get_tunnel_opt, 29, ##ctx)               \
+       FN(skb_set_tunnel_opt, 30, ##ctx)               \
+       FN(skb_change_proto, 31, ##ctx)                 \
+       FN(skb_change_type, 32, ##ctx)                  \
+       FN(skb_under_cgroup, 33, ##ctx)                 \
+       FN(get_hash_recalc, 34, ##ctx)                  \
+       FN(get_current_task, 35, ##ctx)                 \
+       FN(probe_write_user, 36, ##ctx)                 \
+       FN(current_task_under_cgroup, 37, ##ctx)        \
+       FN(skb_change_tail, 38, ##ctx)                  \
+       FN(skb_pull_data, 39, ##ctx)                    \
+       FN(csum_update, 40, ##ctx)                      \
+       FN(set_hash_invalid, 41, ##ctx)                 \
+       FN(get_numa_node_id, 42, ##ctx)                 \
+       FN(skb_change_head, 43, ##ctx)                  \
+       FN(xdp_adjust_head, 44, ##ctx)                  \
+       FN(probe_read_str, 45, ##ctx)                   \
+       FN(get_socket_cookie, 46, ##ctx)                \
+       FN(get_socket_uid, 47, ##ctx)                   \
+       FN(set_hash, 48, ##ctx)                         \
+       FN(setsockopt, 49, ##ctx)                       \
+       FN(skb_adjust_room, 50, ##ctx)                  \
+       FN(redirect_map, 51, ##ctx)                     \
+       FN(sk_redirect_map, 52, ##ctx)                  \
+       FN(sock_map_update, 53, ##ctx)                  \
+       FN(xdp_adjust_meta, 54, ##ctx)                  \
+       FN(perf_event_read_value, 55, ##ctx)            \
+       FN(perf_prog_read_value, 56, ##ctx)             \
+       FN(getsockopt, 57, ##ctx)                       \
+       FN(override_return, 58, ##ctx)                  \
+       FN(sock_ops_cb_flags_set, 59, ##ctx)            \
+       FN(msg_redirect_map, 60, ##ctx)                 \
+       FN(msg_apply_bytes, 61, ##ctx)                  \
+       FN(msg_cork_bytes, 62, ##ctx)                   \
+       FN(msg_pull_data, 63, ##ctx)                    \
+       FN(bind, 64, ##ctx)                             \
+       FN(xdp_adjust_tail, 65, ##ctx)                  \
+       FN(skb_get_xfrm_state, 66, ##ctx)               \
+       FN(get_stack, 67, ##ctx)                        \
+       FN(skb_load_bytes_relative, 68, ##ctx)          \
+       FN(fib_lookup, 69, ##ctx)                       \
+       FN(sock_hash_update, 70, ##ctx)                 \
+       FN(msg_redirect_hash, 71, ##ctx)                \
+       FN(sk_redirect_hash, 72, ##ctx)                 \
+       FN(lwt_push_encap, 73, ##ctx)                   \
+       FN(lwt_seg6_store_bytes, 74, ##ctx)             \
+       FN(lwt_seg6_adjust_srh, 75, ##ctx)              \
+       FN(lwt_seg6_action, 76, ##ctx)                  \
+       FN(rc_repeat, 77, ##ctx)                        \
+       FN(rc_keydown, 78, ##ctx)                       \
+       FN(skb_cgroup_id, 79, ##ctx)                    \
+       FN(get_current_cgroup_id, 80, ##ctx)            \
+       FN(get_local_storage, 81, ##ctx)                \
+       FN(sk_select_reuseport, 82, ##ctx)              \
+       FN(skb_ancestor_cgroup_id, 83, ##ctx)           \
+       FN(sk_lookup_tcp, 84, ##ctx)                    \
+       FN(sk_lookup_udp, 85, ##ctx)                    \
+       FN(sk_release, 86, ##ctx)                       \
+       FN(map_push_elem, 87, ##ctx)                    \
+       FN(map_pop_elem, 88, ##ctx)                     \
+       FN(map_peek_elem, 89, ##ctx)                    \
+       FN(msg_push_data, 90, ##ctx)                    \
+       FN(msg_pop_data, 91, ##ctx)                     \
+       FN(rc_pointer_rel, 92, ##ctx)                   \
+       FN(spin_lock, 93, ##ctx)                        \
+       FN(spin_unlock, 94, ##ctx)                      \
+       FN(sk_fullsock, 95, ##ctx)                      \
+       FN(tcp_sock, 96, ##ctx)                         \
+       FN(skb_ecn_set_ce, 97, ##ctx)                   \
+       FN(get_listener_sock, 98, ##ctx)                \
+       FN(skc_lookup_tcp, 99, ##ctx)                   \
+       FN(tcp_check_syncookie, 100, ##ctx)             \
+       FN(sysctl_get_name, 101, ##ctx)                 \
+       FN(sysctl_get_current_value, 102, ##ctx)        \
+       FN(sysctl_get_new_value, 103, ##ctx)            \
+       FN(sysctl_set_new_value, 104, ##ctx)            \
+       FN(strtol, 105, ##ctx)                          \
+       FN(strtoul, 106, ##ctx)                         \
+       FN(sk_storage_get, 107, ##ctx)                  \
+       FN(sk_storage_delete, 108, ##ctx)               \
+       FN(send_signal, 109, ##ctx)                     \
+       FN(tcp_gen_syncookie, 110, ##ctx)               \
+       FN(skb_output, 111, ##ctx)                      \
+       FN(probe_read_user, 112, ##ctx)                 \
+       FN(probe_read_kernel, 113, ##ctx)               \
+       FN(probe_read_user_str, 114, ##ctx)             \
+       FN(probe_read_kernel_str, 115, ##ctx)           \
+       FN(tcp_send_ack, 116, ##ctx)                    \
+       FN(send_signal_thread, 117, ##ctx)              \
+       FN(jiffies64, 118, ##ctx)                       \
+       FN(read_branch_records, 119, ##ctx)             \
+       FN(get_ns_current_pid_tgid, 120, ##ctx)         \
+       FN(xdp_output, 121, ##ctx)                      \
+       FN(get_netns_cookie, 122, ##ctx)                \
+       FN(get_current_ancestor_cgroup_id, 123, ##ctx)  \
+       FN(sk_assign, 124, ##ctx)                       \
+       FN(ktime_get_boot_ns, 125, ##ctx)               \
+       FN(seq_printf, 126, ##ctx)                      \
+       FN(seq_write, 127, ##ctx)                       \
+       FN(sk_cgroup_id, 128, ##ctx)                    \
+       FN(sk_ancestor_cgroup_id, 129, ##ctx)           \
+       FN(ringbuf_output, 130, ##ctx)                  \
+       FN(ringbuf_reserve, 131, ##ctx)                 \
+       FN(ringbuf_submit, 132, ##ctx)                  \
+       FN(ringbuf_discard, 133, ##ctx)                 \
+       FN(ringbuf_query, 134, ##ctx)                   \
+       FN(csum_level, 135, ##ctx)                      \
+       FN(skc_to_tcp6_sock, 136, ##ctx)                \
+       FN(skc_to_tcp_sock, 137, ##ctx)                 \
+       FN(skc_to_tcp_timewait_sock, 138, ##ctx)        \
+       FN(skc_to_tcp_request_sock, 139, ##ctx)         \
+       FN(skc_to_udp6_sock, 140, ##ctx)                \
+       FN(get_task_stack, 141, ##ctx)                  \
+       FN(load_hdr_opt, 142, ##ctx)                    \
+       FN(store_hdr_opt, 143, ##ctx)                   \
+       FN(reserve_hdr_opt, 144, ##ctx)                 \
+       FN(inode_storage_get, 145, ##ctx)               \
+       FN(inode_storage_delete, 146, ##ctx)            \
+       FN(d_path, 147, ##ctx)                          \
+       FN(copy_from_user, 148, ##ctx)                  \
+       FN(snprintf_btf, 149, ##ctx)                    \
+       FN(seq_printf_btf, 150, ##ctx)                  \
+       FN(skb_cgroup_classid, 151, ##ctx)              \
+       FN(redirect_neigh, 152, ##ctx)                  \
+       FN(per_cpu_ptr, 153, ##ctx)                     \
+       FN(this_cpu_ptr, 154, ##ctx)                    \
+       FN(redirect_peer, 155, ##ctx)                   \
+       FN(task_storage_get, 156, ##ctx)                \
+       FN(task_storage_delete, 157, ##ctx)             \
+       FN(get_current_task_btf, 158, ##ctx)            \
+       FN(bprm_opts_set, 159, ##ctx)                   \
+       FN(ktime_get_coarse_ns, 160, ##ctx)             \
+       FN(ima_inode_hash, 161, ##ctx)                  \
+       FN(sock_from_file, 162, ##ctx)                  \
+       FN(check_mtu, 163, ##ctx)                       \
+       FN(for_each_map_elem, 164, ##ctx)               \
+       FN(snprintf, 165, ##ctx)                        \
+       FN(sys_bpf, 166, ##ctx)                         \
+       FN(btf_find_by_name_kind, 167, ##ctx)           \
+       FN(sys_close, 168, ##ctx)                       \
+       FN(timer_init, 169, ##ctx)                      \
+       FN(timer_set_callback, 170, ##ctx)              \
+       FN(timer_start, 171, ##ctx)                     \
+       FN(timer_cancel, 172, ##ctx)                    \
+       FN(get_func_ip, 173, ##ctx)                     \
+       FN(get_attach_cookie, 174, ##ctx)               \
+       FN(task_pt_regs, 175, ##ctx)                    \
+       FN(get_branch_snapshot, 176, ##ctx)             \
+       FN(trace_vprintk, 177, ##ctx)                   \
+       FN(skc_to_unix_sock, 178, ##ctx)                \
+       FN(kallsyms_lookup_name, 179, ##ctx)            \
+       FN(find_vma, 180, ##ctx)                        \
+       FN(loop, 181, ##ctx)                            \
+       FN(strncmp, 182, ##ctx)                         \
+       FN(get_func_arg, 183, ##ctx)                    \
+       FN(get_func_ret, 184, ##ctx)                    \
+       FN(get_func_arg_cnt, 185, ##ctx)                \
+       FN(get_retval, 186, ##ctx)                      \
+       FN(set_retval, 187, ##ctx)                      \
+       FN(xdp_get_buff_len, 188, ##ctx)                \
+       FN(xdp_load_bytes, 189, ##ctx)                  \
+       FN(xdp_store_bytes, 190, ##ctx)                 \
+       FN(copy_from_user_task, 191, ##ctx)             \
+       FN(skb_set_tstamp, 192, ##ctx)                  \
+       FN(ima_file_hash, 193, ##ctx)                   \
+       FN(kptr_xchg, 194, ##ctx)                       \
+       FN(map_lookup_percpu_elem, 195, ##ctx)          \
+       FN(skc_to_mptcp_sock, 196, ##ctx)               \
+       FN(dynptr_from_mem, 197, ##ctx)                 \
+       FN(ringbuf_reserve_dynptr, 198, ##ctx)          \
+       FN(ringbuf_submit_dynptr, 199, ##ctx)           \
+       FN(ringbuf_discard_dynptr, 200, ##ctx)          \
+       FN(dynptr_read, 201, ##ctx)                     \
+       FN(dynptr_write, 202, ##ctx)                    \
+       FN(dynptr_data, 203, ##ctx)                     \
+       FN(tcp_raw_gen_syncookie_ipv4, 204, ##ctx)      \
+       FN(tcp_raw_gen_syncookie_ipv6, 205, ##ctx)      \
+       FN(tcp_raw_check_syncookie_ipv4, 206, ##ctx)    \
+       FN(tcp_raw_check_syncookie_ipv6, 207, ##ctx)    \
+       FN(ktime_get_tai_ns, 208, ##ctx)                \
+       FN(user_ringbuf_drain, 209, ##ctx)              \
        /* */
 
+/* backwards-compatibility macros for users of __BPF_FUNC_MAPPER that don't
+ * know or care about integer value that is now passed as second argument
+ */
+#define __BPF_FUNC_MAPPER_APPLY(name, value, FN) FN(name),
+#define __BPF_FUNC_MAPPER(FN) ___BPF_FUNC_MAPPER(__BPF_FUNC_MAPPER_APPLY, FN)
+
 /* integer value in 'imm' field of BPF_CALL instruction selects which helper
  * function eBPF program intends to call
  */
-#define __BPF_ENUM_FN(x) BPF_FUNC_ ## x
+#define __BPF_ENUM_FN(x, y) BPF_FUNC_ ## x = y,
 enum bpf_func_id {
-       __BPF_FUNC_MAPPER(__BPF_ENUM_FN)
+       ___BPF_FUNC_MAPPER(__BPF_ENUM_FN)
        __BPF_FUNC_MAX_ID,
 };
 #undef __BPF_ENUM_FN
 
                 break
 
     def parse_define_helpers(self):
-        # Parse FN(...) in #define __BPF_FUNC_MAPPER to compare later with the
+        # Parse FN(...) in #define ___BPF_FUNC_MAPPER to compare later with the
         # number of unique function names present in description and use the
         # correct enumeration value.
         # Note: seek_to(..) discards the first line below the target search text,
-        # resulting in FN(unspec) being skipped and not added to self.define_unique_helpers.
-        self.seek_to('#define __BPF_FUNC_MAPPER(FN)',
+        # resulting in FN(unspec, 0, ##ctx) being skipped and not added to
+        # self.define_unique_helpers.
+        self.seek_to('#define ___BPF_FUNC_MAPPER(FN, ctx...)',
                      'Could not find start of eBPF helper definition list')
         # Searches for one FN(\w+) define or a backslash for newline
-        p = re.compile('\s*FN\((\w+)\)|\\\\')
+        p = re.compile('\s*FN\((\w+), (\d+), ##ctx\)|\\\\')
         fn_defines_str = ''
-        i = 1  # 'unspec' is skipped as mentioned above
         while True:
             capture = p.match(self.line)
             if capture:
                 fn_defines_str += self.line
-                self.helper_enum_vals[capture.expand(r'bpf_\1')] = i
-                i += 1
+                self.helper_enum_vals[capture.expand(r'bpf_\1')] = int(capture[2])
             else:
                 break
             self.line = self.reader.readline()
         # Find the number of occurences of FN(\w+)
-        self.define_unique_helpers = re.findall('FN\(\w+\)', fn_defines_str)
+        self.define_unique_helpers = re.findall('FN\(\w+, \d+, ##ctx\)', fn_defines_str)
 
     def assign_helper_values(self):
         seen_helpers = set()
     """
     def __init__(self, parser):
         self.elements = parser.helpers
-        self.elem_number_check(parser.desc_unique_helpers, parser.define_unique_helpers, 'helper', '__BPF_FUNC_MAPPER')
+        self.elem_number_check(parser.desc_unique_helpers, parser.define_unique_helpers, 'helper', '___BPF_FUNC_MAPPER')
 
     def print_header(self):
         header = '''\
     """
     def __init__(self, parser):
         self.elements = parser.helpers
-        self.elem_number_check(parser.desc_unique_helpers, parser.define_unique_helpers, 'helper', '__BPF_FUNC_MAPPER')
+        self.elem_number_check(parser.desc_unique_helpers, parser.define_unique_helpers, 'helper', '___BPF_FUNC_MAPPER')
 
     type_fwds = [
             'struct bpf_fib_lookup',
 
  *             larger than the size of the ring buffer, or which cannot fit
  *             within a struct bpf_dynptr.
  */
-#define __BPF_FUNC_MAPPER(FN)          \
-       FN(unspec),                     \
-       FN(map_lookup_elem),            \
-       FN(map_update_elem),            \
-       FN(map_delete_elem),            \
-       FN(probe_read),                 \
-       FN(ktime_get_ns),               \
-       FN(trace_printk),               \
-       FN(get_prandom_u32),            \
-       FN(get_smp_processor_id),       \
-       FN(skb_store_bytes),            \
-       FN(l3_csum_replace),            \
-       FN(l4_csum_replace),            \
-       FN(tail_call),                  \
-       FN(clone_redirect),             \
-       FN(get_current_pid_tgid),       \
-       FN(get_current_uid_gid),        \
-       FN(get_current_comm),           \
-       FN(get_cgroup_classid),         \
-       FN(skb_vlan_push),              \
-       FN(skb_vlan_pop),               \
-       FN(skb_get_tunnel_key),         \
-       FN(skb_set_tunnel_key),         \
-       FN(perf_event_read),            \
-       FN(redirect),                   \
-       FN(get_route_realm),            \
-       FN(perf_event_output),          \
-       FN(skb_load_bytes),             \
-       FN(get_stackid),                \
-       FN(csum_diff),                  \
-       FN(skb_get_tunnel_opt),         \
-       FN(skb_set_tunnel_opt),         \
-       FN(skb_change_proto),           \
-       FN(skb_change_type),            \
-       FN(skb_under_cgroup),           \
-       FN(get_hash_recalc),            \
-       FN(get_current_task),           \
-       FN(probe_write_user),           \
-       FN(current_task_under_cgroup),  \
-       FN(skb_change_tail),            \
-       FN(skb_pull_data),              \
-       FN(csum_update),                \
-       FN(set_hash_invalid),           \
-       FN(get_numa_node_id),           \
-       FN(skb_change_head),            \
-       FN(xdp_adjust_head),            \
-       FN(probe_read_str),             \
-       FN(get_socket_cookie),          \
-       FN(get_socket_uid),             \
-       FN(set_hash),                   \
-       FN(setsockopt),                 \
-       FN(skb_adjust_room),            \
-       FN(redirect_map),               \
-       FN(sk_redirect_map),            \
-       FN(sock_map_update),            \
-       FN(xdp_adjust_meta),            \
-       FN(perf_event_read_value),      \
-       FN(perf_prog_read_value),       \
-       FN(getsockopt),                 \
-       FN(override_return),            \
-       FN(sock_ops_cb_flags_set),      \
-       FN(msg_redirect_map),           \
-       FN(msg_apply_bytes),            \
-       FN(msg_cork_bytes),             \
-       FN(msg_pull_data),              \
-       FN(bind),                       \
-       FN(xdp_adjust_tail),            \
-       FN(skb_get_xfrm_state),         \
-       FN(get_stack),                  \
-       FN(skb_load_bytes_relative),    \
-       FN(fib_lookup),                 \
-       FN(sock_hash_update),           \
-       FN(msg_redirect_hash),          \
-       FN(sk_redirect_hash),           \
-       FN(lwt_push_encap),             \
-       FN(lwt_seg6_store_bytes),       \
-       FN(lwt_seg6_adjust_srh),        \
-       FN(lwt_seg6_action),            \
-       FN(rc_repeat),                  \
-       FN(rc_keydown),                 \
-       FN(skb_cgroup_id),              \
-       FN(get_current_cgroup_id),      \
-       FN(get_local_storage),          \
-       FN(sk_select_reuseport),        \
-       FN(skb_ancestor_cgroup_id),     \
-       FN(sk_lookup_tcp),              \
-       FN(sk_lookup_udp),              \
-       FN(sk_release),                 \
-       FN(map_push_elem),              \
-       FN(map_pop_elem),               \
-       FN(map_peek_elem),              \
-       FN(msg_push_data),              \
-       FN(msg_pop_data),               \
-       FN(rc_pointer_rel),             \
-       FN(spin_lock),                  \
-       FN(spin_unlock),                \
-       FN(sk_fullsock),                \
-       FN(tcp_sock),                   \
-       FN(skb_ecn_set_ce),             \
-       FN(get_listener_sock),          \
-       FN(skc_lookup_tcp),             \
-       FN(tcp_check_syncookie),        \
-       FN(sysctl_get_name),            \
-       FN(sysctl_get_current_value),   \
-       FN(sysctl_get_new_value),       \
-       FN(sysctl_set_new_value),       \
-       FN(strtol),                     \
-       FN(strtoul),                    \
-       FN(sk_storage_get),             \
-       FN(sk_storage_delete),          \
-       FN(send_signal),                \
-       FN(tcp_gen_syncookie),          \
-       FN(skb_output),                 \
-       FN(probe_read_user),            \
-       FN(probe_read_kernel),          \
-       FN(probe_read_user_str),        \
-       FN(probe_read_kernel_str),      \
-       FN(tcp_send_ack),               \
-       FN(send_signal_thread),         \
-       FN(jiffies64),                  \
-       FN(read_branch_records),        \
-       FN(get_ns_current_pid_tgid),    \
-       FN(xdp_output),                 \
-       FN(get_netns_cookie),           \
-       FN(get_current_ancestor_cgroup_id),     \
-       FN(sk_assign),                  \
-       FN(ktime_get_boot_ns),          \
-       FN(seq_printf),                 \
-       FN(seq_write),                  \
-       FN(sk_cgroup_id),               \
-       FN(sk_ancestor_cgroup_id),      \
-       FN(ringbuf_output),             \
-       FN(ringbuf_reserve),            \
-       FN(ringbuf_submit),             \
-       FN(ringbuf_discard),            \
-       FN(ringbuf_query),              \
-       FN(csum_level),                 \
-       FN(skc_to_tcp6_sock),           \
-       FN(skc_to_tcp_sock),            \
-       FN(skc_to_tcp_timewait_sock),   \
-       FN(skc_to_tcp_request_sock),    \
-       FN(skc_to_udp6_sock),           \
-       FN(get_task_stack),             \
-       FN(load_hdr_opt),               \
-       FN(store_hdr_opt),              \
-       FN(reserve_hdr_opt),            \
-       FN(inode_storage_get),          \
-       FN(inode_storage_delete),       \
-       FN(d_path),                     \
-       FN(copy_from_user),             \
-       FN(snprintf_btf),               \
-       FN(seq_printf_btf),             \
-       FN(skb_cgroup_classid),         \
-       FN(redirect_neigh),             \
-       FN(per_cpu_ptr),                \
-       FN(this_cpu_ptr),               \
-       FN(redirect_peer),              \
-       FN(task_storage_get),           \
-       FN(task_storage_delete),        \
-       FN(get_current_task_btf),       \
-       FN(bprm_opts_set),              \
-       FN(ktime_get_coarse_ns),        \
-       FN(ima_inode_hash),             \
-       FN(sock_from_file),             \
-       FN(check_mtu),                  \
-       FN(for_each_map_elem),          \
-       FN(snprintf),                   \
-       FN(sys_bpf),                    \
-       FN(btf_find_by_name_kind),      \
-       FN(sys_close),                  \
-       FN(timer_init),                 \
-       FN(timer_set_callback),         \
-       FN(timer_start),                \
-       FN(timer_cancel),               \
-       FN(get_func_ip),                \
-       FN(get_attach_cookie),          \
-       FN(task_pt_regs),               \
-       FN(get_branch_snapshot),        \
-       FN(trace_vprintk),              \
-       FN(skc_to_unix_sock),           \
-       FN(kallsyms_lookup_name),       \
-       FN(find_vma),                   \
-       FN(loop),                       \
-       FN(strncmp),                    \
-       FN(get_func_arg),               \
-       FN(get_func_ret),               \
-       FN(get_func_arg_cnt),           \
-       FN(get_retval),                 \
-       FN(set_retval),                 \
-       FN(xdp_get_buff_len),           \
-       FN(xdp_load_bytes),             \
-       FN(xdp_store_bytes),            \
-       FN(copy_from_user_task),        \
-       FN(skb_set_tstamp),             \
-       FN(ima_file_hash),              \
-       FN(kptr_xchg),                  \
-       FN(map_lookup_percpu_elem),     \
-       FN(skc_to_mptcp_sock),          \
-       FN(dynptr_from_mem),            \
-       FN(ringbuf_reserve_dynptr),     \
-       FN(ringbuf_submit_dynptr),      \
-       FN(ringbuf_discard_dynptr),     \
-       FN(dynptr_read),                \
-       FN(dynptr_write),               \
-       FN(dynptr_data),                \
-       FN(tcp_raw_gen_syncookie_ipv4), \
-       FN(tcp_raw_gen_syncookie_ipv6), \
-       FN(tcp_raw_check_syncookie_ipv4),       \
-       FN(tcp_raw_check_syncookie_ipv6),       \
-       FN(ktime_get_tai_ns),           \
-       FN(user_ringbuf_drain),         \
+#define ___BPF_FUNC_MAPPER(FN, ctx...)                 \
+       FN(unspec, 0, ##ctx)                            \
+       FN(map_lookup_elem, 1, ##ctx)                   \
+       FN(map_update_elem, 2, ##ctx)                   \
+       FN(map_delete_elem, 3, ##ctx)                   \
+       FN(probe_read, 4, ##ctx)                        \
+       FN(ktime_get_ns, 5, ##ctx)                      \
+       FN(trace_printk, 6, ##ctx)                      \
+       FN(get_prandom_u32, 7, ##ctx)                   \
+       FN(get_smp_processor_id, 8, ##ctx)              \
+       FN(skb_store_bytes, 9, ##ctx)                   \
+       FN(l3_csum_replace, 10, ##ctx)                  \
+       FN(l4_csum_replace, 11, ##ctx)                  \
+       FN(tail_call, 12, ##ctx)                        \
+       FN(clone_redirect, 13, ##ctx)                   \
+       FN(get_current_pid_tgid, 14, ##ctx)             \
+       FN(get_current_uid_gid, 15, ##ctx)              \
+       FN(get_current_comm, 16, ##ctx)                 \
+       FN(get_cgroup_classid, 17, ##ctx)               \
+       FN(skb_vlan_push, 18, ##ctx)                    \
+       FN(skb_vlan_pop, 19, ##ctx)                     \
+       FN(skb_get_tunnel_key, 20, ##ctx)               \
+       FN(skb_set_tunnel_key, 21, ##ctx)               \
+       FN(perf_event_read, 22, ##ctx)                  \
+       FN(redirect, 23, ##ctx)                         \
+       FN(get_route_realm, 24, ##ctx)                  \
+       FN(perf_event_output, 25, ##ctx)                \
+       FN(skb_load_bytes, 26, ##ctx)                   \
+       FN(get_stackid, 27, ##ctx)                      \
+       FN(csum_diff, 28, ##ctx)                        \
+       FN(skb_get_tunnel_opt, 29, ##ctx)               \
+       FN(skb_set_tunnel_opt, 30, ##ctx)               \
+       FN(skb_change_proto, 31, ##ctx)                 \
+       FN(skb_change_type, 32, ##ctx)                  \
+       FN(skb_under_cgroup, 33, ##ctx)                 \
+       FN(get_hash_recalc, 34, ##ctx)                  \
+       FN(get_current_task, 35, ##ctx)                 \
+       FN(probe_write_user, 36, ##ctx)                 \
+       FN(current_task_under_cgroup, 37, ##ctx)        \
+       FN(skb_change_tail, 38, ##ctx)                  \
+       FN(skb_pull_data, 39, ##ctx)                    \
+       FN(csum_update, 40, ##ctx)                      \
+       FN(set_hash_invalid, 41, ##ctx)                 \
+       FN(get_numa_node_id, 42, ##ctx)                 \
+       FN(skb_change_head, 43, ##ctx)                  \
+       FN(xdp_adjust_head, 44, ##ctx)                  \
+       FN(probe_read_str, 45, ##ctx)                   \
+       FN(get_socket_cookie, 46, ##ctx)                \
+       FN(get_socket_uid, 47, ##ctx)                   \
+       FN(set_hash, 48, ##ctx)                         \
+       FN(setsockopt, 49, ##ctx)                       \
+       FN(skb_adjust_room, 50, ##ctx)                  \
+       FN(redirect_map, 51, ##ctx)                     \
+       FN(sk_redirect_map, 52, ##ctx)                  \
+       FN(sock_map_update, 53, ##ctx)                  \
+       FN(xdp_adjust_meta, 54, ##ctx)                  \
+       FN(perf_event_read_value, 55, ##ctx)            \
+       FN(perf_prog_read_value, 56, ##ctx)             \
+       FN(getsockopt, 57, ##ctx)                       \
+       FN(override_return, 58, ##ctx)                  \
+       FN(sock_ops_cb_flags_set, 59, ##ctx)            \
+       FN(msg_redirect_map, 60, ##ctx)                 \
+       FN(msg_apply_bytes, 61, ##ctx)                  \
+       FN(msg_cork_bytes, 62, ##ctx)                   \
+       FN(msg_pull_data, 63, ##ctx)                    \
+       FN(bind, 64, ##ctx)                             \
+       FN(xdp_adjust_tail, 65, ##ctx)                  \
+       FN(skb_get_xfrm_state, 66, ##ctx)               \
+       FN(get_stack, 67, ##ctx)                        \
+       FN(skb_load_bytes_relative, 68, ##ctx)          \
+       FN(fib_lookup, 69, ##ctx)                       \
+       FN(sock_hash_update, 70, ##ctx)                 \
+       FN(msg_redirect_hash, 71, ##ctx)                \
+       FN(sk_redirect_hash, 72, ##ctx)                 \
+       FN(lwt_push_encap, 73, ##ctx)                   \
+       FN(lwt_seg6_store_bytes, 74, ##ctx)             \
+       FN(lwt_seg6_adjust_srh, 75, ##ctx)              \
+       FN(lwt_seg6_action, 76, ##ctx)                  \
+       FN(rc_repeat, 77, ##ctx)                        \
+       FN(rc_keydown, 78, ##ctx)                       \
+       FN(skb_cgroup_id, 79, ##ctx)                    \
+       FN(get_current_cgroup_id, 80, ##ctx)            \
+       FN(get_local_storage, 81, ##ctx)                \
+       FN(sk_select_reuseport, 82, ##ctx)              \
+       FN(skb_ancestor_cgroup_id, 83, ##ctx)           \
+       FN(sk_lookup_tcp, 84, ##ctx)                    \
+       FN(sk_lookup_udp, 85, ##ctx)                    \
+       FN(sk_release, 86, ##ctx)                       \
+       FN(map_push_elem, 87, ##ctx)                    \
+       FN(map_pop_elem, 88, ##ctx)                     \
+       FN(map_peek_elem, 89, ##ctx)                    \
+       FN(msg_push_data, 90, ##ctx)                    \
+       FN(msg_pop_data, 91, ##ctx)                     \
+       FN(rc_pointer_rel, 92, ##ctx)                   \
+       FN(spin_lock, 93, ##ctx)                        \
+       FN(spin_unlock, 94, ##ctx)                      \
+       FN(sk_fullsock, 95, ##ctx)                      \
+       FN(tcp_sock, 96, ##ctx)                         \
+       FN(skb_ecn_set_ce, 97, ##ctx)                   \
+       FN(get_listener_sock, 98, ##ctx)                \
+       FN(skc_lookup_tcp, 99, ##ctx)                   \
+       FN(tcp_check_syncookie, 100, ##ctx)             \
+       FN(sysctl_get_name, 101, ##ctx)                 \
+       FN(sysctl_get_current_value, 102, ##ctx)        \
+       FN(sysctl_get_new_value, 103, ##ctx)            \
+       FN(sysctl_set_new_value, 104, ##ctx)            \
+       FN(strtol, 105, ##ctx)                          \
+       FN(strtoul, 106, ##ctx)                         \
+       FN(sk_storage_get, 107, ##ctx)                  \
+       FN(sk_storage_delete, 108, ##ctx)               \
+       FN(send_signal, 109, ##ctx)                     \
+       FN(tcp_gen_syncookie, 110, ##ctx)               \
+       FN(skb_output, 111, ##ctx)                      \
+       FN(probe_read_user, 112, ##ctx)                 \
+       FN(probe_read_kernel, 113, ##ctx)               \
+       FN(probe_read_user_str, 114, ##ctx)             \
+       FN(probe_read_kernel_str, 115, ##ctx)           \
+       FN(tcp_send_ack, 116, ##ctx)                    \
+       FN(send_signal_thread, 117, ##ctx)              \
+       FN(jiffies64, 118, ##ctx)                       \
+       FN(read_branch_records, 119, ##ctx)             \
+       FN(get_ns_current_pid_tgid, 120, ##ctx)         \
+       FN(xdp_output, 121, ##ctx)                      \
+       FN(get_netns_cookie, 122, ##ctx)                \
+       FN(get_current_ancestor_cgroup_id, 123, ##ctx)  \
+       FN(sk_assign, 124, ##ctx)                       \
+       FN(ktime_get_boot_ns, 125, ##ctx)               \
+       FN(seq_printf, 126, ##ctx)                      \
+       FN(seq_write, 127, ##ctx)                       \
+       FN(sk_cgroup_id, 128, ##ctx)                    \
+       FN(sk_ancestor_cgroup_id, 129, ##ctx)           \
+       FN(ringbuf_output, 130, ##ctx)                  \
+       FN(ringbuf_reserve, 131, ##ctx)                 \
+       FN(ringbuf_submit, 132, ##ctx)                  \
+       FN(ringbuf_discard, 133, ##ctx)                 \
+       FN(ringbuf_query, 134, ##ctx)                   \
+       FN(csum_level, 135, ##ctx)                      \
+       FN(skc_to_tcp6_sock, 136, ##ctx)                \
+       FN(skc_to_tcp_sock, 137, ##ctx)                 \
+       FN(skc_to_tcp_timewait_sock, 138, ##ctx)        \
+       FN(skc_to_tcp_request_sock, 139, ##ctx)         \
+       FN(skc_to_udp6_sock, 140, ##ctx)                \
+       FN(get_task_stack, 141, ##ctx)                  \
+       FN(load_hdr_opt, 142, ##ctx)                    \
+       FN(store_hdr_opt, 143, ##ctx)                   \
+       FN(reserve_hdr_opt, 144, ##ctx)                 \
+       FN(inode_storage_get, 145, ##ctx)               \
+       FN(inode_storage_delete, 146, ##ctx)            \
+       FN(d_path, 147, ##ctx)                          \
+       FN(copy_from_user, 148, ##ctx)                  \
+       FN(snprintf_btf, 149, ##ctx)                    \
+       FN(seq_printf_btf, 150, ##ctx)                  \
+       FN(skb_cgroup_classid, 151, ##ctx)              \
+       FN(redirect_neigh, 152, ##ctx)                  \
+       FN(per_cpu_ptr, 153, ##ctx)                     \
+       FN(this_cpu_ptr, 154, ##ctx)                    \
+       FN(redirect_peer, 155, ##ctx)                   \
+       FN(task_storage_get, 156, ##ctx)                \
+       FN(task_storage_delete, 157, ##ctx)             \
+       FN(get_current_task_btf, 158, ##ctx)            \
+       FN(bprm_opts_set, 159, ##ctx)                   \
+       FN(ktime_get_coarse_ns, 160, ##ctx)             \
+       FN(ima_inode_hash, 161, ##ctx)                  \
+       FN(sock_from_file, 162, ##ctx)                  \
+       FN(check_mtu, 163, ##ctx)                       \
+       FN(for_each_map_elem, 164, ##ctx)               \
+       FN(snprintf, 165, ##ctx)                        \
+       FN(sys_bpf, 166, ##ctx)                         \
+       FN(btf_find_by_name_kind, 167, ##ctx)           \
+       FN(sys_close, 168, ##ctx)                       \
+       FN(timer_init, 169, ##ctx)                      \
+       FN(timer_set_callback, 170, ##ctx)              \
+       FN(timer_start, 171, ##ctx)                     \
+       FN(timer_cancel, 172, ##ctx)                    \
+       FN(get_func_ip, 173, ##ctx)                     \
+       FN(get_attach_cookie, 174, ##ctx)               \
+       FN(task_pt_regs, 175, ##ctx)                    \
+       FN(get_branch_snapshot, 176, ##ctx)             \
+       FN(trace_vprintk, 177, ##ctx)                   \
+       FN(skc_to_unix_sock, 178, ##ctx)                \
+       FN(kallsyms_lookup_name, 179, ##ctx)            \
+       FN(find_vma, 180, ##ctx)                        \
+       FN(loop, 181, ##ctx)                            \
+       FN(strncmp, 182, ##ctx)                         \
+       FN(get_func_arg, 183, ##ctx)                    \
+       FN(get_func_ret, 184, ##ctx)                    \
+       FN(get_func_arg_cnt, 185, ##ctx)                \
+       FN(get_retval, 186, ##ctx)                      \
+       FN(set_retval, 187, ##ctx)                      \
+       FN(xdp_get_buff_len, 188, ##ctx)                \
+       FN(xdp_load_bytes, 189, ##ctx)                  \
+       FN(xdp_store_bytes, 190, ##ctx)                 \
+       FN(copy_from_user_task, 191, ##ctx)             \
+       FN(skb_set_tstamp, 192, ##ctx)                  \
+       FN(ima_file_hash, 193, ##ctx)                   \
+       FN(kptr_xchg, 194, ##ctx)                       \
+       FN(map_lookup_percpu_elem, 195, ##ctx)          \
+       FN(skc_to_mptcp_sock, 196, ##ctx)               \
+       FN(dynptr_from_mem, 197, ##ctx)                 \
+       FN(ringbuf_reserve_dynptr, 198, ##ctx)          \
+       FN(ringbuf_submit_dynptr, 199, ##ctx)           \
+       FN(ringbuf_discard_dynptr, 200, ##ctx)          \
+       FN(dynptr_read, 201, ##ctx)                     \
+       FN(dynptr_write, 202, ##ctx)                    \
+       FN(dynptr_data, 203, ##ctx)                     \
+       FN(tcp_raw_gen_syncookie_ipv4, 204, ##ctx)      \
+       FN(tcp_raw_gen_syncookie_ipv6, 205, ##ctx)      \
+       FN(tcp_raw_check_syncookie_ipv4, 206, ##ctx)    \
+       FN(tcp_raw_check_syncookie_ipv6, 207, ##ctx)    \
+       FN(ktime_get_tai_ns, 208, ##ctx)                \
+       FN(user_ringbuf_drain, 209, ##ctx)              \
        /* */
 
+/* backwards-compatibility macros for users of __BPF_FUNC_MAPPER that don't
+ * know or care about integer value that is now passed as second argument
+ */
+#define __BPF_FUNC_MAPPER_APPLY(name, value, FN) FN(name),
+#define __BPF_FUNC_MAPPER(FN) ___BPF_FUNC_MAPPER(__BPF_FUNC_MAPPER_APPLY, FN)
+
 /* integer value in 'imm' field of BPF_CALL instruction selects which helper
  * function eBPF program intends to call
  */
-#define __BPF_ENUM_FN(x) BPF_FUNC_ ## x
+#define __BPF_ENUM_FN(x, y) BPF_FUNC_ ## x = y,
 enum bpf_func_id {
-       __BPF_FUNC_MAPPER(__BPF_ENUM_FN)
+       ___BPF_FUNC_MAPPER(__BPF_ENUM_FN)
        __BPF_FUNC_MAX_ID,
 };
 #undef __BPF_ENUM_FN