1225 lines · c
1// SPDX-License-Identifier: GPL-2.02 3#include <linux/bpf.h>4#include <limits.h>5#include <bpf/bpf_helpers.h>6#include "bpf_misc.h"7 8#if (defined(__TARGET_ARCH_arm64) || defined(__TARGET_ARCH_x86) || \9 (defined(__TARGET_ARCH_riscv) && __riscv_xlen == 64) || \10 defined(__TARGET_ARCH_arm) || defined(__TARGET_ARCH_s390) || \11 defined(__TARGET_ARCH_loongarch)) && \12 __clang_major__ >= 1813 14SEC("socket")15__description("SDIV32, non-zero imm divisor, check 1")16__success __success_unpriv __retval(-20)17__naked void sdiv32_non_zero_imm_1(void)18{19 asm volatile (" \20 w0 = -41; \21 w0 s/= 2; \22 exit; \23" ::: __clobber_all);24}25 26SEC("socket")27__description("SDIV32, non-zero imm divisor, check 2")28__success __success_unpriv __retval(-20)29__naked void sdiv32_non_zero_imm_2(void)30{31 asm volatile (" \32 w0 = 41; \33 w0 s/= -2; \34 exit; \35" ::: __clobber_all);36}37 38SEC("socket")39__description("SDIV32, non-zero imm divisor, check 3")40__success __success_unpriv __retval(20)41__naked void sdiv32_non_zero_imm_3(void)42{43 asm volatile (" \44 w0 = -41; \45 w0 s/= -2; \46 exit; \47" ::: __clobber_all);48}49 50SEC("socket")51__description("SDIV32, non-zero imm divisor, check 4")52__success __success_unpriv __retval(-21)53__naked void sdiv32_non_zero_imm_4(void)54{55 asm volatile (" \56 w0 = -42; \57 w0 s/= 2; \58 exit; \59" ::: __clobber_all);60}61 62SEC("socket")63__description("SDIV32, non-zero imm divisor, check 5")64__success __success_unpriv __retval(-21)65__naked void sdiv32_non_zero_imm_5(void)66{67 asm volatile (" \68 w0 = 42; \69 w0 s/= -2; \70 exit; \71" ::: __clobber_all);72}73 74SEC("socket")75__description("SDIV32, non-zero imm divisor, check 6")76__success __success_unpriv __retval(21)77__naked void sdiv32_non_zero_imm_6(void)78{79 asm volatile (" \80 w0 = -42; \81 w0 s/= -2; \82 exit; \83" ::: __clobber_all);84}85 86SEC("socket")87__description("SDIV32, non-zero imm divisor, check 7")88__success __success_unpriv __retval(21)89__naked void sdiv32_non_zero_imm_7(void)90{91 asm volatile (" \92 w0 = 42; \93 w0 s/= 2; \94 exit; \95" ::: __clobber_all);96}97 98SEC("socket")99__description("SDIV32, non-zero imm divisor, check 8")100__success __success_unpriv __retval(20)101__naked void sdiv32_non_zero_imm_8(void)102{103 asm volatile (" \104 w0 = 41; \105 w0 s/= 2; \106 exit; \107" ::: __clobber_all);108}109 110SEC("socket")111__description("SDIV32, non-zero reg divisor, check 1")112__success __success_unpriv __retval(-20)113__naked void sdiv32_non_zero_reg_1(void)114{115 asm volatile (" \116 w0 = -41; \117 w1 = 2; \118 w0 s/= w1; \119 exit; \120" ::: __clobber_all);121}122 123SEC("socket")124__description("SDIV32, non-zero reg divisor, check 2")125__success __success_unpriv __retval(-20)126__naked void sdiv32_non_zero_reg_2(void)127{128 asm volatile (" \129 w0 = 41; \130 w1 = -2; \131 w0 s/= w1; \132 exit; \133" ::: __clobber_all);134}135 136SEC("socket")137__description("SDIV32, non-zero reg divisor, check 3")138__success __success_unpriv __retval(20)139__naked void sdiv32_non_zero_reg_3(void)140{141 asm volatile (" \142 w0 = -41; \143 w1 = -2; \144 w0 s/= w1; \145 exit; \146" ::: __clobber_all);147}148 149SEC("socket")150__description("SDIV32, non-zero reg divisor, check 4")151__success __success_unpriv __retval(-21)152__naked void sdiv32_non_zero_reg_4(void)153{154 asm volatile (" \155 w0 = -42; \156 w1 = 2; \157 w0 s/= w1; \158 exit; \159" ::: __clobber_all);160}161 162SEC("socket")163__description("SDIV32, non-zero reg divisor, check 5")164__success __success_unpriv __retval(-21)165__naked void sdiv32_non_zero_reg_5(void)166{167 asm volatile (" \168 w0 = 42; \169 w1 = -2; \170 w0 s/= w1; \171 exit; \172" ::: __clobber_all);173}174 175SEC("socket")176__description("SDIV32, non-zero reg divisor, check 6")177__success __success_unpriv __retval(21)178__naked void sdiv32_non_zero_reg_6(void)179{180 asm volatile (" \181 w0 = -42; \182 w1 = -2; \183 w0 s/= w1; \184 exit; \185" ::: __clobber_all);186}187 188SEC("socket")189__description("SDIV32, non-zero reg divisor, check 7")190__success __success_unpriv __retval(21)191__naked void sdiv32_non_zero_reg_7(void)192{193 asm volatile (" \194 w0 = 42; \195 w1 = 2; \196 w0 s/= w1; \197 exit; \198" ::: __clobber_all);199}200 201SEC("socket")202__description("SDIV32, non-zero reg divisor, check 8")203__success __success_unpriv __retval(20)204__naked void sdiv32_non_zero_reg_8(void)205{206 asm volatile (" \207 w0 = 41; \208 w1 = 2; \209 w0 s/= w1; \210 exit; \211" ::: __clobber_all);212}213 214SEC("socket")215__description("SDIV64, non-zero imm divisor, check 1")216__success __success_unpriv __retval(-20)217__naked void sdiv64_non_zero_imm_1(void)218{219 asm volatile (" \220 r0 = -41; \221 r0 s/= 2; \222 exit; \223" ::: __clobber_all);224}225 226SEC("socket")227__description("SDIV64, non-zero imm divisor, check 2")228__success __success_unpriv __retval(-20)229__naked void sdiv64_non_zero_imm_2(void)230{231 asm volatile (" \232 r0 = 41; \233 r0 s/= -2; \234 exit; \235" ::: __clobber_all);236}237 238SEC("socket")239__description("SDIV64, non-zero imm divisor, check 3")240__success __success_unpriv __retval(20)241__naked void sdiv64_non_zero_imm_3(void)242{243 asm volatile (" \244 r0 = -41; \245 r0 s/= -2; \246 exit; \247" ::: __clobber_all);248}249 250SEC("socket")251__description("SDIV64, non-zero imm divisor, check 4")252__success __success_unpriv __retval(-21)253__naked void sdiv64_non_zero_imm_4(void)254{255 asm volatile (" \256 r0 = -42; \257 r0 s/= 2; \258 exit; \259" ::: __clobber_all);260}261 262SEC("socket")263__description("SDIV64, non-zero imm divisor, check 5")264__success __success_unpriv __retval(-21)265__naked void sdiv64_non_zero_imm_5(void)266{267 asm volatile (" \268 r0 = 42; \269 r0 s/= -2; \270 exit; \271" ::: __clobber_all);272}273 274SEC("socket")275__description("SDIV64, non-zero imm divisor, check 6")276__success __success_unpriv __retval(21)277__naked void sdiv64_non_zero_imm_6(void)278{279 asm volatile (" \280 r0 = -42; \281 r0 s/= -2; \282 exit; \283" ::: __clobber_all);284}285 286SEC("socket")287__description("SDIV64, non-zero reg divisor, check 1")288__success __success_unpriv __retval(-20)289__naked void sdiv64_non_zero_reg_1(void)290{291 asm volatile (" \292 r0 = -41; \293 r1 = 2; \294 r0 s/= r1; \295 exit; \296" ::: __clobber_all);297}298 299SEC("socket")300__description("SDIV64, non-zero reg divisor, check 2")301__success __success_unpriv __retval(-20)302__naked void sdiv64_non_zero_reg_2(void)303{304 asm volatile (" \305 r0 = 41; \306 r1 = -2; \307 r0 s/= r1; \308 exit; \309" ::: __clobber_all);310}311 312SEC("socket")313__description("SDIV64, non-zero reg divisor, check 3")314__success __success_unpriv __retval(20)315__naked void sdiv64_non_zero_reg_3(void)316{317 asm volatile (" \318 r0 = -41; \319 r1 = -2; \320 r0 s/= r1; \321 exit; \322" ::: __clobber_all);323}324 325SEC("socket")326__description("SDIV64, non-zero reg divisor, check 4")327__success __success_unpriv __retval(-21)328__naked void sdiv64_non_zero_reg_4(void)329{330 asm volatile (" \331 r0 = -42; \332 r1 = 2; \333 r0 s/= r1; \334 exit; \335" ::: __clobber_all);336}337 338SEC("socket")339__description("SDIV64, non-zero reg divisor, check 5")340__success __success_unpriv __retval(-21)341__naked void sdiv64_non_zero_reg_5(void)342{343 asm volatile (" \344 r0 = 42; \345 r1 = -2; \346 r0 s/= r1; \347 exit; \348" ::: __clobber_all);349}350 351SEC("socket")352__description("SDIV64, non-zero reg divisor, check 6")353__success __success_unpriv __retval(21)354__naked void sdiv64_non_zero_reg_6(void)355{356 asm volatile (" \357 r0 = -42; \358 r1 = -2; \359 r0 s/= r1; \360 exit; \361" ::: __clobber_all);362}363 364SEC("socket")365__description("SMOD32, non-zero imm divisor, check 1")366__success __success_unpriv __retval(-1)367__naked void smod32_non_zero_imm_1(void)368{369 asm volatile (" \370 w0 = -41; \371 w0 s%%= 2; \372 exit; \373" ::: __clobber_all);374}375 376SEC("socket")377__description("SMOD32, non-zero imm divisor, check 2")378__success __success_unpriv __retval(1)379__naked void smod32_non_zero_imm_2(void)380{381 asm volatile (" \382 w0 = 41; \383 w0 s%%= -2; \384 exit; \385" ::: __clobber_all);386}387 388SEC("socket")389__description("SMOD32, non-zero imm divisor, check 3")390__success __success_unpriv __retval(-1)391__naked void smod32_non_zero_imm_3(void)392{393 asm volatile (" \394 w0 = -41; \395 w0 s%%= -2; \396 exit; \397" ::: __clobber_all);398}399 400SEC("socket")401__description("SMOD32, non-zero imm divisor, check 4")402__success __success_unpriv __retval(0)403__naked void smod32_non_zero_imm_4(void)404{405 asm volatile (" \406 w0 = -42; \407 w0 s%%= 2; \408 exit; \409" ::: __clobber_all);410}411 412SEC("socket")413__description("SMOD32, non-zero imm divisor, check 5")414__success __success_unpriv __retval(0)415__naked void smod32_non_zero_imm_5(void)416{417 asm volatile (" \418 w0 = 42; \419 w0 s%%= -2; \420 exit; \421" ::: __clobber_all);422}423 424SEC("socket")425__description("SMOD32, non-zero imm divisor, check 6")426__success __success_unpriv __retval(0)427__naked void smod32_non_zero_imm_6(void)428{429 asm volatile (" \430 w0 = -42; \431 w0 s%%= -2; \432 exit; \433" ::: __clobber_all);434}435 436SEC("socket")437__description("SMOD32, non-zero reg divisor, check 1")438__success __success_unpriv __retval(-1)439__naked void smod32_non_zero_reg_1(void)440{441 asm volatile (" \442 w0 = -41; \443 w1 = 2; \444 w0 s%%= w1; \445 exit; \446" ::: __clobber_all);447}448 449SEC("socket")450__description("SMOD32, non-zero reg divisor, check 2")451__success __success_unpriv __retval(1)452__naked void smod32_non_zero_reg_2(void)453{454 asm volatile (" \455 w0 = 41; \456 w1 = -2; \457 w0 s%%= w1; \458 exit; \459" ::: __clobber_all);460}461 462SEC("socket")463__description("SMOD32, non-zero reg divisor, check 3")464__success __success_unpriv __retval(-1)465__naked void smod32_non_zero_reg_3(void)466{467 asm volatile (" \468 w0 = -41; \469 w1 = -2; \470 w0 s%%= w1; \471 exit; \472" ::: __clobber_all);473}474 475SEC("socket")476__description("SMOD32, non-zero reg divisor, check 4")477__success __success_unpriv __retval(0)478__naked void smod32_non_zero_reg_4(void)479{480 asm volatile (" \481 w0 = -42; \482 w1 = 2; \483 w0 s%%= w1; \484 exit; \485" ::: __clobber_all);486}487 488SEC("socket")489__description("SMOD32, non-zero reg divisor, check 5")490__success __success_unpriv __retval(0)491__naked void smod32_non_zero_reg_5(void)492{493 asm volatile (" \494 w0 = 42; \495 w1 = -2; \496 w0 s%%= w1; \497 exit; \498" ::: __clobber_all);499}500 501SEC("socket")502__description("SMOD32, non-zero reg divisor, check 6")503__success __success_unpriv __retval(0)504__naked void smod32_non_zero_reg_6(void)505{506 asm volatile (" \507 w0 = -42; \508 w1 = -2; \509 w0 s%%= w1; \510 exit; \511" ::: __clobber_all);512}513 514SEC("socket")515__description("SMOD64, non-zero imm divisor, check 1")516__success __success_unpriv __retval(-1)517__naked void smod64_non_zero_imm_1(void)518{519 asm volatile (" \520 r0 = -41; \521 r0 s%%= 2; \522 exit; \523" ::: __clobber_all);524}525 526SEC("socket")527__description("SMOD64, non-zero imm divisor, check 2")528__success __success_unpriv __retval(1)529__naked void smod64_non_zero_imm_2(void)530{531 asm volatile (" \532 r0 = 41; \533 r0 s%%= -2; \534 exit; \535" ::: __clobber_all);536}537 538SEC("socket")539__description("SMOD64, non-zero imm divisor, check 3")540__success __success_unpriv __retval(-1)541__naked void smod64_non_zero_imm_3(void)542{543 asm volatile (" \544 r0 = -41; \545 r0 s%%= -2; \546 exit; \547" ::: __clobber_all);548}549 550SEC("socket")551__description("SMOD64, non-zero imm divisor, check 4")552__success __success_unpriv __retval(0)553__naked void smod64_non_zero_imm_4(void)554{555 asm volatile (" \556 r0 = -42; \557 r0 s%%= 2; \558 exit; \559" ::: __clobber_all);560}561 562SEC("socket")563__description("SMOD64, non-zero imm divisor, check 5")564__success __success_unpriv __retval(-0)565__naked void smod64_non_zero_imm_5(void)566{567 asm volatile (" \568 r0 = 42; \569 r0 s%%= -2; \570 exit; \571" ::: __clobber_all);572}573 574SEC("socket")575__description("SMOD64, non-zero imm divisor, check 6")576__success __success_unpriv __retval(0)577__naked void smod64_non_zero_imm_6(void)578{579 asm volatile (" \580 r0 = -42; \581 r0 s%%= -2; \582 exit; \583" ::: __clobber_all);584}585 586SEC("socket")587__description("SMOD64, non-zero imm divisor, check 7")588__success __success_unpriv __retval(0)589__naked void smod64_non_zero_imm_7(void)590{591 asm volatile (" \592 r0 = 42; \593 r0 s%%= 2; \594 exit; \595" ::: __clobber_all);596}597 598SEC("socket")599__description("SMOD64, non-zero imm divisor, check 8")600__success __success_unpriv __retval(1)601__naked void smod64_non_zero_imm_8(void)602{603 asm volatile (" \604 r0 = 41; \605 r0 s%%= 2; \606 exit; \607" ::: __clobber_all);608}609 610SEC("socket")611__description("SMOD64, non-zero reg divisor, check 1")612__success __success_unpriv __retval(-1)613__naked void smod64_non_zero_reg_1(void)614{615 asm volatile (" \616 r0 = -41; \617 r1 = 2; \618 r0 s%%= r1; \619 exit; \620" ::: __clobber_all);621}622 623SEC("socket")624__description("SMOD64, non-zero reg divisor, check 2")625__success __success_unpriv __retval(1)626__naked void smod64_non_zero_reg_2(void)627{628 asm volatile (" \629 r0 = 41; \630 r1 = -2; \631 r0 s%%= r1; \632 exit; \633" ::: __clobber_all);634}635 636SEC("socket")637__description("SMOD64, non-zero reg divisor, check 3")638__success __success_unpriv __retval(-1)639__naked void smod64_non_zero_reg_3(void)640{641 asm volatile (" \642 r0 = -41; \643 r1 = -2; \644 r0 s%%= r1; \645 exit; \646" ::: __clobber_all);647}648 649SEC("socket")650__description("SMOD64, non-zero reg divisor, check 4")651__success __success_unpriv __retval(0)652__naked void smod64_non_zero_reg_4(void)653{654 asm volatile (" \655 r0 = -42; \656 r1 = 2; \657 r0 s%%= r1; \658 exit; \659" ::: __clobber_all);660}661 662SEC("socket")663__description("SMOD64, non-zero reg divisor, check 5")664__success __success_unpriv __retval(0)665__naked void smod64_non_zero_reg_5(void)666{667 asm volatile (" \668 r0 = 42; \669 r1 = -2; \670 r0 s%%= r1; \671 exit; \672" ::: __clobber_all);673}674 675SEC("socket")676__description("SMOD64, non-zero reg divisor, check 6")677__success __success_unpriv __retval(0)678__naked void smod64_non_zero_reg_6(void)679{680 asm volatile (" \681 r0 = -42; \682 r1 = -2; \683 r0 s%%= r1; \684 exit; \685" ::: __clobber_all);686}687 688SEC("socket")689__description("SMOD64, non-zero reg divisor, check 7")690__success __success_unpriv __retval(0)691__naked void smod64_non_zero_reg_7(void)692{693 asm volatile (" \694 r0 = 42; \695 r1 = 2; \696 r0 s%%= r1; \697 exit; \698" ::: __clobber_all);699}700 701SEC("socket")702__description("SMOD64, non-zero reg divisor, check 8")703__success __success_unpriv __retval(1)704__naked void smod64_non_zero_reg_8(void)705{706 asm volatile (" \707 r0 = 41; \708 r1 = 2; \709 r0 s%%= r1; \710 exit; \711" ::: __clobber_all);712}713 714SEC("socket")715__description("SDIV32, zero divisor")716__success __success_unpriv __retval(0)717__naked void sdiv32_zero_divisor(void)718{719 asm volatile (" \720 w0 = 42; \721 w1 = 0; \722 w2 = -1; \723 w2 s/= w1; \724 w0 = w2; \725 exit; \726" ::: __clobber_all);727}728 729SEC("socket")730__description("SDIV64, zero divisor")731__success __success_unpriv __retval(0)732__naked void sdiv64_zero_divisor(void)733{734 asm volatile (" \735 r0 = 42; \736 r1 = 0; \737 r2 = -1; \738 r2 s/= r1; \739 r0 = r2; \740 exit; \741" ::: __clobber_all);742}743 744SEC("socket")745__description("SMOD32, zero divisor")746__success __success_unpriv __retval(-1)747__naked void smod32_zero_divisor(void)748{749 asm volatile (" \750 w0 = 42; \751 w1 = 0; \752 w2 = -1; \753 w2 s%%= w1; \754 w0 = w2; \755 exit; \756" ::: __clobber_all);757}758 759SEC("socket")760__description("SMOD64, zero divisor")761__success __success_unpriv __retval(-1)762__naked void smod64_zero_divisor(void)763{764 asm volatile (" \765 r0 = 42; \766 r1 = 0; \767 r2 = -1; \768 r2 s%%= r1; \769 r0 = r2; \770 exit; \771" ::: __clobber_all);772}773 774SEC("socket")775__description("SDIV64, overflow r/r, LLONG_MIN/-1")776__success __retval(1)777__arch_x86_64778__xlated("0: r2 = 0x8000000000000000")779__xlated("2: r3 = -1")780__xlated("3: r4 = r2")781__xlated("4: r11 = r3")782__xlated("5: r11 += 1")783__xlated("6: if r11 > 0x1 goto pc+4")784__xlated("7: if r11 == 0x0 goto pc+1")785__xlated("8: r2 = 0")786__xlated("9: r2 = -r2")787__xlated("10: goto pc+1")788__xlated("11: r2 s/= r3")789__xlated("12: r0 = 0")790__xlated("13: if r2 != r4 goto pc+1")791__xlated("14: r0 = 1")792__xlated("15: exit")793__naked void sdiv64_overflow_rr(void)794{795 asm volatile (" \796 r2 = %[llong_min] ll; \797 r3 = -1; \798 r4 = r2; \799 r2 s/= r3; \800 r0 = 0; \801 if r2 != r4 goto +1; \802 r0 = 1; \803 exit; \804" :805 : __imm_const(llong_min, LLONG_MIN)806 : __clobber_all);807}808 809SEC("socket")810__description("SDIV64, r/r, small_val/-1")811__success __retval(-5)812__arch_x86_64813__xlated("0: r2 = 5")814__xlated("1: r3 = -1")815__xlated("2: r11 = r3")816__xlated("3: r11 += 1")817__xlated("4: if r11 > 0x1 goto pc+4")818__xlated("5: if r11 == 0x0 goto pc+1")819__xlated("6: r2 = 0")820__xlated("7: r2 = -r2")821__xlated("8: goto pc+1")822__xlated("9: r2 s/= r3")823__xlated("10: r0 = r2")824__xlated("11: exit")825__naked void sdiv64_rr_divisor_neg_1(void)826{827 asm volatile (" \828 r2 = 5; \829 r3 = -1; \830 r2 s/= r3; \831 r0 = r2; \832 exit; \833" :834 :835 : __clobber_all);836}837 838SEC("socket")839__description("SDIV64, overflow r/i, LLONG_MIN/-1")840__success __retval(1)841__arch_x86_64842__xlated("0: r2 = 0x8000000000000000")843__xlated("2: r4 = r2")844__xlated("3: r2 = -r2")845__xlated("4: r0 = 0")846__xlated("5: if r2 != r4 goto pc+1")847__xlated("6: r0 = 1")848__xlated("7: exit")849__naked void sdiv64_overflow_ri(void)850{851 asm volatile (" \852 r2 = %[llong_min] ll; \853 r4 = r2; \854 r2 s/= -1; \855 r0 = 0; \856 if r2 != r4 goto +1; \857 r0 = 1; \858 exit; \859" :860 : __imm_const(llong_min, LLONG_MIN)861 : __clobber_all);862}863 864SEC("socket")865__description("SDIV64, r/i, small_val/-1")866__success __retval(-5)867__arch_x86_64868__xlated("0: r2 = 5")869__xlated("1: r4 = r2")870__xlated("2: r2 = -r2")871__xlated("3: r0 = r2")872__xlated("4: exit")873__naked void sdiv64_ri_divisor_neg_1(void)874{875 asm volatile (" \876 r2 = 5; \877 r4 = r2; \878 r2 s/= -1; \879 r0 = r2; \880 exit; \881" :882 :883 : __clobber_all);884}885 886SEC("socket")887__description("SDIV32, overflow r/r, INT_MIN/-1")888__success __retval(1)889__arch_x86_64890__xlated("0: w2 = -2147483648")891__xlated("1: w3 = -1")892__xlated("2: w4 = w2")893__xlated("3: r11 = r3")894__xlated("4: w11 += 1")895__xlated("5: if w11 > 0x1 goto pc+4")896__xlated("6: if w11 == 0x0 goto pc+1")897__xlated("7: w2 = 0")898__xlated("8: w2 = -w2")899__xlated("9: goto pc+1")900__xlated("10: w2 s/= w3")901__xlated("11: r0 = 0")902__xlated("12: if w2 != w4 goto pc+1")903__xlated("13: r0 = 1")904__xlated("14: exit")905__naked void sdiv32_overflow_rr(void)906{907 asm volatile (" \908 w2 = %[int_min]; \909 w3 = -1; \910 w4 = w2; \911 w2 s/= w3; \912 r0 = 0; \913 if w2 != w4 goto +1; \914 r0 = 1; \915 exit; \916" :917 : __imm_const(int_min, INT_MIN)918 : __clobber_all);919}920 921SEC("socket")922__description("SDIV32, r/r, small_val/-1")923__success __retval(5)924__arch_x86_64925__xlated("0: w2 = -5")926__xlated("1: w3 = -1")927__xlated("2: w4 = w2")928__xlated("3: r11 = r3")929__xlated("4: w11 += 1")930__xlated("5: if w11 > 0x1 goto pc+4")931__xlated("6: if w11 == 0x0 goto pc+1")932__xlated("7: w2 = 0")933__xlated("8: w2 = -w2")934__xlated("9: goto pc+1")935__xlated("10: w2 s/= w3")936__xlated("11: w0 = w2")937__xlated("12: exit")938__naked void sdiv32_rr_divisor_neg_1(void)939{940 asm volatile (" \941 w2 = -5; \942 w3 = -1; \943 w4 = w2; \944 w2 s/= w3; \945 w0 = w2; \946 exit; \947" :948 :949 : __clobber_all);950}951 952SEC("socket")953__description("SDIV32, overflow r/i, INT_MIN/-1")954__success __retval(1)955__arch_x86_64956__xlated("0: w2 = -2147483648")957__xlated("1: w4 = w2")958__xlated("2: w2 = -w2")959__xlated("3: r0 = 0")960__xlated("4: if w2 != w4 goto pc+1")961__xlated("5: r0 = 1")962__xlated("6: exit")963__naked void sdiv32_overflow_ri(void)964{965 asm volatile (" \966 w2 = %[int_min]; \967 w4 = w2; \968 w2 s/= -1; \969 r0 = 0; \970 if w2 != w4 goto +1; \971 r0 = 1; \972 exit; \973" :974 : __imm_const(int_min, INT_MIN)975 : __clobber_all);976}977 978SEC("socket")979__description("SDIV32, r/i, small_val/-1")980__success __retval(-5)981__arch_x86_64982__xlated("0: w2 = 5")983__xlated("1: w4 = w2")984__xlated("2: w2 = -w2")985__xlated("3: w0 = w2")986__xlated("4: exit")987__naked void sdiv32_ri_divisor_neg_1(void)988{989 asm volatile (" \990 w2 = 5; \991 w4 = w2; \992 w2 s/= -1; \993 w0 = w2; \994 exit; \995" :996 :997 : __clobber_all);998}999 1000SEC("socket")1001__description("SMOD64, overflow r/r, LLONG_MIN/-1")1002__success __retval(0)1003__arch_x86_641004__xlated("0: r2 = 0x8000000000000000")1005__xlated("2: r3 = -1")1006__xlated("3: r4 = r2")1007__xlated("4: r11 = r3")1008__xlated("5: r11 += 1")1009__xlated("6: if r11 > 0x1 goto pc+3")1010__xlated("7: if r11 == 0x1 goto pc+3")1011__xlated("8: w2 = 0")1012__xlated("9: goto pc+1")1013__xlated("10: r2 s%= r3")1014__xlated("11: r0 = r2")1015__xlated("12: exit")1016__naked void smod64_overflow_rr(void)1017{1018 asm volatile (" \1019 r2 = %[llong_min] ll; \1020 r3 = -1; \1021 r4 = r2; \1022 r2 s%%= r3; \1023 r0 = r2; \1024 exit; \1025" :1026 : __imm_const(llong_min, LLONG_MIN)1027 : __clobber_all);1028}1029 1030SEC("socket")1031__description("SMOD64, r/r, small_val/-1")1032__success __retval(0)1033__arch_x86_641034__xlated("0: r2 = 5")1035__xlated("1: r3 = -1")1036__xlated("2: r4 = r2")1037__xlated("3: r11 = r3")1038__xlated("4: r11 += 1")1039__xlated("5: if r11 > 0x1 goto pc+3")1040__xlated("6: if r11 == 0x1 goto pc+3")1041__xlated("7: w2 = 0")1042__xlated("8: goto pc+1")1043__xlated("9: r2 s%= r3")1044__xlated("10: r0 = r2")1045__xlated("11: exit")1046__naked void smod64_rr_divisor_neg_1(void)1047{1048 asm volatile (" \1049 r2 = 5; \1050 r3 = -1; \1051 r4 = r2; \1052 r2 s%%= r3; \1053 r0 = r2; \1054 exit; \1055" :1056 :1057 : __clobber_all);1058}1059 1060SEC("socket")1061__description("SMOD64, overflow r/i, LLONG_MIN/-1")1062__success __retval(0)1063__arch_x86_641064__xlated("0: r2 = 0x8000000000000000")1065__xlated("2: r4 = r2")1066__xlated("3: w2 = 0")1067__xlated("4: r0 = r2")1068__xlated("5: exit")1069__naked void smod64_overflow_ri(void)1070{1071 asm volatile (" \1072 r2 = %[llong_min] ll; \1073 r4 = r2; \1074 r2 s%%= -1; \1075 r0 = r2; \1076 exit; \1077" :1078 : __imm_const(llong_min, LLONG_MIN)1079 : __clobber_all);1080}1081 1082SEC("socket")1083__description("SMOD64, r/i, small_val/-1")1084__success __retval(0)1085__arch_x86_641086__xlated("0: r2 = 5")1087__xlated("1: r4 = r2")1088__xlated("2: w2 = 0")1089__xlated("3: r0 = r2")1090__xlated("4: exit")1091__naked void smod64_ri_divisor_neg_1(void)1092{1093 asm volatile (" \1094 r2 = 5; \1095 r4 = r2; \1096 r2 s%%= -1; \1097 r0 = r2; \1098 exit; \1099" :1100 :1101 : __clobber_all);1102}1103 1104SEC("socket")1105__description("SMOD32, overflow r/r, INT_MIN/-1")1106__success __retval(0)1107__arch_x86_641108__xlated("0: w2 = -2147483648")1109__xlated("1: w3 = -1")1110__xlated("2: w4 = w2")1111__xlated("3: r11 = r3")1112__xlated("4: w11 += 1")1113__xlated("5: if w11 > 0x1 goto pc+3")1114__xlated("6: if w11 == 0x1 goto pc+4")1115__xlated("7: w2 = 0")1116__xlated("8: goto pc+1")1117__xlated("9: w2 s%= w3")1118__xlated("10: goto pc+1")1119__xlated("11: w2 = w2")1120__xlated("12: r0 = r2")1121__xlated("13: exit")1122__naked void smod32_overflow_rr(void)1123{1124 asm volatile (" \1125 w2 = %[int_min]; \1126 w3 = -1; \1127 w4 = w2; \1128 w2 s%%= w3; \1129 r0 = r2; \1130 exit; \1131" :1132 : __imm_const(int_min, INT_MIN)1133 : __clobber_all);1134}1135 1136SEC("socket")1137__description("SMOD32, r/r, small_val/-1")1138__success __retval(0)1139__arch_x86_641140__xlated("0: w2 = -5")1141__xlated("1: w3 = -1")1142__xlated("2: w4 = w2")1143__xlated("3: r11 = r3")1144__xlated("4: w11 += 1")1145__xlated("5: if w11 > 0x1 goto pc+3")1146__xlated("6: if w11 == 0x1 goto pc+4")1147__xlated("7: w2 = 0")1148__xlated("8: goto pc+1")1149__xlated("9: w2 s%= w3")1150__xlated("10: goto pc+1")1151__xlated("11: w2 = w2")1152__xlated("12: r0 = r2")1153__xlated("13: exit")1154__naked void smod32_rr_divisor_neg_1(void)1155{1156 asm volatile (" \1157 w2 = -5; \1158 w3 = -1; \1159 w4 = w2; \1160 w2 s%%= w3; \1161 r0 = r2; \1162 exit; \1163" :1164 :1165 : __clobber_all);1166}1167 1168SEC("socket")1169__description("SMOD32, overflow r/i, INT_MIN/-1")1170__success __retval(0)1171__arch_x86_641172__xlated("0: w2 = -2147483648")1173__xlated("1: w4 = w2")1174__xlated("2: w2 = 0")1175__xlated("3: r0 = r2")1176__xlated("4: exit")1177__naked void smod32_overflow_ri(void)1178{1179 asm volatile (" \1180 w2 = %[int_min]; \1181 w4 = w2; \1182 w2 s%%= -1; \1183 r0 = r2; \1184 exit; \1185" :1186 : __imm_const(int_min, INT_MIN)1187 : __clobber_all);1188}1189 1190SEC("socket")1191__description("SMOD32, r/i, small_val/-1")1192__success __retval(0)1193__arch_x86_641194__xlated("0: w2 = 5")1195__xlated("1: w4 = w2")1196__xlated("2: w2 = 0")1197__xlated("3: w0 = w2")1198__xlated("4: exit")1199__naked void smod32_ri_divisor_neg_1(void)1200{1201 asm volatile (" \1202 w2 = 5; \1203 w4 = w2; \1204 w2 s%%= -1; \1205 w0 = w2; \1206 exit; \1207" :1208 :1209 : __clobber_all);1210}1211 1212#else1213 1214SEC("socket")1215__description("cpuv4 is not supported by compiler or jit, use a dummy test")1216__success1217int dummy_test(void)1218{1219 return 0;1220}1221 1222#endif1223 1224char _license[] SEC("license") = "GPL";1225