Hello.

I changed the hook as below and confirmed that cp == NULL at bpf_probe_read().
That is, it is bpf_usdt_readarg() which got broken.

----------
int do_start(struct pt_regs *ctx) {
    char *cp = NULL;
    bpf_usdt_readarg(1, ctx, &cp);
    struct { char query[QUERY_MAX]; } data = { };
    if (cp != NULL)
        bpf_probe_read(&data.query, sizeof(data.query), (void *) cp);
    else
        data.query[0] = '!';
    events.perf_submit(ctx, &data, sizeof(data));
    return 0;
};
----------

If I do

-    std::string cptr = tfm::format("*((volatile %s *)dest)", ctype);
+    std::string cptr = tfm::format("*((%s *)dest)", ctype);

(i.e. drop only "volatile " part) in that commit like below

----------
diff --git a/src/cc/usdt.cc b/src/cc/usdt.cc
--- a/src/cc/usdt.cc
+++ b/src/cc/usdt.cc
@@ -152,7 +152,7 @@ bool Probe::usdt_getarg(std::ostream &stream) {

   for (size_t arg_n = 0; arg_n < arg_count; ++arg_n) {
     std::string ctype = largest_arg_type(arg_n);
-    std::string cptr("dest");
+    std::string cptr = tfm::format("*((%s *)dest)", ctype);

     tfm::format(stream,
                 "static __always_inline int _bpf_readarg_%s_%d("
----------

USDT probe works again as well as build warning shown below goes away.

----------
/virtual/main.c:4:8: warning: incompatible integer to pointer conversion 
assigning to 'void *' from 'volatile uint64_t' (aka 'volatile unsigned long 
long') [-Wint-conversion]
  dest = *(volatile uint64_t *)&ctx->bx;
       ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
----------
_______________________________________________
iovisor-dev mailing list
iovisor-dev@lists.iovisor.org
https://lists.iovisor.org/mailman/listinfo/iovisor-dev

Reply via email to