|
@@ -2443,6 +2443,22 @@ static struct bpf_test tests[] = {
|
|
|
{ },
|
|
|
{ { 0, 4294967295U } },
|
|
|
},
|
|
|
+ {
|
|
|
+ "ALU_ADD_X: 2 + 4294967294 = 0",
|
|
|
+ .u.insns_int = {
|
|
|
+ BPF_LD_IMM64(R0, 2),
|
|
|
+ BPF_LD_IMM64(R1, 4294967294U),
|
|
|
+ BPF_ALU32_REG(BPF_ADD, R0, R1),
|
|
|
+ BPF_JMP_IMM(BPF_JEQ, R0, 0, 2),
|
|
|
+ BPF_ALU32_IMM(BPF_MOV, R0, 0),
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
+ BPF_ALU32_IMM(BPF_MOV, R0, 1),
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
+ },
|
|
|
+ INTERNAL,
|
|
|
+ { },
|
|
|
+ { { 0, 1 } },
|
|
|
+ },
|
|
|
{
|
|
|
"ALU64_ADD_X: 1 + 2 = 3",
|
|
|
.u.insns_int = {
|
|
@@ -2467,6 +2483,23 @@ static struct bpf_test tests[] = {
|
|
|
{ },
|
|
|
{ { 0, 4294967295U } },
|
|
|
},
|
|
|
+ {
|
|
|
+ "ALU64_ADD_X: 2 + 4294967294 = 4294967296",
|
|
|
+ .u.insns_int = {
|
|
|
+ BPF_LD_IMM64(R0, 2),
|
|
|
+ BPF_LD_IMM64(R1, 4294967294U),
|
|
|
+ BPF_LD_IMM64(R2, 4294967296ULL),
|
|
|
+ BPF_ALU64_REG(BPF_ADD, R0, R1),
|
|
|
+ BPF_JMP_REG(BPF_JEQ, R0, R2, 2),
|
|
|
+ BPF_MOV32_IMM(R0, 0),
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
+ BPF_MOV32_IMM(R0, 1),
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
+ },
|
|
|
+ INTERNAL,
|
|
|
+ { },
|
|
|
+ { { 0, 1 } },
|
|
|
+ },
|
|
|
/* BPF_ALU | BPF_ADD | BPF_K */
|
|
|
{
|
|
|
"ALU_ADD_K: 1 + 2 = 3",
|
|
@@ -2501,6 +2534,21 @@ static struct bpf_test tests[] = {
|
|
|
{ },
|
|
|
{ { 0, 4294967295U } },
|
|
|
},
|
|
|
+ {
|
|
|
+ "ALU_ADD_K: 4294967294 + 2 = 0",
|
|
|
+ .u.insns_int = {
|
|
|
+ BPF_LD_IMM64(R0, 4294967294U),
|
|
|
+ BPF_ALU32_IMM(BPF_ADD, R0, 2),
|
|
|
+ BPF_JMP_IMM(BPF_JEQ, R0, 0, 2),
|
|
|
+ BPF_ALU32_IMM(BPF_MOV, R0, 0),
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
+ BPF_ALU32_IMM(BPF_MOV, R0, 1),
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
+ },
|
|
|
+ INTERNAL,
|
|
|
+ { },
|
|
|
+ { { 0, 1 } },
|
|
|
+ },
|
|
|
{
|
|
|
"ALU_ADD_K: 0 + (-1) = 0x00000000ffffffff",
|
|
|
.u.insns_int = {
|
|
@@ -2517,6 +2565,70 @@ static struct bpf_test tests[] = {
|
|
|
{ },
|
|
|
{ { 0, 0x1 } },
|
|
|
},
|
|
|
+ {
|
|
|
+ "ALU_ADD_K: 0 + 0xffff = 0xffff",
|
|
|
+ .u.insns_int = {
|
|
|
+ BPF_LD_IMM64(R2, 0x0),
|
|
|
+ BPF_LD_IMM64(R3, 0xffff),
|
|
|
+ BPF_ALU32_IMM(BPF_ADD, R2, 0xffff),
|
|
|
+ BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
|
|
|
+ BPF_MOV32_IMM(R0, 2),
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
+ BPF_MOV32_IMM(R0, 1),
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
+ },
|
|
|
+ INTERNAL,
|
|
|
+ { },
|
|
|
+ { { 0, 0x1 } },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "ALU_ADD_K: 0 + 0x7fffffff = 0x7fffffff",
|
|
|
+ .u.insns_int = {
|
|
|
+ BPF_LD_IMM64(R2, 0x0),
|
|
|
+ BPF_LD_IMM64(R3, 0x7fffffff),
|
|
|
+ BPF_ALU32_IMM(BPF_ADD, R2, 0x7fffffff),
|
|
|
+ BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
|
|
|
+ BPF_MOV32_IMM(R0, 2),
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
+ BPF_MOV32_IMM(R0, 1),
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
+ },
|
|
|
+ INTERNAL,
|
|
|
+ { },
|
|
|
+ { { 0, 0x1 } },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "ALU_ADD_K: 0 + 0x80000000 = 0x80000000",
|
|
|
+ .u.insns_int = {
|
|
|
+ BPF_LD_IMM64(R2, 0x0),
|
|
|
+ BPF_LD_IMM64(R3, 0x80000000),
|
|
|
+ BPF_ALU32_IMM(BPF_ADD, R2, 0x80000000),
|
|
|
+ BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
|
|
|
+ BPF_MOV32_IMM(R0, 2),
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
+ BPF_MOV32_IMM(R0, 1),
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
+ },
|
|
|
+ INTERNAL,
|
|
|
+ { },
|
|
|
+ { { 0, 0x1 } },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "ALU_ADD_K: 0 + 0x80008000 = 0x80008000",
|
|
|
+ .u.insns_int = {
|
|
|
+ BPF_LD_IMM64(R2, 0x0),
|
|
|
+ BPF_LD_IMM64(R3, 0x80008000),
|
|
|
+ BPF_ALU32_IMM(BPF_ADD, R2, 0x80008000),
|
|
|
+ BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
|
|
|
+ BPF_MOV32_IMM(R0, 2),
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
+ BPF_MOV32_IMM(R0, 1),
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
+ },
|
|
|
+ INTERNAL,
|
|
|
+ { },
|
|
|
+ { { 0, 0x1 } },
|
|
|
+ },
|
|
|
{
|
|
|
"ALU64_ADD_K: 1 + 2 = 3",
|
|
|
.u.insns_int = {
|
|
@@ -2550,6 +2662,22 @@ static struct bpf_test tests[] = {
|
|
|
{ },
|
|
|
{ { 0, 2147483647 } },
|
|
|
},
|
|
|
+ {
|
|
|
+ "ALU64_ADD_K: 4294967294 + 2 = 4294967296",
|
|
|
+ .u.insns_int = {
|
|
|
+ BPF_LD_IMM64(R0, 4294967294U),
|
|
|
+ BPF_LD_IMM64(R1, 4294967296ULL),
|
|
|
+ BPF_ALU64_IMM(BPF_ADD, R0, 2),
|
|
|
+ BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
|
|
|
+ BPF_ALU32_IMM(BPF_MOV, R0, 0),
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
+ BPF_ALU32_IMM(BPF_MOV, R0, 1),
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
+ },
|
|
|
+ INTERNAL,
|
|
|
+ { },
|
|
|
+ { { 0, 1 } },
|
|
|
+ },
|
|
|
{
|
|
|
"ALU64_ADD_K: 2147483646 + -2147483647 = -1",
|
|
|
.u.insns_int = {
|
|
@@ -2593,6 +2721,70 @@ static struct bpf_test tests[] = {
|
|
|
{ },
|
|
|
{ { 0, 0x1 } },
|
|
|
},
|
|
|
+ {
|
|
|
+ "ALU64_ADD_K: 0 + 0xffff = 0xffff",
|
|
|
+ .u.insns_int = {
|
|
|
+ BPF_LD_IMM64(R2, 0x0),
|
|
|
+ BPF_LD_IMM64(R3, 0xffff),
|
|
|
+ BPF_ALU64_IMM(BPF_ADD, R2, 0xffff),
|
|
|
+ BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
|
|
|
+ BPF_MOV32_IMM(R0, 2),
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
+ BPF_MOV32_IMM(R0, 1),
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
+ },
|
|
|
+ INTERNAL,
|
|
|
+ { },
|
|
|
+ { { 0, 0x1 } },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "ALU64_ADD_K: 0 + 0x7fffffff = 0x7fffffff",
|
|
|
+ .u.insns_int = {
|
|
|
+ BPF_LD_IMM64(R2, 0x0),
|
|
|
+ BPF_LD_IMM64(R3, 0x7fffffff),
|
|
|
+ BPF_ALU64_IMM(BPF_ADD, R2, 0x7fffffff),
|
|
|
+ BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
|
|
|
+ BPF_MOV32_IMM(R0, 2),
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
+ BPF_MOV32_IMM(R0, 1),
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
+ },
|
|
|
+ INTERNAL,
|
|
|
+ { },
|
|
|
+ { { 0, 0x1 } },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "ALU64_ADD_K: 0 + 0x80000000 = 0xffffffff80000000",
|
|
|
+ .u.insns_int = {
|
|
|
+ BPF_LD_IMM64(R2, 0x0),
|
|
|
+ BPF_LD_IMM64(R3, 0xffffffff80000000LL),
|
|
|
+ BPF_ALU64_IMM(BPF_ADD, R2, 0x80000000),
|
|
|
+ BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
|
|
|
+ BPF_MOV32_IMM(R0, 2),
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
+ BPF_MOV32_IMM(R0, 1),
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
+ },
|
|
|
+ INTERNAL,
|
|
|
+ { },
|
|
|
+ { { 0, 0x1 } },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "ALU_ADD_K: 0 + 0x80008000 = 0xffffffff80008000",
|
|
|
+ .u.insns_int = {
|
|
|
+ BPF_LD_IMM64(R2, 0x0),
|
|
|
+ BPF_LD_IMM64(R3, 0xffffffff80008000LL),
|
|
|
+ BPF_ALU64_IMM(BPF_ADD, R2, 0x80008000),
|
|
|
+ BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
|
|
|
+ BPF_MOV32_IMM(R0, 2),
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
+ BPF_MOV32_IMM(R0, 1),
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
+ },
|
|
|
+ INTERNAL,
|
|
|
+ { },
|
|
|
+ { { 0, 0x1 } },
|
|
|
+ },
|
|
|
/* BPF_ALU | BPF_SUB | BPF_X */
|
|
|
{
|
|
|
"ALU_SUB_X: 3 - 1 = 2",
|
|
@@ -4222,6 +4414,20 @@ static struct bpf_test tests[] = {
|
|
|
{ },
|
|
|
{ { 0, 1 } },
|
|
|
},
|
|
|
+ {
|
|
|
+ "JMP_JGT_K: Unsigned jump: if (-1 > 1) return 1",
|
|
|
+ .u.insns_int = {
|
|
|
+ BPF_ALU32_IMM(BPF_MOV, R0, 0),
|
|
|
+ BPF_LD_IMM64(R1, -1),
|
|
|
+ BPF_JMP_IMM(BPF_JGT, R1, 1, 1),
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
+ BPF_ALU32_IMM(BPF_MOV, R0, 1),
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
+ },
|
|
|
+ INTERNAL,
|
|
|
+ { },
|
|
|
+ { { 0, 1 } },
|
|
|
+ },
|
|
|
/* BPF_JMP | BPF_JGE | BPF_K */
|
|
|
{
|
|
|
"JMP_JGE_K: if (3 >= 2) return 1",
|
|
@@ -4303,7 +4509,7 @@ static struct bpf_test tests[] = {
|
|
|
.u.insns_int = {
|
|
|
BPF_ALU32_IMM(BPF_MOV, R0, 0),
|
|
|
BPF_LD_IMM64(R1, 3),
|
|
|
- BPF_JMP_IMM(BPF_JNE, R1, 2, 1),
|
|
|
+ BPF_JMP_IMM(BPF_JSET, R1, 2, 1),
|
|
|
BPF_EXIT_INSN(),
|
|
|
BPF_ALU32_IMM(BPF_MOV, R0, 1),
|
|
|
BPF_EXIT_INSN(),
|
|
@@ -4317,7 +4523,7 @@ static struct bpf_test tests[] = {
|
|
|
.u.insns_int = {
|
|
|
BPF_ALU32_IMM(BPF_MOV, R0, 0),
|
|
|
BPF_LD_IMM64(R1, 3),
|
|
|
- BPF_JMP_IMM(BPF_JNE, R1, 0xffffffff, 1),
|
|
|
+ BPF_JMP_IMM(BPF_JSET, R1, 0xffffffff, 1),
|
|
|
BPF_EXIT_INSN(),
|
|
|
BPF_ALU32_IMM(BPF_MOV, R0, 1),
|
|
|
BPF_EXIT_INSN(),
|
|
@@ -4404,6 +4610,21 @@ static struct bpf_test tests[] = {
|
|
|
{ },
|
|
|
{ { 0, 1 } },
|
|
|
},
|
|
|
+ {
|
|
|
+ "JMP_JGT_X: Unsigned jump: if (-1 > 1) return 1",
|
|
|
+ .u.insns_int = {
|
|
|
+ BPF_ALU32_IMM(BPF_MOV, R0, 0),
|
|
|
+ BPF_LD_IMM64(R1, -1),
|
|
|
+ BPF_LD_IMM64(R2, 1),
|
|
|
+ BPF_JMP_REG(BPF_JGT, R1, R2, 1),
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
+ BPF_ALU32_IMM(BPF_MOV, R0, 1),
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
+ },
|
|
|
+ INTERNAL,
|
|
|
+ { },
|
|
|
+ { { 0, 1 } },
|
|
|
+ },
|
|
|
/* BPF_JMP | BPF_JGE | BPF_X */
|
|
|
{
|
|
|
"JMP_JGE_X: if (3 >= 2) return 1",
|
|
@@ -4474,7 +4695,7 @@ static struct bpf_test tests[] = {
|
|
|
BPF_ALU32_IMM(BPF_MOV, R0, 0),
|
|
|
BPF_LD_IMM64(R1, 3),
|
|
|
BPF_LD_IMM64(R2, 2),
|
|
|
- BPF_JMP_REG(BPF_JNE, R1, R2, 1),
|
|
|
+ BPF_JMP_REG(BPF_JSET, R1, R2, 1),
|
|
|
BPF_EXIT_INSN(),
|
|
|
BPF_ALU32_IMM(BPF_MOV, R0, 1),
|
|
|
BPF_EXIT_INSN(),
|
|
@@ -4489,7 +4710,7 @@ static struct bpf_test tests[] = {
|
|
|
BPF_ALU32_IMM(BPF_MOV, R0, 0),
|
|
|
BPF_LD_IMM64(R1, 3),
|
|
|
BPF_LD_IMM64(R2, 0xffffffff),
|
|
|
- BPF_JMP_REG(BPF_JNE, R1, R2, 1),
|
|
|
+ BPF_JMP_REG(BPF_JSET, R1, R2, 1),
|
|
|
BPF_EXIT_INSN(),
|
|
|
BPF_ALU32_IMM(BPF_MOV, R0, 1),
|
|
|
BPF_EXIT_INSN(),
|