1 /* Just make sure that JITs used udiv/umod as otherwise we get
2  * an exception from INT_MIN/-1 overflow similarly as with div
3  * by zero.
4  */
5 {
6 	"DIV32 overflow, check 1",
7 	.insns = {
8 	BPF_MOV32_IMM(BPF_REG_1, -1),
9 	BPF_MOV32_IMM(BPF_REG_0, INT_MIN),
10 	BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_1),
11 	BPF_EXIT_INSN(),
12 	},
13 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
14 	.result = ACCEPT,
15 	.retval = 0,
16 },
17 {
18 	"DIV32 overflow, check 2",
19 	.insns = {
20 	BPF_MOV32_IMM(BPF_REG_0, INT_MIN),
21 	BPF_ALU32_IMM(BPF_DIV, BPF_REG_0, -1),
22 	BPF_EXIT_INSN(),
23 	},
24 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
25 	.result = ACCEPT,
26 	.retval = 0,
27 },
28 {
29 	"DIV64 overflow, check 1",
30 	.insns = {
31 	BPF_MOV64_IMM(BPF_REG_1, -1),
32 	BPF_LD_IMM64(BPF_REG_2, LLONG_MIN),
33 	BPF_ALU64_REG(BPF_DIV, BPF_REG_2, BPF_REG_1),
34 	BPF_MOV32_IMM(BPF_REG_0, 0),
35 	BPF_JMP_REG(BPF_JEQ, BPF_REG_0, BPF_REG_2, 1),
36 	BPF_MOV32_IMM(BPF_REG_0, 1),
37 	BPF_EXIT_INSN(),
38 	},
39 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
40 	.result = ACCEPT,
41 	.retval = 0,
42 },
43 {
44 	"DIV64 overflow, check 2",
45 	.insns = {
46 	BPF_LD_IMM64(BPF_REG_1, LLONG_MIN),
47 	BPF_ALU64_IMM(BPF_DIV, BPF_REG_1, -1),
48 	BPF_MOV32_IMM(BPF_REG_0, 0),
49 	BPF_JMP_REG(BPF_JEQ, BPF_REG_0, BPF_REG_1, 1),
50 	BPF_MOV32_IMM(BPF_REG_0, 1),
51 	BPF_EXIT_INSN(),
52 	},
53 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
54 	.result = ACCEPT,
55 	.retval = 0,
56 },
57 {
58 	"MOD32 overflow, check 1",
59 	.insns = {
60 	BPF_MOV32_IMM(BPF_REG_1, -1),
61 	BPF_MOV32_IMM(BPF_REG_0, INT_MIN),
62 	BPF_ALU32_REG(BPF_MOD, BPF_REG_0, BPF_REG_1),
63 	BPF_EXIT_INSN(),
64 	},
65 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
66 	.result = ACCEPT,
67 	.retval = INT_MIN,
68 },
69 {
70 	"MOD32 overflow, check 2",
71 	.insns = {
72 	BPF_MOV32_IMM(BPF_REG_0, INT_MIN),
73 	BPF_ALU32_IMM(BPF_MOD, BPF_REG_0, -1),
74 	BPF_EXIT_INSN(),
75 	},
76 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
77 	.result = ACCEPT,
78 	.retval = INT_MIN,
79 },
80 {
81 	"MOD64 overflow, check 1",
82 	.insns = {
83 	BPF_MOV64_IMM(BPF_REG_1, -1),
84 	BPF_LD_IMM64(BPF_REG_2, LLONG_MIN),
85 	BPF_MOV64_REG(BPF_REG_3, BPF_REG_2),
86 	BPF_ALU64_REG(BPF_MOD, BPF_REG_2, BPF_REG_1),
87 	BPF_MOV32_IMM(BPF_REG_0, 0),
88 	BPF_JMP_REG(BPF_JNE, BPF_REG_3, BPF_REG_2, 1),
89 	BPF_MOV32_IMM(BPF_REG_0, 1),
90 	BPF_EXIT_INSN(),
91 	},
92 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
93 	.result = ACCEPT,
94 	.retval = 1,
95 },
96 {
97 	"MOD64 overflow, check 2",
98 	.insns = {
99 	BPF_LD_IMM64(BPF_REG_2, LLONG_MIN),
100 	BPF_MOV64_REG(BPF_REG_3, BPF_REG_2),
101 	BPF_ALU64_IMM(BPF_MOD, BPF_REG_2, -1),
102 	BPF_MOV32_IMM(BPF_REG_0, 0),
103 	BPF_JMP_REG(BPF_JNE, BPF_REG_3, BPF_REG_2, 1),
104 	BPF_MOV32_IMM(BPF_REG_0, 1),
105 	BPF_EXIT_INSN(),
106 	},
107 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
108 	.result = ACCEPT,
109 	.retval = 1,
110 },
111