fix running eBPF programs on 64-bit architectures 43/271443/1
authorAdrian Szyndela <adrian.s@samsung.com>
Mon, 21 Feb 2022 08:58:21 +0000 (09:58 +0100)
committerAdrian Szyndela <adrian.s@samsung.com>
Mon, 21 Feb 2022 09:47:17 +0000 (10:47 +0100)
32-bit architectures are not supported by the original bcc.
Our changes, which were supposed to support bcc on armv7l,
appeared to be working also with 64-bit architectures
before the bcc upgrade. Now, they break running the programs
on aarch64. So, let's step back, bring back aarch64, and hack it once again,
if ever needed.

Change-Id: I9b30b8f4267d36008ea4b753e3832514ab1682b6

src/cc/export/helpers.h
src/cc/frontends/clang/b_frontend_action.cc

index 842a03670e36729f5dba4e562bf99751268733c5..b78c3c19fc343dea697dcd72f422cf393c65d9d5 100644 (file)
@@ -1040,7 +1040,7 @@ u64 load_dword(void *skb, u64 off) {
 void bpf_store_byte(void *skb, u64 off, u64 val) asm("llvm.bpf.store.byte");
 void bpf_store_half(void *skb, u64 off, u64 val) asm("llvm.bpf.store.half");
 void bpf_store_word(void *skb, u64 off, u64 val) asm("llvm.bpf.store.word");
-void *bpf_pseudo_fd(u64, u64) asm("llvm.bpf.pseudo");
+u64 bpf_pseudo_fd(u64, u64) asm("llvm.bpf.pseudo");
 
 static inline void __attribute__((always_inline))
 bpf_store_dword(void *skb, u64 off, u64 val) {
index 3d1a7d920f065cc76db4529859e2e4c706a35237..3150693fcb792c1cea380f45ba815d75bacb59c2 100644 (file)
@@ -507,9 +507,9 @@ bool ProbeVisitor::VisitUnaryOperator(UnaryOperator *E) {
   string pre, post;
   pre = "({ typeof(" + E->getType().getAsString() + ") _val; __builtin_memset(&_val, 0, sizeof(_val));";
   if (has_overlap_kuaddr_)
-    pre += " bpf_probe_read_kernel(&_val, sizeof(_val), (char *)";
+    pre += " bpf_probe_read_kernel(&_val, sizeof(_val), (u64)";
   else
-    pre += " bpf_probe_read(&_val, sizeof(_val), (char *)";
+    pre += " bpf_probe_read(&_val, sizeof(_val), (u64)";
   post = "); _val; })";
   rewriter_.ReplaceText(expansionLoc(E->getOperatorLoc()), 1, pre);
   rewriter_.InsertTextAfterToken(expansionLoc(GET_ENDLOC(sub)), post);
@@ -571,9 +571,9 @@ bool ProbeVisitor::VisitMemberExpr(MemberExpr *E) {
   string pre, post;
   pre = "({ typeof(" + E->getType().getAsString() + ") _val; __builtin_memset(&_val, 0, sizeof(_val));";
   if (has_overlap_kuaddr_)
-    pre += " bpf_probe_read_kernel(&_val, sizeof(_val), (char *)&";
+    pre += " bpf_probe_read_kernel(&_val, sizeof(_val), (u64)&";
   else
-    pre += " bpf_probe_read(&_val, sizeof(_val), (char *)&";
+    pre += " bpf_probe_read(&_val, sizeof(_val), (u64)&";
   post = rhs + "); _val; })";
   rewriter_.InsertText(expansionLoc(GET_BEGINLOC(E)), pre);
   rewriter_.ReplaceText(expansionRange(SourceRange(member, GET_ENDLOC(E))), post);