trinity.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] Fix build on older kernels without BPF.
@ 2016-07-12 18:43 Vinson Lee
  2016-07-12 19:02 ` Dave Jones
  0 siblings, 1 reply; 8+ messages in thread
From: Vinson Lee @ 2016-07-12 18:43 UTC (permalink / raw)
  To: trinity

Signed-off-by: Vinson Lee <vlee@freedesktop.org>
---
 configure      |    1 +
 syscalls/bpf.c |   14 ++++++++++++++
 2 files changed, 15 insertions(+), 0 deletions(-)

diff --git a/configure b/configure
index 8d95929..ca37e4e 100755
--- a/configure
+++ b/configure
@@ -239,6 +239,7 @@ check_header execinfo.h USE_BACKTRACE
 check_header netatalk/at.h USE_APPLETALK
 check_header netrom/netrom.h USE_NETROM
 check_header netrose/rose.h USE_ROSE
+check_header linux/bpf.h USE_BPF
 
 rm -f "$TMP" "$TMP.log" "$TMP.c"
 
diff --git a/syscalls/bpf.c b/syscalls/bpf.c
index b2f57d3..4788082 100644
--- a/syscalls/bpf.c
+++ b/syscalls/bpf.c
@@ -1,13 +1,16 @@
 /*
  * SYSCALL_DEFINE3(bpf, int, cmd, union bpf_attr __user *, uattr, unsigned int, size)
  */
+#ifdef USE_BPF
 #include <linux/bpf.h>
+#endif
 #include <linux/filter.h>
 #include "arch.h"
 #include "net.h"
 #include "random.h"
 #include "sanitise.h"
 
+#ifdef USE_BPF
 static unsigned long bpf_prog_types[] = {
 	BPF_PROG_TYPE_UNSPEC,
 	BPF_PROG_TYPE_SOCKET_FILTER,
@@ -15,9 +18,11 @@ static unsigned long bpf_prog_types[] = {
 	BPF_PROG_TYPE_SCHED_CLS,
 	BPF_PROG_TYPE_SCHED_ACT,
 };
+#endif
 
 static const char license[] = "GPLv2";
 
+#ifdef USE_BPF
 static void bpf_prog_load(struct syscallrecord *rec)
 {
 	unsigned long *insns = NULL, len = 0;
@@ -49,18 +54,22 @@ static void bpf_prog_load(struct syscallrecord *rec)
 	rec->a2 = (unsigned long) attr;
 	rec->a3 = sizeof(attr);
 }
+#endif
 
 static void sanitise_bpf(struct syscallrecord *rec)
 {
 	switch (rec->a1) {
+#ifdef USE_BPF
 	case BPF_PROG_LOAD:
 		bpf_prog_load(rec);
 		break;
+#endif
 	default:
 		break;
 	}
 }
 
+#ifdef USE_BPF
 static void post_bpf(struct syscallrecord *rec)
 {
 	union bpf_attr *attr;
@@ -84,10 +93,15 @@ static void post_bpf(struct syscallrecord *rec)
 		break;
 	}
 }
+#else
+static void post_bpf(__unused__ struct syscallrecord *rec) { }
+#endif
 
 static unsigned long bpf_flags[] = {
+#ifdef USE_BPF
 	BPF_MAP_CREATE, BPF_MAP_LOOKUP_ELEM, BPF_MAP_UPDATE_ELEM, BPF_MAP_DELETE_ELEM,
 	BPF_MAP_GET_NEXT_KEY, BPF_PROG_LOAD,
+#endif
 };
 
 struct syscallentry syscall_bpf = {
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH] Fix build on older kernels without BPF.
  2016-07-12 18:43 [PATCH] Fix build on older kernels without BPF Vinson Lee
@ 2016-07-12 19:02 ` Dave Jones
  2016-07-12 21:33   ` [PATCH v2] " Vinson Lee
  0 siblings, 1 reply; 8+ messages in thread
From: Dave Jones @ 2016-07-12 19:02 UTC (permalink / raw)
  To: Vinson Lee; +Cc: trinity

On Tue, Jul 12, 2016 at 06:43:06PM +0000, Vinson Lee wrote:

 > diff --git a/syscalls/bpf.c b/syscalls/bpf.c
 > index b2f57d3..4788082 100644
 > --- a/syscalls/bpf.c
 > +++ b/syscalls/bpf.c
 > @@ -1,13 +1,16 @@
 >  /*
 >   * SYSCALL_DEFINE3(bpf, int, cmd, union bpf_attr __user *, uattr, unsigned int, size)
 >   */
 > +#ifdef USE_BPF
 >  #include <linux/bpf.h>
 > +#endif
 >  #include <linux/filter.h>
 >  #include "arch.h"
 >  #include "net.h"
 >  #include "random.h"
 >  #include "sanitise.h"
 >  
 > +#ifdef USE_BPF
 >  static unsigned long bpf_prog_types[] = {
 >  	BPF_PROG_TYPE_UNSPEC,
 >  	BPF_PROG_TYPE_SOCKET_FILTER,
 > @@ -15,9 +18,11 @@ static unsigned long bpf_prog_types[] = {
 >  	BPF_PROG_TYPE_SCHED_CLS,
 >  	BPF_PROG_TYPE_SCHED_ACT,
 >  };
 > +#endif
 >  
 >  static const char license[] = "GPLv2";
 >  
 > +#ifdef USE_BPF
 >  static void bpf_prog_load(struct syscallrecord *rec)
 >  {
 >  	unsigned long *insns = NULL, len = 0;
 > @@ -49,18 +54,22 @@ static void bpf_prog_load(struct syscallrecord *rec)
 >  	rec->a2 = (unsigned long) attr;
 >  	rec->a3 = sizeof(attr);
 >  }
 > +#endif
 >  
 >  static void sanitise_bpf(struct syscallrecord *rec)
 >  {
 >  	switch (rec->a1) {
 > +#ifdef USE_BPF
 >  	case BPF_PROG_LOAD:
 >  		bpf_prog_load(rec);
 >  		break;
 > +#endif
 >  	default:
 >  		break;
 >  	}
 >  }
 >  
 > +#ifdef USE_BPF
 >  static void post_bpf(struct syscallrecord *rec)
 >  {
 >  	union bpf_attr *attr;
 > @@ -84,10 +93,15 @@ static void post_bpf(struct syscallrecord *rec)
 >  		break;
 >  	}
 >  }
 > +#else
 > +static void post_bpf(__unused__ struct syscallrecord *rec) { }
 > +#endif
 >  
 >  static unsigned long bpf_flags[] = {
 > +#ifdef USE_BPF
 >  	BPF_MAP_CREATE, BPF_MAP_LOOKUP_ELEM, BPF_MAP_UPDATE_ELEM, BPF_MAP_DELETE_ELEM,
 >  	BPF_MAP_GET_NEXT_KEY, BPF_PROG_LOAD,
 > +#endif
 >  };

This might be cleaner to wrap the whole of syscalls/bpf.c in one ifdef, and then
add additional ones to include/syscalls-*.h to look like

#ifdef USE_BPF
	{ .entry = &syscall_bpf },
#else
	{ .entry = NULL },
#endif

I can't remember if the tables code handles a NULL .entry in the middle though.
Might need some tweaking.

	Dave

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v2] Fix build on older kernels without BPF.
  2016-07-12 19:02 ` Dave Jones
@ 2016-07-12 21:33   ` Vinson Lee
  2016-07-21 20:10     ` Dave Jones
  0 siblings, 1 reply; 8+ messages in thread
From: Vinson Lee @ 2016-07-12 21:33 UTC (permalink / raw)
  To: trinity

Suggested-by: Dave Jones <davej@codemonkey.org.uk>
Signed-off-by: Vinson Lee <vlee@freedesktop.org>
---
 configure                  |    1 +
 include/syscalls-aarch64.h |    2 ++
 include/syscalls-arm.h     |    2 ++
 include/syscalls-i386.h    |    2 ++
 include/syscalls-ia64.h    |    2 ++
 include/syscalls-mips.h    |    2 ++
 include/syscalls-parisc.h  |    2 ++
 include/syscalls-s390.h    |    2 ++
 include/syscalls-s390x.h   |    2 ++
 include/syscalls-sparc.h   |    2 ++
 include/syscalls-x86_64.h  |    2 ++
 syscalls/bpf.c             |    2 ++
 12 files changed, 23 insertions(+), 0 deletions(-)

diff --git a/configure b/configure
index 8d95929..fe3985f 100755
--- a/configure
+++ b/configure
@@ -239,6 +239,7 @@ check_header execinfo.h USE_BACKTRACE
 check_header netatalk/at.h USE_APPLETALK
 check_header netrom/netrom.h USE_NETROM
 check_header netrose/rose.h USE_ROSE
+check_header linux/bfp.h USE_BPF
 
 rm -f "$TMP" "$TMP.log" "$TMP.c"
 
diff --git a/include/syscalls-aarch64.h b/include/syscalls-aarch64.h
index 09acf41..ee18c64 100644
--- a/include/syscalls-aarch64.h
+++ b/include/syscalls-aarch64.h
@@ -290,6 +290,8 @@ struct syscalltable syscalls_aarch64[] = {
 /* 277 */	{ .entry = &syscall_seccomp },
 /* 278 */	{ .entry = &syscall_getrandom },
 /* 279 */	{ .entry = &syscall_memfd_create },
+#ifdef USE_BPF
 /* 280 */	{ .entry = &syscall_bpf },
+#endif
 /* 281 */	{ .entry = &syscall_execveat },
 };
diff --git a/include/syscalls-arm.h b/include/syscalls-arm.h
index 7ecc435..2c59316 100644
--- a/include/syscalls-arm.h
+++ b/include/syscalls-arm.h
@@ -396,7 +396,9 @@ struct syscalltable syscalls_arm[] = {
 		{ .entry = &syscall_seccomp },
 		{ .entry = &syscall_getrandom },
 /* 385 */	{ .entry = &syscall_memfd_create },
+#ifdef USE_BPF
 		{ .entry = &syscall_bpf },
+#endif
 		{ .entry = &syscall_execveat },
 		{ .entry = &syscall_userfaultfd },
 		{ .entry = &syscall_membarrier },
diff --git a/include/syscalls-i386.h b/include/syscalls-i386.h
index 147b1eb..078efa3 100644
--- a/include/syscalls-i386.h
+++ b/include/syscalls-i386.h
@@ -364,7 +364,9 @@ struct syscalltable syscalls_i386[] = {
 	{ .entry = &syscall_seccomp },
 	{ .entry = &syscall_getrandom },
 	{ .entry = &syscall_memfd_create },
+#ifdef USE_BPF
 	{ .entry = &syscall_bpf },
+#endif
 	{ .entry = &syscall_execveat },
 	{ .entry = &syscall_socket },
 	{ .entry = &syscall_socketpair },
diff --git a/include/syscalls-ia64.h b/include/syscalls-ia64.h
index 28eacce..172c64f 100644
--- a/include/syscalls-ia64.h
+++ b/include/syscalls-ia64.h
@@ -324,7 +324,9 @@ struct syscalltable syscalls_ia64[] = {
 	{ .entry = &syscall_renameat2 },
 	{ .entry = &syscall_getrandom },
 	{ .entry = &syscall_memfd_create },
+#ifdef USE_BPF
 	{ .entry = &syscall_bpf },
+#endif
 	{ .entry = &syscall_userfaultfd },
 	{ .entry = &syscall_membarrier },
 	{ .entry = &syscall_kcmp },
diff --git a/include/syscalls-mips.h b/include/syscalls-mips.h
index 273ba25..1f1748b 100644
--- a/include/syscalls-mips.h
+++ b/include/syscalls-mips.h
@@ -371,5 +371,7 @@ struct syscalltable syscalls_mips[] = {
 		{ .entry = &syscall_seccomp },
 		{ .entry = &syscall_getrandom },
 		{ .entry = &syscall_memfd_create },
+#ifdef USE_BPF
 		{ .entry = &syscall_bpf },		/* 4355 */
+#endif
 };
diff --git a/include/syscalls-parisc.h b/include/syscalls-parisc.h
index 8d164e5..1b830f8 100644
--- a/include/syscalls-parisc.h
+++ b/include/syscalls-parisc.h
@@ -348,6 +348,8 @@ struct syscalltable syscalls_parisc[] = {
 	{ .entry = &syscall_seccomp },
 	{ .entry = &syscall_getrandom },
 	{ .entry = &syscall_memfd_create },
+#ifdef USE_BPF
 	{ .entry = &syscall_bpf },
+#endif
 	{ .entry = &syscall_execveat },
 };
diff --git a/include/syscalls-s390.h b/include/syscalls-s390.h
index dd9c93a..24d981e 100644
--- a/include/syscalls-s390.h
+++ b/include/syscalls-s390.h
@@ -358,7 +358,9 @@ struct syscalltable syscalls_s390[] = {
 	{ .entry = &syscall_seccomp },
 	{ .entry = &syscall_getrandom },
 	{ .entry = &syscall_memfd_create },
+#ifdef USE_BPF
 	{ .entry = &syscall_bpf },
+#endif
 	{ .entry = &syscall_ni_syscall },	// TODO: syscall_s390_pci_mmio_write
 	{ .entry = &syscall_ni_syscall },	// TODO: syscall_s390_pci_mmio_read
 	{ .entry = &syscall_execveat },
diff --git a/include/syscalls-s390x.h b/include/syscalls-s390x.h
index 6ddeb85..75c10f8 100644
--- a/include/syscalls-s390x.h
+++ b/include/syscalls-s390x.h
@@ -358,7 +358,9 @@ struct syscalltable syscalls_s390x[] = {
 	{ .entry = &syscall_seccomp },
 	{ .entry = &syscall_getrandom },
 	{ .entry = &syscall_memfd_create },
+#ifdef USE_BPF
 	{ .entry = &syscall_bpf },
+#endif
 	{ .entry = &syscall_ni_syscall },	// TODO: syscall_s390_pci_mmio_write
 	{ .entry = &syscall_ni_syscall },	// TODO: syscall_s390_pci_mmio_read
 	{ .entry = &syscall_execveat },
diff --git a/include/syscalls-sparc.h b/include/syscalls-sparc.h
index 5cedd89..77cfe2a 100644
--- a/include/syscalls-sparc.h
+++ b/include/syscalls-sparc.h
@@ -356,6 +356,8 @@ struct syscalltable syscalls_sparc[] = {
 	{ .entry = &syscall_seccomp },
 	{ .entry = &syscall_getrandom },
 	{ .entry = &syscall_memfd_create },
+#ifdef USE_BPF
 	{ .entry = &syscall_bpf },
+#endif
 	{ .entry = &syscall_execveat },
 };
diff --git a/include/syscalls-x86_64.h b/include/syscalls-x86_64.h
index c75f4de..07a67ca 100644
--- a/include/syscalls-x86_64.h
+++ b/include/syscalls-x86_64.h
@@ -328,7 +328,9 @@ struct syscalltable syscalls_x86_64[] = {
 	{ .entry = &syscall_seccomp },
 	{ .entry = &syscall_memfd_create },
 	{ .entry = &syscall_kexec_file_load },
+#ifdef USE_BPF
 	{ .entry = &syscall_bpf },
+#endif
 	{ .entry = &syscall_execveat },
 	{ .entry = &syscall_userfaultfd },
 	{ .entry = &syscall_membarrier },
diff --git a/syscalls/bpf.c b/syscalls/bpf.c
index b2f57d3..476a277 100644
--- a/syscalls/bpf.c
+++ b/syscalls/bpf.c
@@ -1,6 +1,7 @@
 /*
  * SYSCALL_DEFINE3(bpf, int, cmd, union bpf_attr __user *, uattr, unsigned int, size)
  */
+#ifdef USE_BPF
 #include <linux/bpf.h>
 #include <linux/filter.h>
 #include "arch.h"
@@ -102,3 +103,4 @@ struct syscallentry syscall_bpf = {
 	.sanitise = sanitise_bpf,
 	.post = post_bpf,
 };
+#endif
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH v2] Fix build on older kernels without BPF.
  2016-07-12 21:33   ` [PATCH v2] " Vinson Lee
@ 2016-07-21 20:10     ` Dave Jones
  2016-07-26  0:24       ` Vinson Lee
  0 siblings, 1 reply; 8+ messages in thread
From: Dave Jones @ 2016-07-21 20:10 UTC (permalink / raw)
  To: Vinson Lee; +Cc: trinity

On Tue, Jul 12, 2016 at 09:33:56PM +0000, Vinson Lee wrote:
 > Suggested-by: Dave Jones <davej@codemonkey.org.uk>
 > Signed-off-by: Vinson Lee <vlee@freedesktop.org>

Close, but..

 > diff --git a/include/syscalls-aarch64.h b/include/syscalls-aarch64.h
 > index 09acf41..ee18c64 100644
 > --- a/include/syscalls-aarch64.h
 > +++ b/include/syscalls-aarch64.h
 > @@ -290,6 +290,8 @@ struct syscalltable syscalls_aarch64[] = {
 >  /* 277 */	{ .entry = &syscall_seccomp },
 >  /* 278 */	{ .entry = &syscall_getrandom },
 >  /* 279 */	{ .entry = &syscall_memfd_create },
 > +#ifdef USE_BPF
 >  /* 280 */	{ .entry = &syscall_bpf },
 > +#endif
 >  /* 281 */	{ .entry = &syscall_execveat },
 >  };

You need an

#else
	NULL,

for each of these, otherwise the next syscall will be in the wrong slot.

	Dave

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2] Fix build on older kernels without BPF.
  2016-07-21 20:10     ` Dave Jones
@ 2016-07-26  0:24       ` Vinson Lee
  2016-07-26  0:59         ` Dave Jones
  0 siblings, 1 reply; 8+ messages in thread
From: Vinson Lee @ 2016-07-26  0:24 UTC (permalink / raw)
  To: Dave Jones; +Cc: trinity

On Thu, Jul 21, 2016 at 1:10 PM, Dave Jones <davej@codemonkey.org.uk> wrote:
> On Tue, Jul 12, 2016 at 09:33:56PM +0000, Vinson Lee wrote:
>  > Suggested-by: Dave Jones <davej@codemonkey.org.uk>
>  > Signed-off-by: Vinson Lee <vlee@freedesktop.org>
>
> Close, but..
>
>  > diff --git a/include/syscalls-aarch64.h b/include/syscalls-aarch64.h
>  > index 09acf41..ee18c64 100644
>  > --- a/include/syscalls-aarch64.h
>  > +++ b/include/syscalls-aarch64.h
>  > @@ -290,6 +290,8 @@ struct syscalltable syscalls_aarch64[] = {
>  >  /* 277 */   { .entry = &syscall_seccomp },
>  >  /* 278 */   { .entry = &syscall_getrandom },
>  >  /* 279 */   { .entry = &syscall_memfd_create },
>  > +#ifdef USE_BPF
>  >  /* 280 */   { .entry = &syscall_bpf },
>  > +#endif
>  >  /* 281 */   { .entry = &syscall_execveat },
>  >  };
>
> You need an
>
> #else
>         NULL,
>
> for each of these, otherwise the next syscall will be in the wrong slot.
>
>         Dave


I tried making that change but trinity would crash in
copy_syscall_table with memcpy with a NULL from[n].entry.

Program received signal SIGSEGV, Segmentation fault.
0x000000000041300e in copy_syscall_table (from=0x63d840, nr=329) at
/usr/include/bits/string3.h:52
52  return __builtin___memcpy_chk (__dest, __src, __len, __bos0 (__dest));
(gdb) bt
#0  0x000000000041300e in copy_syscall_table (from=0x63d840, nr=329)
at /usr/include/bits/string3.h:52
#1  0x00000000004130f3 in select_syscall_tables () at tables.c:491
#2  0x0000000000413e95 in main (argc=1, argv=0x7fffffffe438) at trinity.c:115

tables.c
   470  static struct syscalltable * copy_syscall_table(struct
syscalltable *from, unsigned int nr)
   471  {
   472          unsigned int n;
   473          struct syscallentry *copy;
   474
   475          copy = alloc_shared(nr * sizeof(struct syscallentry));
   476          if (copy == NULL)
   477                  exit(EXIT_FAILURE);
   478
   479          for (n = 0; n < nr; n++) {
   480                  memcpy(copy + n , from[n].entry, sizeof(struct
syscallentry));
   481                  copy[n].number = n;
   482                  copy[n].active_number = 0;
   483                  from[n].entry = &copy[n];
   484          }
   485          return from;
   486  }

Vinson

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2] Fix build on older kernels without BPF.
  2016-07-26  0:24       ` Vinson Lee
@ 2016-07-26  0:59         ` Dave Jones
  2016-08-04 20:36           ` Dave Jones
  0 siblings, 1 reply; 8+ messages in thread
From: Dave Jones @ 2016-07-26  0:59 UTC (permalink / raw)
  To: Vinson Lee; +Cc: trinity

On Mon, Jul 25, 2016 at 05:24:43PM -0700, Vinson Lee wrote:

 > > for each of these, otherwise the next syscall will be in the wrong slot.
 > 
 > I tried making that change but trinity would crash in
 > copy_syscall_table with memcpy with a NULL from[n].entry.
 > 
 > Program received signal SIGSEGV, Segmentation fault.
 > 0x000000000041300e in copy_syscall_table (from=0x63d840, nr=329) at
 > /usr/include/bits/string3.h:52
 > 52  return __builtin___memcpy_chk (__dest, __src, __len, __bos0 (__dest));
 > (gdb) bt
 > #0  0x000000000041300e in copy_syscall_table (from=0x63d840, nr=329)
 > at /usr/include/bits/string3.h:52
 > #1  0x00000000004130f3 in select_syscall_tables () at tables.c:491
 > #2  0x0000000000413e95 in main (argc=1, argv=0x7fffffffe438) at trinity.c:115
 > 
 > tables.c
 >    470  static struct syscalltable * copy_syscall_table(struct
 > syscalltable *from, unsigned int nr)
 >    471  {
 >    472          unsigned int n;
 >    473          struct syscallentry *copy;
 >    474
 >    475          copy = alloc_shared(nr * sizeof(struct syscallentry));
 >    476          if (copy == NULL)
 >    477                  exit(EXIT_FAILURE);
 >    478
 >    479          for (n = 0; n < nr; n++) {
 >    480                  memcpy(copy + n , from[n].entry, sizeof(struct
 > syscallentry));
 >    481                  copy[n].number = n;
 >    482                  copy[n].active_number = 0;
 >    483                  from[n].entry = &copy[n];
 >    484          }
 >    485          return from;
 >    486  }


stick a 
		if (from[n] == NULL)
			continue

before the memcpy. Does that dtrt ?

We might segv somewhere else after patching this up. It's been so long since
I touched this stuff I don't fully recall how it works.  I'll poke at it
some tomorrow.

	Dave

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2] Fix build on older kernels without BPF.
  2016-07-26  0:59         ` Dave Jones
@ 2016-08-04 20:36           ` Dave Jones
  2016-08-05 18:44             ` Dave Jones
  0 siblings, 1 reply; 8+ messages in thread
From: Dave Jones @ 2016-08-04 20:36 UTC (permalink / raw)
  To: Vinson Lee; +Cc: trinity

On Mon, Jul 25, 2016 at 08:59:29PM -0400, Dave Jones wrote:


 >  > tables.c
 >  >    470  static struct syscalltable * copy_syscall_table(struct
 >  > syscalltable *from, unsigned int nr)
 >  >    471  {
 >  >    472          unsigned int n;
 >  >    473          struct syscallentry *copy;
 >  >    474
 >  >    475          copy = alloc_shared(nr * sizeof(struct syscallentry));
 >  >    476          if (copy == NULL)
 >  >    477                  exit(EXIT_FAILURE);
 >  >    478
 >  >    479          for (n = 0; n < nr; n++) {
 >  >    480                  memcpy(copy + n , from[n].entry, sizeof(struct
 >  > syscallentry));
 >  >    481                  copy[n].number = n;
 >  >    482                  copy[n].active_number = 0;
 >  >    483                  from[n].entry = &copy[n];
 >  >    484          }
 >  >    485          return from;
 >  >    486  }
 > 
 > 
 > stick a 
 > 		if (from[n] == NULL)
 > 			continue
 > 
 > before the memcpy. Does that dtrt ?
 > 
 > We might segv somewhere else after patching this up. It's been so long since
 > I touched this stuff I don't fully recall how it works.  I'll poke at it
 > some tomorrow.
 
Just getting around to this. It's a bit more involved than I hoped.
Spraying a bunch of null checks around like this seems to be the thing to do..

Let me know how this works out for you.

	Dave



diff --git a/configure b/configure
index 8d959298f129..93cf19c5861c 100755
--- a/configure
+++ b/configure
@@ -239,6 +239,7 @@ check_header execinfo.h USE_BACKTRACE
 check_header netatalk/at.h USE_APPLETALK
 check_header netrom/netrom.h USE_NETROM
 check_header netrose/rose.h USE_ROSE
+check_header linux/bfp.h USE_BPFF
 
 rm -f "$TMP" "$TMP.log" "$TMP.c"
 
diff --git a/include/syscalls-aarch64.h b/include/syscalls-aarch64.h
index 09acf418a12e..fda0814128bc 100644
--- a/include/syscalls-aarch64.h
+++ b/include/syscalls-aarch64.h
@@ -290,6 +290,10 @@ struct syscalltable syscalls_aarch64[] = {
 /* 277 */	{ .entry = &syscall_seccomp },
 /* 278 */	{ .entry = &syscall_getrandom },
 /* 279 */	{ .entry = &syscall_memfd_create },
+#ifdef USE_BPF
 /* 280 */	{ .entry = &syscall_bpf },
+#else
+		{ .entry = NULL },
+#endif
 /* 281 */	{ .entry = &syscall_execveat },
 };
diff --git a/include/syscalls-arm.h b/include/syscalls-arm.h
index 7ecc4353a835..0f40e57e5501 100644
--- a/include/syscalls-arm.h
+++ b/include/syscalls-arm.h
@@ -396,7 +396,11 @@ struct syscalltable syscalls_arm[] = {
 		{ .entry = &syscall_seccomp },
 		{ .entry = &syscall_getrandom },
 /* 385 */	{ .entry = &syscall_memfd_create },
+#ifdef USE_BPF
 		{ .entry = &syscall_bpf },
+#else
+		{ .entry = NULL },
+#endif
 		{ .entry = &syscall_execveat },
 		{ .entry = &syscall_userfaultfd },
 		{ .entry = &syscall_membarrier },
diff --git a/include/syscalls-i386.h b/include/syscalls-i386.h
index 147b1eb12607..316836406674 100644
--- a/include/syscalls-i386.h
+++ b/include/syscalls-i386.h
@@ -364,7 +364,11 @@ struct syscalltable syscalls_i386[] = {
 	{ .entry = &syscall_seccomp },
 	{ .entry = &syscall_getrandom },
 	{ .entry = &syscall_memfd_create },
+#ifdef USE_BPF
 	{ .entry = &syscall_bpf },
+#else
+	{ .entry = NULL },
+#endif
 	{ .entry = &syscall_execveat },
 	{ .entry = &syscall_socket },
 	{ .entry = &syscall_socketpair },
diff --git a/include/syscalls-ia64.h b/include/syscalls-ia64.h
index 28eacce0ac3d..5efcb7d42f88 100644
--- a/include/syscalls-ia64.h
+++ b/include/syscalls-ia64.h
@@ -324,7 +324,11 @@ struct syscalltable syscalls_ia64[] = {
 	{ .entry = &syscall_renameat2 },
 	{ .entry = &syscall_getrandom },
 	{ .entry = &syscall_memfd_create },
+#ifdef USE_BPF
 	{ .entry = &syscall_bpf },
+#else
+	{ .entry = NULL },
+#endif
 	{ .entry = &syscall_userfaultfd },
 	{ .entry = &syscall_membarrier },
 	{ .entry = &syscall_kcmp },
diff --git a/include/syscalls-mips.h b/include/syscalls-mips.h
index 273ba257db1c..26130f323f4a 100644
--- a/include/syscalls-mips.h
+++ b/include/syscalls-mips.h
@@ -371,5 +371,9 @@ struct syscalltable syscalls_mips[] = {
 		{ .entry = &syscall_seccomp },
 		{ .entry = &syscall_getrandom },
 		{ .entry = &syscall_memfd_create },
+#ifdef USE_BPF
 		{ .entry = &syscall_bpf },		/* 4355 */
+#else
+		{ .entry = NULL },
+#endif
 };
diff --git a/include/syscalls-parisc.h b/include/syscalls-parisc.h
index 8d164e501b12..2ac2d5f9513e 100644
--- a/include/syscalls-parisc.h
+++ b/include/syscalls-parisc.h
@@ -348,6 +348,10 @@ struct syscalltable syscalls_parisc[] = {
 	{ .entry = &syscall_seccomp },
 	{ .entry = &syscall_getrandom },
 	{ .entry = &syscall_memfd_create },
+#ifdef USE_BPF
 	{ .entry = &syscall_bpf },
+#else
+	{ .entry = NULL },
+#endif
 	{ .entry = &syscall_execveat },
 };
diff --git a/include/syscalls-s390.h b/include/syscalls-s390.h
index dd9c93aeae04..9916e6c6e772 100644
--- a/include/syscalls-s390.h
+++ b/include/syscalls-s390.h
@@ -358,7 +358,11 @@ struct syscalltable syscalls_s390[] = {
 	{ .entry = &syscall_seccomp },
 	{ .entry = &syscall_getrandom },
 	{ .entry = &syscall_memfd_create },
+#ifdef USE_BPF
 	{ .entry = &syscall_bpf },
+#else
+	{ .entry = NULL },
+#endif
 	{ .entry = &syscall_ni_syscall },	// TODO: syscall_s390_pci_mmio_write
 	{ .entry = &syscall_ni_syscall },	// TODO: syscall_s390_pci_mmio_read
 	{ .entry = &syscall_execveat },
diff --git a/include/syscalls-s390x.h b/include/syscalls-s390x.h
index 6ddeb85ea39d..6dbaffb37397 100644
--- a/include/syscalls-s390x.h
+++ b/include/syscalls-s390x.h
@@ -358,7 +358,11 @@ struct syscalltable syscalls_s390x[] = {
 	{ .entry = &syscall_seccomp },
 	{ .entry = &syscall_getrandom },
 	{ .entry = &syscall_memfd_create },
+#ifdef USE_BPF
 	{ .entry = &syscall_bpf },
+#else
+	{ .entry = NULL },
+#endif
 	{ .entry = &syscall_ni_syscall },	// TODO: syscall_s390_pci_mmio_write
 	{ .entry = &syscall_ni_syscall },	// TODO: syscall_s390_pci_mmio_read
 	{ .entry = &syscall_execveat },
diff --git a/include/syscalls-sparc.h b/include/syscalls-sparc.h
index 5cedd89b4fee..dbdd4e8d4620 100644
--- a/include/syscalls-sparc.h
+++ b/include/syscalls-sparc.h
@@ -356,6 +356,10 @@ struct syscalltable syscalls_sparc[] = {
 	{ .entry = &syscall_seccomp },
 	{ .entry = &syscall_getrandom },
 	{ .entry = &syscall_memfd_create },
+#ifdef USE_BPF
 	{ .entry = &syscall_bpf },
+#else
+	{ .entry = NULL },
+#endif
 	{ .entry = &syscall_execveat },
 };
diff --git a/include/syscalls-x86_64.h b/include/syscalls-x86_64.h
index c75f4dee142f..cc67889e7e23 100644
--- a/include/syscalls-x86_64.h
+++ b/include/syscalls-x86_64.h
@@ -328,7 +328,11 @@ struct syscalltable syscalls_x86_64[] = {
 	{ .entry = &syscall_seccomp },
 	{ .entry = &syscall_memfd_create },
 	{ .entry = &syscall_kexec_file_load },
+#ifdef USE_BPF
 	{ .entry = &syscall_bpf },
+#else
+	{ .entry = NULL },
+#endif
 	{ .entry = &syscall_execveat },
 	{ .entry = &syscall_userfaultfd },
 	{ .entry = &syscall_membarrier },
diff --git a/syscalls/bpf.c b/syscalls/bpf.c
index b2f57d36feff..476a2778d8a0 100644
--- a/syscalls/bpf.c
+++ b/syscalls/bpf.c
@@ -1,6 +1,7 @@
 /*
  * SYSCALL_DEFINE3(bpf, int, cmd, union bpf_attr __user *, uattr, unsigned int, size)
  */
+#ifdef USE_BPF
 #include <linux/bpf.h>
 #include <linux/filter.h>
 #include "arch.h"
@@ -102,3 +103,4 @@ struct syscallentry syscall_bpf = {
 	.sanitise = sanitise_bpf,
 	.post = post_bpf,
 };
+#endif
diff --git a/tables-biarch.c b/tables-biarch.c
index 635aac966880..53e9b8330615 100644
--- a/tables-biarch.c
+++ b/tables-biarch.c
@@ -216,8 +216,12 @@ int setup_syscall_group_biarch(unsigned int group)
 	unsigned int i;
 
 	for_each_32bit_syscall(i) {
-		if (syscalls_32bit[i].entry->group == group)
-			toggle_syscall(syscalls_32bit[i].entry->name, TRUE);
+		struct syscallentry *entry = syscalls_32bit[i].entry;
+		if (entry == NULL)
+			continue;
+
+		if (entry->group == group)
+			toggle_syscall(entry->name, TRUE);
 	}
 
 	if (shm->nr_active_32bit_syscalls == 0)
@@ -227,8 +231,12 @@ int setup_syscall_group_biarch(unsigned int group)
 
 	/* now the 64 bit table*/
 	for_each_64bit_syscall(i) {
-		if (syscalls_64bit[i].entry->group == group)
-			toggle_syscall(syscalls_64bit[i].entry->name, TRUE);
+		struct syscallentry *entry = syscalls_64bit[i].entry;
+		if (entry == NULL)
+		continue;
+
+		if (entry->group == group)
+			toggle_syscall(entry->name, TRUE);
 	}
 
 	if (shm->nr_active_64bit_syscalls == 0) {
@@ -247,14 +255,20 @@ void mark_all_syscalls_active_biarch(void)
 
 	if (do_32_arch) {
 		for_each_32bit_syscall(i) {
-			syscalls_32bit[i].entry->flags |= ACTIVE;
+			struct syscallentry *entry = syscalls_32bit[i].entry;
+			if (entry == NULL)
+				continue;
+			entry->flags |= ACTIVE;
 			activate_syscall32(i);
 		}
 	}
 
 	if (do_64_arch) {
 		for_each_64bit_syscall(i) {
-			syscalls_64bit[i].entry->flags |= ACTIVE;
+			struct syscallentry *entry = syscalls_64bit[i].entry;
+			if (entry == NULL)
+				continue;
+			entry->flags |= ACTIVE;
 			activate_syscall64(i);
 		}
 	}
@@ -267,6 +281,9 @@ void init_syscalls_biarch(void)
 
 	for_each_64bit_syscall(i) {
 		entry = syscalls_64bit[i].entry;
+		if (entry == NULL)
+			continue;
+
 		if (entry->flags & ACTIVE)
 			if (entry->init)
 				entry->init();
@@ -274,6 +291,9 @@ void init_syscalls_biarch(void)
 
 	for_each_32bit_syscall(i) {
 		entry = syscalls_32bit[i].entry;
+		if (entry == NULL)
+			continue;
+
 		if (entry->flags & ACTIVE)
 			if (entry->init)
 				entry->init();
@@ -287,6 +307,9 @@ void deactivate_disabled_syscalls_biarch(void)
 
 	for_each_64bit_syscall(i) {
 		entry = syscalls_64bit[i].entry;
+		if (entry == NULL)
+			continue;
+
 		if (entry->flags & TO_BE_DEACTIVATED) {
 			entry->flags &= ~(ACTIVE|TO_BE_DEACTIVATED);
 			deactivate_syscall64(i);
@@ -297,6 +320,9 @@ void deactivate_disabled_syscalls_biarch(void)
 
 	for_each_32bit_syscall(i) {
 		entry = syscalls_32bit[i].entry;
+		if (entry == NULL)
+			continue;
+
 		if (entry->flags & TO_BE_DEACTIVATED) {
 			entry->flags &= ~(ACTIVE|TO_BE_DEACTIVATED);
 			deactivate_syscall32(i);
@@ -316,6 +342,9 @@ void dump_syscall_tables_biarch(void)
 
 	for_each_32bit_syscall(i) {
 		entry = syscalls_32bit[i].entry;
+		if (entry == NULL)
+			continue;
+
 		outputstd("entrypoint %d %s : [32-bit] ",
 			entry->number, entry->name);
 		show_state(entry->flags & ACTIVE);
@@ -328,6 +357,8 @@ void dump_syscall_tables_biarch(void)
 
 	for_each_64bit_syscall(i) {
 		entry = syscalls_64bit[i].entry;
+		if (entry == NULL)
+			continue;
 
 		outputstd("entrypoint %d %s : [64-bit] ",
 			entry->number, entry->name);
@@ -347,12 +378,18 @@ void display_enabled_syscalls_biarch(void)
 
 	for_each_64bit_syscall(i) {
 		entry = syscalls_64bit[i].entry;
+		if (entry == NULL)
+			continue;
+
 		if (entry->flags & ACTIVE)
 			output(0, "64-bit syscall %d:%s enabled.\n", i, entry->name);
 	}
 
 	for_each_32bit_syscall(i) {
 		entry = syscalls_32bit[i].entry;
+		if (entry == NULL)
+			continue;
+
 		if (entry->flags & ACTIVE)
 			output(0, "32-bit syscall %d:%s enabled.\n", i, entry->name);
 	}
diff --git a/tables-uniarch.c b/tables-uniarch.c
index 8f6bcd6553e1..5ba385e6fb74 100644
--- a/tables-uniarch.c
+++ b/tables-uniarch.c
@@ -100,7 +100,11 @@ void mark_all_syscalls_active_uniarch(void)
 	unsigned int i;
 
 	for_each_syscall(i) {
-		syscalls[i].entry->flags |= ACTIVE;
+		struct syscallentry *entry = syscalls[i].entry;
+		if (entry == NULL)
+			continue;
+
+		entry->flags |= ACTIVE;
 		activate_syscall(i);
 	}
 }
@@ -110,9 +114,10 @@ void init_syscalls_uniarch(void)
 	unsigned int i;
 
 	for_each_syscall(i) {
-		struct syscallentry *entry;
+		struct syscallentry *entry = syscalls[i].entry;
+		if (entry == NULL)
+			continue;
 
-		entry = syscalls[i].entry;
 		if (entry->flags & ACTIVE)
 			if (entry->init)
 				entry->init();
@@ -124,9 +129,11 @@ void deactivate_disabled_syscalls_uniarch(void)
 	unsigned int i;
 
 	for_each_syscall(i) {
-		struct syscallentry *entry;
+		struct syscallentry *entry = syscalls[i].entry;
+
+		if (entry == NULL)
+			continue;
 
-		entry = syscalls[i].entry;
 		if (entry->flags & TO_BE_DEACTIVATED) {
 			entry->flags &= ~(ACTIVE|TO_BE_DEACTIVATED);
 			deactivate_syscall_uniarch(i);
@@ -143,9 +150,11 @@ void dump_syscall_tables_uniarch(void)
 	outputstd("syscalls: %d\n", max_nr_syscalls);
 
 	for_each_syscall(i) {
-		struct syscallentry *entry;
+		struct syscallentry *entry = syscalls[i].entry;
+
+		if (entry == NULL)
+			continue;
 
-		entry = syscalls[i].entry;
 		outputstd("entrypoint %d %s : ", entry->number, entry->name);
 		show_state(entry->flags & ACTIVE);
 		if (entry->flags & AVOID_SYSCALL)
@@ -159,9 +168,10 @@ void display_enabled_syscalls_uniarch(void)
         unsigned int i;
 
 	for_each_syscall(i) {
-		struct syscallentry *entry;
+		struct syscallentry *entry = syscalls[i].entry;
 
-		entry = syscalls[i].entry;
+		if (entry == NULL)
+			continue;
 
 		if (entry->flags & ACTIVE)
 			output(0, "syscall %d:%s enabled.\n", i, entry->name);
diff --git a/tables.c b/tables.c
index 7d5d35b7d2fa..8d3f4d7d8a6e 100644
--- a/tables.c
+++ b/tables.c
@@ -211,6 +211,8 @@ static void check_syscall(struct syscallentry *entry)
 {
 	/* check that we have a name set. */
 #define CHECK(NUMARGS, ARGNUM, ARGTYPE, ARGNAME)		\
+	if (entry == NULL)					\
+		return;						\
 	if (entry->num_args > 0) {				\
 		if (entry->num_args > NUMARGS) {		\
 			if (entry->ARGNAME == NULL)  {		\
@@ -231,6 +233,8 @@ static void check_syscall(struct syscallentry *entry)
 	/* note: not enabled by default, because we haven't annotated everything yet. */
 #undef CHECK
 #define CHECK(NUMARGS, ARGNUM, ARGTYPE, ARGNAME)		\
+	if (entry == NULL)					\
+		return;						\
 	if (entry->num_args > 0) {				\
 		if (entry->num_args > NUMARGS) {		\
 			if (entry->ARGTYPE == ARG_UNDEFINED) {	\
@@ -379,6 +383,9 @@ static void show_unannotated_biarch(void)
 
 	for_each_32bit_syscall(i) {
 		entry = syscalls_32bit[i].entry;
+		if (entry == NULL)
+			continue;
+
 		count = 0;
 
 		for (j = 1; j <= entry->num_args; j++) {
@@ -415,6 +422,9 @@ static void show_unannotated_biarch(void)
 
 	for_each_64bit_syscall(i) {
 		entry = syscalls_64bit[i].entry;
+		if (entry == NULL)
+			continue;
+
 		count = 0;
 
 		for (j = 1; j <= entry->num_args; j++) {
@@ -469,18 +479,24 @@ void show_unannotated_args(void)
  */
 static struct syscalltable * copy_syscall_table(struct syscalltable *from, unsigned int nr)
 {
-	unsigned int n;
+	unsigned int n, m;
 	struct syscallentry *copy;
 
 	copy = alloc_shared(nr * sizeof(struct syscallentry));
 	if (copy == NULL)
 		exit(EXIT_FAILURE);
 
-	for (n = 0; n < nr; n++) {
-		memcpy(copy + n , from[n].entry, sizeof(struct syscallentry));
-		copy[n].number = n;
-		copy[n].active_number = 0;
-		from[n].entry = &copy[n];
+	for (n = 0, m = 0; n < nr; n++) {
+		struct syscallentry *entry = from[n].entry;
+
+		if (entry == NULL)
+			continue;
+
+		memcpy(copy + m , from[n].entry, sizeof(struct syscallentry));
+		copy[m].number = n;
+		copy[m].active_number = 0;
+		from[n].entry = &copy[m];
+		m++;
 	}
 	return from;
 }

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH v2] Fix build on older kernels without BPF.
  2016-08-04 20:36           ` Dave Jones
@ 2016-08-05 18:44             ` Dave Jones
  0 siblings, 0 replies; 8+ messages in thread
From: Dave Jones @ 2016-08-05 18:44 UTC (permalink / raw)
  To: Vinson Lee; +Cc: trinity

On Thu, Aug 04, 2016 at 04:36:06PM -0400, Dave Jones wrote:

 >  > We might segv somewhere else after patching this up. It's been so long since
 >  > I touched this stuff I don't fully recall how it works.  I'll poke at it
 >  > some tomorrow.
 >  
 > Just getting around to this. It's a bit more involved than I hoped.
 > Spraying a bunch of null checks around like this seems to be the thing to do..

Now committed and pushed out, with an additional typo fix.

	Dave

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2016-08-05 18:44 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-07-12 18:43 [PATCH] Fix build on older kernels without BPF Vinson Lee
2016-07-12 19:02 ` Dave Jones
2016-07-12 21:33   ` [PATCH v2] " Vinson Lee
2016-07-21 20:10     ` Dave Jones
2016-07-26  0:24       ` Vinson Lee
2016-07-26  0:59         ` Dave Jones
2016-08-04 20:36           ` Dave Jones
2016-08-05 18:44             ` Dave Jones

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).