https://bugs.kde.org/show_bug.cgi?id=388786

            Bug ID: 388786
           Summary: Support bpf syscall in amd64 Linux
           Product: valgrind
           Version: 3.14 SVN
          Platform: unspecified
                OS: Linux
            Status: UNCONFIRMED
          Severity: task
          Priority: NOR
         Component: memcheck
          Assignee: jsew...@acm.org
          Reporter: spacewander...@gmail.com
  Target Milestone: ---

Created attachment 109783
  --> https://bugs.kde.org/attachment.cgi?id=109783&action=edit
Tha patch for supporting bpf syscall in amd64 Linux

Hi everyone.
I just wrote a patch to support bpf syscall in amd64 Linux, following
this guide: http://valgrind.org/docs/manual/dist.readme-missing.html
It is my first time to hack valgrind, please let me know if I made any mistake.
I am glad to see this patch could be reviewed and accepted.
Thanks!

diff --git a/coregrind/m_syswrap/syswrap-amd64-linux.c
b/coregrind/m_syswrap/syswrap-amd64-linux.c
index 14ad6499e..a75048397 100644
--- a/coregrind/m_syswrap/syswrap-amd64-linux.c
+++ b/coregrind/m_syswrap/syswrap-amd64-linux.c
@@ -201,6 +201,7 @@ DECL_TEMPLATE(amd64_linux, sys_arch_prctl);
 DECL_TEMPLATE(amd64_linux, sys_ptrace);
 DECL_TEMPLATE(amd64_linux, sys_fadvise64);
 DECL_TEMPLATE(amd64_linux, sys_mmap);
+DECL_TEMPLATE(amd64_linux, sys_bpf);
 DECL_TEMPLATE(amd64_linux, sys_syscall184);


@@ -401,6 +402,14 @@ PRE(sys_mmap)
    SET_STATUS_from_SysRes(r);
 }

+PRE(sys_bpf)
+{
+
+   PRINT("sys_bpf ( %ld, %#lx, %lu )" , SARG1, ARG2, ARG3);
+   PRE_REG_READ3(int, "bpf",
+                 int, cmd, union vki_bpf_attr *, attr, unsigned int, size);
+}
+

 /* ---------------------------------------------------------------
    PRE/POST wrappers for AMD64/Linux-variant specific syscalls
@@ -839,10 +848,10 @@ static SyscallTableEntry syscall_table[] = {
    LINX_(__NR_renameat2,         sys_renameat2),        // 316
 //   LIN__(__NR_seccomp,           sys_ni_syscall),       // 317
    LINXY(__NR_getrandom,         sys_getrandom),        // 318
-   LINXY(__NR_memfd_create,      sys_memfd_create)      // 319
+   LINXY(__NR_memfd_create,      sys_memfd_create),      // 319

 //   LIN__(__NR_kexec_file_load,   sys_ni_syscall),       // 320
-//   LIN__(__NR_bpf,               sys_ni_syscall)        // 321
+   PLAX_(__NR_bpf,               sys_bpf),              // 321
 };

 SyscallTableEntry* ML_(get_linux_syscall_entry) ( UInt sysno )
diff --git a/include/vki/vki-amd64-linux.h b/include/vki/vki-amd64-linux.h
index a506ade06..293c4edf0 100644
--- a/include/vki/vki-amd64-linux.h
+++ b/include/vki/vki-amd64-linux.h
@@ -48,6 +48,7 @@ typedef unsigned int __vki_u32;

 typedef __signed__ long long __vki_s64;
 typedef unsigned long long __vki_u64;
+typedef __vki_u64 __attribute__((aligned(8))) __vki_aligned_u64;

 typedef unsigned short vki_u16;

@@ -697,6 +698,86 @@ struct vki_shminfo64 {
 #define VKI_TIOCGSERIAL     0x541E
 #define VKI_TIOCSSERIAL     0x541F

+//----------------------------------------------------------------------
+// From linux-4.14.13/include/uapi/linux/bpf.h
+//----------------------------------------------------------------------
+
+union bpf_attr {
+    struct { /* anonymous struct used by BPF_MAP_CREATE command */
+        __vki_u32    map_type;    /* one of enum bpf_map_type */
+        __vki_u32    key_size;    /* size of key in bytes */
+        __vki_u32    value_size;    /* size of value in bytes */
+        __vki_u32    max_entries;    /* max number of entries in a map */
+        __vki_u32    map_flags;    /* BPF_MAP_CREATE related
+                     * flags defined above.
+                     */
+        __vki_u32    inner_map_fd;    /* fd pointing to the inner map */
+        __vki_u32    numa_node;    /* numa node (effective only if
+                                 * BPF_F_NUMA_NODE is set).
+                                 */
+    };
+
+    struct { /* anonymous struct used by BPF_MAP_*_ELEM commands */
+        __vki_u32            map_fd;
+        __vki_aligned_u64    key;
+        union {
+            __vki_aligned_u64 value;
+            __vki_aligned_u64 next_key;
+        };
+        __vki_u64        flags;
+    };
+
+    struct { /* anonymous struct used by BPF_PROG_LOAD command */
+        __vki_u32            prog_type;    /* one of enum bpf_prog_type */
+        __vki_u32            insn_cnt;
+        __vki_aligned_u64    insns;
+        __vki_aligned_u64    license;
+        __vki_u32            log_level;    /* verbosity level of verifier */
+        __vki_u32            log_size;    /* size of user buffer */
+        __vki_aligned_u64    log_buf;    /* user supplied buffer */
+        __vki_u32            kern_version;    /* checked when
prog_type=kprobe */
+        __vki_u32            prog_flags;
+    };
+
+    struct { /* anonymous struct used by BPF_OBJ_* commands */
+        __vki_aligned_u64    pathname;
+        __vki_u32            bpf_fd;
+    };
+
+    struct { /* anonymous struct used by BPF_PROG_ATTACH/DETACH commands */
+        __vki_u32        target_fd;    /* container object to attach to */
+        __vki_u32        attach_bpf_fd;    /* eBPF program to attach */
+        __vki_u32        attach_type;
+        __vki_u32        attach_flags;
+    };
+
+    struct { /* anonymous struct used by BPF_PROG_TEST_RUN command */
+        __vki_u32            prog_fd;
+        __vki_u32            retval;
+        __vki_u32            data_size_in;
+        __vki_u32            data_size_out;
+        __vki_aligned_u64    data_in;
+        __vki_aligned_u64    data_out;
+        __vki_u32            repeat;
+        __vki_u32            duration;
+    } test;
+
+    struct { /* anonymous struct used by BPF_*_GET_*_ID */
+        union {
+            __vki_u32        start_id;
+            __vki_u32        prog_id;
+            __vki_u32        map_id;
+        };
+        __vki_u32        next_id;
+    };
+
+    struct { /* anonymous struct used by BPF_OBJ_GET_INFO_BY_FD */
+        __vki_u32            bpf_fd;
+        __vki_u32            info_len;
+        __vki_aligned_u64    info;
+    } info;
+} __attribute__((aligned(8)));
+
 //----------------------------------------------------------------------
 // And that's it!
 //----------------------------------------------------------------------

-- 
You are receiving this mail because:
You are watching all bug changes.

Reply via email to