bcc/tools: Introduce bpf_probe_read_user to the tools.

This is essential for architecture which do have overlapping address space.
- bpf_probe_read_kernel() shall be used for reading data from kernel space
to the bpf vm.
- bpf_probe_read_user() shall be used for reading data from user space
  to the bpf vm.

Signed-off-by: Sumanth Korikkar <sumanthk@linux.ibm.com>
diff --git a/tools/dbslower.py b/tools/dbslower.py
index 2f1b6a8..ffbb5e1 100755
--- a/tools/dbslower.py
+++ b/tools/dbslower.py
@@ -127,12 +127,12 @@
     tmp.timestamp = bpf_ktime_get_ns();
 
 #if defined(MYSQL56)
-    bpf_probe_read(&tmp.query, sizeof(tmp.query), (void*) PT_REGS_PARM3(ctx));
+    bpf_probe_read_user(&tmp.query, sizeof(tmp.query), (void*) PT_REGS_PARM3(ctx));
 #elif defined(MYSQL57)
     void* st = (void*) PT_REGS_PARM2(ctx);
     char* query;
-    bpf_probe_read(&query, sizeof(query), st);
-    bpf_probe_read(&tmp.query, sizeof(tmp.query), query);
+    bpf_probe_read_user(&query, sizeof(query), st);
+    bpf_probe_read_user(&tmp.query, sizeof(tmp.query), query);
 #else //USDT
     bpf_usdt_readarg(1, ctx, &tmp.query);
 #endif
@@ -157,7 +157,13 @@
         data.pid = pid >> 32;   // only process id
         data.timestamp = tempp->timestamp;
         data.duration = delta;
+#if defined(MYSQL56) || defined(MYSQL57)
+	// We already copied string to the bpf stack. Hence use bpf_probe_read()
         bpf_probe_read(&data.query, sizeof(data.query), tempp->query);
+#else
+	// USDT - we didnt copy string to the bpf stack before.
+        bpf_probe_read_user(&data.query, sizeof(data.query), tempp->query);
+#endif
         events.perf_submit(ctx, &data, sizeof(data));
 #ifdef THRESHOLD
     }