svn commit: r199492 - in head/sys: amd64/amd64 i386/i386 net
Jung-uk Kim
jkim at FreeBSD.org
Wed Nov 18 19:26:17 UTC 2009
Author: jkim
Date: Wed Nov 18 19:26:17 2009
New Revision: 199492
URL: http://svn.freebsd.org/changeset/base/199492
Log:
- Make BPF JIT compiler working again in userland. We are limiting size of
generated native binary to page size for now.
- Update copyright date and fix some style nits.
Modified:
head/sys/amd64/amd64/bpf_jit_machdep.c
head/sys/amd64/amd64/bpf_jit_machdep.h
head/sys/i386/i386/bpf_jit_machdep.c
head/sys/i386/i386/bpf_jit_machdep.h
head/sys/net/bpf_jitter.c
head/sys/net/bpf_jitter.h
Modified: head/sys/amd64/amd64/bpf_jit_machdep.c
==============================================================================
--- head/sys/amd64/amd64/bpf_jit_machdep.c Wed Nov 18 18:48:18 2009 (r199491)
+++ head/sys/amd64/amd64/bpf_jit_machdep.c Wed Nov 18 19:26:17 2009 (r199492)
@@ -1,6 +1,6 @@
/*-
* Copyright (C) 2002-2003 NetGroup, Politecnico di Torino (Italy)
- * Copyright (C) 2005-2008 Jung-uk Kim <jkim at FreeBSD.org>
+ * Copyright (C) 2005-2009 Jung-uk Kim <jkim at FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -42,6 +42,8 @@ __FBSDID("$FreeBSD$");
#include <net/if.h>
#else
#include <stdlib.h>
+#include <sys/mman.h>
+#include <sys/param.h>
#endif
#include <sys/types.h>
@@ -97,9 +99,9 @@ emit_code(bpf_bin_stream *stream, u_int
bpf_filter_func
bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem)
{
+ bpf_bin_stream stream;
struct bpf_insn *ins;
u_int i, pass;
- bpf_bin_stream stream;
/*
* NOTE: do not modify the name of this variable, as it's used by
@@ -475,20 +477,31 @@ bpf_jit_compile(struct bpf_insn *prog, u
}
pass++;
- if (pass == 2)
+ if (pass >= 2) {
+#ifndef _KERNEL
+ if (mprotect(stream.ibuf, stream.cur_ip,
+ PROT_READ | PROT_EXEC) != 0) {
+ munmap(stream.ibuf, BPF_JIT_MAXSIZE);
+ stream.ibuf = NULL;
+ }
+#endif
break;
+ }
#ifdef _KERNEL
stream.ibuf = (char *)malloc(stream.cur_ip, M_BPFJIT, M_NOWAIT);
- if (stream.ibuf == NULL) {
- free(stream.refs, M_BPFJIT);
- return (NULL);
- }
+ if (stream.ibuf == NULL)
+ break;
#else
- stream.ibuf = (char *)malloc(stream.cur_ip);
- if (stream.ibuf == NULL) {
- free(stream.refs);
- return (NULL);
+ if (stream.cur_ip > BPF_JIT_MAXSIZE) {
+ stream.ibuf = NULL;
+ break;
+ }
+ stream.ibuf = (char *)mmap(NULL, BPF_JIT_MAXSIZE,
+ PROT_READ | PROT_WRITE, MAP_ANON, -1, 0);
+ if (stream.ibuf == MAP_FAILED) {
+ stream.ibuf = NULL;
+ break;
}
#endif
Modified: head/sys/amd64/amd64/bpf_jit_machdep.h
==============================================================================
--- head/sys/amd64/amd64/bpf_jit_machdep.h Wed Nov 18 18:48:18 2009 (r199491)
+++ head/sys/amd64/amd64/bpf_jit_machdep.h Wed Nov 18 19:26:17 2009 (r199492)
@@ -1,6 +1,6 @@
/*-
* Copyright (C) 2002-2003 NetGroup, Politecnico di Torino (Italy)
- * Copyright (C) 2005-2008 Jung-uk Kim <jkim at FreeBSD.org>
+ * Copyright (C) 2005-2009 Jung-uk Kim <jkim at FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
Modified: head/sys/i386/i386/bpf_jit_machdep.c
==============================================================================
--- head/sys/i386/i386/bpf_jit_machdep.c Wed Nov 18 18:48:18 2009 (r199491)
+++ head/sys/i386/i386/bpf_jit_machdep.c Wed Nov 18 19:26:17 2009 (r199492)
@@ -1,6 +1,6 @@
/*-
* Copyright (C) 2002-2003 NetGroup, Politecnico di Torino (Italy)
- * Copyright (C) 2005-2008 Jung-uk Kim <jkim at FreeBSD.org>
+ * Copyright (C) 2005-2009 Jung-uk Kim <jkim at FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -42,6 +42,8 @@ __FBSDID("$FreeBSD$");
#include <net/if.h>
#else
#include <stdlib.h>
+#include <sys/mman.h>
+#include <sys/param.h>
#endif
#include <sys/types.h>
@@ -97,9 +99,9 @@ emit_code(bpf_bin_stream *stream, u_int
bpf_filter_func
bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem)
{
+ bpf_bin_stream stream;
struct bpf_insn *ins;
u_int i, pass;
- bpf_bin_stream stream;
/*
* NOTE: do not modify the name of this variable, as it's used by
@@ -498,20 +500,31 @@ bpf_jit_compile(struct bpf_insn *prog, u
}
pass++;
- if (pass == 2)
+ if (pass >= 2) {
+#ifndef _KERNEL
+ if (mprotect(stream.ibuf, stream.cur_ip,
+ PROT_READ | PROT_EXEC) != 0) {
+ munmap(stream.ibuf, BPF_JIT_MAXSIZE);
+ stream.ibuf = NULL;
+ }
+#endif
break;
+ }
#ifdef _KERNEL
stream.ibuf = (char *)malloc(stream.cur_ip, M_BPFJIT, M_NOWAIT);
- if (stream.ibuf == NULL) {
- free(stream.refs, M_BPFJIT);
- return (NULL);
- }
+ if (stream.ibuf == NULL)
+ break;
#else
- stream.ibuf = (char *)malloc(stream.cur_ip);
- if (stream.ibuf == NULL) {
- free(stream.refs);
- return (NULL);
+ if (stream.cur_ip > BPF_JIT_MAXSIZE) {
+ stream.ibuf = NULL;
+ break;
+ }
+ stream.ibuf = (char *)mmap(NULL, BPF_JIT_MAXSIZE,
+ PROT_READ | PROT_WRITE, MAP_ANON, -1, 0);
+ if (stream.ibuf == MAP_FAILED) {
+ stream.ibuf = NULL;
+ break;
}
#endif
Modified: head/sys/i386/i386/bpf_jit_machdep.h
==============================================================================
--- head/sys/i386/i386/bpf_jit_machdep.h Wed Nov 18 18:48:18 2009 (r199491)
+++ head/sys/i386/i386/bpf_jit_machdep.h Wed Nov 18 19:26:17 2009 (r199492)
@@ -1,6 +1,6 @@
/*-
* Copyright (C) 2002-2003 NetGroup, Politecnico di Torino (Italy)
- * Copyright (C) 2005-2008 Jung-uk Kim <jkim at FreeBSD.org>
+ * Copyright (C) 2005-2009 Jung-uk Kim <jkim at FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
Modified: head/sys/net/bpf_jitter.c
==============================================================================
--- head/sys/net/bpf_jitter.c Wed Nov 18 18:48:18 2009 (r199491)
+++ head/sys/net/bpf_jitter.c Wed Nov 18 19:26:17 2009 (r199492)
@@ -1,6 +1,6 @@
/*-
* Copyright (C) 2002-2003 NetGroup, Politecnico di Torino (Italy)
- * Copyright (C) 2005-2008 Jung-uk Kim <jkim at FreeBSD.org>
+ * Copyright (C) 2005-2009 Jung-uk Kim <jkim at FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -43,6 +43,8 @@ __FBSDID("$FreeBSD$");
#else
#include <stdlib.h>
#include <string.h>
+#include <sys/mman.h>
+#include <sys/param.h>
#include <sys/types.h>
#endif
@@ -127,7 +129,7 @@ bpf_destroy_jit_filter(bpf_jit_filter *f
{
if (filter->func != bpf_jit_accept_all)
- free(filter->func);
+ munmap(filter->func, BPF_JIT_MAXSIZE);
free(filter);
}
#endif
Modified: head/sys/net/bpf_jitter.h
==============================================================================
--- head/sys/net/bpf_jitter.h Wed Nov 18 18:48:18 2009 (r199491)
+++ head/sys/net/bpf_jitter.h Wed Nov 18 19:26:17 2009 (r199492)
@@ -1,6 +1,6 @@
/*-
* Copyright (C) 2002-2003 NetGroup, Politecnico di Torino (Italy)
- * Copyright (C) 2005-2008 Jung-uk Kim <jkim at FreeBSD.org>
+ * Copyright (C) 2005-2009 Jung-uk Kim <jkim at FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -36,6 +36,8 @@
#ifdef _KERNEL
MALLOC_DECLARE(M_BPFJIT);
+#else
+#define BPF_JIT_MAXSIZE PAGE_SIZE
#endif
extern int bpf_jitter_enable;
More information about the svn-src-all
mailing list