From: Adrian Szyndela Date: Mon, 21 Feb 2022 08:58:21 +0000 (+0100) Subject: fix running eBPF programs on 64-bit architectures X-Git-Tag: submit/tizen/20220713.022109~5 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b8acfddeba34b439881befd12c48706b548fd0c5;p=platform%2Fupstream%2Fbcc.git fix running eBPF programs on 64-bit architectures 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 --- diff --git a/src/cc/export/helpers.h b/src/cc/export/helpers.h index 842a0367..b78c3c19 100644 --- a/src/cc/export/helpers.h +++ b/src/cc/export/helpers.h @@ -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) { diff --git a/src/cc/frontends/clang/b_frontend_action.cc b/src/cc/frontends/clang/b_frontend_action.cc index 3d1a7d92..3150693f 100644 --- a/src/cc/frontends/clang/b_frontend_action.cc +++ b/src/cc/frontends/clang/b_frontend_action.cc @@ -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);