CVS commit: src/tests/net/bpfjit
Module Name:src Committed By: pgoyette Date: Mon Aug 8 15:01:59 UTC 2016 Modified Files: src/tests/net/bpfjit: Makefile Log Message: This now needs librumpdev and librumpvfs to work. To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/tests/net/bpfjit/Makefile Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Modified files: Index: src/tests/net/bpfjit/Makefile diff -u src/tests/net/bpfjit/Makefile:1.5 src/tests/net/bpfjit/Makefile:1.6 --- src/tests/net/bpfjit/Makefile:1.5 Tue May 24 10:16:34 2016 +++ src/tests/net/bpfjit/Makefile Mon Aug 8 15:01:59 2016 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.5 2016/05/24 10:16:34 hannken Exp $ +# $NetBSD: Makefile,v 1.6 2016/08/08 15:01:59 pgoyette Exp $ # .include @@ -14,6 +14,6 @@ PAXCTL_FLAGS= +m LDADD+= -lrumpnet_bpfjit -lrumpkern_sljit LDADD+= -lrumpdev_bpf -lrumpnet_net -lrumpnet -LDADD+= -lrump -lrumpuser -lpthread +LDADD+= -lrump -lrumpuser -lpthread -lrumpdev -lrumpvfs .include
CVS commit: src/tests/net/bpfjit
Module Name:src Committed By: alnsn Date: Sat Feb 14 22:34:33 UTC 2015 Modified Files: src/tests/net/bpfjit: t_bpfjit.c Log Message: Add two more bpfjit_jmp_jeq_x_noinit_XX tests. To generate a diff of this commit: cvs rdiff -u -r1.10 -r1.11 src/tests/net/bpfjit/t_bpfjit.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Modified files: Index: src/tests/net/bpfjit/t_bpfjit.c diff -u src/tests/net/bpfjit/t_bpfjit.c:1.10 src/tests/net/bpfjit/t_bpfjit.c:1.11 --- src/tests/net/bpfjit/t_bpfjit.c:1.10 Sat Feb 14 20:25:08 2015 +++ src/tests/net/bpfjit/t_bpfjit.c Sat Feb 14 22:34:33 2015 @@ -1,7 +1,7 @@ -/* $NetBSD: t_bpfjit.c,v 1.10 2015/02/14 20:25:08 alnsn Exp $ */ +/* $NetBSD: t_bpfjit.c,v 1.11 2015/02/14 22:34:33 alnsn Exp $ */ /*- - * Copyright (c) 2011-2012, 2014 Alexander Nasonov. + * Copyright (c) 2011-2012, 2014-2015 Alexander Nasonov. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -27,7 +27,7 @@ */ #include -__RCSID("$NetBSD: t_bpfjit.c,v 1.10 2015/02/14 20:25:08 alnsn Exp $"); +__RCSID("$NetBSD: t_bpfjit.c,v 1.11 2015/02/14 22:34:33 alnsn Exp $"); #include #include @@ -2298,6 +2298,80 @@ ATF_TC_BODY(bpfjit_jmp_jeq_x_noinit_ax, rump_unschedule(); } +ATF_TC(bpfjit_jmp_jeq_x_noinit_a); +ATF_TC_HEAD(bpfjit_jmp_jeq_x_noinit_a, tc) +{ + atf_tc_set_md_var(tc, "descr", "Test JIT compilation " + "of BPF_JMP+BPF_EQ+BPF_X with uninitialised A"); +} + +ATF_TC_BODY(bpfjit_jmp_jeq_x_noinit_a, tc) +{ + static struct bpf_insn insns[] = { + BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0), /* X > 0 */ + BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 1), + BPF_STMT(BPF_RET+BPF_K, 10), + BPF_STMT(BPF_RET+BPF_K, 11) + }; + + bpfjit_func_t code; + uint8_t pkt[8]; /* the program doesn't read any data */ + + size_t insn_count = sizeof(insns) / sizeof(insns[0]); + + RZ(rump_init()); + + ATF_CHECK(prog_validate(insns, insn_count)); + + rump_schedule(); + code = rumpns_bpfjit_generate_code(NULL, insns, insn_count); + rump_unschedule(); + ATF_REQUIRE(code != NULL); + + ATF_CHECK(jitcall(code, pkt, 1, 1) == 11); + + rump_schedule(); + rumpns_bpfjit_free_code(code); + rump_unschedule(); +} + +ATF_TC(bpfjit_jmp_jeq_x_noinit_x); +ATF_TC_HEAD(bpfjit_jmp_jeq_x_noinit_x, tc) +{ + atf_tc_set_md_var(tc, "descr", "Test JIT compilation " + "of BPF_JMP+BPF_EQ+BPF_X with uninitialised X"); +} + +ATF_TC_BODY(bpfjit_jmp_jeq_x_noinit_x, tc) +{ + static struct bpf_insn insns[] = { + BPF_STMT(BPF_LD+BPF_LEN, 0), /* A > 0 */ + BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 1), + BPF_STMT(BPF_RET+BPF_K, 10), + BPF_STMT(BPF_RET+BPF_K, 11) + }; + + bpfjit_func_t code; + uint8_t pkt[8]; /* the program doesn't read any data */ + + size_t insn_count = sizeof(insns) / sizeof(insns[0]); + + RZ(rump_init()); + + ATF_CHECK(prog_validate(insns, insn_count)); + + rump_schedule(); + code = rumpns_bpfjit_generate_code(NULL, insns, insn_count); + rump_unschedule(); + ATF_REQUIRE(code != NULL); + + ATF_CHECK(jitcall(code, pkt, 1, 1) == 11); + + rump_schedule(); + rumpns_bpfjit_free_code(code); + rump_unschedule(); +} + ATF_TC(bpfjit_jmp_modulo_x); ATF_TC_HEAD(bpfjit_jmp_modulo_x, tc) { @@ -4568,6 +4642,8 @@ ATF_TP_ADD_TCS(tp) ATF_TP_ADD_TC(tp, bpfjit_jmp_jeq_x); ATF_TP_ADD_TC(tp, bpfjit_jmp_jset_x); ATF_TP_ADD_TC(tp, bpfjit_jmp_jeq_x_noinit_ax); + ATF_TP_ADD_TC(tp, bpfjit_jmp_jeq_x_noinit_a); + ATF_TP_ADD_TC(tp, bpfjit_jmp_jeq_x_noinit_x); ATF_TP_ADD_TC(tp, bpfjit_jmp_modulo_x); ATF_TP_ADD_TC(tp, bpfjit_ld_abs); ATF_TP_ADD_TC(tp, bpfjit_ld_abs_k_overflow);
CVS commit: src/tests/net/bpfjit
Module Name:src Committed By: alnsn Date: Sat Feb 14 20:25:08 UTC 2015 Modified Files: src/tests/net/bpfjit: t_bpfjit.c Log Message: Improve bpfjit_jmp_jeq_x test. To generate a diff of this commit: cvs rdiff -u -r1.9 -r1.10 src/tests/net/bpfjit/t_bpfjit.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Modified files: Index: src/tests/net/bpfjit/t_bpfjit.c diff -u src/tests/net/bpfjit/t_bpfjit.c:1.9 src/tests/net/bpfjit/t_bpfjit.c:1.10 --- src/tests/net/bpfjit/t_bpfjit.c:1.9 Sat Feb 14 19:55:05 2015 +++ src/tests/net/bpfjit/t_bpfjit.c Sat Feb 14 20:25:08 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: t_bpfjit.c,v 1.9 2015/02/14 19:55:05 alnsn Exp $ */ +/* $NetBSD: t_bpfjit.c,v 1.10 2015/02/14 20:25:08 alnsn Exp $ */ /*- * Copyright (c) 2011-2012, 2014 Alexander Nasonov. @@ -27,7 +27,7 @@ */ #include -__RCSID("$NetBSD: t_bpfjit.c,v 1.9 2015/02/14 19:55:05 alnsn Exp $"); +__RCSID("$NetBSD: t_bpfjit.c,v 1.10 2015/02/14 20:25:08 alnsn Exp $"); #include #include @@ -2149,26 +2149,26 @@ ATF_TC_BODY(bpfjit_jmp_jeq_x, tc) BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0), BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8), BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 1), - BPF_STMT(BPF_RET+BPF_K, 0), + BPF_STMT(BPF_RET+BPF_K, 1), BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3), BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 2, 0), BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9), BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 1), - BPF_STMT(BPF_RET+BPF_K, 1), - BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5), - BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 1), BPF_STMT(BPF_RET+BPF_K, 2), + BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5), + BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 1), + BPF_STMT(BPF_RET+BPF_K, 3), BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7), BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 2, 3), - BPF_STMT(BPF_RET+BPF_K, 3), BPF_STMT(BPF_RET+BPF_K, 4), BPF_STMT(BPF_RET+BPF_K, 5), + BPF_STMT(BPF_RET+BPF_K, 6), BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6), BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 3, 1), - BPF_STMT(BPF_RET+BPF_K, 6), - BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 1, 0, 0), BPF_STMT(BPF_RET+BPF_K, 7), - BPF_STMT(BPF_RET+BPF_K, 8) + BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0), + BPF_STMT(BPF_RET+BPF_K, 8), + BPF_STMT(BPF_RET+BPF_K, 9) }; bpfjit_func_t code; @@ -2185,14 +2185,14 @@ ATF_TC_BODY(bpfjit_jmp_jeq_x, tc) rump_unschedule(); ATF_REQUIRE(code != NULL); - ATF_CHECK(jitcall(code, pkt, 1, 1) == 7); - ATF_CHECK(jitcall(code, pkt, 2, 2) == 7); - ATF_CHECK(jitcall(code, pkt, 3, 3) == 1); - ATF_CHECK(jitcall(code, pkt, 4, 4) == 7); - ATF_CHECK(jitcall(code, pkt, 5, 5) == 7); - ATF_CHECK(jitcall(code, pkt, 6, 6) == 8); - ATF_CHECK(jitcall(code, pkt, 7, 7) == 5); - ATF_CHECK(jitcall(code, pkt, 8, 8) == 0); + ATF_CHECK(jitcall(code, pkt, 1, 1) == 8); + ATF_CHECK(jitcall(code, pkt, 2, 2) == 8); + ATF_CHECK(jitcall(code, pkt, 3, 3) == 2); + ATF_CHECK(jitcall(code, pkt, 4, 4) == 8); + ATF_CHECK(jitcall(code, pkt, 5, 5) == 3); + ATF_CHECK(jitcall(code, pkt, 6, 6) == 9); + ATF_CHECK(jitcall(code, pkt, 7, 7) == 6); + ATF_CHECK(jitcall(code, pkt, 8, 8) == 1); rump_schedule(); rumpns_bpfjit_free_code(code);
CVS commit: src/tests/net/bpfjit
Module Name:src Committed By: alnsn Date: Sat Feb 14 19:55:05 UTC 2015 Modified Files: src/tests/net/bpfjit: t_bpfjit.c Log Message: BPF_JMP+BPF_JEQ+BPF_X doesn't compare X with k, it compares X with A. Fix it in the bpfjit_jmp_jeq_x_noinit_ax test. To generate a diff of this commit: cvs rdiff -u -r1.8 -r1.9 src/tests/net/bpfjit/t_bpfjit.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Modified files: Index: src/tests/net/bpfjit/t_bpfjit.c diff -u src/tests/net/bpfjit/t_bpfjit.c:1.8 src/tests/net/bpfjit/t_bpfjit.c:1.9 --- src/tests/net/bpfjit/t_bpfjit.c:1.8 Sat Feb 14 17:28:19 2015 +++ src/tests/net/bpfjit/t_bpfjit.c Sat Feb 14 19:55:05 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: t_bpfjit.c,v 1.8 2015/02/14 17:28:19 alnsn Exp $ */ +/* $NetBSD: t_bpfjit.c,v 1.9 2015/02/14 19:55:05 alnsn Exp $ */ /*- * Copyright (c) 2011-2012, 2014 Alexander Nasonov. @@ -27,7 +27,7 @@ */ #include -__RCSID("$NetBSD: t_bpfjit.c,v 1.8 2015/02/14 17:28:19 alnsn Exp $"); +__RCSID("$NetBSD: t_bpfjit.c,v 1.9 2015/02/14 19:55:05 alnsn Exp $"); #include #include @@ -2262,19 +2262,19 @@ ATF_TC_BODY(bpfjit_jmp_jset_x, tc) rump_unschedule(); } -ATF_TC(bpfjit_jmp_x_uninitialised); -ATF_TC_HEAD(bpfjit_jmp_x_uninitialised, tc) +ATF_TC(bpfjit_jmp_jeq_x_noinit_ax); +ATF_TC_HEAD(bpfjit_jmp_jeq_x_noinit_ax, tc) { atf_tc_set_md_var(tc, "descr", "Test JIT compilation " - "of BPF_JMP+BPF_EQ+BPF_X with uninitialised X"); + "of BPF_JMP+BPF_EQ+BPF_X with uninitialised A and X"); } -ATF_TC_BODY(bpfjit_jmp_x_uninitialised, tc) +ATF_TC_BODY(bpfjit_jmp_jeq_x_noinit_ax, tc) { static struct bpf_insn insns[] = { - BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 1, 0, 1), - BPF_STMT(BPF_RET+BPF_K, 11), - BPF_STMT(BPF_RET+BPF_K, 10) + BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 1), + BPF_STMT(BPF_RET+BPF_K, 10), + BPF_STMT(BPF_RET+BPF_K, 11) }; bpfjit_func_t code; @@ -4567,7 +4567,7 @@ ATF_TP_ADD_TCS(tp) ATF_TP_ADD_TC(tp, bpfjit_jmp_jge_x); ATF_TP_ADD_TC(tp, bpfjit_jmp_jeq_x); ATF_TP_ADD_TC(tp, bpfjit_jmp_jset_x); - ATF_TP_ADD_TC(tp, bpfjit_jmp_x_uninitialised); + ATF_TP_ADD_TC(tp, bpfjit_jmp_jeq_x_noinit_ax); ATF_TP_ADD_TC(tp, bpfjit_jmp_modulo_x); ATF_TP_ADD_TC(tp, bpfjit_ld_abs); ATF_TP_ADD_TC(tp, bpfjit_ld_abs_k_overflow);
CVS commit: src/tests/net/bpfjit
Module Name:src Committed By: alnsn Date: Sat Feb 14 17:28:19 UTC 2015 Modified Files: src/tests/net/bpfjit: t_bpfjit.c Log Message: Avoid testing for zero rv in bpfjit_jmp_x_uninitialised. Unitialised X isn't a problem for bpf_validate(). To generate a diff of this commit: cvs rdiff -u -r1.7 -r1.8 src/tests/net/bpfjit/t_bpfjit.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Modified files: Index: src/tests/net/bpfjit/t_bpfjit.c diff -u src/tests/net/bpfjit/t_bpfjit.c:1.7 src/tests/net/bpfjit/t_bpfjit.c:1.8 --- src/tests/net/bpfjit/t_bpfjit.c:1.7 Sat Feb 14 16:48:30 2015 +++ src/tests/net/bpfjit/t_bpfjit.c Sat Feb 14 17:28:19 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: t_bpfjit.c,v 1.7 2015/02/14 16:48:30 alnsn Exp $ */ +/* $NetBSD: t_bpfjit.c,v 1.8 2015/02/14 17:28:19 alnsn Exp $ */ /*- * Copyright (c) 2011-2012, 2014 Alexander Nasonov. @@ -27,7 +27,7 @@ */ #include -__RCSID("$NetBSD: t_bpfjit.c,v 1.7 2015/02/14 16:48:30 alnsn Exp $"); +__RCSID("$NetBSD: t_bpfjit.c,v 1.8 2015/02/14 17:28:19 alnsn Exp $"); #include #include @@ -2273,8 +2273,8 @@ ATF_TC_BODY(bpfjit_jmp_x_uninitialised, { static struct bpf_insn insns[] = { BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 1, 0, 1), - BPF_STMT(BPF_RET+BPF_K, 1), - BPF_STMT(BPF_RET+BPF_K, 0) + BPF_STMT(BPF_RET+BPF_K, 11), + BPF_STMT(BPF_RET+BPF_K, 10) }; bpfjit_func_t code; @@ -2284,15 +2284,14 @@ ATF_TC_BODY(bpfjit_jmp_x_uninitialised, RZ(rump_init()); - /* X isn't initialised. */ - ATF_CHECK(!prog_validate(insns, insn_count)); + ATF_CHECK(prog_validate(insns, insn_count)); rump_schedule(); code = rumpns_bpfjit_generate_code(NULL, insns, insn_count); rump_unschedule(); ATF_REQUIRE(code != NULL); - ATF_CHECK(jitcall(code, pkt, 1, 1) == 0); + ATF_CHECK(jitcall(code, pkt, 1, 1) == 10); rump_schedule(); rumpns_bpfjit_free_code(code);
CVS commit: src/tests/net/bpfjit
Module Name:src Committed By: alnsn Date: Sat Feb 14 16:48:30 UTC 2015 Modified Files: src/tests/net/bpfjit: t_bpfjit.c Log Message: Add bpfjit_jmp_x_uninitialised test. Found by http://lcamtuf.coredump.cx/afl/. To generate a diff of this commit: cvs rdiff -u -r1.6 -r1.7 src/tests/net/bpfjit/t_bpfjit.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Modified files: Index: src/tests/net/bpfjit/t_bpfjit.c diff -u src/tests/net/bpfjit/t_bpfjit.c:1.6 src/tests/net/bpfjit/t_bpfjit.c:1.7 --- src/tests/net/bpfjit/t_bpfjit.c:1.6 Wed Feb 11 23:29:48 2015 +++ src/tests/net/bpfjit/t_bpfjit.c Sat Feb 14 16:48:30 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: t_bpfjit.c,v 1.6 2015/02/11 23:29:48 alnsn Exp $ */ +/* $NetBSD: t_bpfjit.c,v 1.7 2015/02/14 16:48:30 alnsn Exp $ */ /*- * Copyright (c) 2011-2012, 2014 Alexander Nasonov. @@ -27,7 +27,7 @@ */ #include -__RCSID("$NetBSD: t_bpfjit.c,v 1.6 2015/02/11 23:29:48 alnsn Exp $"); +__RCSID("$NetBSD: t_bpfjit.c,v 1.7 2015/02/14 16:48:30 alnsn Exp $"); #include #include @@ -2262,6 +2262,43 @@ ATF_TC_BODY(bpfjit_jmp_jset_x, tc) rump_unschedule(); } +ATF_TC(bpfjit_jmp_x_uninitialised); +ATF_TC_HEAD(bpfjit_jmp_x_uninitialised, tc) +{ + atf_tc_set_md_var(tc, "descr", "Test JIT compilation " + "of BPF_JMP+BPF_EQ+BPF_X with uninitialised X"); +} + +ATF_TC_BODY(bpfjit_jmp_x_uninitialised, tc) +{ + static struct bpf_insn insns[] = { + BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 1, 0, 1), + BPF_STMT(BPF_RET+BPF_K, 1), + BPF_STMT(BPF_RET+BPF_K, 0) + }; + + bpfjit_func_t code; + uint8_t pkt[8]; /* the program doesn't read any data */ + + size_t insn_count = sizeof(insns) / sizeof(insns[0]); + + RZ(rump_init()); + + /* X isn't initialised. */ + ATF_CHECK(!prog_validate(insns, insn_count)); + + rump_schedule(); + code = rumpns_bpfjit_generate_code(NULL, insns, insn_count); + rump_unschedule(); + ATF_REQUIRE(code != NULL); + + ATF_CHECK(jitcall(code, pkt, 1, 1) == 0); + + rump_schedule(); + rumpns_bpfjit_free_code(code); + rump_unschedule(); +} + ATF_TC(bpfjit_jmp_modulo_x); ATF_TC_HEAD(bpfjit_jmp_modulo_x, tc) { @@ -4531,6 +4568,7 @@ ATF_TP_ADD_TCS(tp) ATF_TP_ADD_TC(tp, bpfjit_jmp_jge_x); ATF_TP_ADD_TC(tp, bpfjit_jmp_jeq_x); ATF_TP_ADD_TC(tp, bpfjit_jmp_jset_x); + ATF_TP_ADD_TC(tp, bpfjit_jmp_x_uninitialised); ATF_TP_ADD_TC(tp, bpfjit_jmp_modulo_x); ATF_TP_ADD_TC(tp, bpfjit_ld_abs); ATF_TP_ADD_TC(tp, bpfjit_ld_abs_k_overflow);
CVS commit: src/tests/net/bpfjit
Module Name:src Committed By: alnsn Date: Wed Feb 11 23:29:48 UTC 2015 Modified Files: src/tests/net/bpfjit: t_bpfjit.c Log Message: Add bpfjit_jmp_ja_overflow test. To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/tests/net/bpfjit/t_bpfjit.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Modified files: Index: src/tests/net/bpfjit/t_bpfjit.c diff -u src/tests/net/bpfjit/t_bpfjit.c:1.5 src/tests/net/bpfjit/t_bpfjit.c:1.6 --- src/tests/net/bpfjit/t_bpfjit.c:1.5 Wed Feb 11 22:37:55 2015 +++ src/tests/net/bpfjit/t_bpfjit.c Wed Feb 11 23:29:48 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: t_bpfjit.c,v 1.5 2015/02/11 22:37:55 alnsn Exp $ */ +/* $NetBSD: t_bpfjit.c,v 1.6 2015/02/11 23:29:48 alnsn Exp $ */ /*- * Copyright (c) 2011-2012, 2014 Alexander Nasonov. @@ -27,7 +27,7 @@ */ #include -__RCSID("$NetBSD: t_bpfjit.c,v 1.5 2015/02/11 22:37:55 alnsn Exp $"); +__RCSID("$NetBSD: t_bpfjit.c,v 1.6 2015/02/11 23:29:48 alnsn Exp $"); #include #include @@ -1700,6 +1700,36 @@ ATF_TC_BODY(bpfjit_jmp_ja_invalid, tc) ATF_CHECK(code == NULL); } +ATF_TC(bpfjit_jmp_ja_overflow); +ATF_TC_HEAD(bpfjit_jmp_ja_overflow, tc) +{ + atf_tc_set_md_var(tc, "descr", + "Test BPF_JMP+BPF_JA with negative offset"); +} + +ATF_TC_BODY(bpfjit_jmp_ja_overflow, tc) +{ + static struct bpf_insn insns[] = { + BPF_STMT(BPF_JMP+BPF_JA, 1), + BPF_STMT(BPF_RET+BPF_K, 777), + BPF_STMT(BPF_JMP+BPF_JA, UINT32_MAX - 1), // -2 + BPF_STMT(BPF_RET+BPF_K, 0) + }; + + bpfjit_func_t code; + size_t insn_count = sizeof(insns) / sizeof(insns[0]); + + RZ(rump_init()); + + /* Jumps with negative offsets work only in userspace. */ + ATF_CHECK(!prog_validate(insns, insn_count)); + + rump_schedule(); + code = rumpns_bpfjit_generate_code(NULL, insns, insn_count); + rump_unschedule(); + ATF_CHECK(code == NULL); +} + ATF_TC(bpfjit_jmp_jgt_k); ATF_TC_HEAD(bpfjit_jmp_jgt_k, tc) { @@ -4491,6 +4521,7 @@ ATF_TP_ADD_TCS(tp) ATF_TP_ADD_TC(tp, bpfjit_alu_neg); ATF_TP_ADD_TC(tp, bpfjit_jmp_ja); ATF_TP_ADD_TC(tp, bpfjit_jmp_ja_invalid); + ATF_TP_ADD_TC(tp, bpfjit_jmp_ja_overflow); ATF_TP_ADD_TC(tp, bpfjit_jmp_jgt_k); ATF_TP_ADD_TC(tp, bpfjit_jmp_jge_k); ATF_TP_ADD_TC(tp, bpfjit_jmp_jeq_k);
CVS commit: src/tests/net/bpfjit
Module Name:src Committed By: alnsn Date: Wed Feb 11 22:37:55 UTC 2015 Modified Files: src/tests/net/bpfjit: t_bpfjit.c Log Message: Add bpfjit_ret_k, bpfjit_bad_ret_k, bpfjit_jmp_ja_invalid tests. To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/tests/net/bpfjit/t_bpfjit.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Modified files: Index: src/tests/net/bpfjit/t_bpfjit.c diff -u src/tests/net/bpfjit/t_bpfjit.c:1.4 src/tests/net/bpfjit/t_bpfjit.c:1.5 --- src/tests/net/bpfjit/t_bpfjit.c:1.4 Thu Nov 20 11:36:13 2014 +++ src/tests/net/bpfjit/t_bpfjit.c Wed Feb 11 22:37:55 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: t_bpfjit.c,v 1.4 2014/11/20 11:36:13 alnsn Exp $ */ +/* $NetBSD: t_bpfjit.c,v 1.5 2015/02/11 22:37:55 alnsn Exp $ */ /*- * Copyright (c) 2011-2012, 2014 Alexander Nasonov. @@ -27,7 +27,7 @@ */ #include -__RCSID("$NetBSD: t_bpfjit.c,v 1.4 2014/11/20 11:36:13 alnsn Exp $"); +__RCSID("$NetBSD: t_bpfjit.c,v 1.5 2015/02/11 22:37:55 alnsn Exp $"); #include #include @@ -79,15 +79,73 @@ ATF_TC_HEAD(bpfjit_empty, tc) ATF_TC_BODY(bpfjit_empty, tc) { struct bpf_insn dummy; - bpfjit_func_t fn; + bpfjit_func_t code; RZ(rump_init()); + ATF_CHECK(!prog_validate(&dummy, 0)); + rump_schedule(); - fn = rumpns_bpfjit_generate_code(NULL, &dummy, 0); + code = rumpns_bpfjit_generate_code(NULL, &dummy, 0); rump_unschedule(); - ATF_CHECK(fn == NULL); + ATF_CHECK(code == NULL); +} + +ATF_TC(bpfjit_ret_k); +ATF_TC_HEAD(bpfjit_ret_k, tc) +{ + atf_tc_set_md_var(tc, "descr", + "Test JIT compilation of a trivial bpf program"); +} + +ATF_TC_BODY(bpfjit_ret_k, tc) +{ + static struct bpf_insn insns[] = { + BPF_STMT(BPF_RET+BPF_K, 17) + }; + + uint8_t pkt[1]; /* the program doesn't read any data */ + + size_t insn_count = sizeof(insns) / sizeof(insns[0]); + + RZ(rump_init()); + + ATF_CHECK(prog_validate(insns, insn_count)); + ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 17); +} + +ATF_TC(bpfjit_bad_ret_k); +ATF_TC_HEAD(bpfjit_bad_ret_k, tc) +{ + atf_tc_set_md_var(tc, "descr", + "Test that JIT compilation of a program with bad BPF_RET fails"); +} + +ATF_TC_BODY(bpfjit_bad_ret_k, tc) +{ + static struct bpf_insn insns[] = { + BPF_STMT(BPF_RET+BPF_K+0x8000, 13) + }; + + size_t insn_count = sizeof(insns) / sizeof(insns[0]); + + uint8_t pkt[1]; /* the program doesn't read any data */ + + /* + * The point of this test is checking a bad instruction of + * a valid class and with a valid BPF_RVAL data. + */ + const uint16_t rcode = insns[0].code; + ATF_CHECK(BPF_CLASS(rcode) == BPF_RET && + (BPF_RVAL(rcode) == BPF_K || BPF_RVAL(rcode) == BPF_A)); + + RZ(rump_init()); + + ATF_CHECK(!prog_validate(insns, insn_count)); + + /* Current implementation generates code. */ + ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 13); } ATF_TC(bpfjit_alu_add_k); @@ -1612,6 +1670,36 @@ ATF_TC_BODY(bpfjit_jmp_ja, tc) ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX); } +ATF_TC(bpfjit_jmp_ja_invalid); +ATF_TC_HEAD(bpfjit_jmp_ja_invalid, tc) +{ + atf_tc_set_md_var(tc, "descr", + "Test BPF_JMP+BPF_JA to invalid destination"); +} + +ATF_TC_BODY(bpfjit_jmp_ja_invalid, tc) +{ + static struct bpf_insn insns[] = { + BPF_STMT(BPF_JMP+BPF_JA, 4), + BPF_STMT(BPF_RET+BPF_K, 0), + BPF_STMT(BPF_RET+BPF_K, 1), + BPF_STMT(BPF_RET+BPF_K, 2), + BPF_STMT(BPF_RET+BPF_K, 3), + }; + + bpfjit_func_t code; + size_t insn_count = sizeof(insns) / sizeof(insns[0]); + + RZ(rump_init()); + + ATF_CHECK(!prog_validate(insns, insn_count)); + + rump_schedule(); + code = rumpns_bpfjit_generate_code(NULL, insns, insn_count); + rump_unschedule(); + ATF_CHECK(code == NULL); +} + ATF_TC(bpfjit_jmp_jgt_k); ATF_TC_HEAD(bpfjit_jmp_jgt_k, tc) { @@ -4344,6 +4432,8 @@ ATF_TP_ADD_TCS(tp) * to ../../lib/libbpfjit/t_bpfjit.c */ ATF_TP_ADD_TC(tp, bpfjit_empty); + ATF_TP_ADD_TC(tp, bpfjit_ret_k); + ATF_TP_ADD_TC(tp, bpfjit_bad_ret_k); ATF_TP_ADD_TC(tp, bpfjit_alu_add_k); ATF_TP_ADD_TC(tp, bpfjit_alu_sub_k); ATF_TP_ADD_TC(tp, bpfjit_alu_mul_k); @@ -4400,6 +4490,7 @@ ATF_TP_ADD_TCS(tp) ATF_TP_ADD_TC(tp, bpfjit_alu_modulo_x); ATF_TP_ADD_TC(tp, bpfjit_alu_neg); ATF_TP_ADD_TC(tp, bpfjit_jmp_ja); + ATF_TP_ADD_TC(tp, bpfjit_jmp_ja_invalid); ATF_TP_ADD_TC(tp, bpfjit_jmp_jgt_k); ATF_TP_ADD_TC(tp, bpfjit_jmp_jge_k); ATF_TP_ADD_TC(tp, bpfjit_jmp_jeq_k);
CVS commit: src/tests/net/bpfjit
Module Name:src Committed By: alnsn Date: Thu Nov 20 11:36:13 UTC 2014 Modified Files: src/tests/net/bpfjit: t_bpfjit.c Log Message: Add BPF_MOD tests. Plus one tiny change. To generate a diff of this commit: cvs rdiff -u -r1.3 -r1.4 src/tests/net/bpfjit/t_bpfjit.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Modified files: Index: src/tests/net/bpfjit/t_bpfjit.c diff -u src/tests/net/bpfjit/t_bpfjit.c:1.3 src/tests/net/bpfjit/t_bpfjit.c:1.4 --- src/tests/net/bpfjit/t_bpfjit.c:1.3 Wed Nov 19 23:00:12 2014 +++ src/tests/net/bpfjit/t_bpfjit.c Thu Nov 20 11:36:13 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: t_bpfjit.c,v 1.3 2014/11/19 23:00:12 alnsn Exp $ */ +/* $NetBSD: t_bpfjit.c,v 1.4 2014/11/20 11:36:13 alnsn Exp $ */ /*- * Copyright (c) 2011-2012, 2014 Alexander Nasonov. @@ -27,7 +27,7 @@ */ #include -__RCSID("$NetBSD: t_bpfjit.c,v 1.3 2014/11/19 23:00:12 alnsn Exp $"); +__RCSID("$NetBSD: t_bpfjit.c,v 1.4 2014/11/20 11:36:13 alnsn Exp $"); #include #include @@ -364,6 +364,205 @@ ATF_TC_BODY(bpfjit_alu_div8000_k, tc ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 1); } +ATF_TC(bpfjit_alu_mod0_k); +ATF_TC_HEAD(bpfjit_alu_mod0_k, tc) +{ + atf_tc_set_md_var(tc, "descr", + "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=0"); +} + +ATF_TC_BODY(bpfjit_alu_mod0_k, tc) +{ + static struct bpf_insn insns[] = { + BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, 0), + BPF_STMT(BPF_RET+BPF_A, 0) + }; + + uint8_t pkt[1]; /* the program doesn't read any data */ + + size_t insn_count = sizeof(insns) / sizeof(insns[0]); + + RZ(rump_init()); + + //ATF_CHECK(prog_validate(insns, insn_count)); + ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0); +} + +ATF_TC(bpfjit_alu_mod1_k); +ATF_TC_HEAD(bpfjit_alu_mod1_k, tc) +{ + atf_tc_set_md_var(tc, "descr", + "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=1"); +} + +ATF_TC_BODY(bpfjit_alu_mod1_k, tc) +{ + static struct bpf_insn insns[] = { + BPF_STMT(BPF_LD+BPF_IMM, 7), + BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, 1), + BPF_STMT(BPF_RET+BPF_A, 0) + }; + + uint8_t pkt[1]; /* the program doesn't read any data */ + + size_t insn_count = sizeof(insns) / sizeof(insns[0]); + + RZ(rump_init()); + + ATF_CHECK(prog_validate(insns, insn_count)); + ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0); +} + +ATF_TC(bpfjit_alu_mod2_k); +ATF_TC_HEAD(bpfjit_alu_mod2_k, tc) +{ + atf_tc_set_md_var(tc, "descr", + "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=2"); +} + +ATF_TC_BODY(bpfjit_alu_mod2_k, tc) +{ + static struct bpf_insn insns[] = { + BPF_STMT(BPF_LD+BPF_IMM, 7), + BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, 2), + BPF_STMT(BPF_RET+BPF_A, 0) + }; + + uint8_t pkt[1]; /* the program doesn't read any data */ + + size_t insn_count = sizeof(insns) / sizeof(insns[0]); + + RZ(rump_init()); + + ATF_CHECK(prog_validate(insns, insn_count)); + ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 1); +} + +ATF_TC(bpfjit_alu_mod4_k); +ATF_TC_HEAD(bpfjit_alu_mod4_k, tc) +{ + atf_tc_set_md_var(tc, "descr", + "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=4"); +} + +ATF_TC_BODY(bpfjit_alu_mod4_k, tc) +{ + static struct bpf_insn insns[] = { + BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x)), + BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, 4), + BPF_STMT(BPF_RET+BPF_A, 0) + }; + + uint8_t pkt[1]; /* the program doesn't read any data */ + + size_t insn_count = sizeof(insns) / sizeof(insns[0]); + + RZ(rump_init()); + + ATF_CHECK(prog_validate(insns, insn_count)); + ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 3); +} + +ATF_TC(bpfjit_alu_mod10_k); +ATF_TC_HEAD(bpfjit_alu_mod10_k, tc) +{ + atf_tc_set_md_var(tc, "descr", + "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=10"); +} + +ATF_TC_BODY(bpfjit_alu_mod10_k, tc) +{ + static struct bpf_insn insns[] = { + BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)), + BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, 10), + BPF_STMT(BPF_RET+BPF_A, 0) + }; + + uint8_t pkt[1]; /* the program doesn't read any data */ + + size_t insn_count = sizeof(insns) / sizeof(insns[0]); + + RZ(rump_init()); + + ATF_CHECK(prog_validate(insns, insn_count)); + ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 9); +} + +ATF_TC(bpfjit_alu_mod1_k); +ATF_TC_HEAD(bpfjit_alu_mod1_k, tc) +{ + atf_tc_set_md_var(tc, "descr", + "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=1"); +} + +ATF_TC_BODY(bpfjit_alu_mod1_k, tc) +{ + static struct bpf_insn insns[] = { + BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)), + BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, 1), + BPF_STMT(BPF_RET+BPF_A, 0) + }; + + uint8_t pkt[1]; /* the program doesn't read any data */ + + size_t insn_count = sizeof(insns) / sizeof(insns[0]); + + RZ(rump_init()); + + ATF_CHECK(prog_validate(insns, insn_count)); + ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 3849); +} + +ATF_TC(bpfjit_alu_mod7609801_k); +ATF_TC_HEAD(bpfjit_alu_mod7609801_k, tc) +{ + atf_tc_set_md_var(tc, "descr", + "Test JIT compilati
CVS commit: src/tests/net/bpfjit
Module Name:src Committed By: alnsn Date: Wed Nov 19 23:00:12 UTC 2014 Modified Files: src/tests/net/bpfjit: t_bpfjit.c Log Message: Add BPF_XOR tests. To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.3 src/tests/net/bpfjit/t_bpfjit.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Modified files: Index: src/tests/net/bpfjit/t_bpfjit.c diff -u src/tests/net/bpfjit/t_bpfjit.c:1.2 src/tests/net/bpfjit/t_bpfjit.c:1.3 --- src/tests/net/bpfjit/t_bpfjit.c:1.2 Tue Jul 8 21:44:26 2014 +++ src/tests/net/bpfjit/t_bpfjit.c Wed Nov 19 23:00:12 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: t_bpfjit.c,v 1.2 2014/07/08 21:44:26 alnsn Exp $ */ +/* $NetBSD: t_bpfjit.c,v 1.3 2014/11/19 23:00:12 alnsn Exp $ */ /*- * Copyright (c) 2011-2012, 2014 Alexander Nasonov. @@ -27,7 +27,7 @@ */ #include -__RCSID("$NetBSD: t_bpfjit.c,v 1.2 2014/07/08 21:44:26 alnsn Exp $"); +__RCSID("$NetBSD: t_bpfjit.c,v 1.3 2014/11/19 23:00:12 alnsn Exp $"); #include #include @@ -414,6 +414,31 @@ ATF_TC_BODY(bpfjit_alu_or_k, tc) ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xdeadbeef); } +ATF_TC(bpfjit_alu_xor_k); +ATF_TC_HEAD(bpfjit_alu_xor_k, tc) +{ + atf_tc_set_md_var(tc, "descr", + "Test JIT compilation of BPF_ALU+BPF_XOR+BPF_K"); +} + +ATF_TC_BODY(bpfjit_alu_xor_k, tc) +{ + static struct bpf_insn insns[] = { + BPF_STMT(BPF_LD+BPF_IMM, 0xdead0f0f), + BPF_STMT(BPF_ALU+BPF_XOR+BPF_K, 0xb1e0), + BPF_STMT(BPF_RET+BPF_A, 0) + }; + + uint8_t pkt[1]; /* the program doesn't read any data */ + + size_t insn_count = sizeof(insns) / sizeof(insns[0]); + + RZ(rump_init()); + + ATF_CHECK(prog_validate(insns, insn_count)); + ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xdeadbeef); +} + ATF_TC(bpfjit_alu_lsh_k); ATF_TC_HEAD(bpfjit_alu_lsh_k, tc) { @@ -920,6 +945,32 @@ ATF_TC_BODY(bpfjit_alu_or_x, tc) ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xdeadbeef); } +ATF_TC(bpfjit_alu_xor_x); +ATF_TC_HEAD(bpfjit_alu_xor_x, tc) +{ + atf_tc_set_md_var(tc, "descr", + "Test JIT compilation of BPF_ALU+BPF_XOR+BPF_X"); +} + +ATF_TC_BODY(bpfjit_alu_xor_x, tc) +{ + static struct bpf_insn insns[] = { + BPF_STMT(BPF_LD+BPF_IMM, 0xdead0f0f), + BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0xb1e0), + BPF_STMT(BPF_ALU+BPF_XOR+BPF_X, 0), + BPF_STMT(BPF_RET+BPF_A, 0) + }; + + uint8_t pkt[1]; /* the program doesn't read any data */ + + size_t insn_count = sizeof(insns) / sizeof(insns[0]); + + RZ(rump_init()); + + ATF_CHECK(prog_validate(insns, insn_count)); + ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xdeadbeef); +} + ATF_TC(bpfjit_alu_lsh_x); ATF_TC_HEAD(bpfjit_alu_lsh_x, tc) { @@ -3900,6 +3951,7 @@ ATF_TP_ADD_TCS(tp) ATF_TP_ADD_TC(tp, bpfjit_alu_div8000_k); ATF_TP_ADD_TC(tp, bpfjit_alu_and_k); ATF_TP_ADD_TC(tp, bpfjit_alu_or_k); + ATF_TP_ADD_TC(tp, bpfjit_alu_xor_k); ATF_TP_ADD_TC(tp, bpfjit_alu_lsh_k); ATF_TP_ADD_TC(tp, bpfjit_alu_lsh0_k); ATF_TP_ADD_TC(tp, bpfjit_alu_rsh_k); @@ -3918,6 +3970,7 @@ ATF_TP_ADD_TCS(tp) ATF_TP_ADD_TC(tp, bpfjit_alu_div8000_x); ATF_TP_ADD_TC(tp, bpfjit_alu_and_x); ATF_TP_ADD_TC(tp, bpfjit_alu_or_x); + ATF_TP_ADD_TC(tp, bpfjit_alu_xor_x); ATF_TP_ADD_TC(tp, bpfjit_alu_lsh_x); ATF_TP_ADD_TC(tp, bpfjit_alu_lsh0_x); ATF_TP_ADD_TC(tp, bpfjit_alu_rsh_x);
CVS commit: src/tests/net/bpfjit
Module Name:src Committed By: alnsn Date: Wed Jul 9 15:56:12 UTC 2014 Modified Files: src/tests/net/bpfjit: t_cop.c Log Message: Fix copy/paste error: s/rump_unschedule/rump_schedule/. To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/tests/net/bpfjit/t_cop.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Modified files: Index: src/tests/net/bpfjit/t_cop.c diff -u src/tests/net/bpfjit/t_cop.c:1.1 src/tests/net/bpfjit/t_cop.c:1.2 --- src/tests/net/bpfjit/t_cop.c:1.1 Wed Jul 9 13:49:49 2014 +++ src/tests/net/bpfjit/t_cop.c Wed Jul 9 15:56:12 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: t_cop.c,v 1.1 2014/07/09 13:49:49 alnsn Exp $ */ +/* $NetBSD: t_cop.c,v 1.2 2014/07/09 15:56:12 alnsn Exp $ */ /*- * Copyright (c) 2014 Alexander Nasonov. @@ -30,7 +30,7 @@ */ #include -__RCSID("$NetBSD: t_cop.c,v 1.1 2014/07/09 13:49:49 alnsn Exp $"); +__RCSID("$NetBSD: t_cop.c,v 1.2 2014/07/09 15:56:12 alnsn Exp $"); #include #include @@ -467,7 +467,7 @@ ATF_TC_BODY(bpfjit_copx_ret_buflen, tc) ATF_CHECK(code(&ctx, &args) == sizeof(pkt)); - rump_unschedule(); + rump_schedule(); rumpns_bpfjit_free_code(code); rump_unschedule(); }
CVS commit: src/tests/net/bpfjit
Module Name:src Committed By: alnsn Date: Wed Jul 9 13:49:49 UTC 2014 Added Files: src/tests/net/bpfjit: t_cop.c t_extmem.c Log Message: Add t_cop and t_extmem kernel bpfjit tests. To generate a diff of this commit: cvs rdiff -u -r0 -r1.1 src/tests/net/bpfjit/t_cop.c \ src/tests/net/bpfjit/t_extmem.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Added files: Index: src/tests/net/bpfjit/t_cop.c diff -u /dev/null src/tests/net/bpfjit/t_cop.c:1.1 --- /dev/null Wed Jul 9 13:49:49 2014 +++ src/tests/net/bpfjit/t_cop.c Wed Jul 9 13:49:49 2014 @@ -0,0 +1,664 @@ +/* $NetBSD: t_cop.c,v 1.1 2014/07/09 13:49:49 alnsn Exp $ */ + +/*- + * Copyright (c) 2014 Alexander Nasonov. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + *notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *notice, this list of conditions and the following disclaimer in + *the documentation and/or other materials provided with the + *distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__RCSID("$NetBSD: t_cop.c,v 1.1 2014/07/09 13:49:49 alnsn Exp $"); + +#include +#include + +#define __BPF_PRIVATE +#include +#include + +#include "../../net/bpf/h_bpf.h" + +/* XXX: atf-c.h has collisions with mbuf */ +#undef m_type +#undef m_data +#include + +#include "../../h_macros.h" + +static uint32_t retA(const bpf_ctx_t *bc, bpf_args_t *args, uint32_t A); +static uint32_t retBL(const bpf_ctx_t *bc, bpf_args_t *args, uint32_t A); +static uint32_t retWL(const bpf_ctx_t *bc, bpf_args_t *args, uint32_t A); +static uint32_t retNF(const bpf_ctx_t *bc, bpf_args_t *args, uint32_t A); +static uint32_t setARG(const bpf_ctx_t *bc, bpf_args_t *args, uint32_t A); + +static const bpf_copfunc_t copfuncs[] = { + &retA, + &retBL, + &retWL, + &retNF, + &setARG +}; + +static const bpf_ctx_t ctx = { + .copfuncs = copfuncs, + .nfuncs = sizeof(copfuncs) / sizeof(copfuncs[0]), + .extwords = 0 +}; + +static uint32_t +retA(const bpf_ctx_t *bc, bpf_args_t *args, uint32_t A) +{ + + return A; +} + +static uint32_t +retBL(const bpf_ctx_t *bc, bpf_args_t *args, uint32_t A) +{ + + return args->buflen; +} + +static uint32_t +retWL(const bpf_ctx_t *bc, bpf_args_t *args, uint32_t A) +{ + + return args->wirelen; +} + +static uint32_t +retNF(const bpf_ctx_t *bc, bpf_args_t *args, uint32_t A) +{ + + return bc->nfuncs; +} + +/* + * COP function with a side effect. + */ +static uint32_t +setARG(const bpf_ctx_t *bc, bpf_args_t *args, uint32_t A) +{ + bool *arg = (bool *)args->arg; + bool old = *arg; + + *arg = true; + return old; +} + +ATF_TC(bpfjit_cop_no_ctx); +ATF_TC_HEAD(bpfjit_cop_no_ctx, tc) +{ + atf_tc_set_md_var(tc, "descr", "Test that bpf program with BPF_COP " + "instruction isn't valid without a context"); +} + +ATF_TC_BODY(bpfjit_cop_no_ctx, tc) +{ + static struct bpf_insn insns[] = { + BPF_STMT(BPF_MISC+BPF_COP, 0), + BPF_STMT(BPF_RET+BPF_K, 7) + }; + + bpfjit_func_t code; + + size_t insn_count = sizeof(insns) / sizeof(insns[0]); + + RZ(rump_init()); + + ATF_CHECK(!prog_validate(insns, insn_count)); + + rump_schedule(); + code = rumpns_bpfjit_generate_code(NULL, insns, insn_count); + rump_unschedule(); + ATF_CHECK(code == NULL); +} + +ATF_TC(bpfjit_cop_ret_A); +ATF_TC_HEAD(bpfjit_cop_ret_A, tc) +{ + atf_tc_set_md_var(tc, "descr", "Test coprocessor function " + "that returns a content of the A register"); +} + +ATF_TC_BODY(bpfjit_cop_ret_A, tc) +{ + static struct bpf_insn insns[] = { + BPF_STMT(BPF_LD+BPF_IMM, 13), + BPF_STMT(BPF_MISC+BPF_COP, 0), // retA + BPF_STMT(BPF_RET+BPF_A, 0) + }; + + bpfjit_func_t code; + uint8_t pkt[1] = { 0 }; + bpf_args_t args = { + .pkt = pkt, + .buflen = sizeof(pkt), + .wirelen = sizeof(pkt), + }; + + size_t insn_count = sizeof(insns) / sizeof(insns[0]); + + RZ(rump_init()); + + rump_schedule(); + code = rumpns_bpfjit_generate_code(&ctx, insns, insn_count)
CVS commit: src/tests/net/bpfjit
Module Name:src Committed By: alnsn Date: Tue Jul 8 21:45:55 UTC 2014 Added Files: src/tests/net/bpfjit: t_mbuf.c Log Message: Move bpfjit mbuf tests to t_mbuf.c. To generate a diff of this commit: cvs rdiff -u -r0 -r1.1 src/tests/net/bpfjit/t_mbuf.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Added files: Index: src/tests/net/bpfjit/t_mbuf.c diff -u /dev/null src/tests/net/bpfjit/t_mbuf.c:1.1 --- /dev/null Tue Jul 8 21:45:55 2014 +++ src/tests/net/bpfjit/t_mbuf.c Tue Jul 8 21:45:55 2014 @@ -0,0 +1,982 @@ +/* $NetBSD: t_mbuf.c,v 1.1 2014/07/08 21:45:55 alnsn Exp $ */ + +/*- + * Copyright (c) 2014 Alexander Nasonov. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *notice, this list of conditions and the following disclaimer in the + *documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__RCSID("$NetBSD: t_mbuf.c,v 1.1 2014/07/08 21:45:55 alnsn Exp $"); + +#include +#include + +#include +#include + +#include +#include + +#include +#include + +#include "../../net/bpf/h_bpf.h" + +/* XXX: atf-c.h has collisions with mbuf */ +#undef m_type +#undef m_data +#include + +#include "../../h_macros.h" + +static bool +test_ldb_abs(size_t split) +{ + /* Return a product of all packet bytes. */ + static struct bpf_insn insns[] = { + BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1), /* X <- 1 */ + + BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 0), /* A <- P[0] */ + BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0), /* A <- A * X */ + BPF_STMT(BPF_MISC+BPF_TAX, 0), /* X <- A */ + + BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 1), /* A <- P[1] */ + BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0), /* A <- A * X */ + BPF_STMT(BPF_MISC+BPF_TAX, 0), /* X <- A */ + + BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 2), /* A <- P[2] */ + BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0), /* A <- A * X */ + BPF_STMT(BPF_MISC+BPF_TAX, 0), /* X <- A */ + + BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3), /* A <- P[3] */ + BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0), /* A <- A * X */ + BPF_STMT(BPF_MISC+BPF_TAX, 0), /* X <- A */ + + BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 4), /* A <- P[4] */ + BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0), /* A <- A * X */ + BPF_STMT(BPF_RET+BPF_A, 0), /* ret A */ + }; + + static unsigned char P[] = { 1, 2, 3, 4, 5 }; + const unsigned int res = 120; + const size_t insn_count = sizeof(insns) / sizeof(insns[0]); + + if (!prog_validate(insns, insn_count)) + return false; + + return exec_prog_mchain2(insns, insn_count, P, sizeof(P), split) == res; +} + +static bool +test_ldh_abs(size_t split) +{ + static struct bpf_insn insns[] = { + BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 0), /* A <- P[0:2] */ + BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */ + BPF_STMT(BPF_MISC+BPF_TAX, 0), /* X <- A */ + + BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 1), /* A <- P[1:2] */ + BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */ + BPF_STMT(BPF_MISC+BPF_TAX, 0), /* X <- A */ + + BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 2), /* A <- P[2:2] */ + BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */ + BPF_STMT(BPF_MISC+BPF_TAX, 0), /* X <- A */ + + BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 3), /* A <- P[3:2] */ + BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */ + BPF_STMT(BPF_RET+BPF_A, 0), /* ret A*/ + }; + + static unsigned char P[] = { 1, 2, 3, 4, 5 }; + const unsigned int res = 0x0a0e; /* 10 14 */ + const size_t insn_count = sizeof(insns) / sizeof(insns[0]); + + if (!prog_validate(insns, insn_count)) + return false; + + return exec_prog_mchain2(insns, insn_count, P, sizeof(P), split) == res; +} + +static bool +test_ldw_abs(size_t split) +{ + static struct bpf_insn insns[] = { + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), /* A <- P[0:4] */ + BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */ + BPF_STMT(
CVS commit: src/tests/net/bpfjit
Module Name:src Committed By: alnsn Date: Mon Jun 30 21:34:22 UTC 2014 Modified Files: src/tests/net/bpfjit: Makefile Log Message: Fix test directory. To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/tests/net/bpfjit/Makefile Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Modified files: Index: src/tests/net/bpfjit/Makefile diff -u src/tests/net/bpfjit/Makefile:1.1 src/tests/net/bpfjit/Makefile:1.2 --- src/tests/net/bpfjit/Makefile:1.1 Mon Jun 30 21:30:51 2014 +++ src/tests/net/bpfjit/Makefile Mon Jun 30 21:34:22 2014 @@ -1,9 +1,9 @@ -# $NetBSD: Makefile,v 1.1 2014/06/30 21:30:51 alnsn Exp $ +# $NetBSD: Makefile,v 1.2 2014/06/30 21:34:22 alnsn Exp $ # .include -TESTSDIR= ${TESTSBASE}/kernel/bpfjit +TESTSDIR= ${TESTSBASE}/net/bpfjit TESTS_C= t_bpfjit