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