1 // SPDX-License-Identifier: GPL-2.0 2 3 #include <linux/bpf.h> 4 #include <bpf/bpf_helpers.h> 5 #include "bpf_misc.h" 6 7 SEC("socket") 8 __description("check deducing bounds from non-const, jmp64, <non_const> == <const>, 1") 9 __success __retval(0) 10 __naked void deducing_bounds_from_non_const_1(void) 11 { 12 asm volatile (" \ 13 call %[bpf_ktime_get_ns]; \ 14 if r0 < 3 goto l0_%=; \ 15 r2 = 2; \ 16 if r0 == r2 goto l1_%=; \ 17 l0_%=: \ 18 r0 = 0; \ 19 exit; \ 20 l1_%=: \ 21 r0 -= r1; \ 22 exit; \ 23 " : 24 : __imm(bpf_ktime_get_ns) 25 : __clobber_all); 26 } 27 28 SEC("socket") 29 __description("check deducing bounds from non-const, jmp64, <non_const> == <const>, 2") 30 __success __retval(0) 31 __naked void deducing_bounds_from_non_const_2(void) 32 { 33 asm volatile (" \ 34 call %[bpf_ktime_get_ns]; \ 35 if r0 > 3 goto l0_%=; \ 36 r2 = 4; \ 37 if r0 == r2 goto l1_%=; \ 38 l0_%=: \ 39 r0 = 0; \ 40 exit; \ 41 l1_%=: \ 42 r0 -= r1; \ 43 exit; \ 44 " : 45 : __imm(bpf_ktime_get_ns) 46 : __clobber_all); 47 } 48 49 SEC("socket") 50 __description("check deducing bounds from non-const, jmp64, <non_const> != <const>, 1") 51 __success __retval(0) 52 __naked void deducing_bounds_from_non_const_3(void) 53 { 54 asm volatile (" \ 55 call %[bpf_ktime_get_ns]; \ 56 if r0 < 3 goto l0_%=; \ 57 r2 = 2; \ 58 if r0 != r2 goto l0_%=; \ 59 goto l1_%=; \ 60 l0_%=: \ 61 r0 = 0; \ 62 exit; \ 63 l1_%=: \ 64 r0 -= r1; \ 65 exit; \ 66 " : 67 : __imm(bpf_ktime_get_ns) 68 : __clobber_all); 69 } 70 71 SEC("socket") 72 __description("check deducing bounds from non-const, jmp64, <non_const> != <const>, 2") 73 __success __retval(0) 74 __naked void deducing_bounds_from_non_const_4(void) 75 { 76 asm volatile (" \ 77 call %[bpf_ktime_get_ns]; \ 78 if r0 > 3 goto l0_%=; \ 79 r2 = 4; \ 80 if r0 != r2 goto l0_%=; \ 81 goto l1_%=; \ 82 l0_%=: \ 83 r0 = 0; \ 84 exit; \ 85 l1_%=: \ 86 r0 -= r1; \ 87 exit; \ 88 " : 89 : __imm(bpf_ktime_get_ns) 90 : __clobber_all); 91 } 92 93 SEC("socket") 94 __description("check deducing bounds from non-const, jmp32, <non_const> == <const>, 1") 95 __success __retval(0) 96 __naked void deducing_bounds_from_non_const_5(void) 97 { 98 asm volatile (" \ 99 call %[bpf_ktime_get_ns]; \ 100 if w0 < 4 goto l0_%=; \ 101 w2 = 3; \ 102 if w0 == w2 goto l1_%=; \ 103 l0_%=: \ 104 r0 = 0; \ 105 exit; \ 106 l1_%=: \ 107 r0 -= r1; \ 108 exit; \ 109 " : 110 : __imm(bpf_ktime_get_ns) 111 : __clobber_all); 112 } 113 114 SEC("socket") 115 __description("check deducing bounds from non-const, jmp32, <non_const> == <const>, 2") 116 __success __retval(0) 117 __naked void deducing_bounds_from_non_const_6(void) 118 { 119 asm volatile (" \ 120 call %[bpf_ktime_get_ns]; \ 121 if w0 > 4 goto l0_%=; \ 122 w2 = 5; \ 123 if w0 == w2 goto l1_%=; \ 124 l0_%=: \ 125 r0 = 0; \ 126 exit; \ 127 l1_%=: \ 128 r0 -= r1; \ 129 exit; \ 130 " : 131 : __imm(bpf_ktime_get_ns) 132 : __clobber_all); 133 } 134 135 SEC("socket") 136 __description("check deducing bounds from non-const, jmp32, <non_const> != <const>, 1") 137 __success __retval(0) 138 __naked void deducing_bounds_from_non_const_7(void) 139 { 140 asm volatile (" \ 141 call %[bpf_ktime_get_ns]; \ 142 if w0 < 3 goto l0_%=; \ 143 w2 = 2; \ 144 if w0 != w2 goto l0_%=; \ 145 goto l1_%=; \ 146 l0_%=: \ 147 r0 = 0; \ 148 exit; \ 149 l1_%=: \ 150 r0 -= r1; \ 151 exit; \ 152 " : 153 : __imm(bpf_ktime_get_ns) 154 : __clobber_all); 155 } 156 157 SEC("socket") 158 __description("check deducing bounds from non-const, jmp32, <non_const> != <const>, 2") 159 __success __retval(0) 160 __naked void deducing_bounds_from_non_const_8(void) 161 { 162 asm volatile (" \ 163 call %[bpf_ktime_get_ns]; \ 164 if w0 > 3 goto l0_%=; \ 165 w2 = 4; \ 166 if w0 != w2 goto l0_%=; \ 167 goto l1_%=; \ 168 l0_%=: \ 169 r0 = 0; \ 170 exit; \ 171 l1_%=: \ 172 r0 -= r1; \ 173 exit; \ 174 " : 175 : __imm(bpf_ktime_get_ns) 176 : __clobber_all); 177 } 178 179 SEC("socket") 180 __description("check deducing bounds from non-const, jmp64, <const> > <non_const>, 1") 181 __success __retval(0) 182 __naked void deducing_bounds_from_non_const_9(void) 183 { 184 asm volatile (" \ 185 call %[bpf_ktime_get_ns]; \ 186 r2 = 0; \ 187 if r2 > r0 goto l0_%=; \ 188 r0 = 0; \ 189 exit; \ 190 l0_%=: \ 191 r0 -= r1; \ 192 exit; \ 193 " : 194 : __imm(bpf_ktime_get_ns) 195 : __clobber_all); 196 } 197 198 SEC("socket") 199 __description("check deducing bounds from non-const, jmp64, <const> > <non_const>, 2") 200 __success __retval(0) 201 __naked void deducing_bounds_from_non_const_10(void) 202 { 203 asm volatile (" \ 204 call %[bpf_ktime_get_ns]; \ 205 if r0 < 4 goto l0_%=; \ 206 r2 = 4; \ 207 if r2 > r0 goto l1_%=; \ 208 l0_%=: \ 209 r0 = 0; \ 210 exit; \ 211 l1_%=: \ 212 r0 -= r1; \ 213 exit; \ 214 " : 215 : __imm(bpf_ktime_get_ns) 216 : __clobber_all); 217 } 218 219 SEC("socket") 220 __description("check deducing bounds from non-const, jmp64, <const> >= <non_const>") 221 __success __retval(0) 222 __naked void deducing_bounds_from_non_const_11(void) 223 { 224 asm volatile (" \ 225 call %[bpf_ktime_get_ns]; \ 226 if r0 < 4 goto l0_%=; \ 227 r2 = 3; \ 228 if r2 >= r0 goto l1_%=; \ 229 l0_%=: \ 230 r0 = 0; \ 231 exit; \ 232 l1_%=: \ 233 r0 -= r1; \ 234 exit; \ 235 " : 236 : __imm(bpf_ktime_get_ns) 237 : __clobber_all); 238 } 239 240 SEC("socket") 241 __description("check deducing bounds from non-const, jmp64, <const> < <non_const>") 242 __success __retval(0) 243 __naked void deducing_bounds_from_non_const_12(void) 244 { 245 asm volatile (" \ 246 call %[bpf_ktime_get_ns]; \ 247 if r0 > 4 goto l0_%=; \ 248 r2 = 4; \ 249 if r2 < r0 goto l1_%=; \ 250 l0_%=: \ 251 r0 = 0; \ 252 exit; \ 253 l1_%=: \ 254 r0 -= r1; \ 255 exit; \ 256 " : 257 : __imm(bpf_ktime_get_ns) 258 : __clobber_all); 259 } 260 261 SEC("socket") 262 __description("check deducing bounds from non-const, jmp64, <const> <= <non_const>") 263 __success __retval(0) 264 __naked void deducing_bounds_from_non_const_13(void) 265 { 266 asm volatile (" \ 267 call %[bpf_ktime_get_ns]; \ 268 if r0 >= 4 goto l0_%=; \ 269 r2 = 4; \ 270 if r2 <= r0 goto l1_%=; \ 271 l0_%=: \ 272 r0 = 0; \ 273 exit; \ 274 l1_%=: \ 275 r0 -= r1; \ 276 exit; \ 277 " : 278 : __imm(bpf_ktime_get_ns) 279 : __clobber_all); 280 } 281 282 SEC("socket") 283 __description("check deducing bounds from non-const, jmp64, <const> == <non_const>") 284 __success __retval(0) 285 __naked void deducing_bounds_from_non_const_14(void) 286 { 287 asm volatile (" \ 288 call %[bpf_ktime_get_ns]; \ 289 if r0 < 3 goto l0_%=; \ 290 r2 = 2; \ 291 if r2 == r0 goto l1_%=; \ 292 l0_%=: \ 293 r0 = 0; \ 294 exit; \ 295 l1_%=: \ 296 r0 -= r1; \ 297 exit; \ 298 " : 299 : __imm(bpf_ktime_get_ns) 300 : __clobber_all); 301 } 302 303 SEC("socket") 304 __description("check deducing bounds from non-const, jmp64, <const> s> <non_const>") 305 __success __retval(0) 306 __naked void deducing_bounds_from_non_const_15(void) 307 { 308 asm volatile (" \ 309 call %[bpf_ktime_get_ns]; \ 310 if r0 s< 4 goto l0_%=; \ 311 r2 = 4; \ 312 if r2 s> r0 goto l1_%=; \ 313 l0_%=: \ 314 r0 = 0; \ 315 exit; \ 316 l1_%=: \ 317 r0 -= r1; \ 318 exit; \ 319 " : 320 : __imm(bpf_ktime_get_ns) 321 : __clobber_all); 322 } 323 324 SEC("socket") 325 __description("check deducing bounds from non-const, jmp64, <const> s>= <non_const>") 326 __success __retval(0) 327 __naked void deducing_bounds_from_non_const_16(void) 328 { 329 asm volatile (" \ 330 call %[bpf_ktime_get_ns]; \ 331 if r0 s< 4 goto l0_%=; \ 332 r2 = 3; \ 333 if r2 s>= r0 goto l1_%=; \ 334 l0_%=: \ 335 r0 = 0; \ 336 exit; \ 337 l1_%=: \ 338 r0 -= r1; \ 339 exit; \ 340 " : 341 : __imm(bpf_ktime_get_ns) 342 : __clobber_all); 343 } 344 345 SEC("socket") 346 __description("check deducing bounds from non-const, jmp64, <const> s< <non_const>") 347 __success __retval(0) 348 __naked void deducing_bounds_from_non_const_17(void) 349 { 350 asm volatile (" \ 351 call %[bpf_ktime_get_ns]; \ 352 if r0 s> 4 goto l0_%=; \ 353 r2 = 4; \ 354 if r2 s< r0 goto l1_%=; \ 355 l0_%=: \ 356 r0 = 0; \ 357 exit; \ 358 l1_%=: \ 359 r0 -= r1; \ 360 exit; \ 361 " : 362 : __imm(bpf_ktime_get_ns) 363 : __clobber_all); 364 } 365 366 SEC("socket") 367 __description("check deducing bounds from non-const, jmp64, <const> s<= <non_const>") 368 __success __retval(0) 369 __naked void deducing_bounds_from_non_const_18(void) 370 { 371 asm volatile (" \ 372 call %[bpf_ktime_get_ns]; \ 373 if r0 s> 4 goto l0_%=; \ 374 r2 = 5; \ 375 if r2 s<= r0 goto l1_%=; \ 376 l0_%=: \ 377 r0 = 0; \ 378 exit; \ 379 l1_%=: \ 380 r0 -= r1; \ 381 exit; \ 382 " : 383 : __imm(bpf_ktime_get_ns) 384 : __clobber_all); 385 } 386 387 SEC("socket") 388 __description("check deducing bounds from non-const, jmp64, <const> != <non_const>") 389 __success __retval(0) 390 __naked void deducing_bounds_from_non_const_19(void) 391 { 392 asm volatile (" \ 393 call %[bpf_ktime_get_ns]; \ 394 if r0 < 3 goto l0_%=; \ 395 r2 = 2; \ 396 if r2 != r0 goto l0_%=; \ 397 goto l1_%=; \ 398 l0_%=: \ 399 r0 = 0; \ 400 exit; \ 401 l1_%=: \ 402 r0 -= r1; \ 403 exit; \ 404 " : 405 : __imm(bpf_ktime_get_ns) 406 : __clobber_all); 407 } 408 409 SEC("socket") 410 __description("check deducing bounds from non-const, jmp32, <const> > <non_const>, 1") 411 __success __retval(0) 412 __naked void deducing_bounds_from_non_const_20(void) 413 { 414 asm volatile (" \ 415 call %[bpf_ktime_get_ns]; \ 416 w2 = 0; \ 417 if w2 > w0 goto l0_%=; \ 418 r0 = 0; \ 419 exit; \ 420 l0_%=: \ 421 r0 -= r1; \ 422 exit; \ 423 " : 424 : __imm(bpf_ktime_get_ns) 425 : __clobber_all); 426 } 427 428 SEC("socket") 429 __description("check deducing bounds from non-const, jmp32, <const> > <non_const>, 2") 430 __success __retval(0) 431 __naked void deducing_bounds_from_non_const_21(void) 432 { 433 asm volatile (" \ 434 call %[bpf_ktime_get_ns]; \ 435 if w0 < 4 goto l0_%=; \ 436 w2 = 4; \ 437 if w2 > w0 goto l1_%=; \ 438 l0_%=: \ 439 r0 = 0; \ 440 exit; \ 441 l1_%=: \ 442 r0 -= r1; \ 443 exit; \ 444 " : 445 : __imm(bpf_ktime_get_ns) 446 : __clobber_all); 447 } 448 449 SEC("socket") 450 __description("check deducing bounds from non-const, jmp32, <const> >= <non_const>") 451 __success __retval(0) 452 __naked void deducing_bounds_from_non_const_22(void) 453 { 454 asm volatile (" \ 455 call %[bpf_ktime_get_ns]; \ 456 if w0 < 4 goto l0_%=; \ 457 w2 = 3; \ 458 if w2 >= w0 goto l1_%=; \ 459 l0_%=: \ 460 r0 = 0; \ 461 exit; \ 462 l1_%=: \ 463 r0 -= r1; \ 464 exit; \ 465 " : 466 : __imm(bpf_ktime_get_ns) 467 : __clobber_all); 468 } 469 470 SEC("socket") 471 __description("check deducing bounds from non-const, jmp32, <const> < <non_const>") 472 __success __retval(0) 473 __naked void deducing_bounds_from_non_const_23(void) 474 { 475 asm volatile (" \ 476 call %[bpf_ktime_get_ns]; \ 477 if w0 > 4 goto l0_%=; \ 478 w2 = 4; \ 479 if w2 < w0 goto l1_%=; \ 480 l0_%=: \ 481 r0 = 0; \ 482 exit; \ 483 l1_%=: \ 484 r0 -= r1; \ 485 exit; \ 486 " : 487 : __imm(bpf_ktime_get_ns) 488 : __clobber_all); 489 } 490 491 SEC("socket") 492 __description("check deducing bounds from non-const, jmp32, <const> <= <non_const>") 493 __success __retval(0) 494 __naked void deducing_bounds_from_non_const_24(void) 495 { 496 asm volatile (" \ 497 call %[bpf_ktime_get_ns]; \ 498 if w0 >= 4 goto l0_%=; \ 499 w2 = 4; \ 500 if w2 <= w0 goto l1_%=; \ 501 l0_%=: \ 502 r0 = 0; \ 503 exit; \ 504 l1_%=: \ 505 r0 -= r1; \ 506 exit; \ 507 " : 508 : __imm(bpf_ktime_get_ns) 509 : __clobber_all); 510 } 511 512 SEC("socket") 513 __description("check deducing bounds from non-const, jmp32, <const> == <non_const>") 514 __success __retval(0) 515 __naked void deducing_bounds_from_non_const_25(void) 516 { 517 asm volatile (" \ 518 call %[bpf_ktime_get_ns]; \ 519 if w0 < 4 goto l0_%=; \ 520 w2 = 3; \ 521 if w2 == w0 goto l1_%=; \ 522 l0_%=: \ 523 r0 = 0; \ 524 exit; \ 525 l1_%=: \ 526 r0 -= r1; \ 527 exit; \ 528 " : 529 : __imm(bpf_ktime_get_ns) 530 : __clobber_all); 531 } 532 533 SEC("socket") 534 __description("check deducing bounds from non-const, jmp32, <const> s> <non_const>") 535 __success __retval(0) 536 __naked void deducing_bounds_from_non_const_26(void) 537 { 538 asm volatile (" \ 539 call %[bpf_ktime_get_ns]; \ 540 if w0 s< 4 goto l0_%=; \ 541 w2 = 4; \ 542 if w2 s> w0 goto l1_%=; \ 543 l0_%=: \ 544 r0 = 0; \ 545 exit; \ 546 l1_%=: \ 547 r0 -= r1; \ 548 exit; \ 549 " : 550 : __imm(bpf_ktime_get_ns) 551 : __clobber_all); 552 } 553 554 SEC("socket") 555 __description("check deducing bounds from non-const, jmp32, <const> s>= <non_const>") 556 __success __retval(0) 557 __naked void deducing_bounds_from_non_const_27(void) 558 { 559 asm volatile (" \ 560 call %[bpf_ktime_get_ns]; \ 561 if w0 s< 4 goto l0_%=; \ 562 w2 = 3; \ 563 if w2 s>= w0 goto l1_%=; \ 564 l0_%=: \ 565 r0 = 0; \ 566 exit; \ 567 l1_%=: \ 568 r0 -= r1; \ 569 exit; \ 570 " : 571 : __imm(bpf_ktime_get_ns) 572 : __clobber_all); 573 } 574 575 SEC("socket") 576 __description("check deducing bounds from non-const, jmp32, <const> s< <non_const>") 577 __success __retval(0) 578 __naked void deducing_bounds_from_non_const_28(void) 579 { 580 asm volatile (" \ 581 call %[bpf_ktime_get_ns]; \ 582 if w0 s> 4 goto l0_%=; \ 583 w2 = 5; \ 584 if w2 s< w0 goto l1_%=; \ 585 l0_%=: \ 586 r0 = 0; \ 587 exit; \ 588 l1_%=: \ 589 r0 -= r1; \ 590 exit; \ 591 " : 592 : __imm(bpf_ktime_get_ns) 593 : __clobber_all); 594 } 595 596 SEC("socket") 597 __description("check deducing bounds from non-const, jmp32, <const> s<= <non_const>") 598 __success __retval(0) 599 __naked void deducing_bounds_from_non_const_29(void) 600 { 601 asm volatile (" \ 602 call %[bpf_ktime_get_ns]; \ 603 if w0 s>= 4 goto l0_%=; \ 604 w2 = 4; \ 605 if w2 s<= w0 goto l1_%=; \ 606 l0_%=: \ 607 r0 = 0; \ 608 exit; \ 609 l1_%=: \ 610 r0 -= r1; \ 611 exit; \ 612 " : 613 : __imm(bpf_ktime_get_ns) 614 : __clobber_all); 615 } 616 617 SEC("socket") 618 __description("check deducing bounds from non-const, jmp32, <const> != <non_const>") 619 __success __retval(0) 620 __naked void deducing_bounds_from_non_const_30(void) 621 { 622 asm volatile (" \ 623 call %[bpf_ktime_get_ns]; \ 624 if w0 < 3 goto l0_%=; \ 625 w2 = 2; \ 626 if w2 != w0 goto l0_%=; \ 627 goto l1_%=; \ 628 l0_%=: \ 629 r0 = 0; \ 630 exit; \ 631 l1_%=: \ 632 r0 -= r1; \ 633 exit; \ 634 " : 635 : __imm(bpf_ktime_get_ns) 636 : __clobber_all); 637 } 638 639 char _license[] SEC("license") = "GPL"; 640