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#if (defined(__TARGET_ARCH_arm64) || defined(__TARGET_ARCH_x86) || \ 8 (defined(__TARGET_ARCH_riscv) && __riscv_xlen == 64)) && __clang_major__ >= 18 9 10SEC("socket") 11__description("SDIV32, non-zero imm divisor, check 1") 12__success __success_unpriv __retval(-20) 13__naked void sdiv32_non_zero_imm_1(void) 14{ 15 asm volatile (" \ 16 w0 = -41; \ 17 w0 s/= 2; \ 18 exit; \ 19" ::: __clobber_all); 20} 21 22SEC("socket") 23__description("SDIV32, non-zero imm divisor, check 2") 24__success __success_unpriv __retval(-20) 25__naked void sdiv32_non_zero_imm_2(void) 26{ 27 asm volatile (" \ 28 w0 = 41; \ 29 w0 s/= -2; \ 30 exit; \ 31" ::: __clobber_all); 32} 33 34SEC("socket") 35__description("SDIV32, non-zero imm divisor, check 3") 36__success __success_unpriv __retval(20) 37__naked void sdiv32_non_zero_imm_3(void) 38{ 39 asm volatile (" \ 40 w0 = -41; \ 41 w0 s/= -2; \ 42 exit; \ 43" ::: __clobber_all); 44} 45 46SEC("socket") 47__description("SDIV32, non-zero imm divisor, check 4") 48__success __success_unpriv __retval(-21) 49__naked void sdiv32_non_zero_imm_4(void) 50{ 51 asm volatile (" \ 52 w0 = -42; \ 53 w0 s/= 2; \ 54 exit; \ 55" ::: __clobber_all); 56} 57 58SEC("socket") 59__description("SDIV32, non-zero imm divisor, check 5") 60__success __success_unpriv __retval(-21) 61__naked void sdiv32_non_zero_imm_5(void) 62{ 63 asm volatile (" \ 64 w0 = 42; \ 65 w0 s/= -2; \ 66 exit; \ 67" ::: __clobber_all); 68} 69 70SEC("socket") 71__description("SDIV32, non-zero imm divisor, check 6") 72__success __success_unpriv __retval(21) 73__naked void sdiv32_non_zero_imm_6(void) 74{ 75 asm volatile (" \ 76 w0 = -42; \ 77 w0 s/= -2; \ 78 exit; \ 79" ::: __clobber_all); 80} 81 82SEC("socket") 83__description("SDIV32, non-zero imm divisor, check 7") 84__success __success_unpriv __retval(21) 85__naked void sdiv32_non_zero_imm_7(void) 86{ 87 asm volatile (" \ 88 w0 = 42; \ 89 w0 s/= 2; \ 90 exit; \ 91" ::: __clobber_all); 92} 93 94SEC("socket") 95__description("SDIV32, non-zero imm divisor, check 8") 96__success __success_unpriv __retval(20) 97__naked void sdiv32_non_zero_imm_8(void) 98{ 99 asm volatile (" \ 100 w0 = 41; \ 101 w0 s/= 2; \ 102 exit; \ 103" ::: __clobber_all); 104} 105 106SEC("socket") 107__description("SDIV32, non-zero reg divisor, check 1") 108__success __success_unpriv __retval(-20) 109__naked void sdiv32_non_zero_reg_1(void) 110{ 111 asm volatile (" \ 112 w0 = -41; \ 113 w1 = 2; \ 114 w0 s/= w1; \ 115 exit; \ 116" ::: __clobber_all); 117} 118 119SEC("socket") 120__description("SDIV32, non-zero reg divisor, check 2") 121__success __success_unpriv __retval(-20) 122__naked void sdiv32_non_zero_reg_2(void) 123{ 124 asm volatile (" \ 125 w0 = 41; \ 126 w1 = -2; \ 127 w0 s/= w1; \ 128 exit; \ 129" ::: __clobber_all); 130} 131 132SEC("socket") 133__description("SDIV32, non-zero reg divisor, check 3") 134__success __success_unpriv __retval(20) 135__naked void sdiv32_non_zero_reg_3(void) 136{ 137 asm volatile (" \ 138 w0 = -41; \ 139 w1 = -2; \ 140 w0 s/= w1; \ 141 exit; \ 142" ::: __clobber_all); 143} 144 145SEC("socket") 146__description("SDIV32, non-zero reg divisor, check 4") 147__success __success_unpriv __retval(-21) 148__naked void sdiv32_non_zero_reg_4(void) 149{ 150 asm volatile (" \ 151 w0 = -42; \ 152 w1 = 2; \ 153 w0 s/= w1; \ 154 exit; \ 155" ::: __clobber_all); 156} 157 158SEC("socket") 159__description("SDIV32, non-zero reg divisor, check 5") 160__success __success_unpriv __retval(-21) 161__naked void sdiv32_non_zero_reg_5(void) 162{ 163 asm volatile (" \ 164 w0 = 42; \ 165 w1 = -2; \ 166 w0 s/= w1; \ 167 exit; \ 168" ::: __clobber_all); 169} 170 171SEC("socket") 172__description("SDIV32, non-zero reg divisor, check 6") 173__success __success_unpriv __retval(21) 174__naked void sdiv32_non_zero_reg_6(void) 175{ 176 asm volatile (" \ 177 w0 = -42; \ 178 w1 = -2; \ 179 w0 s/= w1; \ 180 exit; \ 181" ::: __clobber_all); 182} 183 184SEC("socket") 185__description("SDIV32, non-zero reg divisor, check 7") 186__success __success_unpriv __retval(21) 187__naked void sdiv32_non_zero_reg_7(void) 188{ 189 asm volatile (" \ 190 w0 = 42; \ 191 w1 = 2; \ 192 w0 s/= w1; \ 193 exit; \ 194" ::: __clobber_all); 195} 196 197SEC("socket") 198__description("SDIV32, non-zero reg divisor, check 8") 199__success __success_unpriv __retval(20) 200__naked void sdiv32_non_zero_reg_8(void) 201{ 202 asm volatile (" \ 203 w0 = 41; \ 204 w1 = 2; \ 205 w0 s/= w1; \ 206 exit; \ 207" ::: __clobber_all); 208} 209 210SEC("socket") 211__description("SDIV64, non-zero imm divisor, check 1") 212__success __success_unpriv __retval(-20) 213__naked void sdiv64_non_zero_imm_1(void) 214{ 215 asm volatile (" \ 216 r0 = -41; \ 217 r0 s/= 2; \ 218 exit; \ 219" ::: __clobber_all); 220} 221 222SEC("socket") 223__description("SDIV64, non-zero imm divisor, check 2") 224__success __success_unpriv __retval(-20) 225__naked void sdiv64_non_zero_imm_2(void) 226{ 227 asm volatile (" \ 228 r0 = 41; \ 229 r0 s/= -2; \ 230 exit; \ 231" ::: __clobber_all); 232} 233 234SEC("socket") 235__description("SDIV64, non-zero imm divisor, check 3") 236__success __success_unpriv __retval(20) 237__naked void sdiv64_non_zero_imm_3(void) 238{ 239 asm volatile (" \ 240 r0 = -41; \ 241 r0 s/= -2; \ 242 exit; \ 243" ::: __clobber_all); 244} 245 246SEC("socket") 247__description("SDIV64, non-zero imm divisor, check 4") 248__success __success_unpriv __retval(-21) 249__naked void sdiv64_non_zero_imm_4(void) 250{ 251 asm volatile (" \ 252 r0 = -42; \ 253 r0 s/= 2; \ 254 exit; \ 255" ::: __clobber_all); 256} 257 258SEC("socket") 259__description("SDIV64, non-zero imm divisor, check 5") 260__success __success_unpriv __retval(-21) 261__naked void sdiv64_non_zero_imm_5(void) 262{ 263 asm volatile (" \ 264 r0 = 42; \ 265 r0 s/= -2; \ 266 exit; \ 267" ::: __clobber_all); 268} 269 270SEC("socket") 271__description("SDIV64, non-zero imm divisor, check 6") 272__success __success_unpriv __retval(21) 273__naked void sdiv64_non_zero_imm_6(void) 274{ 275 asm volatile (" \ 276 r0 = -42; \ 277 r0 s/= -2; \ 278 exit; \ 279" ::: __clobber_all); 280} 281 282SEC("socket") 283__description("SDIV64, non-zero reg divisor, check 1") 284__success __success_unpriv __retval(-20) 285__naked void sdiv64_non_zero_reg_1(void) 286{ 287 asm volatile (" \ 288 r0 = -41; \ 289 r1 = 2; \ 290 r0 s/= r1; \ 291 exit; \ 292" ::: __clobber_all); 293} 294 295SEC("socket") 296__description("SDIV64, non-zero reg divisor, check 2") 297__success __success_unpriv __retval(-20) 298__naked void sdiv64_non_zero_reg_2(void) 299{ 300 asm volatile (" \ 301 r0 = 41; \ 302 r1 = -2; \ 303 r0 s/= r1; \ 304 exit; \ 305" ::: __clobber_all); 306} 307 308SEC("socket") 309__description("SDIV64, non-zero reg divisor, check 3") 310__success __success_unpriv __retval(20) 311__naked void sdiv64_non_zero_reg_3(void) 312{ 313 asm volatile (" \ 314 r0 = -41; \ 315 r1 = -2; \ 316 r0 s/= r1; \ 317 exit; \ 318" ::: __clobber_all); 319} 320 321SEC("socket") 322__description("SDIV64, non-zero reg divisor, check 4") 323__success __success_unpriv __retval(-21) 324__naked void sdiv64_non_zero_reg_4(void) 325{ 326 asm volatile (" \ 327 r0 = -42; \ 328 r1 = 2; \ 329 r0 s/= r1; \ 330 exit; \ 331" ::: __clobber_all); 332} 333 334SEC("socket") 335__description("SDIV64, non-zero reg divisor, check 5") 336__success __success_unpriv __retval(-21) 337__naked void sdiv64_non_zero_reg_5(void) 338{ 339 asm volatile (" \ 340 r0 = 42; \ 341 r1 = -2; \ 342 r0 s/= r1; \ 343 exit; \ 344" ::: __clobber_all); 345} 346 347SEC("socket") 348__description("SDIV64, non-zero reg divisor, check 6") 349__success __success_unpriv __retval(21) 350__naked void sdiv64_non_zero_reg_6(void) 351{ 352 asm volatile (" \ 353 r0 = -42; \ 354 r1 = -2; \ 355 r0 s/= r1; \ 356 exit; \ 357" ::: __clobber_all); 358} 359 360SEC("socket") 361__description("SMOD32, non-zero imm divisor, check 1") 362__success __success_unpriv __retval(-1) 363__naked void smod32_non_zero_imm_1(void) 364{ 365 asm volatile (" \ 366 w0 = -41; \ 367 w0 s%%= 2; \ 368 exit; \ 369" ::: __clobber_all); 370} 371 372SEC("socket") 373__description("SMOD32, non-zero imm divisor, check 2") 374__success __success_unpriv __retval(1) 375__naked void smod32_non_zero_imm_2(void) 376{ 377 asm volatile (" \ 378 w0 = 41; \ 379 w0 s%%= -2; \ 380 exit; \ 381" ::: __clobber_all); 382} 383 384SEC("socket") 385__description("SMOD32, non-zero imm divisor, check 3") 386__success __success_unpriv __retval(-1) 387__naked void smod32_non_zero_imm_3(void) 388{ 389 asm volatile (" \ 390 w0 = -41; \ 391 w0 s%%= -2; \ 392 exit; \ 393" ::: __clobber_all); 394} 395 396SEC("socket") 397__description("SMOD32, non-zero imm divisor, check 4") 398__success __success_unpriv __retval(0) 399__naked void smod32_non_zero_imm_4(void) 400{ 401 asm volatile (" \ 402 w0 = -42; \ 403 w0 s%%= 2; \ 404 exit; \ 405" ::: __clobber_all); 406} 407 408SEC("socket") 409__description("SMOD32, non-zero imm divisor, check 5") 410__success __success_unpriv __retval(0) 411__naked void smod32_non_zero_imm_5(void) 412{ 413 asm volatile (" \ 414 w0 = 42; \ 415 w0 s%%= -2; \ 416 exit; \ 417" ::: __clobber_all); 418} 419 420SEC("socket") 421__description("SMOD32, non-zero imm divisor, check 6") 422__success __success_unpriv __retval(0) 423__naked void smod32_non_zero_imm_6(void) 424{ 425 asm volatile (" \ 426 w0 = -42; \ 427 w0 s%%= -2; \ 428 exit; \ 429" ::: __clobber_all); 430} 431 432SEC("socket") 433__description("SMOD32, non-zero reg divisor, check 1") 434__success __success_unpriv __retval(-1) 435__naked void smod32_non_zero_reg_1(void) 436{ 437 asm volatile (" \ 438 w0 = -41; \ 439 w1 = 2; \ 440 w0 s%%= w1; \ 441 exit; \ 442" ::: __clobber_all); 443} 444 445SEC("socket") 446__description("SMOD32, non-zero reg divisor, check 2") 447__success __success_unpriv __retval(1) 448__naked void smod32_non_zero_reg_2(void) 449{ 450 asm volatile (" \ 451 w0 = 41; \ 452 w1 = -2; \ 453 w0 s%%= w1; \ 454 exit; \ 455" ::: __clobber_all); 456} 457 458SEC("socket") 459__description("SMOD32, non-zero reg divisor, check 3") 460__success __success_unpriv __retval(-1) 461__naked void smod32_non_zero_reg_3(void) 462{ 463 asm volatile (" \ 464 w0 = -41; \ 465 w1 = -2; \ 466 w0 s%%= w1; \ 467 exit; \ 468" ::: __clobber_all); 469} 470 471SEC("socket") 472__description("SMOD32, non-zero reg divisor, check 4") 473__success __success_unpriv __retval(0) 474__naked void smod32_non_zero_reg_4(void) 475{ 476 asm volatile (" \ 477 w0 = -42; \ 478 w1 = 2; \ 479 w0 s%%= w1; \ 480 exit; \ 481" ::: __clobber_all); 482} 483 484SEC("socket") 485__description("SMOD32, non-zero reg divisor, check 5") 486__success __success_unpriv __retval(0) 487__naked void smod32_non_zero_reg_5(void) 488{ 489 asm volatile (" \ 490 w0 = 42; \ 491 w1 = -2; \ 492 w0 s%%= w1; \ 493 exit; \ 494" ::: __clobber_all); 495} 496 497SEC("socket") 498__description("SMOD32, non-zero reg divisor, check 6") 499__success __success_unpriv __retval(0) 500__naked void smod32_non_zero_reg_6(void) 501{ 502 asm volatile (" \ 503 w0 = -42; \ 504 w1 = -2; \ 505 w0 s%%= w1; \ 506 exit; \ 507" ::: __clobber_all); 508} 509 510SEC("socket") 511__description("SMOD64, non-zero imm divisor, check 1") 512__success __success_unpriv __retval(-1) 513__naked void smod64_non_zero_imm_1(void) 514{ 515 asm volatile (" \ 516 r0 = -41; \ 517 r0 s%%= 2; \ 518 exit; \ 519" ::: __clobber_all); 520} 521 522SEC("socket") 523__description("SMOD64, non-zero imm divisor, check 2") 524__success __success_unpriv __retval(1) 525__naked void smod64_non_zero_imm_2(void) 526{ 527 asm volatile (" \ 528 r0 = 41; \ 529 r0 s%%= -2; \ 530 exit; \ 531" ::: __clobber_all); 532} 533 534SEC("socket") 535__description("SMOD64, non-zero imm divisor, check 3") 536__success __success_unpriv __retval(-1) 537__naked void smod64_non_zero_imm_3(void) 538{ 539 asm volatile (" \ 540 r0 = -41; \ 541 r0 s%%= -2; \ 542 exit; \ 543" ::: __clobber_all); 544} 545 546SEC("socket") 547__description("SMOD64, non-zero imm divisor, check 4") 548__success __success_unpriv __retval(0) 549__naked void smod64_non_zero_imm_4(void) 550{ 551 asm volatile (" \ 552 r0 = -42; \ 553 r0 s%%= 2; \ 554 exit; \ 555" ::: __clobber_all); 556} 557 558SEC("socket") 559__description("SMOD64, non-zero imm divisor, check 5") 560__success __success_unpriv __retval(-0) 561__naked void smod64_non_zero_imm_5(void) 562{ 563 asm volatile (" \ 564 r0 = 42; \ 565 r0 s%%= -2; \ 566 exit; \ 567" ::: __clobber_all); 568} 569 570SEC("socket") 571__description("SMOD64, non-zero imm divisor, check 6") 572__success __success_unpriv __retval(0) 573__naked void smod64_non_zero_imm_6(void) 574{ 575 asm volatile (" \ 576 r0 = -42; \ 577 r0 s%%= -2; \ 578 exit; \ 579" ::: __clobber_all); 580} 581 582SEC("socket") 583__description("SMOD64, non-zero imm divisor, check 7") 584__success __success_unpriv __retval(0) 585__naked void smod64_non_zero_imm_7(void) 586{ 587 asm volatile (" \ 588 r0 = 42; \ 589 r0 s%%= 2; \ 590 exit; \ 591" ::: __clobber_all); 592} 593 594SEC("socket") 595__description("SMOD64, non-zero imm divisor, check 8") 596__success __success_unpriv __retval(1) 597__naked void smod64_non_zero_imm_8(void) 598{ 599 asm volatile (" \ 600 r0 = 41; \ 601 r0 s%%= 2; \ 602 exit; \ 603" ::: __clobber_all); 604} 605 606SEC("socket") 607__description("SMOD64, non-zero reg divisor, check 1") 608__success __success_unpriv __retval(-1) 609__naked void smod64_non_zero_reg_1(void) 610{ 611 asm volatile (" \ 612 r0 = -41; \ 613 r1 = 2; \ 614 r0 s%%= r1; \ 615 exit; \ 616" ::: __clobber_all); 617} 618 619SEC("socket") 620__description("SMOD64, non-zero reg divisor, check 2") 621__success __success_unpriv __retval(1) 622__naked void smod64_non_zero_reg_2(void) 623{ 624 asm volatile (" \ 625 r0 = 41; \ 626 r1 = -2; \ 627 r0 s%%= r1; \ 628 exit; \ 629" ::: __clobber_all); 630} 631 632SEC("socket") 633__description("SMOD64, non-zero reg divisor, check 3") 634__success __success_unpriv __retval(-1) 635__naked void smod64_non_zero_reg_3(void) 636{ 637 asm volatile (" \ 638 r0 = -41; \ 639 r1 = -2; \ 640 r0 s%%= r1; \ 641 exit; \ 642" ::: __clobber_all); 643} 644 645SEC("socket") 646__description("SMOD64, non-zero reg divisor, check 4") 647__success __success_unpriv __retval(0) 648__naked void smod64_non_zero_reg_4(void) 649{ 650 asm volatile (" \ 651 r0 = -42; \ 652 r1 = 2; \ 653 r0 s%%= r1; \ 654 exit; \ 655" ::: __clobber_all); 656} 657 658SEC("socket") 659__description("SMOD64, non-zero reg divisor, check 5") 660__success __success_unpriv __retval(0) 661__naked void smod64_non_zero_reg_5(void) 662{ 663 asm volatile (" \ 664 r0 = 42; \ 665 r1 = -2; \ 666 r0 s%%= r1; \ 667 exit; \ 668" ::: __clobber_all); 669} 670 671SEC("socket") 672__description("SMOD64, non-zero reg divisor, check 6") 673__success __success_unpriv __retval(0) 674__naked void smod64_non_zero_reg_6(void) 675{ 676 asm volatile (" \ 677 r0 = -42; \ 678 r1 = -2; \ 679 r0 s%%= r1; \ 680 exit; \ 681" ::: __clobber_all); 682} 683 684SEC("socket") 685__description("SMOD64, non-zero reg divisor, check 7") 686__success __success_unpriv __retval(0) 687__naked void smod64_non_zero_reg_7(void) 688{ 689 asm volatile (" \ 690 r0 = 42; \ 691 r1 = 2; \ 692 r0 s%%= r1; \ 693 exit; \ 694" ::: __clobber_all); 695} 696 697SEC("socket") 698__description("SMOD64, non-zero reg divisor, check 8") 699__success __success_unpriv __retval(1) 700__naked void smod64_non_zero_reg_8(void) 701{ 702 asm volatile (" \ 703 r0 = 41; \ 704 r1 = 2; \ 705 r0 s%%= r1; \ 706 exit; \ 707" ::: __clobber_all); 708} 709 710SEC("socket") 711__description("SDIV32, zero divisor") 712__success __success_unpriv __retval(0) 713__naked void sdiv32_zero_divisor(void) 714{ 715 asm volatile (" \ 716 w0 = 42; \ 717 w1 = 0; \ 718 w2 = -1; \ 719 w2 s/= w1; \ 720 w0 = w2; \ 721 exit; \ 722" ::: __clobber_all); 723} 724 725SEC("socket") 726__description("SDIV64, zero divisor") 727__success __success_unpriv __retval(0) 728__naked void sdiv64_zero_divisor(void) 729{ 730 asm volatile (" \ 731 r0 = 42; \ 732 r1 = 0; \ 733 r2 = -1; \ 734 r2 s/= r1; \ 735 r0 = r2; \ 736 exit; \ 737" ::: __clobber_all); 738} 739 740SEC("socket") 741__description("SMOD32, zero divisor") 742__success __success_unpriv __retval(-1) 743__naked void smod32_zero_divisor(void) 744{ 745 asm volatile (" \ 746 w0 = 42; \ 747 w1 = 0; \ 748 w2 = -1; \ 749 w2 s%%= w1; \ 750 w0 = w2; \ 751 exit; \ 752" ::: __clobber_all); 753} 754 755SEC("socket") 756__description("SMOD64, zero divisor") 757__success __success_unpriv __retval(-1) 758__naked void smod64_zero_divisor(void) 759{ 760 asm volatile (" \ 761 r0 = 42; \ 762 r1 = 0; \ 763 r2 = -1; \ 764 r2 s%%= r1; \ 765 r0 = r2; \ 766 exit; \ 767" ::: __clobber_all); 768} 769 770#else 771 772SEC("socket") 773__description("cpuv4 is not supported by compiler or jit, use a dummy test") 774__success 775int dummy_test(void) 776{ 777 return 0; 778} 779 780#endif 781 782char _license[] SEC("license") = "GPL"; 783