Date: Wed, 18 Nov 2009 19:26:17 +0000 (UTC) From: Jung-uk Kim <jkim@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r199492 - in head/sys: amd64/amd64 i386/i386 net Message-ID: <200911181926.nAIJQHOR081471@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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@FreeBSD.org> + * Copyright (C) 2005-2009 Jung-uk Kim <jkim@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@FreeBSD.org> + * Copyright (C) 2005-2009 Jung-uk Kim <jkim@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@FreeBSD.org> + * Copyright (C) 2005-2009 Jung-uk Kim <jkim@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@FreeBSD.org> + * Copyright (C) 2005-2009 Jung-uk Kim <jkim@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@FreeBSD.org> + * Copyright (C) 2005-2009 Jung-uk Kim <jkim@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@FreeBSD.org> + * Copyright (C) 2005-2009 Jung-uk Kim <jkim@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;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200911181926.nAIJQHOR081471>