test_bpf.c 364 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Testsuite for BPF interpreter and BPF JIT compiler
  4. *
  5. * Copyright (c) 2011-2014 PLUMgrid, http://plumgrid.com
  6. */
  7. #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  8. #include <linux/init.h>
  9. #include <linux/module.h>
  10. #include <linux/filter.h>
  11. #include <linux/bpf.h>
  12. #include <linux/skbuff.h>
  13. #include <linux/netdevice.h>
  14. #include <linux/if_vlan.h>
  15. #include <linux/prandom.h>
  16. #include <linux/highmem.h>
  17. #include <linux/sched.h>
  18. /* General test specific settings */
  19. #define MAX_SUBTESTS 3
  20. #define MAX_TESTRUNS 1000
  21. #define MAX_DATA 128
  22. #define MAX_INSNS 512
  23. #define MAX_K 0xffffFFFF
  24. /* Few constants used to init test 'skb' */
  25. #define SKB_TYPE 3
  26. #define SKB_MARK 0x1234aaaa
  27. #define SKB_HASH 0x1234aaab
  28. #define SKB_QUEUE_MAP 123
  29. #define SKB_VLAN_TCI 0xffff
  30. #define SKB_VLAN_PRESENT 1
  31. #define SKB_DEV_IFINDEX 577
  32. #define SKB_DEV_TYPE 588
  33. /* Redefine REGs to make tests less verbose */
  34. #define R0 BPF_REG_0
  35. #define R1 BPF_REG_1
  36. #define R2 BPF_REG_2
  37. #define R3 BPF_REG_3
  38. #define R4 BPF_REG_4
  39. #define R5 BPF_REG_5
  40. #define R6 BPF_REG_6
  41. #define R7 BPF_REG_7
  42. #define R8 BPF_REG_8
  43. #define R9 BPF_REG_9
  44. #define R10 BPF_REG_10
  45. /* Flags that can be passed to test cases */
  46. #define FLAG_NO_DATA BIT(0)
  47. #define FLAG_EXPECTED_FAIL BIT(1)
  48. #define FLAG_SKB_FRAG BIT(2)
  49. #define FLAG_VERIFIER_ZEXT BIT(3)
  50. #define FLAG_LARGE_MEM BIT(4)
  51. enum {
  52. CLASSIC = BIT(6), /* Old BPF instructions only. */
  53. INTERNAL = BIT(7), /* Extended instruction set. */
  54. };
  55. #define TEST_TYPE_MASK (CLASSIC | INTERNAL)
  56. struct bpf_test {
  57. const char *descr;
  58. union {
  59. struct sock_filter insns[MAX_INSNS];
  60. struct bpf_insn insns_int[MAX_INSNS];
  61. struct {
  62. void *insns;
  63. unsigned int len;
  64. } ptr;
  65. } u;
  66. __u8 aux;
  67. __u8 data[MAX_DATA];
  68. struct {
  69. int data_size;
  70. __u32 result;
  71. } test[MAX_SUBTESTS];
  72. int (*fill_helper)(struct bpf_test *self);
  73. int expected_errcode; /* used when FLAG_EXPECTED_FAIL is set in the aux */
  74. __u8 frag_data[MAX_DATA];
  75. int stack_depth; /* for eBPF only, since tests don't call verifier */
  76. int nr_testruns; /* Custom run count, defaults to MAX_TESTRUNS if 0 */
  77. };
  78. /* Large test cases need separate allocation and fill handler. */
  79. static int bpf_fill_maxinsns1(struct bpf_test *self)
  80. {
  81. unsigned int len = BPF_MAXINSNS;
  82. struct sock_filter *insn;
  83. __u32 k = ~0;
  84. int i;
  85. insn = kmalloc_objs(*insn, len);
  86. if (!insn)
  87. return -ENOMEM;
  88. for (i = 0; i < len; i++, k--)
  89. insn[i] = __BPF_STMT(BPF_RET | BPF_K, k);
  90. self->u.ptr.insns = insn;
  91. self->u.ptr.len = len;
  92. return 0;
  93. }
  94. static int bpf_fill_maxinsns2(struct bpf_test *self)
  95. {
  96. unsigned int len = BPF_MAXINSNS;
  97. struct sock_filter *insn;
  98. int i;
  99. insn = kmalloc_objs(*insn, len);
  100. if (!insn)
  101. return -ENOMEM;
  102. for (i = 0; i < len; i++)
  103. insn[i] = __BPF_STMT(BPF_RET | BPF_K, 0xfefefefe);
  104. self->u.ptr.insns = insn;
  105. self->u.ptr.len = len;
  106. return 0;
  107. }
  108. static int bpf_fill_maxinsns3(struct bpf_test *self)
  109. {
  110. unsigned int len = BPF_MAXINSNS;
  111. struct sock_filter *insn;
  112. struct rnd_state rnd;
  113. int i;
  114. insn = kmalloc_objs(*insn, len);
  115. if (!insn)
  116. return -ENOMEM;
  117. prandom_seed_state(&rnd, 3141592653589793238ULL);
  118. for (i = 0; i < len - 1; i++) {
  119. __u32 k = prandom_u32_state(&rnd);
  120. insn[i] = __BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, k);
  121. }
  122. insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
  123. self->u.ptr.insns = insn;
  124. self->u.ptr.len = len;
  125. return 0;
  126. }
  127. static int bpf_fill_maxinsns4(struct bpf_test *self)
  128. {
  129. unsigned int len = BPF_MAXINSNS + 1;
  130. struct sock_filter *insn;
  131. int i;
  132. insn = kmalloc_objs(*insn, len);
  133. if (!insn)
  134. return -ENOMEM;
  135. for (i = 0; i < len; i++)
  136. insn[i] = __BPF_STMT(BPF_RET | BPF_K, 0xfefefefe);
  137. self->u.ptr.insns = insn;
  138. self->u.ptr.len = len;
  139. return 0;
  140. }
  141. static int bpf_fill_maxinsns5(struct bpf_test *self)
  142. {
  143. unsigned int len = BPF_MAXINSNS;
  144. struct sock_filter *insn;
  145. int i;
  146. insn = kmalloc_objs(*insn, len);
  147. if (!insn)
  148. return -ENOMEM;
  149. insn[0] = __BPF_JUMP(BPF_JMP | BPF_JA, len - 2, 0, 0);
  150. for (i = 1; i < len - 1; i++)
  151. insn[i] = __BPF_STMT(BPF_RET | BPF_K, 0xfefefefe);
  152. insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xabababab);
  153. self->u.ptr.insns = insn;
  154. self->u.ptr.len = len;
  155. return 0;
  156. }
  157. static int bpf_fill_maxinsns6(struct bpf_test *self)
  158. {
  159. unsigned int len = BPF_MAXINSNS;
  160. struct sock_filter *insn;
  161. int i;
  162. insn = kmalloc_objs(*insn, len);
  163. if (!insn)
  164. return -ENOMEM;
  165. for (i = 0; i < len - 1; i++)
  166. insn[i] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS, SKF_AD_OFF +
  167. SKF_AD_VLAN_TAG_PRESENT);
  168. insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
  169. self->u.ptr.insns = insn;
  170. self->u.ptr.len = len;
  171. return 0;
  172. }
  173. static int bpf_fill_maxinsns7(struct bpf_test *self)
  174. {
  175. unsigned int len = BPF_MAXINSNS;
  176. struct sock_filter *insn;
  177. int i;
  178. insn = kmalloc_objs(*insn, len);
  179. if (!insn)
  180. return -ENOMEM;
  181. for (i = 0; i < len - 4; i++)
  182. insn[i] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS, SKF_AD_OFF +
  183. SKF_AD_CPU);
  184. insn[len - 4] = __BPF_STMT(BPF_MISC | BPF_TAX, 0);
  185. insn[len - 3] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS, SKF_AD_OFF +
  186. SKF_AD_CPU);
  187. insn[len - 2] = __BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0);
  188. insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
  189. self->u.ptr.insns = insn;
  190. self->u.ptr.len = len;
  191. return 0;
  192. }
  193. static int bpf_fill_maxinsns8(struct bpf_test *self)
  194. {
  195. unsigned int len = BPF_MAXINSNS;
  196. struct sock_filter *insn;
  197. int i, jmp_off = len - 3;
  198. insn = kmalloc_objs(*insn, len);
  199. if (!insn)
  200. return -ENOMEM;
  201. insn[0] = __BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff);
  202. for (i = 1; i < len - 1; i++)
  203. insn[i] = __BPF_JUMP(BPF_JMP | BPF_JGT, 0xffffffff, jmp_off--, 0);
  204. insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
  205. self->u.ptr.insns = insn;
  206. self->u.ptr.len = len;
  207. return 0;
  208. }
  209. static int bpf_fill_maxinsns9(struct bpf_test *self)
  210. {
  211. unsigned int len = BPF_MAXINSNS;
  212. struct bpf_insn *insn;
  213. int i;
  214. insn = kmalloc_objs(*insn, len);
  215. if (!insn)
  216. return -ENOMEM;
  217. insn[0] = BPF_JMP_IMM(BPF_JA, 0, 0, len - 2);
  218. insn[1] = BPF_ALU32_IMM(BPF_MOV, R0, 0xcbababab);
  219. insn[2] = BPF_EXIT_INSN();
  220. for (i = 3; i < len - 2; i++)
  221. insn[i] = BPF_ALU32_IMM(BPF_MOV, R0, 0xfefefefe);
  222. insn[len - 2] = BPF_EXIT_INSN();
  223. insn[len - 1] = BPF_JMP_IMM(BPF_JA, 0, 0, -(len - 1));
  224. self->u.ptr.insns = insn;
  225. self->u.ptr.len = len;
  226. return 0;
  227. }
  228. static int bpf_fill_maxinsns10(struct bpf_test *self)
  229. {
  230. unsigned int len = BPF_MAXINSNS, hlen = len - 2;
  231. struct bpf_insn *insn;
  232. int i;
  233. insn = kmalloc_objs(*insn, len);
  234. if (!insn)
  235. return -ENOMEM;
  236. for (i = 0; i < hlen / 2; i++)
  237. insn[i] = BPF_JMP_IMM(BPF_JA, 0, 0, hlen - 2 - 2 * i);
  238. for (i = hlen - 1; i > hlen / 2; i--)
  239. insn[i] = BPF_JMP_IMM(BPF_JA, 0, 0, hlen - 1 - 2 * i);
  240. insn[hlen / 2] = BPF_JMP_IMM(BPF_JA, 0, 0, hlen / 2 - 1);
  241. insn[hlen] = BPF_ALU32_IMM(BPF_MOV, R0, 0xabababac);
  242. insn[hlen + 1] = BPF_EXIT_INSN();
  243. self->u.ptr.insns = insn;
  244. self->u.ptr.len = len;
  245. return 0;
  246. }
  247. static int __bpf_fill_ja(struct bpf_test *self, unsigned int len,
  248. unsigned int plen)
  249. {
  250. struct sock_filter *insn;
  251. unsigned int rlen;
  252. int i, j;
  253. insn = kmalloc_objs(*insn, len);
  254. if (!insn)
  255. return -ENOMEM;
  256. rlen = (len % plen) - 1;
  257. for (i = 0; i + plen < len; i += plen)
  258. for (j = 0; j < plen; j++)
  259. insn[i + j] = __BPF_JUMP(BPF_JMP | BPF_JA,
  260. plen - 1 - j, 0, 0);
  261. for (j = 0; j < rlen; j++)
  262. insn[i + j] = __BPF_JUMP(BPF_JMP | BPF_JA, rlen - 1 - j,
  263. 0, 0);
  264. insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xababcbac);
  265. self->u.ptr.insns = insn;
  266. self->u.ptr.len = len;
  267. return 0;
  268. }
  269. static int bpf_fill_maxinsns11(struct bpf_test *self)
  270. {
  271. /* Hits 70 passes on x86_64 and triggers NOPs padding. */
  272. return __bpf_fill_ja(self, BPF_MAXINSNS, 68);
  273. }
  274. static int bpf_fill_maxinsns12(struct bpf_test *self)
  275. {
  276. unsigned int len = BPF_MAXINSNS;
  277. struct sock_filter *insn;
  278. int i = 0;
  279. insn = kmalloc_objs(*insn, len);
  280. if (!insn)
  281. return -ENOMEM;
  282. insn[0] = __BPF_JUMP(BPF_JMP | BPF_JA, len - 2, 0, 0);
  283. for (i = 1; i < len - 1; i++)
  284. insn[i] = __BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0);
  285. insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xabababab);
  286. self->u.ptr.insns = insn;
  287. self->u.ptr.len = len;
  288. return 0;
  289. }
  290. static int bpf_fill_maxinsns13(struct bpf_test *self)
  291. {
  292. unsigned int len = BPF_MAXINSNS;
  293. struct sock_filter *insn;
  294. int i = 0;
  295. insn = kmalloc_objs(*insn, len);
  296. if (!insn)
  297. return -ENOMEM;
  298. for (i = 0; i < len - 3; i++)
  299. insn[i] = __BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0);
  300. insn[len - 3] = __BPF_STMT(BPF_LD | BPF_IMM, 0xabababab);
  301. insn[len - 2] = __BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0);
  302. insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
  303. self->u.ptr.insns = insn;
  304. self->u.ptr.len = len;
  305. return 0;
  306. }
  307. static int bpf_fill_ja(struct bpf_test *self)
  308. {
  309. /* Hits exactly 11 passes on x86_64 JIT. */
  310. return __bpf_fill_ja(self, 12, 9);
  311. }
  312. static int bpf_fill_ld_abs_get_processor_id(struct bpf_test *self)
  313. {
  314. unsigned int len = BPF_MAXINSNS;
  315. struct sock_filter *insn;
  316. int i;
  317. insn = kmalloc_objs(*insn, len);
  318. if (!insn)
  319. return -ENOMEM;
  320. for (i = 0; i < len - 1; i += 2) {
  321. insn[i] = __BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 0);
  322. insn[i + 1] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  323. SKF_AD_OFF + SKF_AD_CPU);
  324. }
  325. insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xbee);
  326. self->u.ptr.insns = insn;
  327. self->u.ptr.len = len;
  328. return 0;
  329. }
  330. static int __bpf_fill_stxdw(struct bpf_test *self, int size)
  331. {
  332. unsigned int len = BPF_MAXINSNS;
  333. struct bpf_insn *insn;
  334. int i;
  335. insn = kmalloc_objs(*insn, len);
  336. if (!insn)
  337. return -ENOMEM;
  338. insn[0] = BPF_ALU32_IMM(BPF_MOV, R0, 1);
  339. insn[1] = BPF_ST_MEM(size, R10, -40, 42);
  340. for (i = 2; i < len - 2; i++)
  341. insn[i] = BPF_STX_XADD(size, R10, R0, -40);
  342. insn[len - 2] = BPF_LDX_MEM(size, R0, R10, -40);
  343. insn[len - 1] = BPF_EXIT_INSN();
  344. self->u.ptr.insns = insn;
  345. self->u.ptr.len = len;
  346. self->stack_depth = 40;
  347. return 0;
  348. }
  349. static int bpf_fill_stxw(struct bpf_test *self)
  350. {
  351. return __bpf_fill_stxdw(self, BPF_W);
  352. }
  353. static int bpf_fill_stxdw(struct bpf_test *self)
  354. {
  355. return __bpf_fill_stxdw(self, BPF_DW);
  356. }
  357. static int __bpf_ld_imm64(struct bpf_insn insns[2], u8 reg, s64 imm64)
  358. {
  359. struct bpf_insn tmp[] = {BPF_LD_IMM64(reg, imm64)};
  360. memcpy(insns, tmp, sizeof(tmp));
  361. return 2;
  362. }
  363. /*
  364. * Branch conversion tests. Complex operations can expand to a lot
  365. * of instructions when JITed. This in turn may cause jump offsets
  366. * to overflow the field size of the native instruction, triggering
  367. * a branch conversion mechanism in some JITs.
  368. */
  369. static int __bpf_fill_max_jmp(struct bpf_test *self, int jmp, int imm, bool alu32)
  370. {
  371. struct bpf_insn *insns;
  372. int len = S16_MAX + 5;
  373. int i;
  374. insns = kmalloc_objs(*insns, len);
  375. if (!insns)
  376. return -ENOMEM;
  377. i = __bpf_ld_imm64(insns, R1, 0x0123456789abcdefULL);
  378. insns[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 1);
  379. insns[i++] = BPF_JMP_IMM(jmp, R0, imm, S16_MAX);
  380. insns[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 2);
  381. insns[i++] = BPF_EXIT_INSN();
  382. while (i < len - 1) {
  383. static const int ops[] = {
  384. BPF_LSH, BPF_RSH, BPF_ARSH, BPF_ADD,
  385. BPF_SUB, BPF_MUL, BPF_DIV, BPF_MOD,
  386. };
  387. int op = ops[(i >> 1) % ARRAY_SIZE(ops)];
  388. if ((i & 1) || alu32)
  389. insns[i++] = BPF_ALU32_REG(op, R0, R1);
  390. else
  391. insns[i++] = BPF_ALU64_REG(op, R0, R1);
  392. }
  393. insns[i++] = BPF_EXIT_INSN();
  394. self->u.ptr.insns = insns;
  395. self->u.ptr.len = len;
  396. BUG_ON(i != len);
  397. return 0;
  398. }
  399. /* Branch taken by runtime decision */
  400. static int bpf_fill_max_jmp_taken_32(struct bpf_test *self)
  401. {
  402. return __bpf_fill_max_jmp(self, BPF_JEQ, 1, true);
  403. }
  404. static int bpf_fill_max_jmp_taken(struct bpf_test *self)
  405. {
  406. return __bpf_fill_max_jmp(self, BPF_JEQ, 1, false);
  407. }
  408. /* Branch not taken by runtime decision */
  409. static int bpf_fill_max_jmp_not_taken_32(struct bpf_test *self)
  410. {
  411. return __bpf_fill_max_jmp(self, BPF_JEQ, 0, true);
  412. }
  413. static int bpf_fill_max_jmp_not_taken(struct bpf_test *self)
  414. {
  415. return __bpf_fill_max_jmp(self, BPF_JEQ, 0, false);
  416. }
  417. /* Branch always taken, known at JIT time */
  418. static int bpf_fill_max_jmp_always_taken_32(struct bpf_test *self)
  419. {
  420. return __bpf_fill_max_jmp(self, BPF_JGE, 0, true);
  421. }
  422. static int bpf_fill_max_jmp_always_taken(struct bpf_test *self)
  423. {
  424. return __bpf_fill_max_jmp(self, BPF_JGE, 0, false);
  425. }
  426. /* Branch never taken, known at JIT time */
  427. static int bpf_fill_max_jmp_never_taken_32(struct bpf_test *self)
  428. {
  429. return __bpf_fill_max_jmp(self, BPF_JLT, 0, true);
  430. }
  431. static int bpf_fill_max_jmp_never_taken(struct bpf_test *self)
  432. {
  433. return __bpf_fill_max_jmp(self, BPF_JLT, 0, false);
  434. }
  435. /* ALU result computation used in tests */
  436. static bool __bpf_alu_result(u64 *res, u64 v1, u64 v2, u8 op)
  437. {
  438. *res = 0;
  439. switch (op) {
  440. case BPF_MOV:
  441. *res = v2;
  442. break;
  443. case BPF_AND:
  444. *res = v1 & v2;
  445. break;
  446. case BPF_OR:
  447. *res = v1 | v2;
  448. break;
  449. case BPF_XOR:
  450. *res = v1 ^ v2;
  451. break;
  452. case BPF_LSH:
  453. *res = v1 << v2;
  454. break;
  455. case BPF_RSH:
  456. *res = v1 >> v2;
  457. break;
  458. case BPF_ARSH:
  459. *res = v1 >> v2;
  460. if (v2 > 0 && v1 > S64_MAX)
  461. *res |= ~0ULL << (64 - v2);
  462. break;
  463. case BPF_ADD:
  464. *res = v1 + v2;
  465. break;
  466. case BPF_SUB:
  467. *res = v1 - v2;
  468. break;
  469. case BPF_MUL:
  470. *res = v1 * v2;
  471. break;
  472. case BPF_DIV:
  473. if (v2 == 0)
  474. return false;
  475. *res = div64_u64(v1, v2);
  476. break;
  477. case BPF_MOD:
  478. if (v2 == 0)
  479. return false;
  480. div64_u64_rem(v1, v2, res);
  481. break;
  482. }
  483. return true;
  484. }
  485. /* Test an ALU shift operation for all valid shift values */
  486. static int __bpf_fill_alu_shift(struct bpf_test *self, u8 op,
  487. u8 mode, bool alu32)
  488. {
  489. static const s64 regs[] = {
  490. 0x0123456789abcdefLL, /* dword > 0, word < 0 */
  491. 0xfedcba9876543210LL, /* dword < 0, word > 0 */
  492. 0xfedcba0198765432LL, /* dword < 0, word < 0 */
  493. 0x0123458967abcdefLL, /* dword > 0, word > 0 */
  494. };
  495. int bits = alu32 ? 32 : 64;
  496. int len = (2 + 7 * bits) * ARRAY_SIZE(regs) + 3;
  497. struct bpf_insn *insn;
  498. int imm, k;
  499. int i = 0;
  500. insn = kmalloc_objs(*insn, len);
  501. if (!insn)
  502. return -ENOMEM;
  503. insn[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 0);
  504. for (k = 0; k < ARRAY_SIZE(regs); k++) {
  505. s64 reg = regs[k];
  506. i += __bpf_ld_imm64(&insn[i], R3, reg);
  507. for (imm = 0; imm < bits; imm++) {
  508. u64 val;
  509. /* Perform operation */
  510. insn[i++] = BPF_ALU64_REG(BPF_MOV, R1, R3);
  511. insn[i++] = BPF_ALU64_IMM(BPF_MOV, R2, imm);
  512. if (alu32) {
  513. if (mode == BPF_K)
  514. insn[i++] = BPF_ALU32_IMM(op, R1, imm);
  515. else
  516. insn[i++] = BPF_ALU32_REG(op, R1, R2);
  517. if (op == BPF_ARSH)
  518. reg = (s32)reg;
  519. else
  520. reg = (u32)reg;
  521. __bpf_alu_result(&val, reg, imm, op);
  522. val = (u32)val;
  523. } else {
  524. if (mode == BPF_K)
  525. insn[i++] = BPF_ALU64_IMM(op, R1, imm);
  526. else
  527. insn[i++] = BPF_ALU64_REG(op, R1, R2);
  528. __bpf_alu_result(&val, reg, imm, op);
  529. }
  530. /*
  531. * When debugging a JIT that fails this test, one
  532. * can write the immediate value to R0 here to find
  533. * out which operand values that fail.
  534. */
  535. /* Load reference and check the result */
  536. i += __bpf_ld_imm64(&insn[i], R4, val);
  537. insn[i++] = BPF_JMP_REG(BPF_JEQ, R1, R4, 1);
  538. insn[i++] = BPF_EXIT_INSN();
  539. }
  540. }
  541. insn[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 1);
  542. insn[i++] = BPF_EXIT_INSN();
  543. self->u.ptr.insns = insn;
  544. self->u.ptr.len = len;
  545. BUG_ON(i != len);
  546. return 0;
  547. }
  548. static int bpf_fill_alu64_lsh_imm(struct bpf_test *self)
  549. {
  550. return __bpf_fill_alu_shift(self, BPF_LSH, BPF_K, false);
  551. }
  552. static int bpf_fill_alu64_rsh_imm(struct bpf_test *self)
  553. {
  554. return __bpf_fill_alu_shift(self, BPF_RSH, BPF_K, false);
  555. }
  556. static int bpf_fill_alu64_arsh_imm(struct bpf_test *self)
  557. {
  558. return __bpf_fill_alu_shift(self, BPF_ARSH, BPF_K, false);
  559. }
  560. static int bpf_fill_alu64_lsh_reg(struct bpf_test *self)
  561. {
  562. return __bpf_fill_alu_shift(self, BPF_LSH, BPF_X, false);
  563. }
  564. static int bpf_fill_alu64_rsh_reg(struct bpf_test *self)
  565. {
  566. return __bpf_fill_alu_shift(self, BPF_RSH, BPF_X, false);
  567. }
  568. static int bpf_fill_alu64_arsh_reg(struct bpf_test *self)
  569. {
  570. return __bpf_fill_alu_shift(self, BPF_ARSH, BPF_X, false);
  571. }
  572. static int bpf_fill_alu32_lsh_imm(struct bpf_test *self)
  573. {
  574. return __bpf_fill_alu_shift(self, BPF_LSH, BPF_K, true);
  575. }
  576. static int bpf_fill_alu32_rsh_imm(struct bpf_test *self)
  577. {
  578. return __bpf_fill_alu_shift(self, BPF_RSH, BPF_K, true);
  579. }
  580. static int bpf_fill_alu32_arsh_imm(struct bpf_test *self)
  581. {
  582. return __bpf_fill_alu_shift(self, BPF_ARSH, BPF_K, true);
  583. }
  584. static int bpf_fill_alu32_lsh_reg(struct bpf_test *self)
  585. {
  586. return __bpf_fill_alu_shift(self, BPF_LSH, BPF_X, true);
  587. }
  588. static int bpf_fill_alu32_rsh_reg(struct bpf_test *self)
  589. {
  590. return __bpf_fill_alu_shift(self, BPF_RSH, BPF_X, true);
  591. }
  592. static int bpf_fill_alu32_arsh_reg(struct bpf_test *self)
  593. {
  594. return __bpf_fill_alu_shift(self, BPF_ARSH, BPF_X, true);
  595. }
  596. /*
  597. * Test an ALU register shift operation for all valid shift values
  598. * for the case when the source and destination are the same.
  599. */
  600. static int __bpf_fill_alu_shift_same_reg(struct bpf_test *self, u8 op,
  601. bool alu32)
  602. {
  603. int bits = alu32 ? 32 : 64;
  604. int len = 3 + 6 * bits;
  605. struct bpf_insn *insn;
  606. int i = 0;
  607. u64 val;
  608. insn = kmalloc_objs(*insn, len);
  609. if (!insn)
  610. return -ENOMEM;
  611. insn[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 0);
  612. for (val = 0; val < bits; val++) {
  613. u64 res;
  614. /* Perform operation */
  615. insn[i++] = BPF_ALU64_IMM(BPF_MOV, R1, val);
  616. if (alu32)
  617. insn[i++] = BPF_ALU32_REG(op, R1, R1);
  618. else
  619. insn[i++] = BPF_ALU64_REG(op, R1, R1);
  620. /* Compute the reference result */
  621. __bpf_alu_result(&res, val, val, op);
  622. if (alu32)
  623. res = (u32)res;
  624. i += __bpf_ld_imm64(&insn[i], R2, res);
  625. /* Check the actual result */
  626. insn[i++] = BPF_JMP_REG(BPF_JEQ, R1, R2, 1);
  627. insn[i++] = BPF_EXIT_INSN();
  628. }
  629. insn[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 1);
  630. insn[i++] = BPF_EXIT_INSN();
  631. self->u.ptr.insns = insn;
  632. self->u.ptr.len = len;
  633. BUG_ON(i != len);
  634. return 0;
  635. }
  636. static int bpf_fill_alu64_lsh_same_reg(struct bpf_test *self)
  637. {
  638. return __bpf_fill_alu_shift_same_reg(self, BPF_LSH, false);
  639. }
  640. static int bpf_fill_alu64_rsh_same_reg(struct bpf_test *self)
  641. {
  642. return __bpf_fill_alu_shift_same_reg(self, BPF_RSH, false);
  643. }
  644. static int bpf_fill_alu64_arsh_same_reg(struct bpf_test *self)
  645. {
  646. return __bpf_fill_alu_shift_same_reg(self, BPF_ARSH, false);
  647. }
  648. static int bpf_fill_alu32_lsh_same_reg(struct bpf_test *self)
  649. {
  650. return __bpf_fill_alu_shift_same_reg(self, BPF_LSH, true);
  651. }
  652. static int bpf_fill_alu32_rsh_same_reg(struct bpf_test *self)
  653. {
  654. return __bpf_fill_alu_shift_same_reg(self, BPF_RSH, true);
  655. }
  656. static int bpf_fill_alu32_arsh_same_reg(struct bpf_test *self)
  657. {
  658. return __bpf_fill_alu_shift_same_reg(self, BPF_ARSH, true);
  659. }
  660. /*
  661. * Common operand pattern generator for exhaustive power-of-two magnitudes
  662. * tests. The block size parameters can be adjusted to increase/reduce the
  663. * number of combinatons tested and thereby execution speed and memory
  664. * footprint.
  665. */
  666. static inline s64 value(int msb, int delta, int sign)
  667. {
  668. return sign * (1LL << msb) + delta;
  669. }
  670. static int __bpf_fill_pattern(struct bpf_test *self, void *arg,
  671. int dbits, int sbits, int block1, int block2,
  672. int (*emit)(struct bpf_test*, void*,
  673. struct bpf_insn*, s64, s64))
  674. {
  675. static const int sgn[][2] = {{1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
  676. struct bpf_insn *insns;
  677. int di, si, bt, db, sb;
  678. int count, len, k;
  679. int extra = 1 + 2;
  680. int i = 0;
  681. /* Total number of iterations for the two pattern */
  682. count = (dbits - 1) * (sbits - 1) * block1 * block1 * ARRAY_SIZE(sgn);
  683. count += (max(dbits, sbits) - 1) * block2 * block2 * ARRAY_SIZE(sgn);
  684. /* Compute the maximum number of insns and allocate the buffer */
  685. len = extra + count * (*emit)(self, arg, NULL, 0, 0);
  686. insns = kmalloc_array(len, sizeof(*insns), GFP_KERNEL);
  687. if (!insns)
  688. return -ENOMEM;
  689. /* Add head instruction(s) */
  690. insns[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 0);
  691. /*
  692. * Pattern 1: all combinations of power-of-two magnitudes and sign,
  693. * and with a block of contiguous values around each magnitude.
  694. */
  695. for (di = 0; di < dbits - 1; di++) /* Dst magnitudes */
  696. for (si = 0; si < sbits - 1; si++) /* Src magnitudes */
  697. for (k = 0; k < ARRAY_SIZE(sgn); k++) /* Sign combos */
  698. for (db = -(block1 / 2);
  699. db < (block1 + 1) / 2; db++)
  700. for (sb = -(block1 / 2);
  701. sb < (block1 + 1) / 2; sb++) {
  702. s64 dst, src;
  703. dst = value(di, db, sgn[k][0]);
  704. src = value(si, sb, sgn[k][1]);
  705. i += (*emit)(self, arg,
  706. &insns[i],
  707. dst, src);
  708. }
  709. /*
  710. * Pattern 2: all combinations for a larger block of values
  711. * for each power-of-two magnitude and sign, where the magnitude is
  712. * the same for both operands.
  713. */
  714. for (bt = 0; bt < max(dbits, sbits) - 1; bt++) /* Magnitude */
  715. for (k = 0; k < ARRAY_SIZE(sgn); k++) /* Sign combos */
  716. for (db = -(block2 / 2); db < (block2 + 1) / 2; db++)
  717. for (sb = -(block2 / 2);
  718. sb < (block2 + 1) / 2; sb++) {
  719. s64 dst, src;
  720. dst = value(bt % dbits, db, sgn[k][0]);
  721. src = value(bt % sbits, sb, sgn[k][1]);
  722. i += (*emit)(self, arg, &insns[i],
  723. dst, src);
  724. }
  725. /* Append tail instructions */
  726. insns[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 1);
  727. insns[i++] = BPF_EXIT_INSN();
  728. BUG_ON(i > len);
  729. self->u.ptr.insns = insns;
  730. self->u.ptr.len = i;
  731. return 0;
  732. }
  733. /*
  734. * Block size parameters used in pattern tests below. une as needed to
  735. * increase/reduce the number combinations tested, see following examples.
  736. * block values per operand MSB
  737. * ----------------------------------------
  738. * 0 none
  739. * 1 (1 << MSB)
  740. * 2 (1 << MSB) + [-1, 0]
  741. * 3 (1 << MSB) + [-1, 0, 1]
  742. */
  743. #define PATTERN_BLOCK1 1
  744. #define PATTERN_BLOCK2 5
  745. /* Number of test runs for a pattern test */
  746. #define NR_PATTERN_RUNS 1
  747. /*
  748. * Exhaustive tests of ALU operations for all combinations of power-of-two
  749. * magnitudes of the operands, both for positive and negative values. The
  750. * test is designed to verify e.g. the ALU and ALU64 operations for JITs that
  751. * emit different code depending on the magnitude of the immediate value.
  752. */
  753. static int __bpf_emit_alu64_imm(struct bpf_test *self, void *arg,
  754. struct bpf_insn *insns, s64 dst, s64 imm)
  755. {
  756. int op = *(int *)arg;
  757. int i = 0;
  758. u64 res;
  759. if (!insns)
  760. return 7;
  761. if (__bpf_alu_result(&res, dst, (s32)imm, op)) {
  762. i += __bpf_ld_imm64(&insns[i], R1, dst);
  763. i += __bpf_ld_imm64(&insns[i], R3, res);
  764. insns[i++] = BPF_ALU64_IMM(op, R1, imm);
  765. insns[i++] = BPF_JMP_REG(BPF_JEQ, R1, R3, 1);
  766. insns[i++] = BPF_EXIT_INSN();
  767. }
  768. return i;
  769. }
  770. static int __bpf_emit_alu32_imm(struct bpf_test *self, void *arg,
  771. struct bpf_insn *insns, s64 dst, s64 imm)
  772. {
  773. int op = *(int *)arg;
  774. int i = 0;
  775. u64 res;
  776. if (!insns)
  777. return 7;
  778. if (__bpf_alu_result(&res, (u32)dst, (u32)imm, op)) {
  779. i += __bpf_ld_imm64(&insns[i], R1, dst);
  780. i += __bpf_ld_imm64(&insns[i], R3, (u32)res);
  781. insns[i++] = BPF_ALU32_IMM(op, R1, imm);
  782. insns[i++] = BPF_JMP_REG(BPF_JEQ, R1, R3, 1);
  783. insns[i++] = BPF_EXIT_INSN();
  784. }
  785. return i;
  786. }
  787. static int __bpf_emit_alu64_reg(struct bpf_test *self, void *arg,
  788. struct bpf_insn *insns, s64 dst, s64 src)
  789. {
  790. int op = *(int *)arg;
  791. int i = 0;
  792. u64 res;
  793. if (!insns)
  794. return 9;
  795. if (__bpf_alu_result(&res, dst, src, op)) {
  796. i += __bpf_ld_imm64(&insns[i], R1, dst);
  797. i += __bpf_ld_imm64(&insns[i], R2, src);
  798. i += __bpf_ld_imm64(&insns[i], R3, res);
  799. insns[i++] = BPF_ALU64_REG(op, R1, R2);
  800. insns[i++] = BPF_JMP_REG(BPF_JEQ, R1, R3, 1);
  801. insns[i++] = BPF_EXIT_INSN();
  802. }
  803. return i;
  804. }
  805. static int __bpf_emit_alu32_reg(struct bpf_test *self, void *arg,
  806. struct bpf_insn *insns, s64 dst, s64 src)
  807. {
  808. int op = *(int *)arg;
  809. int i = 0;
  810. u64 res;
  811. if (!insns)
  812. return 9;
  813. if (__bpf_alu_result(&res, (u32)dst, (u32)src, op)) {
  814. i += __bpf_ld_imm64(&insns[i], R1, dst);
  815. i += __bpf_ld_imm64(&insns[i], R2, src);
  816. i += __bpf_ld_imm64(&insns[i], R3, (u32)res);
  817. insns[i++] = BPF_ALU32_REG(op, R1, R2);
  818. insns[i++] = BPF_JMP_REG(BPF_JEQ, R1, R3, 1);
  819. insns[i++] = BPF_EXIT_INSN();
  820. }
  821. return i;
  822. }
  823. static int __bpf_fill_alu64_imm(struct bpf_test *self, int op)
  824. {
  825. return __bpf_fill_pattern(self, &op, 64, 32,
  826. PATTERN_BLOCK1, PATTERN_BLOCK2,
  827. &__bpf_emit_alu64_imm);
  828. }
  829. static int __bpf_fill_alu32_imm(struct bpf_test *self, int op)
  830. {
  831. return __bpf_fill_pattern(self, &op, 64, 32,
  832. PATTERN_BLOCK1, PATTERN_BLOCK2,
  833. &__bpf_emit_alu32_imm);
  834. }
  835. static int __bpf_fill_alu64_reg(struct bpf_test *self, int op)
  836. {
  837. return __bpf_fill_pattern(self, &op, 64, 64,
  838. PATTERN_BLOCK1, PATTERN_BLOCK2,
  839. &__bpf_emit_alu64_reg);
  840. }
  841. static int __bpf_fill_alu32_reg(struct bpf_test *self, int op)
  842. {
  843. return __bpf_fill_pattern(self, &op, 64, 64,
  844. PATTERN_BLOCK1, PATTERN_BLOCK2,
  845. &__bpf_emit_alu32_reg);
  846. }
  847. /* ALU64 immediate operations */
  848. static int bpf_fill_alu64_mov_imm(struct bpf_test *self)
  849. {
  850. return __bpf_fill_alu64_imm(self, BPF_MOV);
  851. }
  852. static int bpf_fill_alu64_and_imm(struct bpf_test *self)
  853. {
  854. return __bpf_fill_alu64_imm(self, BPF_AND);
  855. }
  856. static int bpf_fill_alu64_or_imm(struct bpf_test *self)
  857. {
  858. return __bpf_fill_alu64_imm(self, BPF_OR);
  859. }
  860. static int bpf_fill_alu64_xor_imm(struct bpf_test *self)
  861. {
  862. return __bpf_fill_alu64_imm(self, BPF_XOR);
  863. }
  864. static int bpf_fill_alu64_add_imm(struct bpf_test *self)
  865. {
  866. return __bpf_fill_alu64_imm(self, BPF_ADD);
  867. }
  868. static int bpf_fill_alu64_sub_imm(struct bpf_test *self)
  869. {
  870. return __bpf_fill_alu64_imm(self, BPF_SUB);
  871. }
  872. static int bpf_fill_alu64_mul_imm(struct bpf_test *self)
  873. {
  874. return __bpf_fill_alu64_imm(self, BPF_MUL);
  875. }
  876. static int bpf_fill_alu64_div_imm(struct bpf_test *self)
  877. {
  878. return __bpf_fill_alu64_imm(self, BPF_DIV);
  879. }
  880. static int bpf_fill_alu64_mod_imm(struct bpf_test *self)
  881. {
  882. return __bpf_fill_alu64_imm(self, BPF_MOD);
  883. }
  884. /* ALU32 immediate operations */
  885. static int bpf_fill_alu32_mov_imm(struct bpf_test *self)
  886. {
  887. return __bpf_fill_alu32_imm(self, BPF_MOV);
  888. }
  889. static int bpf_fill_alu32_and_imm(struct bpf_test *self)
  890. {
  891. return __bpf_fill_alu32_imm(self, BPF_AND);
  892. }
  893. static int bpf_fill_alu32_or_imm(struct bpf_test *self)
  894. {
  895. return __bpf_fill_alu32_imm(self, BPF_OR);
  896. }
  897. static int bpf_fill_alu32_xor_imm(struct bpf_test *self)
  898. {
  899. return __bpf_fill_alu32_imm(self, BPF_XOR);
  900. }
  901. static int bpf_fill_alu32_add_imm(struct bpf_test *self)
  902. {
  903. return __bpf_fill_alu32_imm(self, BPF_ADD);
  904. }
  905. static int bpf_fill_alu32_sub_imm(struct bpf_test *self)
  906. {
  907. return __bpf_fill_alu32_imm(self, BPF_SUB);
  908. }
  909. static int bpf_fill_alu32_mul_imm(struct bpf_test *self)
  910. {
  911. return __bpf_fill_alu32_imm(self, BPF_MUL);
  912. }
  913. static int bpf_fill_alu32_div_imm(struct bpf_test *self)
  914. {
  915. return __bpf_fill_alu32_imm(self, BPF_DIV);
  916. }
  917. static int bpf_fill_alu32_mod_imm(struct bpf_test *self)
  918. {
  919. return __bpf_fill_alu32_imm(self, BPF_MOD);
  920. }
  921. /* ALU64 register operations */
  922. static int bpf_fill_alu64_mov_reg(struct bpf_test *self)
  923. {
  924. return __bpf_fill_alu64_reg(self, BPF_MOV);
  925. }
  926. static int bpf_fill_alu64_and_reg(struct bpf_test *self)
  927. {
  928. return __bpf_fill_alu64_reg(self, BPF_AND);
  929. }
  930. static int bpf_fill_alu64_or_reg(struct bpf_test *self)
  931. {
  932. return __bpf_fill_alu64_reg(self, BPF_OR);
  933. }
  934. static int bpf_fill_alu64_xor_reg(struct bpf_test *self)
  935. {
  936. return __bpf_fill_alu64_reg(self, BPF_XOR);
  937. }
  938. static int bpf_fill_alu64_add_reg(struct bpf_test *self)
  939. {
  940. return __bpf_fill_alu64_reg(self, BPF_ADD);
  941. }
  942. static int bpf_fill_alu64_sub_reg(struct bpf_test *self)
  943. {
  944. return __bpf_fill_alu64_reg(self, BPF_SUB);
  945. }
  946. static int bpf_fill_alu64_mul_reg(struct bpf_test *self)
  947. {
  948. return __bpf_fill_alu64_reg(self, BPF_MUL);
  949. }
  950. static int bpf_fill_alu64_div_reg(struct bpf_test *self)
  951. {
  952. return __bpf_fill_alu64_reg(self, BPF_DIV);
  953. }
  954. static int bpf_fill_alu64_mod_reg(struct bpf_test *self)
  955. {
  956. return __bpf_fill_alu64_reg(self, BPF_MOD);
  957. }
  958. /* ALU32 register operations */
  959. static int bpf_fill_alu32_mov_reg(struct bpf_test *self)
  960. {
  961. return __bpf_fill_alu32_reg(self, BPF_MOV);
  962. }
  963. static int bpf_fill_alu32_and_reg(struct bpf_test *self)
  964. {
  965. return __bpf_fill_alu32_reg(self, BPF_AND);
  966. }
  967. static int bpf_fill_alu32_or_reg(struct bpf_test *self)
  968. {
  969. return __bpf_fill_alu32_reg(self, BPF_OR);
  970. }
  971. static int bpf_fill_alu32_xor_reg(struct bpf_test *self)
  972. {
  973. return __bpf_fill_alu32_reg(self, BPF_XOR);
  974. }
  975. static int bpf_fill_alu32_add_reg(struct bpf_test *self)
  976. {
  977. return __bpf_fill_alu32_reg(self, BPF_ADD);
  978. }
  979. static int bpf_fill_alu32_sub_reg(struct bpf_test *self)
  980. {
  981. return __bpf_fill_alu32_reg(self, BPF_SUB);
  982. }
  983. static int bpf_fill_alu32_mul_reg(struct bpf_test *self)
  984. {
  985. return __bpf_fill_alu32_reg(self, BPF_MUL);
  986. }
  987. static int bpf_fill_alu32_div_reg(struct bpf_test *self)
  988. {
  989. return __bpf_fill_alu32_reg(self, BPF_DIV);
  990. }
  991. static int bpf_fill_alu32_mod_reg(struct bpf_test *self)
  992. {
  993. return __bpf_fill_alu32_reg(self, BPF_MOD);
  994. }
  995. /*
  996. * Test JITs that implement complex ALU operations as function
  997. * calls, and must re-arrange operands for argument passing.
  998. */
  999. static int __bpf_fill_alu_imm_regs(struct bpf_test *self, u8 op, bool alu32)
  1000. {
  1001. int len = 2 + 10 * 10;
  1002. struct bpf_insn *insns;
  1003. u64 dst, res;
  1004. int i = 0;
  1005. u32 imm;
  1006. int rd;
  1007. insns = kmalloc_objs(*insns, len);
  1008. if (!insns)
  1009. return -ENOMEM;
  1010. /* Operand and result values according to operation */
  1011. if (alu32)
  1012. dst = 0x76543210U;
  1013. else
  1014. dst = 0x7edcba9876543210ULL;
  1015. imm = 0x01234567U;
  1016. if (op == BPF_LSH || op == BPF_RSH || op == BPF_ARSH)
  1017. imm &= 31;
  1018. __bpf_alu_result(&res, dst, imm, op);
  1019. if (alu32)
  1020. res = (u32)res;
  1021. /* Check all operand registers */
  1022. for (rd = R0; rd <= R9; rd++) {
  1023. i += __bpf_ld_imm64(&insns[i], rd, dst);
  1024. if (alu32)
  1025. insns[i++] = BPF_ALU32_IMM(op, rd, imm);
  1026. else
  1027. insns[i++] = BPF_ALU64_IMM(op, rd, imm);
  1028. insns[i++] = BPF_JMP32_IMM(BPF_JEQ, rd, res, 2);
  1029. insns[i++] = BPF_MOV64_IMM(R0, __LINE__);
  1030. insns[i++] = BPF_EXIT_INSN();
  1031. insns[i++] = BPF_ALU64_IMM(BPF_RSH, rd, 32);
  1032. insns[i++] = BPF_JMP32_IMM(BPF_JEQ, rd, res >> 32, 2);
  1033. insns[i++] = BPF_MOV64_IMM(R0, __LINE__);
  1034. insns[i++] = BPF_EXIT_INSN();
  1035. }
  1036. insns[i++] = BPF_MOV64_IMM(R0, 1);
  1037. insns[i++] = BPF_EXIT_INSN();
  1038. self->u.ptr.insns = insns;
  1039. self->u.ptr.len = len;
  1040. BUG_ON(i != len);
  1041. return 0;
  1042. }
  1043. /* ALU64 K registers */
  1044. static int bpf_fill_alu64_mov_imm_regs(struct bpf_test *self)
  1045. {
  1046. return __bpf_fill_alu_imm_regs(self, BPF_MOV, false);
  1047. }
  1048. static int bpf_fill_alu64_and_imm_regs(struct bpf_test *self)
  1049. {
  1050. return __bpf_fill_alu_imm_regs(self, BPF_AND, false);
  1051. }
  1052. static int bpf_fill_alu64_or_imm_regs(struct bpf_test *self)
  1053. {
  1054. return __bpf_fill_alu_imm_regs(self, BPF_OR, false);
  1055. }
  1056. static int bpf_fill_alu64_xor_imm_regs(struct bpf_test *self)
  1057. {
  1058. return __bpf_fill_alu_imm_regs(self, BPF_XOR, false);
  1059. }
  1060. static int bpf_fill_alu64_lsh_imm_regs(struct bpf_test *self)
  1061. {
  1062. return __bpf_fill_alu_imm_regs(self, BPF_LSH, false);
  1063. }
  1064. static int bpf_fill_alu64_rsh_imm_regs(struct bpf_test *self)
  1065. {
  1066. return __bpf_fill_alu_imm_regs(self, BPF_RSH, false);
  1067. }
  1068. static int bpf_fill_alu64_arsh_imm_regs(struct bpf_test *self)
  1069. {
  1070. return __bpf_fill_alu_imm_regs(self, BPF_ARSH, false);
  1071. }
  1072. static int bpf_fill_alu64_add_imm_regs(struct bpf_test *self)
  1073. {
  1074. return __bpf_fill_alu_imm_regs(self, BPF_ADD, false);
  1075. }
  1076. static int bpf_fill_alu64_sub_imm_regs(struct bpf_test *self)
  1077. {
  1078. return __bpf_fill_alu_imm_regs(self, BPF_SUB, false);
  1079. }
  1080. static int bpf_fill_alu64_mul_imm_regs(struct bpf_test *self)
  1081. {
  1082. return __bpf_fill_alu_imm_regs(self, BPF_MUL, false);
  1083. }
  1084. static int bpf_fill_alu64_div_imm_regs(struct bpf_test *self)
  1085. {
  1086. return __bpf_fill_alu_imm_regs(self, BPF_DIV, false);
  1087. }
  1088. static int bpf_fill_alu64_mod_imm_regs(struct bpf_test *self)
  1089. {
  1090. return __bpf_fill_alu_imm_regs(self, BPF_MOD, false);
  1091. }
  1092. /* ALU32 K registers */
  1093. static int bpf_fill_alu32_mov_imm_regs(struct bpf_test *self)
  1094. {
  1095. return __bpf_fill_alu_imm_regs(self, BPF_MOV, true);
  1096. }
  1097. static int bpf_fill_alu32_and_imm_regs(struct bpf_test *self)
  1098. {
  1099. return __bpf_fill_alu_imm_regs(self, BPF_AND, true);
  1100. }
  1101. static int bpf_fill_alu32_or_imm_regs(struct bpf_test *self)
  1102. {
  1103. return __bpf_fill_alu_imm_regs(self, BPF_OR, true);
  1104. }
  1105. static int bpf_fill_alu32_xor_imm_regs(struct bpf_test *self)
  1106. {
  1107. return __bpf_fill_alu_imm_regs(self, BPF_XOR, true);
  1108. }
  1109. static int bpf_fill_alu32_lsh_imm_regs(struct bpf_test *self)
  1110. {
  1111. return __bpf_fill_alu_imm_regs(self, BPF_LSH, true);
  1112. }
  1113. static int bpf_fill_alu32_rsh_imm_regs(struct bpf_test *self)
  1114. {
  1115. return __bpf_fill_alu_imm_regs(self, BPF_RSH, true);
  1116. }
  1117. static int bpf_fill_alu32_arsh_imm_regs(struct bpf_test *self)
  1118. {
  1119. return __bpf_fill_alu_imm_regs(self, BPF_ARSH, true);
  1120. }
  1121. static int bpf_fill_alu32_add_imm_regs(struct bpf_test *self)
  1122. {
  1123. return __bpf_fill_alu_imm_regs(self, BPF_ADD, true);
  1124. }
  1125. static int bpf_fill_alu32_sub_imm_regs(struct bpf_test *self)
  1126. {
  1127. return __bpf_fill_alu_imm_regs(self, BPF_SUB, true);
  1128. }
  1129. static int bpf_fill_alu32_mul_imm_regs(struct bpf_test *self)
  1130. {
  1131. return __bpf_fill_alu_imm_regs(self, BPF_MUL, true);
  1132. }
  1133. static int bpf_fill_alu32_div_imm_regs(struct bpf_test *self)
  1134. {
  1135. return __bpf_fill_alu_imm_regs(self, BPF_DIV, true);
  1136. }
  1137. static int bpf_fill_alu32_mod_imm_regs(struct bpf_test *self)
  1138. {
  1139. return __bpf_fill_alu_imm_regs(self, BPF_MOD, true);
  1140. }
  1141. /*
  1142. * Test JITs that implement complex ALU operations as function
  1143. * calls, and must re-arrange operands for argument passing.
  1144. */
  1145. static int __bpf_fill_alu_reg_pairs(struct bpf_test *self, u8 op, bool alu32)
  1146. {
  1147. int len = 2 + 10 * 10 * 12;
  1148. u64 dst, src, res, same;
  1149. struct bpf_insn *insns;
  1150. int rd, rs;
  1151. int i = 0;
  1152. insns = kmalloc_objs(*insns, len);
  1153. if (!insns)
  1154. return -ENOMEM;
  1155. /* Operand and result values according to operation */
  1156. if (alu32) {
  1157. dst = 0x76543210U;
  1158. src = 0x01234567U;
  1159. } else {
  1160. dst = 0x7edcba9876543210ULL;
  1161. src = 0x0123456789abcdefULL;
  1162. }
  1163. if (op == BPF_LSH || op == BPF_RSH || op == BPF_ARSH)
  1164. src &= 31;
  1165. __bpf_alu_result(&res, dst, src, op);
  1166. __bpf_alu_result(&same, src, src, op);
  1167. if (alu32) {
  1168. res = (u32)res;
  1169. same = (u32)same;
  1170. }
  1171. /* Check all combinations of operand registers */
  1172. for (rd = R0; rd <= R9; rd++) {
  1173. for (rs = R0; rs <= R9; rs++) {
  1174. u64 val = rd == rs ? same : res;
  1175. i += __bpf_ld_imm64(&insns[i], rd, dst);
  1176. i += __bpf_ld_imm64(&insns[i], rs, src);
  1177. if (alu32)
  1178. insns[i++] = BPF_ALU32_REG(op, rd, rs);
  1179. else
  1180. insns[i++] = BPF_ALU64_REG(op, rd, rs);
  1181. insns[i++] = BPF_JMP32_IMM(BPF_JEQ, rd, val, 2);
  1182. insns[i++] = BPF_MOV64_IMM(R0, __LINE__);
  1183. insns[i++] = BPF_EXIT_INSN();
  1184. insns[i++] = BPF_ALU64_IMM(BPF_RSH, rd, 32);
  1185. insns[i++] = BPF_JMP32_IMM(BPF_JEQ, rd, val >> 32, 2);
  1186. insns[i++] = BPF_MOV64_IMM(R0, __LINE__);
  1187. insns[i++] = BPF_EXIT_INSN();
  1188. }
  1189. }
  1190. insns[i++] = BPF_MOV64_IMM(R0, 1);
  1191. insns[i++] = BPF_EXIT_INSN();
  1192. self->u.ptr.insns = insns;
  1193. self->u.ptr.len = len;
  1194. BUG_ON(i != len);
  1195. return 0;
  1196. }
  1197. /* ALU64 X register combinations */
  1198. static int bpf_fill_alu64_mov_reg_pairs(struct bpf_test *self)
  1199. {
  1200. return __bpf_fill_alu_reg_pairs(self, BPF_MOV, false);
  1201. }
  1202. static int bpf_fill_alu64_and_reg_pairs(struct bpf_test *self)
  1203. {
  1204. return __bpf_fill_alu_reg_pairs(self, BPF_AND, false);
  1205. }
  1206. static int bpf_fill_alu64_or_reg_pairs(struct bpf_test *self)
  1207. {
  1208. return __bpf_fill_alu_reg_pairs(self, BPF_OR, false);
  1209. }
  1210. static int bpf_fill_alu64_xor_reg_pairs(struct bpf_test *self)
  1211. {
  1212. return __bpf_fill_alu_reg_pairs(self, BPF_XOR, false);
  1213. }
  1214. static int bpf_fill_alu64_lsh_reg_pairs(struct bpf_test *self)
  1215. {
  1216. return __bpf_fill_alu_reg_pairs(self, BPF_LSH, false);
  1217. }
  1218. static int bpf_fill_alu64_rsh_reg_pairs(struct bpf_test *self)
  1219. {
  1220. return __bpf_fill_alu_reg_pairs(self, BPF_RSH, false);
  1221. }
  1222. static int bpf_fill_alu64_arsh_reg_pairs(struct bpf_test *self)
  1223. {
  1224. return __bpf_fill_alu_reg_pairs(self, BPF_ARSH, false);
  1225. }
  1226. static int bpf_fill_alu64_add_reg_pairs(struct bpf_test *self)
  1227. {
  1228. return __bpf_fill_alu_reg_pairs(self, BPF_ADD, false);
  1229. }
  1230. static int bpf_fill_alu64_sub_reg_pairs(struct bpf_test *self)
  1231. {
  1232. return __bpf_fill_alu_reg_pairs(self, BPF_SUB, false);
  1233. }
  1234. static int bpf_fill_alu64_mul_reg_pairs(struct bpf_test *self)
  1235. {
  1236. return __bpf_fill_alu_reg_pairs(self, BPF_MUL, false);
  1237. }
  1238. static int bpf_fill_alu64_div_reg_pairs(struct bpf_test *self)
  1239. {
  1240. return __bpf_fill_alu_reg_pairs(self, BPF_DIV, false);
  1241. }
  1242. static int bpf_fill_alu64_mod_reg_pairs(struct bpf_test *self)
  1243. {
  1244. return __bpf_fill_alu_reg_pairs(self, BPF_MOD, false);
  1245. }
  1246. /* ALU32 X register combinations */
  1247. static int bpf_fill_alu32_mov_reg_pairs(struct bpf_test *self)
  1248. {
  1249. return __bpf_fill_alu_reg_pairs(self, BPF_MOV, true);
  1250. }
  1251. static int bpf_fill_alu32_and_reg_pairs(struct bpf_test *self)
  1252. {
  1253. return __bpf_fill_alu_reg_pairs(self, BPF_AND, true);
  1254. }
  1255. static int bpf_fill_alu32_or_reg_pairs(struct bpf_test *self)
  1256. {
  1257. return __bpf_fill_alu_reg_pairs(self, BPF_OR, true);
  1258. }
  1259. static int bpf_fill_alu32_xor_reg_pairs(struct bpf_test *self)
  1260. {
  1261. return __bpf_fill_alu_reg_pairs(self, BPF_XOR, true);
  1262. }
  1263. static int bpf_fill_alu32_lsh_reg_pairs(struct bpf_test *self)
  1264. {
  1265. return __bpf_fill_alu_reg_pairs(self, BPF_LSH, true);
  1266. }
  1267. static int bpf_fill_alu32_rsh_reg_pairs(struct bpf_test *self)
  1268. {
  1269. return __bpf_fill_alu_reg_pairs(self, BPF_RSH, true);
  1270. }
  1271. static int bpf_fill_alu32_arsh_reg_pairs(struct bpf_test *self)
  1272. {
  1273. return __bpf_fill_alu_reg_pairs(self, BPF_ARSH, true);
  1274. }
  1275. static int bpf_fill_alu32_add_reg_pairs(struct bpf_test *self)
  1276. {
  1277. return __bpf_fill_alu_reg_pairs(self, BPF_ADD, true);
  1278. }
  1279. static int bpf_fill_alu32_sub_reg_pairs(struct bpf_test *self)
  1280. {
  1281. return __bpf_fill_alu_reg_pairs(self, BPF_SUB, true);
  1282. }
  1283. static int bpf_fill_alu32_mul_reg_pairs(struct bpf_test *self)
  1284. {
  1285. return __bpf_fill_alu_reg_pairs(self, BPF_MUL, true);
  1286. }
  1287. static int bpf_fill_alu32_div_reg_pairs(struct bpf_test *self)
  1288. {
  1289. return __bpf_fill_alu_reg_pairs(self, BPF_DIV, true);
  1290. }
  1291. static int bpf_fill_alu32_mod_reg_pairs(struct bpf_test *self)
  1292. {
  1293. return __bpf_fill_alu_reg_pairs(self, BPF_MOD, true);
  1294. }
  1295. /*
  1296. * Exhaustive tests of atomic operations for all power-of-two operand
  1297. * magnitudes, both for positive and negative values.
  1298. */
  1299. static int __bpf_emit_atomic64(struct bpf_test *self, void *arg,
  1300. struct bpf_insn *insns, s64 dst, s64 src)
  1301. {
  1302. int op = *(int *)arg;
  1303. u64 keep, fetch, res;
  1304. int i = 0;
  1305. if (!insns)
  1306. return 21;
  1307. switch (op) {
  1308. case BPF_XCHG:
  1309. res = src;
  1310. break;
  1311. default:
  1312. __bpf_alu_result(&res, dst, src, BPF_OP(op));
  1313. }
  1314. keep = 0x0123456789abcdefULL;
  1315. if (op & BPF_FETCH)
  1316. fetch = dst;
  1317. else
  1318. fetch = src;
  1319. i += __bpf_ld_imm64(&insns[i], R0, keep);
  1320. i += __bpf_ld_imm64(&insns[i], R1, dst);
  1321. i += __bpf_ld_imm64(&insns[i], R2, src);
  1322. i += __bpf_ld_imm64(&insns[i], R3, res);
  1323. i += __bpf_ld_imm64(&insns[i], R4, fetch);
  1324. i += __bpf_ld_imm64(&insns[i], R5, keep);
  1325. insns[i++] = BPF_STX_MEM(BPF_DW, R10, R1, -8);
  1326. insns[i++] = BPF_ATOMIC_OP(BPF_DW, op, R10, R2, -8);
  1327. insns[i++] = BPF_LDX_MEM(BPF_DW, R1, R10, -8);
  1328. insns[i++] = BPF_JMP_REG(BPF_JEQ, R1, R3, 1);
  1329. insns[i++] = BPF_EXIT_INSN();
  1330. insns[i++] = BPF_JMP_REG(BPF_JEQ, R2, R4, 1);
  1331. insns[i++] = BPF_EXIT_INSN();
  1332. insns[i++] = BPF_JMP_REG(BPF_JEQ, R0, R5, 1);
  1333. insns[i++] = BPF_EXIT_INSN();
  1334. return i;
  1335. }
  1336. static int __bpf_emit_atomic32(struct bpf_test *self, void *arg,
  1337. struct bpf_insn *insns, s64 dst, s64 src)
  1338. {
  1339. int op = *(int *)arg;
  1340. u64 keep, fetch, res;
  1341. int i = 0;
  1342. if (!insns)
  1343. return 21;
  1344. switch (op) {
  1345. case BPF_XCHG:
  1346. res = src;
  1347. break;
  1348. default:
  1349. __bpf_alu_result(&res, (u32)dst, (u32)src, BPF_OP(op));
  1350. }
  1351. keep = 0x0123456789abcdefULL;
  1352. if (op & BPF_FETCH)
  1353. fetch = (u32)dst;
  1354. else
  1355. fetch = src;
  1356. i += __bpf_ld_imm64(&insns[i], R0, keep);
  1357. i += __bpf_ld_imm64(&insns[i], R1, (u32)dst);
  1358. i += __bpf_ld_imm64(&insns[i], R2, src);
  1359. i += __bpf_ld_imm64(&insns[i], R3, (u32)res);
  1360. i += __bpf_ld_imm64(&insns[i], R4, fetch);
  1361. i += __bpf_ld_imm64(&insns[i], R5, keep);
  1362. insns[i++] = BPF_STX_MEM(BPF_W, R10, R1, -4);
  1363. insns[i++] = BPF_ATOMIC_OP(BPF_W, op, R10, R2, -4);
  1364. insns[i++] = BPF_LDX_MEM(BPF_W, R1, R10, -4);
  1365. insns[i++] = BPF_JMP_REG(BPF_JEQ, R1, R3, 1);
  1366. insns[i++] = BPF_EXIT_INSN();
  1367. insns[i++] = BPF_JMP_REG(BPF_JEQ, R2, R4, 1);
  1368. insns[i++] = BPF_EXIT_INSN();
  1369. insns[i++] = BPF_JMP_REG(BPF_JEQ, R0, R5, 1);
  1370. insns[i++] = BPF_EXIT_INSN();
  1371. return i;
  1372. }
  1373. static int __bpf_emit_cmpxchg64(struct bpf_test *self, void *arg,
  1374. struct bpf_insn *insns, s64 dst, s64 src)
  1375. {
  1376. int i = 0;
  1377. if (!insns)
  1378. return 23;
  1379. i += __bpf_ld_imm64(&insns[i], R0, ~dst);
  1380. i += __bpf_ld_imm64(&insns[i], R1, dst);
  1381. i += __bpf_ld_imm64(&insns[i], R2, src);
  1382. /* Result unsuccessful */
  1383. insns[i++] = BPF_STX_MEM(BPF_DW, R10, R1, -8);
  1384. insns[i++] = BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -8);
  1385. insns[i++] = BPF_LDX_MEM(BPF_DW, R3, R10, -8);
  1386. insns[i++] = BPF_JMP_REG(BPF_JEQ, R1, R3, 2);
  1387. insns[i++] = BPF_MOV64_IMM(R0, __LINE__);
  1388. insns[i++] = BPF_EXIT_INSN();
  1389. insns[i++] = BPF_JMP_REG(BPF_JEQ, R0, R3, 2);
  1390. insns[i++] = BPF_MOV64_IMM(R0, __LINE__);
  1391. insns[i++] = BPF_EXIT_INSN();
  1392. /* Result successful */
  1393. insns[i++] = BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -8);
  1394. insns[i++] = BPF_LDX_MEM(BPF_DW, R3, R10, -8);
  1395. insns[i++] = BPF_JMP_REG(BPF_JEQ, R2, R3, 2);
  1396. insns[i++] = BPF_MOV64_IMM(R0, __LINE__);
  1397. insns[i++] = BPF_EXIT_INSN();
  1398. insns[i++] = BPF_JMP_REG(BPF_JEQ, R0, R1, 2);
  1399. insns[i++] = BPF_MOV64_IMM(R0, __LINE__);
  1400. insns[i++] = BPF_EXIT_INSN();
  1401. return i;
  1402. }
  1403. static int __bpf_emit_cmpxchg32(struct bpf_test *self, void *arg,
  1404. struct bpf_insn *insns, s64 dst, s64 src)
  1405. {
  1406. int i = 0;
  1407. if (!insns)
  1408. return 27;
  1409. i += __bpf_ld_imm64(&insns[i], R0, ~dst);
  1410. i += __bpf_ld_imm64(&insns[i], R1, (u32)dst);
  1411. i += __bpf_ld_imm64(&insns[i], R2, src);
  1412. /* Result unsuccessful */
  1413. insns[i++] = BPF_STX_MEM(BPF_W, R10, R1, -4);
  1414. insns[i++] = BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R2, -4);
  1415. insns[i++] = BPF_ZEXT_REG(R0); /* Zext always inserted by verifier */
  1416. insns[i++] = BPF_LDX_MEM(BPF_W, R3, R10, -4);
  1417. insns[i++] = BPF_JMP32_REG(BPF_JEQ, R1, R3, 2);
  1418. insns[i++] = BPF_MOV32_IMM(R0, __LINE__);
  1419. insns[i++] = BPF_EXIT_INSN();
  1420. insns[i++] = BPF_JMP_REG(BPF_JEQ, R0, R3, 2);
  1421. insns[i++] = BPF_MOV32_IMM(R0, __LINE__);
  1422. insns[i++] = BPF_EXIT_INSN();
  1423. /* Result successful */
  1424. i += __bpf_ld_imm64(&insns[i], R0, dst);
  1425. insns[i++] = BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R2, -4);
  1426. insns[i++] = BPF_ZEXT_REG(R0); /* Zext always inserted by verifier */
  1427. insns[i++] = BPF_LDX_MEM(BPF_W, R3, R10, -4);
  1428. insns[i++] = BPF_JMP32_REG(BPF_JEQ, R2, R3, 2);
  1429. insns[i++] = BPF_MOV32_IMM(R0, __LINE__);
  1430. insns[i++] = BPF_EXIT_INSN();
  1431. insns[i++] = BPF_JMP_REG(BPF_JEQ, R0, R1, 2);
  1432. insns[i++] = BPF_MOV32_IMM(R0, __LINE__);
  1433. insns[i++] = BPF_EXIT_INSN();
  1434. return i;
  1435. }
  1436. static int __bpf_fill_atomic64(struct bpf_test *self, int op)
  1437. {
  1438. return __bpf_fill_pattern(self, &op, 64, 64,
  1439. 0, PATTERN_BLOCK2,
  1440. &__bpf_emit_atomic64);
  1441. }
  1442. static int __bpf_fill_atomic32(struct bpf_test *self, int op)
  1443. {
  1444. return __bpf_fill_pattern(self, &op, 64, 64,
  1445. 0, PATTERN_BLOCK2,
  1446. &__bpf_emit_atomic32);
  1447. }
  1448. /* 64-bit atomic operations */
  1449. static int bpf_fill_atomic64_add(struct bpf_test *self)
  1450. {
  1451. return __bpf_fill_atomic64(self, BPF_ADD);
  1452. }
  1453. static int bpf_fill_atomic64_and(struct bpf_test *self)
  1454. {
  1455. return __bpf_fill_atomic64(self, BPF_AND);
  1456. }
  1457. static int bpf_fill_atomic64_or(struct bpf_test *self)
  1458. {
  1459. return __bpf_fill_atomic64(self, BPF_OR);
  1460. }
  1461. static int bpf_fill_atomic64_xor(struct bpf_test *self)
  1462. {
  1463. return __bpf_fill_atomic64(self, BPF_XOR);
  1464. }
  1465. static int bpf_fill_atomic64_add_fetch(struct bpf_test *self)
  1466. {
  1467. return __bpf_fill_atomic64(self, BPF_ADD | BPF_FETCH);
  1468. }
  1469. static int bpf_fill_atomic64_and_fetch(struct bpf_test *self)
  1470. {
  1471. return __bpf_fill_atomic64(self, BPF_AND | BPF_FETCH);
  1472. }
  1473. static int bpf_fill_atomic64_or_fetch(struct bpf_test *self)
  1474. {
  1475. return __bpf_fill_atomic64(self, BPF_OR | BPF_FETCH);
  1476. }
  1477. static int bpf_fill_atomic64_xor_fetch(struct bpf_test *self)
  1478. {
  1479. return __bpf_fill_atomic64(self, BPF_XOR | BPF_FETCH);
  1480. }
  1481. static int bpf_fill_atomic64_xchg(struct bpf_test *self)
  1482. {
  1483. return __bpf_fill_atomic64(self, BPF_XCHG);
  1484. }
  1485. static int bpf_fill_cmpxchg64(struct bpf_test *self)
  1486. {
  1487. return __bpf_fill_pattern(self, NULL, 64, 64, 0, PATTERN_BLOCK2,
  1488. &__bpf_emit_cmpxchg64);
  1489. }
  1490. /* 32-bit atomic operations */
  1491. static int bpf_fill_atomic32_add(struct bpf_test *self)
  1492. {
  1493. return __bpf_fill_atomic32(self, BPF_ADD);
  1494. }
  1495. static int bpf_fill_atomic32_and(struct bpf_test *self)
  1496. {
  1497. return __bpf_fill_atomic32(self, BPF_AND);
  1498. }
  1499. static int bpf_fill_atomic32_or(struct bpf_test *self)
  1500. {
  1501. return __bpf_fill_atomic32(self, BPF_OR);
  1502. }
  1503. static int bpf_fill_atomic32_xor(struct bpf_test *self)
  1504. {
  1505. return __bpf_fill_atomic32(self, BPF_XOR);
  1506. }
  1507. static int bpf_fill_atomic32_add_fetch(struct bpf_test *self)
  1508. {
  1509. return __bpf_fill_atomic32(self, BPF_ADD | BPF_FETCH);
  1510. }
  1511. static int bpf_fill_atomic32_and_fetch(struct bpf_test *self)
  1512. {
  1513. return __bpf_fill_atomic32(self, BPF_AND | BPF_FETCH);
  1514. }
  1515. static int bpf_fill_atomic32_or_fetch(struct bpf_test *self)
  1516. {
  1517. return __bpf_fill_atomic32(self, BPF_OR | BPF_FETCH);
  1518. }
  1519. static int bpf_fill_atomic32_xor_fetch(struct bpf_test *self)
  1520. {
  1521. return __bpf_fill_atomic32(self, BPF_XOR | BPF_FETCH);
  1522. }
  1523. static int bpf_fill_atomic32_xchg(struct bpf_test *self)
  1524. {
  1525. return __bpf_fill_atomic32(self, BPF_XCHG);
  1526. }
  1527. static int bpf_fill_cmpxchg32(struct bpf_test *self)
  1528. {
  1529. return __bpf_fill_pattern(self, NULL, 64, 64, 0, PATTERN_BLOCK2,
  1530. &__bpf_emit_cmpxchg32);
  1531. }
  1532. /*
  1533. * Test JITs that implement ATOMIC operations as function calls or
  1534. * other primitives, and must re-arrange operands for argument passing.
  1535. */
  1536. static int __bpf_fill_atomic_reg_pairs(struct bpf_test *self, u8 width, u8 op)
  1537. {
  1538. struct bpf_insn *insn;
  1539. int len = 2 + 34 * 10 * 10;
  1540. u64 mem, upd, res;
  1541. int rd, rs, i = 0;
  1542. insn = kmalloc_objs(*insn, len);
  1543. if (!insn)
  1544. return -ENOMEM;
  1545. /* Operand and memory values */
  1546. if (width == BPF_DW) {
  1547. mem = 0x0123456789abcdefULL;
  1548. upd = 0xfedcba9876543210ULL;
  1549. } else { /* BPF_W */
  1550. mem = 0x01234567U;
  1551. upd = 0x76543210U;
  1552. }
  1553. /* Memory updated according to operation */
  1554. switch (op) {
  1555. case BPF_XCHG:
  1556. res = upd;
  1557. break;
  1558. case BPF_CMPXCHG:
  1559. res = mem;
  1560. break;
  1561. default:
  1562. __bpf_alu_result(&res, mem, upd, BPF_OP(op));
  1563. }
  1564. /* Test all operand registers */
  1565. for (rd = R0; rd <= R9; rd++) {
  1566. for (rs = R0; rs <= R9; rs++) {
  1567. u64 cmp, src;
  1568. /* Initialize value in memory */
  1569. i += __bpf_ld_imm64(&insn[i], R0, mem);
  1570. insn[i++] = BPF_STX_MEM(width, R10, R0, -8);
  1571. /* Initialize registers in order */
  1572. i += __bpf_ld_imm64(&insn[i], R0, ~mem);
  1573. i += __bpf_ld_imm64(&insn[i], rs, upd);
  1574. insn[i++] = BPF_MOV64_REG(rd, R10);
  1575. /* Perform atomic operation */
  1576. insn[i++] = BPF_ATOMIC_OP(width, op, rd, rs, -8);
  1577. if (op == BPF_CMPXCHG && width == BPF_W)
  1578. insn[i++] = BPF_ZEXT_REG(R0);
  1579. /* Check R0 register value */
  1580. if (op == BPF_CMPXCHG)
  1581. cmp = mem; /* Expect value from memory */
  1582. else if (R0 == rd || R0 == rs)
  1583. cmp = 0; /* Aliased, checked below */
  1584. else
  1585. cmp = ~mem; /* Expect value to be preserved */
  1586. if (cmp) {
  1587. insn[i++] = BPF_JMP32_IMM(BPF_JEQ, R0,
  1588. (u32)cmp, 2);
  1589. insn[i++] = BPF_MOV32_IMM(R0, __LINE__);
  1590. insn[i++] = BPF_EXIT_INSN();
  1591. insn[i++] = BPF_ALU64_IMM(BPF_RSH, R0, 32);
  1592. insn[i++] = BPF_JMP32_IMM(BPF_JEQ, R0,
  1593. cmp >> 32, 2);
  1594. insn[i++] = BPF_MOV32_IMM(R0, __LINE__);
  1595. insn[i++] = BPF_EXIT_INSN();
  1596. }
  1597. /* Check source register value */
  1598. if (rs == R0 && op == BPF_CMPXCHG)
  1599. src = 0; /* Aliased with R0, checked above */
  1600. else if (rs == rd && (op == BPF_CMPXCHG ||
  1601. !(op & BPF_FETCH)))
  1602. src = 0; /* Aliased with rd, checked below */
  1603. else if (op == BPF_CMPXCHG)
  1604. src = upd; /* Expect value to be preserved */
  1605. else if (op & BPF_FETCH)
  1606. src = mem; /* Expect fetched value from mem */
  1607. else /* no fetch */
  1608. src = upd; /* Expect value to be preserved */
  1609. if (src) {
  1610. insn[i++] = BPF_JMP32_IMM(BPF_JEQ, rs,
  1611. (u32)src, 2);
  1612. insn[i++] = BPF_MOV32_IMM(R0, __LINE__);
  1613. insn[i++] = BPF_EXIT_INSN();
  1614. insn[i++] = BPF_ALU64_IMM(BPF_RSH, rs, 32);
  1615. insn[i++] = BPF_JMP32_IMM(BPF_JEQ, rs,
  1616. src >> 32, 2);
  1617. insn[i++] = BPF_MOV32_IMM(R0, __LINE__);
  1618. insn[i++] = BPF_EXIT_INSN();
  1619. }
  1620. /* Check destination register value */
  1621. if (!(rd == R0 && op == BPF_CMPXCHG) &&
  1622. !(rd == rs && (op & BPF_FETCH))) {
  1623. insn[i++] = BPF_JMP_REG(BPF_JEQ, rd, R10, 2);
  1624. insn[i++] = BPF_MOV32_IMM(R0, __LINE__);
  1625. insn[i++] = BPF_EXIT_INSN();
  1626. }
  1627. /* Check value in memory */
  1628. if (rs != rd) { /* No aliasing */
  1629. i += __bpf_ld_imm64(&insn[i], R1, res);
  1630. } else if (op == BPF_XCHG) { /* Aliased, XCHG */
  1631. insn[i++] = BPF_MOV64_REG(R1, R10);
  1632. } else if (op == BPF_CMPXCHG) { /* Aliased, CMPXCHG */
  1633. i += __bpf_ld_imm64(&insn[i], R1, mem);
  1634. } else { /* Aliased, ALU oper */
  1635. i += __bpf_ld_imm64(&insn[i], R1, mem);
  1636. insn[i++] = BPF_ALU64_REG(BPF_OP(op), R1, R10);
  1637. }
  1638. insn[i++] = BPF_LDX_MEM(width, R0, R10, -8);
  1639. if (width == BPF_DW)
  1640. insn[i++] = BPF_JMP_REG(BPF_JEQ, R0, R1, 2);
  1641. else /* width == BPF_W */
  1642. insn[i++] = BPF_JMP32_REG(BPF_JEQ, R0, R1, 2);
  1643. insn[i++] = BPF_MOV32_IMM(R0, __LINE__);
  1644. insn[i++] = BPF_EXIT_INSN();
  1645. }
  1646. }
  1647. insn[i++] = BPF_MOV64_IMM(R0, 1);
  1648. insn[i++] = BPF_EXIT_INSN();
  1649. self->u.ptr.insns = insn;
  1650. self->u.ptr.len = i;
  1651. BUG_ON(i > len);
  1652. return 0;
  1653. }
  1654. /* 64-bit atomic register tests */
  1655. static int bpf_fill_atomic64_add_reg_pairs(struct bpf_test *self)
  1656. {
  1657. return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_ADD);
  1658. }
  1659. static int bpf_fill_atomic64_and_reg_pairs(struct bpf_test *self)
  1660. {
  1661. return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_AND);
  1662. }
  1663. static int bpf_fill_atomic64_or_reg_pairs(struct bpf_test *self)
  1664. {
  1665. return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_OR);
  1666. }
  1667. static int bpf_fill_atomic64_xor_reg_pairs(struct bpf_test *self)
  1668. {
  1669. return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_XOR);
  1670. }
  1671. static int bpf_fill_atomic64_add_fetch_reg_pairs(struct bpf_test *self)
  1672. {
  1673. return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_ADD | BPF_FETCH);
  1674. }
  1675. static int bpf_fill_atomic64_and_fetch_reg_pairs(struct bpf_test *self)
  1676. {
  1677. return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_AND | BPF_FETCH);
  1678. }
  1679. static int bpf_fill_atomic64_or_fetch_reg_pairs(struct bpf_test *self)
  1680. {
  1681. return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_OR | BPF_FETCH);
  1682. }
  1683. static int bpf_fill_atomic64_xor_fetch_reg_pairs(struct bpf_test *self)
  1684. {
  1685. return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_XOR | BPF_FETCH);
  1686. }
  1687. static int bpf_fill_atomic64_xchg_reg_pairs(struct bpf_test *self)
  1688. {
  1689. return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_XCHG);
  1690. }
  1691. static int bpf_fill_atomic64_cmpxchg_reg_pairs(struct bpf_test *self)
  1692. {
  1693. return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_CMPXCHG);
  1694. }
  1695. /* 32-bit atomic register tests */
  1696. static int bpf_fill_atomic32_add_reg_pairs(struct bpf_test *self)
  1697. {
  1698. return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_ADD);
  1699. }
  1700. static int bpf_fill_atomic32_and_reg_pairs(struct bpf_test *self)
  1701. {
  1702. return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_AND);
  1703. }
  1704. static int bpf_fill_atomic32_or_reg_pairs(struct bpf_test *self)
  1705. {
  1706. return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_OR);
  1707. }
  1708. static int bpf_fill_atomic32_xor_reg_pairs(struct bpf_test *self)
  1709. {
  1710. return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_XOR);
  1711. }
  1712. static int bpf_fill_atomic32_add_fetch_reg_pairs(struct bpf_test *self)
  1713. {
  1714. return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_ADD | BPF_FETCH);
  1715. }
  1716. static int bpf_fill_atomic32_and_fetch_reg_pairs(struct bpf_test *self)
  1717. {
  1718. return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_AND | BPF_FETCH);
  1719. }
  1720. static int bpf_fill_atomic32_or_fetch_reg_pairs(struct bpf_test *self)
  1721. {
  1722. return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_OR | BPF_FETCH);
  1723. }
  1724. static int bpf_fill_atomic32_xor_fetch_reg_pairs(struct bpf_test *self)
  1725. {
  1726. return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_XOR | BPF_FETCH);
  1727. }
  1728. static int bpf_fill_atomic32_xchg_reg_pairs(struct bpf_test *self)
  1729. {
  1730. return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_XCHG);
  1731. }
  1732. static int bpf_fill_atomic32_cmpxchg_reg_pairs(struct bpf_test *self)
  1733. {
  1734. return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_CMPXCHG);
  1735. }
  1736. /*
  1737. * Test the two-instruction 64-bit immediate load operation for all
  1738. * power-of-two magnitudes of the immediate operand. For each MSB, a block
  1739. * of immediate values centered around the power-of-two MSB are tested,
  1740. * both for positive and negative values. The test is designed to verify
  1741. * the operation for JITs that emit different code depending on the magnitude
  1742. * of the immediate value. This is often the case if the native instruction
  1743. * immediate field width is narrower than 32 bits.
  1744. */
  1745. static int bpf_fill_ld_imm64_magn(struct bpf_test *self)
  1746. {
  1747. int block = 64; /* Increase for more tests per MSB position */
  1748. int len = 3 + 8 * 63 * block * 2;
  1749. struct bpf_insn *insn;
  1750. int bit, adj, sign;
  1751. int i = 0;
  1752. insn = kmalloc_objs(*insn, len);
  1753. if (!insn)
  1754. return -ENOMEM;
  1755. insn[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 0);
  1756. for (bit = 0; bit <= 62; bit++) {
  1757. for (adj = -block / 2; adj < block / 2; adj++) {
  1758. for (sign = -1; sign <= 1; sign += 2) {
  1759. s64 imm = sign * ((1LL << bit) + adj);
  1760. /* Perform operation */
  1761. i += __bpf_ld_imm64(&insn[i], R1, imm);
  1762. /* Load reference */
  1763. insn[i++] = BPF_ALU32_IMM(BPF_MOV, R2, imm);
  1764. insn[i++] = BPF_ALU32_IMM(BPF_MOV, R3,
  1765. (u32)(imm >> 32));
  1766. insn[i++] = BPF_ALU64_IMM(BPF_LSH, R3, 32);
  1767. insn[i++] = BPF_ALU64_REG(BPF_OR, R2, R3);
  1768. /* Check result */
  1769. insn[i++] = BPF_JMP_REG(BPF_JEQ, R1, R2, 1);
  1770. insn[i++] = BPF_EXIT_INSN();
  1771. }
  1772. }
  1773. }
  1774. insn[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 1);
  1775. insn[i++] = BPF_EXIT_INSN();
  1776. self->u.ptr.insns = insn;
  1777. self->u.ptr.len = len;
  1778. BUG_ON(i != len);
  1779. return 0;
  1780. }
  1781. /*
  1782. * Test the two-instruction 64-bit immediate load operation for different
  1783. * combinations of bytes. Each byte in the 64-bit word is constructed as
  1784. * (base & mask) | (rand() & ~mask), where rand() is a deterministic LCG.
  1785. * All patterns (base1, mask1) and (base2, mask2) bytes are tested.
  1786. */
  1787. static int __bpf_fill_ld_imm64_bytes(struct bpf_test *self,
  1788. u8 base1, u8 mask1,
  1789. u8 base2, u8 mask2)
  1790. {
  1791. struct bpf_insn *insn;
  1792. int len = 3 + 8 * BIT(8);
  1793. int pattern, index;
  1794. u32 rand = 1;
  1795. int i = 0;
  1796. insn = kmalloc_objs(*insn, len);
  1797. if (!insn)
  1798. return -ENOMEM;
  1799. insn[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 0);
  1800. for (pattern = 0; pattern < BIT(8); pattern++) {
  1801. u64 imm = 0;
  1802. for (index = 0; index < 8; index++) {
  1803. int byte;
  1804. if (pattern & BIT(index))
  1805. byte = (base1 & mask1) | (rand & ~mask1);
  1806. else
  1807. byte = (base2 & mask2) | (rand & ~mask2);
  1808. imm = (imm << 8) | byte;
  1809. }
  1810. /* Update our LCG */
  1811. rand = rand * 1664525 + 1013904223;
  1812. /* Perform operation */
  1813. i += __bpf_ld_imm64(&insn[i], R1, imm);
  1814. /* Load reference */
  1815. insn[i++] = BPF_ALU32_IMM(BPF_MOV, R2, imm);
  1816. insn[i++] = BPF_ALU32_IMM(BPF_MOV, R3, (u32)(imm >> 32));
  1817. insn[i++] = BPF_ALU64_IMM(BPF_LSH, R3, 32);
  1818. insn[i++] = BPF_ALU64_REG(BPF_OR, R2, R3);
  1819. /* Check result */
  1820. insn[i++] = BPF_JMP_REG(BPF_JEQ, R1, R2, 1);
  1821. insn[i++] = BPF_EXIT_INSN();
  1822. }
  1823. insn[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 1);
  1824. insn[i++] = BPF_EXIT_INSN();
  1825. self->u.ptr.insns = insn;
  1826. self->u.ptr.len = len;
  1827. BUG_ON(i != len);
  1828. return 0;
  1829. }
  1830. static int bpf_fill_ld_imm64_checker(struct bpf_test *self)
  1831. {
  1832. return __bpf_fill_ld_imm64_bytes(self, 0, 0xff, 0xff, 0xff);
  1833. }
  1834. static int bpf_fill_ld_imm64_pos_neg(struct bpf_test *self)
  1835. {
  1836. return __bpf_fill_ld_imm64_bytes(self, 1, 0x81, 0x80, 0x80);
  1837. }
  1838. static int bpf_fill_ld_imm64_pos_zero(struct bpf_test *self)
  1839. {
  1840. return __bpf_fill_ld_imm64_bytes(self, 1, 0x81, 0, 0xff);
  1841. }
  1842. static int bpf_fill_ld_imm64_neg_zero(struct bpf_test *self)
  1843. {
  1844. return __bpf_fill_ld_imm64_bytes(self, 0x80, 0x80, 0, 0xff);
  1845. }
  1846. /*
  1847. * Exhaustive tests of JMP operations for all combinations of power-of-two
  1848. * magnitudes of the operands, both for positive and negative values. The
  1849. * test is designed to verify e.g. the JMP and JMP32 operations for JITs that
  1850. * emit different code depending on the magnitude of the immediate value.
  1851. */
  1852. static bool __bpf_match_jmp_cond(s64 v1, s64 v2, u8 op)
  1853. {
  1854. switch (op) {
  1855. case BPF_JSET:
  1856. return !!(v1 & v2);
  1857. case BPF_JEQ:
  1858. return v1 == v2;
  1859. case BPF_JNE:
  1860. return v1 != v2;
  1861. case BPF_JGT:
  1862. return (u64)v1 > (u64)v2;
  1863. case BPF_JGE:
  1864. return (u64)v1 >= (u64)v2;
  1865. case BPF_JLT:
  1866. return (u64)v1 < (u64)v2;
  1867. case BPF_JLE:
  1868. return (u64)v1 <= (u64)v2;
  1869. case BPF_JSGT:
  1870. return v1 > v2;
  1871. case BPF_JSGE:
  1872. return v1 >= v2;
  1873. case BPF_JSLT:
  1874. return v1 < v2;
  1875. case BPF_JSLE:
  1876. return v1 <= v2;
  1877. }
  1878. return false;
  1879. }
  1880. static int __bpf_emit_jmp_imm(struct bpf_test *self, void *arg,
  1881. struct bpf_insn *insns, s64 dst, s64 imm)
  1882. {
  1883. int op = *(int *)arg;
  1884. if (insns) {
  1885. bool match = __bpf_match_jmp_cond(dst, (s32)imm, op);
  1886. int i = 0;
  1887. insns[i++] = BPF_ALU32_IMM(BPF_MOV, R0, match);
  1888. i += __bpf_ld_imm64(&insns[i], R1, dst);
  1889. insns[i++] = BPF_JMP_IMM(op, R1, imm, 1);
  1890. if (!match)
  1891. insns[i++] = BPF_JMP_IMM(BPF_JA, 0, 0, 1);
  1892. insns[i++] = BPF_EXIT_INSN();
  1893. return i;
  1894. }
  1895. return 5 + 1;
  1896. }
  1897. static int __bpf_emit_jmp32_imm(struct bpf_test *self, void *arg,
  1898. struct bpf_insn *insns, s64 dst, s64 imm)
  1899. {
  1900. int op = *(int *)arg;
  1901. if (insns) {
  1902. bool match = __bpf_match_jmp_cond((s32)dst, (s32)imm, op);
  1903. int i = 0;
  1904. i += __bpf_ld_imm64(&insns[i], R1, dst);
  1905. insns[i++] = BPF_JMP32_IMM(op, R1, imm, 1);
  1906. if (!match)
  1907. insns[i++] = BPF_JMP_IMM(BPF_JA, 0, 0, 1);
  1908. insns[i++] = BPF_EXIT_INSN();
  1909. return i;
  1910. }
  1911. return 5;
  1912. }
  1913. static int __bpf_emit_jmp_reg(struct bpf_test *self, void *arg,
  1914. struct bpf_insn *insns, s64 dst, s64 src)
  1915. {
  1916. int op = *(int *)arg;
  1917. if (insns) {
  1918. bool match = __bpf_match_jmp_cond(dst, src, op);
  1919. int i = 0;
  1920. i += __bpf_ld_imm64(&insns[i], R1, dst);
  1921. i += __bpf_ld_imm64(&insns[i], R2, src);
  1922. insns[i++] = BPF_JMP_REG(op, R1, R2, 1);
  1923. if (!match)
  1924. insns[i++] = BPF_JMP_IMM(BPF_JA, 0, 0, 1);
  1925. insns[i++] = BPF_EXIT_INSN();
  1926. return i;
  1927. }
  1928. return 7;
  1929. }
  1930. static int __bpf_emit_jmp32_reg(struct bpf_test *self, void *arg,
  1931. struct bpf_insn *insns, s64 dst, s64 src)
  1932. {
  1933. int op = *(int *)arg;
  1934. if (insns) {
  1935. bool match = __bpf_match_jmp_cond((s32)dst, (s32)src, op);
  1936. int i = 0;
  1937. i += __bpf_ld_imm64(&insns[i], R1, dst);
  1938. i += __bpf_ld_imm64(&insns[i], R2, src);
  1939. insns[i++] = BPF_JMP32_REG(op, R1, R2, 1);
  1940. if (!match)
  1941. insns[i++] = BPF_JMP_IMM(BPF_JA, 0, 0, 1);
  1942. insns[i++] = BPF_EXIT_INSN();
  1943. return i;
  1944. }
  1945. return 7;
  1946. }
  1947. static int __bpf_fill_jmp_imm(struct bpf_test *self, int op)
  1948. {
  1949. return __bpf_fill_pattern(self, &op, 64, 32,
  1950. PATTERN_BLOCK1, PATTERN_BLOCK2,
  1951. &__bpf_emit_jmp_imm);
  1952. }
  1953. static int __bpf_fill_jmp32_imm(struct bpf_test *self, int op)
  1954. {
  1955. return __bpf_fill_pattern(self, &op, 64, 32,
  1956. PATTERN_BLOCK1, PATTERN_BLOCK2,
  1957. &__bpf_emit_jmp32_imm);
  1958. }
  1959. static int __bpf_fill_jmp_reg(struct bpf_test *self, int op)
  1960. {
  1961. return __bpf_fill_pattern(self, &op, 64, 64,
  1962. PATTERN_BLOCK1, PATTERN_BLOCK2,
  1963. &__bpf_emit_jmp_reg);
  1964. }
  1965. static int __bpf_fill_jmp32_reg(struct bpf_test *self, int op)
  1966. {
  1967. return __bpf_fill_pattern(self, &op, 64, 64,
  1968. PATTERN_BLOCK1, PATTERN_BLOCK2,
  1969. &__bpf_emit_jmp32_reg);
  1970. }
  1971. /* JMP immediate tests */
  1972. static int bpf_fill_jmp_jset_imm(struct bpf_test *self)
  1973. {
  1974. return __bpf_fill_jmp_imm(self, BPF_JSET);
  1975. }
  1976. static int bpf_fill_jmp_jeq_imm(struct bpf_test *self)
  1977. {
  1978. return __bpf_fill_jmp_imm(self, BPF_JEQ);
  1979. }
  1980. static int bpf_fill_jmp_jne_imm(struct bpf_test *self)
  1981. {
  1982. return __bpf_fill_jmp_imm(self, BPF_JNE);
  1983. }
  1984. static int bpf_fill_jmp_jgt_imm(struct bpf_test *self)
  1985. {
  1986. return __bpf_fill_jmp_imm(self, BPF_JGT);
  1987. }
  1988. static int bpf_fill_jmp_jge_imm(struct bpf_test *self)
  1989. {
  1990. return __bpf_fill_jmp_imm(self, BPF_JGE);
  1991. }
  1992. static int bpf_fill_jmp_jlt_imm(struct bpf_test *self)
  1993. {
  1994. return __bpf_fill_jmp_imm(self, BPF_JLT);
  1995. }
  1996. static int bpf_fill_jmp_jle_imm(struct bpf_test *self)
  1997. {
  1998. return __bpf_fill_jmp_imm(self, BPF_JLE);
  1999. }
  2000. static int bpf_fill_jmp_jsgt_imm(struct bpf_test *self)
  2001. {
  2002. return __bpf_fill_jmp_imm(self, BPF_JSGT);
  2003. }
  2004. static int bpf_fill_jmp_jsge_imm(struct bpf_test *self)
  2005. {
  2006. return __bpf_fill_jmp_imm(self, BPF_JSGE);
  2007. }
  2008. static int bpf_fill_jmp_jslt_imm(struct bpf_test *self)
  2009. {
  2010. return __bpf_fill_jmp_imm(self, BPF_JSLT);
  2011. }
  2012. static int bpf_fill_jmp_jsle_imm(struct bpf_test *self)
  2013. {
  2014. return __bpf_fill_jmp_imm(self, BPF_JSLE);
  2015. }
  2016. /* JMP32 immediate tests */
  2017. static int bpf_fill_jmp32_jset_imm(struct bpf_test *self)
  2018. {
  2019. return __bpf_fill_jmp32_imm(self, BPF_JSET);
  2020. }
  2021. static int bpf_fill_jmp32_jeq_imm(struct bpf_test *self)
  2022. {
  2023. return __bpf_fill_jmp32_imm(self, BPF_JEQ);
  2024. }
  2025. static int bpf_fill_jmp32_jne_imm(struct bpf_test *self)
  2026. {
  2027. return __bpf_fill_jmp32_imm(self, BPF_JNE);
  2028. }
  2029. static int bpf_fill_jmp32_jgt_imm(struct bpf_test *self)
  2030. {
  2031. return __bpf_fill_jmp32_imm(self, BPF_JGT);
  2032. }
  2033. static int bpf_fill_jmp32_jge_imm(struct bpf_test *self)
  2034. {
  2035. return __bpf_fill_jmp32_imm(self, BPF_JGE);
  2036. }
  2037. static int bpf_fill_jmp32_jlt_imm(struct bpf_test *self)
  2038. {
  2039. return __bpf_fill_jmp32_imm(self, BPF_JLT);
  2040. }
  2041. static int bpf_fill_jmp32_jle_imm(struct bpf_test *self)
  2042. {
  2043. return __bpf_fill_jmp32_imm(self, BPF_JLE);
  2044. }
  2045. static int bpf_fill_jmp32_jsgt_imm(struct bpf_test *self)
  2046. {
  2047. return __bpf_fill_jmp32_imm(self, BPF_JSGT);
  2048. }
  2049. static int bpf_fill_jmp32_jsge_imm(struct bpf_test *self)
  2050. {
  2051. return __bpf_fill_jmp32_imm(self, BPF_JSGE);
  2052. }
  2053. static int bpf_fill_jmp32_jslt_imm(struct bpf_test *self)
  2054. {
  2055. return __bpf_fill_jmp32_imm(self, BPF_JSLT);
  2056. }
  2057. static int bpf_fill_jmp32_jsle_imm(struct bpf_test *self)
  2058. {
  2059. return __bpf_fill_jmp32_imm(self, BPF_JSLE);
  2060. }
  2061. /* JMP register tests */
  2062. static int bpf_fill_jmp_jset_reg(struct bpf_test *self)
  2063. {
  2064. return __bpf_fill_jmp_reg(self, BPF_JSET);
  2065. }
  2066. static int bpf_fill_jmp_jeq_reg(struct bpf_test *self)
  2067. {
  2068. return __bpf_fill_jmp_reg(self, BPF_JEQ);
  2069. }
  2070. static int bpf_fill_jmp_jne_reg(struct bpf_test *self)
  2071. {
  2072. return __bpf_fill_jmp_reg(self, BPF_JNE);
  2073. }
  2074. static int bpf_fill_jmp_jgt_reg(struct bpf_test *self)
  2075. {
  2076. return __bpf_fill_jmp_reg(self, BPF_JGT);
  2077. }
  2078. static int bpf_fill_jmp_jge_reg(struct bpf_test *self)
  2079. {
  2080. return __bpf_fill_jmp_reg(self, BPF_JGE);
  2081. }
  2082. static int bpf_fill_jmp_jlt_reg(struct bpf_test *self)
  2083. {
  2084. return __bpf_fill_jmp_reg(self, BPF_JLT);
  2085. }
  2086. static int bpf_fill_jmp_jle_reg(struct bpf_test *self)
  2087. {
  2088. return __bpf_fill_jmp_reg(self, BPF_JLE);
  2089. }
  2090. static int bpf_fill_jmp_jsgt_reg(struct bpf_test *self)
  2091. {
  2092. return __bpf_fill_jmp_reg(self, BPF_JSGT);
  2093. }
  2094. static int bpf_fill_jmp_jsge_reg(struct bpf_test *self)
  2095. {
  2096. return __bpf_fill_jmp_reg(self, BPF_JSGE);
  2097. }
  2098. static int bpf_fill_jmp_jslt_reg(struct bpf_test *self)
  2099. {
  2100. return __bpf_fill_jmp_reg(self, BPF_JSLT);
  2101. }
  2102. static int bpf_fill_jmp_jsle_reg(struct bpf_test *self)
  2103. {
  2104. return __bpf_fill_jmp_reg(self, BPF_JSLE);
  2105. }
  2106. /* JMP32 register tests */
  2107. static int bpf_fill_jmp32_jset_reg(struct bpf_test *self)
  2108. {
  2109. return __bpf_fill_jmp32_reg(self, BPF_JSET);
  2110. }
  2111. static int bpf_fill_jmp32_jeq_reg(struct bpf_test *self)
  2112. {
  2113. return __bpf_fill_jmp32_reg(self, BPF_JEQ);
  2114. }
  2115. static int bpf_fill_jmp32_jne_reg(struct bpf_test *self)
  2116. {
  2117. return __bpf_fill_jmp32_reg(self, BPF_JNE);
  2118. }
  2119. static int bpf_fill_jmp32_jgt_reg(struct bpf_test *self)
  2120. {
  2121. return __bpf_fill_jmp32_reg(self, BPF_JGT);
  2122. }
  2123. static int bpf_fill_jmp32_jge_reg(struct bpf_test *self)
  2124. {
  2125. return __bpf_fill_jmp32_reg(self, BPF_JGE);
  2126. }
  2127. static int bpf_fill_jmp32_jlt_reg(struct bpf_test *self)
  2128. {
  2129. return __bpf_fill_jmp32_reg(self, BPF_JLT);
  2130. }
  2131. static int bpf_fill_jmp32_jle_reg(struct bpf_test *self)
  2132. {
  2133. return __bpf_fill_jmp32_reg(self, BPF_JLE);
  2134. }
  2135. static int bpf_fill_jmp32_jsgt_reg(struct bpf_test *self)
  2136. {
  2137. return __bpf_fill_jmp32_reg(self, BPF_JSGT);
  2138. }
  2139. static int bpf_fill_jmp32_jsge_reg(struct bpf_test *self)
  2140. {
  2141. return __bpf_fill_jmp32_reg(self, BPF_JSGE);
  2142. }
  2143. static int bpf_fill_jmp32_jslt_reg(struct bpf_test *self)
  2144. {
  2145. return __bpf_fill_jmp32_reg(self, BPF_JSLT);
  2146. }
  2147. static int bpf_fill_jmp32_jsle_reg(struct bpf_test *self)
  2148. {
  2149. return __bpf_fill_jmp32_reg(self, BPF_JSLE);
  2150. }
  2151. /*
  2152. * Set up a sequence of staggered jumps, forwards and backwards with
  2153. * increasing offset. This tests the conversion of relative jumps to
  2154. * JITed native jumps. On some architectures, for example MIPS, a large
  2155. * PC-relative jump offset may overflow the immediate field of the native
  2156. * conditional branch instruction, triggering a conversion to use an
  2157. * absolute jump instead. Since this changes the jump offsets, another
  2158. * offset computation pass is necessary, and that may in turn trigger
  2159. * another branch conversion. This jump sequence is particularly nasty
  2160. * in that regard.
  2161. *
  2162. * The sequence generation is parameterized by size and jump type.
  2163. * The size must be even, and the expected result is always size + 1.
  2164. * Below is an example with size=8 and result=9.
  2165. *
  2166. * ________________________Start
  2167. * R0 = 0
  2168. * R1 = r1
  2169. * R2 = r2
  2170. * ,------- JMP +4 * 3______________Preamble: 4 insns
  2171. * ,----------|-ind 0- if R0 != 7 JMP 8 * 3 + 1 <--------------------.
  2172. * | | R0 = 8 |
  2173. * | | JMP +7 * 3 ------------------------.
  2174. * | ,--------|-----1- if R0 != 5 JMP 7 * 3 + 1 <--------------. | |
  2175. * | | | R0 = 6 | | |
  2176. * | | | JMP +5 * 3 ------------------. | |
  2177. * | | ,------|-----2- if R0 != 3 JMP 6 * 3 + 1 <--------. | | | |
  2178. * | | | | R0 = 4 | | | | |
  2179. * | | | | JMP +3 * 3 ------------. | | | |
  2180. * | | | ,----|-----3- if R0 != 1 JMP 5 * 3 + 1 <--. | | | | | |
  2181. * | | | | | R0 = 2 | | | | | | |
  2182. * | | | | | JMP +1 * 3 ------. | | | | | |
  2183. * | | | | ,--t=====4> if R0 != 0 JMP 4 * 3 + 1 1 2 3 4 5 6 7 8 loc
  2184. * | | | | | R0 = 1 -1 +2 -3 +4 -5 +6 -7 +8 off
  2185. * | | | | | JMP -2 * 3 ---' | | | | | | |
  2186. * | | | | | ,------5- if R0 != 2 JMP 3 * 3 + 1 <-----' | | | | | |
  2187. * | | | | | | R0 = 3 | | | | | |
  2188. * | | | | | | JMP -4 * 3 ---------' | | | | |
  2189. * | | | | | | ,----6- if R0 != 4 JMP 2 * 3 + 1 <-----------' | | | |
  2190. * | | | | | | | R0 = 5 | | | |
  2191. * | | | | | | | JMP -6 * 3 ---------------' | | |
  2192. * | | | | | | | ,--7- if R0 != 6 JMP 1 * 3 + 1 <-----------------' | |
  2193. * | | | | | | | | R0 = 7 | |
  2194. * | | Error | | | JMP -8 * 3 ---------------------' |
  2195. * | | paths | | | ,8- if R0 != 8 JMP 0 * 3 + 1 <-----------------------'
  2196. * | | | | | | | | | R0 = 9__________________Sequence: 3 * size - 1 insns
  2197. * `-+-+-+-+-+-+-+-+-> EXIT____________________Return: 1 insn
  2198. *
  2199. */
  2200. /* The maximum size parameter */
  2201. #define MAX_STAGGERED_JMP_SIZE ((0x7fff / 3) & ~1)
  2202. /* We use a reduced number of iterations to get a reasonable execution time */
  2203. #define NR_STAGGERED_JMP_RUNS 10
  2204. static int __bpf_fill_staggered_jumps(struct bpf_test *self,
  2205. const struct bpf_insn *jmp,
  2206. u64 r1, u64 r2)
  2207. {
  2208. int size = self->test[0].result - 1;
  2209. int len = 4 + 3 * (size + 1);
  2210. struct bpf_insn *insns;
  2211. int off, ind;
  2212. insns = kmalloc_objs(*insns, len);
  2213. if (!insns)
  2214. return -ENOMEM;
  2215. /* Preamble */
  2216. insns[0] = BPF_ALU64_IMM(BPF_MOV, R0, 0);
  2217. insns[1] = BPF_ALU64_IMM(BPF_MOV, R1, r1);
  2218. insns[2] = BPF_ALU64_IMM(BPF_MOV, R2, r2);
  2219. insns[3] = BPF_JMP_IMM(BPF_JA, 0, 0, 3 * size / 2);
  2220. /* Sequence */
  2221. for (ind = 0, off = size; ind <= size; ind++, off -= 2) {
  2222. struct bpf_insn *ins = &insns[4 + 3 * ind];
  2223. int loc;
  2224. if (off == 0)
  2225. off--;
  2226. loc = abs(off);
  2227. ins[0] = BPF_JMP_IMM(BPF_JNE, R0, loc - 1,
  2228. 3 * (size - ind) + 1);
  2229. ins[1] = BPF_ALU64_IMM(BPF_MOV, R0, loc);
  2230. ins[2] = *jmp;
  2231. ins[2].off = 3 * (off - 1);
  2232. }
  2233. /* Return */
  2234. insns[len - 1] = BPF_EXIT_INSN();
  2235. self->u.ptr.insns = insns;
  2236. self->u.ptr.len = len;
  2237. return 0;
  2238. }
  2239. /* 64-bit unconditional jump */
  2240. static int bpf_fill_staggered_ja(struct bpf_test *self)
  2241. {
  2242. struct bpf_insn jmp = BPF_JMP_IMM(BPF_JA, 0, 0, 0);
  2243. return __bpf_fill_staggered_jumps(self, &jmp, 0, 0);
  2244. }
  2245. /* 64-bit immediate jumps */
  2246. static int bpf_fill_staggered_jeq_imm(struct bpf_test *self)
  2247. {
  2248. struct bpf_insn jmp = BPF_JMP_IMM(BPF_JEQ, R1, 1234, 0);
  2249. return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0);
  2250. }
  2251. static int bpf_fill_staggered_jne_imm(struct bpf_test *self)
  2252. {
  2253. struct bpf_insn jmp = BPF_JMP_IMM(BPF_JNE, R1, 1234, 0);
  2254. return __bpf_fill_staggered_jumps(self, &jmp, 4321, 0);
  2255. }
  2256. static int bpf_fill_staggered_jset_imm(struct bpf_test *self)
  2257. {
  2258. struct bpf_insn jmp = BPF_JMP_IMM(BPF_JSET, R1, 0x82, 0);
  2259. return __bpf_fill_staggered_jumps(self, &jmp, 0x86, 0);
  2260. }
  2261. static int bpf_fill_staggered_jgt_imm(struct bpf_test *self)
  2262. {
  2263. struct bpf_insn jmp = BPF_JMP_IMM(BPF_JGT, R1, 1234, 0);
  2264. return __bpf_fill_staggered_jumps(self, &jmp, 0x80000000, 0);
  2265. }
  2266. static int bpf_fill_staggered_jge_imm(struct bpf_test *self)
  2267. {
  2268. struct bpf_insn jmp = BPF_JMP_IMM(BPF_JGE, R1, 1234, 0);
  2269. return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0);
  2270. }
  2271. static int bpf_fill_staggered_jlt_imm(struct bpf_test *self)
  2272. {
  2273. struct bpf_insn jmp = BPF_JMP_IMM(BPF_JLT, R1, 0x80000000, 0);
  2274. return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0);
  2275. }
  2276. static int bpf_fill_staggered_jle_imm(struct bpf_test *self)
  2277. {
  2278. struct bpf_insn jmp = BPF_JMP_IMM(BPF_JLE, R1, 1234, 0);
  2279. return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0);
  2280. }
  2281. static int bpf_fill_staggered_jsgt_imm(struct bpf_test *self)
  2282. {
  2283. struct bpf_insn jmp = BPF_JMP_IMM(BPF_JSGT, R1, -2, 0);
  2284. return __bpf_fill_staggered_jumps(self, &jmp, -1, 0);
  2285. }
  2286. static int bpf_fill_staggered_jsge_imm(struct bpf_test *self)
  2287. {
  2288. struct bpf_insn jmp = BPF_JMP_IMM(BPF_JSGE, R1, -2, 0);
  2289. return __bpf_fill_staggered_jumps(self, &jmp, -2, 0);
  2290. }
  2291. static int bpf_fill_staggered_jslt_imm(struct bpf_test *self)
  2292. {
  2293. struct bpf_insn jmp = BPF_JMP_IMM(BPF_JSLT, R1, -1, 0);
  2294. return __bpf_fill_staggered_jumps(self, &jmp, -2, 0);
  2295. }
  2296. static int bpf_fill_staggered_jsle_imm(struct bpf_test *self)
  2297. {
  2298. struct bpf_insn jmp = BPF_JMP_IMM(BPF_JSLE, R1, -1, 0);
  2299. return __bpf_fill_staggered_jumps(self, &jmp, -1, 0);
  2300. }
  2301. /* 64-bit register jumps */
  2302. static int bpf_fill_staggered_jeq_reg(struct bpf_test *self)
  2303. {
  2304. struct bpf_insn jmp = BPF_JMP_REG(BPF_JEQ, R1, R2, 0);
  2305. return __bpf_fill_staggered_jumps(self, &jmp, 1234, 1234);
  2306. }
  2307. static int bpf_fill_staggered_jne_reg(struct bpf_test *self)
  2308. {
  2309. struct bpf_insn jmp = BPF_JMP_REG(BPF_JNE, R1, R2, 0);
  2310. return __bpf_fill_staggered_jumps(self, &jmp, 4321, 1234);
  2311. }
  2312. static int bpf_fill_staggered_jset_reg(struct bpf_test *self)
  2313. {
  2314. struct bpf_insn jmp = BPF_JMP_REG(BPF_JSET, R1, R2, 0);
  2315. return __bpf_fill_staggered_jumps(self, &jmp, 0x86, 0x82);
  2316. }
  2317. static int bpf_fill_staggered_jgt_reg(struct bpf_test *self)
  2318. {
  2319. struct bpf_insn jmp = BPF_JMP_REG(BPF_JGT, R1, R2, 0);
  2320. return __bpf_fill_staggered_jumps(self, &jmp, 0x80000000, 1234);
  2321. }
  2322. static int bpf_fill_staggered_jge_reg(struct bpf_test *self)
  2323. {
  2324. struct bpf_insn jmp = BPF_JMP_REG(BPF_JGE, R1, R2, 0);
  2325. return __bpf_fill_staggered_jumps(self, &jmp, 1234, 1234);
  2326. }
  2327. static int bpf_fill_staggered_jlt_reg(struct bpf_test *self)
  2328. {
  2329. struct bpf_insn jmp = BPF_JMP_REG(BPF_JLT, R1, R2, 0);
  2330. return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0x80000000);
  2331. }
  2332. static int bpf_fill_staggered_jle_reg(struct bpf_test *self)
  2333. {
  2334. struct bpf_insn jmp = BPF_JMP_REG(BPF_JLE, R1, R2, 0);
  2335. return __bpf_fill_staggered_jumps(self, &jmp, 1234, 1234);
  2336. }
  2337. static int bpf_fill_staggered_jsgt_reg(struct bpf_test *self)
  2338. {
  2339. struct bpf_insn jmp = BPF_JMP_REG(BPF_JSGT, R1, R2, 0);
  2340. return __bpf_fill_staggered_jumps(self, &jmp, -1, -2);
  2341. }
  2342. static int bpf_fill_staggered_jsge_reg(struct bpf_test *self)
  2343. {
  2344. struct bpf_insn jmp = BPF_JMP_REG(BPF_JSGE, R1, R2, 0);
  2345. return __bpf_fill_staggered_jumps(self, &jmp, -2, -2);
  2346. }
  2347. static int bpf_fill_staggered_jslt_reg(struct bpf_test *self)
  2348. {
  2349. struct bpf_insn jmp = BPF_JMP_REG(BPF_JSLT, R1, R2, 0);
  2350. return __bpf_fill_staggered_jumps(self, &jmp, -2, -1);
  2351. }
  2352. static int bpf_fill_staggered_jsle_reg(struct bpf_test *self)
  2353. {
  2354. struct bpf_insn jmp = BPF_JMP_REG(BPF_JSLE, R1, R2, 0);
  2355. return __bpf_fill_staggered_jumps(self, &jmp, -1, -1);
  2356. }
  2357. /* 32-bit immediate jumps */
  2358. static int bpf_fill_staggered_jeq32_imm(struct bpf_test *self)
  2359. {
  2360. struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JEQ, R1, 1234, 0);
  2361. return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0);
  2362. }
  2363. static int bpf_fill_staggered_jne32_imm(struct bpf_test *self)
  2364. {
  2365. struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JNE, R1, 1234, 0);
  2366. return __bpf_fill_staggered_jumps(self, &jmp, 4321, 0);
  2367. }
  2368. static int bpf_fill_staggered_jset32_imm(struct bpf_test *self)
  2369. {
  2370. struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JSET, R1, 0x82, 0);
  2371. return __bpf_fill_staggered_jumps(self, &jmp, 0x86, 0);
  2372. }
  2373. static int bpf_fill_staggered_jgt32_imm(struct bpf_test *self)
  2374. {
  2375. struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JGT, R1, 1234, 0);
  2376. return __bpf_fill_staggered_jumps(self, &jmp, 0x80000000, 0);
  2377. }
  2378. static int bpf_fill_staggered_jge32_imm(struct bpf_test *self)
  2379. {
  2380. struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JGE, R1, 1234, 0);
  2381. return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0);
  2382. }
  2383. static int bpf_fill_staggered_jlt32_imm(struct bpf_test *self)
  2384. {
  2385. struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JLT, R1, 0x80000000, 0);
  2386. return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0);
  2387. }
  2388. static int bpf_fill_staggered_jle32_imm(struct bpf_test *self)
  2389. {
  2390. struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JLE, R1, 1234, 0);
  2391. return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0);
  2392. }
  2393. static int bpf_fill_staggered_jsgt32_imm(struct bpf_test *self)
  2394. {
  2395. struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JSGT, R1, -2, 0);
  2396. return __bpf_fill_staggered_jumps(self, &jmp, -1, 0);
  2397. }
  2398. static int bpf_fill_staggered_jsge32_imm(struct bpf_test *self)
  2399. {
  2400. struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JSGE, R1, -2, 0);
  2401. return __bpf_fill_staggered_jumps(self, &jmp, -2, 0);
  2402. }
  2403. static int bpf_fill_staggered_jslt32_imm(struct bpf_test *self)
  2404. {
  2405. struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JSLT, R1, -1, 0);
  2406. return __bpf_fill_staggered_jumps(self, &jmp, -2, 0);
  2407. }
  2408. static int bpf_fill_staggered_jsle32_imm(struct bpf_test *self)
  2409. {
  2410. struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JSLE, R1, -1, 0);
  2411. return __bpf_fill_staggered_jumps(self, &jmp, -1, 0);
  2412. }
  2413. /* 32-bit register jumps */
  2414. static int bpf_fill_staggered_jeq32_reg(struct bpf_test *self)
  2415. {
  2416. struct bpf_insn jmp = BPF_JMP32_REG(BPF_JEQ, R1, R2, 0);
  2417. return __bpf_fill_staggered_jumps(self, &jmp, 1234, 1234);
  2418. }
  2419. static int bpf_fill_staggered_jne32_reg(struct bpf_test *self)
  2420. {
  2421. struct bpf_insn jmp = BPF_JMP32_REG(BPF_JNE, R1, R2, 0);
  2422. return __bpf_fill_staggered_jumps(self, &jmp, 4321, 1234);
  2423. }
  2424. static int bpf_fill_staggered_jset32_reg(struct bpf_test *self)
  2425. {
  2426. struct bpf_insn jmp = BPF_JMP32_REG(BPF_JSET, R1, R2, 0);
  2427. return __bpf_fill_staggered_jumps(self, &jmp, 0x86, 0x82);
  2428. }
  2429. static int bpf_fill_staggered_jgt32_reg(struct bpf_test *self)
  2430. {
  2431. struct bpf_insn jmp = BPF_JMP32_REG(BPF_JGT, R1, R2, 0);
  2432. return __bpf_fill_staggered_jumps(self, &jmp, 0x80000000, 1234);
  2433. }
  2434. static int bpf_fill_staggered_jge32_reg(struct bpf_test *self)
  2435. {
  2436. struct bpf_insn jmp = BPF_JMP32_REG(BPF_JGE, R1, R2, 0);
  2437. return __bpf_fill_staggered_jumps(self, &jmp, 1234, 1234);
  2438. }
  2439. static int bpf_fill_staggered_jlt32_reg(struct bpf_test *self)
  2440. {
  2441. struct bpf_insn jmp = BPF_JMP32_REG(BPF_JLT, R1, R2, 0);
  2442. return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0x80000000);
  2443. }
  2444. static int bpf_fill_staggered_jle32_reg(struct bpf_test *self)
  2445. {
  2446. struct bpf_insn jmp = BPF_JMP32_REG(BPF_JLE, R1, R2, 0);
  2447. return __bpf_fill_staggered_jumps(self, &jmp, 1234, 1234);
  2448. }
  2449. static int bpf_fill_staggered_jsgt32_reg(struct bpf_test *self)
  2450. {
  2451. struct bpf_insn jmp = BPF_JMP32_REG(BPF_JSGT, R1, R2, 0);
  2452. return __bpf_fill_staggered_jumps(self, &jmp, -1, -2);
  2453. }
  2454. static int bpf_fill_staggered_jsge32_reg(struct bpf_test *self)
  2455. {
  2456. struct bpf_insn jmp = BPF_JMP32_REG(BPF_JSGE, R1, R2, 0);
  2457. return __bpf_fill_staggered_jumps(self, &jmp, -2, -2);
  2458. }
  2459. static int bpf_fill_staggered_jslt32_reg(struct bpf_test *self)
  2460. {
  2461. struct bpf_insn jmp = BPF_JMP32_REG(BPF_JSLT, R1, R2, 0);
  2462. return __bpf_fill_staggered_jumps(self, &jmp, -2, -1);
  2463. }
  2464. static int bpf_fill_staggered_jsle32_reg(struct bpf_test *self)
  2465. {
  2466. struct bpf_insn jmp = BPF_JMP32_REG(BPF_JSLE, R1, R2, 0);
  2467. return __bpf_fill_staggered_jumps(self, &jmp, -1, -1);
  2468. }
  2469. static struct bpf_test tests[] = {
  2470. {
  2471. "TAX",
  2472. .u.insns = {
  2473. BPF_STMT(BPF_LD | BPF_IMM, 1),
  2474. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  2475. BPF_STMT(BPF_LD | BPF_IMM, 2),
  2476. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  2477. BPF_STMT(BPF_ALU | BPF_NEG, 0), /* A == -3 */
  2478. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  2479. BPF_STMT(BPF_LD | BPF_LEN, 0),
  2480. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  2481. BPF_STMT(BPF_MISC | BPF_TAX, 0), /* X == len - 3 */
  2482. BPF_STMT(BPF_LD | BPF_B | BPF_IND, 1),
  2483. BPF_STMT(BPF_RET | BPF_A, 0)
  2484. },
  2485. CLASSIC,
  2486. { 10, 20, 30, 40, 50 },
  2487. { { 2, 10 }, { 3, 20 }, { 4, 30 } },
  2488. },
  2489. {
  2490. "TXA",
  2491. .u.insns = {
  2492. BPF_STMT(BPF_LDX | BPF_LEN, 0),
  2493. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  2494. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  2495. BPF_STMT(BPF_RET | BPF_A, 0) /* A == len * 2 */
  2496. },
  2497. CLASSIC,
  2498. { 10, 20, 30, 40, 50 },
  2499. { { 1, 2 }, { 3, 6 }, { 4, 8 } },
  2500. },
  2501. {
  2502. "ADD_SUB_MUL_K",
  2503. .u.insns = {
  2504. BPF_STMT(BPF_LD | BPF_IMM, 1),
  2505. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 2),
  2506. BPF_STMT(BPF_LDX | BPF_IMM, 3),
  2507. BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
  2508. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 0xffffffff),
  2509. BPF_STMT(BPF_ALU | BPF_MUL | BPF_K, 3),
  2510. BPF_STMT(BPF_RET | BPF_A, 0)
  2511. },
  2512. CLASSIC | FLAG_NO_DATA,
  2513. { },
  2514. { { 0, 0xfffffffd } }
  2515. },
  2516. {
  2517. "DIV_MOD_KX",
  2518. .u.insns = {
  2519. BPF_STMT(BPF_LD | BPF_IMM, 8),
  2520. BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 2),
  2521. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  2522. BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
  2523. BPF_STMT(BPF_ALU | BPF_DIV | BPF_X, 0),
  2524. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  2525. BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
  2526. BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0x70000000),
  2527. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  2528. BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
  2529. BPF_STMT(BPF_ALU | BPF_MOD | BPF_X, 0),
  2530. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  2531. BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
  2532. BPF_STMT(BPF_ALU | BPF_MOD | BPF_K, 0x70000000),
  2533. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  2534. BPF_STMT(BPF_RET | BPF_A, 0)
  2535. },
  2536. CLASSIC | FLAG_NO_DATA,
  2537. { },
  2538. { { 0, 0x20000000 } }
  2539. },
  2540. {
  2541. "AND_OR_LSH_K",
  2542. .u.insns = {
  2543. BPF_STMT(BPF_LD | BPF_IMM, 0xff),
  2544. BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf0),
  2545. BPF_STMT(BPF_ALU | BPF_LSH | BPF_K, 27),
  2546. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  2547. BPF_STMT(BPF_LD | BPF_IMM, 0xf),
  2548. BPF_STMT(BPF_ALU | BPF_OR | BPF_K, 0xf0),
  2549. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  2550. BPF_STMT(BPF_RET | BPF_A, 0)
  2551. },
  2552. CLASSIC | FLAG_NO_DATA,
  2553. { },
  2554. { { 0, 0x800000ff }, { 1, 0x800000ff } },
  2555. },
  2556. {
  2557. "LD_IMM_0",
  2558. .u.insns = {
  2559. BPF_STMT(BPF_LD | BPF_IMM, 0), /* ld #0 */
  2560. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0, 1, 0),
  2561. BPF_STMT(BPF_RET | BPF_K, 0),
  2562. BPF_STMT(BPF_RET | BPF_K, 1),
  2563. },
  2564. CLASSIC,
  2565. { },
  2566. { { 1, 1 } },
  2567. },
  2568. {
  2569. "LD_IND",
  2570. .u.insns = {
  2571. BPF_STMT(BPF_LDX | BPF_LEN, 0),
  2572. BPF_STMT(BPF_LD | BPF_H | BPF_IND, MAX_K),
  2573. BPF_STMT(BPF_RET | BPF_K, 1)
  2574. },
  2575. CLASSIC,
  2576. { },
  2577. { { 1, 0 }, { 10, 0 }, { 60, 0 } },
  2578. },
  2579. {
  2580. "LD_ABS",
  2581. .u.insns = {
  2582. BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 1000),
  2583. BPF_STMT(BPF_RET | BPF_K, 1)
  2584. },
  2585. CLASSIC,
  2586. { },
  2587. { { 1, 0 }, { 10, 0 }, { 60, 0 } },
  2588. },
  2589. {
  2590. "LD_ABS_LL",
  2591. .u.insns = {
  2592. BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_LL_OFF),
  2593. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  2594. BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_LL_OFF + 1),
  2595. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  2596. BPF_STMT(BPF_RET | BPF_A, 0)
  2597. },
  2598. CLASSIC,
  2599. { 1, 2, 3 },
  2600. { { 1, 0 }, { 2, 3 } },
  2601. },
  2602. {
  2603. "LD_IND_LL",
  2604. .u.insns = {
  2605. BPF_STMT(BPF_LD | BPF_IMM, SKF_LL_OFF - 1),
  2606. BPF_STMT(BPF_LDX | BPF_LEN, 0),
  2607. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  2608. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  2609. BPF_STMT(BPF_LD | BPF_B | BPF_IND, 0),
  2610. BPF_STMT(BPF_RET | BPF_A, 0)
  2611. },
  2612. CLASSIC,
  2613. { 1, 2, 3, 0xff },
  2614. { { 1, 1 }, { 3, 3 }, { 4, 0xff } },
  2615. },
  2616. {
  2617. "LD_ABS_NET",
  2618. .u.insns = {
  2619. BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_NET_OFF),
  2620. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  2621. BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_NET_OFF + 1),
  2622. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  2623. BPF_STMT(BPF_RET | BPF_A, 0)
  2624. },
  2625. CLASSIC,
  2626. { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 },
  2627. { { 15, 0 }, { 16, 3 } },
  2628. },
  2629. {
  2630. "LD_IND_NET",
  2631. .u.insns = {
  2632. BPF_STMT(BPF_LD | BPF_IMM, SKF_NET_OFF - 15),
  2633. BPF_STMT(BPF_LDX | BPF_LEN, 0),
  2634. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  2635. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  2636. BPF_STMT(BPF_LD | BPF_B | BPF_IND, 0),
  2637. BPF_STMT(BPF_RET | BPF_A, 0)
  2638. },
  2639. CLASSIC,
  2640. { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 },
  2641. { { 14, 0 }, { 15, 1 }, { 17, 3 } },
  2642. },
  2643. {
  2644. "LD_PKTTYPE",
  2645. .u.insns = {
  2646. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  2647. SKF_AD_OFF + SKF_AD_PKTTYPE),
  2648. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
  2649. BPF_STMT(BPF_RET | BPF_K, 1),
  2650. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  2651. SKF_AD_OFF + SKF_AD_PKTTYPE),
  2652. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
  2653. BPF_STMT(BPF_RET | BPF_K, 1),
  2654. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  2655. SKF_AD_OFF + SKF_AD_PKTTYPE),
  2656. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
  2657. BPF_STMT(BPF_RET | BPF_K, 1),
  2658. BPF_STMT(BPF_RET | BPF_A, 0)
  2659. },
  2660. CLASSIC,
  2661. { },
  2662. { { 1, 3 }, { 10, 3 } },
  2663. },
  2664. {
  2665. "LD_MARK",
  2666. .u.insns = {
  2667. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  2668. SKF_AD_OFF + SKF_AD_MARK),
  2669. BPF_STMT(BPF_RET | BPF_A, 0)
  2670. },
  2671. CLASSIC,
  2672. { },
  2673. { { 1, SKB_MARK}, { 10, SKB_MARK} },
  2674. },
  2675. {
  2676. "LD_RXHASH",
  2677. .u.insns = {
  2678. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  2679. SKF_AD_OFF + SKF_AD_RXHASH),
  2680. BPF_STMT(BPF_RET | BPF_A, 0)
  2681. },
  2682. CLASSIC,
  2683. { },
  2684. { { 1, SKB_HASH}, { 10, SKB_HASH} },
  2685. },
  2686. {
  2687. "LD_QUEUE",
  2688. .u.insns = {
  2689. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  2690. SKF_AD_OFF + SKF_AD_QUEUE),
  2691. BPF_STMT(BPF_RET | BPF_A, 0)
  2692. },
  2693. CLASSIC,
  2694. { },
  2695. { { 1, SKB_QUEUE_MAP }, { 10, SKB_QUEUE_MAP } },
  2696. },
  2697. {
  2698. "LD_PROTOCOL",
  2699. .u.insns = {
  2700. BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 1),
  2701. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 20, 1, 0),
  2702. BPF_STMT(BPF_RET | BPF_K, 0),
  2703. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  2704. SKF_AD_OFF + SKF_AD_PROTOCOL),
  2705. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  2706. BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
  2707. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 30, 1, 0),
  2708. BPF_STMT(BPF_RET | BPF_K, 0),
  2709. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  2710. BPF_STMT(BPF_RET | BPF_A, 0)
  2711. },
  2712. CLASSIC,
  2713. { 10, 20, 30 },
  2714. { { 10, ETH_P_IP }, { 100, ETH_P_IP } },
  2715. },
  2716. {
  2717. "LD_VLAN_TAG",
  2718. .u.insns = {
  2719. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  2720. SKF_AD_OFF + SKF_AD_VLAN_TAG),
  2721. BPF_STMT(BPF_RET | BPF_A, 0)
  2722. },
  2723. CLASSIC,
  2724. { },
  2725. {
  2726. { 1, SKB_VLAN_TCI },
  2727. { 10, SKB_VLAN_TCI }
  2728. },
  2729. },
  2730. {
  2731. "LD_VLAN_TAG_PRESENT",
  2732. .u.insns = {
  2733. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  2734. SKF_AD_OFF + SKF_AD_VLAN_TAG_PRESENT),
  2735. BPF_STMT(BPF_RET | BPF_A, 0)
  2736. },
  2737. CLASSIC,
  2738. { },
  2739. {
  2740. { 1, SKB_VLAN_PRESENT },
  2741. { 10, SKB_VLAN_PRESENT }
  2742. },
  2743. },
  2744. {
  2745. "LD_IFINDEX",
  2746. .u.insns = {
  2747. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  2748. SKF_AD_OFF + SKF_AD_IFINDEX),
  2749. BPF_STMT(BPF_RET | BPF_A, 0)
  2750. },
  2751. CLASSIC,
  2752. { },
  2753. { { 1, SKB_DEV_IFINDEX }, { 10, SKB_DEV_IFINDEX } },
  2754. },
  2755. {
  2756. "LD_HATYPE",
  2757. .u.insns = {
  2758. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  2759. SKF_AD_OFF + SKF_AD_HATYPE),
  2760. BPF_STMT(BPF_RET | BPF_A, 0)
  2761. },
  2762. CLASSIC,
  2763. { },
  2764. { { 1, SKB_DEV_TYPE }, { 10, SKB_DEV_TYPE } },
  2765. },
  2766. {
  2767. "LD_CPU",
  2768. .u.insns = {
  2769. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  2770. SKF_AD_OFF + SKF_AD_CPU),
  2771. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  2772. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  2773. SKF_AD_OFF + SKF_AD_CPU),
  2774. BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
  2775. BPF_STMT(BPF_RET | BPF_A, 0)
  2776. },
  2777. CLASSIC,
  2778. { },
  2779. { { 1, 0 }, { 10, 0 } },
  2780. },
  2781. {
  2782. "LD_NLATTR",
  2783. .u.insns = {
  2784. BPF_STMT(BPF_LDX | BPF_IMM, 2),
  2785. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  2786. BPF_STMT(BPF_LDX | BPF_IMM, 3),
  2787. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  2788. SKF_AD_OFF + SKF_AD_NLATTR),
  2789. BPF_STMT(BPF_RET | BPF_A, 0)
  2790. },
  2791. CLASSIC,
  2792. #ifdef __BIG_ENDIAN
  2793. { 0xff, 0xff, 0, 4, 0, 2, 0, 4, 0, 3 },
  2794. #else
  2795. { 0xff, 0xff, 4, 0, 2, 0, 4, 0, 3, 0 },
  2796. #endif
  2797. { { 4, 0 }, { 20, 6 } },
  2798. },
  2799. {
  2800. "LD_NLATTR_NEST",
  2801. .u.insns = {
  2802. BPF_STMT(BPF_LD | BPF_IMM, 2),
  2803. BPF_STMT(BPF_LDX | BPF_IMM, 3),
  2804. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  2805. SKF_AD_OFF + SKF_AD_NLATTR_NEST),
  2806. BPF_STMT(BPF_LD | BPF_IMM, 2),
  2807. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  2808. SKF_AD_OFF + SKF_AD_NLATTR_NEST),
  2809. BPF_STMT(BPF_LD | BPF_IMM, 2),
  2810. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  2811. SKF_AD_OFF + SKF_AD_NLATTR_NEST),
  2812. BPF_STMT(BPF_LD | BPF_IMM, 2),
  2813. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  2814. SKF_AD_OFF + SKF_AD_NLATTR_NEST),
  2815. BPF_STMT(BPF_LD | BPF_IMM, 2),
  2816. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  2817. SKF_AD_OFF + SKF_AD_NLATTR_NEST),
  2818. BPF_STMT(BPF_LD | BPF_IMM, 2),
  2819. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  2820. SKF_AD_OFF + SKF_AD_NLATTR_NEST),
  2821. BPF_STMT(BPF_LD | BPF_IMM, 2),
  2822. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  2823. SKF_AD_OFF + SKF_AD_NLATTR_NEST),
  2824. BPF_STMT(BPF_LD | BPF_IMM, 2),
  2825. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  2826. SKF_AD_OFF + SKF_AD_NLATTR_NEST),
  2827. BPF_STMT(BPF_RET | BPF_A, 0)
  2828. },
  2829. CLASSIC,
  2830. #ifdef __BIG_ENDIAN
  2831. { 0xff, 0xff, 0, 12, 0, 1, 0, 4, 0, 2, 0, 4, 0, 3 },
  2832. #else
  2833. { 0xff, 0xff, 12, 0, 1, 0, 4, 0, 2, 0, 4, 0, 3, 0 },
  2834. #endif
  2835. { { 4, 0 }, { 20, 10 } },
  2836. },
  2837. {
  2838. "LD_PAYLOAD_OFF",
  2839. .u.insns = {
  2840. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  2841. SKF_AD_OFF + SKF_AD_PAY_OFFSET),
  2842. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  2843. SKF_AD_OFF + SKF_AD_PAY_OFFSET),
  2844. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  2845. SKF_AD_OFF + SKF_AD_PAY_OFFSET),
  2846. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  2847. SKF_AD_OFF + SKF_AD_PAY_OFFSET),
  2848. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  2849. SKF_AD_OFF + SKF_AD_PAY_OFFSET),
  2850. BPF_STMT(BPF_RET | BPF_A, 0)
  2851. },
  2852. CLASSIC,
  2853. /* 00:00:00:00:00:00 > 00:00:00:00:00:00, ethtype IPv4 (0x0800),
  2854. * length 98: 127.0.0.1 > 127.0.0.1: ICMP echo request,
  2855. * id 9737, seq 1, length 64
  2856. */
  2857. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  2858. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  2859. 0x08, 0x00,
  2860. 0x45, 0x00, 0x00, 0x54, 0xac, 0x8b, 0x40, 0x00, 0x40,
  2861. 0x01, 0x90, 0x1b, 0x7f, 0x00, 0x00, 0x01 },
  2862. { { 30, 0 }, { 100, 42 } },
  2863. },
  2864. {
  2865. "LD_ANC_XOR",
  2866. .u.insns = {
  2867. BPF_STMT(BPF_LD | BPF_IMM, 10),
  2868. BPF_STMT(BPF_LDX | BPF_IMM, 300),
  2869. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  2870. SKF_AD_OFF + SKF_AD_ALU_XOR_X),
  2871. BPF_STMT(BPF_RET | BPF_A, 0)
  2872. },
  2873. CLASSIC,
  2874. { },
  2875. { { 4, 0xA ^ 300 }, { 20, 0xA ^ 300 } },
  2876. },
  2877. {
  2878. "SPILL_FILL",
  2879. .u.insns = {
  2880. BPF_STMT(BPF_LDX | BPF_LEN, 0),
  2881. BPF_STMT(BPF_LD | BPF_IMM, 2),
  2882. BPF_STMT(BPF_ALU | BPF_RSH, 1),
  2883. BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
  2884. BPF_STMT(BPF_ST, 1), /* M1 = 1 ^ len */
  2885. BPF_STMT(BPF_ALU | BPF_XOR | BPF_K, 0x80000000),
  2886. BPF_STMT(BPF_ST, 2), /* M2 = 1 ^ len ^ 0x80000000 */
  2887. BPF_STMT(BPF_STX, 15), /* M3 = len */
  2888. BPF_STMT(BPF_LDX | BPF_MEM, 1),
  2889. BPF_STMT(BPF_LD | BPF_MEM, 2),
  2890. BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
  2891. BPF_STMT(BPF_LDX | BPF_MEM, 15),
  2892. BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
  2893. BPF_STMT(BPF_RET | BPF_A, 0)
  2894. },
  2895. CLASSIC,
  2896. { },
  2897. { { 1, 0x80000001 }, { 2, 0x80000002 }, { 60, 0x80000000 ^ 60 } }
  2898. },
  2899. {
  2900. "JEQ",
  2901. .u.insns = {
  2902. BPF_STMT(BPF_LDX | BPF_LEN, 0),
  2903. BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
  2904. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0, 0, 1),
  2905. BPF_STMT(BPF_RET | BPF_K, 1),
  2906. BPF_STMT(BPF_RET | BPF_K, MAX_K)
  2907. },
  2908. CLASSIC,
  2909. { 3, 3, 3, 3, 3 },
  2910. { { 1, 0 }, { 3, 1 }, { 4, MAX_K } },
  2911. },
  2912. {
  2913. "JGT",
  2914. .u.insns = {
  2915. BPF_STMT(BPF_LDX | BPF_LEN, 0),
  2916. BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
  2917. BPF_JUMP(BPF_JMP | BPF_JGT | BPF_X, 0, 0, 1),
  2918. BPF_STMT(BPF_RET | BPF_K, 1),
  2919. BPF_STMT(BPF_RET | BPF_K, MAX_K)
  2920. },
  2921. CLASSIC,
  2922. { 4, 4, 4, 3, 3 },
  2923. { { 2, 0 }, { 3, 1 }, { 4, MAX_K } },
  2924. },
  2925. {
  2926. "JGE (jt 0), test 1",
  2927. .u.insns = {
  2928. BPF_STMT(BPF_LDX | BPF_LEN, 0),
  2929. BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
  2930. BPF_JUMP(BPF_JMP | BPF_JGE | BPF_X, 0, 0, 1),
  2931. BPF_STMT(BPF_RET | BPF_K, 1),
  2932. BPF_STMT(BPF_RET | BPF_K, MAX_K)
  2933. },
  2934. CLASSIC,
  2935. { 4, 4, 4, 3, 3 },
  2936. { { 2, 0 }, { 3, 1 }, { 4, 1 } },
  2937. },
  2938. {
  2939. "JGE (jt 0), test 2",
  2940. .u.insns = {
  2941. BPF_STMT(BPF_LDX | BPF_LEN, 0),
  2942. BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
  2943. BPF_JUMP(BPF_JMP | BPF_JGE | BPF_X, 0, 0, 1),
  2944. BPF_STMT(BPF_RET | BPF_K, 1),
  2945. BPF_STMT(BPF_RET | BPF_K, MAX_K)
  2946. },
  2947. CLASSIC,
  2948. { 4, 4, 5, 3, 3 },
  2949. { { 4, 1 }, { 5, 1 }, { 6, MAX_K } },
  2950. },
  2951. {
  2952. "JGE",
  2953. .u.insns = {
  2954. BPF_STMT(BPF_LDX | BPF_LEN, 0),
  2955. BPF_STMT(BPF_LD | BPF_B | BPF_IND, MAX_K),
  2956. BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 1, 1, 0),
  2957. BPF_STMT(BPF_RET | BPF_K, 10),
  2958. BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 2, 1, 0),
  2959. BPF_STMT(BPF_RET | BPF_K, 20),
  2960. BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 3, 1, 0),
  2961. BPF_STMT(BPF_RET | BPF_K, 30),
  2962. BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 4, 1, 0),
  2963. BPF_STMT(BPF_RET | BPF_K, 40),
  2964. BPF_STMT(BPF_RET | BPF_K, MAX_K)
  2965. },
  2966. CLASSIC,
  2967. { 1, 2, 3, 4, 5 },
  2968. { { 1, 20 }, { 3, 40 }, { 5, MAX_K } },
  2969. },
  2970. {
  2971. "JSET",
  2972. .u.insns = {
  2973. BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
  2974. BPF_JUMP(BPF_JMP | BPF_JA, 1, 1, 1),
  2975. BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
  2976. BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
  2977. BPF_STMT(BPF_LDX | BPF_LEN, 0),
  2978. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  2979. BPF_STMT(BPF_ALU | BPF_SUB | BPF_K, 4),
  2980. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  2981. BPF_STMT(BPF_LD | BPF_W | BPF_IND, 0),
  2982. BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 1, 0, 1),
  2983. BPF_STMT(BPF_RET | BPF_K, 10),
  2984. BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x80000000, 0, 1),
  2985. BPF_STMT(BPF_RET | BPF_K, 20),
  2986. BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
  2987. BPF_STMT(BPF_RET | BPF_K, 30),
  2988. BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
  2989. BPF_STMT(BPF_RET | BPF_K, 30),
  2990. BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
  2991. BPF_STMT(BPF_RET | BPF_K, 30),
  2992. BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
  2993. BPF_STMT(BPF_RET | BPF_K, 30),
  2994. BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
  2995. BPF_STMT(BPF_RET | BPF_K, 30),
  2996. BPF_STMT(BPF_RET | BPF_K, MAX_K)
  2997. },
  2998. CLASSIC,
  2999. { 0, 0xAA, 0x55, 1 },
  3000. { { 4, 10 }, { 5, 20 }, { 6, MAX_K } },
  3001. },
  3002. {
  3003. "tcpdump port 22",
  3004. .u.insns = {
  3005. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 12),
  3006. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x86dd, 0, 8), /* IPv6 */
  3007. BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 20),
  3008. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x84, 2, 0),
  3009. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 1, 0),
  3010. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x11, 0, 17),
  3011. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 54),
  3012. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 14, 0),
  3013. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 56),
  3014. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 12, 13),
  3015. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x0800, 0, 12), /* IPv4 */
  3016. BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 23),
  3017. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x84, 2, 0),
  3018. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 1, 0),
  3019. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x11, 0, 8),
  3020. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 20),
  3021. BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x1fff, 6, 0),
  3022. BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
  3023. BPF_STMT(BPF_LD | BPF_H | BPF_IND, 14),
  3024. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 2, 0),
  3025. BPF_STMT(BPF_LD | BPF_H | BPF_IND, 16),
  3026. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 0, 1),
  3027. BPF_STMT(BPF_RET | BPF_K, 0xffff),
  3028. BPF_STMT(BPF_RET | BPF_K, 0),
  3029. },
  3030. CLASSIC,
  3031. /* 3c:07:54:43:e5:76 > 10:bf:48:d6:43:d6, ethertype IPv4(0x0800)
  3032. * length 114: 10.1.1.149.49700 > 10.1.2.10.22: Flags [P.],
  3033. * seq 1305692979:1305693027, ack 3650467037, win 65535,
  3034. * options [nop,nop,TS val 2502645400 ecr 3971138], length 48
  3035. */
  3036. { 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6,
  3037. 0x3c, 0x07, 0x54, 0x43, 0xe5, 0x76,
  3038. 0x08, 0x00,
  3039. 0x45, 0x10, 0x00, 0x64, 0x75, 0xb5,
  3040. 0x40, 0x00, 0x40, 0x06, 0xad, 0x2e, /* IP header */
  3041. 0x0a, 0x01, 0x01, 0x95, /* ip src */
  3042. 0x0a, 0x01, 0x02, 0x0a, /* ip dst */
  3043. 0xc2, 0x24,
  3044. 0x00, 0x16 /* dst port */ },
  3045. { { 10, 0 }, { 30, 0 }, { 100, 65535 } },
  3046. },
  3047. {
  3048. "tcpdump complex",
  3049. .u.insns = {
  3050. /* tcpdump -nei eth0 'tcp port 22 and (((ip[2:2] -
  3051. * ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0) and
  3052. * (len > 115 or len < 30000000000)' -d
  3053. */
  3054. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 12),
  3055. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x86dd, 30, 0),
  3056. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x800, 0, 29),
  3057. BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 23),
  3058. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 0, 27),
  3059. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 20),
  3060. BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x1fff, 25, 0),
  3061. BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
  3062. BPF_STMT(BPF_LD | BPF_H | BPF_IND, 14),
  3063. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 2, 0),
  3064. BPF_STMT(BPF_LD | BPF_H | BPF_IND, 16),
  3065. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 0, 20),
  3066. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 16),
  3067. BPF_STMT(BPF_ST, 1),
  3068. BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 14),
  3069. BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf),
  3070. BPF_STMT(BPF_ALU | BPF_LSH | BPF_K, 2),
  3071. BPF_STMT(BPF_MISC | BPF_TAX, 0x5), /* libpcap emits K on TAX */
  3072. BPF_STMT(BPF_LD | BPF_MEM, 1),
  3073. BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
  3074. BPF_STMT(BPF_ST, 5),
  3075. BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
  3076. BPF_STMT(BPF_LD | BPF_B | BPF_IND, 26),
  3077. BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf0),
  3078. BPF_STMT(BPF_ALU | BPF_RSH | BPF_K, 2),
  3079. BPF_STMT(BPF_MISC | BPF_TAX, 0x9), /* libpcap emits K on TAX */
  3080. BPF_STMT(BPF_LD | BPF_MEM, 5),
  3081. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0, 4, 0),
  3082. BPF_STMT(BPF_LD | BPF_LEN, 0),
  3083. BPF_JUMP(BPF_JMP | BPF_JGT | BPF_K, 0x73, 1, 0),
  3084. BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 0xfc23ac00, 1, 0),
  3085. BPF_STMT(BPF_RET | BPF_K, 0xffff),
  3086. BPF_STMT(BPF_RET | BPF_K, 0),
  3087. },
  3088. CLASSIC,
  3089. { 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6,
  3090. 0x3c, 0x07, 0x54, 0x43, 0xe5, 0x76,
  3091. 0x08, 0x00,
  3092. 0x45, 0x10, 0x00, 0x64, 0x75, 0xb5,
  3093. 0x40, 0x00, 0x40, 0x06, 0xad, 0x2e, /* IP header */
  3094. 0x0a, 0x01, 0x01, 0x95, /* ip src */
  3095. 0x0a, 0x01, 0x02, 0x0a, /* ip dst */
  3096. 0xc2, 0x24,
  3097. 0x00, 0x16 /* dst port */ },
  3098. { { 10, 0 }, { 30, 0 }, { 100, 65535 } },
  3099. },
  3100. {
  3101. "RET_A",
  3102. .u.insns = {
  3103. /* check that uninitialized X and A contain zeros */
  3104. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  3105. BPF_STMT(BPF_RET | BPF_A, 0)
  3106. },
  3107. CLASSIC,
  3108. { },
  3109. { {1, 0}, {2, 0} },
  3110. },
  3111. {
  3112. "INT: ADD trivial",
  3113. .u.insns_int = {
  3114. BPF_ALU64_IMM(BPF_MOV, R1, 1),
  3115. BPF_ALU64_IMM(BPF_ADD, R1, 2),
  3116. BPF_ALU64_IMM(BPF_MOV, R2, 3),
  3117. BPF_ALU64_REG(BPF_SUB, R1, R2),
  3118. BPF_ALU64_IMM(BPF_ADD, R1, -1),
  3119. BPF_ALU64_IMM(BPF_MUL, R1, 3),
  3120. BPF_ALU64_REG(BPF_MOV, R0, R1),
  3121. BPF_EXIT_INSN(),
  3122. },
  3123. INTERNAL,
  3124. { },
  3125. { { 0, 0xfffffffd } }
  3126. },
  3127. {
  3128. "INT: MUL_X",
  3129. .u.insns_int = {
  3130. BPF_ALU64_IMM(BPF_MOV, R0, -1),
  3131. BPF_ALU64_IMM(BPF_MOV, R1, -1),
  3132. BPF_ALU64_IMM(BPF_MOV, R2, 3),
  3133. BPF_ALU64_REG(BPF_MUL, R1, R2),
  3134. BPF_JMP_IMM(BPF_JEQ, R1, 0xfffffffd, 1),
  3135. BPF_EXIT_INSN(),
  3136. BPF_ALU64_IMM(BPF_MOV, R0, 1),
  3137. BPF_EXIT_INSN(),
  3138. },
  3139. INTERNAL,
  3140. { },
  3141. { { 0, 1 } }
  3142. },
  3143. {
  3144. "INT: MUL_X2",
  3145. .u.insns_int = {
  3146. BPF_ALU32_IMM(BPF_MOV, R0, -1),
  3147. BPF_ALU32_IMM(BPF_MOV, R1, -1),
  3148. BPF_ALU32_IMM(BPF_MOV, R2, 3),
  3149. BPF_ALU64_REG(BPF_MUL, R1, R2),
  3150. BPF_ALU64_IMM(BPF_RSH, R1, 8),
  3151. BPF_JMP_IMM(BPF_JEQ, R1, 0x2ffffff, 1),
  3152. BPF_EXIT_INSN(),
  3153. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  3154. BPF_EXIT_INSN(),
  3155. },
  3156. INTERNAL,
  3157. { },
  3158. { { 0, 1 } }
  3159. },
  3160. {
  3161. "INT: MUL32_X",
  3162. .u.insns_int = {
  3163. BPF_ALU32_IMM(BPF_MOV, R0, -1),
  3164. BPF_ALU64_IMM(BPF_MOV, R1, -1),
  3165. BPF_ALU32_IMM(BPF_MOV, R2, 3),
  3166. BPF_ALU32_REG(BPF_MUL, R1, R2),
  3167. BPF_ALU64_IMM(BPF_RSH, R1, 8),
  3168. BPF_JMP_IMM(BPF_JEQ, R1, 0xffffff, 1),
  3169. BPF_EXIT_INSN(),
  3170. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  3171. BPF_EXIT_INSN(),
  3172. },
  3173. INTERNAL,
  3174. { },
  3175. { { 0, 1 } }
  3176. },
  3177. {
  3178. /* Have to test all register combinations, since
  3179. * JITing of different registers will produce
  3180. * different asm code.
  3181. */
  3182. "INT: ADD 64-bit",
  3183. .u.insns_int = {
  3184. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  3185. BPF_ALU64_IMM(BPF_MOV, R1, 1),
  3186. BPF_ALU64_IMM(BPF_MOV, R2, 2),
  3187. BPF_ALU64_IMM(BPF_MOV, R3, 3),
  3188. BPF_ALU64_IMM(BPF_MOV, R4, 4),
  3189. BPF_ALU64_IMM(BPF_MOV, R5, 5),
  3190. BPF_ALU64_IMM(BPF_MOV, R6, 6),
  3191. BPF_ALU64_IMM(BPF_MOV, R7, 7),
  3192. BPF_ALU64_IMM(BPF_MOV, R8, 8),
  3193. BPF_ALU64_IMM(BPF_MOV, R9, 9),
  3194. BPF_ALU64_IMM(BPF_ADD, R0, 20),
  3195. BPF_ALU64_IMM(BPF_ADD, R1, 20),
  3196. BPF_ALU64_IMM(BPF_ADD, R2, 20),
  3197. BPF_ALU64_IMM(BPF_ADD, R3, 20),
  3198. BPF_ALU64_IMM(BPF_ADD, R4, 20),
  3199. BPF_ALU64_IMM(BPF_ADD, R5, 20),
  3200. BPF_ALU64_IMM(BPF_ADD, R6, 20),
  3201. BPF_ALU64_IMM(BPF_ADD, R7, 20),
  3202. BPF_ALU64_IMM(BPF_ADD, R8, 20),
  3203. BPF_ALU64_IMM(BPF_ADD, R9, 20),
  3204. BPF_ALU64_IMM(BPF_SUB, R0, 10),
  3205. BPF_ALU64_IMM(BPF_SUB, R1, 10),
  3206. BPF_ALU64_IMM(BPF_SUB, R2, 10),
  3207. BPF_ALU64_IMM(BPF_SUB, R3, 10),
  3208. BPF_ALU64_IMM(BPF_SUB, R4, 10),
  3209. BPF_ALU64_IMM(BPF_SUB, R5, 10),
  3210. BPF_ALU64_IMM(BPF_SUB, R6, 10),
  3211. BPF_ALU64_IMM(BPF_SUB, R7, 10),
  3212. BPF_ALU64_IMM(BPF_SUB, R8, 10),
  3213. BPF_ALU64_IMM(BPF_SUB, R9, 10),
  3214. BPF_ALU64_REG(BPF_ADD, R0, R0),
  3215. BPF_ALU64_REG(BPF_ADD, R0, R1),
  3216. BPF_ALU64_REG(BPF_ADD, R0, R2),
  3217. BPF_ALU64_REG(BPF_ADD, R0, R3),
  3218. BPF_ALU64_REG(BPF_ADD, R0, R4),
  3219. BPF_ALU64_REG(BPF_ADD, R0, R5),
  3220. BPF_ALU64_REG(BPF_ADD, R0, R6),
  3221. BPF_ALU64_REG(BPF_ADD, R0, R7),
  3222. BPF_ALU64_REG(BPF_ADD, R0, R8),
  3223. BPF_ALU64_REG(BPF_ADD, R0, R9), /* R0 == 155 */
  3224. BPF_JMP_IMM(BPF_JEQ, R0, 155, 1),
  3225. BPF_EXIT_INSN(),
  3226. BPF_ALU64_REG(BPF_ADD, R1, R0),
  3227. BPF_ALU64_REG(BPF_ADD, R1, R1),
  3228. BPF_ALU64_REG(BPF_ADD, R1, R2),
  3229. BPF_ALU64_REG(BPF_ADD, R1, R3),
  3230. BPF_ALU64_REG(BPF_ADD, R1, R4),
  3231. BPF_ALU64_REG(BPF_ADD, R1, R5),
  3232. BPF_ALU64_REG(BPF_ADD, R1, R6),
  3233. BPF_ALU64_REG(BPF_ADD, R1, R7),
  3234. BPF_ALU64_REG(BPF_ADD, R1, R8),
  3235. BPF_ALU64_REG(BPF_ADD, R1, R9), /* R1 == 456 */
  3236. BPF_JMP_IMM(BPF_JEQ, R1, 456, 1),
  3237. BPF_EXIT_INSN(),
  3238. BPF_ALU64_REG(BPF_ADD, R2, R0),
  3239. BPF_ALU64_REG(BPF_ADD, R2, R1),
  3240. BPF_ALU64_REG(BPF_ADD, R2, R2),
  3241. BPF_ALU64_REG(BPF_ADD, R2, R3),
  3242. BPF_ALU64_REG(BPF_ADD, R2, R4),
  3243. BPF_ALU64_REG(BPF_ADD, R2, R5),
  3244. BPF_ALU64_REG(BPF_ADD, R2, R6),
  3245. BPF_ALU64_REG(BPF_ADD, R2, R7),
  3246. BPF_ALU64_REG(BPF_ADD, R2, R8),
  3247. BPF_ALU64_REG(BPF_ADD, R2, R9), /* R2 == 1358 */
  3248. BPF_JMP_IMM(BPF_JEQ, R2, 1358, 1),
  3249. BPF_EXIT_INSN(),
  3250. BPF_ALU64_REG(BPF_ADD, R3, R0),
  3251. BPF_ALU64_REG(BPF_ADD, R3, R1),
  3252. BPF_ALU64_REG(BPF_ADD, R3, R2),
  3253. BPF_ALU64_REG(BPF_ADD, R3, R3),
  3254. BPF_ALU64_REG(BPF_ADD, R3, R4),
  3255. BPF_ALU64_REG(BPF_ADD, R3, R5),
  3256. BPF_ALU64_REG(BPF_ADD, R3, R6),
  3257. BPF_ALU64_REG(BPF_ADD, R3, R7),
  3258. BPF_ALU64_REG(BPF_ADD, R3, R8),
  3259. BPF_ALU64_REG(BPF_ADD, R3, R9), /* R3 == 4063 */
  3260. BPF_JMP_IMM(BPF_JEQ, R3, 4063, 1),
  3261. BPF_EXIT_INSN(),
  3262. BPF_ALU64_REG(BPF_ADD, R4, R0),
  3263. BPF_ALU64_REG(BPF_ADD, R4, R1),
  3264. BPF_ALU64_REG(BPF_ADD, R4, R2),
  3265. BPF_ALU64_REG(BPF_ADD, R4, R3),
  3266. BPF_ALU64_REG(BPF_ADD, R4, R4),
  3267. BPF_ALU64_REG(BPF_ADD, R4, R5),
  3268. BPF_ALU64_REG(BPF_ADD, R4, R6),
  3269. BPF_ALU64_REG(BPF_ADD, R4, R7),
  3270. BPF_ALU64_REG(BPF_ADD, R4, R8),
  3271. BPF_ALU64_REG(BPF_ADD, R4, R9), /* R4 == 12177 */
  3272. BPF_JMP_IMM(BPF_JEQ, R4, 12177, 1),
  3273. BPF_EXIT_INSN(),
  3274. BPF_ALU64_REG(BPF_ADD, R5, R0),
  3275. BPF_ALU64_REG(BPF_ADD, R5, R1),
  3276. BPF_ALU64_REG(BPF_ADD, R5, R2),
  3277. BPF_ALU64_REG(BPF_ADD, R5, R3),
  3278. BPF_ALU64_REG(BPF_ADD, R5, R4),
  3279. BPF_ALU64_REG(BPF_ADD, R5, R5),
  3280. BPF_ALU64_REG(BPF_ADD, R5, R6),
  3281. BPF_ALU64_REG(BPF_ADD, R5, R7),
  3282. BPF_ALU64_REG(BPF_ADD, R5, R8),
  3283. BPF_ALU64_REG(BPF_ADD, R5, R9), /* R5 == 36518 */
  3284. BPF_JMP_IMM(BPF_JEQ, R5, 36518, 1),
  3285. BPF_EXIT_INSN(),
  3286. BPF_ALU64_REG(BPF_ADD, R6, R0),
  3287. BPF_ALU64_REG(BPF_ADD, R6, R1),
  3288. BPF_ALU64_REG(BPF_ADD, R6, R2),
  3289. BPF_ALU64_REG(BPF_ADD, R6, R3),
  3290. BPF_ALU64_REG(BPF_ADD, R6, R4),
  3291. BPF_ALU64_REG(BPF_ADD, R6, R5),
  3292. BPF_ALU64_REG(BPF_ADD, R6, R6),
  3293. BPF_ALU64_REG(BPF_ADD, R6, R7),
  3294. BPF_ALU64_REG(BPF_ADD, R6, R8),
  3295. BPF_ALU64_REG(BPF_ADD, R6, R9), /* R6 == 109540 */
  3296. BPF_JMP_IMM(BPF_JEQ, R6, 109540, 1),
  3297. BPF_EXIT_INSN(),
  3298. BPF_ALU64_REG(BPF_ADD, R7, R0),
  3299. BPF_ALU64_REG(BPF_ADD, R7, R1),
  3300. BPF_ALU64_REG(BPF_ADD, R7, R2),
  3301. BPF_ALU64_REG(BPF_ADD, R7, R3),
  3302. BPF_ALU64_REG(BPF_ADD, R7, R4),
  3303. BPF_ALU64_REG(BPF_ADD, R7, R5),
  3304. BPF_ALU64_REG(BPF_ADD, R7, R6),
  3305. BPF_ALU64_REG(BPF_ADD, R7, R7),
  3306. BPF_ALU64_REG(BPF_ADD, R7, R8),
  3307. BPF_ALU64_REG(BPF_ADD, R7, R9), /* R7 == 328605 */
  3308. BPF_JMP_IMM(BPF_JEQ, R7, 328605, 1),
  3309. BPF_EXIT_INSN(),
  3310. BPF_ALU64_REG(BPF_ADD, R8, R0),
  3311. BPF_ALU64_REG(BPF_ADD, R8, R1),
  3312. BPF_ALU64_REG(BPF_ADD, R8, R2),
  3313. BPF_ALU64_REG(BPF_ADD, R8, R3),
  3314. BPF_ALU64_REG(BPF_ADD, R8, R4),
  3315. BPF_ALU64_REG(BPF_ADD, R8, R5),
  3316. BPF_ALU64_REG(BPF_ADD, R8, R6),
  3317. BPF_ALU64_REG(BPF_ADD, R8, R7),
  3318. BPF_ALU64_REG(BPF_ADD, R8, R8),
  3319. BPF_ALU64_REG(BPF_ADD, R8, R9), /* R8 == 985799 */
  3320. BPF_JMP_IMM(BPF_JEQ, R8, 985799, 1),
  3321. BPF_EXIT_INSN(),
  3322. BPF_ALU64_REG(BPF_ADD, R9, R0),
  3323. BPF_ALU64_REG(BPF_ADD, R9, R1),
  3324. BPF_ALU64_REG(BPF_ADD, R9, R2),
  3325. BPF_ALU64_REG(BPF_ADD, R9, R3),
  3326. BPF_ALU64_REG(BPF_ADD, R9, R4),
  3327. BPF_ALU64_REG(BPF_ADD, R9, R5),
  3328. BPF_ALU64_REG(BPF_ADD, R9, R6),
  3329. BPF_ALU64_REG(BPF_ADD, R9, R7),
  3330. BPF_ALU64_REG(BPF_ADD, R9, R8),
  3331. BPF_ALU64_REG(BPF_ADD, R9, R9), /* R9 == 2957380 */
  3332. BPF_ALU64_REG(BPF_MOV, R0, R9),
  3333. BPF_EXIT_INSN(),
  3334. },
  3335. INTERNAL,
  3336. { },
  3337. { { 0, 2957380 } }
  3338. },
  3339. {
  3340. "INT: ADD 32-bit",
  3341. .u.insns_int = {
  3342. BPF_ALU32_IMM(BPF_MOV, R0, 20),
  3343. BPF_ALU32_IMM(BPF_MOV, R1, 1),
  3344. BPF_ALU32_IMM(BPF_MOV, R2, 2),
  3345. BPF_ALU32_IMM(BPF_MOV, R3, 3),
  3346. BPF_ALU32_IMM(BPF_MOV, R4, 4),
  3347. BPF_ALU32_IMM(BPF_MOV, R5, 5),
  3348. BPF_ALU32_IMM(BPF_MOV, R6, 6),
  3349. BPF_ALU32_IMM(BPF_MOV, R7, 7),
  3350. BPF_ALU32_IMM(BPF_MOV, R8, 8),
  3351. BPF_ALU32_IMM(BPF_MOV, R9, 9),
  3352. BPF_ALU64_IMM(BPF_ADD, R1, 10),
  3353. BPF_ALU64_IMM(BPF_ADD, R2, 10),
  3354. BPF_ALU64_IMM(BPF_ADD, R3, 10),
  3355. BPF_ALU64_IMM(BPF_ADD, R4, 10),
  3356. BPF_ALU64_IMM(BPF_ADD, R5, 10),
  3357. BPF_ALU64_IMM(BPF_ADD, R6, 10),
  3358. BPF_ALU64_IMM(BPF_ADD, R7, 10),
  3359. BPF_ALU64_IMM(BPF_ADD, R8, 10),
  3360. BPF_ALU64_IMM(BPF_ADD, R9, 10),
  3361. BPF_ALU32_REG(BPF_ADD, R0, R1),
  3362. BPF_ALU32_REG(BPF_ADD, R0, R2),
  3363. BPF_ALU32_REG(BPF_ADD, R0, R3),
  3364. BPF_ALU32_REG(BPF_ADD, R0, R4),
  3365. BPF_ALU32_REG(BPF_ADD, R0, R5),
  3366. BPF_ALU32_REG(BPF_ADD, R0, R6),
  3367. BPF_ALU32_REG(BPF_ADD, R0, R7),
  3368. BPF_ALU32_REG(BPF_ADD, R0, R8),
  3369. BPF_ALU32_REG(BPF_ADD, R0, R9), /* R0 == 155 */
  3370. BPF_JMP_IMM(BPF_JEQ, R0, 155, 1),
  3371. BPF_EXIT_INSN(),
  3372. BPF_ALU32_REG(BPF_ADD, R1, R0),
  3373. BPF_ALU32_REG(BPF_ADD, R1, R1),
  3374. BPF_ALU32_REG(BPF_ADD, R1, R2),
  3375. BPF_ALU32_REG(BPF_ADD, R1, R3),
  3376. BPF_ALU32_REG(BPF_ADD, R1, R4),
  3377. BPF_ALU32_REG(BPF_ADD, R1, R5),
  3378. BPF_ALU32_REG(BPF_ADD, R1, R6),
  3379. BPF_ALU32_REG(BPF_ADD, R1, R7),
  3380. BPF_ALU32_REG(BPF_ADD, R1, R8),
  3381. BPF_ALU32_REG(BPF_ADD, R1, R9), /* R1 == 456 */
  3382. BPF_JMP_IMM(BPF_JEQ, R1, 456, 1),
  3383. BPF_EXIT_INSN(),
  3384. BPF_ALU32_REG(BPF_ADD, R2, R0),
  3385. BPF_ALU32_REG(BPF_ADD, R2, R1),
  3386. BPF_ALU32_REG(BPF_ADD, R2, R2),
  3387. BPF_ALU32_REG(BPF_ADD, R2, R3),
  3388. BPF_ALU32_REG(BPF_ADD, R2, R4),
  3389. BPF_ALU32_REG(BPF_ADD, R2, R5),
  3390. BPF_ALU32_REG(BPF_ADD, R2, R6),
  3391. BPF_ALU32_REG(BPF_ADD, R2, R7),
  3392. BPF_ALU32_REG(BPF_ADD, R2, R8),
  3393. BPF_ALU32_REG(BPF_ADD, R2, R9), /* R2 == 1358 */
  3394. BPF_JMP_IMM(BPF_JEQ, R2, 1358, 1),
  3395. BPF_EXIT_INSN(),
  3396. BPF_ALU32_REG(BPF_ADD, R3, R0),
  3397. BPF_ALU32_REG(BPF_ADD, R3, R1),
  3398. BPF_ALU32_REG(BPF_ADD, R3, R2),
  3399. BPF_ALU32_REG(BPF_ADD, R3, R3),
  3400. BPF_ALU32_REG(BPF_ADD, R3, R4),
  3401. BPF_ALU32_REG(BPF_ADD, R3, R5),
  3402. BPF_ALU32_REG(BPF_ADD, R3, R6),
  3403. BPF_ALU32_REG(BPF_ADD, R3, R7),
  3404. BPF_ALU32_REG(BPF_ADD, R3, R8),
  3405. BPF_ALU32_REG(BPF_ADD, R3, R9), /* R3 == 4063 */
  3406. BPF_JMP_IMM(BPF_JEQ, R3, 4063, 1),
  3407. BPF_EXIT_INSN(),
  3408. BPF_ALU32_REG(BPF_ADD, R4, R0),
  3409. BPF_ALU32_REG(BPF_ADD, R4, R1),
  3410. BPF_ALU32_REG(BPF_ADD, R4, R2),
  3411. BPF_ALU32_REG(BPF_ADD, R4, R3),
  3412. BPF_ALU32_REG(BPF_ADD, R4, R4),
  3413. BPF_ALU32_REG(BPF_ADD, R4, R5),
  3414. BPF_ALU32_REG(BPF_ADD, R4, R6),
  3415. BPF_ALU32_REG(BPF_ADD, R4, R7),
  3416. BPF_ALU32_REG(BPF_ADD, R4, R8),
  3417. BPF_ALU32_REG(BPF_ADD, R4, R9), /* R4 == 12177 */
  3418. BPF_JMP_IMM(BPF_JEQ, R4, 12177, 1),
  3419. BPF_EXIT_INSN(),
  3420. BPF_ALU32_REG(BPF_ADD, R5, R0),
  3421. BPF_ALU32_REG(BPF_ADD, R5, R1),
  3422. BPF_ALU32_REG(BPF_ADD, R5, R2),
  3423. BPF_ALU32_REG(BPF_ADD, R5, R3),
  3424. BPF_ALU32_REG(BPF_ADD, R5, R4),
  3425. BPF_ALU32_REG(BPF_ADD, R5, R5),
  3426. BPF_ALU32_REG(BPF_ADD, R5, R6),
  3427. BPF_ALU32_REG(BPF_ADD, R5, R7),
  3428. BPF_ALU32_REG(BPF_ADD, R5, R8),
  3429. BPF_ALU32_REG(BPF_ADD, R5, R9), /* R5 == 36518 */
  3430. BPF_JMP_IMM(BPF_JEQ, R5, 36518, 1),
  3431. BPF_EXIT_INSN(),
  3432. BPF_ALU32_REG(BPF_ADD, R6, R0),
  3433. BPF_ALU32_REG(BPF_ADD, R6, R1),
  3434. BPF_ALU32_REG(BPF_ADD, R6, R2),
  3435. BPF_ALU32_REG(BPF_ADD, R6, R3),
  3436. BPF_ALU32_REG(BPF_ADD, R6, R4),
  3437. BPF_ALU32_REG(BPF_ADD, R6, R5),
  3438. BPF_ALU32_REG(BPF_ADD, R6, R6),
  3439. BPF_ALU32_REG(BPF_ADD, R6, R7),
  3440. BPF_ALU32_REG(BPF_ADD, R6, R8),
  3441. BPF_ALU32_REG(BPF_ADD, R6, R9), /* R6 == 109540 */
  3442. BPF_JMP_IMM(BPF_JEQ, R6, 109540, 1),
  3443. BPF_EXIT_INSN(),
  3444. BPF_ALU32_REG(BPF_ADD, R7, R0),
  3445. BPF_ALU32_REG(BPF_ADD, R7, R1),
  3446. BPF_ALU32_REG(BPF_ADD, R7, R2),
  3447. BPF_ALU32_REG(BPF_ADD, R7, R3),
  3448. BPF_ALU32_REG(BPF_ADD, R7, R4),
  3449. BPF_ALU32_REG(BPF_ADD, R7, R5),
  3450. BPF_ALU32_REG(BPF_ADD, R7, R6),
  3451. BPF_ALU32_REG(BPF_ADD, R7, R7),
  3452. BPF_ALU32_REG(BPF_ADD, R7, R8),
  3453. BPF_ALU32_REG(BPF_ADD, R7, R9), /* R7 == 328605 */
  3454. BPF_JMP_IMM(BPF_JEQ, R7, 328605, 1),
  3455. BPF_EXIT_INSN(),
  3456. BPF_ALU32_REG(BPF_ADD, R8, R0),
  3457. BPF_ALU32_REG(BPF_ADD, R8, R1),
  3458. BPF_ALU32_REG(BPF_ADD, R8, R2),
  3459. BPF_ALU32_REG(BPF_ADD, R8, R3),
  3460. BPF_ALU32_REG(BPF_ADD, R8, R4),
  3461. BPF_ALU32_REG(BPF_ADD, R8, R5),
  3462. BPF_ALU32_REG(BPF_ADD, R8, R6),
  3463. BPF_ALU32_REG(BPF_ADD, R8, R7),
  3464. BPF_ALU32_REG(BPF_ADD, R8, R8),
  3465. BPF_ALU32_REG(BPF_ADD, R8, R9), /* R8 == 985799 */
  3466. BPF_JMP_IMM(BPF_JEQ, R8, 985799, 1),
  3467. BPF_EXIT_INSN(),
  3468. BPF_ALU32_REG(BPF_ADD, R9, R0),
  3469. BPF_ALU32_REG(BPF_ADD, R9, R1),
  3470. BPF_ALU32_REG(BPF_ADD, R9, R2),
  3471. BPF_ALU32_REG(BPF_ADD, R9, R3),
  3472. BPF_ALU32_REG(BPF_ADD, R9, R4),
  3473. BPF_ALU32_REG(BPF_ADD, R9, R5),
  3474. BPF_ALU32_REG(BPF_ADD, R9, R6),
  3475. BPF_ALU32_REG(BPF_ADD, R9, R7),
  3476. BPF_ALU32_REG(BPF_ADD, R9, R8),
  3477. BPF_ALU32_REG(BPF_ADD, R9, R9), /* R9 == 2957380 */
  3478. BPF_ALU32_REG(BPF_MOV, R0, R9),
  3479. BPF_EXIT_INSN(),
  3480. },
  3481. INTERNAL,
  3482. { },
  3483. { { 0, 2957380 } }
  3484. },
  3485. { /* Mainly checking JIT here. */
  3486. "INT: SUB",
  3487. .u.insns_int = {
  3488. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  3489. BPF_ALU64_IMM(BPF_MOV, R1, 1),
  3490. BPF_ALU64_IMM(BPF_MOV, R2, 2),
  3491. BPF_ALU64_IMM(BPF_MOV, R3, 3),
  3492. BPF_ALU64_IMM(BPF_MOV, R4, 4),
  3493. BPF_ALU64_IMM(BPF_MOV, R5, 5),
  3494. BPF_ALU64_IMM(BPF_MOV, R6, 6),
  3495. BPF_ALU64_IMM(BPF_MOV, R7, 7),
  3496. BPF_ALU64_IMM(BPF_MOV, R8, 8),
  3497. BPF_ALU64_IMM(BPF_MOV, R9, 9),
  3498. BPF_ALU64_REG(BPF_SUB, R0, R0),
  3499. BPF_ALU64_REG(BPF_SUB, R0, R1),
  3500. BPF_ALU64_REG(BPF_SUB, R0, R2),
  3501. BPF_ALU64_REG(BPF_SUB, R0, R3),
  3502. BPF_ALU64_REG(BPF_SUB, R0, R4),
  3503. BPF_ALU64_REG(BPF_SUB, R0, R5),
  3504. BPF_ALU64_REG(BPF_SUB, R0, R6),
  3505. BPF_ALU64_REG(BPF_SUB, R0, R7),
  3506. BPF_ALU64_REG(BPF_SUB, R0, R8),
  3507. BPF_ALU64_REG(BPF_SUB, R0, R9),
  3508. BPF_ALU64_IMM(BPF_SUB, R0, 10),
  3509. BPF_JMP_IMM(BPF_JEQ, R0, -55, 1),
  3510. BPF_EXIT_INSN(),
  3511. BPF_ALU64_REG(BPF_SUB, R1, R0),
  3512. BPF_ALU64_REG(BPF_SUB, R1, R2),
  3513. BPF_ALU64_REG(BPF_SUB, R1, R3),
  3514. BPF_ALU64_REG(BPF_SUB, R1, R4),
  3515. BPF_ALU64_REG(BPF_SUB, R1, R5),
  3516. BPF_ALU64_REG(BPF_SUB, R1, R6),
  3517. BPF_ALU64_REG(BPF_SUB, R1, R7),
  3518. BPF_ALU64_REG(BPF_SUB, R1, R8),
  3519. BPF_ALU64_REG(BPF_SUB, R1, R9),
  3520. BPF_ALU64_IMM(BPF_SUB, R1, 10),
  3521. BPF_ALU64_REG(BPF_SUB, R2, R0),
  3522. BPF_ALU64_REG(BPF_SUB, R2, R1),
  3523. BPF_ALU64_REG(BPF_SUB, R2, R3),
  3524. BPF_ALU64_REG(BPF_SUB, R2, R4),
  3525. BPF_ALU64_REG(BPF_SUB, R2, R5),
  3526. BPF_ALU64_REG(BPF_SUB, R2, R6),
  3527. BPF_ALU64_REG(BPF_SUB, R2, R7),
  3528. BPF_ALU64_REG(BPF_SUB, R2, R8),
  3529. BPF_ALU64_REG(BPF_SUB, R2, R9),
  3530. BPF_ALU64_IMM(BPF_SUB, R2, 10),
  3531. BPF_ALU64_REG(BPF_SUB, R3, R0),
  3532. BPF_ALU64_REG(BPF_SUB, R3, R1),
  3533. BPF_ALU64_REG(BPF_SUB, R3, R2),
  3534. BPF_ALU64_REG(BPF_SUB, R3, R4),
  3535. BPF_ALU64_REG(BPF_SUB, R3, R5),
  3536. BPF_ALU64_REG(BPF_SUB, R3, R6),
  3537. BPF_ALU64_REG(BPF_SUB, R3, R7),
  3538. BPF_ALU64_REG(BPF_SUB, R3, R8),
  3539. BPF_ALU64_REG(BPF_SUB, R3, R9),
  3540. BPF_ALU64_IMM(BPF_SUB, R3, 10),
  3541. BPF_ALU64_REG(BPF_SUB, R4, R0),
  3542. BPF_ALU64_REG(BPF_SUB, R4, R1),
  3543. BPF_ALU64_REG(BPF_SUB, R4, R2),
  3544. BPF_ALU64_REG(BPF_SUB, R4, R3),
  3545. BPF_ALU64_REG(BPF_SUB, R4, R5),
  3546. BPF_ALU64_REG(BPF_SUB, R4, R6),
  3547. BPF_ALU64_REG(BPF_SUB, R4, R7),
  3548. BPF_ALU64_REG(BPF_SUB, R4, R8),
  3549. BPF_ALU64_REG(BPF_SUB, R4, R9),
  3550. BPF_ALU64_IMM(BPF_SUB, R4, 10),
  3551. BPF_ALU64_REG(BPF_SUB, R5, R0),
  3552. BPF_ALU64_REG(BPF_SUB, R5, R1),
  3553. BPF_ALU64_REG(BPF_SUB, R5, R2),
  3554. BPF_ALU64_REG(BPF_SUB, R5, R3),
  3555. BPF_ALU64_REG(BPF_SUB, R5, R4),
  3556. BPF_ALU64_REG(BPF_SUB, R5, R6),
  3557. BPF_ALU64_REG(BPF_SUB, R5, R7),
  3558. BPF_ALU64_REG(BPF_SUB, R5, R8),
  3559. BPF_ALU64_REG(BPF_SUB, R5, R9),
  3560. BPF_ALU64_IMM(BPF_SUB, R5, 10),
  3561. BPF_ALU64_REG(BPF_SUB, R6, R0),
  3562. BPF_ALU64_REG(BPF_SUB, R6, R1),
  3563. BPF_ALU64_REG(BPF_SUB, R6, R2),
  3564. BPF_ALU64_REG(BPF_SUB, R6, R3),
  3565. BPF_ALU64_REG(BPF_SUB, R6, R4),
  3566. BPF_ALU64_REG(BPF_SUB, R6, R5),
  3567. BPF_ALU64_REG(BPF_SUB, R6, R7),
  3568. BPF_ALU64_REG(BPF_SUB, R6, R8),
  3569. BPF_ALU64_REG(BPF_SUB, R6, R9),
  3570. BPF_ALU64_IMM(BPF_SUB, R6, 10),
  3571. BPF_ALU64_REG(BPF_SUB, R7, R0),
  3572. BPF_ALU64_REG(BPF_SUB, R7, R1),
  3573. BPF_ALU64_REG(BPF_SUB, R7, R2),
  3574. BPF_ALU64_REG(BPF_SUB, R7, R3),
  3575. BPF_ALU64_REG(BPF_SUB, R7, R4),
  3576. BPF_ALU64_REG(BPF_SUB, R7, R5),
  3577. BPF_ALU64_REG(BPF_SUB, R7, R6),
  3578. BPF_ALU64_REG(BPF_SUB, R7, R8),
  3579. BPF_ALU64_REG(BPF_SUB, R7, R9),
  3580. BPF_ALU64_IMM(BPF_SUB, R7, 10),
  3581. BPF_ALU64_REG(BPF_SUB, R8, R0),
  3582. BPF_ALU64_REG(BPF_SUB, R8, R1),
  3583. BPF_ALU64_REG(BPF_SUB, R8, R2),
  3584. BPF_ALU64_REG(BPF_SUB, R8, R3),
  3585. BPF_ALU64_REG(BPF_SUB, R8, R4),
  3586. BPF_ALU64_REG(BPF_SUB, R8, R5),
  3587. BPF_ALU64_REG(BPF_SUB, R8, R6),
  3588. BPF_ALU64_REG(BPF_SUB, R8, R7),
  3589. BPF_ALU64_REG(BPF_SUB, R8, R9),
  3590. BPF_ALU64_IMM(BPF_SUB, R8, 10),
  3591. BPF_ALU64_REG(BPF_SUB, R9, R0),
  3592. BPF_ALU64_REG(BPF_SUB, R9, R1),
  3593. BPF_ALU64_REG(BPF_SUB, R9, R2),
  3594. BPF_ALU64_REG(BPF_SUB, R9, R3),
  3595. BPF_ALU64_REG(BPF_SUB, R9, R4),
  3596. BPF_ALU64_REG(BPF_SUB, R9, R5),
  3597. BPF_ALU64_REG(BPF_SUB, R9, R6),
  3598. BPF_ALU64_REG(BPF_SUB, R9, R7),
  3599. BPF_ALU64_REG(BPF_SUB, R9, R8),
  3600. BPF_ALU64_IMM(BPF_SUB, R9, 10),
  3601. BPF_ALU64_IMM(BPF_SUB, R0, 10),
  3602. BPF_ALU64_IMM(BPF_NEG, R0, 0),
  3603. BPF_ALU64_REG(BPF_SUB, R0, R1),
  3604. BPF_ALU64_REG(BPF_SUB, R0, R2),
  3605. BPF_ALU64_REG(BPF_SUB, R0, R3),
  3606. BPF_ALU64_REG(BPF_SUB, R0, R4),
  3607. BPF_ALU64_REG(BPF_SUB, R0, R5),
  3608. BPF_ALU64_REG(BPF_SUB, R0, R6),
  3609. BPF_ALU64_REG(BPF_SUB, R0, R7),
  3610. BPF_ALU64_REG(BPF_SUB, R0, R8),
  3611. BPF_ALU64_REG(BPF_SUB, R0, R9),
  3612. BPF_EXIT_INSN(),
  3613. },
  3614. INTERNAL,
  3615. { },
  3616. { { 0, 11 } }
  3617. },
  3618. { /* Mainly checking JIT here. */
  3619. "INT: XOR",
  3620. .u.insns_int = {
  3621. BPF_ALU64_REG(BPF_SUB, R0, R0),
  3622. BPF_ALU64_REG(BPF_XOR, R1, R1),
  3623. BPF_JMP_REG(BPF_JEQ, R0, R1, 1),
  3624. BPF_EXIT_INSN(),
  3625. BPF_ALU64_IMM(BPF_MOV, R0, 10),
  3626. BPF_ALU64_IMM(BPF_MOV, R1, -1),
  3627. BPF_ALU64_REG(BPF_SUB, R1, R1),
  3628. BPF_ALU64_REG(BPF_XOR, R2, R2),
  3629. BPF_JMP_REG(BPF_JEQ, R1, R2, 1),
  3630. BPF_EXIT_INSN(),
  3631. BPF_ALU64_REG(BPF_SUB, R2, R2),
  3632. BPF_ALU64_REG(BPF_XOR, R3, R3),
  3633. BPF_ALU64_IMM(BPF_MOV, R0, 10),
  3634. BPF_ALU64_IMM(BPF_MOV, R1, -1),
  3635. BPF_JMP_REG(BPF_JEQ, R2, R3, 1),
  3636. BPF_EXIT_INSN(),
  3637. BPF_ALU64_REG(BPF_SUB, R3, R3),
  3638. BPF_ALU64_REG(BPF_XOR, R4, R4),
  3639. BPF_ALU64_IMM(BPF_MOV, R2, 1),
  3640. BPF_ALU64_IMM(BPF_MOV, R5, -1),
  3641. BPF_JMP_REG(BPF_JEQ, R3, R4, 1),
  3642. BPF_EXIT_INSN(),
  3643. BPF_ALU64_REG(BPF_SUB, R4, R4),
  3644. BPF_ALU64_REG(BPF_XOR, R5, R5),
  3645. BPF_ALU64_IMM(BPF_MOV, R3, 1),
  3646. BPF_ALU64_IMM(BPF_MOV, R7, -1),
  3647. BPF_JMP_REG(BPF_JEQ, R5, R4, 1),
  3648. BPF_EXIT_INSN(),
  3649. BPF_ALU64_IMM(BPF_MOV, R5, 1),
  3650. BPF_ALU64_REG(BPF_SUB, R5, R5),
  3651. BPF_ALU64_REG(BPF_XOR, R6, R6),
  3652. BPF_ALU64_IMM(BPF_MOV, R1, 1),
  3653. BPF_ALU64_IMM(BPF_MOV, R8, -1),
  3654. BPF_JMP_REG(BPF_JEQ, R5, R6, 1),
  3655. BPF_EXIT_INSN(),
  3656. BPF_ALU64_REG(BPF_SUB, R6, R6),
  3657. BPF_ALU64_REG(BPF_XOR, R7, R7),
  3658. BPF_JMP_REG(BPF_JEQ, R7, R6, 1),
  3659. BPF_EXIT_INSN(),
  3660. BPF_ALU64_REG(BPF_SUB, R7, R7),
  3661. BPF_ALU64_REG(BPF_XOR, R8, R8),
  3662. BPF_JMP_REG(BPF_JEQ, R7, R8, 1),
  3663. BPF_EXIT_INSN(),
  3664. BPF_ALU64_REG(BPF_SUB, R8, R8),
  3665. BPF_ALU64_REG(BPF_XOR, R9, R9),
  3666. BPF_JMP_REG(BPF_JEQ, R9, R8, 1),
  3667. BPF_EXIT_INSN(),
  3668. BPF_ALU64_REG(BPF_SUB, R9, R9),
  3669. BPF_ALU64_REG(BPF_XOR, R0, R0),
  3670. BPF_JMP_REG(BPF_JEQ, R9, R0, 1),
  3671. BPF_EXIT_INSN(),
  3672. BPF_ALU64_REG(BPF_SUB, R1, R1),
  3673. BPF_ALU64_REG(BPF_XOR, R0, R0),
  3674. BPF_JMP_REG(BPF_JEQ, R9, R0, 2),
  3675. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  3676. BPF_EXIT_INSN(),
  3677. BPF_ALU64_IMM(BPF_MOV, R0, 1),
  3678. BPF_EXIT_INSN(),
  3679. },
  3680. INTERNAL,
  3681. { },
  3682. { { 0, 1 } }
  3683. },
  3684. { /* Mainly checking JIT here. */
  3685. "INT: MUL",
  3686. .u.insns_int = {
  3687. BPF_ALU64_IMM(BPF_MOV, R0, 11),
  3688. BPF_ALU64_IMM(BPF_MOV, R1, 1),
  3689. BPF_ALU64_IMM(BPF_MOV, R2, 2),
  3690. BPF_ALU64_IMM(BPF_MOV, R3, 3),
  3691. BPF_ALU64_IMM(BPF_MOV, R4, 4),
  3692. BPF_ALU64_IMM(BPF_MOV, R5, 5),
  3693. BPF_ALU64_IMM(BPF_MOV, R6, 6),
  3694. BPF_ALU64_IMM(BPF_MOV, R7, 7),
  3695. BPF_ALU64_IMM(BPF_MOV, R8, 8),
  3696. BPF_ALU64_IMM(BPF_MOV, R9, 9),
  3697. BPF_ALU64_REG(BPF_MUL, R0, R0),
  3698. BPF_ALU64_REG(BPF_MUL, R0, R1),
  3699. BPF_ALU64_REG(BPF_MUL, R0, R2),
  3700. BPF_ALU64_REG(BPF_MUL, R0, R3),
  3701. BPF_ALU64_REG(BPF_MUL, R0, R4),
  3702. BPF_ALU64_REG(BPF_MUL, R0, R5),
  3703. BPF_ALU64_REG(BPF_MUL, R0, R6),
  3704. BPF_ALU64_REG(BPF_MUL, R0, R7),
  3705. BPF_ALU64_REG(BPF_MUL, R0, R8),
  3706. BPF_ALU64_REG(BPF_MUL, R0, R9),
  3707. BPF_ALU64_IMM(BPF_MUL, R0, 10),
  3708. BPF_JMP_IMM(BPF_JEQ, R0, 439084800, 1),
  3709. BPF_EXIT_INSN(),
  3710. BPF_ALU64_REG(BPF_MUL, R1, R0),
  3711. BPF_ALU64_REG(BPF_MUL, R1, R2),
  3712. BPF_ALU64_REG(BPF_MUL, R1, R3),
  3713. BPF_ALU64_REG(BPF_MUL, R1, R4),
  3714. BPF_ALU64_REG(BPF_MUL, R1, R5),
  3715. BPF_ALU64_REG(BPF_MUL, R1, R6),
  3716. BPF_ALU64_REG(BPF_MUL, R1, R7),
  3717. BPF_ALU64_REG(BPF_MUL, R1, R8),
  3718. BPF_ALU64_REG(BPF_MUL, R1, R9),
  3719. BPF_ALU64_IMM(BPF_MUL, R1, 10),
  3720. BPF_ALU64_REG(BPF_MOV, R2, R1),
  3721. BPF_ALU64_IMM(BPF_RSH, R2, 32),
  3722. BPF_JMP_IMM(BPF_JEQ, R2, 0x5a924, 1),
  3723. BPF_EXIT_INSN(),
  3724. BPF_ALU64_IMM(BPF_LSH, R1, 32),
  3725. BPF_ALU64_IMM(BPF_ARSH, R1, 32),
  3726. BPF_JMP_IMM(BPF_JEQ, R1, 0xebb90000, 1),
  3727. BPF_EXIT_INSN(),
  3728. BPF_ALU64_REG(BPF_MUL, R2, R0),
  3729. BPF_ALU64_REG(BPF_MUL, R2, R1),
  3730. BPF_ALU64_REG(BPF_MUL, R2, R3),
  3731. BPF_ALU64_REG(BPF_MUL, R2, R4),
  3732. BPF_ALU64_REG(BPF_MUL, R2, R5),
  3733. BPF_ALU64_REG(BPF_MUL, R2, R6),
  3734. BPF_ALU64_REG(BPF_MUL, R2, R7),
  3735. BPF_ALU64_REG(BPF_MUL, R2, R8),
  3736. BPF_ALU64_REG(BPF_MUL, R2, R9),
  3737. BPF_ALU64_IMM(BPF_MUL, R2, 10),
  3738. BPF_ALU64_IMM(BPF_RSH, R2, 32),
  3739. BPF_ALU64_REG(BPF_MOV, R0, R2),
  3740. BPF_EXIT_INSN(),
  3741. },
  3742. INTERNAL,
  3743. { },
  3744. { { 0, 0x35d97ef2 } }
  3745. },
  3746. { /* Mainly checking JIT here. */
  3747. "MOV REG64",
  3748. .u.insns_int = {
  3749. BPF_LD_IMM64(R0, 0xffffffffffffffffLL),
  3750. BPF_MOV64_REG(R1, R0),
  3751. BPF_MOV64_REG(R2, R1),
  3752. BPF_MOV64_REG(R3, R2),
  3753. BPF_MOV64_REG(R4, R3),
  3754. BPF_MOV64_REG(R5, R4),
  3755. BPF_MOV64_REG(R6, R5),
  3756. BPF_MOV64_REG(R7, R6),
  3757. BPF_MOV64_REG(R8, R7),
  3758. BPF_MOV64_REG(R9, R8),
  3759. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  3760. BPF_ALU64_IMM(BPF_MOV, R1, 0),
  3761. BPF_ALU64_IMM(BPF_MOV, R2, 0),
  3762. BPF_ALU64_IMM(BPF_MOV, R3, 0),
  3763. BPF_ALU64_IMM(BPF_MOV, R4, 0),
  3764. BPF_ALU64_IMM(BPF_MOV, R5, 0),
  3765. BPF_ALU64_IMM(BPF_MOV, R6, 0),
  3766. BPF_ALU64_IMM(BPF_MOV, R7, 0),
  3767. BPF_ALU64_IMM(BPF_MOV, R8, 0),
  3768. BPF_ALU64_IMM(BPF_MOV, R9, 0),
  3769. BPF_ALU64_REG(BPF_ADD, R0, R0),
  3770. BPF_ALU64_REG(BPF_ADD, R0, R1),
  3771. BPF_ALU64_REG(BPF_ADD, R0, R2),
  3772. BPF_ALU64_REG(BPF_ADD, R0, R3),
  3773. BPF_ALU64_REG(BPF_ADD, R0, R4),
  3774. BPF_ALU64_REG(BPF_ADD, R0, R5),
  3775. BPF_ALU64_REG(BPF_ADD, R0, R6),
  3776. BPF_ALU64_REG(BPF_ADD, R0, R7),
  3777. BPF_ALU64_REG(BPF_ADD, R0, R8),
  3778. BPF_ALU64_REG(BPF_ADD, R0, R9),
  3779. BPF_ALU64_IMM(BPF_ADD, R0, 0xfefe),
  3780. BPF_EXIT_INSN(),
  3781. },
  3782. INTERNAL,
  3783. { },
  3784. { { 0, 0xfefe } }
  3785. },
  3786. { /* Mainly checking JIT here. */
  3787. "MOV REG32",
  3788. .u.insns_int = {
  3789. BPF_LD_IMM64(R0, 0xffffffffffffffffLL),
  3790. BPF_MOV64_REG(R1, R0),
  3791. BPF_MOV64_REG(R2, R1),
  3792. BPF_MOV64_REG(R3, R2),
  3793. BPF_MOV64_REG(R4, R3),
  3794. BPF_MOV64_REG(R5, R4),
  3795. BPF_MOV64_REG(R6, R5),
  3796. BPF_MOV64_REG(R7, R6),
  3797. BPF_MOV64_REG(R8, R7),
  3798. BPF_MOV64_REG(R9, R8),
  3799. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  3800. BPF_ALU32_IMM(BPF_MOV, R1, 0),
  3801. BPF_ALU32_IMM(BPF_MOV, R2, 0),
  3802. BPF_ALU32_IMM(BPF_MOV, R3, 0),
  3803. BPF_ALU32_IMM(BPF_MOV, R4, 0),
  3804. BPF_ALU32_IMM(BPF_MOV, R5, 0),
  3805. BPF_ALU32_IMM(BPF_MOV, R6, 0),
  3806. BPF_ALU32_IMM(BPF_MOV, R7, 0),
  3807. BPF_ALU32_IMM(BPF_MOV, R8, 0),
  3808. BPF_ALU32_IMM(BPF_MOV, R9, 0),
  3809. BPF_ALU64_REG(BPF_ADD, R0, R0),
  3810. BPF_ALU64_REG(BPF_ADD, R0, R1),
  3811. BPF_ALU64_REG(BPF_ADD, R0, R2),
  3812. BPF_ALU64_REG(BPF_ADD, R0, R3),
  3813. BPF_ALU64_REG(BPF_ADD, R0, R4),
  3814. BPF_ALU64_REG(BPF_ADD, R0, R5),
  3815. BPF_ALU64_REG(BPF_ADD, R0, R6),
  3816. BPF_ALU64_REG(BPF_ADD, R0, R7),
  3817. BPF_ALU64_REG(BPF_ADD, R0, R8),
  3818. BPF_ALU64_REG(BPF_ADD, R0, R9),
  3819. BPF_ALU64_IMM(BPF_ADD, R0, 0xfefe),
  3820. BPF_EXIT_INSN(),
  3821. },
  3822. INTERNAL,
  3823. { },
  3824. { { 0, 0xfefe } }
  3825. },
  3826. { /* Mainly checking JIT here. */
  3827. "LD IMM64",
  3828. .u.insns_int = {
  3829. BPF_LD_IMM64(R0, 0xffffffffffffffffLL),
  3830. BPF_MOV64_REG(R1, R0),
  3831. BPF_MOV64_REG(R2, R1),
  3832. BPF_MOV64_REG(R3, R2),
  3833. BPF_MOV64_REG(R4, R3),
  3834. BPF_MOV64_REG(R5, R4),
  3835. BPF_MOV64_REG(R6, R5),
  3836. BPF_MOV64_REG(R7, R6),
  3837. BPF_MOV64_REG(R8, R7),
  3838. BPF_MOV64_REG(R9, R8),
  3839. BPF_LD_IMM64(R0, 0x0LL),
  3840. BPF_LD_IMM64(R1, 0x0LL),
  3841. BPF_LD_IMM64(R2, 0x0LL),
  3842. BPF_LD_IMM64(R3, 0x0LL),
  3843. BPF_LD_IMM64(R4, 0x0LL),
  3844. BPF_LD_IMM64(R5, 0x0LL),
  3845. BPF_LD_IMM64(R6, 0x0LL),
  3846. BPF_LD_IMM64(R7, 0x0LL),
  3847. BPF_LD_IMM64(R8, 0x0LL),
  3848. BPF_LD_IMM64(R9, 0x0LL),
  3849. BPF_ALU64_REG(BPF_ADD, R0, R0),
  3850. BPF_ALU64_REG(BPF_ADD, R0, R1),
  3851. BPF_ALU64_REG(BPF_ADD, R0, R2),
  3852. BPF_ALU64_REG(BPF_ADD, R0, R3),
  3853. BPF_ALU64_REG(BPF_ADD, R0, R4),
  3854. BPF_ALU64_REG(BPF_ADD, R0, R5),
  3855. BPF_ALU64_REG(BPF_ADD, R0, R6),
  3856. BPF_ALU64_REG(BPF_ADD, R0, R7),
  3857. BPF_ALU64_REG(BPF_ADD, R0, R8),
  3858. BPF_ALU64_REG(BPF_ADD, R0, R9),
  3859. BPF_ALU64_IMM(BPF_ADD, R0, 0xfefe),
  3860. BPF_EXIT_INSN(),
  3861. },
  3862. INTERNAL,
  3863. { },
  3864. { { 0, 0xfefe } }
  3865. },
  3866. {
  3867. "INT: ALU MIX",
  3868. .u.insns_int = {
  3869. BPF_ALU64_IMM(BPF_MOV, R0, 11),
  3870. BPF_ALU64_IMM(BPF_ADD, R0, -1),
  3871. BPF_ALU64_IMM(BPF_MOV, R2, 2),
  3872. BPF_ALU64_IMM(BPF_XOR, R2, 3),
  3873. BPF_ALU64_REG(BPF_DIV, R0, R2),
  3874. BPF_JMP_IMM(BPF_JEQ, R0, 10, 1),
  3875. BPF_EXIT_INSN(),
  3876. BPF_ALU64_IMM(BPF_MOD, R0, 3),
  3877. BPF_JMP_IMM(BPF_JEQ, R0, 1, 1),
  3878. BPF_EXIT_INSN(),
  3879. BPF_ALU64_IMM(BPF_MOV, R0, -1),
  3880. BPF_EXIT_INSN(),
  3881. },
  3882. INTERNAL,
  3883. { },
  3884. { { 0, -1 } }
  3885. },
  3886. {
  3887. "INT: shifts by register",
  3888. .u.insns_int = {
  3889. BPF_MOV64_IMM(R0, -1234),
  3890. BPF_MOV64_IMM(R1, 1),
  3891. BPF_ALU32_REG(BPF_RSH, R0, R1),
  3892. BPF_JMP_IMM(BPF_JEQ, R0, 0x7ffffd97, 1),
  3893. BPF_EXIT_INSN(),
  3894. BPF_MOV64_IMM(R2, 1),
  3895. BPF_ALU64_REG(BPF_LSH, R0, R2),
  3896. BPF_MOV32_IMM(R4, -1234),
  3897. BPF_JMP_REG(BPF_JEQ, R0, R4, 1),
  3898. BPF_EXIT_INSN(),
  3899. BPF_ALU64_IMM(BPF_AND, R4, 63),
  3900. BPF_ALU64_REG(BPF_LSH, R0, R4), /* R0 <= 46 */
  3901. BPF_MOV64_IMM(R3, 47),
  3902. BPF_ALU64_REG(BPF_ARSH, R0, R3),
  3903. BPF_JMP_IMM(BPF_JEQ, R0, -617, 1),
  3904. BPF_EXIT_INSN(),
  3905. BPF_MOV64_IMM(R2, 1),
  3906. BPF_ALU64_REG(BPF_LSH, R4, R2), /* R4 = 46 << 1 */
  3907. BPF_JMP_IMM(BPF_JEQ, R4, 92, 1),
  3908. BPF_EXIT_INSN(),
  3909. BPF_MOV64_IMM(R4, 4),
  3910. BPF_ALU64_REG(BPF_LSH, R4, R4), /* R4 = 4 << 4 */
  3911. BPF_JMP_IMM(BPF_JEQ, R4, 64, 1),
  3912. BPF_EXIT_INSN(),
  3913. BPF_MOV64_IMM(R4, 5),
  3914. BPF_ALU32_REG(BPF_LSH, R4, R4), /* R4 = 5 << 5 */
  3915. BPF_JMP_IMM(BPF_JEQ, R4, 160, 1),
  3916. BPF_EXIT_INSN(),
  3917. BPF_MOV64_IMM(R0, -1),
  3918. BPF_EXIT_INSN(),
  3919. },
  3920. INTERNAL,
  3921. { },
  3922. { { 0, -1 } }
  3923. },
  3924. #ifdef CONFIG_32BIT
  3925. {
  3926. "INT: 32-bit context pointer word order and zero-extension",
  3927. .u.insns_int = {
  3928. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  3929. BPF_JMP32_IMM(BPF_JEQ, R1, 0, 3),
  3930. BPF_ALU64_IMM(BPF_RSH, R1, 32),
  3931. BPF_JMP32_IMM(BPF_JNE, R1, 0, 1),
  3932. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  3933. BPF_EXIT_INSN(),
  3934. },
  3935. INTERNAL,
  3936. { },
  3937. { { 0, 1 } }
  3938. },
  3939. #endif
  3940. {
  3941. "check: missing ret",
  3942. .u.insns = {
  3943. BPF_STMT(BPF_LD | BPF_IMM, 1),
  3944. },
  3945. CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
  3946. { },
  3947. { },
  3948. .fill_helper = NULL,
  3949. .expected_errcode = -EINVAL,
  3950. },
  3951. {
  3952. "check: div_k_0",
  3953. .u.insns = {
  3954. BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0),
  3955. BPF_STMT(BPF_RET | BPF_K, 0)
  3956. },
  3957. CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
  3958. { },
  3959. { },
  3960. .fill_helper = NULL,
  3961. .expected_errcode = -EINVAL,
  3962. },
  3963. {
  3964. "check: unknown insn",
  3965. .u.insns = {
  3966. /* seccomp insn, rejected in socket filter */
  3967. BPF_STMT(BPF_LDX | BPF_W | BPF_ABS, 0),
  3968. BPF_STMT(BPF_RET | BPF_K, 0)
  3969. },
  3970. CLASSIC | FLAG_EXPECTED_FAIL,
  3971. { },
  3972. { },
  3973. .fill_helper = NULL,
  3974. .expected_errcode = -EINVAL,
  3975. },
  3976. {
  3977. "check: out of range spill/fill",
  3978. .u.insns = {
  3979. BPF_STMT(BPF_STX, 16),
  3980. BPF_STMT(BPF_RET | BPF_K, 0)
  3981. },
  3982. CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
  3983. { },
  3984. { },
  3985. .fill_helper = NULL,
  3986. .expected_errcode = -EINVAL,
  3987. },
  3988. {
  3989. "JUMPS + HOLES",
  3990. .u.insns = {
  3991. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  3992. BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 15),
  3993. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  3994. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  3995. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  3996. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  3997. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  3998. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  3999. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4000. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4001. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4002. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4003. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4004. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4005. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4006. BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90c2894d, 3, 4),
  4007. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4008. BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90c2894d, 1, 2),
  4009. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4010. BPF_JUMP(BPF_JMP | BPF_JGE, 0, 14, 15),
  4011. BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 14),
  4012. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4013. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4014. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4015. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4016. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4017. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4018. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4019. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4020. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4021. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4022. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4023. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4024. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4025. BPF_JUMP(BPF_JMP | BPF_JEQ, 0x2ac28349, 2, 3),
  4026. BPF_JUMP(BPF_JMP | BPF_JEQ, 0x2ac28349, 1, 2),
  4027. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4028. BPF_JUMP(BPF_JMP | BPF_JGE, 0, 14, 15),
  4029. BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 14),
  4030. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4031. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4032. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4033. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4034. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4035. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4036. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4037. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4038. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4039. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4040. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4041. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4042. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4043. BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90d2ff41, 2, 3),
  4044. BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90d2ff41, 1, 2),
  4045. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  4046. BPF_STMT(BPF_RET | BPF_A, 0),
  4047. BPF_STMT(BPF_RET | BPF_A, 0),
  4048. },
  4049. CLASSIC,
  4050. { 0x00, 0x1b, 0x21, 0x3c, 0x9d, 0xf8,
  4051. 0x90, 0xe2, 0xba, 0x0a, 0x56, 0xb4,
  4052. 0x08, 0x00,
  4053. 0x45, 0x00, 0x00, 0x28, 0x00, 0x00,
  4054. 0x20, 0x00, 0x40, 0x11, 0x00, 0x00, /* IP header */
  4055. 0xc0, 0xa8, 0x33, 0x01,
  4056. 0xc0, 0xa8, 0x33, 0x02,
  4057. 0xbb, 0xb6,
  4058. 0xa9, 0xfa,
  4059. 0x00, 0x14, 0x00, 0x00,
  4060. 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
  4061. 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
  4062. 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
  4063. 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
  4064. 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
  4065. 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
  4066. 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
  4067. 0xcc, 0xcc, 0xcc, 0xcc },
  4068. { { 88, 0x001b } }
  4069. },
  4070. {
  4071. "check: RET X",
  4072. .u.insns = {
  4073. BPF_STMT(BPF_RET | BPF_X, 0),
  4074. },
  4075. CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
  4076. { },
  4077. { },
  4078. .fill_helper = NULL,
  4079. .expected_errcode = -EINVAL,
  4080. },
  4081. {
  4082. "check: LDX + RET X",
  4083. .u.insns = {
  4084. BPF_STMT(BPF_LDX | BPF_IMM, 42),
  4085. BPF_STMT(BPF_RET | BPF_X, 0),
  4086. },
  4087. CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
  4088. { },
  4089. { },
  4090. .fill_helper = NULL,
  4091. .expected_errcode = -EINVAL,
  4092. },
  4093. { /* Mainly checking JIT here. */
  4094. "M[]: alt STX + LDX",
  4095. .u.insns = {
  4096. BPF_STMT(BPF_LDX | BPF_IMM, 100),
  4097. BPF_STMT(BPF_STX, 0),
  4098. BPF_STMT(BPF_LDX | BPF_MEM, 0),
  4099. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  4100. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
  4101. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  4102. BPF_STMT(BPF_STX, 1),
  4103. BPF_STMT(BPF_LDX | BPF_MEM, 1),
  4104. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  4105. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
  4106. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  4107. BPF_STMT(BPF_STX, 2),
  4108. BPF_STMT(BPF_LDX | BPF_MEM, 2),
  4109. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  4110. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
  4111. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  4112. BPF_STMT(BPF_STX, 3),
  4113. BPF_STMT(BPF_LDX | BPF_MEM, 3),
  4114. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  4115. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
  4116. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  4117. BPF_STMT(BPF_STX, 4),
  4118. BPF_STMT(BPF_LDX | BPF_MEM, 4),
  4119. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  4120. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
  4121. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  4122. BPF_STMT(BPF_STX, 5),
  4123. BPF_STMT(BPF_LDX | BPF_MEM, 5),
  4124. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  4125. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
  4126. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  4127. BPF_STMT(BPF_STX, 6),
  4128. BPF_STMT(BPF_LDX | BPF_MEM, 6),
  4129. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  4130. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
  4131. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  4132. BPF_STMT(BPF_STX, 7),
  4133. BPF_STMT(BPF_LDX | BPF_MEM, 7),
  4134. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  4135. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
  4136. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  4137. BPF_STMT(BPF_STX, 8),
  4138. BPF_STMT(BPF_LDX | BPF_MEM, 8),
  4139. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  4140. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
  4141. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  4142. BPF_STMT(BPF_STX, 9),
  4143. BPF_STMT(BPF_LDX | BPF_MEM, 9),
  4144. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  4145. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
  4146. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  4147. BPF_STMT(BPF_STX, 10),
  4148. BPF_STMT(BPF_LDX | BPF_MEM, 10),
  4149. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  4150. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
  4151. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  4152. BPF_STMT(BPF_STX, 11),
  4153. BPF_STMT(BPF_LDX | BPF_MEM, 11),
  4154. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  4155. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
  4156. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  4157. BPF_STMT(BPF_STX, 12),
  4158. BPF_STMT(BPF_LDX | BPF_MEM, 12),
  4159. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  4160. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
  4161. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  4162. BPF_STMT(BPF_STX, 13),
  4163. BPF_STMT(BPF_LDX | BPF_MEM, 13),
  4164. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  4165. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
  4166. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  4167. BPF_STMT(BPF_STX, 14),
  4168. BPF_STMT(BPF_LDX | BPF_MEM, 14),
  4169. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  4170. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
  4171. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  4172. BPF_STMT(BPF_STX, 15),
  4173. BPF_STMT(BPF_LDX | BPF_MEM, 15),
  4174. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  4175. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
  4176. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  4177. BPF_STMT(BPF_RET | BPF_A, 0),
  4178. },
  4179. CLASSIC | FLAG_NO_DATA,
  4180. { },
  4181. { { 0, 116 } },
  4182. },
  4183. { /* Mainly checking JIT here. */
  4184. "M[]: full STX + full LDX",
  4185. .u.insns = {
  4186. BPF_STMT(BPF_LDX | BPF_IMM, 0xbadfeedb),
  4187. BPF_STMT(BPF_STX, 0),
  4188. BPF_STMT(BPF_LDX | BPF_IMM, 0xecabedae),
  4189. BPF_STMT(BPF_STX, 1),
  4190. BPF_STMT(BPF_LDX | BPF_IMM, 0xafccfeaf),
  4191. BPF_STMT(BPF_STX, 2),
  4192. BPF_STMT(BPF_LDX | BPF_IMM, 0xbffdcedc),
  4193. BPF_STMT(BPF_STX, 3),
  4194. BPF_STMT(BPF_LDX | BPF_IMM, 0xfbbbdccb),
  4195. BPF_STMT(BPF_STX, 4),
  4196. BPF_STMT(BPF_LDX | BPF_IMM, 0xfbabcbda),
  4197. BPF_STMT(BPF_STX, 5),
  4198. BPF_STMT(BPF_LDX | BPF_IMM, 0xaedecbdb),
  4199. BPF_STMT(BPF_STX, 6),
  4200. BPF_STMT(BPF_LDX | BPF_IMM, 0xadebbade),
  4201. BPF_STMT(BPF_STX, 7),
  4202. BPF_STMT(BPF_LDX | BPF_IMM, 0xfcfcfaec),
  4203. BPF_STMT(BPF_STX, 8),
  4204. BPF_STMT(BPF_LDX | BPF_IMM, 0xbcdddbdc),
  4205. BPF_STMT(BPF_STX, 9),
  4206. BPF_STMT(BPF_LDX | BPF_IMM, 0xfeefdfac),
  4207. BPF_STMT(BPF_STX, 10),
  4208. BPF_STMT(BPF_LDX | BPF_IMM, 0xcddcdeea),
  4209. BPF_STMT(BPF_STX, 11),
  4210. BPF_STMT(BPF_LDX | BPF_IMM, 0xaccfaebb),
  4211. BPF_STMT(BPF_STX, 12),
  4212. BPF_STMT(BPF_LDX | BPF_IMM, 0xbdcccdcf),
  4213. BPF_STMT(BPF_STX, 13),
  4214. BPF_STMT(BPF_LDX | BPF_IMM, 0xaaedecde),
  4215. BPF_STMT(BPF_STX, 14),
  4216. BPF_STMT(BPF_LDX | BPF_IMM, 0xfaeacdad),
  4217. BPF_STMT(BPF_STX, 15),
  4218. BPF_STMT(BPF_LDX | BPF_MEM, 0),
  4219. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  4220. BPF_STMT(BPF_LDX | BPF_MEM, 1),
  4221. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  4222. BPF_STMT(BPF_LDX | BPF_MEM, 2),
  4223. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  4224. BPF_STMT(BPF_LDX | BPF_MEM, 3),
  4225. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  4226. BPF_STMT(BPF_LDX | BPF_MEM, 4),
  4227. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  4228. BPF_STMT(BPF_LDX | BPF_MEM, 5),
  4229. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  4230. BPF_STMT(BPF_LDX | BPF_MEM, 6),
  4231. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  4232. BPF_STMT(BPF_LDX | BPF_MEM, 7),
  4233. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  4234. BPF_STMT(BPF_LDX | BPF_MEM, 8),
  4235. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  4236. BPF_STMT(BPF_LDX | BPF_MEM, 9),
  4237. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  4238. BPF_STMT(BPF_LDX | BPF_MEM, 10),
  4239. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  4240. BPF_STMT(BPF_LDX | BPF_MEM, 11),
  4241. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  4242. BPF_STMT(BPF_LDX | BPF_MEM, 12),
  4243. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  4244. BPF_STMT(BPF_LDX | BPF_MEM, 13),
  4245. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  4246. BPF_STMT(BPF_LDX | BPF_MEM, 14),
  4247. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  4248. BPF_STMT(BPF_LDX | BPF_MEM, 15),
  4249. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  4250. BPF_STMT(BPF_RET | BPF_A, 0),
  4251. },
  4252. CLASSIC | FLAG_NO_DATA,
  4253. { },
  4254. { { 0, 0x2a5a5e5 } },
  4255. },
  4256. {
  4257. "check: SKF_AD_MAX",
  4258. .u.insns = {
  4259. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  4260. SKF_AD_OFF + SKF_AD_MAX),
  4261. BPF_STMT(BPF_RET | BPF_A, 0),
  4262. },
  4263. CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
  4264. { },
  4265. { },
  4266. .fill_helper = NULL,
  4267. .expected_errcode = -EINVAL,
  4268. },
  4269. { /* Passes checker but fails during runtime. */
  4270. "LD [SKF_AD_OFF-1]",
  4271. .u.insns = {
  4272. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  4273. SKF_AD_OFF - 1),
  4274. BPF_STMT(BPF_RET | BPF_K, 1),
  4275. },
  4276. CLASSIC,
  4277. { },
  4278. { { 1, 0 } },
  4279. },
  4280. {
  4281. "load 64-bit immediate",
  4282. .u.insns_int = {
  4283. BPF_LD_IMM64(R1, 0x567800001234LL),
  4284. BPF_MOV64_REG(R2, R1),
  4285. BPF_MOV64_REG(R3, R2),
  4286. BPF_ALU64_IMM(BPF_RSH, R2, 32),
  4287. BPF_ALU64_IMM(BPF_LSH, R3, 32),
  4288. BPF_ALU64_IMM(BPF_RSH, R3, 32),
  4289. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  4290. BPF_JMP_IMM(BPF_JEQ, R2, 0x5678, 1),
  4291. BPF_EXIT_INSN(),
  4292. BPF_JMP_IMM(BPF_JEQ, R3, 0x1234, 1),
  4293. BPF_EXIT_INSN(),
  4294. BPF_LD_IMM64(R0, 0x1ffffffffLL),
  4295. BPF_ALU64_IMM(BPF_RSH, R0, 32), /* R0 = 1 */
  4296. BPF_EXIT_INSN(),
  4297. },
  4298. INTERNAL,
  4299. { },
  4300. { { 0, 1 } }
  4301. },
  4302. /* BPF_ALU | BPF_MOV | BPF_X */
  4303. {
  4304. "ALU_MOV_X: dst = 2",
  4305. .u.insns_int = {
  4306. BPF_ALU32_IMM(BPF_MOV, R1, 2),
  4307. BPF_ALU32_REG(BPF_MOV, R0, R1),
  4308. BPF_EXIT_INSN(),
  4309. },
  4310. INTERNAL,
  4311. { },
  4312. { { 0, 2 } },
  4313. },
  4314. {
  4315. "ALU_MOV_X: dst = 4294967295",
  4316. .u.insns_int = {
  4317. BPF_ALU32_IMM(BPF_MOV, R1, 4294967295U),
  4318. BPF_ALU32_REG(BPF_MOV, R0, R1),
  4319. BPF_EXIT_INSN(),
  4320. },
  4321. INTERNAL,
  4322. { },
  4323. { { 0, 4294967295U } },
  4324. },
  4325. {
  4326. "ALU64_MOV_X: dst = 2",
  4327. .u.insns_int = {
  4328. BPF_ALU32_IMM(BPF_MOV, R1, 2),
  4329. BPF_ALU64_REG(BPF_MOV, R0, R1),
  4330. BPF_EXIT_INSN(),
  4331. },
  4332. INTERNAL,
  4333. { },
  4334. { { 0, 2 } },
  4335. },
  4336. {
  4337. "ALU64_MOV_X: dst = 4294967295",
  4338. .u.insns_int = {
  4339. BPF_ALU32_IMM(BPF_MOV, R1, 4294967295U),
  4340. BPF_ALU64_REG(BPF_MOV, R0, R1),
  4341. BPF_EXIT_INSN(),
  4342. },
  4343. INTERNAL,
  4344. { },
  4345. { { 0, 4294967295U } },
  4346. },
  4347. /* BPF_ALU | BPF_MOV | BPF_K */
  4348. {
  4349. "ALU_MOV_K: dst = 2",
  4350. .u.insns_int = {
  4351. BPF_ALU32_IMM(BPF_MOV, R0, 2),
  4352. BPF_EXIT_INSN(),
  4353. },
  4354. INTERNAL,
  4355. { },
  4356. { { 0, 2 } },
  4357. },
  4358. {
  4359. "ALU_MOV_K: dst = 4294967295",
  4360. .u.insns_int = {
  4361. BPF_ALU32_IMM(BPF_MOV, R0, 4294967295U),
  4362. BPF_EXIT_INSN(),
  4363. },
  4364. INTERNAL,
  4365. { },
  4366. { { 0, 4294967295U } },
  4367. },
  4368. {
  4369. "ALU_MOV_K: 0x0000ffffffff0000 = 0x00000000ffffffff",
  4370. .u.insns_int = {
  4371. BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
  4372. BPF_LD_IMM64(R3, 0x00000000ffffffffLL),
  4373. BPF_ALU32_IMM(BPF_MOV, R2, 0xffffffff),
  4374. BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
  4375. BPF_MOV32_IMM(R0, 2),
  4376. BPF_EXIT_INSN(),
  4377. BPF_MOV32_IMM(R0, 1),
  4378. BPF_EXIT_INSN(),
  4379. },
  4380. INTERNAL,
  4381. { },
  4382. { { 0, 0x1 } },
  4383. },
  4384. {
  4385. "ALU_MOV_K: small negative",
  4386. .u.insns_int = {
  4387. BPF_ALU32_IMM(BPF_MOV, R0, -123),
  4388. BPF_EXIT_INSN(),
  4389. },
  4390. INTERNAL,
  4391. { },
  4392. { { 0, -123 } }
  4393. },
  4394. {
  4395. "ALU_MOV_K: small negative zero extension",
  4396. .u.insns_int = {
  4397. BPF_ALU32_IMM(BPF_MOV, R0, -123),
  4398. BPF_ALU64_IMM(BPF_RSH, R0, 32),
  4399. BPF_EXIT_INSN(),
  4400. },
  4401. INTERNAL,
  4402. { },
  4403. { { 0, 0 } }
  4404. },
  4405. {
  4406. "ALU_MOV_K: large negative",
  4407. .u.insns_int = {
  4408. BPF_ALU32_IMM(BPF_MOV, R0, -123456789),
  4409. BPF_EXIT_INSN(),
  4410. },
  4411. INTERNAL,
  4412. { },
  4413. { { 0, -123456789 } }
  4414. },
  4415. {
  4416. "ALU_MOV_K: large negative zero extension",
  4417. .u.insns_int = {
  4418. BPF_ALU32_IMM(BPF_MOV, R0, -123456789),
  4419. BPF_ALU64_IMM(BPF_RSH, R0, 32),
  4420. BPF_EXIT_INSN(),
  4421. },
  4422. INTERNAL,
  4423. { },
  4424. { { 0, 0 } }
  4425. },
  4426. {
  4427. "ALU64_MOV_K: dst = 2",
  4428. .u.insns_int = {
  4429. BPF_ALU64_IMM(BPF_MOV, R0, 2),
  4430. BPF_EXIT_INSN(),
  4431. },
  4432. INTERNAL,
  4433. { },
  4434. { { 0, 2 } },
  4435. },
  4436. {
  4437. "ALU64_MOV_K: dst = 2147483647",
  4438. .u.insns_int = {
  4439. BPF_ALU64_IMM(BPF_MOV, R0, 2147483647),
  4440. BPF_EXIT_INSN(),
  4441. },
  4442. INTERNAL,
  4443. { },
  4444. { { 0, 2147483647 } },
  4445. },
  4446. {
  4447. "ALU64_OR_K: dst = 0x0",
  4448. .u.insns_int = {
  4449. BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
  4450. BPF_LD_IMM64(R3, 0x0),
  4451. BPF_ALU64_IMM(BPF_MOV, R2, 0x0),
  4452. BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
  4453. BPF_MOV32_IMM(R0, 2),
  4454. BPF_EXIT_INSN(),
  4455. BPF_MOV32_IMM(R0, 1),
  4456. BPF_EXIT_INSN(),
  4457. },
  4458. INTERNAL,
  4459. { },
  4460. { { 0, 0x1 } },
  4461. },
  4462. {
  4463. "ALU64_MOV_K: dst = -1",
  4464. .u.insns_int = {
  4465. BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
  4466. BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
  4467. BPF_ALU64_IMM(BPF_MOV, R2, 0xffffffff),
  4468. BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
  4469. BPF_MOV32_IMM(R0, 2),
  4470. BPF_EXIT_INSN(),
  4471. BPF_MOV32_IMM(R0, 1),
  4472. BPF_EXIT_INSN(),
  4473. },
  4474. INTERNAL,
  4475. { },
  4476. { { 0, 0x1 } },
  4477. },
  4478. {
  4479. "ALU64_MOV_K: small negative",
  4480. .u.insns_int = {
  4481. BPF_ALU64_IMM(BPF_MOV, R0, -123),
  4482. BPF_EXIT_INSN(),
  4483. },
  4484. INTERNAL,
  4485. { },
  4486. { { 0, -123 } }
  4487. },
  4488. {
  4489. "ALU64_MOV_K: small negative sign extension",
  4490. .u.insns_int = {
  4491. BPF_ALU64_IMM(BPF_MOV, R0, -123),
  4492. BPF_ALU64_IMM(BPF_RSH, R0, 32),
  4493. BPF_EXIT_INSN(),
  4494. },
  4495. INTERNAL,
  4496. { },
  4497. { { 0, 0xffffffff } }
  4498. },
  4499. {
  4500. "ALU64_MOV_K: large negative",
  4501. .u.insns_int = {
  4502. BPF_ALU64_IMM(BPF_MOV, R0, -123456789),
  4503. BPF_EXIT_INSN(),
  4504. },
  4505. INTERNAL,
  4506. { },
  4507. { { 0, -123456789 } }
  4508. },
  4509. {
  4510. "ALU64_MOV_K: large negative sign extension",
  4511. .u.insns_int = {
  4512. BPF_ALU64_IMM(BPF_MOV, R0, -123456789),
  4513. BPF_ALU64_IMM(BPF_RSH, R0, 32),
  4514. BPF_EXIT_INSN(),
  4515. },
  4516. INTERNAL,
  4517. { },
  4518. { { 0, 0xffffffff } }
  4519. },
  4520. /* MOVSX32 */
  4521. {
  4522. "ALU_MOVSX | BPF_B",
  4523. .u.insns_int = {
  4524. BPF_LD_IMM64(R2, 0x00000000ffffffefLL),
  4525. BPF_LD_IMM64(R3, 0xdeadbeefdeadbeefLL),
  4526. BPF_MOVSX32_REG(R1, R3, 8),
  4527. BPF_JMP_REG(BPF_JEQ, R2, R1, 2),
  4528. BPF_MOV32_IMM(R0, 2),
  4529. BPF_EXIT_INSN(),
  4530. BPF_MOV32_IMM(R0, 1),
  4531. BPF_EXIT_INSN(),
  4532. },
  4533. INTERNAL,
  4534. { },
  4535. { { 0, 0x1 } },
  4536. },
  4537. {
  4538. "ALU_MOVSX | BPF_H",
  4539. .u.insns_int = {
  4540. BPF_LD_IMM64(R2, 0x00000000ffffbeefLL),
  4541. BPF_LD_IMM64(R3, 0xdeadbeefdeadbeefLL),
  4542. BPF_MOVSX32_REG(R1, R3, 16),
  4543. BPF_JMP_REG(BPF_JEQ, R2, R1, 2),
  4544. BPF_MOV32_IMM(R0, 2),
  4545. BPF_EXIT_INSN(),
  4546. BPF_MOV32_IMM(R0, 1),
  4547. BPF_EXIT_INSN(),
  4548. },
  4549. INTERNAL,
  4550. { },
  4551. { { 0, 0x1 } },
  4552. },
  4553. /* MOVSX64 REG */
  4554. {
  4555. "ALU64_MOVSX | BPF_B",
  4556. .u.insns_int = {
  4557. BPF_LD_IMM64(R2, 0xffffffffffffffefLL),
  4558. BPF_LD_IMM64(R3, 0xdeadbeefdeadbeefLL),
  4559. BPF_MOVSX64_REG(R1, R3, 8),
  4560. BPF_JMP_REG(BPF_JEQ, R2, R1, 2),
  4561. BPF_MOV32_IMM(R0, 2),
  4562. BPF_EXIT_INSN(),
  4563. BPF_MOV32_IMM(R0, 1),
  4564. BPF_EXIT_INSN(),
  4565. },
  4566. INTERNAL,
  4567. { },
  4568. { { 0, 0x1 } },
  4569. },
  4570. {
  4571. "ALU64_MOVSX | BPF_H",
  4572. .u.insns_int = {
  4573. BPF_LD_IMM64(R2, 0xffffffffffffbeefLL),
  4574. BPF_LD_IMM64(R3, 0xdeadbeefdeadbeefLL),
  4575. BPF_MOVSX64_REG(R1, R3, 16),
  4576. BPF_JMP_REG(BPF_JEQ, R2, R1, 2),
  4577. BPF_MOV32_IMM(R0, 2),
  4578. BPF_EXIT_INSN(),
  4579. BPF_MOV32_IMM(R0, 1),
  4580. BPF_EXIT_INSN(),
  4581. },
  4582. INTERNAL,
  4583. { },
  4584. { { 0, 0x1 } },
  4585. },
  4586. {
  4587. "ALU64_MOVSX | BPF_W",
  4588. .u.insns_int = {
  4589. BPF_LD_IMM64(R2, 0xffffffffdeadbeefLL),
  4590. BPF_LD_IMM64(R3, 0xdeadbeefdeadbeefLL),
  4591. BPF_MOVSX64_REG(R1, R3, 32),
  4592. BPF_JMP_REG(BPF_JEQ, R2, R1, 2),
  4593. BPF_MOV32_IMM(R0, 2),
  4594. BPF_EXIT_INSN(),
  4595. BPF_MOV32_IMM(R0, 1),
  4596. BPF_EXIT_INSN(),
  4597. },
  4598. INTERNAL,
  4599. { },
  4600. { { 0, 0x1 } },
  4601. },
  4602. /* BPF_ALU | BPF_ADD | BPF_X */
  4603. {
  4604. "ALU_ADD_X: 1 + 2 = 3",
  4605. .u.insns_int = {
  4606. BPF_LD_IMM64(R0, 1),
  4607. BPF_ALU32_IMM(BPF_MOV, R1, 2),
  4608. BPF_ALU32_REG(BPF_ADD, R0, R1),
  4609. BPF_EXIT_INSN(),
  4610. },
  4611. INTERNAL,
  4612. { },
  4613. { { 0, 3 } },
  4614. },
  4615. {
  4616. "ALU_ADD_X: 1 + 4294967294 = 4294967295",
  4617. .u.insns_int = {
  4618. BPF_LD_IMM64(R0, 1),
  4619. BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
  4620. BPF_ALU32_REG(BPF_ADD, R0, R1),
  4621. BPF_EXIT_INSN(),
  4622. },
  4623. INTERNAL,
  4624. { },
  4625. { { 0, 4294967295U } },
  4626. },
  4627. {
  4628. "ALU_ADD_X: 2 + 4294967294 = 0",
  4629. .u.insns_int = {
  4630. BPF_LD_IMM64(R0, 2),
  4631. BPF_LD_IMM64(R1, 4294967294U),
  4632. BPF_ALU32_REG(BPF_ADD, R0, R1),
  4633. BPF_JMP_IMM(BPF_JEQ, R0, 0, 2),
  4634. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  4635. BPF_EXIT_INSN(),
  4636. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  4637. BPF_EXIT_INSN(),
  4638. },
  4639. INTERNAL,
  4640. { },
  4641. { { 0, 1 } },
  4642. },
  4643. {
  4644. "ALU64_ADD_X: 1 + 2 = 3",
  4645. .u.insns_int = {
  4646. BPF_LD_IMM64(R0, 1),
  4647. BPF_ALU32_IMM(BPF_MOV, R1, 2),
  4648. BPF_ALU64_REG(BPF_ADD, R0, R1),
  4649. BPF_EXIT_INSN(),
  4650. },
  4651. INTERNAL,
  4652. { },
  4653. { { 0, 3 } },
  4654. },
  4655. {
  4656. "ALU64_ADD_X: 1 + 4294967294 = 4294967295",
  4657. .u.insns_int = {
  4658. BPF_LD_IMM64(R0, 1),
  4659. BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
  4660. BPF_ALU64_REG(BPF_ADD, R0, R1),
  4661. BPF_EXIT_INSN(),
  4662. },
  4663. INTERNAL,
  4664. { },
  4665. { { 0, 4294967295U } },
  4666. },
  4667. {
  4668. "ALU64_ADD_X: 2 + 4294967294 = 4294967296",
  4669. .u.insns_int = {
  4670. BPF_LD_IMM64(R0, 2),
  4671. BPF_LD_IMM64(R1, 4294967294U),
  4672. BPF_LD_IMM64(R2, 4294967296ULL),
  4673. BPF_ALU64_REG(BPF_ADD, R0, R1),
  4674. BPF_JMP_REG(BPF_JEQ, R0, R2, 2),
  4675. BPF_MOV32_IMM(R0, 0),
  4676. BPF_EXIT_INSN(),
  4677. BPF_MOV32_IMM(R0, 1),
  4678. BPF_EXIT_INSN(),
  4679. },
  4680. INTERNAL,
  4681. { },
  4682. { { 0, 1 } },
  4683. },
  4684. /* BPF_ALU | BPF_ADD | BPF_K */
  4685. {
  4686. "ALU_ADD_K: 1 + 2 = 3",
  4687. .u.insns_int = {
  4688. BPF_LD_IMM64(R0, 1),
  4689. BPF_ALU32_IMM(BPF_ADD, R0, 2),
  4690. BPF_EXIT_INSN(),
  4691. },
  4692. INTERNAL,
  4693. { },
  4694. { { 0, 3 } },
  4695. },
  4696. {
  4697. "ALU_ADD_K: 3 + 0 = 3",
  4698. .u.insns_int = {
  4699. BPF_LD_IMM64(R0, 3),
  4700. BPF_ALU32_IMM(BPF_ADD, R0, 0),
  4701. BPF_EXIT_INSN(),
  4702. },
  4703. INTERNAL,
  4704. { },
  4705. { { 0, 3 } },
  4706. },
  4707. {
  4708. "ALU_ADD_K: 1 + 4294967294 = 4294967295",
  4709. .u.insns_int = {
  4710. BPF_LD_IMM64(R0, 1),
  4711. BPF_ALU32_IMM(BPF_ADD, R0, 4294967294U),
  4712. BPF_EXIT_INSN(),
  4713. },
  4714. INTERNAL,
  4715. { },
  4716. { { 0, 4294967295U } },
  4717. },
  4718. {
  4719. "ALU_ADD_K: 4294967294 + 2 = 0",
  4720. .u.insns_int = {
  4721. BPF_LD_IMM64(R0, 4294967294U),
  4722. BPF_ALU32_IMM(BPF_ADD, R0, 2),
  4723. BPF_JMP_IMM(BPF_JEQ, R0, 0, 2),
  4724. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  4725. BPF_EXIT_INSN(),
  4726. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  4727. BPF_EXIT_INSN(),
  4728. },
  4729. INTERNAL,
  4730. { },
  4731. { { 0, 1 } },
  4732. },
  4733. {
  4734. "ALU_ADD_K: 0 + (-1) = 0x00000000ffffffff",
  4735. .u.insns_int = {
  4736. BPF_LD_IMM64(R2, 0x0),
  4737. BPF_LD_IMM64(R3, 0x00000000ffffffff),
  4738. BPF_ALU32_IMM(BPF_ADD, R2, 0xffffffff),
  4739. BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
  4740. BPF_MOV32_IMM(R0, 2),
  4741. BPF_EXIT_INSN(),
  4742. BPF_MOV32_IMM(R0, 1),
  4743. BPF_EXIT_INSN(),
  4744. },
  4745. INTERNAL,
  4746. { },
  4747. { { 0, 0x1 } },
  4748. },
  4749. {
  4750. "ALU_ADD_K: 0 + 0xffff = 0xffff",
  4751. .u.insns_int = {
  4752. BPF_LD_IMM64(R2, 0x0),
  4753. BPF_LD_IMM64(R3, 0xffff),
  4754. BPF_ALU32_IMM(BPF_ADD, R2, 0xffff),
  4755. BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
  4756. BPF_MOV32_IMM(R0, 2),
  4757. BPF_EXIT_INSN(),
  4758. BPF_MOV32_IMM(R0, 1),
  4759. BPF_EXIT_INSN(),
  4760. },
  4761. INTERNAL,
  4762. { },
  4763. { { 0, 0x1 } },
  4764. },
  4765. {
  4766. "ALU_ADD_K: 0 + 0x7fffffff = 0x7fffffff",
  4767. .u.insns_int = {
  4768. BPF_LD_IMM64(R2, 0x0),
  4769. BPF_LD_IMM64(R3, 0x7fffffff),
  4770. BPF_ALU32_IMM(BPF_ADD, R2, 0x7fffffff),
  4771. BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
  4772. BPF_MOV32_IMM(R0, 2),
  4773. BPF_EXIT_INSN(),
  4774. BPF_MOV32_IMM(R0, 1),
  4775. BPF_EXIT_INSN(),
  4776. },
  4777. INTERNAL,
  4778. { },
  4779. { { 0, 0x1 } },
  4780. },
  4781. {
  4782. "ALU_ADD_K: 0 + 0x80000000 = 0x80000000",
  4783. .u.insns_int = {
  4784. BPF_LD_IMM64(R2, 0x0),
  4785. BPF_LD_IMM64(R3, 0x80000000),
  4786. BPF_ALU32_IMM(BPF_ADD, R2, 0x80000000),
  4787. BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
  4788. BPF_MOV32_IMM(R0, 2),
  4789. BPF_EXIT_INSN(),
  4790. BPF_MOV32_IMM(R0, 1),
  4791. BPF_EXIT_INSN(),
  4792. },
  4793. INTERNAL,
  4794. { },
  4795. { { 0, 0x1 } },
  4796. },
  4797. {
  4798. "ALU_ADD_K: 0 + 0x80008000 = 0x80008000",
  4799. .u.insns_int = {
  4800. BPF_LD_IMM64(R2, 0x0),
  4801. BPF_LD_IMM64(R3, 0x80008000),
  4802. BPF_ALU32_IMM(BPF_ADD, R2, 0x80008000),
  4803. BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
  4804. BPF_MOV32_IMM(R0, 2),
  4805. BPF_EXIT_INSN(),
  4806. BPF_MOV32_IMM(R0, 1),
  4807. BPF_EXIT_INSN(),
  4808. },
  4809. INTERNAL,
  4810. { },
  4811. { { 0, 0x1 } },
  4812. },
  4813. {
  4814. "ALU64_ADD_K: 1 + 2 = 3",
  4815. .u.insns_int = {
  4816. BPF_LD_IMM64(R0, 1),
  4817. BPF_ALU64_IMM(BPF_ADD, R0, 2),
  4818. BPF_EXIT_INSN(),
  4819. },
  4820. INTERNAL,
  4821. { },
  4822. { { 0, 3 } },
  4823. },
  4824. {
  4825. "ALU64_ADD_K: 3 + 0 = 3",
  4826. .u.insns_int = {
  4827. BPF_LD_IMM64(R0, 3),
  4828. BPF_ALU64_IMM(BPF_ADD, R0, 0),
  4829. BPF_EXIT_INSN(),
  4830. },
  4831. INTERNAL,
  4832. { },
  4833. { { 0, 3 } },
  4834. },
  4835. {
  4836. "ALU64_ADD_K: 1 + 2147483646 = 2147483647",
  4837. .u.insns_int = {
  4838. BPF_LD_IMM64(R0, 1),
  4839. BPF_ALU64_IMM(BPF_ADD, R0, 2147483646),
  4840. BPF_EXIT_INSN(),
  4841. },
  4842. INTERNAL,
  4843. { },
  4844. { { 0, 2147483647 } },
  4845. },
  4846. {
  4847. "ALU64_ADD_K: 4294967294 + 2 = 4294967296",
  4848. .u.insns_int = {
  4849. BPF_LD_IMM64(R0, 4294967294U),
  4850. BPF_LD_IMM64(R1, 4294967296ULL),
  4851. BPF_ALU64_IMM(BPF_ADD, R0, 2),
  4852. BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
  4853. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  4854. BPF_EXIT_INSN(),
  4855. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  4856. BPF_EXIT_INSN(),
  4857. },
  4858. INTERNAL,
  4859. { },
  4860. { { 0, 1 } },
  4861. },
  4862. {
  4863. "ALU64_ADD_K: 2147483646 + -2147483647 = -1",
  4864. .u.insns_int = {
  4865. BPF_LD_IMM64(R0, 2147483646),
  4866. BPF_ALU64_IMM(BPF_ADD, R0, -2147483647),
  4867. BPF_EXIT_INSN(),
  4868. },
  4869. INTERNAL,
  4870. { },
  4871. { { 0, -1 } },
  4872. },
  4873. {
  4874. "ALU64_ADD_K: 1 + 0 = 1",
  4875. .u.insns_int = {
  4876. BPF_LD_IMM64(R2, 0x1),
  4877. BPF_LD_IMM64(R3, 0x1),
  4878. BPF_ALU64_IMM(BPF_ADD, R2, 0x0),
  4879. BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
  4880. BPF_MOV32_IMM(R0, 2),
  4881. BPF_EXIT_INSN(),
  4882. BPF_MOV32_IMM(R0, 1),
  4883. BPF_EXIT_INSN(),
  4884. },
  4885. INTERNAL,
  4886. { },
  4887. { { 0, 0x1 } },
  4888. },
  4889. {
  4890. "ALU64_ADD_K: 0 + (-1) = 0xffffffffffffffff",
  4891. .u.insns_int = {
  4892. BPF_LD_IMM64(R2, 0x0),
  4893. BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
  4894. BPF_ALU64_IMM(BPF_ADD, R2, 0xffffffff),
  4895. BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
  4896. BPF_MOV32_IMM(R0, 2),
  4897. BPF_EXIT_INSN(),
  4898. BPF_MOV32_IMM(R0, 1),
  4899. BPF_EXIT_INSN(),
  4900. },
  4901. INTERNAL,
  4902. { },
  4903. { { 0, 0x1 } },
  4904. },
  4905. {
  4906. "ALU64_ADD_K: 0 + 0xffff = 0xffff",
  4907. .u.insns_int = {
  4908. BPF_LD_IMM64(R2, 0x0),
  4909. BPF_LD_IMM64(R3, 0xffff),
  4910. BPF_ALU64_IMM(BPF_ADD, R2, 0xffff),
  4911. BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
  4912. BPF_MOV32_IMM(R0, 2),
  4913. BPF_EXIT_INSN(),
  4914. BPF_MOV32_IMM(R0, 1),
  4915. BPF_EXIT_INSN(),
  4916. },
  4917. INTERNAL,
  4918. { },
  4919. { { 0, 0x1 } },
  4920. },
  4921. {
  4922. "ALU64_ADD_K: 0 + 0x7fffffff = 0x7fffffff",
  4923. .u.insns_int = {
  4924. BPF_LD_IMM64(R2, 0x0),
  4925. BPF_LD_IMM64(R3, 0x7fffffff),
  4926. BPF_ALU64_IMM(BPF_ADD, R2, 0x7fffffff),
  4927. BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
  4928. BPF_MOV32_IMM(R0, 2),
  4929. BPF_EXIT_INSN(),
  4930. BPF_MOV32_IMM(R0, 1),
  4931. BPF_EXIT_INSN(),
  4932. },
  4933. INTERNAL,
  4934. { },
  4935. { { 0, 0x1 } },
  4936. },
  4937. {
  4938. "ALU64_ADD_K: 0 + 0x80000000 = 0xffffffff80000000",
  4939. .u.insns_int = {
  4940. BPF_LD_IMM64(R2, 0x0),
  4941. BPF_LD_IMM64(R3, 0xffffffff80000000LL),
  4942. BPF_ALU64_IMM(BPF_ADD, R2, 0x80000000),
  4943. BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
  4944. BPF_MOV32_IMM(R0, 2),
  4945. BPF_EXIT_INSN(),
  4946. BPF_MOV32_IMM(R0, 1),
  4947. BPF_EXIT_INSN(),
  4948. },
  4949. INTERNAL,
  4950. { },
  4951. { { 0, 0x1 } },
  4952. },
  4953. {
  4954. "ALU_ADD_K: 0 + 0x80008000 = 0xffffffff80008000",
  4955. .u.insns_int = {
  4956. BPF_LD_IMM64(R2, 0x0),
  4957. BPF_LD_IMM64(R3, 0xffffffff80008000LL),
  4958. BPF_ALU64_IMM(BPF_ADD, R2, 0x80008000),
  4959. BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
  4960. BPF_MOV32_IMM(R0, 2),
  4961. BPF_EXIT_INSN(),
  4962. BPF_MOV32_IMM(R0, 1),
  4963. BPF_EXIT_INSN(),
  4964. },
  4965. INTERNAL,
  4966. { },
  4967. { { 0, 0x1 } },
  4968. },
  4969. /* BPF_ALU | BPF_SUB | BPF_X */
  4970. {
  4971. "ALU_SUB_X: 3 - 1 = 2",
  4972. .u.insns_int = {
  4973. BPF_LD_IMM64(R0, 3),
  4974. BPF_ALU32_IMM(BPF_MOV, R1, 1),
  4975. BPF_ALU32_REG(BPF_SUB, R0, R1),
  4976. BPF_EXIT_INSN(),
  4977. },
  4978. INTERNAL,
  4979. { },
  4980. { { 0, 2 } },
  4981. },
  4982. {
  4983. "ALU_SUB_X: 4294967295 - 4294967294 = 1",
  4984. .u.insns_int = {
  4985. BPF_LD_IMM64(R0, 4294967295U),
  4986. BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
  4987. BPF_ALU32_REG(BPF_SUB, R0, R1),
  4988. BPF_EXIT_INSN(),
  4989. },
  4990. INTERNAL,
  4991. { },
  4992. { { 0, 1 } },
  4993. },
  4994. {
  4995. "ALU64_SUB_X: 3 - 1 = 2",
  4996. .u.insns_int = {
  4997. BPF_LD_IMM64(R0, 3),
  4998. BPF_ALU32_IMM(BPF_MOV, R1, 1),
  4999. BPF_ALU64_REG(BPF_SUB, R0, R1),
  5000. BPF_EXIT_INSN(),
  5001. },
  5002. INTERNAL,
  5003. { },
  5004. { { 0, 2 } },
  5005. },
  5006. {
  5007. "ALU64_SUB_X: 4294967295 - 4294967294 = 1",
  5008. .u.insns_int = {
  5009. BPF_LD_IMM64(R0, 4294967295U),
  5010. BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
  5011. BPF_ALU64_REG(BPF_SUB, R0, R1),
  5012. BPF_EXIT_INSN(),
  5013. },
  5014. INTERNAL,
  5015. { },
  5016. { { 0, 1 } },
  5017. },
  5018. /* BPF_ALU | BPF_SUB | BPF_K */
  5019. {
  5020. "ALU_SUB_K: 3 - 1 = 2",
  5021. .u.insns_int = {
  5022. BPF_LD_IMM64(R0, 3),
  5023. BPF_ALU32_IMM(BPF_SUB, R0, 1),
  5024. BPF_EXIT_INSN(),
  5025. },
  5026. INTERNAL,
  5027. { },
  5028. { { 0, 2 } },
  5029. },
  5030. {
  5031. "ALU_SUB_K: 3 - 0 = 3",
  5032. .u.insns_int = {
  5033. BPF_LD_IMM64(R0, 3),
  5034. BPF_ALU32_IMM(BPF_SUB, R0, 0),
  5035. BPF_EXIT_INSN(),
  5036. },
  5037. INTERNAL,
  5038. { },
  5039. { { 0, 3 } },
  5040. },
  5041. {
  5042. "ALU_SUB_K: 4294967295 - 4294967294 = 1",
  5043. .u.insns_int = {
  5044. BPF_LD_IMM64(R0, 4294967295U),
  5045. BPF_ALU32_IMM(BPF_SUB, R0, 4294967294U),
  5046. BPF_EXIT_INSN(),
  5047. },
  5048. INTERNAL,
  5049. { },
  5050. { { 0, 1 } },
  5051. },
  5052. {
  5053. "ALU64_SUB_K: 3 - 1 = 2",
  5054. .u.insns_int = {
  5055. BPF_LD_IMM64(R0, 3),
  5056. BPF_ALU64_IMM(BPF_SUB, R0, 1),
  5057. BPF_EXIT_INSN(),
  5058. },
  5059. INTERNAL,
  5060. { },
  5061. { { 0, 2 } },
  5062. },
  5063. {
  5064. "ALU64_SUB_K: 3 - 0 = 3",
  5065. .u.insns_int = {
  5066. BPF_LD_IMM64(R0, 3),
  5067. BPF_ALU64_IMM(BPF_SUB, R0, 0),
  5068. BPF_EXIT_INSN(),
  5069. },
  5070. INTERNAL,
  5071. { },
  5072. { { 0, 3 } },
  5073. },
  5074. {
  5075. "ALU64_SUB_K: 4294967294 - 4294967295 = -1",
  5076. .u.insns_int = {
  5077. BPF_LD_IMM64(R0, 4294967294U),
  5078. BPF_ALU64_IMM(BPF_SUB, R0, 4294967295U),
  5079. BPF_EXIT_INSN(),
  5080. },
  5081. INTERNAL,
  5082. { },
  5083. { { 0, -1 } },
  5084. },
  5085. {
  5086. "ALU64_ADD_K: 2147483646 - 2147483647 = -1",
  5087. .u.insns_int = {
  5088. BPF_LD_IMM64(R0, 2147483646),
  5089. BPF_ALU64_IMM(BPF_SUB, R0, 2147483647),
  5090. BPF_EXIT_INSN(),
  5091. },
  5092. INTERNAL,
  5093. { },
  5094. { { 0, -1 } },
  5095. },
  5096. /* BPF_ALU | BPF_MUL | BPF_X */
  5097. {
  5098. "ALU_MUL_X: 2 * 3 = 6",
  5099. .u.insns_int = {
  5100. BPF_LD_IMM64(R0, 2),
  5101. BPF_ALU32_IMM(BPF_MOV, R1, 3),
  5102. BPF_ALU32_REG(BPF_MUL, R0, R1),
  5103. BPF_EXIT_INSN(),
  5104. },
  5105. INTERNAL,
  5106. { },
  5107. { { 0, 6 } },
  5108. },
  5109. {
  5110. "ALU_MUL_X: 2 * 0x7FFFFFF8 = 0xFFFFFFF0",
  5111. .u.insns_int = {
  5112. BPF_LD_IMM64(R0, 2),
  5113. BPF_ALU32_IMM(BPF_MOV, R1, 0x7FFFFFF8),
  5114. BPF_ALU32_REG(BPF_MUL, R0, R1),
  5115. BPF_EXIT_INSN(),
  5116. },
  5117. INTERNAL,
  5118. { },
  5119. { { 0, 0xFFFFFFF0 } },
  5120. },
  5121. {
  5122. "ALU_MUL_X: -1 * -1 = 1",
  5123. .u.insns_int = {
  5124. BPF_LD_IMM64(R0, -1),
  5125. BPF_ALU32_IMM(BPF_MOV, R1, -1),
  5126. BPF_ALU32_REG(BPF_MUL, R0, R1),
  5127. BPF_EXIT_INSN(),
  5128. },
  5129. INTERNAL,
  5130. { },
  5131. { { 0, 1 } },
  5132. },
  5133. {
  5134. "ALU64_MUL_X: 2 * 3 = 6",
  5135. .u.insns_int = {
  5136. BPF_LD_IMM64(R0, 2),
  5137. BPF_ALU32_IMM(BPF_MOV, R1, 3),
  5138. BPF_ALU64_REG(BPF_MUL, R0, R1),
  5139. BPF_EXIT_INSN(),
  5140. },
  5141. INTERNAL,
  5142. { },
  5143. { { 0, 6 } },
  5144. },
  5145. {
  5146. "ALU64_MUL_X: 1 * 2147483647 = 2147483647",
  5147. .u.insns_int = {
  5148. BPF_LD_IMM64(R0, 1),
  5149. BPF_ALU32_IMM(BPF_MOV, R1, 2147483647),
  5150. BPF_ALU64_REG(BPF_MUL, R0, R1),
  5151. BPF_EXIT_INSN(),
  5152. },
  5153. INTERNAL,
  5154. { },
  5155. { { 0, 2147483647 } },
  5156. },
  5157. {
  5158. "ALU64_MUL_X: 64x64 multiply, low word",
  5159. .u.insns_int = {
  5160. BPF_LD_IMM64(R0, 0x0fedcba987654321LL),
  5161. BPF_LD_IMM64(R1, 0x123456789abcdef0LL),
  5162. BPF_ALU64_REG(BPF_MUL, R0, R1),
  5163. BPF_EXIT_INSN(),
  5164. },
  5165. INTERNAL,
  5166. { },
  5167. { { 0, 0xe5618cf0 } }
  5168. },
  5169. {
  5170. "ALU64_MUL_X: 64x64 multiply, high word",
  5171. .u.insns_int = {
  5172. BPF_LD_IMM64(R0, 0x0fedcba987654321LL),
  5173. BPF_LD_IMM64(R1, 0x123456789abcdef0LL),
  5174. BPF_ALU64_REG(BPF_MUL, R0, R1),
  5175. BPF_ALU64_IMM(BPF_RSH, R0, 32),
  5176. BPF_EXIT_INSN(),
  5177. },
  5178. INTERNAL,
  5179. { },
  5180. { { 0, 0x2236d88f } }
  5181. },
  5182. /* BPF_ALU | BPF_MUL | BPF_K */
  5183. {
  5184. "ALU_MUL_K: 2 * 3 = 6",
  5185. .u.insns_int = {
  5186. BPF_LD_IMM64(R0, 2),
  5187. BPF_ALU32_IMM(BPF_MUL, R0, 3),
  5188. BPF_EXIT_INSN(),
  5189. },
  5190. INTERNAL,
  5191. { },
  5192. { { 0, 6 } },
  5193. },
  5194. {
  5195. "ALU_MUL_K: 3 * 1 = 3",
  5196. .u.insns_int = {
  5197. BPF_LD_IMM64(R0, 3),
  5198. BPF_ALU32_IMM(BPF_MUL, R0, 1),
  5199. BPF_EXIT_INSN(),
  5200. },
  5201. INTERNAL,
  5202. { },
  5203. { { 0, 3 } },
  5204. },
  5205. {
  5206. "ALU_MUL_K: 2 * 0x7FFFFFF8 = 0xFFFFFFF0",
  5207. .u.insns_int = {
  5208. BPF_LD_IMM64(R0, 2),
  5209. BPF_ALU32_IMM(BPF_MUL, R0, 0x7FFFFFF8),
  5210. BPF_EXIT_INSN(),
  5211. },
  5212. INTERNAL,
  5213. { },
  5214. { { 0, 0xFFFFFFF0 } },
  5215. },
  5216. {
  5217. "ALU_MUL_K: 1 * (-1) = 0x00000000ffffffff",
  5218. .u.insns_int = {
  5219. BPF_LD_IMM64(R2, 0x1),
  5220. BPF_LD_IMM64(R3, 0x00000000ffffffff),
  5221. BPF_ALU32_IMM(BPF_MUL, R2, 0xffffffff),
  5222. BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
  5223. BPF_MOV32_IMM(R0, 2),
  5224. BPF_EXIT_INSN(),
  5225. BPF_MOV32_IMM(R0, 1),
  5226. BPF_EXIT_INSN(),
  5227. },
  5228. INTERNAL,
  5229. { },
  5230. { { 0, 0x1 } },
  5231. },
  5232. {
  5233. "ALU64_MUL_K: 2 * 3 = 6",
  5234. .u.insns_int = {
  5235. BPF_LD_IMM64(R0, 2),
  5236. BPF_ALU64_IMM(BPF_MUL, R0, 3),
  5237. BPF_EXIT_INSN(),
  5238. },
  5239. INTERNAL,
  5240. { },
  5241. { { 0, 6 } },
  5242. },
  5243. {
  5244. "ALU64_MUL_K: 3 * 1 = 3",
  5245. .u.insns_int = {
  5246. BPF_LD_IMM64(R0, 3),
  5247. BPF_ALU64_IMM(BPF_MUL, R0, 1),
  5248. BPF_EXIT_INSN(),
  5249. },
  5250. INTERNAL,
  5251. { },
  5252. { { 0, 3 } },
  5253. },
  5254. {
  5255. "ALU64_MUL_K: 1 * 2147483647 = 2147483647",
  5256. .u.insns_int = {
  5257. BPF_LD_IMM64(R0, 1),
  5258. BPF_ALU64_IMM(BPF_MUL, R0, 2147483647),
  5259. BPF_EXIT_INSN(),
  5260. },
  5261. INTERNAL,
  5262. { },
  5263. { { 0, 2147483647 } },
  5264. },
  5265. {
  5266. "ALU64_MUL_K: 1 * -2147483647 = -2147483647",
  5267. .u.insns_int = {
  5268. BPF_LD_IMM64(R0, 1),
  5269. BPF_ALU64_IMM(BPF_MUL, R0, -2147483647),
  5270. BPF_EXIT_INSN(),
  5271. },
  5272. INTERNAL,
  5273. { },
  5274. { { 0, -2147483647 } },
  5275. },
  5276. {
  5277. "ALU64_MUL_K: 1 * (-1) = 0xffffffffffffffff",
  5278. .u.insns_int = {
  5279. BPF_LD_IMM64(R2, 0x1),
  5280. BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
  5281. BPF_ALU64_IMM(BPF_MUL, R2, 0xffffffff),
  5282. BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
  5283. BPF_MOV32_IMM(R0, 2),
  5284. BPF_EXIT_INSN(),
  5285. BPF_MOV32_IMM(R0, 1),
  5286. BPF_EXIT_INSN(),
  5287. },
  5288. INTERNAL,
  5289. { },
  5290. { { 0, 0x1 } },
  5291. },
  5292. {
  5293. "ALU64_MUL_K: 64x32 multiply, low word",
  5294. .u.insns_int = {
  5295. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  5296. BPF_ALU64_IMM(BPF_MUL, R0, 0x12345678),
  5297. BPF_EXIT_INSN(),
  5298. },
  5299. INTERNAL,
  5300. { },
  5301. { { 0, 0xe242d208 } }
  5302. },
  5303. {
  5304. "ALU64_MUL_K: 64x32 multiply, high word",
  5305. .u.insns_int = {
  5306. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  5307. BPF_ALU64_IMM(BPF_MUL, R0, 0x12345678),
  5308. BPF_ALU64_IMM(BPF_RSH, R0, 32),
  5309. BPF_EXIT_INSN(),
  5310. },
  5311. INTERNAL,
  5312. { },
  5313. { { 0, 0xc28f5c28 } }
  5314. },
  5315. /* BPF_ALU | BPF_DIV | BPF_X */
  5316. {
  5317. "ALU_DIV_X: 6 / 2 = 3",
  5318. .u.insns_int = {
  5319. BPF_LD_IMM64(R0, 6),
  5320. BPF_ALU32_IMM(BPF_MOV, R1, 2),
  5321. BPF_ALU32_REG(BPF_DIV, R0, R1),
  5322. BPF_EXIT_INSN(),
  5323. },
  5324. INTERNAL,
  5325. { },
  5326. { { 0, 3 } },
  5327. },
  5328. {
  5329. "ALU_DIV_X: 4294967295 / 4294967295 = 1",
  5330. .u.insns_int = {
  5331. BPF_LD_IMM64(R0, 4294967295U),
  5332. BPF_ALU32_IMM(BPF_MOV, R1, 4294967295U),
  5333. BPF_ALU32_REG(BPF_DIV, R0, R1),
  5334. BPF_EXIT_INSN(),
  5335. },
  5336. INTERNAL,
  5337. { },
  5338. { { 0, 1 } },
  5339. },
  5340. {
  5341. "ALU64_DIV_X: 6 / 2 = 3",
  5342. .u.insns_int = {
  5343. BPF_LD_IMM64(R0, 6),
  5344. BPF_ALU32_IMM(BPF_MOV, R1, 2),
  5345. BPF_ALU64_REG(BPF_DIV, R0, R1),
  5346. BPF_EXIT_INSN(),
  5347. },
  5348. INTERNAL,
  5349. { },
  5350. { { 0, 3 } },
  5351. },
  5352. {
  5353. "ALU64_DIV_X: 2147483647 / 2147483647 = 1",
  5354. .u.insns_int = {
  5355. BPF_LD_IMM64(R0, 2147483647),
  5356. BPF_ALU32_IMM(BPF_MOV, R1, 2147483647),
  5357. BPF_ALU64_REG(BPF_DIV, R0, R1),
  5358. BPF_EXIT_INSN(),
  5359. },
  5360. INTERNAL,
  5361. { },
  5362. { { 0, 1 } },
  5363. },
  5364. {
  5365. "ALU64_DIV_X: 0xffffffffffffffff / (-1) = 0x0000000000000001",
  5366. .u.insns_int = {
  5367. BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
  5368. BPF_LD_IMM64(R4, 0xffffffffffffffffLL),
  5369. BPF_LD_IMM64(R3, 0x0000000000000001LL),
  5370. BPF_ALU64_REG(BPF_DIV, R2, R4),
  5371. BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
  5372. BPF_MOV32_IMM(R0, 2),
  5373. BPF_EXIT_INSN(),
  5374. BPF_MOV32_IMM(R0, 1),
  5375. BPF_EXIT_INSN(),
  5376. },
  5377. INTERNAL,
  5378. { },
  5379. { { 0, 0x1 } },
  5380. },
  5381. /* BPF_ALU | BPF_DIV | BPF_K */
  5382. {
  5383. "ALU_DIV_K: 6 / 2 = 3",
  5384. .u.insns_int = {
  5385. BPF_LD_IMM64(R0, 6),
  5386. BPF_ALU32_IMM(BPF_DIV, R0, 2),
  5387. BPF_EXIT_INSN(),
  5388. },
  5389. INTERNAL,
  5390. { },
  5391. { { 0, 3 } },
  5392. },
  5393. {
  5394. "ALU_DIV_K: 3 / 1 = 3",
  5395. .u.insns_int = {
  5396. BPF_LD_IMM64(R0, 3),
  5397. BPF_ALU32_IMM(BPF_DIV, R0, 1),
  5398. BPF_EXIT_INSN(),
  5399. },
  5400. INTERNAL,
  5401. { },
  5402. { { 0, 3 } },
  5403. },
  5404. {
  5405. "ALU_DIV_K: 4294967295 / 4294967295 = 1",
  5406. .u.insns_int = {
  5407. BPF_LD_IMM64(R0, 4294967295U),
  5408. BPF_ALU32_IMM(BPF_DIV, R0, 4294967295U),
  5409. BPF_EXIT_INSN(),
  5410. },
  5411. INTERNAL,
  5412. { },
  5413. { { 0, 1 } },
  5414. },
  5415. {
  5416. "ALU_DIV_K: 0xffffffffffffffff / (-1) = 0x1",
  5417. .u.insns_int = {
  5418. BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
  5419. BPF_LD_IMM64(R3, 0x1UL),
  5420. BPF_ALU32_IMM(BPF_DIV, R2, 0xffffffff),
  5421. BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
  5422. BPF_MOV32_IMM(R0, 2),
  5423. BPF_EXIT_INSN(),
  5424. BPF_MOV32_IMM(R0, 1),
  5425. BPF_EXIT_INSN(),
  5426. },
  5427. INTERNAL,
  5428. { },
  5429. { { 0, 0x1 } },
  5430. },
  5431. {
  5432. "ALU64_DIV_K: 6 / 2 = 3",
  5433. .u.insns_int = {
  5434. BPF_LD_IMM64(R0, 6),
  5435. BPF_ALU64_IMM(BPF_DIV, R0, 2),
  5436. BPF_EXIT_INSN(),
  5437. },
  5438. INTERNAL,
  5439. { },
  5440. { { 0, 3 } },
  5441. },
  5442. {
  5443. "ALU64_DIV_K: 3 / 1 = 3",
  5444. .u.insns_int = {
  5445. BPF_LD_IMM64(R0, 3),
  5446. BPF_ALU64_IMM(BPF_DIV, R0, 1),
  5447. BPF_EXIT_INSN(),
  5448. },
  5449. INTERNAL,
  5450. { },
  5451. { { 0, 3 } },
  5452. },
  5453. {
  5454. "ALU64_DIV_K: 2147483647 / 2147483647 = 1",
  5455. .u.insns_int = {
  5456. BPF_LD_IMM64(R0, 2147483647),
  5457. BPF_ALU64_IMM(BPF_DIV, R0, 2147483647),
  5458. BPF_EXIT_INSN(),
  5459. },
  5460. INTERNAL,
  5461. { },
  5462. { { 0, 1 } },
  5463. },
  5464. {
  5465. "ALU64_DIV_K: 0xffffffffffffffff / (-1) = 0x0000000000000001",
  5466. .u.insns_int = {
  5467. BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
  5468. BPF_LD_IMM64(R3, 0x0000000000000001LL),
  5469. BPF_ALU64_IMM(BPF_DIV, R2, 0xffffffff),
  5470. BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
  5471. BPF_MOV32_IMM(R0, 2),
  5472. BPF_EXIT_INSN(),
  5473. BPF_MOV32_IMM(R0, 1),
  5474. BPF_EXIT_INSN(),
  5475. },
  5476. INTERNAL,
  5477. { },
  5478. { { 0, 0x1 } },
  5479. },
  5480. /* BPF_ALU | BPF_MOD | BPF_X */
  5481. {
  5482. "ALU_MOD_X: 3 % 2 = 1",
  5483. .u.insns_int = {
  5484. BPF_LD_IMM64(R0, 3),
  5485. BPF_ALU32_IMM(BPF_MOV, R1, 2),
  5486. BPF_ALU32_REG(BPF_MOD, R0, R1),
  5487. BPF_EXIT_INSN(),
  5488. },
  5489. INTERNAL,
  5490. { },
  5491. { { 0, 1 } },
  5492. },
  5493. {
  5494. "ALU_MOD_X: 4294967295 % 4294967293 = 2",
  5495. .u.insns_int = {
  5496. BPF_LD_IMM64(R0, 4294967295U),
  5497. BPF_ALU32_IMM(BPF_MOV, R1, 4294967293U),
  5498. BPF_ALU32_REG(BPF_MOD, R0, R1),
  5499. BPF_EXIT_INSN(),
  5500. },
  5501. INTERNAL,
  5502. { },
  5503. { { 0, 2 } },
  5504. },
  5505. {
  5506. "ALU64_MOD_X: 3 % 2 = 1",
  5507. .u.insns_int = {
  5508. BPF_LD_IMM64(R0, 3),
  5509. BPF_ALU32_IMM(BPF_MOV, R1, 2),
  5510. BPF_ALU64_REG(BPF_MOD, R0, R1),
  5511. BPF_EXIT_INSN(),
  5512. },
  5513. INTERNAL,
  5514. { },
  5515. { { 0, 1 } },
  5516. },
  5517. {
  5518. "ALU64_MOD_X: 2147483647 % 2147483645 = 2",
  5519. .u.insns_int = {
  5520. BPF_LD_IMM64(R0, 2147483647),
  5521. BPF_ALU32_IMM(BPF_MOV, R1, 2147483645),
  5522. BPF_ALU64_REG(BPF_MOD, R0, R1),
  5523. BPF_EXIT_INSN(),
  5524. },
  5525. INTERNAL,
  5526. { },
  5527. { { 0, 2 } },
  5528. },
  5529. /* BPF_ALU | BPF_MOD | BPF_K */
  5530. {
  5531. "ALU_MOD_K: 3 % 2 = 1",
  5532. .u.insns_int = {
  5533. BPF_LD_IMM64(R0, 3),
  5534. BPF_ALU32_IMM(BPF_MOD, R0, 2),
  5535. BPF_EXIT_INSN(),
  5536. },
  5537. INTERNAL,
  5538. { },
  5539. { { 0, 1 } },
  5540. },
  5541. {
  5542. "ALU_MOD_K: 3 % 1 = 0",
  5543. .u.insns_int = {
  5544. BPF_LD_IMM64(R0, 3),
  5545. BPF_ALU32_IMM(BPF_MOD, R0, 1),
  5546. BPF_EXIT_INSN(),
  5547. },
  5548. INTERNAL,
  5549. { },
  5550. { { 0, 0 } },
  5551. },
  5552. {
  5553. "ALU_MOD_K: 4294967295 % 4294967293 = 2",
  5554. .u.insns_int = {
  5555. BPF_LD_IMM64(R0, 4294967295U),
  5556. BPF_ALU32_IMM(BPF_MOD, R0, 4294967293U),
  5557. BPF_EXIT_INSN(),
  5558. },
  5559. INTERNAL,
  5560. { },
  5561. { { 0, 2 } },
  5562. },
  5563. {
  5564. "ALU64_MOD_K: 3 % 2 = 1",
  5565. .u.insns_int = {
  5566. BPF_LD_IMM64(R0, 3),
  5567. BPF_ALU64_IMM(BPF_MOD, R0, 2),
  5568. BPF_EXIT_INSN(),
  5569. },
  5570. INTERNAL,
  5571. { },
  5572. { { 0, 1 } },
  5573. },
  5574. {
  5575. "ALU64_MOD_K: 3 % 1 = 0",
  5576. .u.insns_int = {
  5577. BPF_LD_IMM64(R0, 3),
  5578. BPF_ALU64_IMM(BPF_MOD, R0, 1),
  5579. BPF_EXIT_INSN(),
  5580. },
  5581. INTERNAL,
  5582. { },
  5583. { { 0, 0 } },
  5584. },
  5585. {
  5586. "ALU64_MOD_K: 2147483647 % 2147483645 = 2",
  5587. .u.insns_int = {
  5588. BPF_LD_IMM64(R0, 2147483647),
  5589. BPF_ALU64_IMM(BPF_MOD, R0, 2147483645),
  5590. BPF_EXIT_INSN(),
  5591. },
  5592. INTERNAL,
  5593. { },
  5594. { { 0, 2 } },
  5595. },
  5596. /* BPF_ALU | BPF_DIV | BPF_X off=1 (SDIV) */
  5597. {
  5598. "ALU_SDIV_X: -6 / 2 = -3",
  5599. .u.insns_int = {
  5600. BPF_LD_IMM64(R0, -6),
  5601. BPF_ALU32_IMM(BPF_MOV, R1, 2),
  5602. BPF_ALU32_REG_OFF(BPF_DIV, R0, R1, 1),
  5603. BPF_EXIT_INSN(),
  5604. },
  5605. INTERNAL,
  5606. { },
  5607. { { 0, -3 } },
  5608. },
  5609. /* BPF_ALU | BPF_DIV | BPF_K off=1 (SDIV) */
  5610. {
  5611. "ALU_SDIV_K: -6 / 2 = -3",
  5612. .u.insns_int = {
  5613. BPF_LD_IMM64(R0, -6),
  5614. BPF_ALU32_IMM_OFF(BPF_DIV, R0, 2, 1),
  5615. BPF_EXIT_INSN(),
  5616. },
  5617. INTERNAL,
  5618. { },
  5619. { { 0, -3 } },
  5620. },
  5621. /* BPF_ALU64 | BPF_DIV | BPF_X off=1 (SDIV64) */
  5622. {
  5623. "ALU64_SDIV_X: -6 / 2 = -3",
  5624. .u.insns_int = {
  5625. BPF_LD_IMM64(R0, -6),
  5626. BPF_ALU32_IMM(BPF_MOV, R1, 2),
  5627. BPF_ALU64_REG_OFF(BPF_DIV, R0, R1, 1),
  5628. BPF_EXIT_INSN(),
  5629. },
  5630. INTERNAL,
  5631. { },
  5632. { { 0, -3 } },
  5633. },
  5634. /* BPF_ALU64 | BPF_DIV | BPF_K off=1 (SDIV64) */
  5635. {
  5636. "ALU64_SDIV_K: -6 / 2 = -3",
  5637. .u.insns_int = {
  5638. BPF_LD_IMM64(R0, -6),
  5639. BPF_ALU64_IMM_OFF(BPF_DIV, R0, 2, 1),
  5640. BPF_EXIT_INSN(),
  5641. },
  5642. INTERNAL,
  5643. { },
  5644. { { 0, -3 } },
  5645. },
  5646. /* BPF_ALU | BPF_MOD | BPF_X off=1 (SMOD) */
  5647. {
  5648. "ALU_SMOD_X: -7 % 2 = -1",
  5649. .u.insns_int = {
  5650. BPF_LD_IMM64(R0, -7),
  5651. BPF_ALU32_IMM(BPF_MOV, R1, 2),
  5652. BPF_ALU32_REG_OFF(BPF_MOD, R0, R1, 1),
  5653. BPF_EXIT_INSN(),
  5654. },
  5655. INTERNAL,
  5656. { },
  5657. { { 0, -1 } },
  5658. },
  5659. /* BPF_ALU | BPF_MOD | BPF_K off=1 (SMOD) */
  5660. {
  5661. "ALU_SMOD_K: -7 % 2 = -1",
  5662. .u.insns_int = {
  5663. BPF_LD_IMM64(R0, -7),
  5664. BPF_ALU32_IMM_OFF(BPF_MOD, R0, 2, 1),
  5665. BPF_EXIT_INSN(),
  5666. },
  5667. INTERNAL,
  5668. { },
  5669. { { 0, -1 } },
  5670. },
  5671. /* BPF_ALU64 | BPF_MOD | BPF_X off=1 (SMOD64) */
  5672. {
  5673. "ALU64_SMOD_X: -7 % 2 = -1",
  5674. .u.insns_int = {
  5675. BPF_LD_IMM64(R0, -7),
  5676. BPF_ALU32_IMM(BPF_MOV, R1, 2),
  5677. BPF_ALU64_REG_OFF(BPF_MOD, R0, R1, 1),
  5678. BPF_EXIT_INSN(),
  5679. },
  5680. INTERNAL,
  5681. { },
  5682. { { 0, -1 } },
  5683. },
  5684. /* BPF_ALU64 | BPF_MOD | BPF_K off=1 (SMOD64) */
  5685. {
  5686. "ALU64_SMOD_K: -7 % 2 = -1",
  5687. .u.insns_int = {
  5688. BPF_LD_IMM64(R0, -7),
  5689. BPF_ALU64_IMM_OFF(BPF_MOD, R0, 2, 1),
  5690. BPF_EXIT_INSN(),
  5691. },
  5692. INTERNAL,
  5693. { },
  5694. { { 0, -1 } },
  5695. },
  5696. /* BPF_ALU | BPF_AND | BPF_X */
  5697. {
  5698. "ALU_AND_X: 3 & 2 = 2",
  5699. .u.insns_int = {
  5700. BPF_LD_IMM64(R0, 3),
  5701. BPF_ALU32_IMM(BPF_MOV, R1, 2),
  5702. BPF_ALU32_REG(BPF_AND, R0, R1),
  5703. BPF_EXIT_INSN(),
  5704. },
  5705. INTERNAL,
  5706. { },
  5707. { { 0, 2 } },
  5708. },
  5709. {
  5710. "ALU_AND_X: 0xffffffff & 0xffffffff = 0xffffffff",
  5711. .u.insns_int = {
  5712. BPF_LD_IMM64(R0, 0xffffffff),
  5713. BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
  5714. BPF_ALU32_REG(BPF_AND, R0, R1),
  5715. BPF_EXIT_INSN(),
  5716. },
  5717. INTERNAL,
  5718. { },
  5719. { { 0, 0xffffffff } },
  5720. },
  5721. {
  5722. "ALU64_AND_X: 3 & 2 = 2",
  5723. .u.insns_int = {
  5724. BPF_LD_IMM64(R0, 3),
  5725. BPF_ALU32_IMM(BPF_MOV, R1, 2),
  5726. BPF_ALU64_REG(BPF_AND, R0, R1),
  5727. BPF_EXIT_INSN(),
  5728. },
  5729. INTERNAL,
  5730. { },
  5731. { { 0, 2 } },
  5732. },
  5733. {
  5734. "ALU64_AND_X: 0xffffffff & 0xffffffff = 0xffffffff",
  5735. .u.insns_int = {
  5736. BPF_LD_IMM64(R0, 0xffffffff),
  5737. BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
  5738. BPF_ALU64_REG(BPF_AND, R0, R1),
  5739. BPF_EXIT_INSN(),
  5740. },
  5741. INTERNAL,
  5742. { },
  5743. { { 0, 0xffffffff } },
  5744. },
  5745. /* BPF_ALU | BPF_AND | BPF_K */
  5746. {
  5747. "ALU_AND_K: 3 & 2 = 2",
  5748. .u.insns_int = {
  5749. BPF_LD_IMM64(R0, 3),
  5750. BPF_ALU32_IMM(BPF_AND, R0, 2),
  5751. BPF_EXIT_INSN(),
  5752. },
  5753. INTERNAL,
  5754. { },
  5755. { { 0, 2 } },
  5756. },
  5757. {
  5758. "ALU_AND_K: 0xffffffff & 0xffffffff = 0xffffffff",
  5759. .u.insns_int = {
  5760. BPF_LD_IMM64(R0, 0xffffffff),
  5761. BPF_ALU32_IMM(BPF_AND, R0, 0xffffffff),
  5762. BPF_EXIT_INSN(),
  5763. },
  5764. INTERNAL,
  5765. { },
  5766. { { 0, 0xffffffff } },
  5767. },
  5768. {
  5769. "ALU_AND_K: Small immediate",
  5770. .u.insns_int = {
  5771. BPF_ALU32_IMM(BPF_MOV, R0, 0x01020304),
  5772. BPF_ALU32_IMM(BPF_AND, R0, 15),
  5773. BPF_EXIT_INSN(),
  5774. },
  5775. INTERNAL,
  5776. { },
  5777. { { 0, 4 } }
  5778. },
  5779. {
  5780. "ALU_AND_K: Large immediate",
  5781. .u.insns_int = {
  5782. BPF_ALU32_IMM(BPF_MOV, R0, 0xf1f2f3f4),
  5783. BPF_ALU32_IMM(BPF_AND, R0, 0xafbfcfdf),
  5784. BPF_EXIT_INSN(),
  5785. },
  5786. INTERNAL,
  5787. { },
  5788. { { 0, 0xa1b2c3d4 } }
  5789. },
  5790. {
  5791. "ALU_AND_K: Zero extension",
  5792. .u.insns_int = {
  5793. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  5794. BPF_LD_IMM64(R1, 0x0000000080a0c0e0LL),
  5795. BPF_ALU32_IMM(BPF_AND, R0, 0xf0f0f0f0),
  5796. BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
  5797. BPF_MOV32_IMM(R0, 2),
  5798. BPF_EXIT_INSN(),
  5799. BPF_MOV32_IMM(R0, 1),
  5800. BPF_EXIT_INSN(),
  5801. },
  5802. INTERNAL,
  5803. { },
  5804. { { 0, 1 } }
  5805. },
  5806. {
  5807. "ALU64_AND_K: 3 & 2 = 2",
  5808. .u.insns_int = {
  5809. BPF_LD_IMM64(R0, 3),
  5810. BPF_ALU64_IMM(BPF_AND, R0, 2),
  5811. BPF_EXIT_INSN(),
  5812. },
  5813. INTERNAL,
  5814. { },
  5815. { { 0, 2 } },
  5816. },
  5817. {
  5818. "ALU64_AND_K: 0xffffffff & 0xffffffff = 0xffffffff",
  5819. .u.insns_int = {
  5820. BPF_LD_IMM64(R0, 0xffffffff),
  5821. BPF_ALU64_IMM(BPF_AND, R0, 0xffffffff),
  5822. BPF_EXIT_INSN(),
  5823. },
  5824. INTERNAL,
  5825. { },
  5826. { { 0, 0xffffffff } },
  5827. },
  5828. {
  5829. "ALU64_AND_K: 0x0000ffffffff0000 & 0x0 = 0x0000000000000000",
  5830. .u.insns_int = {
  5831. BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
  5832. BPF_LD_IMM64(R3, 0x0000000000000000LL),
  5833. BPF_ALU64_IMM(BPF_AND, R2, 0x0),
  5834. BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
  5835. BPF_MOV32_IMM(R0, 2),
  5836. BPF_EXIT_INSN(),
  5837. BPF_MOV32_IMM(R0, 1),
  5838. BPF_EXIT_INSN(),
  5839. },
  5840. INTERNAL,
  5841. { },
  5842. { { 0, 0x1 } },
  5843. },
  5844. {
  5845. "ALU64_AND_K: 0x0000ffffffff0000 & -1 = 0x0000ffffffff0000",
  5846. .u.insns_int = {
  5847. BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
  5848. BPF_LD_IMM64(R3, 0x0000ffffffff0000LL),
  5849. BPF_ALU64_IMM(BPF_AND, R2, 0xffffffff),
  5850. BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
  5851. BPF_MOV32_IMM(R0, 2),
  5852. BPF_EXIT_INSN(),
  5853. BPF_MOV32_IMM(R0, 1),
  5854. BPF_EXIT_INSN(),
  5855. },
  5856. INTERNAL,
  5857. { },
  5858. { { 0, 0x1 } },
  5859. },
  5860. {
  5861. "ALU64_AND_K: 0xffffffffffffffff & -1 = 0xffffffffffffffff",
  5862. .u.insns_int = {
  5863. BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
  5864. BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
  5865. BPF_ALU64_IMM(BPF_AND, R2, 0xffffffff),
  5866. BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
  5867. BPF_MOV32_IMM(R0, 2),
  5868. BPF_EXIT_INSN(),
  5869. BPF_MOV32_IMM(R0, 1),
  5870. BPF_EXIT_INSN(),
  5871. },
  5872. INTERNAL,
  5873. { },
  5874. { { 0, 0x1 } },
  5875. },
  5876. {
  5877. "ALU64_AND_K: Sign extension 1",
  5878. .u.insns_int = {
  5879. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  5880. BPF_LD_IMM64(R1, 0x00000000090b0d0fLL),
  5881. BPF_ALU64_IMM(BPF_AND, R0, 0x0f0f0f0f),
  5882. BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
  5883. BPF_MOV32_IMM(R0, 2),
  5884. BPF_EXIT_INSN(),
  5885. BPF_MOV32_IMM(R0, 1),
  5886. BPF_EXIT_INSN(),
  5887. },
  5888. INTERNAL,
  5889. { },
  5890. { { 0, 1 } }
  5891. },
  5892. {
  5893. "ALU64_AND_K: Sign extension 2",
  5894. .u.insns_int = {
  5895. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  5896. BPF_LD_IMM64(R1, 0x0123456780a0c0e0LL),
  5897. BPF_ALU64_IMM(BPF_AND, R0, 0xf0f0f0f0),
  5898. BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
  5899. BPF_MOV32_IMM(R0, 2),
  5900. BPF_EXIT_INSN(),
  5901. BPF_MOV32_IMM(R0, 1),
  5902. BPF_EXIT_INSN(),
  5903. },
  5904. INTERNAL,
  5905. { },
  5906. { { 0, 1 } }
  5907. },
  5908. /* BPF_ALU | BPF_OR | BPF_X */
  5909. {
  5910. "ALU_OR_X: 1 | 2 = 3",
  5911. .u.insns_int = {
  5912. BPF_LD_IMM64(R0, 1),
  5913. BPF_ALU32_IMM(BPF_MOV, R1, 2),
  5914. BPF_ALU32_REG(BPF_OR, R0, R1),
  5915. BPF_EXIT_INSN(),
  5916. },
  5917. INTERNAL,
  5918. { },
  5919. { { 0, 3 } },
  5920. },
  5921. {
  5922. "ALU_OR_X: 0x0 | 0xffffffff = 0xffffffff",
  5923. .u.insns_int = {
  5924. BPF_LD_IMM64(R0, 0),
  5925. BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
  5926. BPF_ALU32_REG(BPF_OR, R0, R1),
  5927. BPF_EXIT_INSN(),
  5928. },
  5929. INTERNAL,
  5930. { },
  5931. { { 0, 0xffffffff } },
  5932. },
  5933. {
  5934. "ALU64_OR_X: 1 | 2 = 3",
  5935. .u.insns_int = {
  5936. BPF_LD_IMM64(R0, 1),
  5937. BPF_ALU32_IMM(BPF_MOV, R1, 2),
  5938. BPF_ALU64_REG(BPF_OR, R0, R1),
  5939. BPF_EXIT_INSN(),
  5940. },
  5941. INTERNAL,
  5942. { },
  5943. { { 0, 3 } },
  5944. },
  5945. {
  5946. "ALU64_OR_X: 0 | 0xffffffff = 0xffffffff",
  5947. .u.insns_int = {
  5948. BPF_LD_IMM64(R0, 0),
  5949. BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
  5950. BPF_ALU64_REG(BPF_OR, R0, R1),
  5951. BPF_EXIT_INSN(),
  5952. },
  5953. INTERNAL,
  5954. { },
  5955. { { 0, 0xffffffff } },
  5956. },
  5957. /* BPF_ALU | BPF_OR | BPF_K */
  5958. {
  5959. "ALU_OR_K: 1 | 2 = 3",
  5960. .u.insns_int = {
  5961. BPF_LD_IMM64(R0, 1),
  5962. BPF_ALU32_IMM(BPF_OR, R0, 2),
  5963. BPF_EXIT_INSN(),
  5964. },
  5965. INTERNAL,
  5966. { },
  5967. { { 0, 3 } },
  5968. },
  5969. {
  5970. "ALU_OR_K: 0 & 0xffffffff = 0xffffffff",
  5971. .u.insns_int = {
  5972. BPF_LD_IMM64(R0, 0),
  5973. BPF_ALU32_IMM(BPF_OR, R0, 0xffffffff),
  5974. BPF_EXIT_INSN(),
  5975. },
  5976. INTERNAL,
  5977. { },
  5978. { { 0, 0xffffffff } },
  5979. },
  5980. {
  5981. "ALU_OR_K: Small immediate",
  5982. .u.insns_int = {
  5983. BPF_ALU32_IMM(BPF_MOV, R0, 0x01020304),
  5984. BPF_ALU32_IMM(BPF_OR, R0, 1),
  5985. BPF_EXIT_INSN(),
  5986. },
  5987. INTERNAL,
  5988. { },
  5989. { { 0, 0x01020305 } }
  5990. },
  5991. {
  5992. "ALU_OR_K: Large immediate",
  5993. .u.insns_int = {
  5994. BPF_ALU32_IMM(BPF_MOV, R0, 0x01020304),
  5995. BPF_ALU32_IMM(BPF_OR, R0, 0xa0b0c0d0),
  5996. BPF_EXIT_INSN(),
  5997. },
  5998. INTERNAL,
  5999. { },
  6000. { { 0, 0xa1b2c3d4 } }
  6001. },
  6002. {
  6003. "ALU_OR_K: Zero extension",
  6004. .u.insns_int = {
  6005. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  6006. BPF_LD_IMM64(R1, 0x00000000f9fbfdffLL),
  6007. BPF_ALU32_IMM(BPF_OR, R0, 0xf0f0f0f0),
  6008. BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
  6009. BPF_MOV32_IMM(R0, 2),
  6010. BPF_EXIT_INSN(),
  6011. BPF_MOV32_IMM(R0, 1),
  6012. BPF_EXIT_INSN(),
  6013. },
  6014. INTERNAL,
  6015. { },
  6016. { { 0, 1 } }
  6017. },
  6018. {
  6019. "ALU64_OR_K: 1 | 2 = 3",
  6020. .u.insns_int = {
  6021. BPF_LD_IMM64(R0, 1),
  6022. BPF_ALU64_IMM(BPF_OR, R0, 2),
  6023. BPF_EXIT_INSN(),
  6024. },
  6025. INTERNAL,
  6026. { },
  6027. { { 0, 3 } },
  6028. },
  6029. {
  6030. "ALU64_OR_K: 0 & 0xffffffff = 0xffffffff",
  6031. .u.insns_int = {
  6032. BPF_LD_IMM64(R0, 0),
  6033. BPF_ALU64_IMM(BPF_OR, R0, 0xffffffff),
  6034. BPF_EXIT_INSN(),
  6035. },
  6036. INTERNAL,
  6037. { },
  6038. { { 0, 0xffffffff } },
  6039. },
  6040. {
  6041. "ALU64_OR_K: 0x0000ffffffff0000 | 0x0 = 0x0000ffffffff0000",
  6042. .u.insns_int = {
  6043. BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
  6044. BPF_LD_IMM64(R3, 0x0000ffffffff0000LL),
  6045. BPF_ALU64_IMM(BPF_OR, R2, 0x0),
  6046. BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
  6047. BPF_MOV32_IMM(R0, 2),
  6048. BPF_EXIT_INSN(),
  6049. BPF_MOV32_IMM(R0, 1),
  6050. BPF_EXIT_INSN(),
  6051. },
  6052. INTERNAL,
  6053. { },
  6054. { { 0, 0x1 } },
  6055. },
  6056. {
  6057. "ALU64_OR_K: 0x0000ffffffff0000 | -1 = 0xffffffffffffffff",
  6058. .u.insns_int = {
  6059. BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
  6060. BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
  6061. BPF_ALU64_IMM(BPF_OR, R2, 0xffffffff),
  6062. BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
  6063. BPF_MOV32_IMM(R0, 2),
  6064. BPF_EXIT_INSN(),
  6065. BPF_MOV32_IMM(R0, 1),
  6066. BPF_EXIT_INSN(),
  6067. },
  6068. INTERNAL,
  6069. { },
  6070. { { 0, 0x1 } },
  6071. },
  6072. {
  6073. "ALU64_OR_K: 0x000000000000000 | -1 = 0xffffffffffffffff",
  6074. .u.insns_int = {
  6075. BPF_LD_IMM64(R2, 0x0000000000000000LL),
  6076. BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
  6077. BPF_ALU64_IMM(BPF_OR, R2, 0xffffffff),
  6078. BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
  6079. BPF_MOV32_IMM(R0, 2),
  6080. BPF_EXIT_INSN(),
  6081. BPF_MOV32_IMM(R0, 1),
  6082. BPF_EXIT_INSN(),
  6083. },
  6084. INTERNAL,
  6085. { },
  6086. { { 0, 0x1 } },
  6087. },
  6088. {
  6089. "ALU64_OR_K: Sign extension 1",
  6090. .u.insns_int = {
  6091. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  6092. BPF_LD_IMM64(R1, 0x012345678fafcfefLL),
  6093. BPF_ALU64_IMM(BPF_OR, R0, 0x0f0f0f0f),
  6094. BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
  6095. BPF_MOV32_IMM(R0, 2),
  6096. BPF_EXIT_INSN(),
  6097. BPF_MOV32_IMM(R0, 1),
  6098. BPF_EXIT_INSN(),
  6099. },
  6100. INTERNAL,
  6101. { },
  6102. { { 0, 1 } }
  6103. },
  6104. {
  6105. "ALU64_OR_K: Sign extension 2",
  6106. .u.insns_int = {
  6107. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  6108. BPF_LD_IMM64(R1, 0xfffffffff9fbfdffLL),
  6109. BPF_ALU64_IMM(BPF_OR, R0, 0xf0f0f0f0),
  6110. BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
  6111. BPF_MOV32_IMM(R0, 2),
  6112. BPF_EXIT_INSN(),
  6113. BPF_MOV32_IMM(R0, 1),
  6114. BPF_EXIT_INSN(),
  6115. },
  6116. INTERNAL,
  6117. { },
  6118. { { 0, 1 } }
  6119. },
  6120. /* BPF_ALU | BPF_XOR | BPF_X */
  6121. {
  6122. "ALU_XOR_X: 5 ^ 6 = 3",
  6123. .u.insns_int = {
  6124. BPF_LD_IMM64(R0, 5),
  6125. BPF_ALU32_IMM(BPF_MOV, R1, 6),
  6126. BPF_ALU32_REG(BPF_XOR, R0, R1),
  6127. BPF_EXIT_INSN(),
  6128. },
  6129. INTERNAL,
  6130. { },
  6131. { { 0, 3 } },
  6132. },
  6133. {
  6134. "ALU_XOR_X: 0x1 ^ 0xffffffff = 0xfffffffe",
  6135. .u.insns_int = {
  6136. BPF_LD_IMM64(R0, 1),
  6137. BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
  6138. BPF_ALU32_REG(BPF_XOR, R0, R1),
  6139. BPF_EXIT_INSN(),
  6140. },
  6141. INTERNAL,
  6142. { },
  6143. { { 0, 0xfffffffe } },
  6144. },
  6145. {
  6146. "ALU64_XOR_X: 5 ^ 6 = 3",
  6147. .u.insns_int = {
  6148. BPF_LD_IMM64(R0, 5),
  6149. BPF_ALU32_IMM(BPF_MOV, R1, 6),
  6150. BPF_ALU64_REG(BPF_XOR, R0, R1),
  6151. BPF_EXIT_INSN(),
  6152. },
  6153. INTERNAL,
  6154. { },
  6155. { { 0, 3 } },
  6156. },
  6157. {
  6158. "ALU64_XOR_X: 1 ^ 0xffffffff = 0xfffffffe",
  6159. .u.insns_int = {
  6160. BPF_LD_IMM64(R0, 1),
  6161. BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
  6162. BPF_ALU64_REG(BPF_XOR, R0, R1),
  6163. BPF_EXIT_INSN(),
  6164. },
  6165. INTERNAL,
  6166. { },
  6167. { { 0, 0xfffffffe } },
  6168. },
  6169. /* BPF_ALU | BPF_XOR | BPF_K */
  6170. {
  6171. "ALU_XOR_K: 5 ^ 6 = 3",
  6172. .u.insns_int = {
  6173. BPF_LD_IMM64(R0, 5),
  6174. BPF_ALU32_IMM(BPF_XOR, R0, 6),
  6175. BPF_EXIT_INSN(),
  6176. },
  6177. INTERNAL,
  6178. { },
  6179. { { 0, 3 } },
  6180. },
  6181. {
  6182. "ALU_XOR_K: 1 ^ 0xffffffff = 0xfffffffe",
  6183. .u.insns_int = {
  6184. BPF_LD_IMM64(R0, 1),
  6185. BPF_ALU32_IMM(BPF_XOR, R0, 0xffffffff),
  6186. BPF_EXIT_INSN(),
  6187. },
  6188. INTERNAL,
  6189. { },
  6190. { { 0, 0xfffffffe } },
  6191. },
  6192. {
  6193. "ALU_XOR_K: Small immediate",
  6194. .u.insns_int = {
  6195. BPF_ALU32_IMM(BPF_MOV, R0, 0x01020304),
  6196. BPF_ALU32_IMM(BPF_XOR, R0, 15),
  6197. BPF_EXIT_INSN(),
  6198. },
  6199. INTERNAL,
  6200. { },
  6201. { { 0, 0x0102030b } }
  6202. },
  6203. {
  6204. "ALU_XOR_K: Large immediate",
  6205. .u.insns_int = {
  6206. BPF_ALU32_IMM(BPF_MOV, R0, 0xf1f2f3f4),
  6207. BPF_ALU32_IMM(BPF_XOR, R0, 0xafbfcfdf),
  6208. BPF_EXIT_INSN(),
  6209. },
  6210. INTERNAL,
  6211. { },
  6212. { { 0, 0x5e4d3c2b } }
  6213. },
  6214. {
  6215. "ALU_XOR_K: Zero extension",
  6216. .u.insns_int = {
  6217. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  6218. BPF_LD_IMM64(R1, 0x00000000795b3d1fLL),
  6219. BPF_ALU32_IMM(BPF_XOR, R0, 0xf0f0f0f0),
  6220. BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
  6221. BPF_MOV32_IMM(R0, 2),
  6222. BPF_EXIT_INSN(),
  6223. BPF_MOV32_IMM(R0, 1),
  6224. BPF_EXIT_INSN(),
  6225. },
  6226. INTERNAL,
  6227. { },
  6228. { { 0, 1 } }
  6229. },
  6230. {
  6231. "ALU64_XOR_K: 5 ^ 6 = 3",
  6232. .u.insns_int = {
  6233. BPF_LD_IMM64(R0, 5),
  6234. BPF_ALU64_IMM(BPF_XOR, R0, 6),
  6235. BPF_EXIT_INSN(),
  6236. },
  6237. INTERNAL,
  6238. { },
  6239. { { 0, 3 } },
  6240. },
  6241. {
  6242. "ALU64_XOR_K: 1 ^ 0xffffffff = 0xfffffffe",
  6243. .u.insns_int = {
  6244. BPF_LD_IMM64(R0, 1),
  6245. BPF_ALU64_IMM(BPF_XOR, R0, 0xffffffff),
  6246. BPF_EXIT_INSN(),
  6247. },
  6248. INTERNAL,
  6249. { },
  6250. { { 0, 0xfffffffe } },
  6251. },
  6252. {
  6253. "ALU64_XOR_K: 0x0000ffffffff0000 ^ 0x0 = 0x0000ffffffff0000",
  6254. .u.insns_int = {
  6255. BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
  6256. BPF_LD_IMM64(R3, 0x0000ffffffff0000LL),
  6257. BPF_ALU64_IMM(BPF_XOR, R2, 0x0),
  6258. BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
  6259. BPF_MOV32_IMM(R0, 2),
  6260. BPF_EXIT_INSN(),
  6261. BPF_MOV32_IMM(R0, 1),
  6262. BPF_EXIT_INSN(),
  6263. },
  6264. INTERNAL,
  6265. { },
  6266. { { 0, 0x1 } },
  6267. },
  6268. {
  6269. "ALU64_XOR_K: 0x0000ffffffff0000 ^ -1 = 0xffff00000000ffff",
  6270. .u.insns_int = {
  6271. BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
  6272. BPF_LD_IMM64(R3, 0xffff00000000ffffLL),
  6273. BPF_ALU64_IMM(BPF_XOR, R2, 0xffffffff),
  6274. BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
  6275. BPF_MOV32_IMM(R0, 2),
  6276. BPF_EXIT_INSN(),
  6277. BPF_MOV32_IMM(R0, 1),
  6278. BPF_EXIT_INSN(),
  6279. },
  6280. INTERNAL,
  6281. { },
  6282. { { 0, 0x1 } },
  6283. },
  6284. {
  6285. "ALU64_XOR_K: 0x000000000000000 ^ -1 = 0xffffffffffffffff",
  6286. .u.insns_int = {
  6287. BPF_LD_IMM64(R2, 0x0000000000000000LL),
  6288. BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
  6289. BPF_ALU64_IMM(BPF_XOR, R2, 0xffffffff),
  6290. BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
  6291. BPF_MOV32_IMM(R0, 2),
  6292. BPF_EXIT_INSN(),
  6293. BPF_MOV32_IMM(R0, 1),
  6294. BPF_EXIT_INSN(),
  6295. },
  6296. INTERNAL,
  6297. { },
  6298. { { 0, 0x1 } },
  6299. },
  6300. {
  6301. "ALU64_XOR_K: Sign extension 1",
  6302. .u.insns_int = {
  6303. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  6304. BPF_LD_IMM64(R1, 0x0123456786a4c2e0LL),
  6305. BPF_ALU64_IMM(BPF_XOR, R0, 0x0f0f0f0f),
  6306. BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
  6307. BPF_MOV32_IMM(R0, 2),
  6308. BPF_EXIT_INSN(),
  6309. BPF_MOV32_IMM(R0, 1),
  6310. BPF_EXIT_INSN(),
  6311. },
  6312. INTERNAL,
  6313. { },
  6314. { { 0, 1 } }
  6315. },
  6316. {
  6317. "ALU64_XOR_K: Sign extension 2",
  6318. .u.insns_int = {
  6319. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  6320. BPF_LD_IMM64(R1, 0xfedcba98795b3d1fLL),
  6321. BPF_ALU64_IMM(BPF_XOR, R0, 0xf0f0f0f0),
  6322. BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
  6323. BPF_MOV32_IMM(R0, 2),
  6324. BPF_EXIT_INSN(),
  6325. BPF_MOV32_IMM(R0, 1),
  6326. BPF_EXIT_INSN(),
  6327. },
  6328. INTERNAL,
  6329. { },
  6330. { { 0, 1 } }
  6331. },
  6332. /* BPF_ALU | BPF_LSH | BPF_X */
  6333. {
  6334. "ALU_LSH_X: 1 << 1 = 2",
  6335. .u.insns_int = {
  6336. BPF_LD_IMM64(R0, 1),
  6337. BPF_ALU32_IMM(BPF_MOV, R1, 1),
  6338. BPF_ALU32_REG(BPF_LSH, R0, R1),
  6339. BPF_EXIT_INSN(),
  6340. },
  6341. INTERNAL,
  6342. { },
  6343. { { 0, 2 } },
  6344. },
  6345. {
  6346. "ALU_LSH_X: 1 << 31 = 0x80000000",
  6347. .u.insns_int = {
  6348. BPF_LD_IMM64(R0, 1),
  6349. BPF_ALU32_IMM(BPF_MOV, R1, 31),
  6350. BPF_ALU32_REG(BPF_LSH, R0, R1),
  6351. BPF_EXIT_INSN(),
  6352. },
  6353. INTERNAL,
  6354. { },
  6355. { { 0, 0x80000000 } },
  6356. },
  6357. {
  6358. "ALU_LSH_X: 0x12345678 << 12 = 0x45678000",
  6359. .u.insns_int = {
  6360. BPF_ALU32_IMM(BPF_MOV, R0, 0x12345678),
  6361. BPF_ALU32_IMM(BPF_MOV, R1, 12),
  6362. BPF_ALU32_REG(BPF_LSH, R0, R1),
  6363. BPF_EXIT_INSN(),
  6364. },
  6365. INTERNAL,
  6366. { },
  6367. { { 0, 0x45678000 } }
  6368. },
  6369. {
  6370. "ALU64_LSH_X: 1 << 1 = 2",
  6371. .u.insns_int = {
  6372. BPF_LD_IMM64(R0, 1),
  6373. BPF_ALU32_IMM(BPF_MOV, R1, 1),
  6374. BPF_ALU64_REG(BPF_LSH, R0, R1),
  6375. BPF_EXIT_INSN(),
  6376. },
  6377. INTERNAL,
  6378. { },
  6379. { { 0, 2 } },
  6380. },
  6381. {
  6382. "ALU64_LSH_X: 1 << 31 = 0x80000000",
  6383. .u.insns_int = {
  6384. BPF_LD_IMM64(R0, 1),
  6385. BPF_ALU32_IMM(BPF_MOV, R1, 31),
  6386. BPF_ALU64_REG(BPF_LSH, R0, R1),
  6387. BPF_EXIT_INSN(),
  6388. },
  6389. INTERNAL,
  6390. { },
  6391. { { 0, 0x80000000 } },
  6392. },
  6393. {
  6394. "ALU64_LSH_X: Shift < 32, low word",
  6395. .u.insns_int = {
  6396. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  6397. BPF_ALU32_IMM(BPF_MOV, R1, 12),
  6398. BPF_ALU64_REG(BPF_LSH, R0, R1),
  6399. BPF_EXIT_INSN(),
  6400. },
  6401. INTERNAL,
  6402. { },
  6403. { { 0, 0xbcdef000 } }
  6404. },
  6405. {
  6406. "ALU64_LSH_X: Shift < 32, high word",
  6407. .u.insns_int = {
  6408. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  6409. BPF_ALU32_IMM(BPF_MOV, R1, 12),
  6410. BPF_ALU64_REG(BPF_LSH, R0, R1),
  6411. BPF_ALU64_IMM(BPF_RSH, R0, 32),
  6412. BPF_EXIT_INSN(),
  6413. },
  6414. INTERNAL,
  6415. { },
  6416. { { 0, 0x3456789a } }
  6417. },
  6418. {
  6419. "ALU64_LSH_X: Shift > 32, low word",
  6420. .u.insns_int = {
  6421. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  6422. BPF_ALU32_IMM(BPF_MOV, R1, 36),
  6423. BPF_ALU64_REG(BPF_LSH, R0, R1),
  6424. BPF_EXIT_INSN(),
  6425. },
  6426. INTERNAL,
  6427. { },
  6428. { { 0, 0 } }
  6429. },
  6430. {
  6431. "ALU64_LSH_X: Shift > 32, high word",
  6432. .u.insns_int = {
  6433. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  6434. BPF_ALU32_IMM(BPF_MOV, R1, 36),
  6435. BPF_ALU64_REG(BPF_LSH, R0, R1),
  6436. BPF_ALU64_IMM(BPF_RSH, R0, 32),
  6437. BPF_EXIT_INSN(),
  6438. },
  6439. INTERNAL,
  6440. { },
  6441. { { 0, 0x9abcdef0 } }
  6442. },
  6443. {
  6444. "ALU64_LSH_X: Shift == 32, low word",
  6445. .u.insns_int = {
  6446. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  6447. BPF_ALU32_IMM(BPF_MOV, R1, 32),
  6448. BPF_ALU64_REG(BPF_LSH, R0, R1),
  6449. BPF_EXIT_INSN(),
  6450. },
  6451. INTERNAL,
  6452. { },
  6453. { { 0, 0 } }
  6454. },
  6455. {
  6456. "ALU64_LSH_X: Shift == 32, high word",
  6457. .u.insns_int = {
  6458. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  6459. BPF_ALU32_IMM(BPF_MOV, R1, 32),
  6460. BPF_ALU64_REG(BPF_LSH, R0, R1),
  6461. BPF_ALU64_IMM(BPF_RSH, R0, 32),
  6462. BPF_EXIT_INSN(),
  6463. },
  6464. INTERNAL,
  6465. { },
  6466. { { 0, 0x89abcdef } }
  6467. },
  6468. {
  6469. "ALU64_LSH_X: Zero shift, low word",
  6470. .u.insns_int = {
  6471. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  6472. BPF_ALU32_IMM(BPF_MOV, R1, 0),
  6473. BPF_ALU64_REG(BPF_LSH, R0, R1),
  6474. BPF_EXIT_INSN(),
  6475. },
  6476. INTERNAL,
  6477. { },
  6478. { { 0, 0x89abcdef } }
  6479. },
  6480. {
  6481. "ALU64_LSH_X: Zero shift, high word",
  6482. .u.insns_int = {
  6483. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  6484. BPF_ALU32_IMM(BPF_MOV, R1, 0),
  6485. BPF_ALU64_REG(BPF_LSH, R0, R1),
  6486. BPF_ALU64_IMM(BPF_RSH, R0, 32),
  6487. BPF_EXIT_INSN(),
  6488. },
  6489. INTERNAL,
  6490. { },
  6491. { { 0, 0x01234567 } }
  6492. },
  6493. /* BPF_ALU | BPF_LSH | BPF_K */
  6494. {
  6495. "ALU_LSH_K: 1 << 1 = 2",
  6496. .u.insns_int = {
  6497. BPF_LD_IMM64(R0, 1),
  6498. BPF_ALU32_IMM(BPF_LSH, R0, 1),
  6499. BPF_EXIT_INSN(),
  6500. },
  6501. INTERNAL,
  6502. { },
  6503. { { 0, 2 } },
  6504. },
  6505. {
  6506. "ALU_LSH_K: 1 << 31 = 0x80000000",
  6507. .u.insns_int = {
  6508. BPF_LD_IMM64(R0, 1),
  6509. BPF_ALU32_IMM(BPF_LSH, R0, 31),
  6510. BPF_EXIT_INSN(),
  6511. },
  6512. INTERNAL,
  6513. { },
  6514. { { 0, 0x80000000 } },
  6515. },
  6516. {
  6517. "ALU_LSH_K: 0x12345678 << 12 = 0x45678000",
  6518. .u.insns_int = {
  6519. BPF_ALU32_IMM(BPF_MOV, R0, 0x12345678),
  6520. BPF_ALU32_IMM(BPF_LSH, R0, 12),
  6521. BPF_EXIT_INSN(),
  6522. },
  6523. INTERNAL,
  6524. { },
  6525. { { 0, 0x45678000 } }
  6526. },
  6527. {
  6528. "ALU_LSH_K: 0x12345678 << 0 = 0x12345678",
  6529. .u.insns_int = {
  6530. BPF_ALU32_IMM(BPF_MOV, R0, 0x12345678),
  6531. BPF_ALU32_IMM(BPF_LSH, R0, 0),
  6532. BPF_EXIT_INSN(),
  6533. },
  6534. INTERNAL,
  6535. { },
  6536. { { 0, 0x12345678 } }
  6537. },
  6538. {
  6539. "ALU64_LSH_K: 1 << 1 = 2",
  6540. .u.insns_int = {
  6541. BPF_LD_IMM64(R0, 1),
  6542. BPF_ALU64_IMM(BPF_LSH, R0, 1),
  6543. BPF_EXIT_INSN(),
  6544. },
  6545. INTERNAL,
  6546. { },
  6547. { { 0, 2 } },
  6548. },
  6549. {
  6550. "ALU64_LSH_K: 1 << 31 = 0x80000000",
  6551. .u.insns_int = {
  6552. BPF_LD_IMM64(R0, 1),
  6553. BPF_ALU64_IMM(BPF_LSH, R0, 31),
  6554. BPF_EXIT_INSN(),
  6555. },
  6556. INTERNAL,
  6557. { },
  6558. { { 0, 0x80000000 } },
  6559. },
  6560. {
  6561. "ALU64_LSH_K: Shift < 32, low word",
  6562. .u.insns_int = {
  6563. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  6564. BPF_ALU64_IMM(BPF_LSH, R0, 12),
  6565. BPF_EXIT_INSN(),
  6566. },
  6567. INTERNAL,
  6568. { },
  6569. { { 0, 0xbcdef000 } }
  6570. },
  6571. {
  6572. "ALU64_LSH_K: Shift < 32, high word",
  6573. .u.insns_int = {
  6574. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  6575. BPF_ALU64_IMM(BPF_LSH, R0, 12),
  6576. BPF_ALU64_IMM(BPF_RSH, R0, 32),
  6577. BPF_EXIT_INSN(),
  6578. },
  6579. INTERNAL,
  6580. { },
  6581. { { 0, 0x3456789a } }
  6582. },
  6583. {
  6584. "ALU64_LSH_K: Shift > 32, low word",
  6585. .u.insns_int = {
  6586. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  6587. BPF_ALU64_IMM(BPF_LSH, R0, 36),
  6588. BPF_EXIT_INSN(),
  6589. },
  6590. INTERNAL,
  6591. { },
  6592. { { 0, 0 } }
  6593. },
  6594. {
  6595. "ALU64_LSH_K: Shift > 32, high word",
  6596. .u.insns_int = {
  6597. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  6598. BPF_ALU64_IMM(BPF_LSH, R0, 36),
  6599. BPF_ALU64_IMM(BPF_RSH, R0, 32),
  6600. BPF_EXIT_INSN(),
  6601. },
  6602. INTERNAL,
  6603. { },
  6604. { { 0, 0x9abcdef0 } }
  6605. },
  6606. {
  6607. "ALU64_LSH_K: Shift == 32, low word",
  6608. .u.insns_int = {
  6609. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  6610. BPF_ALU64_IMM(BPF_LSH, R0, 32),
  6611. BPF_EXIT_INSN(),
  6612. },
  6613. INTERNAL,
  6614. { },
  6615. { { 0, 0 } }
  6616. },
  6617. {
  6618. "ALU64_LSH_K: Shift == 32, high word",
  6619. .u.insns_int = {
  6620. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  6621. BPF_ALU64_IMM(BPF_LSH, R0, 32),
  6622. BPF_ALU64_IMM(BPF_RSH, R0, 32),
  6623. BPF_EXIT_INSN(),
  6624. },
  6625. INTERNAL,
  6626. { },
  6627. { { 0, 0x89abcdef } }
  6628. },
  6629. {
  6630. "ALU64_LSH_K: Zero shift",
  6631. .u.insns_int = {
  6632. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  6633. BPF_ALU64_IMM(BPF_LSH, R0, 0),
  6634. BPF_EXIT_INSN(),
  6635. },
  6636. INTERNAL,
  6637. { },
  6638. { { 0, 0x89abcdef } }
  6639. },
  6640. /* BPF_ALU | BPF_RSH | BPF_X */
  6641. {
  6642. "ALU_RSH_X: 2 >> 1 = 1",
  6643. .u.insns_int = {
  6644. BPF_LD_IMM64(R0, 2),
  6645. BPF_ALU32_IMM(BPF_MOV, R1, 1),
  6646. BPF_ALU32_REG(BPF_RSH, R0, R1),
  6647. BPF_EXIT_INSN(),
  6648. },
  6649. INTERNAL,
  6650. { },
  6651. { { 0, 1 } },
  6652. },
  6653. {
  6654. "ALU_RSH_X: 0x80000000 >> 31 = 1",
  6655. .u.insns_int = {
  6656. BPF_LD_IMM64(R0, 0x80000000),
  6657. BPF_ALU32_IMM(BPF_MOV, R1, 31),
  6658. BPF_ALU32_REG(BPF_RSH, R0, R1),
  6659. BPF_EXIT_INSN(),
  6660. },
  6661. INTERNAL,
  6662. { },
  6663. { { 0, 1 } },
  6664. },
  6665. {
  6666. "ALU_RSH_X: 0x12345678 >> 20 = 0x123",
  6667. .u.insns_int = {
  6668. BPF_ALU32_IMM(BPF_MOV, R0, 0x12345678),
  6669. BPF_ALU32_IMM(BPF_MOV, R1, 20),
  6670. BPF_ALU32_REG(BPF_RSH, R0, R1),
  6671. BPF_EXIT_INSN(),
  6672. },
  6673. INTERNAL,
  6674. { },
  6675. { { 0, 0x123 } }
  6676. },
  6677. {
  6678. "ALU64_RSH_X: 2 >> 1 = 1",
  6679. .u.insns_int = {
  6680. BPF_LD_IMM64(R0, 2),
  6681. BPF_ALU32_IMM(BPF_MOV, R1, 1),
  6682. BPF_ALU64_REG(BPF_RSH, R0, R1),
  6683. BPF_EXIT_INSN(),
  6684. },
  6685. INTERNAL,
  6686. { },
  6687. { { 0, 1 } },
  6688. },
  6689. {
  6690. "ALU64_RSH_X: 0x80000000 >> 31 = 1",
  6691. .u.insns_int = {
  6692. BPF_LD_IMM64(R0, 0x80000000),
  6693. BPF_ALU32_IMM(BPF_MOV, R1, 31),
  6694. BPF_ALU64_REG(BPF_RSH, R0, R1),
  6695. BPF_EXIT_INSN(),
  6696. },
  6697. INTERNAL,
  6698. { },
  6699. { { 0, 1 } },
  6700. },
  6701. {
  6702. "ALU64_RSH_X: Shift < 32, low word",
  6703. .u.insns_int = {
  6704. BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
  6705. BPF_ALU32_IMM(BPF_MOV, R1, 12),
  6706. BPF_ALU64_REG(BPF_RSH, R0, R1),
  6707. BPF_EXIT_INSN(),
  6708. },
  6709. INTERNAL,
  6710. { },
  6711. { { 0, 0x56789abc } }
  6712. },
  6713. {
  6714. "ALU64_RSH_X: Shift < 32, high word",
  6715. .u.insns_int = {
  6716. BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
  6717. BPF_ALU32_IMM(BPF_MOV, R1, 12),
  6718. BPF_ALU64_REG(BPF_RSH, R0, R1),
  6719. BPF_ALU64_IMM(BPF_RSH, R0, 32),
  6720. BPF_EXIT_INSN(),
  6721. },
  6722. INTERNAL,
  6723. { },
  6724. { { 0, 0x00081234 } }
  6725. },
  6726. {
  6727. "ALU64_RSH_X: Shift > 32, low word",
  6728. .u.insns_int = {
  6729. BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
  6730. BPF_ALU32_IMM(BPF_MOV, R1, 36),
  6731. BPF_ALU64_REG(BPF_RSH, R0, R1),
  6732. BPF_EXIT_INSN(),
  6733. },
  6734. INTERNAL,
  6735. { },
  6736. { { 0, 0x08123456 } }
  6737. },
  6738. {
  6739. "ALU64_RSH_X: Shift > 32, high word",
  6740. .u.insns_int = {
  6741. BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
  6742. BPF_ALU32_IMM(BPF_MOV, R1, 36),
  6743. BPF_ALU64_REG(BPF_RSH, R0, R1),
  6744. BPF_ALU64_IMM(BPF_RSH, R0, 32),
  6745. BPF_EXIT_INSN(),
  6746. },
  6747. INTERNAL,
  6748. { },
  6749. { { 0, 0 } }
  6750. },
  6751. {
  6752. "ALU64_RSH_X: Shift == 32, low word",
  6753. .u.insns_int = {
  6754. BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
  6755. BPF_ALU32_IMM(BPF_MOV, R1, 32),
  6756. BPF_ALU64_REG(BPF_RSH, R0, R1),
  6757. BPF_EXIT_INSN(),
  6758. },
  6759. INTERNAL,
  6760. { },
  6761. { { 0, 0x81234567 } }
  6762. },
  6763. {
  6764. "ALU64_RSH_X: Shift == 32, high word",
  6765. .u.insns_int = {
  6766. BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
  6767. BPF_ALU32_IMM(BPF_MOV, R1, 32),
  6768. BPF_ALU64_REG(BPF_RSH, R0, R1),
  6769. BPF_ALU64_IMM(BPF_RSH, R0, 32),
  6770. BPF_EXIT_INSN(),
  6771. },
  6772. INTERNAL,
  6773. { },
  6774. { { 0, 0 } }
  6775. },
  6776. {
  6777. "ALU64_RSH_X: Zero shift, low word",
  6778. .u.insns_int = {
  6779. BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
  6780. BPF_ALU32_IMM(BPF_MOV, R1, 0),
  6781. BPF_ALU64_REG(BPF_RSH, R0, R1),
  6782. BPF_EXIT_INSN(),
  6783. },
  6784. INTERNAL,
  6785. { },
  6786. { { 0, 0x89abcdef } }
  6787. },
  6788. {
  6789. "ALU64_RSH_X: Zero shift, high word",
  6790. .u.insns_int = {
  6791. BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
  6792. BPF_ALU32_IMM(BPF_MOV, R1, 0),
  6793. BPF_ALU64_REG(BPF_RSH, R0, R1),
  6794. BPF_ALU64_IMM(BPF_RSH, R0, 32),
  6795. BPF_EXIT_INSN(),
  6796. },
  6797. INTERNAL,
  6798. { },
  6799. { { 0, 0x81234567 } }
  6800. },
  6801. /* BPF_ALU | BPF_RSH | BPF_K */
  6802. {
  6803. "ALU_RSH_K: 2 >> 1 = 1",
  6804. .u.insns_int = {
  6805. BPF_LD_IMM64(R0, 2),
  6806. BPF_ALU32_IMM(BPF_RSH, R0, 1),
  6807. BPF_EXIT_INSN(),
  6808. },
  6809. INTERNAL,
  6810. { },
  6811. { { 0, 1 } },
  6812. },
  6813. {
  6814. "ALU_RSH_K: 0x80000000 >> 31 = 1",
  6815. .u.insns_int = {
  6816. BPF_LD_IMM64(R0, 0x80000000),
  6817. BPF_ALU32_IMM(BPF_RSH, R0, 31),
  6818. BPF_EXIT_INSN(),
  6819. },
  6820. INTERNAL,
  6821. { },
  6822. { { 0, 1 } },
  6823. },
  6824. {
  6825. "ALU_RSH_K: 0x12345678 >> 20 = 0x123",
  6826. .u.insns_int = {
  6827. BPF_ALU32_IMM(BPF_MOV, R0, 0x12345678),
  6828. BPF_ALU32_IMM(BPF_RSH, R0, 20),
  6829. BPF_EXIT_INSN(),
  6830. },
  6831. INTERNAL,
  6832. { },
  6833. { { 0, 0x123 } }
  6834. },
  6835. {
  6836. "ALU_RSH_K: 0x12345678 >> 0 = 0x12345678",
  6837. .u.insns_int = {
  6838. BPF_ALU32_IMM(BPF_MOV, R0, 0x12345678),
  6839. BPF_ALU32_IMM(BPF_RSH, R0, 0),
  6840. BPF_EXIT_INSN(),
  6841. },
  6842. INTERNAL,
  6843. { },
  6844. { { 0, 0x12345678 } }
  6845. },
  6846. {
  6847. "ALU64_RSH_K: 2 >> 1 = 1",
  6848. .u.insns_int = {
  6849. BPF_LD_IMM64(R0, 2),
  6850. BPF_ALU64_IMM(BPF_RSH, R0, 1),
  6851. BPF_EXIT_INSN(),
  6852. },
  6853. INTERNAL,
  6854. { },
  6855. { { 0, 1 } },
  6856. },
  6857. {
  6858. "ALU64_RSH_K: 0x80000000 >> 31 = 1",
  6859. .u.insns_int = {
  6860. BPF_LD_IMM64(R0, 0x80000000),
  6861. BPF_ALU64_IMM(BPF_RSH, R0, 31),
  6862. BPF_EXIT_INSN(),
  6863. },
  6864. INTERNAL,
  6865. { },
  6866. { { 0, 1 } },
  6867. },
  6868. {
  6869. "ALU64_RSH_K: Shift < 32, low word",
  6870. .u.insns_int = {
  6871. BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
  6872. BPF_ALU64_IMM(BPF_RSH, R0, 12),
  6873. BPF_EXIT_INSN(),
  6874. },
  6875. INTERNAL,
  6876. { },
  6877. { { 0, 0x56789abc } }
  6878. },
  6879. {
  6880. "ALU64_RSH_K: Shift < 32, high word",
  6881. .u.insns_int = {
  6882. BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
  6883. BPF_ALU64_IMM(BPF_RSH, R0, 12),
  6884. BPF_ALU64_IMM(BPF_RSH, R0, 32),
  6885. BPF_EXIT_INSN(),
  6886. },
  6887. INTERNAL,
  6888. { },
  6889. { { 0, 0x00081234 } }
  6890. },
  6891. {
  6892. "ALU64_RSH_K: Shift > 32, low word",
  6893. .u.insns_int = {
  6894. BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
  6895. BPF_ALU64_IMM(BPF_RSH, R0, 36),
  6896. BPF_EXIT_INSN(),
  6897. },
  6898. INTERNAL,
  6899. { },
  6900. { { 0, 0x08123456 } }
  6901. },
  6902. {
  6903. "ALU64_RSH_K: Shift > 32, high word",
  6904. .u.insns_int = {
  6905. BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
  6906. BPF_ALU64_IMM(BPF_RSH, R0, 36),
  6907. BPF_ALU64_IMM(BPF_RSH, R0, 32),
  6908. BPF_EXIT_INSN(),
  6909. },
  6910. INTERNAL,
  6911. { },
  6912. { { 0, 0 } }
  6913. },
  6914. {
  6915. "ALU64_RSH_K: Shift == 32, low word",
  6916. .u.insns_int = {
  6917. BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
  6918. BPF_ALU64_IMM(BPF_RSH, R0, 32),
  6919. BPF_EXIT_INSN(),
  6920. },
  6921. INTERNAL,
  6922. { },
  6923. { { 0, 0x81234567 } }
  6924. },
  6925. {
  6926. "ALU64_RSH_K: Shift == 32, high word",
  6927. .u.insns_int = {
  6928. BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
  6929. BPF_ALU64_IMM(BPF_RSH, R0, 32),
  6930. BPF_ALU64_IMM(BPF_RSH, R0, 32),
  6931. BPF_EXIT_INSN(),
  6932. },
  6933. INTERNAL,
  6934. { },
  6935. { { 0, 0 } }
  6936. },
  6937. {
  6938. "ALU64_RSH_K: Zero shift",
  6939. .u.insns_int = {
  6940. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  6941. BPF_ALU64_IMM(BPF_RSH, R0, 0),
  6942. BPF_EXIT_INSN(),
  6943. },
  6944. INTERNAL,
  6945. { },
  6946. { { 0, 0x89abcdef } }
  6947. },
  6948. /* BPF_ALU | BPF_ARSH | BPF_X */
  6949. {
  6950. "ALU32_ARSH_X: -1234 >> 7 = -10",
  6951. .u.insns_int = {
  6952. BPF_ALU32_IMM(BPF_MOV, R0, -1234),
  6953. BPF_ALU32_IMM(BPF_MOV, R1, 7),
  6954. BPF_ALU32_REG(BPF_ARSH, R0, R1),
  6955. BPF_EXIT_INSN(),
  6956. },
  6957. INTERNAL,
  6958. { },
  6959. { { 0, -10 } }
  6960. },
  6961. {
  6962. "ALU64_ARSH_X: 0xff00ff0000000000 >> 40 = 0xffffffffffff00ff",
  6963. .u.insns_int = {
  6964. BPF_LD_IMM64(R0, 0xff00ff0000000000LL),
  6965. BPF_ALU32_IMM(BPF_MOV, R1, 40),
  6966. BPF_ALU64_REG(BPF_ARSH, R0, R1),
  6967. BPF_EXIT_INSN(),
  6968. },
  6969. INTERNAL,
  6970. { },
  6971. { { 0, 0xffff00ff } },
  6972. },
  6973. {
  6974. "ALU64_ARSH_X: Shift < 32, low word",
  6975. .u.insns_int = {
  6976. BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
  6977. BPF_ALU32_IMM(BPF_MOV, R1, 12),
  6978. BPF_ALU64_REG(BPF_ARSH, R0, R1),
  6979. BPF_EXIT_INSN(),
  6980. },
  6981. INTERNAL,
  6982. { },
  6983. { { 0, 0x56789abc } }
  6984. },
  6985. {
  6986. "ALU64_ARSH_X: Shift < 32, high word",
  6987. .u.insns_int = {
  6988. BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
  6989. BPF_ALU32_IMM(BPF_MOV, R1, 12),
  6990. BPF_ALU64_REG(BPF_ARSH, R0, R1),
  6991. BPF_ALU64_IMM(BPF_RSH, R0, 32),
  6992. BPF_EXIT_INSN(),
  6993. },
  6994. INTERNAL,
  6995. { },
  6996. { { 0, 0xfff81234 } }
  6997. },
  6998. {
  6999. "ALU64_ARSH_X: Shift > 32, low word",
  7000. .u.insns_int = {
  7001. BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
  7002. BPF_ALU32_IMM(BPF_MOV, R1, 36),
  7003. BPF_ALU64_REG(BPF_ARSH, R0, R1),
  7004. BPF_EXIT_INSN(),
  7005. },
  7006. INTERNAL,
  7007. { },
  7008. { { 0, 0xf8123456 } }
  7009. },
  7010. {
  7011. "ALU64_ARSH_X: Shift > 32, high word",
  7012. .u.insns_int = {
  7013. BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
  7014. BPF_ALU32_IMM(BPF_MOV, R1, 36),
  7015. BPF_ALU64_REG(BPF_ARSH, R0, R1),
  7016. BPF_ALU64_IMM(BPF_RSH, R0, 32),
  7017. BPF_EXIT_INSN(),
  7018. },
  7019. INTERNAL,
  7020. { },
  7021. { { 0, -1 } }
  7022. },
  7023. {
  7024. "ALU64_ARSH_X: Shift == 32, low word",
  7025. .u.insns_int = {
  7026. BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
  7027. BPF_ALU32_IMM(BPF_MOV, R1, 32),
  7028. BPF_ALU64_REG(BPF_ARSH, R0, R1),
  7029. BPF_EXIT_INSN(),
  7030. },
  7031. INTERNAL,
  7032. { },
  7033. { { 0, 0x81234567 } }
  7034. },
  7035. {
  7036. "ALU64_ARSH_X: Shift == 32, high word",
  7037. .u.insns_int = {
  7038. BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
  7039. BPF_ALU32_IMM(BPF_MOV, R1, 32),
  7040. BPF_ALU64_REG(BPF_ARSH, R0, R1),
  7041. BPF_ALU64_IMM(BPF_RSH, R0, 32),
  7042. BPF_EXIT_INSN(),
  7043. },
  7044. INTERNAL,
  7045. { },
  7046. { { 0, -1 } }
  7047. },
  7048. {
  7049. "ALU64_ARSH_X: Zero shift, low word",
  7050. .u.insns_int = {
  7051. BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
  7052. BPF_ALU32_IMM(BPF_MOV, R1, 0),
  7053. BPF_ALU64_REG(BPF_ARSH, R0, R1),
  7054. BPF_EXIT_INSN(),
  7055. },
  7056. INTERNAL,
  7057. { },
  7058. { { 0, 0x89abcdef } }
  7059. },
  7060. {
  7061. "ALU64_ARSH_X: Zero shift, high word",
  7062. .u.insns_int = {
  7063. BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
  7064. BPF_ALU32_IMM(BPF_MOV, R1, 0),
  7065. BPF_ALU64_REG(BPF_ARSH, R0, R1),
  7066. BPF_ALU64_IMM(BPF_RSH, R0, 32),
  7067. BPF_EXIT_INSN(),
  7068. },
  7069. INTERNAL,
  7070. { },
  7071. { { 0, 0x81234567 } }
  7072. },
  7073. /* BPF_ALU | BPF_ARSH | BPF_K */
  7074. {
  7075. "ALU32_ARSH_K: -1234 >> 7 = -10",
  7076. .u.insns_int = {
  7077. BPF_ALU32_IMM(BPF_MOV, R0, -1234),
  7078. BPF_ALU32_IMM(BPF_ARSH, R0, 7),
  7079. BPF_EXIT_INSN(),
  7080. },
  7081. INTERNAL,
  7082. { },
  7083. { { 0, -10 } }
  7084. },
  7085. {
  7086. "ALU32_ARSH_K: -1234 >> 0 = -1234",
  7087. .u.insns_int = {
  7088. BPF_ALU32_IMM(BPF_MOV, R0, -1234),
  7089. BPF_ALU32_IMM(BPF_ARSH, R0, 0),
  7090. BPF_EXIT_INSN(),
  7091. },
  7092. INTERNAL,
  7093. { },
  7094. { { 0, -1234 } }
  7095. },
  7096. {
  7097. "ALU64_ARSH_K: 0xff00ff0000000000 >> 40 = 0xffffffffffff00ff",
  7098. .u.insns_int = {
  7099. BPF_LD_IMM64(R0, 0xff00ff0000000000LL),
  7100. BPF_ALU64_IMM(BPF_ARSH, R0, 40),
  7101. BPF_EXIT_INSN(),
  7102. },
  7103. INTERNAL,
  7104. { },
  7105. { { 0, 0xffff00ff } },
  7106. },
  7107. {
  7108. "ALU64_ARSH_K: Shift < 32, low word",
  7109. .u.insns_int = {
  7110. BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
  7111. BPF_ALU64_IMM(BPF_RSH, R0, 12),
  7112. BPF_EXIT_INSN(),
  7113. },
  7114. INTERNAL,
  7115. { },
  7116. { { 0, 0x56789abc } }
  7117. },
  7118. {
  7119. "ALU64_ARSH_K: Shift < 32, high word",
  7120. .u.insns_int = {
  7121. BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
  7122. BPF_ALU64_IMM(BPF_ARSH, R0, 12),
  7123. BPF_ALU64_IMM(BPF_RSH, R0, 32),
  7124. BPF_EXIT_INSN(),
  7125. },
  7126. INTERNAL,
  7127. { },
  7128. { { 0, 0xfff81234 } }
  7129. },
  7130. {
  7131. "ALU64_ARSH_K: Shift > 32, low word",
  7132. .u.insns_int = {
  7133. BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
  7134. BPF_ALU64_IMM(BPF_ARSH, R0, 36),
  7135. BPF_EXIT_INSN(),
  7136. },
  7137. INTERNAL,
  7138. { },
  7139. { { 0, 0xf8123456 } }
  7140. },
  7141. {
  7142. "ALU64_ARSH_K: Shift > 32, high word",
  7143. .u.insns_int = {
  7144. BPF_LD_IMM64(R0, 0xf123456789abcdefLL),
  7145. BPF_ALU64_IMM(BPF_ARSH, R0, 36),
  7146. BPF_ALU64_IMM(BPF_RSH, R0, 32),
  7147. BPF_EXIT_INSN(),
  7148. },
  7149. INTERNAL,
  7150. { },
  7151. { { 0, -1 } }
  7152. },
  7153. {
  7154. "ALU64_ARSH_K: Shift == 32, low word",
  7155. .u.insns_int = {
  7156. BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
  7157. BPF_ALU64_IMM(BPF_ARSH, R0, 32),
  7158. BPF_EXIT_INSN(),
  7159. },
  7160. INTERNAL,
  7161. { },
  7162. { { 0, 0x81234567 } }
  7163. },
  7164. {
  7165. "ALU64_ARSH_K: Shift == 32, high word",
  7166. .u.insns_int = {
  7167. BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
  7168. BPF_ALU64_IMM(BPF_ARSH, R0, 32),
  7169. BPF_ALU64_IMM(BPF_RSH, R0, 32),
  7170. BPF_EXIT_INSN(),
  7171. },
  7172. INTERNAL,
  7173. { },
  7174. { { 0, -1 } }
  7175. },
  7176. {
  7177. "ALU64_ARSH_K: Zero shift",
  7178. .u.insns_int = {
  7179. BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
  7180. BPF_ALU64_IMM(BPF_ARSH, R0, 0),
  7181. BPF_EXIT_INSN(),
  7182. },
  7183. INTERNAL,
  7184. { },
  7185. { { 0, 0x89abcdef } }
  7186. },
  7187. /* BPF_ALU | BPF_NEG */
  7188. {
  7189. "ALU_NEG: -(3) = -3",
  7190. .u.insns_int = {
  7191. BPF_ALU32_IMM(BPF_MOV, R0, 3),
  7192. BPF_ALU32_IMM(BPF_NEG, R0, 0),
  7193. BPF_EXIT_INSN(),
  7194. },
  7195. INTERNAL,
  7196. { },
  7197. { { 0, -3 } },
  7198. },
  7199. {
  7200. "ALU_NEG: -(-3) = 3",
  7201. .u.insns_int = {
  7202. BPF_ALU32_IMM(BPF_MOV, R0, -3),
  7203. BPF_ALU32_IMM(BPF_NEG, R0, 0),
  7204. BPF_EXIT_INSN(),
  7205. },
  7206. INTERNAL,
  7207. { },
  7208. { { 0, 3 } },
  7209. },
  7210. {
  7211. "ALU64_NEG: -(3) = -3",
  7212. .u.insns_int = {
  7213. BPF_LD_IMM64(R0, 3),
  7214. BPF_ALU64_IMM(BPF_NEG, R0, 0),
  7215. BPF_EXIT_INSN(),
  7216. },
  7217. INTERNAL,
  7218. { },
  7219. { { 0, -3 } },
  7220. },
  7221. {
  7222. "ALU64_NEG: -(-3) = 3",
  7223. .u.insns_int = {
  7224. BPF_LD_IMM64(R0, -3),
  7225. BPF_ALU64_IMM(BPF_NEG, R0, 0),
  7226. BPF_EXIT_INSN(),
  7227. },
  7228. INTERNAL,
  7229. { },
  7230. { { 0, 3 } },
  7231. },
  7232. /* BPF_ALU | BPF_END | BPF_FROM_BE */
  7233. {
  7234. "ALU_END_FROM_BE 16: 0x0123456789abcdef -> 0xcdef",
  7235. .u.insns_int = {
  7236. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  7237. BPF_ENDIAN(BPF_FROM_BE, R0, 16),
  7238. BPF_EXIT_INSN(),
  7239. },
  7240. INTERNAL,
  7241. { },
  7242. { { 0, cpu_to_be16(0xcdef) } },
  7243. },
  7244. {
  7245. "ALU_END_FROM_BE 32: 0x0123456789abcdef -> 0x89abcdef",
  7246. .u.insns_int = {
  7247. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  7248. BPF_ENDIAN(BPF_FROM_BE, R0, 32),
  7249. BPF_ALU64_REG(BPF_MOV, R1, R0),
  7250. BPF_ALU64_IMM(BPF_RSH, R1, 32),
  7251. BPF_ALU32_REG(BPF_ADD, R0, R1), /* R1 = 0 */
  7252. BPF_EXIT_INSN(),
  7253. },
  7254. INTERNAL,
  7255. { },
  7256. { { 0, cpu_to_be32(0x89abcdef) } },
  7257. },
  7258. {
  7259. "ALU_END_FROM_BE 64: 0x0123456789abcdef -> 0x89abcdef",
  7260. .u.insns_int = {
  7261. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  7262. BPF_ENDIAN(BPF_FROM_BE, R0, 64),
  7263. BPF_EXIT_INSN(),
  7264. },
  7265. INTERNAL,
  7266. { },
  7267. { { 0, (u32) cpu_to_be64(0x0123456789abcdefLL) } },
  7268. },
  7269. {
  7270. "ALU_END_FROM_BE 64: 0x0123456789abcdef >> 32 -> 0x01234567",
  7271. .u.insns_int = {
  7272. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  7273. BPF_ENDIAN(BPF_FROM_BE, R0, 64),
  7274. BPF_ALU64_IMM(BPF_RSH, R0, 32),
  7275. BPF_EXIT_INSN(),
  7276. },
  7277. INTERNAL,
  7278. { },
  7279. { { 0, (u32) (cpu_to_be64(0x0123456789abcdefLL) >> 32) } },
  7280. },
  7281. /* BPF_ALU | BPF_END | BPF_FROM_BE, reversed */
  7282. {
  7283. "ALU_END_FROM_BE 16: 0xfedcba9876543210 -> 0x3210",
  7284. .u.insns_int = {
  7285. BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
  7286. BPF_ENDIAN(BPF_FROM_BE, R0, 16),
  7287. BPF_EXIT_INSN(),
  7288. },
  7289. INTERNAL,
  7290. { },
  7291. { { 0, cpu_to_be16(0x3210) } },
  7292. },
  7293. {
  7294. "ALU_END_FROM_BE 32: 0xfedcba9876543210 -> 0x76543210",
  7295. .u.insns_int = {
  7296. BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
  7297. BPF_ENDIAN(BPF_FROM_BE, R0, 32),
  7298. BPF_ALU64_REG(BPF_MOV, R1, R0),
  7299. BPF_ALU64_IMM(BPF_RSH, R1, 32),
  7300. BPF_ALU32_REG(BPF_ADD, R0, R1), /* R1 = 0 */
  7301. BPF_EXIT_INSN(),
  7302. },
  7303. INTERNAL,
  7304. { },
  7305. { { 0, cpu_to_be32(0x76543210) } },
  7306. },
  7307. {
  7308. "ALU_END_FROM_BE 64: 0xfedcba9876543210 -> 0x76543210",
  7309. .u.insns_int = {
  7310. BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
  7311. BPF_ENDIAN(BPF_FROM_BE, R0, 64),
  7312. BPF_EXIT_INSN(),
  7313. },
  7314. INTERNAL,
  7315. { },
  7316. { { 0, (u32) cpu_to_be64(0xfedcba9876543210ULL) } },
  7317. },
  7318. {
  7319. "ALU_END_FROM_BE 64: 0xfedcba9876543210 >> 32 -> 0xfedcba98",
  7320. .u.insns_int = {
  7321. BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
  7322. BPF_ENDIAN(BPF_FROM_BE, R0, 64),
  7323. BPF_ALU64_IMM(BPF_RSH, R0, 32),
  7324. BPF_EXIT_INSN(),
  7325. },
  7326. INTERNAL,
  7327. { },
  7328. { { 0, (u32) (cpu_to_be64(0xfedcba9876543210ULL) >> 32) } },
  7329. },
  7330. /* BPF_ALU | BPF_END | BPF_FROM_LE */
  7331. {
  7332. "ALU_END_FROM_LE 16: 0x0123456789abcdef -> 0xefcd",
  7333. .u.insns_int = {
  7334. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  7335. BPF_ENDIAN(BPF_FROM_LE, R0, 16),
  7336. BPF_EXIT_INSN(),
  7337. },
  7338. INTERNAL,
  7339. { },
  7340. { { 0, cpu_to_le16(0xcdef) } },
  7341. },
  7342. {
  7343. "ALU_END_FROM_LE 32: 0x0123456789abcdef -> 0xefcdab89",
  7344. .u.insns_int = {
  7345. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  7346. BPF_ENDIAN(BPF_FROM_LE, R0, 32),
  7347. BPF_ALU64_REG(BPF_MOV, R1, R0),
  7348. BPF_ALU64_IMM(BPF_RSH, R1, 32),
  7349. BPF_ALU32_REG(BPF_ADD, R0, R1), /* R1 = 0 */
  7350. BPF_EXIT_INSN(),
  7351. },
  7352. INTERNAL,
  7353. { },
  7354. { { 0, cpu_to_le32(0x89abcdef) } },
  7355. },
  7356. {
  7357. "ALU_END_FROM_LE 64: 0x0123456789abcdef -> 0x67452301",
  7358. .u.insns_int = {
  7359. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  7360. BPF_ENDIAN(BPF_FROM_LE, R0, 64),
  7361. BPF_EXIT_INSN(),
  7362. },
  7363. INTERNAL,
  7364. { },
  7365. { { 0, (u32) cpu_to_le64(0x0123456789abcdefLL) } },
  7366. },
  7367. {
  7368. "ALU_END_FROM_LE 64: 0x0123456789abcdef >> 32 -> 0xefcdab89",
  7369. .u.insns_int = {
  7370. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  7371. BPF_ENDIAN(BPF_FROM_LE, R0, 64),
  7372. BPF_ALU64_IMM(BPF_RSH, R0, 32),
  7373. BPF_EXIT_INSN(),
  7374. },
  7375. INTERNAL,
  7376. { },
  7377. { { 0, (u32) (cpu_to_le64(0x0123456789abcdefLL) >> 32) } },
  7378. },
  7379. /* BPF_ALU | BPF_END | BPF_FROM_LE, reversed */
  7380. {
  7381. "ALU_END_FROM_LE 16: 0xfedcba9876543210 -> 0x1032",
  7382. .u.insns_int = {
  7383. BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
  7384. BPF_ENDIAN(BPF_FROM_LE, R0, 16),
  7385. BPF_EXIT_INSN(),
  7386. },
  7387. INTERNAL,
  7388. { },
  7389. { { 0, cpu_to_le16(0x3210) } },
  7390. },
  7391. {
  7392. "ALU_END_FROM_LE 32: 0xfedcba9876543210 -> 0x10325476",
  7393. .u.insns_int = {
  7394. BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
  7395. BPF_ENDIAN(BPF_FROM_LE, R0, 32),
  7396. BPF_ALU64_REG(BPF_MOV, R1, R0),
  7397. BPF_ALU64_IMM(BPF_RSH, R1, 32),
  7398. BPF_ALU32_REG(BPF_ADD, R0, R1), /* R1 = 0 */
  7399. BPF_EXIT_INSN(),
  7400. },
  7401. INTERNAL,
  7402. { },
  7403. { { 0, cpu_to_le32(0x76543210) } },
  7404. },
  7405. {
  7406. "ALU_END_FROM_LE 64: 0xfedcba9876543210 -> 0x10325476",
  7407. .u.insns_int = {
  7408. BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
  7409. BPF_ENDIAN(BPF_FROM_LE, R0, 64),
  7410. BPF_EXIT_INSN(),
  7411. },
  7412. INTERNAL,
  7413. { },
  7414. { { 0, (u32) cpu_to_le64(0xfedcba9876543210ULL) } },
  7415. },
  7416. {
  7417. "ALU_END_FROM_LE 64: 0xfedcba9876543210 >> 32 -> 0x98badcfe",
  7418. .u.insns_int = {
  7419. BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
  7420. BPF_ENDIAN(BPF_FROM_LE, R0, 64),
  7421. BPF_ALU64_IMM(BPF_RSH, R0, 32),
  7422. BPF_EXIT_INSN(),
  7423. },
  7424. INTERNAL,
  7425. { },
  7426. { { 0, (u32) (cpu_to_le64(0xfedcba9876543210ULL) >> 32) } },
  7427. },
  7428. /* BSWAP */
  7429. {
  7430. "BSWAP 16: 0x0123456789abcdef -> 0xefcd",
  7431. .u.insns_int = {
  7432. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  7433. BPF_BSWAP(R0, 16),
  7434. BPF_EXIT_INSN(),
  7435. },
  7436. INTERNAL,
  7437. { },
  7438. { { 0, 0xefcd } },
  7439. },
  7440. {
  7441. "BSWAP 32: 0x0123456789abcdef -> 0xefcdab89",
  7442. .u.insns_int = {
  7443. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  7444. BPF_BSWAP(R0, 32),
  7445. BPF_ALU64_REG(BPF_MOV, R1, R0),
  7446. BPF_ALU64_IMM(BPF_RSH, R1, 32),
  7447. BPF_ALU32_REG(BPF_ADD, R0, R1), /* R1 = 0 */
  7448. BPF_EXIT_INSN(),
  7449. },
  7450. INTERNAL,
  7451. { },
  7452. { { 0, 0xefcdab89 } },
  7453. },
  7454. {
  7455. "BSWAP 64: 0x0123456789abcdef -> 0x67452301",
  7456. .u.insns_int = {
  7457. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  7458. BPF_BSWAP(R0, 64),
  7459. BPF_EXIT_INSN(),
  7460. },
  7461. INTERNAL,
  7462. { },
  7463. { { 0, 0x67452301 } },
  7464. },
  7465. {
  7466. "BSWAP 64: 0x0123456789abcdef >> 32 -> 0xefcdab89",
  7467. .u.insns_int = {
  7468. BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
  7469. BPF_BSWAP(R0, 64),
  7470. BPF_ALU64_IMM(BPF_RSH, R0, 32),
  7471. BPF_EXIT_INSN(),
  7472. },
  7473. INTERNAL,
  7474. { },
  7475. { { 0, 0xefcdab89 } },
  7476. },
  7477. /* BSWAP, reversed */
  7478. {
  7479. "BSWAP 16: 0xfedcba9876543210 -> 0x1032",
  7480. .u.insns_int = {
  7481. BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
  7482. BPF_BSWAP(R0, 16),
  7483. BPF_EXIT_INSN(),
  7484. },
  7485. INTERNAL,
  7486. { },
  7487. { { 0, 0x1032 } },
  7488. },
  7489. {
  7490. "BSWAP 32: 0xfedcba9876543210 -> 0x10325476",
  7491. .u.insns_int = {
  7492. BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
  7493. BPF_BSWAP(R0, 32),
  7494. BPF_ALU64_REG(BPF_MOV, R1, R0),
  7495. BPF_ALU64_IMM(BPF_RSH, R1, 32),
  7496. BPF_ALU32_REG(BPF_ADD, R0, R1), /* R1 = 0 */
  7497. BPF_EXIT_INSN(),
  7498. },
  7499. INTERNAL,
  7500. { },
  7501. { { 0, 0x10325476 } },
  7502. },
  7503. {
  7504. "BSWAP 64: 0xfedcba9876543210 -> 0x98badcfe",
  7505. .u.insns_int = {
  7506. BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
  7507. BPF_BSWAP(R0, 64),
  7508. BPF_EXIT_INSN(),
  7509. },
  7510. INTERNAL,
  7511. { },
  7512. { { 0, 0x98badcfe } },
  7513. },
  7514. {
  7515. "BSWAP 64: 0xfedcba9876543210 >> 32 -> 0x10325476",
  7516. .u.insns_int = {
  7517. BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
  7518. BPF_BSWAP(R0, 64),
  7519. BPF_ALU64_IMM(BPF_RSH, R0, 32),
  7520. BPF_EXIT_INSN(),
  7521. },
  7522. INTERNAL,
  7523. { },
  7524. { { 0, 0x10325476 } },
  7525. },
  7526. /* BPF_LDX_MEM B/H/W/DW */
  7527. {
  7528. "BPF_LDX_MEM | BPF_B, base",
  7529. .u.insns_int = {
  7530. BPF_LD_IMM64(R1, 0x0102030405060708ULL),
  7531. BPF_LD_IMM64(R2, 0x0000000000000008ULL),
  7532. BPF_STX_MEM(BPF_DW, R10, R1, -8),
  7533. #ifdef __BIG_ENDIAN
  7534. BPF_LDX_MEM(BPF_B, R0, R10, -1),
  7535. #else
  7536. BPF_LDX_MEM(BPF_B, R0, R10, -8),
  7537. #endif
  7538. BPF_JMP_REG(BPF_JNE, R0, R2, 1),
  7539. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  7540. BPF_EXIT_INSN(),
  7541. },
  7542. INTERNAL,
  7543. { },
  7544. { { 0, 0 } },
  7545. .stack_depth = 8,
  7546. },
  7547. {
  7548. "BPF_LDX_MEM | BPF_B, MSB set",
  7549. .u.insns_int = {
  7550. BPF_LD_IMM64(R1, 0x8182838485868788ULL),
  7551. BPF_LD_IMM64(R2, 0x0000000000000088ULL),
  7552. BPF_STX_MEM(BPF_DW, R10, R1, -8),
  7553. #ifdef __BIG_ENDIAN
  7554. BPF_LDX_MEM(BPF_B, R0, R10, -1),
  7555. #else
  7556. BPF_LDX_MEM(BPF_B, R0, R10, -8),
  7557. #endif
  7558. BPF_JMP_REG(BPF_JNE, R0, R2, 1),
  7559. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  7560. BPF_EXIT_INSN(),
  7561. },
  7562. INTERNAL,
  7563. { },
  7564. { { 0, 0 } },
  7565. .stack_depth = 8,
  7566. },
  7567. {
  7568. "BPF_LDX_MEM | BPF_B, negative offset",
  7569. .u.insns_int = {
  7570. BPF_LD_IMM64(R2, 0x8182838485868788ULL),
  7571. BPF_LD_IMM64(R3, 0x0000000000000088ULL),
  7572. BPF_ALU64_IMM(BPF_ADD, R1, 512),
  7573. BPF_STX_MEM(BPF_B, R1, R2, -256),
  7574. BPF_LDX_MEM(BPF_B, R0, R1, -256),
  7575. BPF_JMP_REG(BPF_JNE, R0, R3, 1),
  7576. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  7577. BPF_EXIT_INSN(),
  7578. },
  7579. INTERNAL | FLAG_LARGE_MEM,
  7580. { },
  7581. { { 512, 0 } },
  7582. .stack_depth = 0,
  7583. },
  7584. {
  7585. "BPF_LDX_MEM | BPF_B, small positive offset",
  7586. .u.insns_int = {
  7587. BPF_LD_IMM64(R2, 0x8182838485868788ULL),
  7588. BPF_LD_IMM64(R3, 0x0000000000000088ULL),
  7589. BPF_STX_MEM(BPF_B, R1, R2, 256),
  7590. BPF_LDX_MEM(BPF_B, R0, R1, 256),
  7591. BPF_JMP_REG(BPF_JNE, R0, R3, 1),
  7592. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  7593. BPF_EXIT_INSN(),
  7594. },
  7595. INTERNAL | FLAG_LARGE_MEM,
  7596. { },
  7597. { { 512, 0 } },
  7598. .stack_depth = 0,
  7599. },
  7600. {
  7601. "BPF_LDX_MEM | BPF_B, large positive offset",
  7602. .u.insns_int = {
  7603. BPF_LD_IMM64(R2, 0x8182838485868788ULL),
  7604. BPF_LD_IMM64(R3, 0x0000000000000088ULL),
  7605. BPF_STX_MEM(BPF_B, R1, R2, 4096),
  7606. BPF_LDX_MEM(BPF_B, R0, R1, 4096),
  7607. BPF_JMP_REG(BPF_JNE, R0, R3, 1),
  7608. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  7609. BPF_EXIT_INSN(),
  7610. },
  7611. INTERNAL | FLAG_LARGE_MEM,
  7612. { },
  7613. { { 4096 + 16, 0 } },
  7614. .stack_depth = 0,
  7615. },
  7616. {
  7617. "BPF_LDX_MEM | BPF_H, base",
  7618. .u.insns_int = {
  7619. BPF_LD_IMM64(R1, 0x0102030405060708ULL),
  7620. BPF_LD_IMM64(R2, 0x0000000000000708ULL),
  7621. BPF_STX_MEM(BPF_DW, R10, R1, -8),
  7622. #ifdef __BIG_ENDIAN
  7623. BPF_LDX_MEM(BPF_H, R0, R10, -2),
  7624. #else
  7625. BPF_LDX_MEM(BPF_H, R0, R10, -8),
  7626. #endif
  7627. BPF_JMP_REG(BPF_JNE, R0, R2, 1),
  7628. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  7629. BPF_EXIT_INSN(),
  7630. },
  7631. INTERNAL,
  7632. { },
  7633. { { 0, 0 } },
  7634. .stack_depth = 8,
  7635. },
  7636. {
  7637. "BPF_LDX_MEM | BPF_H, MSB set",
  7638. .u.insns_int = {
  7639. BPF_LD_IMM64(R1, 0x8182838485868788ULL),
  7640. BPF_LD_IMM64(R2, 0x0000000000008788ULL),
  7641. BPF_STX_MEM(BPF_DW, R10, R1, -8),
  7642. #ifdef __BIG_ENDIAN
  7643. BPF_LDX_MEM(BPF_H, R0, R10, -2),
  7644. #else
  7645. BPF_LDX_MEM(BPF_H, R0, R10, -8),
  7646. #endif
  7647. BPF_JMP_REG(BPF_JNE, R0, R2, 1),
  7648. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  7649. BPF_EXIT_INSN(),
  7650. },
  7651. INTERNAL,
  7652. { },
  7653. { { 0, 0 } },
  7654. .stack_depth = 8,
  7655. },
  7656. {
  7657. "BPF_LDX_MEM | BPF_H, negative offset",
  7658. .u.insns_int = {
  7659. BPF_LD_IMM64(R2, 0x8182838485868788ULL),
  7660. BPF_LD_IMM64(R3, 0x0000000000008788ULL),
  7661. BPF_ALU64_IMM(BPF_ADD, R1, 512),
  7662. BPF_STX_MEM(BPF_H, R1, R2, -256),
  7663. BPF_LDX_MEM(BPF_H, R0, R1, -256),
  7664. BPF_JMP_REG(BPF_JNE, R0, R3, 1),
  7665. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  7666. BPF_EXIT_INSN(),
  7667. },
  7668. INTERNAL | FLAG_LARGE_MEM,
  7669. { },
  7670. { { 512, 0 } },
  7671. .stack_depth = 0,
  7672. },
  7673. {
  7674. "BPF_LDX_MEM | BPF_H, small positive offset",
  7675. .u.insns_int = {
  7676. BPF_LD_IMM64(R2, 0x8182838485868788ULL),
  7677. BPF_LD_IMM64(R3, 0x0000000000008788ULL),
  7678. BPF_STX_MEM(BPF_H, R1, R2, 256),
  7679. BPF_LDX_MEM(BPF_H, R0, R1, 256),
  7680. BPF_JMP_REG(BPF_JNE, R0, R3, 1),
  7681. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  7682. BPF_EXIT_INSN(),
  7683. },
  7684. INTERNAL | FLAG_LARGE_MEM,
  7685. { },
  7686. { { 512, 0 } },
  7687. .stack_depth = 0,
  7688. },
  7689. {
  7690. "BPF_LDX_MEM | BPF_H, large positive offset",
  7691. .u.insns_int = {
  7692. BPF_LD_IMM64(R2, 0x8182838485868788ULL),
  7693. BPF_LD_IMM64(R3, 0x0000000000008788ULL),
  7694. BPF_STX_MEM(BPF_H, R1, R2, 8192),
  7695. BPF_LDX_MEM(BPF_H, R0, R1, 8192),
  7696. BPF_JMP_REG(BPF_JNE, R0, R3, 1),
  7697. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  7698. BPF_EXIT_INSN(),
  7699. },
  7700. INTERNAL | FLAG_LARGE_MEM,
  7701. { },
  7702. { { 8192 + 16, 0 } },
  7703. .stack_depth = 0,
  7704. },
  7705. {
  7706. "BPF_LDX_MEM | BPF_H, unaligned positive offset",
  7707. .u.insns_int = {
  7708. BPF_LD_IMM64(R2, 0x8182838485868788ULL),
  7709. BPF_LD_IMM64(R3, 0x0000000000008788ULL),
  7710. BPF_STX_MEM(BPF_H, R1, R2, 13),
  7711. BPF_LDX_MEM(BPF_H, R0, R1, 13),
  7712. BPF_JMP_REG(BPF_JNE, R0, R3, 1),
  7713. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  7714. BPF_EXIT_INSN(),
  7715. },
  7716. INTERNAL | FLAG_LARGE_MEM,
  7717. { },
  7718. { { 32, 0 } },
  7719. .stack_depth = 0,
  7720. },
  7721. {
  7722. "BPF_LDX_MEM | BPF_W, base",
  7723. .u.insns_int = {
  7724. BPF_LD_IMM64(R1, 0x0102030405060708ULL),
  7725. BPF_LD_IMM64(R2, 0x0000000005060708ULL),
  7726. BPF_STX_MEM(BPF_DW, R10, R1, -8),
  7727. #ifdef __BIG_ENDIAN
  7728. BPF_LDX_MEM(BPF_W, R0, R10, -4),
  7729. #else
  7730. BPF_LDX_MEM(BPF_W, R0, R10, -8),
  7731. #endif
  7732. BPF_JMP_REG(BPF_JNE, R0, R2, 1),
  7733. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  7734. BPF_EXIT_INSN(),
  7735. },
  7736. INTERNAL,
  7737. { },
  7738. { { 0, 0 } },
  7739. .stack_depth = 8,
  7740. },
  7741. {
  7742. "BPF_LDX_MEM | BPF_W, MSB set",
  7743. .u.insns_int = {
  7744. BPF_LD_IMM64(R1, 0x8182838485868788ULL),
  7745. BPF_LD_IMM64(R2, 0x0000000085868788ULL),
  7746. BPF_STX_MEM(BPF_DW, R10, R1, -8),
  7747. #ifdef __BIG_ENDIAN
  7748. BPF_LDX_MEM(BPF_W, R0, R10, -4),
  7749. #else
  7750. BPF_LDX_MEM(BPF_W, R0, R10, -8),
  7751. #endif
  7752. BPF_JMP_REG(BPF_JNE, R0, R2, 1),
  7753. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  7754. BPF_EXIT_INSN(),
  7755. },
  7756. INTERNAL,
  7757. { },
  7758. { { 0, 0 } },
  7759. .stack_depth = 8,
  7760. },
  7761. {
  7762. "BPF_LDX_MEM | BPF_W, negative offset",
  7763. .u.insns_int = {
  7764. BPF_LD_IMM64(R2, 0x8182838485868788ULL),
  7765. BPF_LD_IMM64(R3, 0x0000000085868788ULL),
  7766. BPF_ALU64_IMM(BPF_ADD, R1, 512),
  7767. BPF_STX_MEM(BPF_W, R1, R2, -256),
  7768. BPF_LDX_MEM(BPF_W, R0, R1, -256),
  7769. BPF_JMP_REG(BPF_JNE, R0, R3, 1),
  7770. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  7771. BPF_EXIT_INSN(),
  7772. },
  7773. INTERNAL | FLAG_LARGE_MEM,
  7774. { },
  7775. { { 512, 0 } },
  7776. .stack_depth = 0,
  7777. },
  7778. {
  7779. "BPF_LDX_MEM | BPF_W, small positive offset",
  7780. .u.insns_int = {
  7781. BPF_LD_IMM64(R2, 0x8182838485868788ULL),
  7782. BPF_LD_IMM64(R3, 0x0000000085868788ULL),
  7783. BPF_STX_MEM(BPF_W, R1, R2, 256),
  7784. BPF_LDX_MEM(BPF_W, R0, R1, 256),
  7785. BPF_JMP_REG(BPF_JNE, R0, R3, 1),
  7786. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  7787. BPF_EXIT_INSN(),
  7788. },
  7789. INTERNAL | FLAG_LARGE_MEM,
  7790. { },
  7791. { { 512, 0 } },
  7792. .stack_depth = 0,
  7793. },
  7794. {
  7795. "BPF_LDX_MEM | BPF_W, large positive offset",
  7796. .u.insns_int = {
  7797. BPF_LD_IMM64(R2, 0x8182838485868788ULL),
  7798. BPF_LD_IMM64(R3, 0x0000000085868788ULL),
  7799. BPF_STX_MEM(BPF_W, R1, R2, 16384),
  7800. BPF_LDX_MEM(BPF_W, R0, R1, 16384),
  7801. BPF_JMP_REG(BPF_JNE, R0, R3, 1),
  7802. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  7803. BPF_EXIT_INSN(),
  7804. },
  7805. INTERNAL | FLAG_LARGE_MEM,
  7806. { },
  7807. { { 16384 + 16, 0 } },
  7808. .stack_depth = 0,
  7809. },
  7810. {
  7811. "BPF_LDX_MEM | BPF_W, unaligned positive offset",
  7812. .u.insns_int = {
  7813. BPF_LD_IMM64(R2, 0x8182838485868788ULL),
  7814. BPF_LD_IMM64(R3, 0x0000000085868788ULL),
  7815. BPF_STX_MEM(BPF_W, R1, R2, 13),
  7816. BPF_LDX_MEM(BPF_W, R0, R1, 13),
  7817. BPF_JMP_REG(BPF_JNE, R0, R3, 1),
  7818. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  7819. BPF_EXIT_INSN(),
  7820. },
  7821. INTERNAL | FLAG_LARGE_MEM,
  7822. { },
  7823. { { 32, 0 } },
  7824. .stack_depth = 0,
  7825. },
  7826. {
  7827. "BPF_LDX_MEM | BPF_DW, base",
  7828. .u.insns_int = {
  7829. BPF_LD_IMM64(R1, 0x0102030405060708ULL),
  7830. BPF_STX_MEM(BPF_DW, R10, R1, -8),
  7831. BPF_LDX_MEM(BPF_DW, R0, R10, -8),
  7832. BPF_JMP_REG(BPF_JNE, R0, R1, 1),
  7833. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  7834. BPF_EXIT_INSN(),
  7835. },
  7836. INTERNAL,
  7837. { },
  7838. { { 0, 0 } },
  7839. .stack_depth = 8,
  7840. },
  7841. {
  7842. "BPF_LDX_MEM | BPF_DW, MSB set",
  7843. .u.insns_int = {
  7844. BPF_LD_IMM64(R1, 0x8182838485868788ULL),
  7845. BPF_STX_MEM(BPF_DW, R10, R1, -8),
  7846. BPF_LDX_MEM(BPF_DW, R0, R10, -8),
  7847. BPF_JMP_REG(BPF_JNE, R0, R1, 1),
  7848. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  7849. BPF_EXIT_INSN(),
  7850. },
  7851. INTERNAL,
  7852. { },
  7853. { { 0, 0 } },
  7854. .stack_depth = 8,
  7855. },
  7856. {
  7857. "BPF_LDX_MEM | BPF_DW, negative offset",
  7858. .u.insns_int = {
  7859. BPF_LD_IMM64(R2, 0x8182838485868788ULL),
  7860. BPF_ALU64_IMM(BPF_ADD, R1, 512),
  7861. BPF_STX_MEM(BPF_DW, R1, R2, -256),
  7862. BPF_LDX_MEM(BPF_DW, R0, R1, -256),
  7863. BPF_JMP_REG(BPF_JNE, R0, R2, 1),
  7864. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  7865. BPF_EXIT_INSN(),
  7866. },
  7867. INTERNAL | FLAG_LARGE_MEM,
  7868. { },
  7869. { { 512, 0 } },
  7870. .stack_depth = 0,
  7871. },
  7872. {
  7873. "BPF_LDX_MEM | BPF_DW, small positive offset",
  7874. .u.insns_int = {
  7875. BPF_LD_IMM64(R2, 0x8182838485868788ULL),
  7876. BPF_STX_MEM(BPF_DW, R1, R2, 256),
  7877. BPF_LDX_MEM(BPF_DW, R0, R1, 256),
  7878. BPF_JMP_REG(BPF_JNE, R0, R2, 1),
  7879. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  7880. BPF_EXIT_INSN(),
  7881. },
  7882. INTERNAL | FLAG_LARGE_MEM,
  7883. { },
  7884. { { 512, 0 } },
  7885. .stack_depth = 8,
  7886. },
  7887. {
  7888. "BPF_LDX_MEM | BPF_DW, large positive offset",
  7889. .u.insns_int = {
  7890. BPF_LD_IMM64(R2, 0x8182838485868788ULL),
  7891. BPF_STX_MEM(BPF_DW, R1, R2, 32760),
  7892. BPF_LDX_MEM(BPF_DW, R0, R1, 32760),
  7893. BPF_JMP_REG(BPF_JNE, R0, R2, 1),
  7894. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  7895. BPF_EXIT_INSN(),
  7896. },
  7897. INTERNAL | FLAG_LARGE_MEM,
  7898. { },
  7899. { { 32768, 0 } },
  7900. .stack_depth = 0,
  7901. },
  7902. {
  7903. "BPF_LDX_MEM | BPF_DW, unaligned positive offset",
  7904. .u.insns_int = {
  7905. BPF_LD_IMM64(R2, 0x8182838485868788ULL),
  7906. BPF_STX_MEM(BPF_DW, R1, R2, 13),
  7907. BPF_LDX_MEM(BPF_DW, R0, R1, 13),
  7908. BPF_JMP_REG(BPF_JNE, R0, R2, 1),
  7909. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  7910. BPF_EXIT_INSN(),
  7911. },
  7912. INTERNAL | FLAG_LARGE_MEM,
  7913. { },
  7914. { { 32, 0 } },
  7915. .stack_depth = 0,
  7916. },
  7917. /* BPF_LDX_MEMSX B/H/W */
  7918. {
  7919. "BPF_LDX_MEMSX | BPF_B",
  7920. .u.insns_int = {
  7921. BPF_LD_IMM64(R1, 0xdead0000000000f0ULL),
  7922. BPF_LD_IMM64(R2, 0xfffffffffffffff0ULL),
  7923. BPF_STX_MEM(BPF_DW, R10, R1, -8),
  7924. #ifdef __BIG_ENDIAN
  7925. BPF_LDX_MEMSX(BPF_B, R0, R10, -1),
  7926. #else
  7927. BPF_LDX_MEMSX(BPF_B, R0, R10, -8),
  7928. #endif
  7929. BPF_JMP_REG(BPF_JNE, R0, R2, 1),
  7930. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  7931. BPF_EXIT_INSN(),
  7932. },
  7933. INTERNAL,
  7934. { },
  7935. { { 0, 0 } },
  7936. .stack_depth = 8,
  7937. },
  7938. {
  7939. "BPF_LDX_MEMSX | BPF_H",
  7940. .u.insns_int = {
  7941. BPF_LD_IMM64(R1, 0xdead00000000f123ULL),
  7942. BPF_LD_IMM64(R2, 0xfffffffffffff123ULL),
  7943. BPF_STX_MEM(BPF_DW, R10, R1, -8),
  7944. #ifdef __BIG_ENDIAN
  7945. BPF_LDX_MEMSX(BPF_H, R0, R10, -2),
  7946. #else
  7947. BPF_LDX_MEMSX(BPF_H, R0, R10, -8),
  7948. #endif
  7949. BPF_JMP_REG(BPF_JNE, R0, R2, 1),
  7950. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  7951. BPF_EXIT_INSN(),
  7952. },
  7953. INTERNAL,
  7954. { },
  7955. { { 0, 0 } },
  7956. .stack_depth = 8,
  7957. },
  7958. {
  7959. "BPF_LDX_MEMSX | BPF_W",
  7960. .u.insns_int = {
  7961. BPF_LD_IMM64(R1, 0x00000000deadbeefULL),
  7962. BPF_LD_IMM64(R2, 0xffffffffdeadbeefULL),
  7963. BPF_STX_MEM(BPF_DW, R10, R1, -8),
  7964. #ifdef __BIG_ENDIAN
  7965. BPF_LDX_MEMSX(BPF_W, R0, R10, -4),
  7966. #else
  7967. BPF_LDX_MEMSX(BPF_W, R0, R10, -8),
  7968. #endif
  7969. BPF_JMP_REG(BPF_JNE, R0, R2, 1),
  7970. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  7971. BPF_EXIT_INSN(),
  7972. },
  7973. INTERNAL,
  7974. { },
  7975. { { 0, 0 } },
  7976. .stack_depth = 8,
  7977. },
  7978. /* BPF_STX_MEM B/H/W/DW */
  7979. {
  7980. "BPF_STX_MEM | BPF_B",
  7981. .u.insns_int = {
  7982. BPF_LD_IMM64(R1, 0x8090a0b0c0d0e0f0ULL),
  7983. BPF_LD_IMM64(R2, 0x0102030405060708ULL),
  7984. BPF_LD_IMM64(R3, 0x8090a0b0c0d0e008ULL),
  7985. BPF_STX_MEM(BPF_DW, R10, R1, -8),
  7986. #ifdef __BIG_ENDIAN
  7987. BPF_STX_MEM(BPF_B, R10, R2, -1),
  7988. #else
  7989. BPF_STX_MEM(BPF_B, R10, R2, -8),
  7990. #endif
  7991. BPF_LDX_MEM(BPF_DW, R0, R10, -8),
  7992. BPF_JMP_REG(BPF_JNE, R0, R3, 1),
  7993. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  7994. BPF_EXIT_INSN(),
  7995. },
  7996. INTERNAL,
  7997. { },
  7998. { { 0, 0 } },
  7999. .stack_depth = 8,
  8000. },
  8001. {
  8002. "BPF_STX_MEM | BPF_B, MSB set",
  8003. .u.insns_int = {
  8004. BPF_LD_IMM64(R1, 0x8090a0b0c0d0e0f0ULL),
  8005. BPF_LD_IMM64(R2, 0x8182838485868788ULL),
  8006. BPF_LD_IMM64(R3, 0x8090a0b0c0d0e088ULL),
  8007. BPF_STX_MEM(BPF_DW, R10, R1, -8),
  8008. #ifdef __BIG_ENDIAN
  8009. BPF_STX_MEM(BPF_B, R10, R2, -1),
  8010. #else
  8011. BPF_STX_MEM(BPF_B, R10, R2, -8),
  8012. #endif
  8013. BPF_LDX_MEM(BPF_DW, R0, R10, -8),
  8014. BPF_JMP_REG(BPF_JNE, R0, R3, 1),
  8015. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  8016. BPF_EXIT_INSN(),
  8017. },
  8018. INTERNAL,
  8019. { },
  8020. { { 0, 0 } },
  8021. .stack_depth = 8,
  8022. },
  8023. {
  8024. "BPF_STX_MEM | BPF_H",
  8025. .u.insns_int = {
  8026. BPF_LD_IMM64(R1, 0x8090a0b0c0d0e0f0ULL),
  8027. BPF_LD_IMM64(R2, 0x0102030405060708ULL),
  8028. BPF_LD_IMM64(R3, 0x8090a0b0c0d00708ULL),
  8029. BPF_STX_MEM(BPF_DW, R10, R1, -8),
  8030. #ifdef __BIG_ENDIAN
  8031. BPF_STX_MEM(BPF_H, R10, R2, -2),
  8032. #else
  8033. BPF_STX_MEM(BPF_H, R10, R2, -8),
  8034. #endif
  8035. BPF_LDX_MEM(BPF_DW, R0, R10, -8),
  8036. BPF_JMP_REG(BPF_JNE, R0, R3, 1),
  8037. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  8038. BPF_EXIT_INSN(),
  8039. },
  8040. INTERNAL,
  8041. { },
  8042. { { 0, 0 } },
  8043. .stack_depth = 8,
  8044. },
  8045. {
  8046. "BPF_STX_MEM | BPF_H, MSB set",
  8047. .u.insns_int = {
  8048. BPF_LD_IMM64(R1, 0x8090a0b0c0d0e0f0ULL),
  8049. BPF_LD_IMM64(R2, 0x8182838485868788ULL),
  8050. BPF_LD_IMM64(R3, 0x8090a0b0c0d08788ULL),
  8051. BPF_STX_MEM(BPF_DW, R10, R1, -8),
  8052. #ifdef __BIG_ENDIAN
  8053. BPF_STX_MEM(BPF_H, R10, R2, -2),
  8054. #else
  8055. BPF_STX_MEM(BPF_H, R10, R2, -8),
  8056. #endif
  8057. BPF_LDX_MEM(BPF_DW, R0, R10, -8),
  8058. BPF_JMP_REG(BPF_JNE, R0, R3, 1),
  8059. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  8060. BPF_EXIT_INSN(),
  8061. },
  8062. INTERNAL,
  8063. { },
  8064. { { 0, 0 } },
  8065. .stack_depth = 8,
  8066. },
  8067. {
  8068. "BPF_STX_MEM | BPF_W",
  8069. .u.insns_int = {
  8070. BPF_LD_IMM64(R1, 0x8090a0b0c0d0e0f0ULL),
  8071. BPF_LD_IMM64(R2, 0x0102030405060708ULL),
  8072. BPF_LD_IMM64(R3, 0x8090a0b005060708ULL),
  8073. BPF_STX_MEM(BPF_DW, R10, R1, -8),
  8074. #ifdef __BIG_ENDIAN
  8075. BPF_STX_MEM(BPF_W, R10, R2, -4),
  8076. #else
  8077. BPF_STX_MEM(BPF_W, R10, R2, -8),
  8078. #endif
  8079. BPF_LDX_MEM(BPF_DW, R0, R10, -8),
  8080. BPF_JMP_REG(BPF_JNE, R0, R3, 1),
  8081. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  8082. BPF_EXIT_INSN(),
  8083. },
  8084. INTERNAL,
  8085. { },
  8086. { { 0, 0 } },
  8087. .stack_depth = 8,
  8088. },
  8089. {
  8090. "BPF_STX_MEM | BPF_W, MSB set",
  8091. .u.insns_int = {
  8092. BPF_LD_IMM64(R1, 0x8090a0b0c0d0e0f0ULL),
  8093. BPF_LD_IMM64(R2, 0x8182838485868788ULL),
  8094. BPF_LD_IMM64(R3, 0x8090a0b085868788ULL),
  8095. BPF_STX_MEM(BPF_DW, R10, R1, -8),
  8096. #ifdef __BIG_ENDIAN
  8097. BPF_STX_MEM(BPF_W, R10, R2, -4),
  8098. #else
  8099. BPF_STX_MEM(BPF_W, R10, R2, -8),
  8100. #endif
  8101. BPF_LDX_MEM(BPF_DW, R0, R10, -8),
  8102. BPF_JMP_REG(BPF_JNE, R0, R3, 1),
  8103. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  8104. BPF_EXIT_INSN(),
  8105. },
  8106. INTERNAL,
  8107. { },
  8108. { { 0, 0 } },
  8109. .stack_depth = 8,
  8110. },
  8111. /* BPF_ST(X) | BPF_MEM | BPF_B/H/W/DW */
  8112. {
  8113. "ST_MEM_B: Store/Load byte: max negative",
  8114. .u.insns_int = {
  8115. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  8116. BPF_ST_MEM(BPF_B, R10, -40, 0xff),
  8117. BPF_LDX_MEM(BPF_B, R0, R10, -40),
  8118. BPF_EXIT_INSN(),
  8119. },
  8120. INTERNAL,
  8121. { },
  8122. { { 0, 0xff } },
  8123. .stack_depth = 40,
  8124. },
  8125. {
  8126. "ST_MEM_B: Store/Load byte: max positive",
  8127. .u.insns_int = {
  8128. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  8129. BPF_ST_MEM(BPF_H, R10, -40, 0x7f),
  8130. BPF_LDX_MEM(BPF_H, R0, R10, -40),
  8131. BPF_EXIT_INSN(),
  8132. },
  8133. INTERNAL,
  8134. { },
  8135. { { 0, 0x7f } },
  8136. .stack_depth = 40,
  8137. },
  8138. {
  8139. "STX_MEM_B: Store/Load byte: max negative",
  8140. .u.insns_int = {
  8141. BPF_LD_IMM64(R0, 0),
  8142. BPF_LD_IMM64(R1, 0xffLL),
  8143. BPF_STX_MEM(BPF_B, R10, R1, -40),
  8144. BPF_LDX_MEM(BPF_B, R0, R10, -40),
  8145. BPF_EXIT_INSN(),
  8146. },
  8147. INTERNAL,
  8148. { },
  8149. { { 0, 0xff } },
  8150. .stack_depth = 40,
  8151. },
  8152. {
  8153. "ST_MEM_H: Store/Load half word: max negative",
  8154. .u.insns_int = {
  8155. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  8156. BPF_ST_MEM(BPF_H, R10, -40, 0xffff),
  8157. BPF_LDX_MEM(BPF_H, R0, R10, -40),
  8158. BPF_EXIT_INSN(),
  8159. },
  8160. INTERNAL,
  8161. { },
  8162. { { 0, 0xffff } },
  8163. .stack_depth = 40,
  8164. },
  8165. {
  8166. "ST_MEM_H: Store/Load half word: max positive",
  8167. .u.insns_int = {
  8168. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  8169. BPF_ST_MEM(BPF_H, R10, -40, 0x7fff),
  8170. BPF_LDX_MEM(BPF_H, R0, R10, -40),
  8171. BPF_EXIT_INSN(),
  8172. },
  8173. INTERNAL,
  8174. { },
  8175. { { 0, 0x7fff } },
  8176. .stack_depth = 40,
  8177. },
  8178. {
  8179. "STX_MEM_H: Store/Load half word: max negative",
  8180. .u.insns_int = {
  8181. BPF_LD_IMM64(R0, 0),
  8182. BPF_LD_IMM64(R1, 0xffffLL),
  8183. BPF_STX_MEM(BPF_H, R10, R1, -40),
  8184. BPF_LDX_MEM(BPF_H, R0, R10, -40),
  8185. BPF_EXIT_INSN(),
  8186. },
  8187. INTERNAL,
  8188. { },
  8189. { { 0, 0xffff } },
  8190. .stack_depth = 40,
  8191. },
  8192. {
  8193. "ST_MEM_W: Store/Load word: max negative",
  8194. .u.insns_int = {
  8195. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  8196. BPF_ST_MEM(BPF_W, R10, -40, 0xffffffff),
  8197. BPF_LDX_MEM(BPF_W, R0, R10, -40),
  8198. BPF_EXIT_INSN(),
  8199. },
  8200. INTERNAL,
  8201. { },
  8202. { { 0, 0xffffffff } },
  8203. .stack_depth = 40,
  8204. },
  8205. {
  8206. "ST_MEM_W: Store/Load word: max positive",
  8207. .u.insns_int = {
  8208. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  8209. BPF_ST_MEM(BPF_W, R10, -40, 0x7fffffff),
  8210. BPF_LDX_MEM(BPF_W, R0, R10, -40),
  8211. BPF_EXIT_INSN(),
  8212. },
  8213. INTERNAL,
  8214. { },
  8215. { { 0, 0x7fffffff } },
  8216. .stack_depth = 40,
  8217. },
  8218. {
  8219. "STX_MEM_W: Store/Load word: max negative",
  8220. .u.insns_int = {
  8221. BPF_LD_IMM64(R0, 0),
  8222. BPF_LD_IMM64(R1, 0xffffffffLL),
  8223. BPF_STX_MEM(BPF_W, R10, R1, -40),
  8224. BPF_LDX_MEM(BPF_W, R0, R10, -40),
  8225. BPF_EXIT_INSN(),
  8226. },
  8227. INTERNAL,
  8228. { },
  8229. { { 0, 0xffffffff } },
  8230. .stack_depth = 40,
  8231. },
  8232. {
  8233. "ST_MEM_DW: Store/Load double word: max negative",
  8234. .u.insns_int = {
  8235. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  8236. BPF_ST_MEM(BPF_DW, R10, -40, 0xffffffff),
  8237. BPF_LDX_MEM(BPF_DW, R0, R10, -40),
  8238. BPF_EXIT_INSN(),
  8239. },
  8240. INTERNAL,
  8241. { },
  8242. { { 0, 0xffffffff } },
  8243. .stack_depth = 40,
  8244. },
  8245. {
  8246. "ST_MEM_DW: Store/Load double word: max negative 2",
  8247. .u.insns_int = {
  8248. BPF_LD_IMM64(R2, 0xffff00000000ffffLL),
  8249. BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
  8250. BPF_ST_MEM(BPF_DW, R10, -40, 0xffffffff),
  8251. BPF_LDX_MEM(BPF_DW, R2, R10, -40),
  8252. BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
  8253. BPF_MOV32_IMM(R0, 2),
  8254. BPF_EXIT_INSN(),
  8255. BPF_MOV32_IMM(R0, 1),
  8256. BPF_EXIT_INSN(),
  8257. },
  8258. INTERNAL,
  8259. { },
  8260. { { 0, 0x1 } },
  8261. .stack_depth = 40,
  8262. },
  8263. {
  8264. "ST_MEM_DW: Store/Load double word: max positive",
  8265. .u.insns_int = {
  8266. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  8267. BPF_ST_MEM(BPF_DW, R10, -40, 0x7fffffff),
  8268. BPF_LDX_MEM(BPF_DW, R0, R10, -40),
  8269. BPF_EXIT_INSN(),
  8270. },
  8271. INTERNAL,
  8272. { },
  8273. { { 0, 0x7fffffff } },
  8274. .stack_depth = 40,
  8275. },
  8276. {
  8277. "STX_MEM_DW: Store/Load double word: max negative",
  8278. .u.insns_int = {
  8279. BPF_LD_IMM64(R0, 0),
  8280. BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
  8281. BPF_STX_MEM(BPF_DW, R10, R1, -40),
  8282. BPF_LDX_MEM(BPF_DW, R0, R10, -40),
  8283. BPF_EXIT_INSN(),
  8284. },
  8285. INTERNAL,
  8286. { },
  8287. { { 0, 0xffffffff } },
  8288. .stack_depth = 40,
  8289. },
  8290. {
  8291. "STX_MEM_DW: Store double word: first word in memory",
  8292. .u.insns_int = {
  8293. BPF_LD_IMM64(R0, 0),
  8294. BPF_LD_IMM64(R1, 0x0123456789abcdefLL),
  8295. BPF_STX_MEM(BPF_DW, R10, R1, -40),
  8296. BPF_LDX_MEM(BPF_W, R0, R10, -40),
  8297. BPF_EXIT_INSN(),
  8298. },
  8299. INTERNAL,
  8300. { },
  8301. #ifdef __BIG_ENDIAN
  8302. { { 0, 0x01234567 } },
  8303. #else
  8304. { { 0, 0x89abcdef } },
  8305. #endif
  8306. .stack_depth = 40,
  8307. },
  8308. {
  8309. "STX_MEM_DW: Store double word: second word in memory",
  8310. .u.insns_int = {
  8311. BPF_LD_IMM64(R0, 0),
  8312. BPF_LD_IMM64(R1, 0x0123456789abcdefLL),
  8313. BPF_STX_MEM(BPF_DW, R10, R1, -40),
  8314. BPF_LDX_MEM(BPF_W, R0, R10, -36),
  8315. BPF_EXIT_INSN(),
  8316. },
  8317. INTERNAL,
  8318. { },
  8319. #ifdef __BIG_ENDIAN
  8320. { { 0, 0x89abcdef } },
  8321. #else
  8322. { { 0, 0x01234567 } },
  8323. #endif
  8324. .stack_depth = 40,
  8325. },
  8326. /* BPF_STX | BPF_ATOMIC | BPF_W/DW */
  8327. {
  8328. "STX_XADD_W: X + 1 + 1 + 1 + ...",
  8329. { },
  8330. INTERNAL,
  8331. { },
  8332. { { 0, 4134 } },
  8333. .fill_helper = bpf_fill_stxw,
  8334. },
  8335. {
  8336. "STX_XADD_DW: X + 1 + 1 + 1 + ...",
  8337. { },
  8338. INTERNAL,
  8339. { },
  8340. { { 0, 4134 } },
  8341. .fill_helper = bpf_fill_stxdw,
  8342. },
  8343. /*
  8344. * Exhaustive tests of atomic operation variants.
  8345. * Individual tests are expanded from template macros for all
  8346. * combinations of ALU operation, word size and fetching.
  8347. */
  8348. #define BPF_ATOMIC_POISON(width) ((width) == BPF_W ? (0xbaadf00dULL << 32) : 0)
  8349. #define BPF_ATOMIC_OP_TEST1(width, op, logic, old, update, result) \
  8350. { \
  8351. "BPF_ATOMIC | " #width ", " #op ": Test: " \
  8352. #old " " #logic " " #update " = " #result, \
  8353. .u.insns_int = { \
  8354. BPF_LD_IMM64(R5, (update) | BPF_ATOMIC_POISON(width)), \
  8355. BPF_ST_MEM(width, R10, -40, old), \
  8356. BPF_ATOMIC_OP(width, op, R10, R5, -40), \
  8357. BPF_LDX_MEM(width, R0, R10, -40), \
  8358. BPF_ALU64_REG(BPF_MOV, R1, R0), \
  8359. BPF_ALU64_IMM(BPF_RSH, R1, 32), \
  8360. BPF_ALU64_REG(BPF_OR, R0, R1), \
  8361. BPF_EXIT_INSN(), \
  8362. }, \
  8363. INTERNAL, \
  8364. { }, \
  8365. { { 0, result } }, \
  8366. .stack_depth = 40, \
  8367. }
  8368. #define BPF_ATOMIC_OP_TEST2(width, op, logic, old, update, result) \
  8369. { \
  8370. "BPF_ATOMIC | " #width ", " #op ": Test side effects, r10: " \
  8371. #old " " #logic " " #update " = " #result, \
  8372. .u.insns_int = { \
  8373. BPF_ALU64_REG(BPF_MOV, R1, R10), \
  8374. BPF_LD_IMM64(R0, (update) | BPF_ATOMIC_POISON(width)), \
  8375. BPF_ST_MEM(BPF_W, R10, -40, old), \
  8376. BPF_ATOMIC_OP(width, op, R10, R0, -40), \
  8377. BPF_ALU64_REG(BPF_MOV, R0, R10), \
  8378. BPF_ALU64_REG(BPF_SUB, R0, R1), \
  8379. BPF_ALU64_REG(BPF_MOV, R1, R0), \
  8380. BPF_ALU64_IMM(BPF_RSH, R1, 32), \
  8381. BPF_ALU64_REG(BPF_OR, R0, R1), \
  8382. BPF_EXIT_INSN(), \
  8383. }, \
  8384. INTERNAL, \
  8385. { }, \
  8386. { { 0, 0 } }, \
  8387. .stack_depth = 40, \
  8388. }
  8389. #define BPF_ATOMIC_OP_TEST3(width, op, logic, old, update, result) \
  8390. { \
  8391. "BPF_ATOMIC | " #width ", " #op ": Test side effects, r0: " \
  8392. #old " " #logic " " #update " = " #result, \
  8393. .u.insns_int = { \
  8394. BPF_ALU64_REG(BPF_MOV, R0, R10), \
  8395. BPF_LD_IMM64(R1, (update) | BPF_ATOMIC_POISON(width)), \
  8396. BPF_ST_MEM(width, R10, -40, old), \
  8397. BPF_ATOMIC_OP(width, op, R10, R1, -40), \
  8398. BPF_ALU64_REG(BPF_SUB, R0, R10), \
  8399. BPF_ALU64_REG(BPF_MOV, R1, R0), \
  8400. BPF_ALU64_IMM(BPF_RSH, R1, 32), \
  8401. BPF_ALU64_REG(BPF_OR, R0, R1), \
  8402. BPF_EXIT_INSN(), \
  8403. }, \
  8404. INTERNAL, \
  8405. { }, \
  8406. { { 0, 0 } }, \
  8407. .stack_depth = 40, \
  8408. }
  8409. #define BPF_ATOMIC_OP_TEST4(width, op, logic, old, update, result) \
  8410. { \
  8411. "BPF_ATOMIC | " #width ", " #op ": Test fetch: " \
  8412. #old " " #logic " " #update " = " #result, \
  8413. .u.insns_int = { \
  8414. BPF_LD_IMM64(R3, (update) | BPF_ATOMIC_POISON(width)), \
  8415. BPF_ST_MEM(width, R10, -40, old), \
  8416. BPF_ATOMIC_OP(width, op, R10, R3, -40), \
  8417. BPF_ALU32_REG(BPF_MOV, R0, R3), \
  8418. BPF_EXIT_INSN(), \
  8419. }, \
  8420. INTERNAL, \
  8421. { }, \
  8422. { { 0, (op) & BPF_FETCH ? old : update } }, \
  8423. .stack_depth = 40, \
  8424. }
  8425. /* BPF_ATOMIC | BPF_W: BPF_ADD */
  8426. BPF_ATOMIC_OP_TEST1(BPF_W, BPF_ADD, +, 0x12, 0xab, 0xbd),
  8427. BPF_ATOMIC_OP_TEST2(BPF_W, BPF_ADD, +, 0x12, 0xab, 0xbd),
  8428. BPF_ATOMIC_OP_TEST3(BPF_W, BPF_ADD, +, 0x12, 0xab, 0xbd),
  8429. BPF_ATOMIC_OP_TEST4(BPF_W, BPF_ADD, +, 0x12, 0xab, 0xbd),
  8430. /* BPF_ATOMIC | BPF_W: BPF_ADD | BPF_FETCH */
  8431. BPF_ATOMIC_OP_TEST1(BPF_W, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
  8432. BPF_ATOMIC_OP_TEST2(BPF_W, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
  8433. BPF_ATOMIC_OP_TEST3(BPF_W, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
  8434. BPF_ATOMIC_OP_TEST4(BPF_W, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
  8435. /* BPF_ATOMIC | BPF_DW: BPF_ADD */
  8436. BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_ADD, +, 0x12, 0xab, 0xbd),
  8437. BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_ADD, +, 0x12, 0xab, 0xbd),
  8438. BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_ADD, +, 0x12, 0xab, 0xbd),
  8439. BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_ADD, +, 0x12, 0xab, 0xbd),
  8440. /* BPF_ATOMIC | BPF_DW: BPF_ADD | BPF_FETCH */
  8441. BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
  8442. BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
  8443. BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
  8444. BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
  8445. /* BPF_ATOMIC | BPF_W: BPF_AND */
  8446. BPF_ATOMIC_OP_TEST1(BPF_W, BPF_AND, &, 0x12, 0xab, 0x02),
  8447. BPF_ATOMIC_OP_TEST2(BPF_W, BPF_AND, &, 0x12, 0xab, 0x02),
  8448. BPF_ATOMIC_OP_TEST3(BPF_W, BPF_AND, &, 0x12, 0xab, 0x02),
  8449. BPF_ATOMIC_OP_TEST4(BPF_W, BPF_AND, &, 0x12, 0xab, 0x02),
  8450. /* BPF_ATOMIC | BPF_W: BPF_AND | BPF_FETCH */
  8451. BPF_ATOMIC_OP_TEST1(BPF_W, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
  8452. BPF_ATOMIC_OP_TEST2(BPF_W, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
  8453. BPF_ATOMIC_OP_TEST3(BPF_W, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
  8454. BPF_ATOMIC_OP_TEST4(BPF_W, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
  8455. /* BPF_ATOMIC | BPF_DW: BPF_AND */
  8456. BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_AND, &, 0x12, 0xab, 0x02),
  8457. BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_AND, &, 0x12, 0xab, 0x02),
  8458. BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_AND, &, 0x12, 0xab, 0x02),
  8459. BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_AND, &, 0x12, 0xab, 0x02),
  8460. /* BPF_ATOMIC | BPF_DW: BPF_AND | BPF_FETCH */
  8461. BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
  8462. BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
  8463. BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
  8464. BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
  8465. /* BPF_ATOMIC | BPF_W: BPF_OR */
  8466. BPF_ATOMIC_OP_TEST1(BPF_W, BPF_OR, |, 0x12, 0xab, 0xbb),
  8467. BPF_ATOMIC_OP_TEST2(BPF_W, BPF_OR, |, 0x12, 0xab, 0xbb),
  8468. BPF_ATOMIC_OP_TEST3(BPF_W, BPF_OR, |, 0x12, 0xab, 0xbb),
  8469. BPF_ATOMIC_OP_TEST4(BPF_W, BPF_OR, |, 0x12, 0xab, 0xbb),
  8470. /* BPF_ATOMIC | BPF_W: BPF_OR | BPF_FETCH */
  8471. BPF_ATOMIC_OP_TEST1(BPF_W, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
  8472. BPF_ATOMIC_OP_TEST2(BPF_W, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
  8473. BPF_ATOMIC_OP_TEST3(BPF_W, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
  8474. BPF_ATOMIC_OP_TEST4(BPF_W, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
  8475. /* BPF_ATOMIC | BPF_DW: BPF_OR */
  8476. BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_OR, |, 0x12, 0xab, 0xbb),
  8477. BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_OR, |, 0x12, 0xab, 0xbb),
  8478. BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_OR, |, 0x12, 0xab, 0xbb),
  8479. BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_OR, |, 0x12, 0xab, 0xbb),
  8480. /* BPF_ATOMIC | BPF_DW: BPF_OR | BPF_FETCH */
  8481. BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
  8482. BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
  8483. BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
  8484. BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
  8485. /* BPF_ATOMIC | BPF_W: BPF_XOR */
  8486. BPF_ATOMIC_OP_TEST1(BPF_W, BPF_XOR, ^, 0x12, 0xab, 0xb9),
  8487. BPF_ATOMIC_OP_TEST2(BPF_W, BPF_XOR, ^, 0x12, 0xab, 0xb9),
  8488. BPF_ATOMIC_OP_TEST3(BPF_W, BPF_XOR, ^, 0x12, 0xab, 0xb9),
  8489. BPF_ATOMIC_OP_TEST4(BPF_W, BPF_XOR, ^, 0x12, 0xab, 0xb9),
  8490. /* BPF_ATOMIC | BPF_W: BPF_XOR | BPF_FETCH */
  8491. BPF_ATOMIC_OP_TEST1(BPF_W, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
  8492. BPF_ATOMIC_OP_TEST2(BPF_W, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
  8493. BPF_ATOMIC_OP_TEST3(BPF_W, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
  8494. BPF_ATOMIC_OP_TEST4(BPF_W, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
  8495. /* BPF_ATOMIC | BPF_DW: BPF_XOR */
  8496. BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_XOR, ^, 0x12, 0xab, 0xb9),
  8497. BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_XOR, ^, 0x12, 0xab, 0xb9),
  8498. BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_XOR, ^, 0x12, 0xab, 0xb9),
  8499. BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_XOR, ^, 0x12, 0xab, 0xb9),
  8500. /* BPF_ATOMIC | BPF_DW: BPF_XOR | BPF_FETCH */
  8501. BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
  8502. BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
  8503. BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
  8504. BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
  8505. /* BPF_ATOMIC | BPF_W: BPF_XCHG */
  8506. BPF_ATOMIC_OP_TEST1(BPF_W, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
  8507. BPF_ATOMIC_OP_TEST2(BPF_W, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
  8508. BPF_ATOMIC_OP_TEST3(BPF_W, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
  8509. BPF_ATOMIC_OP_TEST4(BPF_W, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
  8510. /* BPF_ATOMIC | BPF_DW: BPF_XCHG */
  8511. BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
  8512. BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
  8513. BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
  8514. BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
  8515. #undef BPF_ATOMIC_POISON
  8516. #undef BPF_ATOMIC_OP_TEST1
  8517. #undef BPF_ATOMIC_OP_TEST2
  8518. #undef BPF_ATOMIC_OP_TEST3
  8519. #undef BPF_ATOMIC_OP_TEST4
  8520. /* BPF_ATOMIC | BPF_W, BPF_CMPXCHG */
  8521. {
  8522. "BPF_ATOMIC | BPF_W, BPF_CMPXCHG: Test successful return",
  8523. .u.insns_int = {
  8524. BPF_ST_MEM(BPF_W, R10, -40, 0x01234567),
  8525. BPF_ALU32_IMM(BPF_MOV, R0, 0x01234567),
  8526. BPF_ALU32_IMM(BPF_MOV, R3, 0x89abcdef),
  8527. BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40),
  8528. BPF_EXIT_INSN(),
  8529. },
  8530. INTERNAL,
  8531. { },
  8532. { { 0, 0x01234567 } },
  8533. .stack_depth = 40,
  8534. },
  8535. {
  8536. "BPF_ATOMIC | BPF_W, BPF_CMPXCHG: Test successful store",
  8537. .u.insns_int = {
  8538. BPF_ST_MEM(BPF_W, R10, -40, 0x01234567),
  8539. BPF_ALU32_IMM(BPF_MOV, R0, 0x01234567),
  8540. BPF_ALU32_IMM(BPF_MOV, R3, 0x89abcdef),
  8541. BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40),
  8542. BPF_LDX_MEM(BPF_W, R0, R10, -40),
  8543. BPF_EXIT_INSN(),
  8544. },
  8545. INTERNAL,
  8546. { },
  8547. { { 0, 0x89abcdef } },
  8548. .stack_depth = 40,
  8549. },
  8550. {
  8551. "BPF_ATOMIC | BPF_W, BPF_CMPXCHG: Test failure return",
  8552. .u.insns_int = {
  8553. BPF_ST_MEM(BPF_W, R10, -40, 0x01234567),
  8554. BPF_ALU32_IMM(BPF_MOV, R0, 0x76543210),
  8555. BPF_ALU32_IMM(BPF_MOV, R3, 0x89abcdef),
  8556. BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40),
  8557. BPF_EXIT_INSN(),
  8558. },
  8559. INTERNAL,
  8560. { },
  8561. { { 0, 0x01234567 } },
  8562. .stack_depth = 40,
  8563. },
  8564. {
  8565. "BPF_ATOMIC | BPF_W, BPF_CMPXCHG: Test failure store",
  8566. .u.insns_int = {
  8567. BPF_ST_MEM(BPF_W, R10, -40, 0x01234567),
  8568. BPF_ALU32_IMM(BPF_MOV, R0, 0x76543210),
  8569. BPF_ALU32_IMM(BPF_MOV, R3, 0x89abcdef),
  8570. BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40),
  8571. BPF_LDX_MEM(BPF_W, R0, R10, -40),
  8572. BPF_EXIT_INSN(),
  8573. },
  8574. INTERNAL,
  8575. { },
  8576. { { 0, 0x01234567 } },
  8577. .stack_depth = 40,
  8578. },
  8579. {
  8580. "BPF_ATOMIC | BPF_W, BPF_CMPXCHG: Test side effects",
  8581. .u.insns_int = {
  8582. BPF_ST_MEM(BPF_W, R10, -40, 0x01234567),
  8583. BPF_ALU32_IMM(BPF_MOV, R0, 0x01234567),
  8584. BPF_ALU32_IMM(BPF_MOV, R3, 0x89abcdef),
  8585. BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40),
  8586. BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40),
  8587. BPF_ALU32_REG(BPF_MOV, R0, R3),
  8588. BPF_EXIT_INSN(),
  8589. },
  8590. INTERNAL,
  8591. { },
  8592. { { 0, 0x89abcdef } },
  8593. .stack_depth = 40,
  8594. },
  8595. /* BPF_ATOMIC | BPF_DW, BPF_CMPXCHG */
  8596. {
  8597. "BPF_ATOMIC | BPF_DW, BPF_CMPXCHG: Test successful return",
  8598. .u.insns_int = {
  8599. BPF_LD_IMM64(R1, 0x0123456789abcdefULL),
  8600. BPF_LD_IMM64(R2, 0xfedcba9876543210ULL),
  8601. BPF_ALU64_REG(BPF_MOV, R0, R1),
  8602. BPF_STX_MEM(BPF_DW, R10, R1, -40),
  8603. BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -40),
  8604. BPF_JMP_REG(BPF_JNE, R0, R1, 1),
  8605. BPF_ALU64_REG(BPF_SUB, R0, R1),
  8606. BPF_EXIT_INSN(),
  8607. },
  8608. INTERNAL,
  8609. { },
  8610. { { 0, 0 } },
  8611. .stack_depth = 40,
  8612. },
  8613. {
  8614. "BPF_ATOMIC | BPF_DW, BPF_CMPXCHG: Test successful store",
  8615. .u.insns_int = {
  8616. BPF_LD_IMM64(R1, 0x0123456789abcdefULL),
  8617. BPF_LD_IMM64(R2, 0xfedcba9876543210ULL),
  8618. BPF_ALU64_REG(BPF_MOV, R0, R1),
  8619. BPF_STX_MEM(BPF_DW, R10, R0, -40),
  8620. BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -40),
  8621. BPF_LDX_MEM(BPF_DW, R0, R10, -40),
  8622. BPF_JMP_REG(BPF_JNE, R0, R2, 1),
  8623. BPF_ALU64_REG(BPF_SUB, R0, R2),
  8624. BPF_EXIT_INSN(),
  8625. },
  8626. INTERNAL,
  8627. { },
  8628. { { 0, 0 } },
  8629. .stack_depth = 40,
  8630. },
  8631. {
  8632. "BPF_ATOMIC | BPF_DW, BPF_CMPXCHG: Test failure return",
  8633. .u.insns_int = {
  8634. BPF_LD_IMM64(R1, 0x0123456789abcdefULL),
  8635. BPF_LD_IMM64(R2, 0xfedcba9876543210ULL),
  8636. BPF_ALU64_REG(BPF_MOV, R0, R1),
  8637. BPF_ALU64_IMM(BPF_ADD, R0, 1),
  8638. BPF_STX_MEM(BPF_DW, R10, R1, -40),
  8639. BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -40),
  8640. BPF_JMP_REG(BPF_JNE, R0, R1, 1),
  8641. BPF_ALU64_REG(BPF_SUB, R0, R1),
  8642. BPF_EXIT_INSN(),
  8643. },
  8644. INTERNAL,
  8645. { },
  8646. { { 0, 0 } },
  8647. .stack_depth = 40,
  8648. },
  8649. {
  8650. "BPF_ATOMIC | BPF_DW, BPF_CMPXCHG: Test failure store",
  8651. .u.insns_int = {
  8652. BPF_LD_IMM64(R1, 0x0123456789abcdefULL),
  8653. BPF_LD_IMM64(R2, 0xfedcba9876543210ULL),
  8654. BPF_ALU64_REG(BPF_MOV, R0, R1),
  8655. BPF_ALU64_IMM(BPF_ADD, R0, 1),
  8656. BPF_STX_MEM(BPF_DW, R10, R1, -40),
  8657. BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -40),
  8658. BPF_LDX_MEM(BPF_DW, R0, R10, -40),
  8659. BPF_JMP_REG(BPF_JNE, R0, R1, 1),
  8660. BPF_ALU64_REG(BPF_SUB, R0, R1),
  8661. BPF_EXIT_INSN(),
  8662. },
  8663. INTERNAL,
  8664. { },
  8665. { { 0, 0 } },
  8666. .stack_depth = 40,
  8667. },
  8668. {
  8669. "BPF_ATOMIC | BPF_DW, BPF_CMPXCHG: Test side effects",
  8670. .u.insns_int = {
  8671. BPF_LD_IMM64(R1, 0x0123456789abcdefULL),
  8672. BPF_LD_IMM64(R2, 0xfedcba9876543210ULL),
  8673. BPF_ALU64_REG(BPF_MOV, R0, R1),
  8674. BPF_STX_MEM(BPF_DW, R10, R1, -40),
  8675. BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -40),
  8676. BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
  8677. BPF_JMP_REG(BPF_JNE, R0, R2, 1),
  8678. BPF_ALU64_REG(BPF_SUB, R0, R2),
  8679. BPF_EXIT_INSN(),
  8680. },
  8681. INTERNAL,
  8682. { },
  8683. { { 0, 0 } },
  8684. .stack_depth = 40,
  8685. },
  8686. /* BPF_JMP32 | BPF_JEQ | BPF_K */
  8687. {
  8688. "JMP32_JEQ_K: Small immediate",
  8689. .u.insns_int = {
  8690. BPF_ALU32_IMM(BPF_MOV, R0, 123),
  8691. BPF_JMP32_IMM(BPF_JEQ, R0, 321, 1),
  8692. BPF_JMP32_IMM(BPF_JEQ, R0, 123, 1),
  8693. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  8694. BPF_EXIT_INSN(),
  8695. },
  8696. INTERNAL,
  8697. { },
  8698. { { 0, 123 } }
  8699. },
  8700. {
  8701. "JMP32_JEQ_K: Large immediate",
  8702. .u.insns_int = {
  8703. BPF_ALU32_IMM(BPF_MOV, R0, 12345678),
  8704. BPF_JMP32_IMM(BPF_JEQ, R0, 12345678 & 0xffff, 1),
  8705. BPF_JMP32_IMM(BPF_JEQ, R0, 12345678, 1),
  8706. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  8707. BPF_EXIT_INSN(),
  8708. },
  8709. INTERNAL,
  8710. { },
  8711. { { 0, 12345678 } }
  8712. },
  8713. {
  8714. "JMP32_JEQ_K: negative immediate",
  8715. .u.insns_int = {
  8716. BPF_ALU32_IMM(BPF_MOV, R0, -123),
  8717. BPF_JMP32_IMM(BPF_JEQ, R0, 123, 1),
  8718. BPF_JMP32_IMM(BPF_JEQ, R0, -123, 1),
  8719. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  8720. BPF_EXIT_INSN(),
  8721. },
  8722. INTERNAL,
  8723. { },
  8724. { { 0, -123 } }
  8725. },
  8726. /* BPF_JMP32 | BPF_JEQ | BPF_X */
  8727. {
  8728. "JMP32_JEQ_X",
  8729. .u.insns_int = {
  8730. BPF_ALU32_IMM(BPF_MOV, R0, 1234),
  8731. BPF_ALU32_IMM(BPF_MOV, R1, 4321),
  8732. BPF_JMP32_REG(BPF_JEQ, R0, R1, 2),
  8733. BPF_ALU32_IMM(BPF_MOV, R1, 1234),
  8734. BPF_JMP32_REG(BPF_JEQ, R0, R1, 1),
  8735. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  8736. BPF_EXIT_INSN(),
  8737. },
  8738. INTERNAL,
  8739. { },
  8740. { { 0, 1234 } }
  8741. },
  8742. /* BPF_JMP32 | BPF_JNE | BPF_K */
  8743. {
  8744. "JMP32_JNE_K: Small immediate",
  8745. .u.insns_int = {
  8746. BPF_ALU32_IMM(BPF_MOV, R0, 123),
  8747. BPF_JMP32_IMM(BPF_JNE, R0, 123, 1),
  8748. BPF_JMP32_IMM(BPF_JNE, R0, 321, 1),
  8749. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  8750. BPF_EXIT_INSN(),
  8751. },
  8752. INTERNAL,
  8753. { },
  8754. { { 0, 123 } }
  8755. },
  8756. {
  8757. "JMP32_JNE_K: Large immediate",
  8758. .u.insns_int = {
  8759. BPF_ALU32_IMM(BPF_MOV, R0, 12345678),
  8760. BPF_JMP32_IMM(BPF_JNE, R0, 12345678, 1),
  8761. BPF_JMP32_IMM(BPF_JNE, R0, 12345678 & 0xffff, 1),
  8762. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  8763. BPF_EXIT_INSN(),
  8764. },
  8765. INTERNAL,
  8766. { },
  8767. { { 0, 12345678 } }
  8768. },
  8769. {
  8770. "JMP32_JNE_K: negative immediate",
  8771. .u.insns_int = {
  8772. BPF_ALU32_IMM(BPF_MOV, R0, -123),
  8773. BPF_JMP32_IMM(BPF_JNE, R0, -123, 1),
  8774. BPF_JMP32_IMM(BPF_JNE, R0, 123, 1),
  8775. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  8776. BPF_EXIT_INSN(),
  8777. },
  8778. INTERNAL,
  8779. { },
  8780. { { 0, -123 } }
  8781. },
  8782. /* BPF_JMP32 | BPF_JNE | BPF_X */
  8783. {
  8784. "JMP32_JNE_X",
  8785. .u.insns_int = {
  8786. BPF_ALU32_IMM(BPF_MOV, R0, 1234),
  8787. BPF_ALU32_IMM(BPF_MOV, R1, 1234),
  8788. BPF_JMP32_REG(BPF_JNE, R0, R1, 2),
  8789. BPF_ALU32_IMM(BPF_MOV, R1, 4321),
  8790. BPF_JMP32_REG(BPF_JNE, R0, R1, 1),
  8791. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  8792. BPF_EXIT_INSN(),
  8793. },
  8794. INTERNAL,
  8795. { },
  8796. { { 0, 1234 } }
  8797. },
  8798. /* BPF_JMP32 | BPF_JSET | BPF_K */
  8799. {
  8800. "JMP32_JSET_K: Small immediate",
  8801. .u.insns_int = {
  8802. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  8803. BPF_JMP32_IMM(BPF_JSET, R0, 2, 1),
  8804. BPF_JMP32_IMM(BPF_JSET, R0, 3, 1),
  8805. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  8806. BPF_EXIT_INSN(),
  8807. },
  8808. INTERNAL,
  8809. { },
  8810. { { 0, 1 } }
  8811. },
  8812. {
  8813. "JMP32_JSET_K: Large immediate",
  8814. .u.insns_int = {
  8815. BPF_ALU32_IMM(BPF_MOV, R0, 0x40000000),
  8816. BPF_JMP32_IMM(BPF_JSET, R0, 0x3fffffff, 1),
  8817. BPF_JMP32_IMM(BPF_JSET, R0, 0x60000000, 1),
  8818. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  8819. BPF_EXIT_INSN(),
  8820. },
  8821. INTERNAL,
  8822. { },
  8823. { { 0, 0x40000000 } }
  8824. },
  8825. {
  8826. "JMP32_JSET_K: negative immediate",
  8827. .u.insns_int = {
  8828. BPF_ALU32_IMM(BPF_MOV, R0, -123),
  8829. BPF_JMP32_IMM(BPF_JSET, R0, -1, 1),
  8830. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  8831. BPF_EXIT_INSN(),
  8832. },
  8833. INTERNAL,
  8834. { },
  8835. { { 0, -123 } }
  8836. },
  8837. /* BPF_JMP32 | BPF_JSET | BPF_X */
  8838. {
  8839. "JMP32_JSET_X",
  8840. .u.insns_int = {
  8841. BPF_ALU32_IMM(BPF_MOV, R0, 8),
  8842. BPF_ALU32_IMM(BPF_MOV, R1, 7),
  8843. BPF_JMP32_REG(BPF_JSET, R0, R1, 2),
  8844. BPF_ALU32_IMM(BPF_MOV, R1, 8 | 2),
  8845. BPF_JMP32_REG(BPF_JNE, R0, R1, 1),
  8846. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  8847. BPF_EXIT_INSN(),
  8848. },
  8849. INTERNAL,
  8850. { },
  8851. { { 0, 8 } }
  8852. },
  8853. /* BPF_JMP32 | BPF_JGT | BPF_K */
  8854. {
  8855. "JMP32_JGT_K: Small immediate",
  8856. .u.insns_int = {
  8857. BPF_ALU32_IMM(BPF_MOV, R0, 123),
  8858. BPF_JMP32_IMM(BPF_JGT, R0, 123, 1),
  8859. BPF_JMP32_IMM(BPF_JGT, R0, 122, 1),
  8860. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  8861. BPF_EXIT_INSN(),
  8862. },
  8863. INTERNAL,
  8864. { },
  8865. { { 0, 123 } }
  8866. },
  8867. {
  8868. "JMP32_JGT_K: Large immediate",
  8869. .u.insns_int = {
  8870. BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
  8871. BPF_JMP32_IMM(BPF_JGT, R0, 0xffffffff, 1),
  8872. BPF_JMP32_IMM(BPF_JGT, R0, 0xfffffffd, 1),
  8873. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  8874. BPF_EXIT_INSN(),
  8875. },
  8876. INTERNAL,
  8877. { },
  8878. { { 0, 0xfffffffe } }
  8879. },
  8880. /* BPF_JMP32 | BPF_JGT | BPF_X */
  8881. {
  8882. "JMP32_JGT_X",
  8883. .u.insns_int = {
  8884. BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
  8885. BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
  8886. BPF_JMP32_REG(BPF_JGT, R0, R1, 2),
  8887. BPF_ALU32_IMM(BPF_MOV, R1, 0xfffffffd),
  8888. BPF_JMP32_REG(BPF_JGT, R0, R1, 1),
  8889. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  8890. BPF_EXIT_INSN(),
  8891. },
  8892. INTERNAL,
  8893. { },
  8894. { { 0, 0xfffffffe } }
  8895. },
  8896. /* BPF_JMP32 | BPF_JGE | BPF_K */
  8897. {
  8898. "JMP32_JGE_K: Small immediate",
  8899. .u.insns_int = {
  8900. BPF_ALU32_IMM(BPF_MOV, R0, 123),
  8901. BPF_JMP32_IMM(BPF_JGE, R0, 124, 1),
  8902. BPF_JMP32_IMM(BPF_JGE, R0, 123, 1),
  8903. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  8904. BPF_EXIT_INSN(),
  8905. },
  8906. INTERNAL,
  8907. { },
  8908. { { 0, 123 } }
  8909. },
  8910. {
  8911. "JMP32_JGE_K: Large immediate",
  8912. .u.insns_int = {
  8913. BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
  8914. BPF_JMP32_IMM(BPF_JGE, R0, 0xffffffff, 1),
  8915. BPF_JMP32_IMM(BPF_JGE, R0, 0xfffffffe, 1),
  8916. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  8917. BPF_EXIT_INSN(),
  8918. },
  8919. INTERNAL,
  8920. { },
  8921. { { 0, 0xfffffffe } }
  8922. },
  8923. /* BPF_JMP32 | BPF_JGE | BPF_X */
  8924. {
  8925. "JMP32_JGE_X",
  8926. .u.insns_int = {
  8927. BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
  8928. BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
  8929. BPF_JMP32_REG(BPF_JGE, R0, R1, 2),
  8930. BPF_ALU32_IMM(BPF_MOV, R1, 0xfffffffe),
  8931. BPF_JMP32_REG(BPF_JGE, R0, R1, 1),
  8932. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  8933. BPF_EXIT_INSN(),
  8934. },
  8935. INTERNAL,
  8936. { },
  8937. { { 0, 0xfffffffe } }
  8938. },
  8939. /* BPF_JMP32 | BPF_JLT | BPF_K */
  8940. {
  8941. "JMP32_JLT_K: Small immediate",
  8942. .u.insns_int = {
  8943. BPF_ALU32_IMM(BPF_MOV, R0, 123),
  8944. BPF_JMP32_IMM(BPF_JLT, R0, 123, 1),
  8945. BPF_JMP32_IMM(BPF_JLT, R0, 124, 1),
  8946. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  8947. BPF_EXIT_INSN(),
  8948. },
  8949. INTERNAL,
  8950. { },
  8951. { { 0, 123 } }
  8952. },
  8953. {
  8954. "JMP32_JLT_K: Large immediate",
  8955. .u.insns_int = {
  8956. BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
  8957. BPF_JMP32_IMM(BPF_JLT, R0, 0xfffffffd, 1),
  8958. BPF_JMP32_IMM(BPF_JLT, R0, 0xffffffff, 1),
  8959. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  8960. BPF_EXIT_INSN(),
  8961. },
  8962. INTERNAL,
  8963. { },
  8964. { { 0, 0xfffffffe } }
  8965. },
  8966. /* BPF_JMP32 | BPF_JLT | BPF_X */
  8967. {
  8968. "JMP32_JLT_X",
  8969. .u.insns_int = {
  8970. BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
  8971. BPF_ALU32_IMM(BPF_MOV, R1, 0xfffffffd),
  8972. BPF_JMP32_REG(BPF_JLT, R0, R1, 2),
  8973. BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
  8974. BPF_JMP32_REG(BPF_JLT, R0, R1, 1),
  8975. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  8976. BPF_EXIT_INSN(),
  8977. },
  8978. INTERNAL,
  8979. { },
  8980. { { 0, 0xfffffffe } }
  8981. },
  8982. /* BPF_JMP32 | BPF_JLE | BPF_K */
  8983. {
  8984. "JMP32_JLE_K: Small immediate",
  8985. .u.insns_int = {
  8986. BPF_ALU32_IMM(BPF_MOV, R0, 123),
  8987. BPF_JMP32_IMM(BPF_JLE, R0, 122, 1),
  8988. BPF_JMP32_IMM(BPF_JLE, R0, 123, 1),
  8989. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  8990. BPF_EXIT_INSN(),
  8991. },
  8992. INTERNAL,
  8993. { },
  8994. { { 0, 123 } }
  8995. },
  8996. {
  8997. "JMP32_JLE_K: Large immediate",
  8998. .u.insns_int = {
  8999. BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
  9000. BPF_JMP32_IMM(BPF_JLE, R0, 0xfffffffd, 1),
  9001. BPF_JMP32_IMM(BPF_JLE, R0, 0xfffffffe, 1),
  9002. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9003. BPF_EXIT_INSN(),
  9004. },
  9005. INTERNAL,
  9006. { },
  9007. { { 0, 0xfffffffe } }
  9008. },
  9009. /* BPF_JMP32 | BPF_JLE | BPF_X */
  9010. {
  9011. "JMP32_JLE_X",
  9012. .u.insns_int = {
  9013. BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
  9014. BPF_ALU32_IMM(BPF_MOV, R1, 0xfffffffd),
  9015. BPF_JMP32_REG(BPF_JLE, R0, R1, 2),
  9016. BPF_ALU32_IMM(BPF_MOV, R1, 0xfffffffe),
  9017. BPF_JMP32_REG(BPF_JLE, R0, R1, 1),
  9018. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9019. BPF_EXIT_INSN(),
  9020. },
  9021. INTERNAL,
  9022. { },
  9023. { { 0, 0xfffffffe } }
  9024. },
  9025. /* BPF_JMP32 | BPF_JSGT | BPF_K */
  9026. {
  9027. "JMP32_JSGT_K: Small immediate",
  9028. .u.insns_int = {
  9029. BPF_ALU32_IMM(BPF_MOV, R0, -123),
  9030. BPF_JMP32_IMM(BPF_JSGT, R0, -123, 1),
  9031. BPF_JMP32_IMM(BPF_JSGT, R0, -124, 1),
  9032. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9033. BPF_EXIT_INSN(),
  9034. },
  9035. INTERNAL,
  9036. { },
  9037. { { 0, -123 } }
  9038. },
  9039. {
  9040. "JMP32_JSGT_K: Large immediate",
  9041. .u.insns_int = {
  9042. BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
  9043. BPF_JMP32_IMM(BPF_JSGT, R0, -12345678, 1),
  9044. BPF_JMP32_IMM(BPF_JSGT, R0, -12345679, 1),
  9045. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9046. BPF_EXIT_INSN(),
  9047. },
  9048. INTERNAL,
  9049. { },
  9050. { { 0, -12345678 } }
  9051. },
  9052. /* BPF_JMP32 | BPF_JSGT | BPF_X */
  9053. {
  9054. "JMP32_JSGT_X",
  9055. .u.insns_int = {
  9056. BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
  9057. BPF_ALU32_IMM(BPF_MOV, R1, -12345678),
  9058. BPF_JMP32_REG(BPF_JSGT, R0, R1, 2),
  9059. BPF_ALU32_IMM(BPF_MOV, R1, -12345679),
  9060. BPF_JMP32_REG(BPF_JSGT, R0, R1, 1),
  9061. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9062. BPF_EXIT_INSN(),
  9063. },
  9064. INTERNAL,
  9065. { },
  9066. { { 0, -12345678 } }
  9067. },
  9068. /* BPF_JMP32 | BPF_JSGE | BPF_K */
  9069. {
  9070. "JMP32_JSGE_K: Small immediate",
  9071. .u.insns_int = {
  9072. BPF_ALU32_IMM(BPF_MOV, R0, -123),
  9073. BPF_JMP32_IMM(BPF_JSGE, R0, -122, 1),
  9074. BPF_JMP32_IMM(BPF_JSGE, R0, -123, 1),
  9075. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9076. BPF_EXIT_INSN(),
  9077. },
  9078. INTERNAL,
  9079. { },
  9080. { { 0, -123 } }
  9081. },
  9082. {
  9083. "JMP32_JSGE_K: Large immediate",
  9084. .u.insns_int = {
  9085. BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
  9086. BPF_JMP32_IMM(BPF_JSGE, R0, -12345677, 1),
  9087. BPF_JMP32_IMM(BPF_JSGE, R0, -12345678, 1),
  9088. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9089. BPF_EXIT_INSN(),
  9090. },
  9091. INTERNAL,
  9092. { },
  9093. { { 0, -12345678 } }
  9094. },
  9095. /* BPF_JMP32 | BPF_JSGE | BPF_X */
  9096. {
  9097. "JMP32_JSGE_X",
  9098. .u.insns_int = {
  9099. BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
  9100. BPF_ALU32_IMM(BPF_MOV, R1, -12345677),
  9101. BPF_JMP32_REG(BPF_JSGE, R0, R1, 2),
  9102. BPF_ALU32_IMM(BPF_MOV, R1, -12345678),
  9103. BPF_JMP32_REG(BPF_JSGE, R0, R1, 1),
  9104. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9105. BPF_EXIT_INSN(),
  9106. },
  9107. INTERNAL,
  9108. { },
  9109. { { 0, -12345678 } }
  9110. },
  9111. /* BPF_JMP32 | BPF_JSLT | BPF_K */
  9112. {
  9113. "JMP32_JSLT_K: Small immediate",
  9114. .u.insns_int = {
  9115. BPF_ALU32_IMM(BPF_MOV, R0, -123),
  9116. BPF_JMP32_IMM(BPF_JSLT, R0, -123, 1),
  9117. BPF_JMP32_IMM(BPF_JSLT, R0, -122, 1),
  9118. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9119. BPF_EXIT_INSN(),
  9120. },
  9121. INTERNAL,
  9122. { },
  9123. { { 0, -123 } }
  9124. },
  9125. {
  9126. "JMP32_JSLT_K: Large immediate",
  9127. .u.insns_int = {
  9128. BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
  9129. BPF_JMP32_IMM(BPF_JSLT, R0, -12345678, 1),
  9130. BPF_JMP32_IMM(BPF_JSLT, R0, -12345677, 1),
  9131. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9132. BPF_EXIT_INSN(),
  9133. },
  9134. INTERNAL,
  9135. { },
  9136. { { 0, -12345678 } }
  9137. },
  9138. /* BPF_JMP32 | BPF_JSLT | BPF_X */
  9139. {
  9140. "JMP32_JSLT_X",
  9141. .u.insns_int = {
  9142. BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
  9143. BPF_ALU32_IMM(BPF_MOV, R1, -12345678),
  9144. BPF_JMP32_REG(BPF_JSLT, R0, R1, 2),
  9145. BPF_ALU32_IMM(BPF_MOV, R1, -12345677),
  9146. BPF_JMP32_REG(BPF_JSLT, R0, R1, 1),
  9147. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9148. BPF_EXIT_INSN(),
  9149. },
  9150. INTERNAL,
  9151. { },
  9152. { { 0, -12345678 } }
  9153. },
  9154. /* BPF_JMP32 | BPF_JSLE | BPF_K */
  9155. {
  9156. "JMP32_JSLE_K: Small immediate",
  9157. .u.insns_int = {
  9158. BPF_ALU32_IMM(BPF_MOV, R0, -123),
  9159. BPF_JMP32_IMM(BPF_JSLE, R0, -124, 1),
  9160. BPF_JMP32_IMM(BPF_JSLE, R0, -123, 1),
  9161. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9162. BPF_EXIT_INSN(),
  9163. },
  9164. INTERNAL,
  9165. { },
  9166. { { 0, -123 } }
  9167. },
  9168. {
  9169. "JMP32_JSLE_K: Large immediate",
  9170. .u.insns_int = {
  9171. BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
  9172. BPF_JMP32_IMM(BPF_JSLE, R0, -12345679, 1),
  9173. BPF_JMP32_IMM(BPF_JSLE, R0, -12345678, 1),
  9174. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9175. BPF_EXIT_INSN(),
  9176. },
  9177. INTERNAL,
  9178. { },
  9179. { { 0, -12345678 } }
  9180. },
  9181. /* BPF_JMP32 | BPF_JSLE | BPF_K */
  9182. {
  9183. "JMP32_JSLE_X",
  9184. .u.insns_int = {
  9185. BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
  9186. BPF_ALU32_IMM(BPF_MOV, R1, -12345679),
  9187. BPF_JMP32_REG(BPF_JSLE, R0, R1, 2),
  9188. BPF_ALU32_IMM(BPF_MOV, R1, -12345678),
  9189. BPF_JMP32_REG(BPF_JSLE, R0, R1, 1),
  9190. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9191. BPF_EXIT_INSN(),
  9192. },
  9193. INTERNAL,
  9194. { },
  9195. { { 0, -12345678 } }
  9196. },
  9197. /* BPF_JMP | BPF_EXIT */
  9198. {
  9199. "JMP_EXIT",
  9200. .u.insns_int = {
  9201. BPF_ALU32_IMM(BPF_MOV, R0, 0x4711),
  9202. BPF_EXIT_INSN(),
  9203. BPF_ALU32_IMM(BPF_MOV, R0, 0x4712),
  9204. },
  9205. INTERNAL,
  9206. { },
  9207. { { 0, 0x4711 } },
  9208. },
  9209. /* BPF_JMP | BPF_JA */
  9210. {
  9211. "JMP_JA: Unconditional jump: if (true) return 1",
  9212. .u.insns_int = {
  9213. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9214. BPF_JMP_IMM(BPF_JA, 0, 0, 1),
  9215. BPF_EXIT_INSN(),
  9216. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9217. BPF_EXIT_INSN(),
  9218. },
  9219. INTERNAL,
  9220. { },
  9221. { { 0, 1 } },
  9222. },
  9223. /* BPF_JMP32 | BPF_JA */
  9224. {
  9225. "JMP32_JA: Unconditional jump: if (true) return 1",
  9226. .u.insns_int = {
  9227. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9228. BPF_JMP32_IMM(BPF_JA, 0, 1, 0),
  9229. BPF_EXIT_INSN(),
  9230. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9231. BPF_EXIT_INSN(),
  9232. },
  9233. INTERNAL,
  9234. { },
  9235. { { 0, 1 } },
  9236. },
  9237. /* BPF_JMP | BPF_JSLT | BPF_K */
  9238. {
  9239. "JMP_JSLT_K: Signed jump: if (-2 < -1) return 1",
  9240. .u.insns_int = {
  9241. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9242. BPF_LD_IMM64(R1, 0xfffffffffffffffeLL),
  9243. BPF_JMP_IMM(BPF_JSLT, R1, -1, 1),
  9244. BPF_EXIT_INSN(),
  9245. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9246. BPF_EXIT_INSN(),
  9247. },
  9248. INTERNAL,
  9249. { },
  9250. { { 0, 1 } },
  9251. },
  9252. {
  9253. "JMP_JSLT_K: Signed jump: if (-1 < -1) return 0",
  9254. .u.insns_int = {
  9255. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9256. BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
  9257. BPF_JMP_IMM(BPF_JSLT, R1, -1, 1),
  9258. BPF_EXIT_INSN(),
  9259. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9260. BPF_EXIT_INSN(),
  9261. },
  9262. INTERNAL,
  9263. { },
  9264. { { 0, 1 } },
  9265. },
  9266. /* BPF_JMP | BPF_JSGT | BPF_K */
  9267. {
  9268. "JMP_JSGT_K: Signed jump: if (-1 > -2) return 1",
  9269. .u.insns_int = {
  9270. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9271. BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
  9272. BPF_JMP_IMM(BPF_JSGT, R1, -2, 1),
  9273. BPF_EXIT_INSN(),
  9274. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9275. BPF_EXIT_INSN(),
  9276. },
  9277. INTERNAL,
  9278. { },
  9279. { { 0, 1 } },
  9280. },
  9281. {
  9282. "JMP_JSGT_K: Signed jump: if (-1 > -1) return 0",
  9283. .u.insns_int = {
  9284. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9285. BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
  9286. BPF_JMP_IMM(BPF_JSGT, R1, -1, 1),
  9287. BPF_EXIT_INSN(),
  9288. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9289. BPF_EXIT_INSN(),
  9290. },
  9291. INTERNAL,
  9292. { },
  9293. { { 0, 1 } },
  9294. },
  9295. /* BPF_JMP | BPF_JSLE | BPF_K */
  9296. {
  9297. "JMP_JSLE_K: Signed jump: if (-2 <= -1) return 1",
  9298. .u.insns_int = {
  9299. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9300. BPF_LD_IMM64(R1, 0xfffffffffffffffeLL),
  9301. BPF_JMP_IMM(BPF_JSLE, R1, -1, 1),
  9302. BPF_EXIT_INSN(),
  9303. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9304. BPF_EXIT_INSN(),
  9305. },
  9306. INTERNAL,
  9307. { },
  9308. { { 0, 1 } },
  9309. },
  9310. {
  9311. "JMP_JSLE_K: Signed jump: if (-1 <= -1) return 1",
  9312. .u.insns_int = {
  9313. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9314. BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
  9315. BPF_JMP_IMM(BPF_JSLE, R1, -1, 1),
  9316. BPF_EXIT_INSN(),
  9317. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9318. BPF_EXIT_INSN(),
  9319. },
  9320. INTERNAL,
  9321. { },
  9322. { { 0, 1 } },
  9323. },
  9324. {
  9325. "JMP_JSLE_K: Signed jump: value walk 1",
  9326. .u.insns_int = {
  9327. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9328. BPF_LD_IMM64(R1, 3),
  9329. BPF_JMP_IMM(BPF_JSLE, R1, 0, 6),
  9330. BPF_ALU64_IMM(BPF_SUB, R1, 1),
  9331. BPF_JMP_IMM(BPF_JSLE, R1, 0, 4),
  9332. BPF_ALU64_IMM(BPF_SUB, R1, 1),
  9333. BPF_JMP_IMM(BPF_JSLE, R1, 0, 2),
  9334. BPF_ALU64_IMM(BPF_SUB, R1, 1),
  9335. BPF_JMP_IMM(BPF_JSLE, R1, 0, 1),
  9336. BPF_EXIT_INSN(), /* bad exit */
  9337. BPF_ALU32_IMM(BPF_MOV, R0, 1), /* good exit */
  9338. BPF_EXIT_INSN(),
  9339. },
  9340. INTERNAL,
  9341. { },
  9342. { { 0, 1 } },
  9343. },
  9344. {
  9345. "JMP_JSLE_K: Signed jump: value walk 2",
  9346. .u.insns_int = {
  9347. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9348. BPF_LD_IMM64(R1, 3),
  9349. BPF_JMP_IMM(BPF_JSLE, R1, 0, 4),
  9350. BPF_ALU64_IMM(BPF_SUB, R1, 2),
  9351. BPF_JMP_IMM(BPF_JSLE, R1, 0, 2),
  9352. BPF_ALU64_IMM(BPF_SUB, R1, 2),
  9353. BPF_JMP_IMM(BPF_JSLE, R1, 0, 1),
  9354. BPF_EXIT_INSN(), /* bad exit */
  9355. BPF_ALU32_IMM(BPF_MOV, R0, 1), /* good exit */
  9356. BPF_EXIT_INSN(),
  9357. },
  9358. INTERNAL,
  9359. { },
  9360. { { 0, 1 } },
  9361. },
  9362. /* BPF_JMP | BPF_JSGE | BPF_K */
  9363. {
  9364. "JMP_JSGE_K: Signed jump: if (-1 >= -2) return 1",
  9365. .u.insns_int = {
  9366. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9367. BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
  9368. BPF_JMP_IMM(BPF_JSGE, R1, -2, 1),
  9369. BPF_EXIT_INSN(),
  9370. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9371. BPF_EXIT_INSN(),
  9372. },
  9373. INTERNAL,
  9374. { },
  9375. { { 0, 1 } },
  9376. },
  9377. {
  9378. "JMP_JSGE_K: Signed jump: if (-1 >= -1) return 1",
  9379. .u.insns_int = {
  9380. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9381. BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
  9382. BPF_JMP_IMM(BPF_JSGE, R1, -1, 1),
  9383. BPF_EXIT_INSN(),
  9384. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9385. BPF_EXIT_INSN(),
  9386. },
  9387. INTERNAL,
  9388. { },
  9389. { { 0, 1 } },
  9390. },
  9391. {
  9392. "JMP_JSGE_K: Signed jump: value walk 1",
  9393. .u.insns_int = {
  9394. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9395. BPF_LD_IMM64(R1, -3),
  9396. BPF_JMP_IMM(BPF_JSGE, R1, 0, 6),
  9397. BPF_ALU64_IMM(BPF_ADD, R1, 1),
  9398. BPF_JMP_IMM(BPF_JSGE, R1, 0, 4),
  9399. BPF_ALU64_IMM(BPF_ADD, R1, 1),
  9400. BPF_JMP_IMM(BPF_JSGE, R1, 0, 2),
  9401. BPF_ALU64_IMM(BPF_ADD, R1, 1),
  9402. BPF_JMP_IMM(BPF_JSGE, R1, 0, 1),
  9403. BPF_EXIT_INSN(), /* bad exit */
  9404. BPF_ALU32_IMM(BPF_MOV, R0, 1), /* good exit */
  9405. BPF_EXIT_INSN(),
  9406. },
  9407. INTERNAL,
  9408. { },
  9409. { { 0, 1 } },
  9410. },
  9411. {
  9412. "JMP_JSGE_K: Signed jump: value walk 2",
  9413. .u.insns_int = {
  9414. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9415. BPF_LD_IMM64(R1, -3),
  9416. BPF_JMP_IMM(BPF_JSGE, R1, 0, 4),
  9417. BPF_ALU64_IMM(BPF_ADD, R1, 2),
  9418. BPF_JMP_IMM(BPF_JSGE, R1, 0, 2),
  9419. BPF_ALU64_IMM(BPF_ADD, R1, 2),
  9420. BPF_JMP_IMM(BPF_JSGE, R1, 0, 1),
  9421. BPF_EXIT_INSN(), /* bad exit */
  9422. BPF_ALU32_IMM(BPF_MOV, R0, 1), /* good exit */
  9423. BPF_EXIT_INSN(),
  9424. },
  9425. INTERNAL,
  9426. { },
  9427. { { 0, 1 } },
  9428. },
  9429. /* BPF_JMP | BPF_JGT | BPF_K */
  9430. {
  9431. "JMP_JGT_K: if (3 > 2) return 1",
  9432. .u.insns_int = {
  9433. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9434. BPF_LD_IMM64(R1, 3),
  9435. BPF_JMP_IMM(BPF_JGT, R1, 2, 1),
  9436. BPF_EXIT_INSN(),
  9437. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9438. BPF_EXIT_INSN(),
  9439. },
  9440. INTERNAL,
  9441. { },
  9442. { { 0, 1 } },
  9443. },
  9444. {
  9445. "JMP_JGT_K: Unsigned jump: if (-1 > 1) return 1",
  9446. .u.insns_int = {
  9447. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9448. BPF_LD_IMM64(R1, -1),
  9449. BPF_JMP_IMM(BPF_JGT, R1, 1, 1),
  9450. BPF_EXIT_INSN(),
  9451. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9452. BPF_EXIT_INSN(),
  9453. },
  9454. INTERNAL,
  9455. { },
  9456. { { 0, 1 } },
  9457. },
  9458. /* BPF_JMP | BPF_JLT | BPF_K */
  9459. {
  9460. "JMP_JLT_K: if (2 < 3) return 1",
  9461. .u.insns_int = {
  9462. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9463. BPF_LD_IMM64(R1, 2),
  9464. BPF_JMP_IMM(BPF_JLT, R1, 3, 1),
  9465. BPF_EXIT_INSN(),
  9466. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9467. BPF_EXIT_INSN(),
  9468. },
  9469. INTERNAL,
  9470. { },
  9471. { { 0, 1 } },
  9472. },
  9473. {
  9474. "JMP_JGT_K: Unsigned jump: if (1 < -1) return 1",
  9475. .u.insns_int = {
  9476. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9477. BPF_LD_IMM64(R1, 1),
  9478. BPF_JMP_IMM(BPF_JLT, R1, -1, 1),
  9479. BPF_EXIT_INSN(),
  9480. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9481. BPF_EXIT_INSN(),
  9482. },
  9483. INTERNAL,
  9484. { },
  9485. { { 0, 1 } },
  9486. },
  9487. /* BPF_JMP | BPF_JGE | BPF_K */
  9488. {
  9489. "JMP_JGE_K: if (3 >= 2) return 1",
  9490. .u.insns_int = {
  9491. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9492. BPF_LD_IMM64(R1, 3),
  9493. BPF_JMP_IMM(BPF_JGE, R1, 2, 1),
  9494. BPF_EXIT_INSN(),
  9495. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9496. BPF_EXIT_INSN(),
  9497. },
  9498. INTERNAL,
  9499. { },
  9500. { { 0, 1 } },
  9501. },
  9502. /* BPF_JMP | BPF_JLE | BPF_K */
  9503. {
  9504. "JMP_JLE_K: if (2 <= 3) return 1",
  9505. .u.insns_int = {
  9506. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9507. BPF_LD_IMM64(R1, 2),
  9508. BPF_JMP_IMM(BPF_JLE, R1, 3, 1),
  9509. BPF_EXIT_INSN(),
  9510. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9511. BPF_EXIT_INSN(),
  9512. },
  9513. INTERNAL,
  9514. { },
  9515. { { 0, 1 } },
  9516. },
  9517. /* BPF_JMP | BPF_JGT | BPF_K jump backwards */
  9518. {
  9519. "JMP_JGT_K: if (3 > 2) return 1 (jump backwards)",
  9520. .u.insns_int = {
  9521. BPF_JMP_IMM(BPF_JA, 0, 0, 2), /* goto start */
  9522. BPF_ALU32_IMM(BPF_MOV, R0, 1), /* out: */
  9523. BPF_EXIT_INSN(),
  9524. BPF_ALU32_IMM(BPF_MOV, R0, 0), /* start: */
  9525. BPF_LD_IMM64(R1, 3), /* note: this takes 2 insns */
  9526. BPF_JMP_IMM(BPF_JGT, R1, 2, -6), /* goto out */
  9527. BPF_EXIT_INSN(),
  9528. },
  9529. INTERNAL,
  9530. { },
  9531. { { 0, 1 } },
  9532. },
  9533. {
  9534. "JMP_JGE_K: if (3 >= 3) return 1",
  9535. .u.insns_int = {
  9536. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9537. BPF_LD_IMM64(R1, 3),
  9538. BPF_JMP_IMM(BPF_JGE, R1, 3, 1),
  9539. BPF_EXIT_INSN(),
  9540. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9541. BPF_EXIT_INSN(),
  9542. },
  9543. INTERNAL,
  9544. { },
  9545. { { 0, 1 } },
  9546. },
  9547. /* BPF_JMP | BPF_JLT | BPF_K jump backwards */
  9548. {
  9549. "JMP_JGT_K: if (2 < 3) return 1 (jump backwards)",
  9550. .u.insns_int = {
  9551. BPF_JMP_IMM(BPF_JA, 0, 0, 2), /* goto start */
  9552. BPF_ALU32_IMM(BPF_MOV, R0, 1), /* out: */
  9553. BPF_EXIT_INSN(),
  9554. BPF_ALU32_IMM(BPF_MOV, R0, 0), /* start: */
  9555. BPF_LD_IMM64(R1, 2), /* note: this takes 2 insns */
  9556. BPF_JMP_IMM(BPF_JLT, R1, 3, -6), /* goto out */
  9557. BPF_EXIT_INSN(),
  9558. },
  9559. INTERNAL,
  9560. { },
  9561. { { 0, 1 } },
  9562. },
  9563. {
  9564. "JMP_JLE_K: if (3 <= 3) return 1",
  9565. .u.insns_int = {
  9566. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9567. BPF_LD_IMM64(R1, 3),
  9568. BPF_JMP_IMM(BPF_JLE, R1, 3, 1),
  9569. BPF_EXIT_INSN(),
  9570. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9571. BPF_EXIT_INSN(),
  9572. },
  9573. INTERNAL,
  9574. { },
  9575. { { 0, 1 } },
  9576. },
  9577. /* BPF_JMP | BPF_JNE | BPF_K */
  9578. {
  9579. "JMP_JNE_K: if (3 != 2) return 1",
  9580. .u.insns_int = {
  9581. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9582. BPF_LD_IMM64(R1, 3),
  9583. BPF_JMP_IMM(BPF_JNE, R1, 2, 1),
  9584. BPF_EXIT_INSN(),
  9585. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9586. BPF_EXIT_INSN(),
  9587. },
  9588. INTERNAL,
  9589. { },
  9590. { { 0, 1 } },
  9591. },
  9592. /* BPF_JMP | BPF_JEQ | BPF_K */
  9593. {
  9594. "JMP_JEQ_K: if (3 == 3) return 1",
  9595. .u.insns_int = {
  9596. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9597. BPF_LD_IMM64(R1, 3),
  9598. BPF_JMP_IMM(BPF_JEQ, R1, 3, 1),
  9599. BPF_EXIT_INSN(),
  9600. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9601. BPF_EXIT_INSN(),
  9602. },
  9603. INTERNAL,
  9604. { },
  9605. { { 0, 1 } },
  9606. },
  9607. /* BPF_JMP | BPF_JSET | BPF_K */
  9608. {
  9609. "JMP_JSET_K: if (0x3 & 0x2) return 1",
  9610. .u.insns_int = {
  9611. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9612. BPF_LD_IMM64(R1, 3),
  9613. BPF_JMP_IMM(BPF_JSET, R1, 2, 1),
  9614. BPF_EXIT_INSN(),
  9615. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9616. BPF_EXIT_INSN(),
  9617. },
  9618. INTERNAL,
  9619. { },
  9620. { { 0, 1 } },
  9621. },
  9622. {
  9623. "JMP_JSET_K: if (0x3 & 0xffffffff) return 1",
  9624. .u.insns_int = {
  9625. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9626. BPF_LD_IMM64(R1, 3),
  9627. BPF_JMP_IMM(BPF_JSET, R1, 0xffffffff, 1),
  9628. BPF_EXIT_INSN(),
  9629. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9630. BPF_EXIT_INSN(),
  9631. },
  9632. INTERNAL,
  9633. { },
  9634. { { 0, 1 } },
  9635. },
  9636. /* BPF_JMP | BPF_JSGT | BPF_X */
  9637. {
  9638. "JMP_JSGT_X: Signed jump: if (-1 > -2) return 1",
  9639. .u.insns_int = {
  9640. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9641. BPF_LD_IMM64(R1, -1),
  9642. BPF_LD_IMM64(R2, -2),
  9643. BPF_JMP_REG(BPF_JSGT, R1, R2, 1),
  9644. BPF_EXIT_INSN(),
  9645. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9646. BPF_EXIT_INSN(),
  9647. },
  9648. INTERNAL,
  9649. { },
  9650. { { 0, 1 } },
  9651. },
  9652. {
  9653. "JMP_JSGT_X: Signed jump: if (-1 > -1) return 0",
  9654. .u.insns_int = {
  9655. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9656. BPF_LD_IMM64(R1, -1),
  9657. BPF_LD_IMM64(R2, -1),
  9658. BPF_JMP_REG(BPF_JSGT, R1, R2, 1),
  9659. BPF_EXIT_INSN(),
  9660. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9661. BPF_EXIT_INSN(),
  9662. },
  9663. INTERNAL,
  9664. { },
  9665. { { 0, 1 } },
  9666. },
  9667. /* BPF_JMP | BPF_JSLT | BPF_X */
  9668. {
  9669. "JMP_JSLT_X: Signed jump: if (-2 < -1) return 1",
  9670. .u.insns_int = {
  9671. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9672. BPF_LD_IMM64(R1, -1),
  9673. BPF_LD_IMM64(R2, -2),
  9674. BPF_JMP_REG(BPF_JSLT, R2, R1, 1),
  9675. BPF_EXIT_INSN(),
  9676. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9677. BPF_EXIT_INSN(),
  9678. },
  9679. INTERNAL,
  9680. { },
  9681. { { 0, 1 } },
  9682. },
  9683. {
  9684. "JMP_JSLT_X: Signed jump: if (-1 < -1) return 0",
  9685. .u.insns_int = {
  9686. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9687. BPF_LD_IMM64(R1, -1),
  9688. BPF_LD_IMM64(R2, -1),
  9689. BPF_JMP_REG(BPF_JSLT, R1, R2, 1),
  9690. BPF_EXIT_INSN(),
  9691. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9692. BPF_EXIT_INSN(),
  9693. },
  9694. INTERNAL,
  9695. { },
  9696. { { 0, 1 } },
  9697. },
  9698. /* BPF_JMP | BPF_JSGE | BPF_X */
  9699. {
  9700. "JMP_JSGE_X: Signed jump: if (-1 >= -2) return 1",
  9701. .u.insns_int = {
  9702. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9703. BPF_LD_IMM64(R1, -1),
  9704. BPF_LD_IMM64(R2, -2),
  9705. BPF_JMP_REG(BPF_JSGE, R1, R2, 1),
  9706. BPF_EXIT_INSN(),
  9707. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9708. BPF_EXIT_INSN(),
  9709. },
  9710. INTERNAL,
  9711. { },
  9712. { { 0, 1 } },
  9713. },
  9714. {
  9715. "JMP_JSGE_X: Signed jump: if (-1 >= -1) return 1",
  9716. .u.insns_int = {
  9717. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9718. BPF_LD_IMM64(R1, -1),
  9719. BPF_LD_IMM64(R2, -1),
  9720. BPF_JMP_REG(BPF_JSGE, R1, R2, 1),
  9721. BPF_EXIT_INSN(),
  9722. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9723. BPF_EXIT_INSN(),
  9724. },
  9725. INTERNAL,
  9726. { },
  9727. { { 0, 1 } },
  9728. },
  9729. /* BPF_JMP | BPF_JSLE | BPF_X */
  9730. {
  9731. "JMP_JSLE_X: Signed jump: if (-2 <= -1) return 1",
  9732. .u.insns_int = {
  9733. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9734. BPF_LD_IMM64(R1, -1),
  9735. BPF_LD_IMM64(R2, -2),
  9736. BPF_JMP_REG(BPF_JSLE, R2, R1, 1),
  9737. BPF_EXIT_INSN(),
  9738. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9739. BPF_EXIT_INSN(),
  9740. },
  9741. INTERNAL,
  9742. { },
  9743. { { 0, 1 } },
  9744. },
  9745. {
  9746. "JMP_JSLE_X: Signed jump: if (-1 <= -1) return 1",
  9747. .u.insns_int = {
  9748. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9749. BPF_LD_IMM64(R1, -1),
  9750. BPF_LD_IMM64(R2, -1),
  9751. BPF_JMP_REG(BPF_JSLE, R1, R2, 1),
  9752. BPF_EXIT_INSN(),
  9753. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9754. BPF_EXIT_INSN(),
  9755. },
  9756. INTERNAL,
  9757. { },
  9758. { { 0, 1 } },
  9759. },
  9760. /* BPF_JMP | BPF_JGT | BPF_X */
  9761. {
  9762. "JMP_JGT_X: if (3 > 2) return 1",
  9763. .u.insns_int = {
  9764. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9765. BPF_LD_IMM64(R1, 3),
  9766. BPF_LD_IMM64(R2, 2),
  9767. BPF_JMP_REG(BPF_JGT, R1, R2, 1),
  9768. BPF_EXIT_INSN(),
  9769. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9770. BPF_EXIT_INSN(),
  9771. },
  9772. INTERNAL,
  9773. { },
  9774. { { 0, 1 } },
  9775. },
  9776. {
  9777. "JMP_JGT_X: Unsigned jump: if (-1 > 1) return 1",
  9778. .u.insns_int = {
  9779. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9780. BPF_LD_IMM64(R1, -1),
  9781. BPF_LD_IMM64(R2, 1),
  9782. BPF_JMP_REG(BPF_JGT, R1, R2, 1),
  9783. BPF_EXIT_INSN(),
  9784. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9785. BPF_EXIT_INSN(),
  9786. },
  9787. INTERNAL,
  9788. { },
  9789. { { 0, 1 } },
  9790. },
  9791. /* BPF_JMP | BPF_JLT | BPF_X */
  9792. {
  9793. "JMP_JLT_X: if (2 < 3) return 1",
  9794. .u.insns_int = {
  9795. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9796. BPF_LD_IMM64(R1, 3),
  9797. BPF_LD_IMM64(R2, 2),
  9798. BPF_JMP_REG(BPF_JLT, R2, R1, 1),
  9799. BPF_EXIT_INSN(),
  9800. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9801. BPF_EXIT_INSN(),
  9802. },
  9803. INTERNAL,
  9804. { },
  9805. { { 0, 1 } },
  9806. },
  9807. {
  9808. "JMP_JLT_X: Unsigned jump: if (1 < -1) return 1",
  9809. .u.insns_int = {
  9810. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9811. BPF_LD_IMM64(R1, -1),
  9812. BPF_LD_IMM64(R2, 1),
  9813. BPF_JMP_REG(BPF_JLT, R2, R1, 1),
  9814. BPF_EXIT_INSN(),
  9815. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9816. BPF_EXIT_INSN(),
  9817. },
  9818. INTERNAL,
  9819. { },
  9820. { { 0, 1 } },
  9821. },
  9822. /* BPF_JMP | BPF_JGE | BPF_X */
  9823. {
  9824. "JMP_JGE_X: if (3 >= 2) return 1",
  9825. .u.insns_int = {
  9826. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9827. BPF_LD_IMM64(R1, 3),
  9828. BPF_LD_IMM64(R2, 2),
  9829. BPF_JMP_REG(BPF_JGE, R1, R2, 1),
  9830. BPF_EXIT_INSN(),
  9831. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9832. BPF_EXIT_INSN(),
  9833. },
  9834. INTERNAL,
  9835. { },
  9836. { { 0, 1 } },
  9837. },
  9838. {
  9839. "JMP_JGE_X: if (3 >= 3) return 1",
  9840. .u.insns_int = {
  9841. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9842. BPF_LD_IMM64(R1, 3),
  9843. BPF_LD_IMM64(R2, 3),
  9844. BPF_JMP_REG(BPF_JGE, R1, R2, 1),
  9845. BPF_EXIT_INSN(),
  9846. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9847. BPF_EXIT_INSN(),
  9848. },
  9849. INTERNAL,
  9850. { },
  9851. { { 0, 1 } },
  9852. },
  9853. /* BPF_JMP | BPF_JLE | BPF_X */
  9854. {
  9855. "JMP_JLE_X: if (2 <= 3) return 1",
  9856. .u.insns_int = {
  9857. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9858. BPF_LD_IMM64(R1, 3),
  9859. BPF_LD_IMM64(R2, 2),
  9860. BPF_JMP_REG(BPF_JLE, R2, R1, 1),
  9861. BPF_EXIT_INSN(),
  9862. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9863. BPF_EXIT_INSN(),
  9864. },
  9865. INTERNAL,
  9866. { },
  9867. { { 0, 1 } },
  9868. },
  9869. {
  9870. "JMP_JLE_X: if (3 <= 3) return 1",
  9871. .u.insns_int = {
  9872. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9873. BPF_LD_IMM64(R1, 3),
  9874. BPF_LD_IMM64(R2, 3),
  9875. BPF_JMP_REG(BPF_JLE, R1, R2, 1),
  9876. BPF_EXIT_INSN(),
  9877. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9878. BPF_EXIT_INSN(),
  9879. },
  9880. INTERNAL,
  9881. { },
  9882. { { 0, 1 } },
  9883. },
  9884. {
  9885. /* Mainly testing JIT + imm64 here. */
  9886. "JMP_JGE_X: ldimm64 test 1",
  9887. .u.insns_int = {
  9888. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9889. BPF_LD_IMM64(R1, 3),
  9890. BPF_LD_IMM64(R2, 2),
  9891. BPF_JMP_REG(BPF_JGE, R1, R2, 2),
  9892. BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
  9893. BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL),
  9894. BPF_EXIT_INSN(),
  9895. },
  9896. INTERNAL,
  9897. { },
  9898. { { 0, 0xeeeeeeeeU } },
  9899. },
  9900. {
  9901. "JMP_JGE_X: ldimm64 test 2",
  9902. .u.insns_int = {
  9903. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9904. BPF_LD_IMM64(R1, 3),
  9905. BPF_LD_IMM64(R2, 2),
  9906. BPF_JMP_REG(BPF_JGE, R1, R2, 0),
  9907. BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
  9908. BPF_EXIT_INSN(),
  9909. },
  9910. INTERNAL,
  9911. { },
  9912. { { 0, 0xffffffffU } },
  9913. },
  9914. {
  9915. "JMP_JGE_X: ldimm64 test 3",
  9916. .u.insns_int = {
  9917. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9918. BPF_LD_IMM64(R1, 3),
  9919. BPF_LD_IMM64(R2, 2),
  9920. BPF_JMP_REG(BPF_JGE, R1, R2, 4),
  9921. BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
  9922. BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL),
  9923. BPF_EXIT_INSN(),
  9924. },
  9925. INTERNAL,
  9926. { },
  9927. { { 0, 1 } },
  9928. },
  9929. {
  9930. "JMP_JLE_X: ldimm64 test 1",
  9931. .u.insns_int = {
  9932. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9933. BPF_LD_IMM64(R1, 3),
  9934. BPF_LD_IMM64(R2, 2),
  9935. BPF_JMP_REG(BPF_JLE, R2, R1, 2),
  9936. BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
  9937. BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL),
  9938. BPF_EXIT_INSN(),
  9939. },
  9940. INTERNAL,
  9941. { },
  9942. { { 0, 0xeeeeeeeeU } },
  9943. },
  9944. {
  9945. "JMP_JLE_X: ldimm64 test 2",
  9946. .u.insns_int = {
  9947. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9948. BPF_LD_IMM64(R1, 3),
  9949. BPF_LD_IMM64(R2, 2),
  9950. BPF_JMP_REG(BPF_JLE, R2, R1, 0),
  9951. BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
  9952. BPF_EXIT_INSN(),
  9953. },
  9954. INTERNAL,
  9955. { },
  9956. { { 0, 0xffffffffU } },
  9957. },
  9958. {
  9959. "JMP_JLE_X: ldimm64 test 3",
  9960. .u.insns_int = {
  9961. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9962. BPF_LD_IMM64(R1, 3),
  9963. BPF_LD_IMM64(R2, 2),
  9964. BPF_JMP_REG(BPF_JLE, R2, R1, 4),
  9965. BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
  9966. BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL),
  9967. BPF_EXIT_INSN(),
  9968. },
  9969. INTERNAL,
  9970. { },
  9971. { { 0, 1 } },
  9972. },
  9973. /* BPF_JMP | BPF_JNE | BPF_X */
  9974. {
  9975. "JMP_JNE_X: if (3 != 2) return 1",
  9976. .u.insns_int = {
  9977. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9978. BPF_LD_IMM64(R1, 3),
  9979. BPF_LD_IMM64(R2, 2),
  9980. BPF_JMP_REG(BPF_JNE, R1, R2, 1),
  9981. BPF_EXIT_INSN(),
  9982. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9983. BPF_EXIT_INSN(),
  9984. },
  9985. INTERNAL,
  9986. { },
  9987. { { 0, 1 } },
  9988. },
  9989. /* BPF_JMP | BPF_JEQ | BPF_X */
  9990. {
  9991. "JMP_JEQ_X: if (3 == 3) return 1",
  9992. .u.insns_int = {
  9993. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  9994. BPF_LD_IMM64(R1, 3),
  9995. BPF_LD_IMM64(R2, 3),
  9996. BPF_JMP_REG(BPF_JEQ, R1, R2, 1),
  9997. BPF_EXIT_INSN(),
  9998. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  9999. BPF_EXIT_INSN(),
  10000. },
  10001. INTERNAL,
  10002. { },
  10003. { { 0, 1 } },
  10004. },
  10005. /* BPF_JMP | BPF_JSET | BPF_X */
  10006. {
  10007. "JMP_JSET_X: if (0x3 & 0x2) return 1",
  10008. .u.insns_int = {
  10009. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  10010. BPF_LD_IMM64(R1, 3),
  10011. BPF_LD_IMM64(R2, 2),
  10012. BPF_JMP_REG(BPF_JSET, R1, R2, 1),
  10013. BPF_EXIT_INSN(),
  10014. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  10015. BPF_EXIT_INSN(),
  10016. },
  10017. INTERNAL,
  10018. { },
  10019. { { 0, 1 } },
  10020. },
  10021. {
  10022. "JMP_JSET_X: if (0x3 & 0xffffffff) return 1",
  10023. .u.insns_int = {
  10024. BPF_ALU32_IMM(BPF_MOV, R0, 0),
  10025. BPF_LD_IMM64(R1, 3),
  10026. BPF_LD_IMM64(R2, 0xffffffff),
  10027. BPF_JMP_REG(BPF_JSET, R1, R2, 1),
  10028. BPF_EXIT_INSN(),
  10029. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  10030. BPF_EXIT_INSN(),
  10031. },
  10032. INTERNAL,
  10033. { },
  10034. { { 0, 1 } },
  10035. },
  10036. {
  10037. "JMP_JA: Jump, gap, jump, ...",
  10038. { },
  10039. CLASSIC | FLAG_NO_DATA,
  10040. { },
  10041. { { 0, 0xababcbac } },
  10042. .fill_helper = bpf_fill_ja,
  10043. },
  10044. { /* Mainly checking JIT here. */
  10045. "BPF_MAXINSNS: Maximum possible literals",
  10046. { },
  10047. CLASSIC | FLAG_NO_DATA,
  10048. { },
  10049. { { 0, 0xffffffff } },
  10050. .fill_helper = bpf_fill_maxinsns1,
  10051. },
  10052. { /* Mainly checking JIT here. */
  10053. "BPF_MAXINSNS: Single literal",
  10054. { },
  10055. CLASSIC | FLAG_NO_DATA,
  10056. { },
  10057. { { 0, 0xfefefefe } },
  10058. .fill_helper = bpf_fill_maxinsns2,
  10059. },
  10060. { /* Mainly checking JIT here. */
  10061. "BPF_MAXINSNS: Run/add until end",
  10062. { },
  10063. CLASSIC | FLAG_NO_DATA,
  10064. { },
  10065. { { 0, 0x947bf368 } },
  10066. .fill_helper = bpf_fill_maxinsns3,
  10067. },
  10068. {
  10069. "BPF_MAXINSNS: Too many instructions",
  10070. { },
  10071. CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
  10072. { },
  10073. { },
  10074. .fill_helper = bpf_fill_maxinsns4,
  10075. .expected_errcode = -EINVAL,
  10076. },
  10077. { /* Mainly checking JIT here. */
  10078. "BPF_MAXINSNS: Very long jump",
  10079. { },
  10080. CLASSIC | FLAG_NO_DATA,
  10081. { },
  10082. { { 0, 0xabababab } },
  10083. .fill_helper = bpf_fill_maxinsns5,
  10084. },
  10085. { /* Mainly checking JIT here. */
  10086. "BPF_MAXINSNS: Ctx heavy transformations",
  10087. { },
  10088. CLASSIC,
  10089. { },
  10090. {
  10091. { 1, SKB_VLAN_PRESENT },
  10092. { 10, SKB_VLAN_PRESENT }
  10093. },
  10094. .fill_helper = bpf_fill_maxinsns6,
  10095. },
  10096. { /* Mainly checking JIT here. */
  10097. "BPF_MAXINSNS: Call heavy transformations",
  10098. { },
  10099. CLASSIC | FLAG_NO_DATA,
  10100. { },
  10101. { { 1, 0 }, { 10, 0 } },
  10102. .fill_helper = bpf_fill_maxinsns7,
  10103. },
  10104. { /* Mainly checking JIT here. */
  10105. "BPF_MAXINSNS: Jump heavy test",
  10106. { },
  10107. CLASSIC | FLAG_NO_DATA,
  10108. { },
  10109. { { 0, 0xffffffff } },
  10110. .fill_helper = bpf_fill_maxinsns8,
  10111. },
  10112. { /* Mainly checking JIT here. */
  10113. "BPF_MAXINSNS: Very long jump backwards",
  10114. { },
  10115. INTERNAL | FLAG_NO_DATA,
  10116. { },
  10117. { { 0, 0xcbababab } },
  10118. .fill_helper = bpf_fill_maxinsns9,
  10119. },
  10120. { /* Mainly checking JIT here. */
  10121. "BPF_MAXINSNS: Edge hopping nuthouse",
  10122. { },
  10123. INTERNAL | FLAG_NO_DATA,
  10124. { },
  10125. { { 0, 0xabababac } },
  10126. .fill_helper = bpf_fill_maxinsns10,
  10127. },
  10128. {
  10129. "BPF_MAXINSNS: Jump, gap, jump, ...",
  10130. { },
  10131. CLASSIC | FLAG_NO_DATA,
  10132. { },
  10133. { { 0, 0xababcbac } },
  10134. .fill_helper = bpf_fill_maxinsns11,
  10135. },
  10136. {
  10137. "BPF_MAXINSNS: jump over MSH",
  10138. { },
  10139. CLASSIC | FLAG_EXPECTED_FAIL,
  10140. { 0xfa, 0xfb, 0xfc, 0xfd, },
  10141. { { 4, 0xabababab } },
  10142. .fill_helper = bpf_fill_maxinsns12,
  10143. .expected_errcode = -EINVAL,
  10144. },
  10145. {
  10146. "BPF_MAXINSNS: exec all MSH",
  10147. { },
  10148. CLASSIC,
  10149. { 0xfa, 0xfb, 0xfc, 0xfd, },
  10150. { { 4, 0xababab83 } },
  10151. .fill_helper = bpf_fill_maxinsns13,
  10152. },
  10153. {
  10154. "BPF_MAXINSNS: ld_abs+get_processor_id",
  10155. { },
  10156. CLASSIC,
  10157. { },
  10158. { { 1, 0xbee } },
  10159. .fill_helper = bpf_fill_ld_abs_get_processor_id,
  10160. },
  10161. /*
  10162. * LD_IND / LD_ABS on fragmented SKBs
  10163. */
  10164. {
  10165. "LD_IND byte frag",
  10166. .u.insns = {
  10167. BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
  10168. BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x0),
  10169. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10170. },
  10171. CLASSIC | FLAG_SKB_FRAG,
  10172. { },
  10173. { {0x40, 0x42} },
  10174. .frag_data = {
  10175. 0x42, 0x00, 0x00, 0x00,
  10176. 0x43, 0x44, 0x00, 0x00,
  10177. 0x21, 0x07, 0x19, 0x83,
  10178. },
  10179. },
  10180. {
  10181. "LD_IND halfword frag",
  10182. .u.insns = {
  10183. BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
  10184. BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x4),
  10185. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10186. },
  10187. CLASSIC | FLAG_SKB_FRAG,
  10188. { },
  10189. { {0x40, 0x4344} },
  10190. .frag_data = {
  10191. 0x42, 0x00, 0x00, 0x00,
  10192. 0x43, 0x44, 0x00, 0x00,
  10193. 0x21, 0x07, 0x19, 0x83,
  10194. },
  10195. },
  10196. {
  10197. "LD_IND word frag",
  10198. .u.insns = {
  10199. BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
  10200. BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x8),
  10201. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10202. },
  10203. CLASSIC | FLAG_SKB_FRAG,
  10204. { },
  10205. { {0x40, 0x21071983} },
  10206. .frag_data = {
  10207. 0x42, 0x00, 0x00, 0x00,
  10208. 0x43, 0x44, 0x00, 0x00,
  10209. 0x21, 0x07, 0x19, 0x83,
  10210. },
  10211. },
  10212. {
  10213. "LD_IND halfword mixed head/frag",
  10214. .u.insns = {
  10215. BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
  10216. BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x1),
  10217. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10218. },
  10219. CLASSIC | FLAG_SKB_FRAG,
  10220. { [0x3e] = 0x25, [0x3f] = 0x05, },
  10221. { {0x40, 0x0519} },
  10222. .frag_data = { 0x19, 0x82 },
  10223. },
  10224. {
  10225. "LD_IND word mixed head/frag",
  10226. .u.insns = {
  10227. BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
  10228. BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x2),
  10229. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10230. },
  10231. CLASSIC | FLAG_SKB_FRAG,
  10232. { [0x3e] = 0x25, [0x3f] = 0x05, },
  10233. { {0x40, 0x25051982} },
  10234. .frag_data = { 0x19, 0x82 },
  10235. },
  10236. {
  10237. "LD_ABS byte frag",
  10238. .u.insns = {
  10239. BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x40),
  10240. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10241. },
  10242. CLASSIC | FLAG_SKB_FRAG,
  10243. { },
  10244. { {0x40, 0x42} },
  10245. .frag_data = {
  10246. 0x42, 0x00, 0x00, 0x00,
  10247. 0x43, 0x44, 0x00, 0x00,
  10248. 0x21, 0x07, 0x19, 0x83,
  10249. },
  10250. },
  10251. {
  10252. "LD_ABS halfword frag",
  10253. .u.insns = {
  10254. BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x44),
  10255. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10256. },
  10257. CLASSIC | FLAG_SKB_FRAG,
  10258. { },
  10259. { {0x40, 0x4344} },
  10260. .frag_data = {
  10261. 0x42, 0x00, 0x00, 0x00,
  10262. 0x43, 0x44, 0x00, 0x00,
  10263. 0x21, 0x07, 0x19, 0x83,
  10264. },
  10265. },
  10266. {
  10267. "LD_ABS word frag",
  10268. .u.insns = {
  10269. BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x48),
  10270. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10271. },
  10272. CLASSIC | FLAG_SKB_FRAG,
  10273. { },
  10274. { {0x40, 0x21071983} },
  10275. .frag_data = {
  10276. 0x42, 0x00, 0x00, 0x00,
  10277. 0x43, 0x44, 0x00, 0x00,
  10278. 0x21, 0x07, 0x19, 0x83,
  10279. },
  10280. },
  10281. {
  10282. "LD_ABS halfword mixed head/frag",
  10283. .u.insns = {
  10284. BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x3f),
  10285. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10286. },
  10287. CLASSIC | FLAG_SKB_FRAG,
  10288. { [0x3e] = 0x25, [0x3f] = 0x05, },
  10289. { {0x40, 0x0519} },
  10290. .frag_data = { 0x19, 0x82 },
  10291. },
  10292. {
  10293. "LD_ABS word mixed head/frag",
  10294. .u.insns = {
  10295. BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x3e),
  10296. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10297. },
  10298. CLASSIC | FLAG_SKB_FRAG,
  10299. { [0x3e] = 0x25, [0x3f] = 0x05, },
  10300. { {0x40, 0x25051982} },
  10301. .frag_data = { 0x19, 0x82 },
  10302. },
  10303. /*
  10304. * LD_IND / LD_ABS on non fragmented SKBs
  10305. */
  10306. {
  10307. /*
  10308. * this tests that the JIT/interpreter correctly resets X
  10309. * before using it in an LD_IND instruction.
  10310. */
  10311. "LD_IND byte default X",
  10312. .u.insns = {
  10313. BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
  10314. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10315. },
  10316. CLASSIC,
  10317. { [0x1] = 0x42 },
  10318. { {0x40, 0x42 } },
  10319. },
  10320. {
  10321. "LD_IND byte positive offset",
  10322. .u.insns = {
  10323. BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
  10324. BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
  10325. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10326. },
  10327. CLASSIC,
  10328. { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 },
  10329. { {0x40, 0x82 } },
  10330. },
  10331. {
  10332. "LD_IND byte negative offset",
  10333. .u.insns = {
  10334. BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
  10335. BPF_STMT(BPF_LD | BPF_IND | BPF_B, -0x1),
  10336. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10337. },
  10338. CLASSIC,
  10339. { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 },
  10340. { {0x40, 0x05 } },
  10341. },
  10342. {
  10343. "LD_IND byte positive offset, all ff",
  10344. .u.insns = {
  10345. BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
  10346. BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
  10347. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10348. },
  10349. CLASSIC,
  10350. { [0x3c] = 0xff, [0x3d] = 0xff, [0x3e] = 0xff, [0x3f] = 0xff },
  10351. { {0x40, 0xff } },
  10352. },
  10353. {
  10354. "LD_IND byte positive offset, out of bounds",
  10355. .u.insns = {
  10356. BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
  10357. BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
  10358. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10359. },
  10360. CLASSIC,
  10361. { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 },
  10362. { {0x3f, 0 }, },
  10363. },
  10364. {
  10365. "LD_IND byte negative offset, out of bounds",
  10366. .u.insns = {
  10367. BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
  10368. BPF_STMT(BPF_LD | BPF_IND | BPF_B, -0x3f),
  10369. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10370. },
  10371. CLASSIC,
  10372. { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 },
  10373. { {0x3f, 0 } },
  10374. },
  10375. {
  10376. "LD_IND byte negative offset, multiple calls",
  10377. .u.insns = {
  10378. BPF_STMT(BPF_LDX | BPF_IMM, 0x3b),
  10379. BPF_STMT(BPF_LD | BPF_IND | BPF_B, SKF_LL_OFF + 1),
  10380. BPF_STMT(BPF_LD | BPF_IND | BPF_B, SKF_LL_OFF + 2),
  10381. BPF_STMT(BPF_LD | BPF_IND | BPF_B, SKF_LL_OFF + 3),
  10382. BPF_STMT(BPF_LD | BPF_IND | BPF_B, SKF_LL_OFF + 4),
  10383. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10384. },
  10385. CLASSIC,
  10386. { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 },
  10387. { {0x40, 0x82 }, },
  10388. },
  10389. {
  10390. "LD_IND halfword positive offset",
  10391. .u.insns = {
  10392. BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
  10393. BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x2),
  10394. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10395. },
  10396. CLASSIC,
  10397. {
  10398. [0x1c] = 0xaa, [0x1d] = 0x55,
  10399. [0x1e] = 0xbb, [0x1f] = 0x66,
  10400. [0x20] = 0xcc, [0x21] = 0x77,
  10401. [0x22] = 0xdd, [0x23] = 0x88,
  10402. },
  10403. { {0x40, 0xdd88 } },
  10404. },
  10405. {
  10406. "LD_IND halfword negative offset",
  10407. .u.insns = {
  10408. BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
  10409. BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x2),
  10410. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10411. },
  10412. CLASSIC,
  10413. {
  10414. [0x1c] = 0xaa, [0x1d] = 0x55,
  10415. [0x1e] = 0xbb, [0x1f] = 0x66,
  10416. [0x20] = 0xcc, [0x21] = 0x77,
  10417. [0x22] = 0xdd, [0x23] = 0x88,
  10418. },
  10419. { {0x40, 0xbb66 } },
  10420. },
  10421. {
  10422. "LD_IND halfword unaligned",
  10423. .u.insns = {
  10424. BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
  10425. BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x1),
  10426. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10427. },
  10428. CLASSIC,
  10429. {
  10430. [0x1c] = 0xaa, [0x1d] = 0x55,
  10431. [0x1e] = 0xbb, [0x1f] = 0x66,
  10432. [0x20] = 0xcc, [0x21] = 0x77,
  10433. [0x22] = 0xdd, [0x23] = 0x88,
  10434. },
  10435. { {0x40, 0x66cc } },
  10436. },
  10437. {
  10438. "LD_IND halfword positive offset, all ff",
  10439. .u.insns = {
  10440. BPF_STMT(BPF_LDX | BPF_IMM, 0x3d),
  10441. BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x1),
  10442. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10443. },
  10444. CLASSIC,
  10445. { [0x3c] = 0xff, [0x3d] = 0xff, [0x3e] = 0xff, [0x3f] = 0xff },
  10446. { {0x40, 0xffff } },
  10447. },
  10448. {
  10449. "LD_IND halfword positive offset, out of bounds",
  10450. .u.insns = {
  10451. BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
  10452. BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x1),
  10453. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10454. },
  10455. CLASSIC,
  10456. { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 },
  10457. { {0x3f, 0 }, },
  10458. },
  10459. {
  10460. "LD_IND halfword negative offset, out of bounds",
  10461. .u.insns = {
  10462. BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
  10463. BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x3f),
  10464. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10465. },
  10466. CLASSIC,
  10467. { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 },
  10468. { {0x3f, 0 } },
  10469. },
  10470. {
  10471. "LD_IND word positive offset",
  10472. .u.insns = {
  10473. BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
  10474. BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x4),
  10475. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10476. },
  10477. CLASSIC,
  10478. {
  10479. [0x1c] = 0xaa, [0x1d] = 0x55,
  10480. [0x1e] = 0xbb, [0x1f] = 0x66,
  10481. [0x20] = 0xcc, [0x21] = 0x77,
  10482. [0x22] = 0xdd, [0x23] = 0x88,
  10483. [0x24] = 0xee, [0x25] = 0x99,
  10484. [0x26] = 0xff, [0x27] = 0xaa,
  10485. },
  10486. { {0x40, 0xee99ffaa } },
  10487. },
  10488. {
  10489. "LD_IND word negative offset",
  10490. .u.insns = {
  10491. BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
  10492. BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x4),
  10493. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10494. },
  10495. CLASSIC,
  10496. {
  10497. [0x1c] = 0xaa, [0x1d] = 0x55,
  10498. [0x1e] = 0xbb, [0x1f] = 0x66,
  10499. [0x20] = 0xcc, [0x21] = 0x77,
  10500. [0x22] = 0xdd, [0x23] = 0x88,
  10501. [0x24] = 0xee, [0x25] = 0x99,
  10502. [0x26] = 0xff, [0x27] = 0xaa,
  10503. },
  10504. { {0x40, 0xaa55bb66 } },
  10505. },
  10506. {
  10507. "LD_IND word unaligned (addr & 3 == 2)",
  10508. .u.insns = {
  10509. BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
  10510. BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x2),
  10511. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10512. },
  10513. CLASSIC,
  10514. {
  10515. [0x1c] = 0xaa, [0x1d] = 0x55,
  10516. [0x1e] = 0xbb, [0x1f] = 0x66,
  10517. [0x20] = 0xcc, [0x21] = 0x77,
  10518. [0x22] = 0xdd, [0x23] = 0x88,
  10519. [0x24] = 0xee, [0x25] = 0x99,
  10520. [0x26] = 0xff, [0x27] = 0xaa,
  10521. },
  10522. { {0x40, 0xbb66cc77 } },
  10523. },
  10524. {
  10525. "LD_IND word unaligned (addr & 3 == 1)",
  10526. .u.insns = {
  10527. BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
  10528. BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x3),
  10529. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10530. },
  10531. CLASSIC,
  10532. {
  10533. [0x1c] = 0xaa, [0x1d] = 0x55,
  10534. [0x1e] = 0xbb, [0x1f] = 0x66,
  10535. [0x20] = 0xcc, [0x21] = 0x77,
  10536. [0x22] = 0xdd, [0x23] = 0x88,
  10537. [0x24] = 0xee, [0x25] = 0x99,
  10538. [0x26] = 0xff, [0x27] = 0xaa,
  10539. },
  10540. { {0x40, 0x55bb66cc } },
  10541. },
  10542. {
  10543. "LD_IND word unaligned (addr & 3 == 3)",
  10544. .u.insns = {
  10545. BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
  10546. BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x1),
  10547. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10548. },
  10549. CLASSIC,
  10550. {
  10551. [0x1c] = 0xaa, [0x1d] = 0x55,
  10552. [0x1e] = 0xbb, [0x1f] = 0x66,
  10553. [0x20] = 0xcc, [0x21] = 0x77,
  10554. [0x22] = 0xdd, [0x23] = 0x88,
  10555. [0x24] = 0xee, [0x25] = 0x99,
  10556. [0x26] = 0xff, [0x27] = 0xaa,
  10557. },
  10558. { {0x40, 0x66cc77dd } },
  10559. },
  10560. {
  10561. "LD_IND word positive offset, all ff",
  10562. .u.insns = {
  10563. BPF_STMT(BPF_LDX | BPF_IMM, 0x3b),
  10564. BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x1),
  10565. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10566. },
  10567. CLASSIC,
  10568. { [0x3c] = 0xff, [0x3d] = 0xff, [0x3e] = 0xff, [0x3f] = 0xff },
  10569. { {0x40, 0xffffffff } },
  10570. },
  10571. {
  10572. "LD_IND word positive offset, out of bounds",
  10573. .u.insns = {
  10574. BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
  10575. BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x1),
  10576. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10577. },
  10578. CLASSIC,
  10579. { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 },
  10580. { {0x3f, 0 }, },
  10581. },
  10582. {
  10583. "LD_IND word negative offset, out of bounds",
  10584. .u.insns = {
  10585. BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
  10586. BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x3f),
  10587. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10588. },
  10589. CLASSIC,
  10590. { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 },
  10591. { {0x3f, 0 } },
  10592. },
  10593. {
  10594. "LD_ABS byte",
  10595. .u.insns = {
  10596. BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x20),
  10597. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10598. },
  10599. CLASSIC,
  10600. {
  10601. [0x1c] = 0xaa, [0x1d] = 0x55,
  10602. [0x1e] = 0xbb, [0x1f] = 0x66,
  10603. [0x20] = 0xcc, [0x21] = 0x77,
  10604. [0x22] = 0xdd, [0x23] = 0x88,
  10605. [0x24] = 0xee, [0x25] = 0x99,
  10606. [0x26] = 0xff, [0x27] = 0xaa,
  10607. },
  10608. { {0x40, 0xcc } },
  10609. },
  10610. {
  10611. "LD_ABS byte positive offset, all ff",
  10612. .u.insns = {
  10613. BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x3f),
  10614. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10615. },
  10616. CLASSIC,
  10617. { [0x3c] = 0xff, [0x3d] = 0xff, [0x3e] = 0xff, [0x3f] = 0xff },
  10618. { {0x40, 0xff } },
  10619. },
  10620. {
  10621. "LD_ABS byte positive offset, out of bounds",
  10622. .u.insns = {
  10623. BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x3f),
  10624. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10625. },
  10626. CLASSIC,
  10627. { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 },
  10628. { {0x3f, 0 }, },
  10629. },
  10630. {
  10631. "LD_ABS byte negative offset, out of bounds load",
  10632. .u.insns = {
  10633. BPF_STMT(BPF_LD | BPF_ABS | BPF_B, -1),
  10634. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10635. },
  10636. CLASSIC | FLAG_EXPECTED_FAIL,
  10637. .expected_errcode = -EINVAL,
  10638. },
  10639. {
  10640. "LD_ABS byte negative offset, in bounds",
  10641. .u.insns = {
  10642. BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3f),
  10643. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10644. },
  10645. CLASSIC,
  10646. { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 },
  10647. { {0x40, 0x82 }, },
  10648. },
  10649. {
  10650. "LD_ABS byte negative offset, out of bounds",
  10651. .u.insns = {
  10652. BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3f),
  10653. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10654. },
  10655. CLASSIC,
  10656. { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 },
  10657. { {0x3f, 0 }, },
  10658. },
  10659. {
  10660. "LD_ABS byte negative offset, multiple calls",
  10661. .u.insns = {
  10662. BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3c),
  10663. BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3d),
  10664. BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3e),
  10665. BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3f),
  10666. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10667. },
  10668. CLASSIC,
  10669. { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 },
  10670. { {0x40, 0x82 }, },
  10671. },
  10672. {
  10673. "LD_ABS halfword",
  10674. .u.insns = {
  10675. BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x22),
  10676. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10677. },
  10678. CLASSIC,
  10679. {
  10680. [0x1c] = 0xaa, [0x1d] = 0x55,
  10681. [0x1e] = 0xbb, [0x1f] = 0x66,
  10682. [0x20] = 0xcc, [0x21] = 0x77,
  10683. [0x22] = 0xdd, [0x23] = 0x88,
  10684. [0x24] = 0xee, [0x25] = 0x99,
  10685. [0x26] = 0xff, [0x27] = 0xaa,
  10686. },
  10687. { {0x40, 0xdd88 } },
  10688. },
  10689. {
  10690. "LD_ABS halfword unaligned",
  10691. .u.insns = {
  10692. BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x25),
  10693. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10694. },
  10695. CLASSIC,
  10696. {
  10697. [0x1c] = 0xaa, [0x1d] = 0x55,
  10698. [0x1e] = 0xbb, [0x1f] = 0x66,
  10699. [0x20] = 0xcc, [0x21] = 0x77,
  10700. [0x22] = 0xdd, [0x23] = 0x88,
  10701. [0x24] = 0xee, [0x25] = 0x99,
  10702. [0x26] = 0xff, [0x27] = 0xaa,
  10703. },
  10704. { {0x40, 0x99ff } },
  10705. },
  10706. {
  10707. "LD_ABS halfword positive offset, all ff",
  10708. .u.insns = {
  10709. BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x3e),
  10710. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10711. },
  10712. CLASSIC,
  10713. { [0x3c] = 0xff, [0x3d] = 0xff, [0x3e] = 0xff, [0x3f] = 0xff },
  10714. { {0x40, 0xffff } },
  10715. },
  10716. {
  10717. "LD_ABS halfword positive offset, out of bounds",
  10718. .u.insns = {
  10719. BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x3f),
  10720. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10721. },
  10722. CLASSIC,
  10723. { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 },
  10724. { {0x3f, 0 }, },
  10725. },
  10726. {
  10727. "LD_ABS halfword negative offset, out of bounds load",
  10728. .u.insns = {
  10729. BPF_STMT(BPF_LD | BPF_ABS | BPF_H, -1),
  10730. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10731. },
  10732. CLASSIC | FLAG_EXPECTED_FAIL,
  10733. .expected_errcode = -EINVAL,
  10734. },
  10735. {
  10736. "LD_ABS halfword negative offset, in bounds",
  10737. .u.insns = {
  10738. BPF_STMT(BPF_LD | BPF_ABS | BPF_H, SKF_LL_OFF + 0x3e),
  10739. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10740. },
  10741. CLASSIC,
  10742. { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 },
  10743. { {0x40, 0x1982 }, },
  10744. },
  10745. {
  10746. "LD_ABS halfword negative offset, out of bounds",
  10747. .u.insns = {
  10748. BPF_STMT(BPF_LD | BPF_ABS | BPF_H, SKF_LL_OFF + 0x3e),
  10749. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10750. },
  10751. CLASSIC,
  10752. { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 },
  10753. { {0x3f, 0 }, },
  10754. },
  10755. {
  10756. "LD_ABS word",
  10757. .u.insns = {
  10758. BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x1c),
  10759. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10760. },
  10761. CLASSIC,
  10762. {
  10763. [0x1c] = 0xaa, [0x1d] = 0x55,
  10764. [0x1e] = 0xbb, [0x1f] = 0x66,
  10765. [0x20] = 0xcc, [0x21] = 0x77,
  10766. [0x22] = 0xdd, [0x23] = 0x88,
  10767. [0x24] = 0xee, [0x25] = 0x99,
  10768. [0x26] = 0xff, [0x27] = 0xaa,
  10769. },
  10770. { {0x40, 0xaa55bb66 } },
  10771. },
  10772. {
  10773. "LD_ABS word unaligned (addr & 3 == 2)",
  10774. .u.insns = {
  10775. BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x22),
  10776. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10777. },
  10778. CLASSIC,
  10779. {
  10780. [0x1c] = 0xaa, [0x1d] = 0x55,
  10781. [0x1e] = 0xbb, [0x1f] = 0x66,
  10782. [0x20] = 0xcc, [0x21] = 0x77,
  10783. [0x22] = 0xdd, [0x23] = 0x88,
  10784. [0x24] = 0xee, [0x25] = 0x99,
  10785. [0x26] = 0xff, [0x27] = 0xaa,
  10786. },
  10787. { {0x40, 0xdd88ee99 } },
  10788. },
  10789. {
  10790. "LD_ABS word unaligned (addr & 3 == 1)",
  10791. .u.insns = {
  10792. BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x21),
  10793. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10794. },
  10795. CLASSIC,
  10796. {
  10797. [0x1c] = 0xaa, [0x1d] = 0x55,
  10798. [0x1e] = 0xbb, [0x1f] = 0x66,
  10799. [0x20] = 0xcc, [0x21] = 0x77,
  10800. [0x22] = 0xdd, [0x23] = 0x88,
  10801. [0x24] = 0xee, [0x25] = 0x99,
  10802. [0x26] = 0xff, [0x27] = 0xaa,
  10803. },
  10804. { {0x40, 0x77dd88ee } },
  10805. },
  10806. {
  10807. "LD_ABS word unaligned (addr & 3 == 3)",
  10808. .u.insns = {
  10809. BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x23),
  10810. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10811. },
  10812. CLASSIC,
  10813. {
  10814. [0x1c] = 0xaa, [0x1d] = 0x55,
  10815. [0x1e] = 0xbb, [0x1f] = 0x66,
  10816. [0x20] = 0xcc, [0x21] = 0x77,
  10817. [0x22] = 0xdd, [0x23] = 0x88,
  10818. [0x24] = 0xee, [0x25] = 0x99,
  10819. [0x26] = 0xff, [0x27] = 0xaa,
  10820. },
  10821. { {0x40, 0x88ee99ff } },
  10822. },
  10823. {
  10824. "LD_ABS word positive offset, all ff",
  10825. .u.insns = {
  10826. BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x3c),
  10827. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10828. },
  10829. CLASSIC,
  10830. { [0x3c] = 0xff, [0x3d] = 0xff, [0x3e] = 0xff, [0x3f] = 0xff },
  10831. { {0x40, 0xffffffff } },
  10832. },
  10833. {
  10834. "LD_ABS word positive offset, out of bounds",
  10835. .u.insns = {
  10836. BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x3f),
  10837. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10838. },
  10839. CLASSIC,
  10840. { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 },
  10841. { {0x3f, 0 }, },
  10842. },
  10843. {
  10844. "LD_ABS word negative offset, out of bounds load",
  10845. .u.insns = {
  10846. BPF_STMT(BPF_LD | BPF_ABS | BPF_W, -1),
  10847. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10848. },
  10849. CLASSIC | FLAG_EXPECTED_FAIL,
  10850. .expected_errcode = -EINVAL,
  10851. },
  10852. {
  10853. "LD_ABS word negative offset, in bounds",
  10854. .u.insns = {
  10855. BPF_STMT(BPF_LD | BPF_ABS | BPF_W, SKF_LL_OFF + 0x3c),
  10856. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10857. },
  10858. CLASSIC,
  10859. { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 },
  10860. { {0x40, 0x25051982 }, },
  10861. },
  10862. {
  10863. "LD_ABS word negative offset, out of bounds",
  10864. .u.insns = {
  10865. BPF_STMT(BPF_LD | BPF_ABS | BPF_W, SKF_LL_OFF + 0x3c),
  10866. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10867. },
  10868. CLASSIC,
  10869. { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 },
  10870. { {0x3f, 0 }, },
  10871. },
  10872. {
  10873. "LDX_MSH standalone, preserved A",
  10874. .u.insns = {
  10875. BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
  10876. BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3c),
  10877. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10878. },
  10879. CLASSIC,
  10880. { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 },
  10881. { {0x40, 0xffeebbaa }, },
  10882. },
  10883. {
  10884. "LDX_MSH standalone, preserved A 2",
  10885. .u.insns = {
  10886. BPF_STMT(BPF_LD | BPF_IMM, 0x175e9d63),
  10887. BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3c),
  10888. BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3d),
  10889. BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3e),
  10890. BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3f),
  10891. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10892. },
  10893. CLASSIC,
  10894. { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 },
  10895. { {0x40, 0x175e9d63 }, },
  10896. },
  10897. {
  10898. "LDX_MSH standalone, test result 1",
  10899. .u.insns = {
  10900. BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
  10901. BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3c),
  10902. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  10903. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10904. },
  10905. CLASSIC,
  10906. { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 },
  10907. { {0x40, 0x14 }, },
  10908. },
  10909. {
  10910. "LDX_MSH standalone, test result 2",
  10911. .u.insns = {
  10912. BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
  10913. BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3e),
  10914. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  10915. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10916. },
  10917. CLASSIC,
  10918. { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 },
  10919. { {0x40, 0x24 }, },
  10920. },
  10921. {
  10922. "LDX_MSH standalone, negative offset",
  10923. .u.insns = {
  10924. BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
  10925. BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, -1),
  10926. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  10927. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10928. },
  10929. CLASSIC,
  10930. { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 },
  10931. { {0x40, 0 }, },
  10932. },
  10933. {
  10934. "LDX_MSH standalone, negative offset 2",
  10935. .u.insns = {
  10936. BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
  10937. BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, SKF_LL_OFF + 0x3e),
  10938. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  10939. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10940. },
  10941. CLASSIC,
  10942. { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 },
  10943. { {0x40, 0x24 }, },
  10944. },
  10945. {
  10946. "LDX_MSH standalone, out of bounds",
  10947. .u.insns = {
  10948. BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
  10949. BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x40),
  10950. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  10951. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10952. },
  10953. CLASSIC,
  10954. { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 },
  10955. { {0x40, 0 }, },
  10956. },
  10957. /*
  10958. * verify that the interpreter or JIT correctly sets A and X
  10959. * to 0.
  10960. */
  10961. {
  10962. "ADD default X",
  10963. .u.insns = {
  10964. /*
  10965. * A = 0x42
  10966. * A = A + X
  10967. * ret A
  10968. */
  10969. BPF_STMT(BPF_LD | BPF_IMM, 0x42),
  10970. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  10971. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10972. },
  10973. CLASSIC | FLAG_NO_DATA,
  10974. {},
  10975. { {0x1, 0x42 } },
  10976. },
  10977. {
  10978. "ADD default A",
  10979. .u.insns = {
  10980. /*
  10981. * A = A + 0x42
  10982. * ret A
  10983. */
  10984. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 0x42),
  10985. BPF_STMT(BPF_RET | BPF_A, 0x0),
  10986. },
  10987. CLASSIC | FLAG_NO_DATA,
  10988. {},
  10989. { {0x1, 0x42 } },
  10990. },
  10991. {
  10992. "SUB default X",
  10993. .u.insns = {
  10994. /*
  10995. * A = 0x66
  10996. * A = A - X
  10997. * ret A
  10998. */
  10999. BPF_STMT(BPF_LD | BPF_IMM, 0x66),
  11000. BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
  11001. BPF_STMT(BPF_RET | BPF_A, 0x0),
  11002. },
  11003. CLASSIC | FLAG_NO_DATA,
  11004. {},
  11005. { {0x1, 0x66 } },
  11006. },
  11007. {
  11008. "SUB default A",
  11009. .u.insns = {
  11010. /*
  11011. * A = A - -0x66
  11012. * ret A
  11013. */
  11014. BPF_STMT(BPF_ALU | BPF_SUB | BPF_K, -0x66),
  11015. BPF_STMT(BPF_RET | BPF_A, 0x0),
  11016. },
  11017. CLASSIC | FLAG_NO_DATA,
  11018. {},
  11019. { {0x1, 0x66 } },
  11020. },
  11021. {
  11022. "MUL default X",
  11023. .u.insns = {
  11024. /*
  11025. * A = 0x42
  11026. * A = A * X
  11027. * ret A
  11028. */
  11029. BPF_STMT(BPF_LD | BPF_IMM, 0x42),
  11030. BPF_STMT(BPF_ALU | BPF_MUL | BPF_X, 0),
  11031. BPF_STMT(BPF_RET | BPF_A, 0x0),
  11032. },
  11033. CLASSIC | FLAG_NO_DATA,
  11034. {},
  11035. { {0x1, 0x0 } },
  11036. },
  11037. {
  11038. "MUL default A",
  11039. .u.insns = {
  11040. /*
  11041. * A = A * 0x66
  11042. * ret A
  11043. */
  11044. BPF_STMT(BPF_ALU | BPF_MUL | BPF_K, 0x66),
  11045. BPF_STMT(BPF_RET | BPF_A, 0x0),
  11046. },
  11047. CLASSIC | FLAG_NO_DATA,
  11048. {},
  11049. { {0x1, 0x0 } },
  11050. },
  11051. {
  11052. "DIV default X",
  11053. .u.insns = {
  11054. /*
  11055. * A = 0x42
  11056. * A = A / X ; this halt the filter execution if X is 0
  11057. * ret 0x42
  11058. */
  11059. BPF_STMT(BPF_LD | BPF_IMM, 0x42),
  11060. BPF_STMT(BPF_ALU | BPF_DIV | BPF_X, 0),
  11061. BPF_STMT(BPF_RET | BPF_K, 0x42),
  11062. },
  11063. CLASSIC | FLAG_NO_DATA,
  11064. {},
  11065. { {0x1, 0x0 } },
  11066. },
  11067. {
  11068. "DIV default A",
  11069. .u.insns = {
  11070. /*
  11071. * A = A / 1
  11072. * ret A
  11073. */
  11074. BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0x1),
  11075. BPF_STMT(BPF_RET | BPF_A, 0x0),
  11076. },
  11077. CLASSIC | FLAG_NO_DATA,
  11078. {},
  11079. { {0x1, 0x0 } },
  11080. },
  11081. {
  11082. "MOD default X",
  11083. .u.insns = {
  11084. /*
  11085. * A = 0x42
  11086. * A = A mod X ; this halt the filter execution if X is 0
  11087. * ret 0x42
  11088. */
  11089. BPF_STMT(BPF_LD | BPF_IMM, 0x42),
  11090. BPF_STMT(BPF_ALU | BPF_MOD | BPF_X, 0),
  11091. BPF_STMT(BPF_RET | BPF_K, 0x42),
  11092. },
  11093. CLASSIC | FLAG_NO_DATA,
  11094. {},
  11095. { {0x1, 0x0 } },
  11096. },
  11097. {
  11098. "MOD default A",
  11099. .u.insns = {
  11100. /*
  11101. * A = A mod 1
  11102. * ret A
  11103. */
  11104. BPF_STMT(BPF_ALU | BPF_MOD | BPF_K, 0x1),
  11105. BPF_STMT(BPF_RET | BPF_A, 0x0),
  11106. },
  11107. CLASSIC | FLAG_NO_DATA,
  11108. {},
  11109. { {0x1, 0x0 } },
  11110. },
  11111. {
  11112. "JMP EQ default A",
  11113. .u.insns = {
  11114. /*
  11115. * cmp A, 0x0, 0, 1
  11116. * ret 0x42
  11117. * ret 0x66
  11118. */
  11119. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x0, 0, 1),
  11120. BPF_STMT(BPF_RET | BPF_K, 0x42),
  11121. BPF_STMT(BPF_RET | BPF_K, 0x66),
  11122. },
  11123. CLASSIC | FLAG_NO_DATA,
  11124. {},
  11125. { {0x1, 0x42 } },
  11126. },
  11127. {
  11128. "JMP EQ default X",
  11129. .u.insns = {
  11130. /*
  11131. * A = 0x0
  11132. * cmp A, X, 0, 1
  11133. * ret 0x42
  11134. * ret 0x66
  11135. */
  11136. BPF_STMT(BPF_LD | BPF_IMM, 0x0),
  11137. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0x0, 0, 1),
  11138. BPF_STMT(BPF_RET | BPF_K, 0x42),
  11139. BPF_STMT(BPF_RET | BPF_K, 0x66),
  11140. },
  11141. CLASSIC | FLAG_NO_DATA,
  11142. {},
  11143. { {0x1, 0x42 } },
  11144. },
  11145. /* Checking interpreter vs JIT wrt signed extended imms. */
  11146. {
  11147. "JNE signed compare, test 1",
  11148. .u.insns_int = {
  11149. BPF_ALU32_IMM(BPF_MOV, R1, 0xfefbbc12),
  11150. BPF_ALU32_IMM(BPF_MOV, R3, 0xffff0000),
  11151. BPF_MOV64_REG(R2, R1),
  11152. BPF_ALU64_REG(BPF_AND, R2, R3),
  11153. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  11154. BPF_JMP_IMM(BPF_JNE, R2, -17104896, 1),
  11155. BPF_ALU32_IMM(BPF_MOV, R0, 2),
  11156. BPF_EXIT_INSN(),
  11157. },
  11158. INTERNAL,
  11159. { },
  11160. { { 0, 1 } },
  11161. },
  11162. {
  11163. "JNE signed compare, test 2",
  11164. .u.insns_int = {
  11165. BPF_ALU32_IMM(BPF_MOV, R1, 0xfefbbc12),
  11166. BPF_ALU32_IMM(BPF_MOV, R3, 0xffff0000),
  11167. BPF_MOV64_REG(R2, R1),
  11168. BPF_ALU64_REG(BPF_AND, R2, R3),
  11169. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  11170. BPF_JMP_IMM(BPF_JNE, R2, 0xfefb0000, 1),
  11171. BPF_ALU32_IMM(BPF_MOV, R0, 2),
  11172. BPF_EXIT_INSN(),
  11173. },
  11174. INTERNAL,
  11175. { },
  11176. { { 0, 1 } },
  11177. },
  11178. {
  11179. "JNE signed compare, test 3",
  11180. .u.insns_int = {
  11181. BPF_ALU32_IMM(BPF_MOV, R1, 0xfefbbc12),
  11182. BPF_ALU32_IMM(BPF_MOV, R3, 0xffff0000),
  11183. BPF_ALU32_IMM(BPF_MOV, R4, 0xfefb0000),
  11184. BPF_MOV64_REG(R2, R1),
  11185. BPF_ALU64_REG(BPF_AND, R2, R3),
  11186. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  11187. BPF_JMP_REG(BPF_JNE, R2, R4, 1),
  11188. BPF_ALU32_IMM(BPF_MOV, R0, 2),
  11189. BPF_EXIT_INSN(),
  11190. },
  11191. INTERNAL,
  11192. { },
  11193. { { 0, 2 } },
  11194. },
  11195. {
  11196. "JNE signed compare, test 4",
  11197. .u.insns_int = {
  11198. BPF_LD_IMM64(R1, -17104896),
  11199. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  11200. BPF_JMP_IMM(BPF_JNE, R1, -17104896, 1),
  11201. BPF_ALU32_IMM(BPF_MOV, R0, 2),
  11202. BPF_EXIT_INSN(),
  11203. },
  11204. INTERNAL,
  11205. { },
  11206. { { 0, 2 } },
  11207. },
  11208. {
  11209. "JNE signed compare, test 5",
  11210. .u.insns_int = {
  11211. BPF_LD_IMM64(R1, 0xfefb0000),
  11212. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  11213. BPF_JMP_IMM(BPF_JNE, R1, 0xfefb0000, 1),
  11214. BPF_ALU32_IMM(BPF_MOV, R0, 2),
  11215. BPF_EXIT_INSN(),
  11216. },
  11217. INTERNAL,
  11218. { },
  11219. { { 0, 1 } },
  11220. },
  11221. {
  11222. "JNE signed compare, test 6",
  11223. .u.insns_int = {
  11224. BPF_LD_IMM64(R1, 0x7efb0000),
  11225. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  11226. BPF_JMP_IMM(BPF_JNE, R1, 0x7efb0000, 1),
  11227. BPF_ALU32_IMM(BPF_MOV, R0, 2),
  11228. BPF_EXIT_INSN(),
  11229. },
  11230. INTERNAL,
  11231. { },
  11232. { { 0, 2 } },
  11233. },
  11234. {
  11235. "JNE signed compare, test 7",
  11236. .u.insns = {
  11237. BPF_STMT(BPF_LD | BPF_IMM, 0xffff0000),
  11238. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  11239. BPF_STMT(BPF_LD | BPF_IMM, 0xfefbbc12),
  11240. BPF_STMT(BPF_ALU | BPF_AND | BPF_X, 0),
  11241. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0xfefb0000, 1, 0),
  11242. BPF_STMT(BPF_RET | BPF_K, 1),
  11243. BPF_STMT(BPF_RET | BPF_K, 2),
  11244. },
  11245. CLASSIC | FLAG_NO_DATA,
  11246. {},
  11247. { { 0, 2 } },
  11248. },
  11249. /* BPF_LDX_MEM with operand aliasing */
  11250. {
  11251. "LDX_MEM_B: operand register aliasing",
  11252. .u.insns_int = {
  11253. BPF_ST_MEM(BPF_B, R10, -8, 123),
  11254. BPF_MOV64_REG(R0, R10),
  11255. BPF_LDX_MEM(BPF_B, R0, R0, -8),
  11256. BPF_EXIT_INSN(),
  11257. },
  11258. INTERNAL,
  11259. { },
  11260. { { 0, 123 } },
  11261. .stack_depth = 8,
  11262. },
  11263. {
  11264. "LDX_MEM_H: operand register aliasing",
  11265. .u.insns_int = {
  11266. BPF_ST_MEM(BPF_H, R10, -8, 12345),
  11267. BPF_MOV64_REG(R0, R10),
  11268. BPF_LDX_MEM(BPF_H, R0, R0, -8),
  11269. BPF_EXIT_INSN(),
  11270. },
  11271. INTERNAL,
  11272. { },
  11273. { { 0, 12345 } },
  11274. .stack_depth = 8,
  11275. },
  11276. {
  11277. "LDX_MEM_W: operand register aliasing",
  11278. .u.insns_int = {
  11279. BPF_ST_MEM(BPF_W, R10, -8, 123456789),
  11280. BPF_MOV64_REG(R0, R10),
  11281. BPF_LDX_MEM(BPF_W, R0, R0, -8),
  11282. BPF_EXIT_INSN(),
  11283. },
  11284. INTERNAL,
  11285. { },
  11286. { { 0, 123456789 } },
  11287. .stack_depth = 8,
  11288. },
  11289. {
  11290. "LDX_MEM_DW: operand register aliasing",
  11291. .u.insns_int = {
  11292. BPF_LD_IMM64(R1, 0x123456789abcdefULL),
  11293. BPF_STX_MEM(BPF_DW, R10, R1, -8),
  11294. BPF_MOV64_REG(R0, R10),
  11295. BPF_LDX_MEM(BPF_DW, R0, R0, -8),
  11296. BPF_ALU64_REG(BPF_SUB, R0, R1),
  11297. BPF_MOV64_REG(R1, R0),
  11298. BPF_ALU64_IMM(BPF_RSH, R1, 32),
  11299. BPF_ALU64_REG(BPF_OR, R0, R1),
  11300. BPF_EXIT_INSN(),
  11301. },
  11302. INTERNAL,
  11303. { },
  11304. { { 0, 0 } },
  11305. .stack_depth = 8,
  11306. },
  11307. /*
  11308. * Register (non-)clobbering tests for the case where a JIT implements
  11309. * complex ALU or ATOMIC operations via function calls. If so, the
  11310. * function call must be transparent to the eBPF registers. The JIT
  11311. * must therefore save and restore relevant registers across the call.
  11312. * The following tests check that the eBPF registers retain their
  11313. * values after such an operation. Mainly intended for complex ALU
  11314. * and atomic operation, but we run it for all. You never know...
  11315. *
  11316. * Note that each operations should be tested twice with different
  11317. * destinations, to check preservation for all registers.
  11318. */
  11319. #define BPF_TEST_CLOBBER_ALU(alu, op, dst, src) \
  11320. { \
  11321. #alu "_" #op " to " #dst ": no clobbering", \
  11322. .u.insns_int = { \
  11323. BPF_ALU64_IMM(BPF_MOV, R0, R0), \
  11324. BPF_ALU64_IMM(BPF_MOV, R1, R1), \
  11325. BPF_ALU64_IMM(BPF_MOV, R2, R2), \
  11326. BPF_ALU64_IMM(BPF_MOV, R3, R3), \
  11327. BPF_ALU64_IMM(BPF_MOV, R4, R4), \
  11328. BPF_ALU64_IMM(BPF_MOV, R5, R5), \
  11329. BPF_ALU64_IMM(BPF_MOV, R6, R6), \
  11330. BPF_ALU64_IMM(BPF_MOV, R7, R7), \
  11331. BPF_ALU64_IMM(BPF_MOV, R8, R8), \
  11332. BPF_ALU64_IMM(BPF_MOV, R9, R9), \
  11333. BPF_##alu(BPF_ ##op, dst, src), \
  11334. BPF_ALU32_IMM(BPF_MOV, dst, dst), \
  11335. BPF_JMP_IMM(BPF_JNE, R0, R0, 10), \
  11336. BPF_JMP_IMM(BPF_JNE, R1, R1, 9), \
  11337. BPF_JMP_IMM(BPF_JNE, R2, R2, 8), \
  11338. BPF_JMP_IMM(BPF_JNE, R3, R3, 7), \
  11339. BPF_JMP_IMM(BPF_JNE, R4, R4, 6), \
  11340. BPF_JMP_IMM(BPF_JNE, R5, R5, 5), \
  11341. BPF_JMP_IMM(BPF_JNE, R6, R6, 4), \
  11342. BPF_JMP_IMM(BPF_JNE, R7, R7, 3), \
  11343. BPF_JMP_IMM(BPF_JNE, R8, R8, 2), \
  11344. BPF_JMP_IMM(BPF_JNE, R9, R9, 1), \
  11345. BPF_ALU64_IMM(BPF_MOV, R0, 1), \
  11346. BPF_EXIT_INSN(), \
  11347. }, \
  11348. INTERNAL, \
  11349. { }, \
  11350. { { 0, 1 } } \
  11351. }
  11352. /* ALU64 operations, register clobbering */
  11353. BPF_TEST_CLOBBER_ALU(ALU64_IMM, AND, R8, 123456789),
  11354. BPF_TEST_CLOBBER_ALU(ALU64_IMM, AND, R9, 123456789),
  11355. BPF_TEST_CLOBBER_ALU(ALU64_IMM, OR, R8, 123456789),
  11356. BPF_TEST_CLOBBER_ALU(ALU64_IMM, OR, R9, 123456789),
  11357. BPF_TEST_CLOBBER_ALU(ALU64_IMM, XOR, R8, 123456789),
  11358. BPF_TEST_CLOBBER_ALU(ALU64_IMM, XOR, R9, 123456789),
  11359. BPF_TEST_CLOBBER_ALU(ALU64_IMM, LSH, R8, 12),
  11360. BPF_TEST_CLOBBER_ALU(ALU64_IMM, LSH, R9, 12),
  11361. BPF_TEST_CLOBBER_ALU(ALU64_IMM, RSH, R8, 12),
  11362. BPF_TEST_CLOBBER_ALU(ALU64_IMM, RSH, R9, 12),
  11363. BPF_TEST_CLOBBER_ALU(ALU64_IMM, ARSH, R8, 12),
  11364. BPF_TEST_CLOBBER_ALU(ALU64_IMM, ARSH, R9, 12),
  11365. BPF_TEST_CLOBBER_ALU(ALU64_IMM, ADD, R8, 123456789),
  11366. BPF_TEST_CLOBBER_ALU(ALU64_IMM, ADD, R9, 123456789),
  11367. BPF_TEST_CLOBBER_ALU(ALU64_IMM, SUB, R8, 123456789),
  11368. BPF_TEST_CLOBBER_ALU(ALU64_IMM, SUB, R9, 123456789),
  11369. BPF_TEST_CLOBBER_ALU(ALU64_IMM, MUL, R8, 123456789),
  11370. BPF_TEST_CLOBBER_ALU(ALU64_IMM, MUL, R9, 123456789),
  11371. BPF_TEST_CLOBBER_ALU(ALU64_IMM, DIV, R8, 123456789),
  11372. BPF_TEST_CLOBBER_ALU(ALU64_IMM, DIV, R9, 123456789),
  11373. BPF_TEST_CLOBBER_ALU(ALU64_IMM, MOD, R8, 123456789),
  11374. BPF_TEST_CLOBBER_ALU(ALU64_IMM, MOD, R9, 123456789),
  11375. /* ALU32 immediate operations, register clobbering */
  11376. BPF_TEST_CLOBBER_ALU(ALU32_IMM, AND, R8, 123456789),
  11377. BPF_TEST_CLOBBER_ALU(ALU32_IMM, AND, R9, 123456789),
  11378. BPF_TEST_CLOBBER_ALU(ALU32_IMM, OR, R8, 123456789),
  11379. BPF_TEST_CLOBBER_ALU(ALU32_IMM, OR, R9, 123456789),
  11380. BPF_TEST_CLOBBER_ALU(ALU32_IMM, XOR, R8, 123456789),
  11381. BPF_TEST_CLOBBER_ALU(ALU32_IMM, XOR, R9, 123456789),
  11382. BPF_TEST_CLOBBER_ALU(ALU32_IMM, LSH, R8, 12),
  11383. BPF_TEST_CLOBBER_ALU(ALU32_IMM, LSH, R9, 12),
  11384. BPF_TEST_CLOBBER_ALU(ALU32_IMM, RSH, R8, 12),
  11385. BPF_TEST_CLOBBER_ALU(ALU32_IMM, RSH, R9, 12),
  11386. BPF_TEST_CLOBBER_ALU(ALU32_IMM, ARSH, R8, 12),
  11387. BPF_TEST_CLOBBER_ALU(ALU32_IMM, ARSH, R9, 12),
  11388. BPF_TEST_CLOBBER_ALU(ALU32_IMM, ADD, R8, 123456789),
  11389. BPF_TEST_CLOBBER_ALU(ALU32_IMM, ADD, R9, 123456789),
  11390. BPF_TEST_CLOBBER_ALU(ALU32_IMM, SUB, R8, 123456789),
  11391. BPF_TEST_CLOBBER_ALU(ALU32_IMM, SUB, R9, 123456789),
  11392. BPF_TEST_CLOBBER_ALU(ALU32_IMM, MUL, R8, 123456789),
  11393. BPF_TEST_CLOBBER_ALU(ALU32_IMM, MUL, R9, 123456789),
  11394. BPF_TEST_CLOBBER_ALU(ALU32_IMM, DIV, R8, 123456789),
  11395. BPF_TEST_CLOBBER_ALU(ALU32_IMM, DIV, R9, 123456789),
  11396. BPF_TEST_CLOBBER_ALU(ALU32_IMM, MOD, R8, 123456789),
  11397. BPF_TEST_CLOBBER_ALU(ALU32_IMM, MOD, R9, 123456789),
  11398. /* ALU64 register operations, register clobbering */
  11399. BPF_TEST_CLOBBER_ALU(ALU64_REG, AND, R8, R1),
  11400. BPF_TEST_CLOBBER_ALU(ALU64_REG, AND, R9, R1),
  11401. BPF_TEST_CLOBBER_ALU(ALU64_REG, OR, R8, R1),
  11402. BPF_TEST_CLOBBER_ALU(ALU64_REG, OR, R9, R1),
  11403. BPF_TEST_CLOBBER_ALU(ALU64_REG, XOR, R8, R1),
  11404. BPF_TEST_CLOBBER_ALU(ALU64_REG, XOR, R9, R1),
  11405. BPF_TEST_CLOBBER_ALU(ALU64_REG, LSH, R8, R1),
  11406. BPF_TEST_CLOBBER_ALU(ALU64_REG, LSH, R9, R1),
  11407. BPF_TEST_CLOBBER_ALU(ALU64_REG, RSH, R8, R1),
  11408. BPF_TEST_CLOBBER_ALU(ALU64_REG, RSH, R9, R1),
  11409. BPF_TEST_CLOBBER_ALU(ALU64_REG, ARSH, R8, R1),
  11410. BPF_TEST_CLOBBER_ALU(ALU64_REG, ARSH, R9, R1),
  11411. BPF_TEST_CLOBBER_ALU(ALU64_REG, ADD, R8, R1),
  11412. BPF_TEST_CLOBBER_ALU(ALU64_REG, ADD, R9, R1),
  11413. BPF_TEST_CLOBBER_ALU(ALU64_REG, SUB, R8, R1),
  11414. BPF_TEST_CLOBBER_ALU(ALU64_REG, SUB, R9, R1),
  11415. BPF_TEST_CLOBBER_ALU(ALU64_REG, MUL, R8, R1),
  11416. BPF_TEST_CLOBBER_ALU(ALU64_REG, MUL, R9, R1),
  11417. BPF_TEST_CLOBBER_ALU(ALU64_REG, DIV, R8, R1),
  11418. BPF_TEST_CLOBBER_ALU(ALU64_REG, DIV, R9, R1),
  11419. BPF_TEST_CLOBBER_ALU(ALU64_REG, MOD, R8, R1),
  11420. BPF_TEST_CLOBBER_ALU(ALU64_REG, MOD, R9, R1),
  11421. /* ALU32 register operations, register clobbering */
  11422. BPF_TEST_CLOBBER_ALU(ALU32_REG, AND, R8, R1),
  11423. BPF_TEST_CLOBBER_ALU(ALU32_REG, AND, R9, R1),
  11424. BPF_TEST_CLOBBER_ALU(ALU32_REG, OR, R8, R1),
  11425. BPF_TEST_CLOBBER_ALU(ALU32_REG, OR, R9, R1),
  11426. BPF_TEST_CLOBBER_ALU(ALU32_REG, XOR, R8, R1),
  11427. BPF_TEST_CLOBBER_ALU(ALU32_REG, XOR, R9, R1),
  11428. BPF_TEST_CLOBBER_ALU(ALU32_REG, LSH, R8, R1),
  11429. BPF_TEST_CLOBBER_ALU(ALU32_REG, LSH, R9, R1),
  11430. BPF_TEST_CLOBBER_ALU(ALU32_REG, RSH, R8, R1),
  11431. BPF_TEST_CLOBBER_ALU(ALU32_REG, RSH, R9, R1),
  11432. BPF_TEST_CLOBBER_ALU(ALU32_REG, ARSH, R8, R1),
  11433. BPF_TEST_CLOBBER_ALU(ALU32_REG, ARSH, R9, R1),
  11434. BPF_TEST_CLOBBER_ALU(ALU32_REG, ADD, R8, R1),
  11435. BPF_TEST_CLOBBER_ALU(ALU32_REG, ADD, R9, R1),
  11436. BPF_TEST_CLOBBER_ALU(ALU32_REG, SUB, R8, R1),
  11437. BPF_TEST_CLOBBER_ALU(ALU32_REG, SUB, R9, R1),
  11438. BPF_TEST_CLOBBER_ALU(ALU32_REG, MUL, R8, R1),
  11439. BPF_TEST_CLOBBER_ALU(ALU32_REG, MUL, R9, R1),
  11440. BPF_TEST_CLOBBER_ALU(ALU32_REG, DIV, R8, R1),
  11441. BPF_TEST_CLOBBER_ALU(ALU32_REG, DIV, R9, R1),
  11442. BPF_TEST_CLOBBER_ALU(ALU32_REG, MOD, R8, R1),
  11443. BPF_TEST_CLOBBER_ALU(ALU32_REG, MOD, R9, R1),
  11444. #undef BPF_TEST_CLOBBER_ALU
  11445. #define BPF_TEST_CLOBBER_ATOMIC(width, op) \
  11446. { \
  11447. "Atomic_" #width " " #op ": no clobbering", \
  11448. .u.insns_int = { \
  11449. BPF_ALU64_IMM(BPF_MOV, R0, 0), \
  11450. BPF_ALU64_IMM(BPF_MOV, R1, 1), \
  11451. BPF_ALU64_IMM(BPF_MOV, R2, 2), \
  11452. BPF_ALU64_IMM(BPF_MOV, R3, 3), \
  11453. BPF_ALU64_IMM(BPF_MOV, R4, 4), \
  11454. BPF_ALU64_IMM(BPF_MOV, R5, 5), \
  11455. BPF_ALU64_IMM(BPF_MOV, R6, 6), \
  11456. BPF_ALU64_IMM(BPF_MOV, R7, 7), \
  11457. BPF_ALU64_IMM(BPF_MOV, R8, 8), \
  11458. BPF_ALU64_IMM(BPF_MOV, R9, 9), \
  11459. BPF_ST_MEM(width, R10, -8, \
  11460. (op) == BPF_CMPXCHG ? 0 : \
  11461. (op) & BPF_FETCH ? 1 : 0), \
  11462. BPF_ATOMIC_OP(width, op, R10, R1, -8), \
  11463. BPF_JMP_IMM(BPF_JNE, R0, 0, 10), \
  11464. BPF_JMP_IMM(BPF_JNE, R1, 1, 9), \
  11465. BPF_JMP_IMM(BPF_JNE, R2, 2, 8), \
  11466. BPF_JMP_IMM(BPF_JNE, R3, 3, 7), \
  11467. BPF_JMP_IMM(BPF_JNE, R4, 4, 6), \
  11468. BPF_JMP_IMM(BPF_JNE, R5, 5, 5), \
  11469. BPF_JMP_IMM(BPF_JNE, R6, 6, 4), \
  11470. BPF_JMP_IMM(BPF_JNE, R7, 7, 3), \
  11471. BPF_JMP_IMM(BPF_JNE, R8, 8, 2), \
  11472. BPF_JMP_IMM(BPF_JNE, R9, 9, 1), \
  11473. BPF_ALU64_IMM(BPF_MOV, R0, 1), \
  11474. BPF_EXIT_INSN(), \
  11475. }, \
  11476. INTERNAL, \
  11477. { }, \
  11478. { { 0, 1 } }, \
  11479. .stack_depth = 8, \
  11480. }
  11481. /* 64-bit atomic operations, register clobbering */
  11482. BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_ADD),
  11483. BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_AND),
  11484. BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_OR),
  11485. BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_XOR),
  11486. BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_ADD | BPF_FETCH),
  11487. BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_AND | BPF_FETCH),
  11488. BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_OR | BPF_FETCH),
  11489. BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_XOR | BPF_FETCH),
  11490. BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_XCHG),
  11491. BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_CMPXCHG),
  11492. /* 32-bit atomic operations, register clobbering */
  11493. BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_ADD),
  11494. BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_AND),
  11495. BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_OR),
  11496. BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_XOR),
  11497. BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_ADD | BPF_FETCH),
  11498. BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_AND | BPF_FETCH),
  11499. BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_OR | BPF_FETCH),
  11500. BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_XOR | BPF_FETCH),
  11501. BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_XCHG),
  11502. BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_CMPXCHG),
  11503. #undef BPF_TEST_CLOBBER_ATOMIC
  11504. /* Checking that ALU32 src is not zero extended in place */
  11505. #define BPF_ALU32_SRC_ZEXT(op) \
  11506. { \
  11507. "ALU32_" #op "_X: src preserved in zext", \
  11508. .u.insns_int = { \
  11509. BPF_LD_IMM64(R1, 0x0123456789acbdefULL),\
  11510. BPF_LD_IMM64(R2, 0xfedcba9876543210ULL),\
  11511. BPF_ALU64_REG(BPF_MOV, R0, R1), \
  11512. BPF_ALU32_REG(BPF_##op, R2, R1), \
  11513. BPF_ALU64_REG(BPF_SUB, R0, R1), \
  11514. BPF_ALU64_REG(BPF_MOV, R1, R0), \
  11515. BPF_ALU64_IMM(BPF_RSH, R1, 32), \
  11516. BPF_ALU64_REG(BPF_OR, R0, R1), \
  11517. BPF_EXIT_INSN(), \
  11518. }, \
  11519. INTERNAL, \
  11520. { }, \
  11521. { { 0, 0 } }, \
  11522. }
  11523. BPF_ALU32_SRC_ZEXT(MOV),
  11524. BPF_ALU32_SRC_ZEXT(AND),
  11525. BPF_ALU32_SRC_ZEXT(OR),
  11526. BPF_ALU32_SRC_ZEXT(XOR),
  11527. BPF_ALU32_SRC_ZEXT(ADD),
  11528. BPF_ALU32_SRC_ZEXT(SUB),
  11529. BPF_ALU32_SRC_ZEXT(MUL),
  11530. BPF_ALU32_SRC_ZEXT(DIV),
  11531. BPF_ALU32_SRC_ZEXT(MOD),
  11532. #undef BPF_ALU32_SRC_ZEXT
  11533. /* Checking that ATOMIC32 src is not zero extended in place */
  11534. #define BPF_ATOMIC32_SRC_ZEXT(op) \
  11535. { \
  11536. "ATOMIC_W_" #op ": src preserved in zext", \
  11537. .u.insns_int = { \
  11538. BPF_LD_IMM64(R0, 0x0123456789acbdefULL), \
  11539. BPF_ALU64_REG(BPF_MOV, R1, R0), \
  11540. BPF_ST_MEM(BPF_W, R10, -4, 0), \
  11541. BPF_ATOMIC_OP(BPF_W, BPF_##op, R10, R1, -4), \
  11542. BPF_ALU64_REG(BPF_SUB, R0, R1), \
  11543. BPF_ALU64_REG(BPF_MOV, R1, R0), \
  11544. BPF_ALU64_IMM(BPF_RSH, R1, 32), \
  11545. BPF_ALU64_REG(BPF_OR, R0, R1), \
  11546. BPF_EXIT_INSN(), \
  11547. }, \
  11548. INTERNAL, \
  11549. { }, \
  11550. { { 0, 0 } }, \
  11551. .stack_depth = 8, \
  11552. }
  11553. BPF_ATOMIC32_SRC_ZEXT(ADD),
  11554. BPF_ATOMIC32_SRC_ZEXT(AND),
  11555. BPF_ATOMIC32_SRC_ZEXT(OR),
  11556. BPF_ATOMIC32_SRC_ZEXT(XOR),
  11557. #undef BPF_ATOMIC32_SRC_ZEXT
  11558. /* Checking that CMPXCHG32 src is not zero extended in place */
  11559. {
  11560. "ATOMIC_W_CMPXCHG: src preserved in zext",
  11561. .u.insns_int = {
  11562. BPF_LD_IMM64(R1, 0x0123456789acbdefULL),
  11563. BPF_ALU64_REG(BPF_MOV, R2, R1),
  11564. BPF_ALU64_REG(BPF_MOV, R0, 0),
  11565. BPF_ST_MEM(BPF_W, R10, -4, 0),
  11566. BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R1, -4),
  11567. BPF_ALU64_REG(BPF_SUB, R1, R2),
  11568. BPF_ALU64_REG(BPF_MOV, R2, R1),
  11569. BPF_ALU64_IMM(BPF_RSH, R2, 32),
  11570. BPF_ALU64_REG(BPF_OR, R1, R2),
  11571. BPF_ALU64_REG(BPF_MOV, R0, R1),
  11572. BPF_EXIT_INSN(),
  11573. },
  11574. INTERNAL,
  11575. { },
  11576. { { 0, 0 } },
  11577. .stack_depth = 8,
  11578. },
  11579. /* Checking that JMP32 immediate src is not zero extended in place */
  11580. #define BPF_JMP32_IMM_ZEXT(op) \
  11581. { \
  11582. "JMP32_" #op "_K: operand preserved in zext", \
  11583. .u.insns_int = { \
  11584. BPF_LD_IMM64(R0, 0x0123456789acbdefULL),\
  11585. BPF_ALU64_REG(BPF_MOV, R1, R0), \
  11586. BPF_JMP32_IMM(BPF_##op, R0, 1234, 1), \
  11587. BPF_JMP_A(0), /* Nop */ \
  11588. BPF_ALU64_REG(BPF_SUB, R0, R1), \
  11589. BPF_ALU64_REG(BPF_MOV, R1, R0), \
  11590. BPF_ALU64_IMM(BPF_RSH, R1, 32), \
  11591. BPF_ALU64_REG(BPF_OR, R0, R1), \
  11592. BPF_EXIT_INSN(), \
  11593. }, \
  11594. INTERNAL, \
  11595. { }, \
  11596. { { 0, 0 } }, \
  11597. }
  11598. BPF_JMP32_IMM_ZEXT(JEQ),
  11599. BPF_JMP32_IMM_ZEXT(JNE),
  11600. BPF_JMP32_IMM_ZEXT(JSET),
  11601. BPF_JMP32_IMM_ZEXT(JGT),
  11602. BPF_JMP32_IMM_ZEXT(JGE),
  11603. BPF_JMP32_IMM_ZEXT(JLT),
  11604. BPF_JMP32_IMM_ZEXT(JLE),
  11605. BPF_JMP32_IMM_ZEXT(JSGT),
  11606. BPF_JMP32_IMM_ZEXT(JSGE),
  11607. BPF_JMP32_IMM_ZEXT(JSLT),
  11608. BPF_JMP32_IMM_ZEXT(JSLE),
  11609. #undef BPF_JMP2_IMM_ZEXT
  11610. /* Checking that JMP32 dst & src are not zero extended in place */
  11611. #define BPF_JMP32_REG_ZEXT(op) \
  11612. { \
  11613. "JMP32_" #op "_X: operands preserved in zext", \
  11614. .u.insns_int = { \
  11615. BPF_LD_IMM64(R0, 0x0123456789acbdefULL),\
  11616. BPF_LD_IMM64(R1, 0xfedcba9876543210ULL),\
  11617. BPF_ALU64_REG(BPF_MOV, R2, R0), \
  11618. BPF_ALU64_REG(BPF_MOV, R3, R1), \
  11619. BPF_JMP32_IMM(BPF_##op, R0, R1, 1), \
  11620. BPF_JMP_A(0), /* Nop */ \
  11621. BPF_ALU64_REG(BPF_SUB, R0, R2), \
  11622. BPF_ALU64_REG(BPF_SUB, R1, R3), \
  11623. BPF_ALU64_REG(BPF_OR, R0, R1), \
  11624. BPF_ALU64_REG(BPF_MOV, R1, R0), \
  11625. BPF_ALU64_IMM(BPF_RSH, R1, 32), \
  11626. BPF_ALU64_REG(BPF_OR, R0, R1), \
  11627. BPF_EXIT_INSN(), \
  11628. }, \
  11629. INTERNAL, \
  11630. { }, \
  11631. { { 0, 0 } }, \
  11632. }
  11633. BPF_JMP32_REG_ZEXT(JEQ),
  11634. BPF_JMP32_REG_ZEXT(JNE),
  11635. BPF_JMP32_REG_ZEXT(JSET),
  11636. BPF_JMP32_REG_ZEXT(JGT),
  11637. BPF_JMP32_REG_ZEXT(JGE),
  11638. BPF_JMP32_REG_ZEXT(JLT),
  11639. BPF_JMP32_REG_ZEXT(JLE),
  11640. BPF_JMP32_REG_ZEXT(JSGT),
  11641. BPF_JMP32_REG_ZEXT(JSGE),
  11642. BPF_JMP32_REG_ZEXT(JSLT),
  11643. BPF_JMP32_REG_ZEXT(JSLE),
  11644. #undef BPF_JMP2_REG_ZEXT
  11645. /* ALU64 K register combinations */
  11646. {
  11647. "ALU64_MOV_K: registers",
  11648. { },
  11649. INTERNAL,
  11650. { },
  11651. { { 0, 1 } },
  11652. .fill_helper = bpf_fill_alu64_mov_imm_regs,
  11653. },
  11654. {
  11655. "ALU64_AND_K: registers",
  11656. { },
  11657. INTERNAL,
  11658. { },
  11659. { { 0, 1 } },
  11660. .fill_helper = bpf_fill_alu64_and_imm_regs,
  11661. },
  11662. {
  11663. "ALU64_OR_K: registers",
  11664. { },
  11665. INTERNAL,
  11666. { },
  11667. { { 0, 1 } },
  11668. .fill_helper = bpf_fill_alu64_or_imm_regs,
  11669. },
  11670. {
  11671. "ALU64_XOR_K: registers",
  11672. { },
  11673. INTERNAL,
  11674. { },
  11675. { { 0, 1 } },
  11676. .fill_helper = bpf_fill_alu64_xor_imm_regs,
  11677. },
  11678. {
  11679. "ALU64_LSH_K: registers",
  11680. { },
  11681. INTERNAL,
  11682. { },
  11683. { { 0, 1 } },
  11684. .fill_helper = bpf_fill_alu64_lsh_imm_regs,
  11685. },
  11686. {
  11687. "ALU64_RSH_K: registers",
  11688. { },
  11689. INTERNAL,
  11690. { },
  11691. { { 0, 1 } },
  11692. .fill_helper = bpf_fill_alu64_rsh_imm_regs,
  11693. },
  11694. {
  11695. "ALU64_ARSH_K: registers",
  11696. { },
  11697. INTERNAL,
  11698. { },
  11699. { { 0, 1 } },
  11700. .fill_helper = bpf_fill_alu64_arsh_imm_regs,
  11701. },
  11702. {
  11703. "ALU64_ADD_K: registers",
  11704. { },
  11705. INTERNAL,
  11706. { },
  11707. { { 0, 1 } },
  11708. .fill_helper = bpf_fill_alu64_add_imm_regs,
  11709. },
  11710. {
  11711. "ALU64_SUB_K: registers",
  11712. { },
  11713. INTERNAL,
  11714. { },
  11715. { { 0, 1 } },
  11716. .fill_helper = bpf_fill_alu64_sub_imm_regs,
  11717. },
  11718. {
  11719. "ALU64_MUL_K: registers",
  11720. { },
  11721. INTERNAL,
  11722. { },
  11723. { { 0, 1 } },
  11724. .fill_helper = bpf_fill_alu64_mul_imm_regs,
  11725. },
  11726. {
  11727. "ALU64_DIV_K: registers",
  11728. { },
  11729. INTERNAL,
  11730. { },
  11731. { { 0, 1 } },
  11732. .fill_helper = bpf_fill_alu64_div_imm_regs,
  11733. },
  11734. {
  11735. "ALU64_MOD_K: registers",
  11736. { },
  11737. INTERNAL,
  11738. { },
  11739. { { 0, 1 } },
  11740. .fill_helper = bpf_fill_alu64_mod_imm_regs,
  11741. },
  11742. /* ALU32 K registers */
  11743. {
  11744. "ALU32_MOV_K: registers",
  11745. { },
  11746. INTERNAL,
  11747. { },
  11748. { { 0, 1 } },
  11749. .fill_helper = bpf_fill_alu32_mov_imm_regs,
  11750. },
  11751. {
  11752. "ALU32_AND_K: registers",
  11753. { },
  11754. INTERNAL,
  11755. { },
  11756. { { 0, 1 } },
  11757. .fill_helper = bpf_fill_alu32_and_imm_regs,
  11758. },
  11759. {
  11760. "ALU32_OR_K: registers",
  11761. { },
  11762. INTERNAL,
  11763. { },
  11764. { { 0, 1 } },
  11765. .fill_helper = bpf_fill_alu32_or_imm_regs,
  11766. },
  11767. {
  11768. "ALU32_XOR_K: registers",
  11769. { },
  11770. INTERNAL,
  11771. { },
  11772. { { 0, 1 } },
  11773. .fill_helper = bpf_fill_alu32_xor_imm_regs,
  11774. },
  11775. {
  11776. "ALU32_LSH_K: registers",
  11777. { },
  11778. INTERNAL,
  11779. { },
  11780. { { 0, 1 } },
  11781. .fill_helper = bpf_fill_alu32_lsh_imm_regs,
  11782. },
  11783. {
  11784. "ALU32_RSH_K: registers",
  11785. { },
  11786. INTERNAL,
  11787. { },
  11788. { { 0, 1 } },
  11789. .fill_helper = bpf_fill_alu32_rsh_imm_regs,
  11790. },
  11791. {
  11792. "ALU32_ARSH_K: registers",
  11793. { },
  11794. INTERNAL,
  11795. { },
  11796. { { 0, 1 } },
  11797. .fill_helper = bpf_fill_alu32_arsh_imm_regs,
  11798. },
  11799. {
  11800. "ALU32_ADD_K: registers",
  11801. { },
  11802. INTERNAL,
  11803. { },
  11804. { { 0, 1 } },
  11805. .fill_helper = bpf_fill_alu32_add_imm_regs,
  11806. },
  11807. {
  11808. "ALU32_SUB_K: registers",
  11809. { },
  11810. INTERNAL,
  11811. { },
  11812. { { 0, 1 } },
  11813. .fill_helper = bpf_fill_alu32_sub_imm_regs,
  11814. },
  11815. {
  11816. "ALU32_MUL_K: registers",
  11817. { },
  11818. INTERNAL,
  11819. { },
  11820. { { 0, 1 } },
  11821. .fill_helper = bpf_fill_alu32_mul_imm_regs,
  11822. },
  11823. {
  11824. "ALU32_DIV_K: registers",
  11825. { },
  11826. INTERNAL,
  11827. { },
  11828. { { 0, 1 } },
  11829. .fill_helper = bpf_fill_alu32_div_imm_regs,
  11830. },
  11831. {
  11832. "ALU32_MOD_K: registers",
  11833. { },
  11834. INTERNAL,
  11835. { },
  11836. { { 0, 1 } },
  11837. .fill_helper = bpf_fill_alu32_mod_imm_regs,
  11838. },
  11839. /* ALU64 X register combinations */
  11840. {
  11841. "ALU64_MOV_X: register combinations",
  11842. { },
  11843. INTERNAL,
  11844. { },
  11845. { { 0, 1 } },
  11846. .fill_helper = bpf_fill_alu64_mov_reg_pairs,
  11847. },
  11848. {
  11849. "ALU64_AND_X: register combinations",
  11850. { },
  11851. INTERNAL,
  11852. { },
  11853. { { 0, 1 } },
  11854. .fill_helper = bpf_fill_alu64_and_reg_pairs,
  11855. },
  11856. {
  11857. "ALU64_OR_X: register combinations",
  11858. { },
  11859. INTERNAL,
  11860. { },
  11861. { { 0, 1 } },
  11862. .fill_helper = bpf_fill_alu64_or_reg_pairs,
  11863. },
  11864. {
  11865. "ALU64_XOR_X: register combinations",
  11866. { },
  11867. INTERNAL,
  11868. { },
  11869. { { 0, 1 } },
  11870. .fill_helper = bpf_fill_alu64_xor_reg_pairs,
  11871. },
  11872. {
  11873. "ALU64_LSH_X: register combinations",
  11874. { },
  11875. INTERNAL,
  11876. { },
  11877. { { 0, 1 } },
  11878. .fill_helper = bpf_fill_alu64_lsh_reg_pairs,
  11879. },
  11880. {
  11881. "ALU64_RSH_X: register combinations",
  11882. { },
  11883. INTERNAL,
  11884. { },
  11885. { { 0, 1 } },
  11886. .fill_helper = bpf_fill_alu64_rsh_reg_pairs,
  11887. },
  11888. {
  11889. "ALU64_ARSH_X: register combinations",
  11890. { },
  11891. INTERNAL,
  11892. { },
  11893. { { 0, 1 } },
  11894. .fill_helper = bpf_fill_alu64_arsh_reg_pairs,
  11895. },
  11896. {
  11897. "ALU64_ADD_X: register combinations",
  11898. { },
  11899. INTERNAL,
  11900. { },
  11901. { { 0, 1 } },
  11902. .fill_helper = bpf_fill_alu64_add_reg_pairs,
  11903. },
  11904. {
  11905. "ALU64_SUB_X: register combinations",
  11906. { },
  11907. INTERNAL,
  11908. { },
  11909. { { 0, 1 } },
  11910. .fill_helper = bpf_fill_alu64_sub_reg_pairs,
  11911. },
  11912. {
  11913. "ALU64_MUL_X: register combinations",
  11914. { },
  11915. INTERNAL,
  11916. { },
  11917. { { 0, 1 } },
  11918. .fill_helper = bpf_fill_alu64_mul_reg_pairs,
  11919. },
  11920. {
  11921. "ALU64_DIV_X: register combinations",
  11922. { },
  11923. INTERNAL,
  11924. { },
  11925. { { 0, 1 } },
  11926. .fill_helper = bpf_fill_alu64_div_reg_pairs,
  11927. },
  11928. {
  11929. "ALU64_MOD_X: register combinations",
  11930. { },
  11931. INTERNAL,
  11932. { },
  11933. { { 0, 1 } },
  11934. .fill_helper = bpf_fill_alu64_mod_reg_pairs,
  11935. },
  11936. /* ALU32 X register combinations */
  11937. {
  11938. "ALU32_MOV_X: register combinations",
  11939. { },
  11940. INTERNAL,
  11941. { },
  11942. { { 0, 1 } },
  11943. .fill_helper = bpf_fill_alu32_mov_reg_pairs,
  11944. },
  11945. {
  11946. "ALU32_AND_X: register combinations",
  11947. { },
  11948. INTERNAL,
  11949. { },
  11950. { { 0, 1 } },
  11951. .fill_helper = bpf_fill_alu32_and_reg_pairs,
  11952. },
  11953. {
  11954. "ALU32_OR_X: register combinations",
  11955. { },
  11956. INTERNAL,
  11957. { },
  11958. { { 0, 1 } },
  11959. .fill_helper = bpf_fill_alu32_or_reg_pairs,
  11960. },
  11961. {
  11962. "ALU32_XOR_X: register combinations",
  11963. { },
  11964. INTERNAL,
  11965. { },
  11966. { { 0, 1 } },
  11967. .fill_helper = bpf_fill_alu32_xor_reg_pairs,
  11968. },
  11969. {
  11970. "ALU32_LSH_X: register combinations",
  11971. { },
  11972. INTERNAL,
  11973. { },
  11974. { { 0, 1 } },
  11975. .fill_helper = bpf_fill_alu32_lsh_reg_pairs,
  11976. },
  11977. {
  11978. "ALU32_RSH_X: register combinations",
  11979. { },
  11980. INTERNAL,
  11981. { },
  11982. { { 0, 1 } },
  11983. .fill_helper = bpf_fill_alu32_rsh_reg_pairs,
  11984. },
  11985. {
  11986. "ALU32_ARSH_X: register combinations",
  11987. { },
  11988. INTERNAL,
  11989. { },
  11990. { { 0, 1 } },
  11991. .fill_helper = bpf_fill_alu32_arsh_reg_pairs,
  11992. },
  11993. {
  11994. "ALU32_ADD_X: register combinations",
  11995. { },
  11996. INTERNAL,
  11997. { },
  11998. { { 0, 1 } },
  11999. .fill_helper = bpf_fill_alu32_add_reg_pairs,
  12000. },
  12001. {
  12002. "ALU32_SUB_X: register combinations",
  12003. { },
  12004. INTERNAL,
  12005. { },
  12006. { { 0, 1 } },
  12007. .fill_helper = bpf_fill_alu32_sub_reg_pairs,
  12008. },
  12009. {
  12010. "ALU32_MUL_X: register combinations",
  12011. { },
  12012. INTERNAL,
  12013. { },
  12014. { { 0, 1 } },
  12015. .fill_helper = bpf_fill_alu32_mul_reg_pairs,
  12016. },
  12017. {
  12018. "ALU32_DIV_X: register combinations",
  12019. { },
  12020. INTERNAL,
  12021. { },
  12022. { { 0, 1 } },
  12023. .fill_helper = bpf_fill_alu32_div_reg_pairs,
  12024. },
  12025. {
  12026. "ALU32_MOD_X register combinations",
  12027. { },
  12028. INTERNAL,
  12029. { },
  12030. { { 0, 1 } },
  12031. .fill_helper = bpf_fill_alu32_mod_reg_pairs,
  12032. },
  12033. /* Exhaustive test of ALU64 shift operations */
  12034. {
  12035. "ALU64_LSH_K: all shift values",
  12036. { },
  12037. INTERNAL | FLAG_NO_DATA,
  12038. { },
  12039. { { 0, 1 } },
  12040. .fill_helper = bpf_fill_alu64_lsh_imm,
  12041. },
  12042. {
  12043. "ALU64_RSH_K: all shift values",
  12044. { },
  12045. INTERNAL | FLAG_NO_DATA,
  12046. { },
  12047. { { 0, 1 } },
  12048. .fill_helper = bpf_fill_alu64_rsh_imm,
  12049. },
  12050. {
  12051. "ALU64_ARSH_K: all shift values",
  12052. { },
  12053. INTERNAL | FLAG_NO_DATA,
  12054. { },
  12055. { { 0, 1 } },
  12056. .fill_helper = bpf_fill_alu64_arsh_imm,
  12057. },
  12058. {
  12059. "ALU64_LSH_X: all shift values",
  12060. { },
  12061. INTERNAL | FLAG_NO_DATA,
  12062. { },
  12063. { { 0, 1 } },
  12064. .fill_helper = bpf_fill_alu64_lsh_reg,
  12065. },
  12066. {
  12067. "ALU64_RSH_X: all shift values",
  12068. { },
  12069. INTERNAL | FLAG_NO_DATA,
  12070. { },
  12071. { { 0, 1 } },
  12072. .fill_helper = bpf_fill_alu64_rsh_reg,
  12073. },
  12074. {
  12075. "ALU64_ARSH_X: all shift values",
  12076. { },
  12077. INTERNAL | FLAG_NO_DATA,
  12078. { },
  12079. { { 0, 1 } },
  12080. .fill_helper = bpf_fill_alu64_arsh_reg,
  12081. },
  12082. /* Exhaustive test of ALU32 shift operations */
  12083. {
  12084. "ALU32_LSH_K: all shift values",
  12085. { },
  12086. INTERNAL | FLAG_NO_DATA,
  12087. { },
  12088. { { 0, 1 } },
  12089. .fill_helper = bpf_fill_alu32_lsh_imm,
  12090. },
  12091. {
  12092. "ALU32_RSH_K: all shift values",
  12093. { },
  12094. INTERNAL | FLAG_NO_DATA,
  12095. { },
  12096. { { 0, 1 } },
  12097. .fill_helper = bpf_fill_alu32_rsh_imm,
  12098. },
  12099. {
  12100. "ALU32_ARSH_K: all shift values",
  12101. { },
  12102. INTERNAL | FLAG_NO_DATA,
  12103. { },
  12104. { { 0, 1 } },
  12105. .fill_helper = bpf_fill_alu32_arsh_imm,
  12106. },
  12107. {
  12108. "ALU32_LSH_X: all shift values",
  12109. { },
  12110. INTERNAL | FLAG_NO_DATA,
  12111. { },
  12112. { { 0, 1 } },
  12113. .fill_helper = bpf_fill_alu32_lsh_reg,
  12114. },
  12115. {
  12116. "ALU32_RSH_X: all shift values",
  12117. { },
  12118. INTERNAL | FLAG_NO_DATA,
  12119. { },
  12120. { { 0, 1 } },
  12121. .fill_helper = bpf_fill_alu32_rsh_reg,
  12122. },
  12123. {
  12124. "ALU32_ARSH_X: all shift values",
  12125. { },
  12126. INTERNAL | FLAG_NO_DATA,
  12127. { },
  12128. { { 0, 1 } },
  12129. .fill_helper = bpf_fill_alu32_arsh_reg,
  12130. },
  12131. /*
  12132. * Exhaustive test of ALU64 shift operations when
  12133. * source and destination register are the same.
  12134. */
  12135. {
  12136. "ALU64_LSH_X: all shift values with the same register",
  12137. { },
  12138. INTERNAL | FLAG_NO_DATA,
  12139. { },
  12140. { { 0, 1 } },
  12141. .fill_helper = bpf_fill_alu64_lsh_same_reg,
  12142. },
  12143. {
  12144. "ALU64_RSH_X: all shift values with the same register",
  12145. { },
  12146. INTERNAL | FLAG_NO_DATA,
  12147. { },
  12148. { { 0, 1 } },
  12149. .fill_helper = bpf_fill_alu64_rsh_same_reg,
  12150. },
  12151. {
  12152. "ALU64_ARSH_X: all shift values with the same register",
  12153. { },
  12154. INTERNAL | FLAG_NO_DATA,
  12155. { },
  12156. { { 0, 1 } },
  12157. .fill_helper = bpf_fill_alu64_arsh_same_reg,
  12158. },
  12159. /*
  12160. * Exhaustive test of ALU32 shift operations when
  12161. * source and destination register are the same.
  12162. */
  12163. {
  12164. "ALU32_LSH_X: all shift values with the same register",
  12165. { },
  12166. INTERNAL | FLAG_NO_DATA,
  12167. { },
  12168. { { 0, 1 } },
  12169. .fill_helper = bpf_fill_alu32_lsh_same_reg,
  12170. },
  12171. {
  12172. "ALU32_RSH_X: all shift values with the same register",
  12173. { },
  12174. INTERNAL | FLAG_NO_DATA,
  12175. { },
  12176. { { 0, 1 } },
  12177. .fill_helper = bpf_fill_alu32_rsh_same_reg,
  12178. },
  12179. {
  12180. "ALU32_ARSH_X: all shift values with the same register",
  12181. { },
  12182. INTERNAL | FLAG_NO_DATA,
  12183. { },
  12184. { { 0, 1 } },
  12185. .fill_helper = bpf_fill_alu32_arsh_same_reg,
  12186. },
  12187. /* ALU64 immediate magnitudes */
  12188. {
  12189. "ALU64_MOV_K: all immediate value magnitudes",
  12190. { },
  12191. INTERNAL | FLAG_NO_DATA,
  12192. { },
  12193. { { 0, 1 } },
  12194. .fill_helper = bpf_fill_alu64_mov_imm,
  12195. .nr_testruns = NR_PATTERN_RUNS,
  12196. },
  12197. {
  12198. "ALU64_AND_K: all immediate value magnitudes",
  12199. { },
  12200. INTERNAL | FLAG_NO_DATA,
  12201. { },
  12202. { { 0, 1 } },
  12203. .fill_helper = bpf_fill_alu64_and_imm,
  12204. .nr_testruns = NR_PATTERN_RUNS,
  12205. },
  12206. {
  12207. "ALU64_OR_K: all immediate value magnitudes",
  12208. { },
  12209. INTERNAL | FLAG_NO_DATA,
  12210. { },
  12211. { { 0, 1 } },
  12212. .fill_helper = bpf_fill_alu64_or_imm,
  12213. .nr_testruns = NR_PATTERN_RUNS,
  12214. },
  12215. {
  12216. "ALU64_XOR_K: all immediate value magnitudes",
  12217. { },
  12218. INTERNAL | FLAG_NO_DATA,
  12219. { },
  12220. { { 0, 1 } },
  12221. .fill_helper = bpf_fill_alu64_xor_imm,
  12222. .nr_testruns = NR_PATTERN_RUNS,
  12223. },
  12224. {
  12225. "ALU64_ADD_K: all immediate value magnitudes",
  12226. { },
  12227. INTERNAL | FLAG_NO_DATA,
  12228. { },
  12229. { { 0, 1 } },
  12230. .fill_helper = bpf_fill_alu64_add_imm,
  12231. .nr_testruns = NR_PATTERN_RUNS,
  12232. },
  12233. {
  12234. "ALU64_SUB_K: all immediate value magnitudes",
  12235. { },
  12236. INTERNAL | FLAG_NO_DATA,
  12237. { },
  12238. { { 0, 1 } },
  12239. .fill_helper = bpf_fill_alu64_sub_imm,
  12240. .nr_testruns = NR_PATTERN_RUNS,
  12241. },
  12242. {
  12243. "ALU64_MUL_K: all immediate value magnitudes",
  12244. { },
  12245. INTERNAL | FLAG_NO_DATA,
  12246. { },
  12247. { { 0, 1 } },
  12248. .fill_helper = bpf_fill_alu64_mul_imm,
  12249. .nr_testruns = NR_PATTERN_RUNS,
  12250. },
  12251. {
  12252. "ALU64_DIV_K: all immediate value magnitudes",
  12253. { },
  12254. INTERNAL | FLAG_NO_DATA,
  12255. { },
  12256. { { 0, 1 } },
  12257. .fill_helper = bpf_fill_alu64_div_imm,
  12258. .nr_testruns = NR_PATTERN_RUNS,
  12259. },
  12260. {
  12261. "ALU64_MOD_K: all immediate value magnitudes",
  12262. { },
  12263. INTERNAL | FLAG_NO_DATA,
  12264. { },
  12265. { { 0, 1 } },
  12266. .fill_helper = bpf_fill_alu64_mod_imm,
  12267. .nr_testruns = NR_PATTERN_RUNS,
  12268. },
  12269. /* ALU32 immediate magnitudes */
  12270. {
  12271. "ALU32_MOV_K: all immediate value magnitudes",
  12272. { },
  12273. INTERNAL | FLAG_NO_DATA,
  12274. { },
  12275. { { 0, 1 } },
  12276. .fill_helper = bpf_fill_alu32_mov_imm,
  12277. .nr_testruns = NR_PATTERN_RUNS,
  12278. },
  12279. {
  12280. "ALU32_AND_K: all immediate value magnitudes",
  12281. { },
  12282. INTERNAL | FLAG_NO_DATA,
  12283. { },
  12284. { { 0, 1 } },
  12285. .fill_helper = bpf_fill_alu32_and_imm,
  12286. .nr_testruns = NR_PATTERN_RUNS,
  12287. },
  12288. {
  12289. "ALU32_OR_K: all immediate value magnitudes",
  12290. { },
  12291. INTERNAL | FLAG_NO_DATA,
  12292. { },
  12293. { { 0, 1 } },
  12294. .fill_helper = bpf_fill_alu32_or_imm,
  12295. .nr_testruns = NR_PATTERN_RUNS,
  12296. },
  12297. {
  12298. "ALU32_XOR_K: all immediate value magnitudes",
  12299. { },
  12300. INTERNAL | FLAG_NO_DATA,
  12301. { },
  12302. { { 0, 1 } },
  12303. .fill_helper = bpf_fill_alu32_xor_imm,
  12304. .nr_testruns = NR_PATTERN_RUNS,
  12305. },
  12306. {
  12307. "ALU32_ADD_K: all immediate value magnitudes",
  12308. { },
  12309. INTERNAL | FLAG_NO_DATA,
  12310. { },
  12311. { { 0, 1 } },
  12312. .fill_helper = bpf_fill_alu32_add_imm,
  12313. .nr_testruns = NR_PATTERN_RUNS,
  12314. },
  12315. {
  12316. "ALU32_SUB_K: all immediate value magnitudes",
  12317. { },
  12318. INTERNAL | FLAG_NO_DATA,
  12319. { },
  12320. { { 0, 1 } },
  12321. .fill_helper = bpf_fill_alu32_sub_imm,
  12322. .nr_testruns = NR_PATTERN_RUNS,
  12323. },
  12324. {
  12325. "ALU32_MUL_K: all immediate value magnitudes",
  12326. { },
  12327. INTERNAL | FLAG_NO_DATA,
  12328. { },
  12329. { { 0, 1 } },
  12330. .fill_helper = bpf_fill_alu32_mul_imm,
  12331. .nr_testruns = NR_PATTERN_RUNS,
  12332. },
  12333. {
  12334. "ALU32_DIV_K: all immediate value magnitudes",
  12335. { },
  12336. INTERNAL | FLAG_NO_DATA,
  12337. { },
  12338. { { 0, 1 } },
  12339. .fill_helper = bpf_fill_alu32_div_imm,
  12340. .nr_testruns = NR_PATTERN_RUNS,
  12341. },
  12342. {
  12343. "ALU32_MOD_K: all immediate value magnitudes",
  12344. { },
  12345. INTERNAL | FLAG_NO_DATA,
  12346. { },
  12347. { { 0, 1 } },
  12348. .fill_helper = bpf_fill_alu32_mod_imm,
  12349. .nr_testruns = NR_PATTERN_RUNS,
  12350. },
  12351. /* ALU64 register magnitudes */
  12352. {
  12353. "ALU64_MOV_X: all register value magnitudes",
  12354. { },
  12355. INTERNAL | FLAG_NO_DATA,
  12356. { },
  12357. { { 0, 1 } },
  12358. .fill_helper = bpf_fill_alu64_mov_reg,
  12359. .nr_testruns = NR_PATTERN_RUNS,
  12360. },
  12361. {
  12362. "ALU64_AND_X: all register value magnitudes",
  12363. { },
  12364. INTERNAL | FLAG_NO_DATA,
  12365. { },
  12366. { { 0, 1 } },
  12367. .fill_helper = bpf_fill_alu64_and_reg,
  12368. .nr_testruns = NR_PATTERN_RUNS,
  12369. },
  12370. {
  12371. "ALU64_OR_X: all register value magnitudes",
  12372. { },
  12373. INTERNAL | FLAG_NO_DATA,
  12374. { },
  12375. { { 0, 1 } },
  12376. .fill_helper = bpf_fill_alu64_or_reg,
  12377. .nr_testruns = NR_PATTERN_RUNS,
  12378. },
  12379. {
  12380. "ALU64_XOR_X: all register value magnitudes",
  12381. { },
  12382. INTERNAL | FLAG_NO_DATA,
  12383. { },
  12384. { { 0, 1 } },
  12385. .fill_helper = bpf_fill_alu64_xor_reg,
  12386. .nr_testruns = NR_PATTERN_RUNS,
  12387. },
  12388. {
  12389. "ALU64_ADD_X: all register value magnitudes",
  12390. { },
  12391. INTERNAL | FLAG_NO_DATA,
  12392. { },
  12393. { { 0, 1 } },
  12394. .fill_helper = bpf_fill_alu64_add_reg,
  12395. .nr_testruns = NR_PATTERN_RUNS,
  12396. },
  12397. {
  12398. "ALU64_SUB_X: all register value magnitudes",
  12399. { },
  12400. INTERNAL | FLAG_NO_DATA,
  12401. { },
  12402. { { 0, 1 } },
  12403. .fill_helper = bpf_fill_alu64_sub_reg,
  12404. .nr_testruns = NR_PATTERN_RUNS,
  12405. },
  12406. {
  12407. "ALU64_MUL_X: all register value magnitudes",
  12408. { },
  12409. INTERNAL | FLAG_NO_DATA,
  12410. { },
  12411. { { 0, 1 } },
  12412. .fill_helper = bpf_fill_alu64_mul_reg,
  12413. .nr_testruns = NR_PATTERN_RUNS,
  12414. },
  12415. {
  12416. "ALU64_DIV_X: all register value magnitudes",
  12417. { },
  12418. INTERNAL | FLAG_NO_DATA,
  12419. { },
  12420. { { 0, 1 } },
  12421. .fill_helper = bpf_fill_alu64_div_reg,
  12422. .nr_testruns = NR_PATTERN_RUNS,
  12423. },
  12424. {
  12425. "ALU64_MOD_X: all register value magnitudes",
  12426. { },
  12427. INTERNAL | FLAG_NO_DATA,
  12428. { },
  12429. { { 0, 1 } },
  12430. .fill_helper = bpf_fill_alu64_mod_reg,
  12431. .nr_testruns = NR_PATTERN_RUNS,
  12432. },
  12433. /* ALU32 register magnitudes */
  12434. {
  12435. "ALU32_MOV_X: all register value magnitudes",
  12436. { },
  12437. INTERNAL | FLAG_NO_DATA,
  12438. { },
  12439. { { 0, 1 } },
  12440. .fill_helper = bpf_fill_alu32_mov_reg,
  12441. .nr_testruns = NR_PATTERN_RUNS,
  12442. },
  12443. {
  12444. "ALU32_AND_X: all register value magnitudes",
  12445. { },
  12446. INTERNAL | FLAG_NO_DATA,
  12447. { },
  12448. { { 0, 1 } },
  12449. .fill_helper = bpf_fill_alu32_and_reg,
  12450. .nr_testruns = NR_PATTERN_RUNS,
  12451. },
  12452. {
  12453. "ALU32_OR_X: all register value magnitudes",
  12454. { },
  12455. INTERNAL | FLAG_NO_DATA,
  12456. { },
  12457. { { 0, 1 } },
  12458. .fill_helper = bpf_fill_alu32_or_reg,
  12459. .nr_testruns = NR_PATTERN_RUNS,
  12460. },
  12461. {
  12462. "ALU32_XOR_X: all register value magnitudes",
  12463. { },
  12464. INTERNAL | FLAG_NO_DATA,
  12465. { },
  12466. { { 0, 1 } },
  12467. .fill_helper = bpf_fill_alu32_xor_reg,
  12468. .nr_testruns = NR_PATTERN_RUNS,
  12469. },
  12470. {
  12471. "ALU32_ADD_X: all register value magnitudes",
  12472. { },
  12473. INTERNAL | FLAG_NO_DATA,
  12474. { },
  12475. { { 0, 1 } },
  12476. .fill_helper = bpf_fill_alu32_add_reg,
  12477. .nr_testruns = NR_PATTERN_RUNS,
  12478. },
  12479. {
  12480. "ALU32_SUB_X: all register value magnitudes",
  12481. { },
  12482. INTERNAL | FLAG_NO_DATA,
  12483. { },
  12484. { { 0, 1 } },
  12485. .fill_helper = bpf_fill_alu32_sub_reg,
  12486. .nr_testruns = NR_PATTERN_RUNS,
  12487. },
  12488. {
  12489. "ALU32_MUL_X: all register value magnitudes",
  12490. { },
  12491. INTERNAL | FLAG_NO_DATA,
  12492. { },
  12493. { { 0, 1 } },
  12494. .fill_helper = bpf_fill_alu32_mul_reg,
  12495. .nr_testruns = NR_PATTERN_RUNS,
  12496. },
  12497. {
  12498. "ALU32_DIV_X: all register value magnitudes",
  12499. { },
  12500. INTERNAL | FLAG_NO_DATA,
  12501. { },
  12502. { { 0, 1 } },
  12503. .fill_helper = bpf_fill_alu32_div_reg,
  12504. .nr_testruns = NR_PATTERN_RUNS,
  12505. },
  12506. {
  12507. "ALU32_MOD_X: all register value magnitudes",
  12508. { },
  12509. INTERNAL | FLAG_NO_DATA,
  12510. { },
  12511. { { 0, 1 } },
  12512. .fill_helper = bpf_fill_alu32_mod_reg,
  12513. .nr_testruns = NR_PATTERN_RUNS,
  12514. },
  12515. /* LD_IMM64 immediate magnitudes and byte patterns */
  12516. {
  12517. "LD_IMM64: all immediate value magnitudes",
  12518. { },
  12519. INTERNAL | FLAG_NO_DATA,
  12520. { },
  12521. { { 0, 1 } },
  12522. .fill_helper = bpf_fill_ld_imm64_magn,
  12523. },
  12524. {
  12525. "LD_IMM64: checker byte patterns",
  12526. { },
  12527. INTERNAL | FLAG_NO_DATA,
  12528. { },
  12529. { { 0, 1 } },
  12530. .fill_helper = bpf_fill_ld_imm64_checker,
  12531. },
  12532. {
  12533. "LD_IMM64: random positive and zero byte patterns",
  12534. { },
  12535. INTERNAL | FLAG_NO_DATA,
  12536. { },
  12537. { { 0, 1 } },
  12538. .fill_helper = bpf_fill_ld_imm64_pos_zero,
  12539. },
  12540. {
  12541. "LD_IMM64: random negative and zero byte patterns",
  12542. { },
  12543. INTERNAL | FLAG_NO_DATA,
  12544. { },
  12545. { { 0, 1 } },
  12546. .fill_helper = bpf_fill_ld_imm64_neg_zero,
  12547. },
  12548. {
  12549. "LD_IMM64: random positive and negative byte patterns",
  12550. { },
  12551. INTERNAL | FLAG_NO_DATA,
  12552. { },
  12553. { { 0, 1 } },
  12554. .fill_helper = bpf_fill_ld_imm64_pos_neg,
  12555. },
  12556. /* 64-bit ATOMIC register combinations */
  12557. {
  12558. "ATOMIC_DW_ADD: register combinations",
  12559. { },
  12560. INTERNAL,
  12561. { },
  12562. { { 0, 1 } },
  12563. .fill_helper = bpf_fill_atomic64_add_reg_pairs,
  12564. .stack_depth = 8,
  12565. },
  12566. {
  12567. "ATOMIC_DW_AND: register combinations",
  12568. { },
  12569. INTERNAL,
  12570. { },
  12571. { { 0, 1 } },
  12572. .fill_helper = bpf_fill_atomic64_and_reg_pairs,
  12573. .stack_depth = 8,
  12574. },
  12575. {
  12576. "ATOMIC_DW_OR: register combinations",
  12577. { },
  12578. INTERNAL,
  12579. { },
  12580. { { 0, 1 } },
  12581. .fill_helper = bpf_fill_atomic64_or_reg_pairs,
  12582. .stack_depth = 8,
  12583. },
  12584. {
  12585. "ATOMIC_DW_XOR: register combinations",
  12586. { },
  12587. INTERNAL,
  12588. { },
  12589. { { 0, 1 } },
  12590. .fill_helper = bpf_fill_atomic64_xor_reg_pairs,
  12591. .stack_depth = 8,
  12592. },
  12593. {
  12594. "ATOMIC_DW_ADD_FETCH: register combinations",
  12595. { },
  12596. INTERNAL,
  12597. { },
  12598. { { 0, 1 } },
  12599. .fill_helper = bpf_fill_atomic64_add_fetch_reg_pairs,
  12600. .stack_depth = 8,
  12601. },
  12602. {
  12603. "ATOMIC_DW_AND_FETCH: register combinations",
  12604. { },
  12605. INTERNAL,
  12606. { },
  12607. { { 0, 1 } },
  12608. .fill_helper = bpf_fill_atomic64_and_fetch_reg_pairs,
  12609. .stack_depth = 8,
  12610. },
  12611. {
  12612. "ATOMIC_DW_OR_FETCH: register combinations",
  12613. { },
  12614. INTERNAL,
  12615. { },
  12616. { { 0, 1 } },
  12617. .fill_helper = bpf_fill_atomic64_or_fetch_reg_pairs,
  12618. .stack_depth = 8,
  12619. },
  12620. {
  12621. "ATOMIC_DW_XOR_FETCH: register combinations",
  12622. { },
  12623. INTERNAL,
  12624. { },
  12625. { { 0, 1 } },
  12626. .fill_helper = bpf_fill_atomic64_xor_fetch_reg_pairs,
  12627. .stack_depth = 8,
  12628. },
  12629. {
  12630. "ATOMIC_DW_XCHG: register combinations",
  12631. { },
  12632. INTERNAL,
  12633. { },
  12634. { { 0, 1 } },
  12635. .fill_helper = bpf_fill_atomic64_xchg_reg_pairs,
  12636. .stack_depth = 8,
  12637. },
  12638. {
  12639. "ATOMIC_DW_CMPXCHG: register combinations",
  12640. { },
  12641. INTERNAL,
  12642. { },
  12643. { { 0, 1 } },
  12644. .fill_helper = bpf_fill_atomic64_cmpxchg_reg_pairs,
  12645. .stack_depth = 8,
  12646. },
  12647. /* 32-bit ATOMIC register combinations */
  12648. {
  12649. "ATOMIC_W_ADD: register combinations",
  12650. { },
  12651. INTERNAL,
  12652. { },
  12653. { { 0, 1 } },
  12654. .fill_helper = bpf_fill_atomic32_add_reg_pairs,
  12655. .stack_depth = 8,
  12656. },
  12657. {
  12658. "ATOMIC_W_AND: register combinations",
  12659. { },
  12660. INTERNAL,
  12661. { },
  12662. { { 0, 1 } },
  12663. .fill_helper = bpf_fill_atomic32_and_reg_pairs,
  12664. .stack_depth = 8,
  12665. },
  12666. {
  12667. "ATOMIC_W_OR: register combinations",
  12668. { },
  12669. INTERNAL,
  12670. { },
  12671. { { 0, 1 } },
  12672. .fill_helper = bpf_fill_atomic32_or_reg_pairs,
  12673. .stack_depth = 8,
  12674. },
  12675. {
  12676. "ATOMIC_W_XOR: register combinations",
  12677. { },
  12678. INTERNAL,
  12679. { },
  12680. { { 0, 1 } },
  12681. .fill_helper = bpf_fill_atomic32_xor_reg_pairs,
  12682. .stack_depth = 8,
  12683. },
  12684. {
  12685. "ATOMIC_W_ADD_FETCH: register combinations",
  12686. { },
  12687. INTERNAL,
  12688. { },
  12689. { { 0, 1 } },
  12690. .fill_helper = bpf_fill_atomic32_add_fetch_reg_pairs,
  12691. .stack_depth = 8,
  12692. },
  12693. {
  12694. "ATOMIC_W_AND_FETCH: register combinations",
  12695. { },
  12696. INTERNAL,
  12697. { },
  12698. { { 0, 1 } },
  12699. .fill_helper = bpf_fill_atomic32_and_fetch_reg_pairs,
  12700. .stack_depth = 8,
  12701. },
  12702. {
  12703. "ATOMIC_W_OR_FETCH: register combinations",
  12704. { },
  12705. INTERNAL,
  12706. { },
  12707. { { 0, 1 } },
  12708. .fill_helper = bpf_fill_atomic32_or_fetch_reg_pairs,
  12709. .stack_depth = 8,
  12710. },
  12711. {
  12712. "ATOMIC_W_XOR_FETCH: register combinations",
  12713. { },
  12714. INTERNAL,
  12715. { },
  12716. { { 0, 1 } },
  12717. .fill_helper = bpf_fill_atomic32_xor_fetch_reg_pairs,
  12718. .stack_depth = 8,
  12719. },
  12720. {
  12721. "ATOMIC_W_XCHG: register combinations",
  12722. { },
  12723. INTERNAL,
  12724. { },
  12725. { { 0, 1 } },
  12726. .fill_helper = bpf_fill_atomic32_xchg_reg_pairs,
  12727. .stack_depth = 8,
  12728. },
  12729. {
  12730. "ATOMIC_W_CMPXCHG: register combinations",
  12731. { },
  12732. INTERNAL,
  12733. { },
  12734. { { 0, 1 } },
  12735. .fill_helper = bpf_fill_atomic32_cmpxchg_reg_pairs,
  12736. .stack_depth = 8,
  12737. },
  12738. /* 64-bit ATOMIC magnitudes */
  12739. {
  12740. "ATOMIC_DW_ADD: all operand magnitudes",
  12741. { },
  12742. INTERNAL | FLAG_NO_DATA,
  12743. { },
  12744. { { 0, 1 } },
  12745. .fill_helper = bpf_fill_atomic64_add,
  12746. .stack_depth = 8,
  12747. .nr_testruns = NR_PATTERN_RUNS,
  12748. },
  12749. {
  12750. "ATOMIC_DW_AND: all operand magnitudes",
  12751. { },
  12752. INTERNAL | FLAG_NO_DATA,
  12753. { },
  12754. { { 0, 1 } },
  12755. .fill_helper = bpf_fill_atomic64_and,
  12756. .stack_depth = 8,
  12757. .nr_testruns = NR_PATTERN_RUNS,
  12758. },
  12759. {
  12760. "ATOMIC_DW_OR: all operand magnitudes",
  12761. { },
  12762. INTERNAL | FLAG_NO_DATA,
  12763. { },
  12764. { { 0, 1 } },
  12765. .fill_helper = bpf_fill_atomic64_or,
  12766. .stack_depth = 8,
  12767. .nr_testruns = NR_PATTERN_RUNS,
  12768. },
  12769. {
  12770. "ATOMIC_DW_XOR: all operand magnitudes",
  12771. { },
  12772. INTERNAL | FLAG_NO_DATA,
  12773. { },
  12774. { { 0, 1 } },
  12775. .fill_helper = bpf_fill_atomic64_xor,
  12776. .stack_depth = 8,
  12777. .nr_testruns = NR_PATTERN_RUNS,
  12778. },
  12779. {
  12780. "ATOMIC_DW_ADD_FETCH: all operand magnitudes",
  12781. { },
  12782. INTERNAL | FLAG_NO_DATA,
  12783. { },
  12784. { { 0, 1 } },
  12785. .fill_helper = bpf_fill_atomic64_add_fetch,
  12786. .stack_depth = 8,
  12787. .nr_testruns = NR_PATTERN_RUNS,
  12788. },
  12789. {
  12790. "ATOMIC_DW_AND_FETCH: all operand magnitudes",
  12791. { },
  12792. INTERNAL | FLAG_NO_DATA,
  12793. { },
  12794. { { 0, 1 } },
  12795. .fill_helper = bpf_fill_atomic64_and_fetch,
  12796. .stack_depth = 8,
  12797. .nr_testruns = NR_PATTERN_RUNS,
  12798. },
  12799. {
  12800. "ATOMIC_DW_OR_FETCH: all operand magnitudes",
  12801. { },
  12802. INTERNAL | FLAG_NO_DATA,
  12803. { },
  12804. { { 0, 1 } },
  12805. .fill_helper = bpf_fill_atomic64_or_fetch,
  12806. .stack_depth = 8,
  12807. .nr_testruns = NR_PATTERN_RUNS,
  12808. },
  12809. {
  12810. "ATOMIC_DW_XOR_FETCH: all operand magnitudes",
  12811. { },
  12812. INTERNAL | FLAG_NO_DATA,
  12813. { },
  12814. { { 0, 1 } },
  12815. .fill_helper = bpf_fill_atomic64_xor_fetch,
  12816. .stack_depth = 8,
  12817. .nr_testruns = NR_PATTERN_RUNS,
  12818. },
  12819. {
  12820. "ATOMIC_DW_XCHG: all operand magnitudes",
  12821. { },
  12822. INTERNAL | FLAG_NO_DATA,
  12823. { },
  12824. { { 0, 1 } },
  12825. .fill_helper = bpf_fill_atomic64_xchg,
  12826. .stack_depth = 8,
  12827. .nr_testruns = NR_PATTERN_RUNS,
  12828. },
  12829. {
  12830. "ATOMIC_DW_CMPXCHG: all operand magnitudes",
  12831. { },
  12832. INTERNAL | FLAG_NO_DATA,
  12833. { },
  12834. { { 0, 1 } },
  12835. .fill_helper = bpf_fill_cmpxchg64,
  12836. .stack_depth = 8,
  12837. .nr_testruns = NR_PATTERN_RUNS,
  12838. },
  12839. /* 32-bit atomic magnitudes */
  12840. {
  12841. "ATOMIC_W_ADD: all operand magnitudes",
  12842. { },
  12843. INTERNAL | FLAG_NO_DATA,
  12844. { },
  12845. { { 0, 1 } },
  12846. .fill_helper = bpf_fill_atomic32_add,
  12847. .stack_depth = 8,
  12848. .nr_testruns = NR_PATTERN_RUNS,
  12849. },
  12850. {
  12851. "ATOMIC_W_AND: all operand magnitudes",
  12852. { },
  12853. INTERNAL | FLAG_NO_DATA,
  12854. { },
  12855. { { 0, 1 } },
  12856. .fill_helper = bpf_fill_atomic32_and,
  12857. .stack_depth = 8,
  12858. .nr_testruns = NR_PATTERN_RUNS,
  12859. },
  12860. {
  12861. "ATOMIC_W_OR: all operand magnitudes",
  12862. { },
  12863. INTERNAL | FLAG_NO_DATA,
  12864. { },
  12865. { { 0, 1 } },
  12866. .fill_helper = bpf_fill_atomic32_or,
  12867. .stack_depth = 8,
  12868. .nr_testruns = NR_PATTERN_RUNS,
  12869. },
  12870. {
  12871. "ATOMIC_W_XOR: all operand magnitudes",
  12872. { },
  12873. INTERNAL | FLAG_NO_DATA,
  12874. { },
  12875. { { 0, 1 } },
  12876. .fill_helper = bpf_fill_atomic32_xor,
  12877. .stack_depth = 8,
  12878. .nr_testruns = NR_PATTERN_RUNS,
  12879. },
  12880. {
  12881. "ATOMIC_W_ADD_FETCH: all operand magnitudes",
  12882. { },
  12883. INTERNAL | FLAG_NO_DATA,
  12884. { },
  12885. { { 0, 1 } },
  12886. .fill_helper = bpf_fill_atomic32_add_fetch,
  12887. .stack_depth = 8,
  12888. .nr_testruns = NR_PATTERN_RUNS,
  12889. },
  12890. {
  12891. "ATOMIC_W_AND_FETCH: all operand magnitudes",
  12892. { },
  12893. INTERNAL | FLAG_NO_DATA,
  12894. { },
  12895. { { 0, 1 } },
  12896. .fill_helper = bpf_fill_atomic32_and_fetch,
  12897. .stack_depth = 8,
  12898. .nr_testruns = NR_PATTERN_RUNS,
  12899. },
  12900. {
  12901. "ATOMIC_W_OR_FETCH: all operand magnitudes",
  12902. { },
  12903. INTERNAL | FLAG_NO_DATA,
  12904. { },
  12905. { { 0, 1 } },
  12906. .fill_helper = bpf_fill_atomic32_or_fetch,
  12907. .stack_depth = 8,
  12908. .nr_testruns = NR_PATTERN_RUNS,
  12909. },
  12910. {
  12911. "ATOMIC_W_XOR_FETCH: all operand magnitudes",
  12912. { },
  12913. INTERNAL | FLAG_NO_DATA,
  12914. { },
  12915. { { 0, 1 } },
  12916. .fill_helper = bpf_fill_atomic32_xor_fetch,
  12917. .stack_depth = 8,
  12918. .nr_testruns = NR_PATTERN_RUNS,
  12919. },
  12920. {
  12921. "ATOMIC_W_XCHG: all operand magnitudes",
  12922. { },
  12923. INTERNAL | FLAG_NO_DATA,
  12924. { },
  12925. { { 0, 1 } },
  12926. .fill_helper = bpf_fill_atomic32_xchg,
  12927. .stack_depth = 8,
  12928. .nr_testruns = NR_PATTERN_RUNS,
  12929. },
  12930. {
  12931. "ATOMIC_W_CMPXCHG: all operand magnitudes",
  12932. { },
  12933. INTERNAL | FLAG_NO_DATA,
  12934. { },
  12935. { { 0, 1 } },
  12936. .fill_helper = bpf_fill_cmpxchg32,
  12937. .stack_depth = 8,
  12938. .nr_testruns = NR_PATTERN_RUNS,
  12939. },
  12940. /* JMP immediate magnitudes */
  12941. {
  12942. "JMP_JSET_K: all immediate value magnitudes",
  12943. { },
  12944. INTERNAL | FLAG_NO_DATA,
  12945. { },
  12946. { { 0, 1 } },
  12947. .fill_helper = bpf_fill_jmp_jset_imm,
  12948. .nr_testruns = NR_PATTERN_RUNS,
  12949. },
  12950. {
  12951. "JMP_JEQ_K: all immediate value magnitudes",
  12952. { },
  12953. INTERNAL | FLAG_NO_DATA,
  12954. { },
  12955. { { 0, 1 } },
  12956. .fill_helper = bpf_fill_jmp_jeq_imm,
  12957. .nr_testruns = NR_PATTERN_RUNS,
  12958. },
  12959. {
  12960. "JMP_JNE_K: all immediate value magnitudes",
  12961. { },
  12962. INTERNAL | FLAG_NO_DATA,
  12963. { },
  12964. { { 0, 1 } },
  12965. .fill_helper = bpf_fill_jmp_jne_imm,
  12966. .nr_testruns = NR_PATTERN_RUNS,
  12967. },
  12968. {
  12969. "JMP_JGT_K: all immediate value magnitudes",
  12970. { },
  12971. INTERNAL | FLAG_NO_DATA,
  12972. { },
  12973. { { 0, 1 } },
  12974. .fill_helper = bpf_fill_jmp_jgt_imm,
  12975. .nr_testruns = NR_PATTERN_RUNS,
  12976. },
  12977. {
  12978. "JMP_JGE_K: all immediate value magnitudes",
  12979. { },
  12980. INTERNAL | FLAG_NO_DATA,
  12981. { },
  12982. { { 0, 1 } },
  12983. .fill_helper = bpf_fill_jmp_jge_imm,
  12984. .nr_testruns = NR_PATTERN_RUNS,
  12985. },
  12986. {
  12987. "JMP_JLT_K: all immediate value magnitudes",
  12988. { },
  12989. INTERNAL | FLAG_NO_DATA,
  12990. { },
  12991. { { 0, 1 } },
  12992. .fill_helper = bpf_fill_jmp_jlt_imm,
  12993. .nr_testruns = NR_PATTERN_RUNS,
  12994. },
  12995. {
  12996. "JMP_JLE_K: all immediate value magnitudes",
  12997. { },
  12998. INTERNAL | FLAG_NO_DATA,
  12999. { },
  13000. { { 0, 1 } },
  13001. .fill_helper = bpf_fill_jmp_jle_imm,
  13002. .nr_testruns = NR_PATTERN_RUNS,
  13003. },
  13004. {
  13005. "JMP_JSGT_K: all immediate value magnitudes",
  13006. { },
  13007. INTERNAL | FLAG_NO_DATA,
  13008. { },
  13009. { { 0, 1 } },
  13010. .fill_helper = bpf_fill_jmp_jsgt_imm,
  13011. .nr_testruns = NR_PATTERN_RUNS,
  13012. },
  13013. {
  13014. "JMP_JSGE_K: all immediate value magnitudes",
  13015. { },
  13016. INTERNAL | FLAG_NO_DATA,
  13017. { },
  13018. { { 0, 1 } },
  13019. .fill_helper = bpf_fill_jmp_jsge_imm,
  13020. .nr_testruns = NR_PATTERN_RUNS,
  13021. },
  13022. {
  13023. "JMP_JSLT_K: all immediate value magnitudes",
  13024. { },
  13025. INTERNAL | FLAG_NO_DATA,
  13026. { },
  13027. { { 0, 1 } },
  13028. .fill_helper = bpf_fill_jmp_jslt_imm,
  13029. .nr_testruns = NR_PATTERN_RUNS,
  13030. },
  13031. {
  13032. "JMP_JSLE_K: all immediate value magnitudes",
  13033. { },
  13034. INTERNAL | FLAG_NO_DATA,
  13035. { },
  13036. { { 0, 1 } },
  13037. .fill_helper = bpf_fill_jmp_jsle_imm,
  13038. .nr_testruns = NR_PATTERN_RUNS,
  13039. },
  13040. /* JMP register magnitudes */
  13041. {
  13042. "JMP_JSET_X: all register value magnitudes",
  13043. { },
  13044. INTERNAL | FLAG_NO_DATA,
  13045. { },
  13046. { { 0, 1 } },
  13047. .fill_helper = bpf_fill_jmp_jset_reg,
  13048. .nr_testruns = NR_PATTERN_RUNS,
  13049. },
  13050. {
  13051. "JMP_JEQ_X: all register value magnitudes",
  13052. { },
  13053. INTERNAL | FLAG_NO_DATA,
  13054. { },
  13055. { { 0, 1 } },
  13056. .fill_helper = bpf_fill_jmp_jeq_reg,
  13057. .nr_testruns = NR_PATTERN_RUNS,
  13058. },
  13059. {
  13060. "JMP_JNE_X: all register value magnitudes",
  13061. { },
  13062. INTERNAL | FLAG_NO_DATA,
  13063. { },
  13064. { { 0, 1 } },
  13065. .fill_helper = bpf_fill_jmp_jne_reg,
  13066. .nr_testruns = NR_PATTERN_RUNS,
  13067. },
  13068. {
  13069. "JMP_JGT_X: all register value magnitudes",
  13070. { },
  13071. INTERNAL | FLAG_NO_DATA,
  13072. { },
  13073. { { 0, 1 } },
  13074. .fill_helper = bpf_fill_jmp_jgt_reg,
  13075. .nr_testruns = NR_PATTERN_RUNS,
  13076. },
  13077. {
  13078. "JMP_JGE_X: all register value magnitudes",
  13079. { },
  13080. INTERNAL | FLAG_NO_DATA,
  13081. { },
  13082. { { 0, 1 } },
  13083. .fill_helper = bpf_fill_jmp_jge_reg,
  13084. .nr_testruns = NR_PATTERN_RUNS,
  13085. },
  13086. {
  13087. "JMP_JLT_X: all register value magnitudes",
  13088. { },
  13089. INTERNAL | FLAG_NO_DATA,
  13090. { },
  13091. { { 0, 1 } },
  13092. .fill_helper = bpf_fill_jmp_jlt_reg,
  13093. .nr_testruns = NR_PATTERN_RUNS,
  13094. },
  13095. {
  13096. "JMP_JLE_X: all register value magnitudes",
  13097. { },
  13098. INTERNAL | FLAG_NO_DATA,
  13099. { },
  13100. { { 0, 1 } },
  13101. .fill_helper = bpf_fill_jmp_jle_reg,
  13102. .nr_testruns = NR_PATTERN_RUNS,
  13103. },
  13104. {
  13105. "JMP_JSGT_X: all register value magnitudes",
  13106. { },
  13107. INTERNAL | FLAG_NO_DATA,
  13108. { },
  13109. { { 0, 1 } },
  13110. .fill_helper = bpf_fill_jmp_jsgt_reg,
  13111. .nr_testruns = NR_PATTERN_RUNS,
  13112. },
  13113. {
  13114. "JMP_JSGE_X: all register value magnitudes",
  13115. { },
  13116. INTERNAL | FLAG_NO_DATA,
  13117. { },
  13118. { { 0, 1 } },
  13119. .fill_helper = bpf_fill_jmp_jsge_reg,
  13120. .nr_testruns = NR_PATTERN_RUNS,
  13121. },
  13122. {
  13123. "JMP_JSLT_X: all register value magnitudes",
  13124. { },
  13125. INTERNAL | FLAG_NO_DATA,
  13126. { },
  13127. { { 0, 1 } },
  13128. .fill_helper = bpf_fill_jmp_jslt_reg,
  13129. .nr_testruns = NR_PATTERN_RUNS,
  13130. },
  13131. {
  13132. "JMP_JSLE_X: all register value magnitudes",
  13133. { },
  13134. INTERNAL | FLAG_NO_DATA,
  13135. { },
  13136. { { 0, 1 } },
  13137. .fill_helper = bpf_fill_jmp_jsle_reg,
  13138. .nr_testruns = NR_PATTERN_RUNS,
  13139. },
  13140. /* JMP32 immediate magnitudes */
  13141. {
  13142. "JMP32_JSET_K: all immediate value magnitudes",
  13143. { },
  13144. INTERNAL | FLAG_NO_DATA,
  13145. { },
  13146. { { 0, 1 } },
  13147. .fill_helper = bpf_fill_jmp32_jset_imm,
  13148. .nr_testruns = NR_PATTERN_RUNS,
  13149. },
  13150. {
  13151. "JMP32_JEQ_K: all immediate value magnitudes",
  13152. { },
  13153. INTERNAL | FLAG_NO_DATA,
  13154. { },
  13155. { { 0, 1 } },
  13156. .fill_helper = bpf_fill_jmp32_jeq_imm,
  13157. .nr_testruns = NR_PATTERN_RUNS,
  13158. },
  13159. {
  13160. "JMP32_JNE_K: all immediate value magnitudes",
  13161. { },
  13162. INTERNAL | FLAG_NO_DATA,
  13163. { },
  13164. { { 0, 1 } },
  13165. .fill_helper = bpf_fill_jmp32_jne_imm,
  13166. .nr_testruns = NR_PATTERN_RUNS,
  13167. },
  13168. {
  13169. "JMP32_JGT_K: all immediate value magnitudes",
  13170. { },
  13171. INTERNAL | FLAG_NO_DATA,
  13172. { },
  13173. { { 0, 1 } },
  13174. .fill_helper = bpf_fill_jmp32_jgt_imm,
  13175. .nr_testruns = NR_PATTERN_RUNS,
  13176. },
  13177. {
  13178. "JMP32_JGE_K: all immediate value magnitudes",
  13179. { },
  13180. INTERNAL | FLAG_NO_DATA,
  13181. { },
  13182. { { 0, 1 } },
  13183. .fill_helper = bpf_fill_jmp32_jge_imm,
  13184. .nr_testruns = NR_PATTERN_RUNS,
  13185. },
  13186. {
  13187. "JMP32_JLT_K: all immediate value magnitudes",
  13188. { },
  13189. INTERNAL | FLAG_NO_DATA,
  13190. { },
  13191. { { 0, 1 } },
  13192. .fill_helper = bpf_fill_jmp32_jlt_imm,
  13193. .nr_testruns = NR_PATTERN_RUNS,
  13194. },
  13195. {
  13196. "JMP32_JLE_K: all immediate value magnitudes",
  13197. { },
  13198. INTERNAL | FLAG_NO_DATA,
  13199. { },
  13200. { { 0, 1 } },
  13201. .fill_helper = bpf_fill_jmp32_jle_imm,
  13202. .nr_testruns = NR_PATTERN_RUNS,
  13203. },
  13204. {
  13205. "JMP32_JSGT_K: all immediate value magnitudes",
  13206. { },
  13207. INTERNAL | FLAG_NO_DATA,
  13208. { },
  13209. { { 0, 1 } },
  13210. .fill_helper = bpf_fill_jmp32_jsgt_imm,
  13211. .nr_testruns = NR_PATTERN_RUNS,
  13212. },
  13213. {
  13214. "JMP32_JSGE_K: all immediate value magnitudes",
  13215. { },
  13216. INTERNAL | FLAG_NO_DATA,
  13217. { },
  13218. { { 0, 1 } },
  13219. .fill_helper = bpf_fill_jmp32_jsge_imm,
  13220. .nr_testruns = NR_PATTERN_RUNS,
  13221. },
  13222. {
  13223. "JMP32_JSLT_K: all immediate value magnitudes",
  13224. { },
  13225. INTERNAL | FLAG_NO_DATA,
  13226. { },
  13227. { { 0, 1 } },
  13228. .fill_helper = bpf_fill_jmp32_jslt_imm,
  13229. .nr_testruns = NR_PATTERN_RUNS,
  13230. },
  13231. {
  13232. "JMP32_JSLE_K: all immediate value magnitudes",
  13233. { },
  13234. INTERNAL | FLAG_NO_DATA,
  13235. { },
  13236. { { 0, 1 } },
  13237. .fill_helper = bpf_fill_jmp32_jsle_imm,
  13238. .nr_testruns = NR_PATTERN_RUNS,
  13239. },
  13240. /* JMP32 register magnitudes */
  13241. {
  13242. "JMP32_JSET_X: all register value magnitudes",
  13243. { },
  13244. INTERNAL | FLAG_NO_DATA,
  13245. { },
  13246. { { 0, 1 } },
  13247. .fill_helper = bpf_fill_jmp32_jset_reg,
  13248. .nr_testruns = NR_PATTERN_RUNS,
  13249. },
  13250. {
  13251. "JMP32_JEQ_X: all register value magnitudes",
  13252. { },
  13253. INTERNAL | FLAG_NO_DATA,
  13254. { },
  13255. { { 0, 1 } },
  13256. .fill_helper = bpf_fill_jmp32_jeq_reg,
  13257. .nr_testruns = NR_PATTERN_RUNS,
  13258. },
  13259. {
  13260. "JMP32_JNE_X: all register value magnitudes",
  13261. { },
  13262. INTERNAL | FLAG_NO_DATA,
  13263. { },
  13264. { { 0, 1 } },
  13265. .fill_helper = bpf_fill_jmp32_jne_reg,
  13266. .nr_testruns = NR_PATTERN_RUNS,
  13267. },
  13268. {
  13269. "JMP32_JGT_X: all register value magnitudes",
  13270. { },
  13271. INTERNAL | FLAG_NO_DATA,
  13272. { },
  13273. { { 0, 1 } },
  13274. .fill_helper = bpf_fill_jmp32_jgt_reg,
  13275. .nr_testruns = NR_PATTERN_RUNS,
  13276. },
  13277. {
  13278. "JMP32_JGE_X: all register value magnitudes",
  13279. { },
  13280. INTERNAL | FLAG_NO_DATA,
  13281. { },
  13282. { { 0, 1 } },
  13283. .fill_helper = bpf_fill_jmp32_jge_reg,
  13284. .nr_testruns = NR_PATTERN_RUNS,
  13285. },
  13286. {
  13287. "JMP32_JLT_X: all register value magnitudes",
  13288. { },
  13289. INTERNAL | FLAG_NO_DATA,
  13290. { },
  13291. { { 0, 1 } },
  13292. .fill_helper = bpf_fill_jmp32_jlt_reg,
  13293. .nr_testruns = NR_PATTERN_RUNS,
  13294. },
  13295. {
  13296. "JMP32_JLE_X: all register value magnitudes",
  13297. { },
  13298. INTERNAL | FLAG_NO_DATA,
  13299. { },
  13300. { { 0, 1 } },
  13301. .fill_helper = bpf_fill_jmp32_jle_reg,
  13302. .nr_testruns = NR_PATTERN_RUNS,
  13303. },
  13304. {
  13305. "JMP32_JSGT_X: all register value magnitudes",
  13306. { },
  13307. INTERNAL | FLAG_NO_DATA,
  13308. { },
  13309. { { 0, 1 } },
  13310. .fill_helper = bpf_fill_jmp32_jsgt_reg,
  13311. .nr_testruns = NR_PATTERN_RUNS,
  13312. },
  13313. {
  13314. "JMP32_JSGE_X: all register value magnitudes",
  13315. { },
  13316. INTERNAL | FLAG_NO_DATA,
  13317. { },
  13318. { { 0, 1 } },
  13319. .fill_helper = bpf_fill_jmp32_jsge_reg,
  13320. .nr_testruns = NR_PATTERN_RUNS,
  13321. },
  13322. {
  13323. "JMP32_JSLT_X: all register value magnitudes",
  13324. { },
  13325. INTERNAL | FLAG_NO_DATA,
  13326. { },
  13327. { { 0, 1 } },
  13328. .fill_helper = bpf_fill_jmp32_jslt_reg,
  13329. .nr_testruns = NR_PATTERN_RUNS,
  13330. },
  13331. {
  13332. "JMP32_JSLE_X: all register value magnitudes",
  13333. { },
  13334. INTERNAL | FLAG_NO_DATA,
  13335. { },
  13336. { { 0, 1 } },
  13337. .fill_helper = bpf_fill_jmp32_jsle_reg,
  13338. .nr_testruns = NR_PATTERN_RUNS,
  13339. },
  13340. /* Conditional jumps with constant decision */
  13341. {
  13342. "JMP_JSET_K: imm = 0 -> never taken",
  13343. .u.insns_int = {
  13344. BPF_ALU64_IMM(BPF_MOV, R0, 1),
  13345. BPF_JMP_IMM(BPF_JSET, R1, 0, 1),
  13346. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  13347. BPF_EXIT_INSN(),
  13348. },
  13349. INTERNAL | FLAG_NO_DATA,
  13350. { },
  13351. { { 0, 0 } },
  13352. },
  13353. {
  13354. "JMP_JLT_K: imm = 0 -> never taken",
  13355. .u.insns_int = {
  13356. BPF_ALU64_IMM(BPF_MOV, R0, 1),
  13357. BPF_JMP_IMM(BPF_JLT, R1, 0, 1),
  13358. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  13359. BPF_EXIT_INSN(),
  13360. },
  13361. INTERNAL | FLAG_NO_DATA,
  13362. { },
  13363. { { 0, 0 } },
  13364. },
  13365. {
  13366. "JMP_JGE_K: imm = 0 -> always taken",
  13367. .u.insns_int = {
  13368. BPF_ALU64_IMM(BPF_MOV, R0, 1),
  13369. BPF_JMP_IMM(BPF_JGE, R1, 0, 1),
  13370. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  13371. BPF_EXIT_INSN(),
  13372. },
  13373. INTERNAL | FLAG_NO_DATA,
  13374. { },
  13375. { { 0, 1 } },
  13376. },
  13377. {
  13378. "JMP_JGT_K: imm = 0xffffffff -> never taken",
  13379. .u.insns_int = {
  13380. BPF_ALU64_IMM(BPF_MOV, R0, 1),
  13381. BPF_JMP_IMM(BPF_JGT, R1, U32_MAX, 1),
  13382. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  13383. BPF_EXIT_INSN(),
  13384. },
  13385. INTERNAL | FLAG_NO_DATA,
  13386. { },
  13387. { { 0, 0 } },
  13388. },
  13389. {
  13390. "JMP_JLE_K: imm = 0xffffffff -> always taken",
  13391. .u.insns_int = {
  13392. BPF_ALU64_IMM(BPF_MOV, R0, 1),
  13393. BPF_JMP_IMM(BPF_JLE, R1, U32_MAX, 1),
  13394. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  13395. BPF_EXIT_INSN(),
  13396. },
  13397. INTERNAL | FLAG_NO_DATA,
  13398. { },
  13399. { { 0, 1 } },
  13400. },
  13401. {
  13402. "JMP32_JSGT_K: imm = 0x7fffffff -> never taken",
  13403. .u.insns_int = {
  13404. BPF_ALU64_IMM(BPF_MOV, R0, 1),
  13405. BPF_JMP32_IMM(BPF_JSGT, R1, S32_MAX, 1),
  13406. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  13407. BPF_EXIT_INSN(),
  13408. },
  13409. INTERNAL | FLAG_NO_DATA,
  13410. { },
  13411. { { 0, 0 } },
  13412. },
  13413. {
  13414. "JMP32_JSGE_K: imm = -0x80000000 -> always taken",
  13415. .u.insns_int = {
  13416. BPF_ALU64_IMM(BPF_MOV, R0, 1),
  13417. BPF_JMP32_IMM(BPF_JSGE, R1, S32_MIN, 1),
  13418. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  13419. BPF_EXIT_INSN(),
  13420. },
  13421. INTERNAL | FLAG_NO_DATA,
  13422. { },
  13423. { { 0, 1 } },
  13424. },
  13425. {
  13426. "JMP32_JSLT_K: imm = -0x80000000 -> never taken",
  13427. .u.insns_int = {
  13428. BPF_ALU64_IMM(BPF_MOV, R0, 1),
  13429. BPF_JMP32_IMM(BPF_JSLT, R1, S32_MIN, 1),
  13430. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  13431. BPF_EXIT_INSN(),
  13432. },
  13433. INTERNAL | FLAG_NO_DATA,
  13434. { },
  13435. { { 0, 0 } },
  13436. },
  13437. {
  13438. "JMP32_JSLE_K: imm = 0x7fffffff -> always taken",
  13439. .u.insns_int = {
  13440. BPF_ALU64_IMM(BPF_MOV, R0, 1),
  13441. BPF_JMP32_IMM(BPF_JSLE, R1, S32_MAX, 1),
  13442. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  13443. BPF_EXIT_INSN(),
  13444. },
  13445. INTERNAL | FLAG_NO_DATA,
  13446. { },
  13447. { { 0, 1 } },
  13448. },
  13449. {
  13450. "JMP_JEQ_X: dst = src -> always taken",
  13451. .u.insns_int = {
  13452. BPF_ALU64_IMM(BPF_MOV, R0, 1),
  13453. BPF_JMP_REG(BPF_JEQ, R1, R1, 1),
  13454. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  13455. BPF_EXIT_INSN(),
  13456. },
  13457. INTERNAL | FLAG_NO_DATA,
  13458. { },
  13459. { { 0, 1 } },
  13460. },
  13461. {
  13462. "JMP_JGE_X: dst = src -> always taken",
  13463. .u.insns_int = {
  13464. BPF_ALU64_IMM(BPF_MOV, R0, 1),
  13465. BPF_JMP_REG(BPF_JGE, R1, R1, 1),
  13466. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  13467. BPF_EXIT_INSN(),
  13468. },
  13469. INTERNAL | FLAG_NO_DATA,
  13470. { },
  13471. { { 0, 1 } },
  13472. },
  13473. {
  13474. "JMP_JLE_X: dst = src -> always taken",
  13475. .u.insns_int = {
  13476. BPF_ALU64_IMM(BPF_MOV, R0, 1),
  13477. BPF_JMP_REG(BPF_JLE, R1, R1, 1),
  13478. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  13479. BPF_EXIT_INSN(),
  13480. },
  13481. INTERNAL | FLAG_NO_DATA,
  13482. { },
  13483. { { 0, 1 } },
  13484. },
  13485. {
  13486. "JMP_JSGE_X: dst = src -> always taken",
  13487. .u.insns_int = {
  13488. BPF_ALU64_IMM(BPF_MOV, R0, 1),
  13489. BPF_JMP_REG(BPF_JSGE, R1, R1, 1),
  13490. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  13491. BPF_EXIT_INSN(),
  13492. },
  13493. INTERNAL | FLAG_NO_DATA,
  13494. { },
  13495. { { 0, 1 } },
  13496. },
  13497. {
  13498. "JMP_JSLE_X: dst = src -> always taken",
  13499. .u.insns_int = {
  13500. BPF_ALU64_IMM(BPF_MOV, R0, 1),
  13501. BPF_JMP_REG(BPF_JSLE, R1, R1, 1),
  13502. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  13503. BPF_EXIT_INSN(),
  13504. },
  13505. INTERNAL | FLAG_NO_DATA,
  13506. { },
  13507. { { 0, 1 } },
  13508. },
  13509. {
  13510. "JMP_JNE_X: dst = src -> never taken",
  13511. .u.insns_int = {
  13512. BPF_ALU64_IMM(BPF_MOV, R0, 1),
  13513. BPF_JMP_REG(BPF_JNE, R1, R1, 1),
  13514. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  13515. BPF_EXIT_INSN(),
  13516. },
  13517. INTERNAL | FLAG_NO_DATA,
  13518. { },
  13519. { { 0, 0 } },
  13520. },
  13521. {
  13522. "JMP_JGT_X: dst = src -> never taken",
  13523. .u.insns_int = {
  13524. BPF_ALU64_IMM(BPF_MOV, R0, 1),
  13525. BPF_JMP_REG(BPF_JGT, R1, R1, 1),
  13526. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  13527. BPF_EXIT_INSN(),
  13528. },
  13529. INTERNAL | FLAG_NO_DATA,
  13530. { },
  13531. { { 0, 0 } },
  13532. },
  13533. {
  13534. "JMP_JLT_X: dst = src -> never taken",
  13535. .u.insns_int = {
  13536. BPF_ALU64_IMM(BPF_MOV, R0, 1),
  13537. BPF_JMP_REG(BPF_JLT, R1, R1, 1),
  13538. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  13539. BPF_EXIT_INSN(),
  13540. },
  13541. INTERNAL | FLAG_NO_DATA,
  13542. { },
  13543. { { 0, 0 } },
  13544. },
  13545. {
  13546. "JMP_JSGT_X: dst = src -> never taken",
  13547. .u.insns_int = {
  13548. BPF_ALU64_IMM(BPF_MOV, R0, 1),
  13549. BPF_JMP_REG(BPF_JSGT, R1, R1, 1),
  13550. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  13551. BPF_EXIT_INSN(),
  13552. },
  13553. INTERNAL | FLAG_NO_DATA,
  13554. { },
  13555. { { 0, 0 } },
  13556. },
  13557. {
  13558. "JMP_JSLT_X: dst = src -> never taken",
  13559. .u.insns_int = {
  13560. BPF_ALU64_IMM(BPF_MOV, R0, 1),
  13561. BPF_JMP_REG(BPF_JSLT, R1, R1, 1),
  13562. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  13563. BPF_EXIT_INSN(),
  13564. },
  13565. INTERNAL | FLAG_NO_DATA,
  13566. { },
  13567. { { 0, 0 } },
  13568. },
  13569. /* Short relative jumps */
  13570. {
  13571. "Short relative jump: offset=0",
  13572. .u.insns_int = {
  13573. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  13574. BPF_JMP_IMM(BPF_JEQ, R0, 0, 0),
  13575. BPF_EXIT_INSN(),
  13576. BPF_ALU32_IMM(BPF_MOV, R0, -1),
  13577. },
  13578. INTERNAL | FLAG_NO_DATA | FLAG_VERIFIER_ZEXT,
  13579. { },
  13580. { { 0, 0 } },
  13581. },
  13582. {
  13583. "Short relative jump: offset=1",
  13584. .u.insns_int = {
  13585. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  13586. BPF_JMP_IMM(BPF_JEQ, R0, 0, 1),
  13587. BPF_ALU32_IMM(BPF_ADD, R0, 1),
  13588. BPF_EXIT_INSN(),
  13589. BPF_ALU32_IMM(BPF_MOV, R0, -1),
  13590. },
  13591. INTERNAL | FLAG_NO_DATA | FLAG_VERIFIER_ZEXT,
  13592. { },
  13593. { { 0, 0 } },
  13594. },
  13595. {
  13596. "Short relative jump: offset=2",
  13597. .u.insns_int = {
  13598. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  13599. BPF_JMP_IMM(BPF_JEQ, R0, 0, 2),
  13600. BPF_ALU32_IMM(BPF_ADD, R0, 1),
  13601. BPF_ALU32_IMM(BPF_ADD, R0, 1),
  13602. BPF_EXIT_INSN(),
  13603. BPF_ALU32_IMM(BPF_MOV, R0, -1),
  13604. },
  13605. INTERNAL | FLAG_NO_DATA | FLAG_VERIFIER_ZEXT,
  13606. { },
  13607. { { 0, 0 } },
  13608. },
  13609. {
  13610. "Short relative jump: offset=3",
  13611. .u.insns_int = {
  13612. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  13613. BPF_JMP_IMM(BPF_JEQ, R0, 0, 3),
  13614. BPF_ALU32_IMM(BPF_ADD, R0, 1),
  13615. BPF_ALU32_IMM(BPF_ADD, R0, 1),
  13616. BPF_ALU32_IMM(BPF_ADD, R0, 1),
  13617. BPF_EXIT_INSN(),
  13618. BPF_ALU32_IMM(BPF_MOV, R0, -1),
  13619. },
  13620. INTERNAL | FLAG_NO_DATA | FLAG_VERIFIER_ZEXT,
  13621. { },
  13622. { { 0, 0 } },
  13623. },
  13624. {
  13625. "Short relative jump: offset=4",
  13626. .u.insns_int = {
  13627. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  13628. BPF_JMP_IMM(BPF_JEQ, R0, 0, 4),
  13629. BPF_ALU32_IMM(BPF_ADD, R0, 1),
  13630. BPF_ALU32_IMM(BPF_ADD, R0, 1),
  13631. BPF_ALU32_IMM(BPF_ADD, R0, 1),
  13632. BPF_ALU32_IMM(BPF_ADD, R0, 1),
  13633. BPF_EXIT_INSN(),
  13634. BPF_ALU32_IMM(BPF_MOV, R0, -1),
  13635. },
  13636. INTERNAL | FLAG_NO_DATA | FLAG_VERIFIER_ZEXT,
  13637. { },
  13638. { { 0, 0 } },
  13639. },
  13640. /* Conditional branch conversions */
  13641. {
  13642. "Long conditional jump: taken at runtime (32 bits)",
  13643. { },
  13644. INTERNAL | FLAG_NO_DATA,
  13645. { },
  13646. { { 0, 1 } },
  13647. .fill_helper = bpf_fill_max_jmp_taken_32,
  13648. },
  13649. {
  13650. "Long conditional jump: not taken at runtime (32 bits)",
  13651. { },
  13652. INTERNAL | FLAG_NO_DATA,
  13653. { },
  13654. { { 0, 2 } },
  13655. .fill_helper = bpf_fill_max_jmp_not_taken_32,
  13656. },
  13657. {
  13658. "Long conditional jump: always taken, known at JIT time (32 bits)",
  13659. { },
  13660. INTERNAL | FLAG_NO_DATA,
  13661. { },
  13662. { { 0, 1 } },
  13663. .fill_helper = bpf_fill_max_jmp_always_taken_32,
  13664. },
  13665. {
  13666. "Long conditional jump: never taken, known at JIT time (32 bits)",
  13667. { },
  13668. INTERNAL | FLAG_NO_DATA,
  13669. { },
  13670. { { 0, 2 } },
  13671. .fill_helper = bpf_fill_max_jmp_never_taken_32,
  13672. },
  13673. {
  13674. "Long conditional jump: taken at runtime",
  13675. { },
  13676. INTERNAL | FLAG_NO_DATA,
  13677. { },
  13678. { { 0, 1 } },
  13679. .fill_helper = bpf_fill_max_jmp_taken,
  13680. },
  13681. {
  13682. "Long conditional jump: not taken at runtime",
  13683. { },
  13684. INTERNAL | FLAG_NO_DATA,
  13685. { },
  13686. { { 0, 2 } },
  13687. .fill_helper = bpf_fill_max_jmp_not_taken,
  13688. },
  13689. {
  13690. "Long conditional jump: always taken, known at JIT time",
  13691. { },
  13692. INTERNAL | FLAG_NO_DATA,
  13693. { },
  13694. { { 0, 1 } },
  13695. .fill_helper = bpf_fill_max_jmp_always_taken,
  13696. },
  13697. {
  13698. "Long conditional jump: never taken, known at JIT time",
  13699. { },
  13700. INTERNAL | FLAG_NO_DATA,
  13701. { },
  13702. { { 0, 2 } },
  13703. .fill_helper = bpf_fill_max_jmp_never_taken,
  13704. },
  13705. /* Staggered jump sequences, immediate */
  13706. {
  13707. "Staggered jumps: JMP_JA",
  13708. { },
  13709. INTERNAL | FLAG_NO_DATA,
  13710. { },
  13711. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  13712. .fill_helper = bpf_fill_staggered_ja,
  13713. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  13714. },
  13715. {
  13716. "Staggered jumps: JMP_JEQ_K",
  13717. { },
  13718. INTERNAL | FLAG_NO_DATA,
  13719. { },
  13720. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  13721. .fill_helper = bpf_fill_staggered_jeq_imm,
  13722. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  13723. },
  13724. {
  13725. "Staggered jumps: JMP_JNE_K",
  13726. { },
  13727. INTERNAL | FLAG_NO_DATA,
  13728. { },
  13729. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  13730. .fill_helper = bpf_fill_staggered_jne_imm,
  13731. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  13732. },
  13733. {
  13734. "Staggered jumps: JMP_JSET_K",
  13735. { },
  13736. INTERNAL | FLAG_NO_DATA,
  13737. { },
  13738. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  13739. .fill_helper = bpf_fill_staggered_jset_imm,
  13740. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  13741. },
  13742. {
  13743. "Staggered jumps: JMP_JGT_K",
  13744. { },
  13745. INTERNAL | FLAG_NO_DATA,
  13746. { },
  13747. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  13748. .fill_helper = bpf_fill_staggered_jgt_imm,
  13749. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  13750. },
  13751. {
  13752. "Staggered jumps: JMP_JGE_K",
  13753. { },
  13754. INTERNAL | FLAG_NO_DATA,
  13755. { },
  13756. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  13757. .fill_helper = bpf_fill_staggered_jge_imm,
  13758. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  13759. },
  13760. {
  13761. "Staggered jumps: JMP_JLT_K",
  13762. { },
  13763. INTERNAL | FLAG_NO_DATA,
  13764. { },
  13765. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  13766. .fill_helper = bpf_fill_staggered_jlt_imm,
  13767. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  13768. },
  13769. {
  13770. "Staggered jumps: JMP_JLE_K",
  13771. { },
  13772. INTERNAL | FLAG_NO_DATA,
  13773. { },
  13774. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  13775. .fill_helper = bpf_fill_staggered_jle_imm,
  13776. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  13777. },
  13778. {
  13779. "Staggered jumps: JMP_JSGT_K",
  13780. { },
  13781. INTERNAL | FLAG_NO_DATA,
  13782. { },
  13783. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  13784. .fill_helper = bpf_fill_staggered_jsgt_imm,
  13785. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  13786. },
  13787. {
  13788. "Staggered jumps: JMP_JSGE_K",
  13789. { },
  13790. INTERNAL | FLAG_NO_DATA,
  13791. { },
  13792. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  13793. .fill_helper = bpf_fill_staggered_jsge_imm,
  13794. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  13795. },
  13796. {
  13797. "Staggered jumps: JMP_JSLT_K",
  13798. { },
  13799. INTERNAL | FLAG_NO_DATA,
  13800. { },
  13801. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  13802. .fill_helper = bpf_fill_staggered_jslt_imm,
  13803. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  13804. },
  13805. {
  13806. "Staggered jumps: JMP_JSLE_K",
  13807. { },
  13808. INTERNAL | FLAG_NO_DATA,
  13809. { },
  13810. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  13811. .fill_helper = bpf_fill_staggered_jsle_imm,
  13812. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  13813. },
  13814. /* Staggered jump sequences, register */
  13815. {
  13816. "Staggered jumps: JMP_JEQ_X",
  13817. { },
  13818. INTERNAL | FLAG_NO_DATA,
  13819. { },
  13820. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  13821. .fill_helper = bpf_fill_staggered_jeq_reg,
  13822. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  13823. },
  13824. {
  13825. "Staggered jumps: JMP_JNE_X",
  13826. { },
  13827. INTERNAL | FLAG_NO_DATA,
  13828. { },
  13829. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  13830. .fill_helper = bpf_fill_staggered_jne_reg,
  13831. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  13832. },
  13833. {
  13834. "Staggered jumps: JMP_JSET_X",
  13835. { },
  13836. INTERNAL | FLAG_NO_DATA,
  13837. { },
  13838. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  13839. .fill_helper = bpf_fill_staggered_jset_reg,
  13840. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  13841. },
  13842. {
  13843. "Staggered jumps: JMP_JGT_X",
  13844. { },
  13845. INTERNAL | FLAG_NO_DATA,
  13846. { },
  13847. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  13848. .fill_helper = bpf_fill_staggered_jgt_reg,
  13849. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  13850. },
  13851. {
  13852. "Staggered jumps: JMP_JGE_X",
  13853. { },
  13854. INTERNAL | FLAG_NO_DATA,
  13855. { },
  13856. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  13857. .fill_helper = bpf_fill_staggered_jge_reg,
  13858. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  13859. },
  13860. {
  13861. "Staggered jumps: JMP_JLT_X",
  13862. { },
  13863. INTERNAL | FLAG_NO_DATA,
  13864. { },
  13865. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  13866. .fill_helper = bpf_fill_staggered_jlt_reg,
  13867. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  13868. },
  13869. {
  13870. "Staggered jumps: JMP_JLE_X",
  13871. { },
  13872. INTERNAL | FLAG_NO_DATA,
  13873. { },
  13874. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  13875. .fill_helper = bpf_fill_staggered_jle_reg,
  13876. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  13877. },
  13878. {
  13879. "Staggered jumps: JMP_JSGT_X",
  13880. { },
  13881. INTERNAL | FLAG_NO_DATA,
  13882. { },
  13883. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  13884. .fill_helper = bpf_fill_staggered_jsgt_reg,
  13885. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  13886. },
  13887. {
  13888. "Staggered jumps: JMP_JSGE_X",
  13889. { },
  13890. INTERNAL | FLAG_NO_DATA,
  13891. { },
  13892. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  13893. .fill_helper = bpf_fill_staggered_jsge_reg,
  13894. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  13895. },
  13896. {
  13897. "Staggered jumps: JMP_JSLT_X",
  13898. { },
  13899. INTERNAL | FLAG_NO_DATA,
  13900. { },
  13901. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  13902. .fill_helper = bpf_fill_staggered_jslt_reg,
  13903. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  13904. },
  13905. {
  13906. "Staggered jumps: JMP_JSLE_X",
  13907. { },
  13908. INTERNAL | FLAG_NO_DATA,
  13909. { },
  13910. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  13911. .fill_helper = bpf_fill_staggered_jsle_reg,
  13912. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  13913. },
  13914. /* Staggered jump sequences, JMP32 immediate */
  13915. {
  13916. "Staggered jumps: JMP32_JEQ_K",
  13917. { },
  13918. INTERNAL | FLAG_NO_DATA,
  13919. { },
  13920. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  13921. .fill_helper = bpf_fill_staggered_jeq32_imm,
  13922. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  13923. },
  13924. {
  13925. "Staggered jumps: JMP32_JNE_K",
  13926. { },
  13927. INTERNAL | FLAG_NO_DATA,
  13928. { },
  13929. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  13930. .fill_helper = bpf_fill_staggered_jne32_imm,
  13931. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  13932. },
  13933. {
  13934. "Staggered jumps: JMP32_JSET_K",
  13935. { },
  13936. INTERNAL | FLAG_NO_DATA,
  13937. { },
  13938. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  13939. .fill_helper = bpf_fill_staggered_jset32_imm,
  13940. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  13941. },
  13942. {
  13943. "Staggered jumps: JMP32_JGT_K",
  13944. { },
  13945. INTERNAL | FLAG_NO_DATA,
  13946. { },
  13947. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  13948. .fill_helper = bpf_fill_staggered_jgt32_imm,
  13949. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  13950. },
  13951. {
  13952. "Staggered jumps: JMP32_JGE_K",
  13953. { },
  13954. INTERNAL | FLAG_NO_DATA,
  13955. { },
  13956. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  13957. .fill_helper = bpf_fill_staggered_jge32_imm,
  13958. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  13959. },
  13960. {
  13961. "Staggered jumps: JMP32_JLT_K",
  13962. { },
  13963. INTERNAL | FLAG_NO_DATA,
  13964. { },
  13965. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  13966. .fill_helper = bpf_fill_staggered_jlt32_imm,
  13967. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  13968. },
  13969. {
  13970. "Staggered jumps: JMP32_JLE_K",
  13971. { },
  13972. INTERNAL | FLAG_NO_DATA,
  13973. { },
  13974. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  13975. .fill_helper = bpf_fill_staggered_jle32_imm,
  13976. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  13977. },
  13978. {
  13979. "Staggered jumps: JMP32_JSGT_K",
  13980. { },
  13981. INTERNAL | FLAG_NO_DATA,
  13982. { },
  13983. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  13984. .fill_helper = bpf_fill_staggered_jsgt32_imm,
  13985. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  13986. },
  13987. {
  13988. "Staggered jumps: JMP32_JSGE_K",
  13989. { },
  13990. INTERNAL | FLAG_NO_DATA,
  13991. { },
  13992. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  13993. .fill_helper = bpf_fill_staggered_jsge32_imm,
  13994. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  13995. },
  13996. {
  13997. "Staggered jumps: JMP32_JSLT_K",
  13998. { },
  13999. INTERNAL | FLAG_NO_DATA,
  14000. { },
  14001. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  14002. .fill_helper = bpf_fill_staggered_jslt32_imm,
  14003. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  14004. },
  14005. {
  14006. "Staggered jumps: JMP32_JSLE_K",
  14007. { },
  14008. INTERNAL | FLAG_NO_DATA,
  14009. { },
  14010. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  14011. .fill_helper = bpf_fill_staggered_jsle32_imm,
  14012. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  14013. },
  14014. /* Staggered jump sequences, JMP32 register */
  14015. {
  14016. "Staggered jumps: JMP32_JEQ_X",
  14017. { },
  14018. INTERNAL | FLAG_NO_DATA,
  14019. { },
  14020. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  14021. .fill_helper = bpf_fill_staggered_jeq32_reg,
  14022. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  14023. },
  14024. {
  14025. "Staggered jumps: JMP32_JNE_X",
  14026. { },
  14027. INTERNAL | FLAG_NO_DATA,
  14028. { },
  14029. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  14030. .fill_helper = bpf_fill_staggered_jne32_reg,
  14031. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  14032. },
  14033. {
  14034. "Staggered jumps: JMP32_JSET_X",
  14035. { },
  14036. INTERNAL | FLAG_NO_DATA,
  14037. { },
  14038. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  14039. .fill_helper = bpf_fill_staggered_jset32_reg,
  14040. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  14041. },
  14042. {
  14043. "Staggered jumps: JMP32_JGT_X",
  14044. { },
  14045. INTERNAL | FLAG_NO_DATA,
  14046. { },
  14047. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  14048. .fill_helper = bpf_fill_staggered_jgt32_reg,
  14049. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  14050. },
  14051. {
  14052. "Staggered jumps: JMP32_JGE_X",
  14053. { },
  14054. INTERNAL | FLAG_NO_DATA,
  14055. { },
  14056. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  14057. .fill_helper = bpf_fill_staggered_jge32_reg,
  14058. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  14059. },
  14060. {
  14061. "Staggered jumps: JMP32_JLT_X",
  14062. { },
  14063. INTERNAL | FLAG_NO_DATA,
  14064. { },
  14065. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  14066. .fill_helper = bpf_fill_staggered_jlt32_reg,
  14067. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  14068. },
  14069. {
  14070. "Staggered jumps: JMP32_JLE_X",
  14071. { },
  14072. INTERNAL | FLAG_NO_DATA,
  14073. { },
  14074. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  14075. .fill_helper = bpf_fill_staggered_jle32_reg,
  14076. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  14077. },
  14078. {
  14079. "Staggered jumps: JMP32_JSGT_X",
  14080. { },
  14081. INTERNAL | FLAG_NO_DATA,
  14082. { },
  14083. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  14084. .fill_helper = bpf_fill_staggered_jsgt32_reg,
  14085. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  14086. },
  14087. {
  14088. "Staggered jumps: JMP32_JSGE_X",
  14089. { },
  14090. INTERNAL | FLAG_NO_DATA,
  14091. { },
  14092. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  14093. .fill_helper = bpf_fill_staggered_jsge32_reg,
  14094. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  14095. },
  14096. {
  14097. "Staggered jumps: JMP32_JSLT_X",
  14098. { },
  14099. INTERNAL | FLAG_NO_DATA,
  14100. { },
  14101. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  14102. .fill_helper = bpf_fill_staggered_jslt32_reg,
  14103. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  14104. },
  14105. {
  14106. "Staggered jumps: JMP32_JSLE_X",
  14107. { },
  14108. INTERNAL | FLAG_NO_DATA,
  14109. { },
  14110. { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
  14111. .fill_helper = bpf_fill_staggered_jsle32_reg,
  14112. .nr_testruns = NR_STAGGERED_JMP_RUNS,
  14113. },
  14114. };
  14115. static struct net_device dev;
  14116. static struct sk_buff *populate_skb(char *buf, int size)
  14117. {
  14118. struct sk_buff *skb;
  14119. if (size >= MAX_DATA)
  14120. return NULL;
  14121. skb = alloc_skb(MAX_DATA, GFP_KERNEL);
  14122. if (!skb)
  14123. return NULL;
  14124. __skb_put_data(skb, buf, size);
  14125. /* Initialize a fake skb with test pattern. */
  14126. skb_reset_mac_header(skb);
  14127. skb->protocol = htons(ETH_P_IP);
  14128. skb->pkt_type = SKB_TYPE;
  14129. skb->mark = SKB_MARK;
  14130. skb->hash = SKB_HASH;
  14131. skb->queue_mapping = SKB_QUEUE_MAP;
  14132. skb->vlan_tci = SKB_VLAN_TCI;
  14133. skb->vlan_proto = htons(ETH_P_IP);
  14134. dev_net_set(&dev, &init_net);
  14135. skb->dev = &dev;
  14136. skb->dev->ifindex = SKB_DEV_IFINDEX;
  14137. skb->dev->type = SKB_DEV_TYPE;
  14138. skb_set_network_header(skb, min(size, ETH_HLEN));
  14139. return skb;
  14140. }
  14141. static void *generate_test_data(struct bpf_test *test, int sub)
  14142. {
  14143. struct sk_buff *skb;
  14144. struct page *page;
  14145. if (test->aux & FLAG_NO_DATA)
  14146. return NULL;
  14147. if (test->aux & FLAG_LARGE_MEM)
  14148. return kmalloc(test->test[sub].data_size, GFP_KERNEL);
  14149. /* Test case expects an skb, so populate one. Various
  14150. * subtests generate skbs of different sizes based on
  14151. * the same data.
  14152. */
  14153. skb = populate_skb(test->data, test->test[sub].data_size);
  14154. if (!skb)
  14155. return NULL;
  14156. if (test->aux & FLAG_SKB_FRAG) {
  14157. /*
  14158. * when the test requires a fragmented skb, add a
  14159. * single fragment to the skb, filled with
  14160. * test->frag_data.
  14161. */
  14162. page = alloc_page(GFP_KERNEL);
  14163. if (!page)
  14164. goto err_kfree_skb;
  14165. memcpy(page_address(page), test->frag_data, MAX_DATA);
  14166. skb_add_rx_frag(skb, 0, page, 0, MAX_DATA, MAX_DATA);
  14167. }
  14168. return skb;
  14169. err_kfree_skb:
  14170. kfree_skb(skb);
  14171. return NULL;
  14172. }
  14173. static void release_test_data(const struct bpf_test *test, void *data)
  14174. {
  14175. if (test->aux & FLAG_NO_DATA)
  14176. return;
  14177. if (test->aux & FLAG_LARGE_MEM)
  14178. kfree(data);
  14179. else
  14180. kfree_skb(data);
  14181. }
  14182. static int filter_length(int which)
  14183. {
  14184. struct sock_filter *fp;
  14185. int len;
  14186. if (tests[which].fill_helper)
  14187. return tests[which].u.ptr.len;
  14188. fp = tests[which].u.insns;
  14189. for (len = MAX_INSNS - 1; len > 0; --len)
  14190. if (fp[len].code != 0 || fp[len].k != 0)
  14191. break;
  14192. return len + 1;
  14193. }
  14194. static void *filter_pointer(int which)
  14195. {
  14196. if (tests[which].fill_helper)
  14197. return tests[which].u.ptr.insns;
  14198. else
  14199. return tests[which].u.insns;
  14200. }
  14201. static struct bpf_prog *generate_filter(int which, int *err)
  14202. {
  14203. __u8 test_type = tests[which].aux & TEST_TYPE_MASK;
  14204. unsigned int flen = filter_length(which);
  14205. void *fptr = filter_pointer(which);
  14206. struct sock_fprog_kern fprog;
  14207. struct bpf_prog *fp;
  14208. switch (test_type) {
  14209. case CLASSIC:
  14210. fprog.filter = fptr;
  14211. fprog.len = flen;
  14212. *err = bpf_prog_create(&fp, &fprog);
  14213. if (tests[which].aux & FLAG_EXPECTED_FAIL) {
  14214. if (*err == tests[which].expected_errcode) {
  14215. pr_cont("PASS\n");
  14216. /* Verifier rejected filter as expected. */
  14217. *err = 0;
  14218. return NULL;
  14219. } else {
  14220. pr_cont("UNEXPECTED_PASS\n");
  14221. /* Verifier didn't reject the test that's
  14222. * bad enough, just return!
  14223. */
  14224. *err = -EINVAL;
  14225. return NULL;
  14226. }
  14227. }
  14228. if (*err) {
  14229. pr_cont("FAIL to prog_create err=%d len=%d\n",
  14230. *err, fprog.len);
  14231. return NULL;
  14232. }
  14233. break;
  14234. case INTERNAL:
  14235. fp = bpf_prog_alloc(bpf_prog_size(flen), 0);
  14236. if (fp == NULL) {
  14237. pr_cont("UNEXPECTED_FAIL no memory left\n");
  14238. *err = -ENOMEM;
  14239. return NULL;
  14240. }
  14241. fp->len = flen;
  14242. /* Type doesn't really matter here as long as it's not unspec. */
  14243. fp->type = BPF_PROG_TYPE_SOCKET_FILTER;
  14244. memcpy(fp->insnsi, fptr, fp->len * sizeof(struct bpf_insn));
  14245. fp->aux->stack_depth = tests[which].stack_depth;
  14246. fp->aux->verifier_zext = !!(tests[which].aux &
  14247. FLAG_VERIFIER_ZEXT);
  14248. /* We cannot error here as we don't need type compatibility
  14249. * checks.
  14250. */
  14251. fp = bpf_prog_select_runtime(fp, err);
  14252. if (*err) {
  14253. pr_cont("FAIL to select_runtime err=%d\n", *err);
  14254. return NULL;
  14255. }
  14256. break;
  14257. }
  14258. *err = 0;
  14259. return fp;
  14260. }
  14261. static void release_filter(struct bpf_prog *fp, int which)
  14262. {
  14263. __u8 test_type = tests[which].aux & TEST_TYPE_MASK;
  14264. switch (test_type) {
  14265. case CLASSIC:
  14266. bpf_prog_destroy(fp);
  14267. break;
  14268. case INTERNAL:
  14269. bpf_prog_free(fp);
  14270. break;
  14271. }
  14272. }
  14273. static int __run_one(const struct bpf_prog *fp, const void *data,
  14274. int runs, u64 *duration)
  14275. {
  14276. u64 start, finish;
  14277. int ret = 0, i;
  14278. migrate_disable();
  14279. start = ktime_get_ns();
  14280. for (i = 0; i < runs; i++)
  14281. ret = bpf_prog_run(fp, data);
  14282. finish = ktime_get_ns();
  14283. migrate_enable();
  14284. *duration = finish - start;
  14285. do_div(*duration, runs);
  14286. return ret;
  14287. }
  14288. static int run_one(const struct bpf_prog *fp, struct bpf_test *test)
  14289. {
  14290. int err_cnt = 0, i, runs = MAX_TESTRUNS;
  14291. if (test->nr_testruns)
  14292. runs = min(test->nr_testruns, MAX_TESTRUNS);
  14293. for (i = 0; i < MAX_SUBTESTS; i++) {
  14294. void *data;
  14295. u64 duration;
  14296. u32 ret;
  14297. /*
  14298. * NOTE: Several sub-tests may be present, in which case
  14299. * a zero {data_size, result} tuple indicates the end of
  14300. * the sub-test array. The first test is always run,
  14301. * even if both data_size and result happen to be zero.
  14302. */
  14303. if (i > 0 &&
  14304. test->test[i].data_size == 0 &&
  14305. test->test[i].result == 0)
  14306. break;
  14307. data = generate_test_data(test, i);
  14308. if (!data && !(test->aux & FLAG_NO_DATA)) {
  14309. pr_cont("data generation failed ");
  14310. err_cnt++;
  14311. break;
  14312. }
  14313. ret = __run_one(fp, data, runs, &duration);
  14314. release_test_data(test, data);
  14315. if (ret == test->test[i].result) {
  14316. pr_cont("%lld ", duration);
  14317. } else {
  14318. s32 res = test->test[i].result;
  14319. pr_cont("ret %d != %d (%#x != %#x)",
  14320. ret, res, ret, res);
  14321. err_cnt++;
  14322. }
  14323. }
  14324. return err_cnt;
  14325. }
  14326. static char test_name[64];
  14327. module_param_string(test_name, test_name, sizeof(test_name), 0);
  14328. static int test_id = -1;
  14329. module_param(test_id, int, 0);
  14330. static int test_range[2] = { 0, INT_MAX };
  14331. module_param_array(test_range, int, NULL, 0);
  14332. static bool exclude_test(int test_id)
  14333. {
  14334. return test_id < test_range[0] || test_id > test_range[1];
  14335. }
  14336. static __init struct sk_buff *build_test_skb(void)
  14337. {
  14338. u32 headroom = NET_SKB_PAD + NET_IP_ALIGN + ETH_HLEN;
  14339. struct sk_buff *skb[2];
  14340. struct page *page[2];
  14341. int i, data_size = 8;
  14342. for (i = 0; i < 2; i++) {
  14343. page[i] = alloc_page(GFP_KERNEL);
  14344. if (!page[i]) {
  14345. if (i == 0)
  14346. goto err_page0;
  14347. else
  14348. goto err_page1;
  14349. }
  14350. /* this will set skb[i]->head_frag */
  14351. skb[i] = dev_alloc_skb(headroom + data_size);
  14352. if (!skb[i]) {
  14353. if (i == 0)
  14354. goto err_skb0;
  14355. else
  14356. goto err_skb1;
  14357. }
  14358. skb_reserve(skb[i], headroom);
  14359. skb_put(skb[i], data_size);
  14360. skb[i]->protocol = htons(ETH_P_IP);
  14361. skb_reset_network_header(skb[i]);
  14362. skb_set_mac_header(skb[i], -ETH_HLEN);
  14363. skb_add_rx_frag(skb[i], 0, page[i], 0, 64, 64);
  14364. // skb_headlen(skb[i]): 8, skb[i]->head_frag = 1
  14365. }
  14366. /* setup shinfo */
  14367. skb_shinfo(skb[0])->gso_size = 1448;
  14368. skb_shinfo(skb[0])->gso_type = SKB_GSO_TCPV4;
  14369. skb_shinfo(skb[0])->gso_type |= SKB_GSO_DODGY;
  14370. skb_shinfo(skb[0])->gso_segs = 0;
  14371. skb_shinfo(skb[0])->frag_list = skb[1];
  14372. skb_shinfo(skb[0])->hwtstamps.hwtstamp = 1000;
  14373. /* adjust skb[0]'s len */
  14374. skb[0]->len += skb[1]->len;
  14375. skb[0]->data_len += skb[1]->data_len;
  14376. skb[0]->truesize += skb[1]->truesize;
  14377. return skb[0];
  14378. err_skb1:
  14379. __free_page(page[1]);
  14380. err_page1:
  14381. kfree_skb(skb[0]);
  14382. err_skb0:
  14383. __free_page(page[0]);
  14384. err_page0:
  14385. return NULL;
  14386. }
  14387. static __init struct sk_buff *build_test_skb_linear_no_head_frag(void)
  14388. {
  14389. unsigned int alloc_size = 2000;
  14390. unsigned int headroom = 102, doffset = 72, data_size = 1308;
  14391. struct sk_buff *skb[2];
  14392. int i;
  14393. /* skbs linked in a frag_list, both with linear data, with head_frag=0
  14394. * (data allocated by kmalloc), both have tcp data of 1308 bytes
  14395. * (total payload is 2616 bytes).
  14396. * Data offset is 72 bytes (40 ipv6 hdr, 32 tcp hdr). Some headroom.
  14397. */
  14398. for (i = 0; i < 2; i++) {
  14399. skb[i] = alloc_skb(alloc_size, GFP_KERNEL);
  14400. if (!skb[i]) {
  14401. if (i == 0)
  14402. goto err_skb0;
  14403. else
  14404. goto err_skb1;
  14405. }
  14406. skb[i]->protocol = htons(ETH_P_IPV6);
  14407. skb_reserve(skb[i], headroom);
  14408. skb_put(skb[i], doffset + data_size);
  14409. skb_reset_network_header(skb[i]);
  14410. if (i == 0)
  14411. skb_reset_mac_header(skb[i]);
  14412. else
  14413. skb_set_mac_header(skb[i], -ETH_HLEN);
  14414. __skb_pull(skb[i], doffset);
  14415. }
  14416. /* setup shinfo.
  14417. * mimic bpf_skb_proto_4_to_6, which resets gso_segs and assigns a
  14418. * reduced gso_size.
  14419. */
  14420. skb_shinfo(skb[0])->gso_size = 1288;
  14421. skb_shinfo(skb[0])->gso_type = SKB_GSO_TCPV6 | SKB_GSO_DODGY;
  14422. skb_shinfo(skb[0])->gso_segs = 0;
  14423. skb_shinfo(skb[0])->frag_list = skb[1];
  14424. /* adjust skb[0]'s len */
  14425. skb[0]->len += skb[1]->len;
  14426. skb[0]->data_len += skb[1]->len;
  14427. skb[0]->truesize += skb[1]->truesize;
  14428. return skb[0];
  14429. err_skb1:
  14430. kfree_skb(skb[0]);
  14431. err_skb0:
  14432. return NULL;
  14433. }
  14434. struct skb_segment_test {
  14435. const char *descr;
  14436. struct sk_buff *(*build_skb)(void);
  14437. netdev_features_t features;
  14438. };
  14439. static struct skb_segment_test skb_segment_tests[] __initconst = {
  14440. {
  14441. .descr = "gso_with_rx_frags",
  14442. .build_skb = build_test_skb,
  14443. .features = NETIF_F_SG | NETIF_F_GSO_PARTIAL | NETIF_F_IP_CSUM |
  14444. NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM
  14445. },
  14446. {
  14447. .descr = "gso_linear_no_head_frag",
  14448. .build_skb = build_test_skb_linear_no_head_frag,
  14449. .features = NETIF_F_SG | NETIF_F_FRAGLIST |
  14450. NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_GSO |
  14451. NETIF_F_GRO | NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM |
  14452. NETIF_F_HW_VLAN_STAG_TX
  14453. }
  14454. };
  14455. static __init int test_skb_segment_single(const struct skb_segment_test *test)
  14456. {
  14457. struct sk_buff *skb, *segs;
  14458. int ret = -1;
  14459. skb = test->build_skb();
  14460. if (!skb) {
  14461. pr_info("%s: failed to build_test_skb", __func__);
  14462. goto done;
  14463. }
  14464. segs = skb_segment(skb, test->features);
  14465. if (!IS_ERR(segs)) {
  14466. kfree_skb_list(segs);
  14467. ret = 0;
  14468. }
  14469. kfree_skb(skb);
  14470. done:
  14471. return ret;
  14472. }
  14473. static __init int test_skb_segment(void)
  14474. {
  14475. int i, err_cnt = 0, pass_cnt = 0;
  14476. for (i = 0; i < ARRAY_SIZE(skb_segment_tests); i++) {
  14477. const struct skb_segment_test *test = &skb_segment_tests[i];
  14478. cond_resched();
  14479. if (exclude_test(i))
  14480. continue;
  14481. pr_info("#%d %s ", i, test->descr);
  14482. if (test_skb_segment_single(test)) {
  14483. pr_cont("FAIL\n");
  14484. err_cnt++;
  14485. } else {
  14486. pr_cont("PASS\n");
  14487. pass_cnt++;
  14488. }
  14489. }
  14490. pr_info("%s: Summary: %d PASSED, %d FAILED\n", __func__,
  14491. pass_cnt, err_cnt);
  14492. return err_cnt ? -EINVAL : 0;
  14493. }
  14494. static __init int test_bpf(void)
  14495. {
  14496. int i, err_cnt = 0, pass_cnt = 0;
  14497. int jit_cnt = 0, run_cnt = 0;
  14498. for (i = 0; i < ARRAY_SIZE(tests); i++) {
  14499. struct bpf_prog *fp;
  14500. int err;
  14501. cond_resched();
  14502. if (exclude_test(i))
  14503. continue;
  14504. pr_info("#%d %s ", i, tests[i].descr);
  14505. if (tests[i].fill_helper &&
  14506. tests[i].fill_helper(&tests[i]) < 0) {
  14507. pr_cont("FAIL to prog_fill\n");
  14508. continue;
  14509. }
  14510. fp = generate_filter(i, &err);
  14511. if (tests[i].fill_helper) {
  14512. kfree(tests[i].u.ptr.insns);
  14513. tests[i].u.ptr.insns = NULL;
  14514. }
  14515. if (fp == NULL) {
  14516. if (err == 0) {
  14517. pass_cnt++;
  14518. continue;
  14519. }
  14520. err_cnt++;
  14521. continue;
  14522. }
  14523. pr_cont("jited:%u ", fp->jited);
  14524. run_cnt++;
  14525. if (fp->jited)
  14526. jit_cnt++;
  14527. err = run_one(fp, &tests[i]);
  14528. release_filter(fp, i);
  14529. if (err) {
  14530. pr_cont("FAIL (%d times)\n", err);
  14531. err_cnt++;
  14532. } else {
  14533. pr_cont("PASS\n");
  14534. pass_cnt++;
  14535. }
  14536. }
  14537. pr_info("Summary: %d PASSED, %d FAILED, [%d/%d JIT'ed]\n",
  14538. pass_cnt, err_cnt, jit_cnt, run_cnt);
  14539. return err_cnt ? -EINVAL : 0;
  14540. }
  14541. struct tail_call_test {
  14542. const char *descr;
  14543. struct bpf_insn insns[MAX_INSNS];
  14544. int flags;
  14545. int result;
  14546. int stack_depth;
  14547. bool has_tail_call;
  14548. };
  14549. /* Flags that can be passed to tail call test cases */
  14550. #define FLAG_NEED_STATE BIT(0)
  14551. #define FLAG_RESULT_IN_STATE BIT(1)
  14552. /*
  14553. * Magic marker used in test snippets for tail calls below.
  14554. * BPF_LD/MOV to R2 and R2 with this immediate value is replaced
  14555. * with the proper values by the test runner.
  14556. */
  14557. #define TAIL_CALL_MARKER 0x7a11ca11
  14558. /* Special offset to indicate a NULL call target */
  14559. #define TAIL_CALL_NULL 0x7fff
  14560. /* Special offset to indicate an out-of-range index */
  14561. #define TAIL_CALL_INVALID 0x7ffe
  14562. #define TAIL_CALL(offset) \
  14563. BPF_LD_IMM64(R2, TAIL_CALL_MARKER), \
  14564. BPF_RAW_INSN(BPF_ALU | BPF_MOV | BPF_K, R3, 0, \
  14565. offset, TAIL_CALL_MARKER), \
  14566. BPF_JMP_IMM(BPF_TAIL_CALL, 0, 0, 0)
  14567. /*
  14568. * A test function to be called from a BPF program, clobbering a lot of
  14569. * CPU registers in the process. A JITed BPF program calling this function
  14570. * must save and restore any caller-saved registers it uses for internal
  14571. * state, for example the current tail call count.
  14572. */
  14573. BPF_CALL_1(bpf_test_func, u64, arg)
  14574. {
  14575. char buf[64];
  14576. long a = 0;
  14577. long b = 1;
  14578. long c = 2;
  14579. long d = 3;
  14580. long e = 4;
  14581. long f = 5;
  14582. long g = 6;
  14583. long h = 7;
  14584. return snprintf(buf, sizeof(buf),
  14585. "%ld %lu %lx %ld %lu %lx %ld %lu %x",
  14586. a, b, c, d, e, f, g, h, (int)arg);
  14587. }
  14588. #define BPF_FUNC_test_func __BPF_FUNC_MAX_ID
  14589. /*
  14590. * Tail call tests. Each test case may call any other test in the table,
  14591. * including itself, specified as a relative index offset from the calling
  14592. * test. The index TAIL_CALL_NULL can be used to specify a NULL target
  14593. * function to test the JIT error path. Similarly, the index TAIL_CALL_INVALID
  14594. * results in a target index that is out of range.
  14595. */
  14596. static struct tail_call_test tail_call_tests[] = {
  14597. {
  14598. "Tail call leaf",
  14599. .insns = {
  14600. BPF_ALU64_REG(BPF_MOV, R0, R1),
  14601. BPF_ALU64_IMM(BPF_ADD, R0, 1),
  14602. BPF_EXIT_INSN(),
  14603. },
  14604. .result = 1,
  14605. },
  14606. {
  14607. "Tail call 2",
  14608. .insns = {
  14609. BPF_ALU64_IMM(BPF_ADD, R1, 2),
  14610. TAIL_CALL(-1),
  14611. BPF_ALU64_IMM(BPF_MOV, R0, -1),
  14612. BPF_EXIT_INSN(),
  14613. },
  14614. .result = 3,
  14615. .has_tail_call = true,
  14616. },
  14617. {
  14618. "Tail call 3",
  14619. .insns = {
  14620. BPF_ALU64_IMM(BPF_ADD, R1, 3),
  14621. TAIL_CALL(-1),
  14622. BPF_ALU64_IMM(BPF_MOV, R0, -1),
  14623. BPF_EXIT_INSN(),
  14624. },
  14625. .result = 6,
  14626. .has_tail_call = true,
  14627. },
  14628. {
  14629. "Tail call 4",
  14630. .insns = {
  14631. BPF_ALU64_IMM(BPF_ADD, R1, 4),
  14632. TAIL_CALL(-1),
  14633. BPF_ALU64_IMM(BPF_MOV, R0, -1),
  14634. BPF_EXIT_INSN(),
  14635. },
  14636. .result = 10,
  14637. .has_tail_call = true,
  14638. },
  14639. {
  14640. "Tail call load/store leaf",
  14641. .insns = {
  14642. BPF_ALU64_IMM(BPF_MOV, R1, 1),
  14643. BPF_ALU64_IMM(BPF_MOV, R2, 2),
  14644. BPF_ALU64_REG(BPF_MOV, R3, BPF_REG_FP),
  14645. BPF_STX_MEM(BPF_DW, R3, R1, -8),
  14646. BPF_STX_MEM(BPF_DW, R3, R2, -16),
  14647. BPF_LDX_MEM(BPF_DW, R0, BPF_REG_FP, -8),
  14648. BPF_JMP_REG(BPF_JNE, R0, R1, 3),
  14649. BPF_LDX_MEM(BPF_DW, R0, BPF_REG_FP, -16),
  14650. BPF_JMP_REG(BPF_JNE, R0, R2, 1),
  14651. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  14652. BPF_EXIT_INSN(),
  14653. },
  14654. .result = 0,
  14655. .stack_depth = 32,
  14656. },
  14657. {
  14658. "Tail call load/store",
  14659. .insns = {
  14660. BPF_ALU64_IMM(BPF_MOV, R0, 3),
  14661. BPF_STX_MEM(BPF_DW, BPF_REG_FP, R0, -8),
  14662. TAIL_CALL(-1),
  14663. BPF_ALU64_IMM(BPF_MOV, R0, -1),
  14664. BPF_EXIT_INSN(),
  14665. },
  14666. .result = 0,
  14667. .stack_depth = 16,
  14668. .has_tail_call = true,
  14669. },
  14670. {
  14671. "Tail call error path, max count reached",
  14672. .insns = {
  14673. BPF_LDX_MEM(BPF_W, R2, R1, 0),
  14674. BPF_ALU64_IMM(BPF_ADD, R2, 1),
  14675. BPF_STX_MEM(BPF_W, R1, R2, 0),
  14676. TAIL_CALL(0),
  14677. BPF_EXIT_INSN(),
  14678. },
  14679. .flags = FLAG_NEED_STATE | FLAG_RESULT_IN_STATE,
  14680. .result = (MAX_TAIL_CALL_CNT + 1) * MAX_TESTRUNS,
  14681. .has_tail_call = true,
  14682. },
  14683. {
  14684. "Tail call count preserved across function calls",
  14685. .insns = {
  14686. BPF_LDX_MEM(BPF_W, R2, R1, 0),
  14687. BPF_ALU64_IMM(BPF_ADD, R2, 1),
  14688. BPF_STX_MEM(BPF_W, R1, R2, 0),
  14689. BPF_STX_MEM(BPF_DW, R10, R1, -8),
  14690. BPF_CALL_REL(BPF_FUNC_get_numa_node_id),
  14691. BPF_CALL_REL(BPF_FUNC_ktime_get_ns),
  14692. BPF_CALL_REL(BPF_FUNC_ktime_get_boot_ns),
  14693. BPF_CALL_REL(BPF_FUNC_ktime_get_coarse_ns),
  14694. BPF_CALL_REL(BPF_FUNC_jiffies64),
  14695. BPF_CALL_REL(BPF_FUNC_test_func),
  14696. BPF_LDX_MEM(BPF_DW, R1, R10, -8),
  14697. BPF_ALU32_REG(BPF_MOV, R0, R1),
  14698. TAIL_CALL(0),
  14699. BPF_EXIT_INSN(),
  14700. },
  14701. .stack_depth = 8,
  14702. .flags = FLAG_NEED_STATE | FLAG_RESULT_IN_STATE,
  14703. .result = (MAX_TAIL_CALL_CNT + 1) * MAX_TESTRUNS,
  14704. .has_tail_call = true,
  14705. },
  14706. {
  14707. "Tail call error path, NULL target",
  14708. .insns = {
  14709. BPF_LDX_MEM(BPF_W, R2, R1, 0),
  14710. BPF_ALU64_IMM(BPF_ADD, R2, 1),
  14711. BPF_STX_MEM(BPF_W, R1, R2, 0),
  14712. TAIL_CALL(TAIL_CALL_NULL),
  14713. BPF_EXIT_INSN(),
  14714. },
  14715. .flags = FLAG_NEED_STATE | FLAG_RESULT_IN_STATE,
  14716. .result = MAX_TESTRUNS,
  14717. .has_tail_call = true,
  14718. },
  14719. {
  14720. "Tail call error path, index out of range",
  14721. .insns = {
  14722. BPF_LDX_MEM(BPF_W, R2, R1, 0),
  14723. BPF_ALU64_IMM(BPF_ADD, R2, 1),
  14724. BPF_STX_MEM(BPF_W, R1, R2, 0),
  14725. TAIL_CALL(TAIL_CALL_INVALID),
  14726. BPF_EXIT_INSN(),
  14727. },
  14728. .flags = FLAG_NEED_STATE | FLAG_RESULT_IN_STATE,
  14729. .result = MAX_TESTRUNS,
  14730. .has_tail_call = true,
  14731. },
  14732. };
  14733. static void __init destroy_tail_call_tests(struct bpf_array *progs)
  14734. {
  14735. int i;
  14736. for (i = 0; i < ARRAY_SIZE(tail_call_tests); i++)
  14737. if (progs->ptrs[i])
  14738. bpf_prog_free(progs->ptrs[i]);
  14739. kfree(progs);
  14740. }
  14741. static __init int prepare_tail_call_tests(struct bpf_array **pprogs)
  14742. {
  14743. int ntests = ARRAY_SIZE(tail_call_tests);
  14744. struct bpf_array *progs;
  14745. int which, err;
  14746. /* Allocate the table of programs to be used for tail calls */
  14747. progs = kzalloc_flex(*progs, ptrs, ntests + 1);
  14748. if (!progs)
  14749. goto out_nomem;
  14750. /* Create all eBPF programs and populate the table */
  14751. for (which = 0; which < ntests; which++) {
  14752. struct tail_call_test *test = &tail_call_tests[which];
  14753. struct bpf_prog *fp;
  14754. int len, i;
  14755. /* Compute the number of program instructions */
  14756. for (len = 0; len < MAX_INSNS; len++) {
  14757. struct bpf_insn *insn = &test->insns[len];
  14758. if (len < MAX_INSNS - 1 &&
  14759. insn->code == (BPF_LD | BPF_DW | BPF_IMM))
  14760. len++;
  14761. if (insn->code == 0)
  14762. break;
  14763. }
  14764. /* Allocate and initialize the program */
  14765. fp = bpf_prog_alloc(bpf_prog_size(len), 0);
  14766. if (!fp)
  14767. goto out_nomem;
  14768. fp->len = len;
  14769. fp->type = BPF_PROG_TYPE_SOCKET_FILTER;
  14770. fp->aux->stack_depth = test->stack_depth;
  14771. fp->aux->tail_call_reachable = test->has_tail_call;
  14772. memcpy(fp->insnsi, test->insns, len * sizeof(struct bpf_insn));
  14773. /* Relocate runtime tail call offsets and addresses */
  14774. for (i = 0; i < len; i++) {
  14775. struct bpf_insn *insn = &fp->insnsi[i];
  14776. long addr = 0;
  14777. switch (insn->code) {
  14778. case BPF_LD | BPF_DW | BPF_IMM:
  14779. if (insn->imm != TAIL_CALL_MARKER)
  14780. break;
  14781. insn[0].imm = (u32)(long)progs;
  14782. insn[1].imm = ((u64)(long)progs) >> 32;
  14783. break;
  14784. case BPF_ALU | BPF_MOV | BPF_K:
  14785. if (insn->imm != TAIL_CALL_MARKER)
  14786. break;
  14787. if (insn->off == TAIL_CALL_NULL)
  14788. insn->imm = ntests;
  14789. else if (insn->off == TAIL_CALL_INVALID)
  14790. insn->imm = ntests + 1;
  14791. else
  14792. insn->imm = which + insn->off;
  14793. insn->off = 0;
  14794. break;
  14795. case BPF_JMP | BPF_CALL:
  14796. if (insn->src_reg != BPF_PSEUDO_CALL)
  14797. break;
  14798. switch (insn->imm) {
  14799. case BPF_FUNC_get_numa_node_id:
  14800. addr = (long)&numa_node_id;
  14801. break;
  14802. case BPF_FUNC_ktime_get_ns:
  14803. addr = (long)&ktime_get_ns;
  14804. break;
  14805. case BPF_FUNC_ktime_get_boot_ns:
  14806. addr = (long)&ktime_get_boot_fast_ns;
  14807. break;
  14808. case BPF_FUNC_ktime_get_coarse_ns:
  14809. addr = (long)&ktime_get_coarse_ns;
  14810. break;
  14811. case BPF_FUNC_jiffies64:
  14812. addr = (long)&get_jiffies_64;
  14813. break;
  14814. case BPF_FUNC_test_func:
  14815. addr = (long)&bpf_test_func;
  14816. break;
  14817. default:
  14818. err = -EFAULT;
  14819. goto out_err;
  14820. }
  14821. *insn = BPF_EMIT_CALL(addr);
  14822. if ((long)__bpf_call_base + insn->imm != addr)
  14823. *insn = BPF_JMP_A(0); /* Skip: NOP */
  14824. break;
  14825. }
  14826. }
  14827. fp = bpf_prog_select_runtime(fp, &err);
  14828. if (err)
  14829. goto out_err;
  14830. progs->ptrs[which] = fp;
  14831. }
  14832. /* The last entry contains a NULL program pointer */
  14833. progs->map.max_entries = ntests + 1;
  14834. *pprogs = progs;
  14835. return 0;
  14836. out_nomem:
  14837. err = -ENOMEM;
  14838. out_err:
  14839. if (progs)
  14840. destroy_tail_call_tests(progs);
  14841. return err;
  14842. }
  14843. static __init int test_tail_calls(struct bpf_array *progs)
  14844. {
  14845. int i, err_cnt = 0, pass_cnt = 0;
  14846. int jit_cnt = 0, run_cnt = 0;
  14847. for (i = 0; i < ARRAY_SIZE(tail_call_tests); i++) {
  14848. struct tail_call_test *test = &tail_call_tests[i];
  14849. struct bpf_prog *fp = progs->ptrs[i];
  14850. int *data = NULL;
  14851. int state = 0;
  14852. u64 duration;
  14853. int ret;
  14854. cond_resched();
  14855. if (exclude_test(i))
  14856. continue;
  14857. pr_info("#%d %s ", i, test->descr);
  14858. if (!fp) {
  14859. err_cnt++;
  14860. continue;
  14861. }
  14862. pr_cont("jited:%u ", fp->jited);
  14863. run_cnt++;
  14864. if (fp->jited)
  14865. jit_cnt++;
  14866. if (test->flags & FLAG_NEED_STATE)
  14867. data = &state;
  14868. ret = __run_one(fp, data, MAX_TESTRUNS, &duration);
  14869. if (test->flags & FLAG_RESULT_IN_STATE)
  14870. ret = state;
  14871. if (ret == test->result) {
  14872. pr_cont("%lld PASS", duration);
  14873. pass_cnt++;
  14874. } else {
  14875. pr_cont("ret %d != %d FAIL", ret, test->result);
  14876. err_cnt++;
  14877. }
  14878. }
  14879. pr_info("%s: Summary: %d PASSED, %d FAILED, [%d/%d JIT'ed]\n",
  14880. __func__, pass_cnt, err_cnt, jit_cnt, run_cnt);
  14881. return err_cnt ? -EINVAL : 0;
  14882. }
  14883. static char test_suite[32];
  14884. module_param_string(test_suite, test_suite, sizeof(test_suite), 0);
  14885. static __init int find_test_index(const char *test_name)
  14886. {
  14887. int i;
  14888. if (!strcmp(test_suite, "test_bpf")) {
  14889. for (i = 0; i < ARRAY_SIZE(tests); i++) {
  14890. if (!strcmp(tests[i].descr, test_name))
  14891. return i;
  14892. }
  14893. }
  14894. if (!strcmp(test_suite, "test_tail_calls")) {
  14895. for (i = 0; i < ARRAY_SIZE(tail_call_tests); i++) {
  14896. if (!strcmp(tail_call_tests[i].descr, test_name))
  14897. return i;
  14898. }
  14899. }
  14900. if (!strcmp(test_suite, "test_skb_segment")) {
  14901. for (i = 0; i < ARRAY_SIZE(skb_segment_tests); i++) {
  14902. if (!strcmp(skb_segment_tests[i].descr, test_name))
  14903. return i;
  14904. }
  14905. }
  14906. return -1;
  14907. }
  14908. static __init int prepare_test_range(void)
  14909. {
  14910. int valid_range;
  14911. if (!strcmp(test_suite, "test_bpf"))
  14912. valid_range = ARRAY_SIZE(tests);
  14913. else if (!strcmp(test_suite, "test_tail_calls"))
  14914. valid_range = ARRAY_SIZE(tail_call_tests);
  14915. else if (!strcmp(test_suite, "test_skb_segment"))
  14916. valid_range = ARRAY_SIZE(skb_segment_tests);
  14917. else
  14918. return 0;
  14919. if (test_id >= 0) {
  14920. /*
  14921. * if a test_id was specified, use test_range to
  14922. * cover only that test.
  14923. */
  14924. if (test_id >= valid_range) {
  14925. pr_err("test_bpf: invalid test_id specified for '%s' suite.\n",
  14926. test_suite);
  14927. return -EINVAL;
  14928. }
  14929. test_range[0] = test_id;
  14930. test_range[1] = test_id;
  14931. } else if (*test_name) {
  14932. /*
  14933. * if a test_name was specified, find it and setup
  14934. * test_range to cover only that test.
  14935. */
  14936. int idx = find_test_index(test_name);
  14937. if (idx < 0) {
  14938. pr_err("test_bpf: no test named '%s' found for '%s' suite.\n",
  14939. test_name, test_suite);
  14940. return -EINVAL;
  14941. }
  14942. test_range[0] = idx;
  14943. test_range[1] = idx;
  14944. } else if (test_range[0] != 0 || test_range[1] != INT_MAX) {
  14945. /*
  14946. * check that the supplied test_range is valid.
  14947. */
  14948. if (test_range[0] < 0 || test_range[1] >= valid_range) {
  14949. pr_err("test_bpf: test_range is out of bound for '%s' suite.\n",
  14950. test_suite);
  14951. return -EINVAL;
  14952. }
  14953. if (test_range[1] < test_range[0]) {
  14954. pr_err("test_bpf: test_range is ending before it starts.\n");
  14955. return -EINVAL;
  14956. }
  14957. }
  14958. return 0;
  14959. }
  14960. static int __init test_bpf_init(void)
  14961. {
  14962. struct bpf_array *progs = NULL;
  14963. int ret;
  14964. if (strlen(test_suite) &&
  14965. strcmp(test_suite, "test_bpf") &&
  14966. strcmp(test_suite, "test_tail_calls") &&
  14967. strcmp(test_suite, "test_skb_segment")) {
  14968. pr_err("test_bpf: invalid test_suite '%s' specified.\n", test_suite);
  14969. return -EINVAL;
  14970. }
  14971. /*
  14972. * if test_suite is not specified, but test_id, test_name or test_range
  14973. * is specified, set 'test_bpf' as the default test suite.
  14974. */
  14975. if (!strlen(test_suite) &&
  14976. (test_id != -1 || strlen(test_name) ||
  14977. (test_range[0] != 0 || test_range[1] != INT_MAX))) {
  14978. pr_info("test_bpf: set 'test_bpf' as the default test_suite.\n");
  14979. strscpy(test_suite, "test_bpf", sizeof(test_suite));
  14980. }
  14981. ret = prepare_test_range();
  14982. if (ret < 0)
  14983. return ret;
  14984. if (!strlen(test_suite) || !strcmp(test_suite, "test_bpf")) {
  14985. ret = test_bpf();
  14986. if (ret)
  14987. return ret;
  14988. }
  14989. if (!strlen(test_suite) || !strcmp(test_suite, "test_tail_calls")) {
  14990. ret = prepare_tail_call_tests(&progs);
  14991. if (ret)
  14992. return ret;
  14993. ret = test_tail_calls(progs);
  14994. destroy_tail_call_tests(progs);
  14995. if (ret)
  14996. return ret;
  14997. }
  14998. if (!strlen(test_suite) || !strcmp(test_suite, "test_skb_segment"))
  14999. return test_skb_segment();
  15000. return 0;
  15001. }
  15002. static void __exit test_bpf_exit(void)
  15003. {
  15004. }
  15005. module_init(test_bpf_init);
  15006. module_exit(test_bpf_exit);
  15007. MODULE_DESCRIPTION("Testsuite for BPF interpreter and BPF JIT compiler");
  15008. MODULE_LICENSE("GPL");