[2/2] test/bpf: add test for immediate load

Message ID 1541680604-17245-3-git-send-email-konstantin.ananyev@intel.com (mailing list archive)
State Accepted, archived
Delegated to: Thomas Monjalon
Headers
Series bpf: fix x86 jit issue |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK

Commit Message

Ananyev, Konstantin Nov. 8, 2018, 12:36 p.m. UTC
  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(+)
  

Patch

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),