Blame SOURCES/rhbz1643997.0019-PR23829-fallback-defines-__BPF_FUNC_MAPPER-and-BPF_J.patch

e4e640
From 0d45550a184cc5a9f10187a97b9ef8dc7fa13f31 Mon Sep 17 00:00:00 2001
e4e640
From: Serhei Makarov <smakarov@redhat.com>
e4e640
Date: Fri, 2 Nov 2018 16:49:23 -0400
e4e640
Subject: [PATCH 19/32] PR23829 :: fallback defines __BPF_FUNC_MAPPER and
e4e640
 BPF_J{LT,LE,SLT,SLE} for older kernels
e4e640
e4e640
---
e4e640
 bpf-base.cxx   | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
e4e640
 bpf-internal.h | 11 +++++++++++
e4e640
 2 files changed, 70 insertions(+)
e4e640
e4e640
diff --git a/bpf-base.cxx b/bpf-base.cxx
e4e640
index 277927b72..210efa9aa 100644
e4e640
--- a/bpf-base.cxx
e4e640
+++ b/bpf-base.cxx
e4e640
@@ -140,6 +140,65 @@ is_commutative(opcode code)
e4e640
 std::map<unsigned, const char *> bpf_func_name_map;
e4e640
 std::map<std::string, bpf_func_id> bpf_func_id_map;
e4e640
 
e4e640
+/* PR23829: On older kernels, bpf.h does not define __BPF_FUNC_MAPPER.
e4e640
+   As a fallback, use the *earliest* __BPF_FUNC_MAPPER, so stapbpf
e4e640
+   will not try helpers that only exist on subsequent kernels.
e4e640
+
e4e640
+   TODO: This isn't perfect since even older kernels don't have
e4e640
+   some of these helpers.
e4e640
+
e4e640
+   XXX: Note the build limitation in that SystemTap must be compiled
e4e640
+   against a recent kernel to be able to use the helpers from that
e4e640
+   kernel. That's also the case when building against recent bpf.h
e4e640
+   with __BPF_FUNC_MAPPER, so this workaround is not the source of the
e4e640
+   problem. */
e4e640
+#ifndef __BPF_FUNC_MAPPER
e4e640
+#define __BPF_FUNC_MAPPER(FN)		\
e4e640
+	FN(unspec),			\
e4e640
+	FN(map_lookup_elem),		\
e4e640
+	FN(map_update_elem),		\
e4e640
+	FN(map_delete_elem),		\
e4e640
+	FN(probe_read),			\
e4e640
+	FN(ktime_get_ns),		\
e4e640
+	FN(trace_printk),		\
e4e640
+	FN(get_prandom_u32),		\
e4e640
+	FN(get_smp_processor_id),	\
e4e640
+	FN(skb_store_bytes),		\
e4e640
+	FN(l3_csum_replace),		\
e4e640
+	FN(l4_csum_replace),		\
e4e640
+	FN(tail_call),			\
e4e640
+	FN(clone_redirect),		\
e4e640
+	FN(get_current_pid_tgid),	\
e4e640
+	FN(get_current_uid_gid),	\
e4e640
+	FN(get_current_comm),		\
e4e640
+	FN(get_cgroup_classid),		\
e4e640
+	FN(skb_vlan_push),		\
e4e640
+	FN(skb_vlan_pop),		\
e4e640
+	FN(skb_get_tunnel_key),		\
e4e640
+	FN(skb_set_tunnel_key),		\
e4e640
+	FN(perf_event_read),		\
e4e640
+	FN(redirect),			\
e4e640
+	FN(get_route_realm),		\
e4e640
+	FN(perf_event_output),		\
e4e640
+	FN(skb_load_bytes),		\
e4e640
+	FN(get_stackid),		\
e4e640
+	FN(csum_diff),			\
e4e640
+	FN(skb_get_tunnel_opt),		\
e4e640
+	FN(skb_set_tunnel_opt),		\
e4e640
+	FN(skb_change_proto),		\
e4e640
+	FN(skb_change_type),		\
e4e640
+	FN(skb_under_cgroup),		\
e4e640
+	FN(get_hash_recalc),		\
e4e640
+	FN(get_current_task),		\
e4e640
+	FN(probe_write_user),		\
e4e640
+	FN(current_task_under_cgroup),	\
e4e640
+	FN(skb_change_tail),		\
e4e640
+	FN(skb_pull_data),		\
e4e640
+	FN(csum_update),		\
e4e640
+	FN(set_hash_invalid),           \
e4e640
+
e4e640
+#endif
e4e640
+
e4e640
 void
e4e640
 init_bpf_helper_tables () // TODO call before script translation
e4e640
 {
e4e640
diff --git a/bpf-internal.h b/bpf-internal.h
e4e640
index 3041bbdf5..82cba2c79 100644
e4e640
--- a/bpf-internal.h
e4e640
+++ b/bpf-internal.h
e4e640
@@ -21,6 +21,17 @@ extern "C" {
e4e640
 #include <linux/bpf.h>
e4e640
 }
e4e640
 
e4e640
+/* PR23829: These eBPF opcodes were added in recent kernels, and the
e4e640
+   following 'ad hoc' defines are only used by the embedded-code
e4e640
+   assembler.  The code generator will convert these opcodes to
e4e640
+   equivalent operations valid for earlier eBPF. */
e4e640
+#ifndef BPF_JLT
e4e640
+#define BPF_JLT		0xa0	/* LT is unsigned, '<' */
e4e640
+#define BPF_JLE		0xb0	/* LE is unsigned, '<=' */
e4e640
+#define BPF_JSLT	0xc0	/* SLT is signed, '<' */
e4e640
+#define BPF_JSLE	0xd0	/* SLE is signed, '<=' */
e4e640
+#endif
e4e640
+
e4e640
 struct systemtap_session;
e4e640
 struct derived_probe;
e4e640
 struct vardecl;
e4e640
-- 
e4e640
2.14.5
e4e640