All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] bpf: fix x86 jit issue
@ 2018-11-08 12:36 Konstantin Ananyev
  2018-11-08 12:36 ` [PATCH 1/2] bpf: fix x86 jit for immediate loads Konstantin Ananyev
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Konstantin Ananyev @ 2018-11-08 12:36 UTC (permalink / raw)
  To: dev; +Cc: Konstantin Ananyev

*** BLURB HERE ***

Konstantin Ananyev (2):
  bpf: fix x86 jit for immediate loads
  test/bpf: add test for immediate load

 lib/librte_bpf/bpf_jit_x86.c |  28 ++++++---
 test/test/test_bpf.c         | 108 +++++++++++++++++++++++++++++++++++
 2 files changed, 128 insertions(+), 8 deletions(-)

-- 
2.17.1

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

* [PATCH 1/2] bpf: fix x86 jit for immediate loads
  2018-11-08 12:36 [PATCH 0/2] bpf: fix x86 jit issue Konstantin Ananyev
@ 2018-11-08 12:36 ` Konstantin Ananyev
  2018-11-08 12:36 ` [PATCH 2/2] test/bpf: add test for immediate load Konstantin Ananyev
  2018-11-13 22:21 ` [PATCH 0/2] bpf: fix x86 jit issue Thomas Monjalon
  2 siblings, 0 replies; 4+ messages in thread
From: Konstantin Ananyev @ 2018-11-08 12:36 UTC (permalink / raw)
  To: dev; +Cc: Konstantin Ananyev

x86 jit can generate invalid code for (BPF_LD | BPF_IMM | EBPF_DW)
instructions, when immediate value is bigger then INT32_MAX.

Fixes: cc752e43e079 ("bpf: add JIT compilation for x86_64 ISA")

Signed-off-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
---
 lib/librte_bpf/bpf_jit_x86.c | 28 ++++++++++++++++++++--------
 1 file changed, 20 insertions(+), 8 deletions(-)

diff --git a/lib/librte_bpf/bpf_jit_x86.c b/lib/librte_bpf/bpf_jit_x86.c
index 68ea389f2..f70cd6be5 100644
--- a/lib/librte_bpf/bpf_jit_x86.c
+++ b/lib/librte_bpf/bpf_jit_x86.c
@@ -208,6 +208,19 @@ emit_sib(struct bpf_jit_state *st, uint32_t scale, uint32_t idx, uint32_t base)
 	emit_bytes(st, &v, sizeof(v));
 }
 
+/*
+ * emit OPCODE+REGIDX byte
+ */
+static void
+emit_opcode(struct bpf_jit_state *st, uint8_t ops, uint32_t reg)
+{
+	uint8_t v;
+
+	v = ops | (reg & 7);
+	emit_bytes(st, &v, sizeof(v));
+}
+
+
 /*
  * emit xchg %<sreg>, %<dreg>
  */
@@ -472,19 +485,18 @@ static void
 emit_ld_imm64(struct bpf_jit_state *st, uint32_t dreg, uint32_t imm0,
 	uint32_t imm1)
 {
+	uint32_t op;
+
 	const uint8_t ops = 0xB8;
 
-	if (imm1 == 0) {
-		emit_mov_imm(st, EBPF_ALU64 | EBPF_MOV | BPF_K, dreg, imm0);
-		return;
-	}
+	op = (imm1 == 0) ? BPF_ALU : EBPF_ALU64;
 
-	emit_rex(st, EBPF_ALU64, 0, dreg);
-	emit_bytes(st, &ops, sizeof(ops));
-	emit_modregrm(st, MOD_DIRECT, 0, dreg);
+	emit_rex(st, op, 0, dreg);
+	emit_opcode(st, ops, dreg);
 
 	emit_imm(st, imm0, sizeof(imm0));
-	emit_imm(st, imm1, sizeof(imm1));
+	if (imm1 != 0)
+		emit_imm(st, imm1, sizeof(imm1));
 }
 
 /*
-- 
2.17.1

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

* [PATCH 2/2] test/bpf: add test for immediate load
  2018-11-08 12:36 [PATCH 0/2] bpf: fix x86 jit issue Konstantin Ananyev
  2018-11-08 12:36 ` [PATCH 1/2] bpf: fix x86 jit for immediate loads Konstantin Ananyev
@ 2018-11-08 12:36 ` Konstantin Ananyev
  2018-11-13 22:21 ` [PATCH 0/2] bpf: fix x86 jit issue Thomas Monjalon
  2 siblings, 0 replies; 4+ messages in thread
From: Konstantin Ananyev @ 2018-11-08 12:36 UTC (permalink / raw)
  To: dev; +Cc: Konstantin Ananyev

New test-case to cover (BPF_LD | BPF_IMM | EBPF_DW) instruction.

Signed-off-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
---
 test/test/test_bpf.c | 108 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 108 insertions(+)

diff --git a/test/test/test_bpf.c b/test/test/test_bpf.c
index fa17c4f74..1d50401aa 100644
--- a/test/test/test_bpf.c
+++ b/test/test/test_bpf.c
@@ -48,6 +48,12 @@ struct dummy_vect8 {
 #define TEST_JCC_3	5678
 #define TEST_JCC_4	TEST_FILL_1
 
+#define TEST_IMM_1	UINT64_MAX
+#define TEST_IMM_2	((uint64_t)INT64_MIN)
+#define TEST_IMM_3	((uint64_t)INT64_MAX + INT32_MAX)
+#define TEST_IMM_4	((uint64_t)UINT32_MAX)
+#define TEST_IMM_5	((uint64_t)UINT32_MAX + 1)
+
 struct bpf_test {
 	const char *name;
 	size_t arg_sz;
@@ -268,6 +274,94 @@ test_load1_check(uint64_t rc, const void *arg)
 	return cmp_res(__func__, v, rc, dft, dft, sizeof(*dft));
 }
 
+/* load immediate test-cases */
+static const struct ebpf_insn test_ldimm1_prog[] = {
+
+	{
+		.code = (BPF_LD | BPF_IMM | EBPF_DW),
+		.dst_reg = EBPF_REG_0,
+		.imm = (uint32_t)TEST_IMM_1,
+	},
+	{
+		.imm = TEST_IMM_1 >> 32,
+	},
+	{
+		.code = (BPF_LD | BPF_IMM | EBPF_DW),
+		.dst_reg = EBPF_REG_3,
+		.imm = (uint32_t)TEST_IMM_2,
+	},
+	{
+		.imm = TEST_IMM_2 >> 32,
+	},
+	{
+		.code = (BPF_LD | BPF_IMM | EBPF_DW),
+		.dst_reg = EBPF_REG_5,
+		.imm = (uint32_t)TEST_IMM_3,
+	},
+	{
+		.imm = TEST_IMM_3 >> 32,
+	},
+	{
+		.code = (BPF_LD | BPF_IMM | EBPF_DW),
+		.dst_reg = EBPF_REG_7,
+		.imm = (uint32_t)TEST_IMM_4,
+	},
+	{
+		.imm = TEST_IMM_4 >> 32,
+	},
+	{
+		.code = (BPF_LD | BPF_IMM | EBPF_DW),
+		.dst_reg = EBPF_REG_9,
+		.imm = (uint32_t)TEST_IMM_5,
+	},
+	{
+		.imm = TEST_IMM_5 >> 32,
+	},
+	/* return sum */
+	{
+		.code = (EBPF_ALU64 | BPF_ADD | BPF_X),
+		.dst_reg = EBPF_REG_0,
+		.src_reg = EBPF_REG_3,
+	},
+	{
+		.code = (EBPF_ALU64 | BPF_ADD | BPF_X),
+		.dst_reg = EBPF_REG_0,
+		.src_reg = EBPF_REG_5,
+	},
+	{
+		.code = (EBPF_ALU64 | BPF_ADD | BPF_X),
+		.dst_reg = EBPF_REG_0,
+		.src_reg = EBPF_REG_7,
+	},
+	{
+		.code = (EBPF_ALU64 | BPF_ADD | BPF_X),
+		.dst_reg = EBPF_REG_0,
+		.src_reg = EBPF_REG_9,
+	},
+	{
+		.code = (BPF_JMP | EBPF_EXIT),
+	},
+};
+
+static int
+test_ldimm1_check(uint64_t rc, const void *arg)
+{
+	uint64_t v1, v2;
+
+	v1 = TEST_IMM_1;
+	v2 = TEST_IMM_2;
+	v1 += v2;
+	v2 = TEST_IMM_3;
+	v1 += v2;
+	v2 = TEST_IMM_4;
+	v1 += v2;
+	v2 = TEST_IMM_5;
+	v1 += v2;
+
+	return cmp_res(__func__, v1, rc, arg, arg, 0);
+}
+
+
 /* alu mul test-cases */
 static const struct ebpf_insn test_mul1_prog[] = {
 
@@ -1726,6 +1820,20 @@ static const struct bpf_test tests[] = {
 		.prepare = test_load1_prepare,
 		.check_result = test_load1_check,
 	},
+	{
+		.name = "test_ldimm1",
+		.arg_sz = sizeof(struct dummy_offset),
+		.prm = {
+			.ins = test_ldimm1_prog,
+			.nb_ins = RTE_DIM(test_ldimm1_prog),
+			.prog_arg = {
+				.type = RTE_BPF_ARG_PTR,
+				.size = sizeof(struct dummy_offset),
+			},
+		},
+		.prepare = test_store1_prepare,
+		.check_result = test_ldimm1_check,
+	},
 	{
 		.name = "test_mul1",
 		.arg_sz = sizeof(struct dummy_vect8),
-- 
2.17.1

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

* Re: [PATCH 0/2] bpf: fix x86 jit issue
  2018-11-08 12:36 [PATCH 0/2] bpf: fix x86 jit issue Konstantin Ananyev
  2018-11-08 12:36 ` [PATCH 1/2] bpf: fix x86 jit for immediate loads Konstantin Ananyev
  2018-11-08 12:36 ` [PATCH 2/2] test/bpf: add test for immediate load Konstantin Ananyev
@ 2018-11-13 22:21 ` Thomas Monjalon
  2 siblings, 0 replies; 4+ messages in thread
From: Thomas Monjalon @ 2018-11-13 22:21 UTC (permalink / raw)
  To: Konstantin Ananyev; +Cc: dev

08/11/2018 13:36, Konstantin Ananyev:
> *** BLURB HERE ***
> 
> Konstantin Ananyev (2):
>   bpf: fix x86 jit for immediate loads
>   test/bpf: add test for immediate load

Applied, thanks

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

end of thread, other threads:[~2018-11-13 22:21 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-11-08 12:36 [PATCH 0/2] bpf: fix x86 jit issue Konstantin Ananyev
2018-11-08 12:36 ` [PATCH 1/2] bpf: fix x86 jit for immediate loads Konstantin Ananyev
2018-11-08 12:36 ` [PATCH 2/2] test/bpf: add test for immediate load Konstantin Ananyev
2018-11-13 22:21 ` [PATCH 0/2] bpf: fix x86 jit issue Thomas Monjalon

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.