ubpf_jit_x86_64.rs 66 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081
  1. // SPDX-License-Identifier: (Apache-2.0 OR MIT)
  2. // Converted from the tests for uBPF <https://github.com/iovisor/ubpf>
  3. // Copyright 2015 Big Switch Networks, Inc
  4. // Copyright 2016 6WIND S.A. <quentin.monnet@6wind.com>
  5. // The tests contained in this file are extracted from the unit tests of uBPF software. Each test
  6. // in this file has a name in the form `test_jit_<name>`, and corresponds to the (human-readable)
  7. // code in `ubpf/tree/master/tests/<name>`, available at
  8. // <https://github.com/iovisor/ubpf/tree/master/tests> (hyphen had to be replaced with underscores
  9. // as Rust will not accept them in function names). It is strongly advised to refer to the uBPF
  10. // version to understand what these program do.
  11. //
  12. // Each program was assembled from the uBPF version with the assembler provided by uBPF itself, and
  13. // available at <https://github.com/iovisor/ubpf/tree/master/ubpf>.
  14. // The very few modifications that have been realized should be indicated.
  15. // These are unit tests for the eBPF JIT compiler.
  16. #![cfg(all(not(windows), feature = "std"))]
  17. extern crate rbpf;
  18. mod common;
  19. use common::{TCP_SACK_ASM, TCP_SACK_MATCH, TCP_SACK_NOMATCH};
  20. use rbpf::assembler::assemble;
  21. use rbpf::helpers;
  22. #[test]
  23. fn test_jit_add() {
  24. let prog = assemble(
  25. "
  26. mov32 r0, 0
  27. mov32 r1, 2
  28. add32 r0, 1
  29. add32 r0, r1
  30. exit
  31. ",
  32. )
  33. .unwrap();
  34. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  35. vm.jit_compile().unwrap();
  36. unsafe {
  37. assert_eq!(vm.execute_program_jit().unwrap(), 0x3);
  38. }
  39. }
  40. #[test]
  41. fn test_jit_alu64_arith() {
  42. let prog = assemble(
  43. "
  44. mov r0, 0
  45. mov r1, 1
  46. mov r2, 2
  47. mov r3, 3
  48. mov r4, 4
  49. mov r5, 5
  50. mov r6, 6
  51. mov r7, 7
  52. mov r8, 8
  53. mov r9, 9
  54. add r0, 23
  55. add r0, r7
  56. sub r0, 13
  57. sub r0, r1
  58. mul r0, 7
  59. mul r0, r3
  60. div r0, 2
  61. div r0, r4
  62. exit
  63. ",
  64. )
  65. .unwrap();
  66. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  67. vm.jit_compile().unwrap();
  68. unsafe {
  69. assert_eq!(vm.execute_program_jit().unwrap(), 0x2a);
  70. }
  71. }
  72. #[test]
  73. fn test_jit_alu64_bit() {
  74. let prog = assemble(
  75. "
  76. mov r0, 0
  77. mov r1, 1
  78. mov r2, 2
  79. mov r3, 3
  80. mov r4, 4
  81. mov r5, 5
  82. mov r6, 6
  83. mov r7, 7
  84. mov r8, 8
  85. or r0, r5
  86. or r0, 0xa0
  87. and r0, 0xa3
  88. mov r9, 0x91
  89. and r0, r9
  90. lsh r0, 32
  91. lsh r0, 22
  92. lsh r0, r8
  93. rsh r0, 32
  94. rsh r0, 19
  95. rsh r0, r7
  96. xor r0, 0x03
  97. xor r0, r2
  98. exit
  99. ",
  100. )
  101. .unwrap();
  102. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  103. vm.jit_compile().unwrap();
  104. unsafe {
  105. assert_eq!(vm.execute_program_jit().unwrap(), 0x11);
  106. }
  107. }
  108. #[test]
  109. fn test_jit_alu_arith() {
  110. let prog = assemble(
  111. "
  112. mov32 r0, 0
  113. mov32 r1, 1
  114. mov32 r2, 2
  115. mov32 r3, 3
  116. mov32 r4, 4
  117. mov32 r5, 5
  118. mov32 r6, 6
  119. mov32 r7, 7
  120. mov32 r8, 8
  121. mov32 r9, 9
  122. add32 r0, 23
  123. add32 r0, r7
  124. sub32 r0, 13
  125. sub32 r0, r1
  126. mul32 r0, 7
  127. mul32 r0, r3
  128. div32 r0, 2
  129. div32 r0, r4
  130. exit
  131. ",
  132. )
  133. .unwrap();
  134. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  135. vm.jit_compile().unwrap();
  136. unsafe {
  137. assert_eq!(vm.execute_program_jit().unwrap(), 0x2a);
  138. }
  139. }
  140. #[test]
  141. fn test_jit_alu_bit() {
  142. let prog = assemble(
  143. "
  144. mov32 r0, 0
  145. mov32 r1, 1
  146. mov32 r2, 2
  147. mov32 r3, 3
  148. mov32 r4, 4
  149. mov32 r5, 5
  150. mov32 r6, 6
  151. mov32 r7, 7
  152. mov32 r8, 8
  153. or32 r0, r5
  154. or32 r0, 0xa0
  155. and32 r0, 0xa3
  156. mov32 r9, 0x91
  157. and32 r0, r9
  158. lsh32 r0, 22
  159. lsh32 r0, r8
  160. rsh32 r0, 19
  161. rsh32 r0, r7
  162. xor32 r0, 0x03
  163. xor32 r0, r2
  164. exit
  165. ",
  166. )
  167. .unwrap();
  168. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  169. vm.jit_compile().unwrap();
  170. unsafe {
  171. assert_eq!(vm.execute_program_jit().unwrap(), 0x11);
  172. }
  173. }
  174. #[test]
  175. fn test_jit_arsh32_high_shift() {
  176. let prog = assemble(
  177. "
  178. mov r0, 8
  179. lddw r1, 0x100000001
  180. arsh32 r0, r1
  181. exit
  182. ",
  183. )
  184. .unwrap();
  185. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  186. vm.jit_compile().unwrap();
  187. unsafe {
  188. assert_eq!(vm.execute_program_jit().unwrap(), 0x4);
  189. }
  190. }
  191. #[test]
  192. fn test_jit_arsh() {
  193. let prog = assemble(
  194. "
  195. mov32 r0, 0xf8
  196. lsh32 r0, 28
  197. arsh32 r0, 16
  198. exit
  199. ",
  200. )
  201. .unwrap();
  202. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  203. vm.jit_compile().unwrap();
  204. unsafe {
  205. assert_eq!(vm.execute_program_jit().unwrap(), 0xffff8000);
  206. }
  207. }
  208. #[test]
  209. fn test_jit_arsh64() {
  210. let prog = assemble(
  211. "
  212. mov32 r0, 1
  213. lsh r0, 63
  214. arsh r0, 55
  215. mov32 r1, 5
  216. arsh r0, r1
  217. exit
  218. ",
  219. )
  220. .unwrap();
  221. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  222. vm.jit_compile().unwrap();
  223. unsafe {
  224. assert_eq!(vm.execute_program_jit().unwrap(), 0xfffffffffffffff8);
  225. }
  226. }
  227. #[test]
  228. fn test_jit_arsh_reg() {
  229. let prog = assemble(
  230. "
  231. mov32 r0, 0xf8
  232. mov32 r1, 16
  233. lsh32 r0, 28
  234. arsh32 r0, r1
  235. exit
  236. ",
  237. )
  238. .unwrap();
  239. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  240. vm.jit_compile().unwrap();
  241. unsafe {
  242. assert_eq!(vm.execute_program_jit().unwrap(), 0xffff8000);
  243. }
  244. }
  245. #[test]
  246. fn test_jit_be16() {
  247. let prog = assemble(
  248. "
  249. ldxh r0, [r1]
  250. be16 r0
  251. exit
  252. ",
  253. )
  254. .unwrap();
  255. let mem = &mut [0x11, 0x22];
  256. let mut vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  257. vm.jit_compile().unwrap();
  258. unsafe {
  259. assert_eq!(vm.execute_program_jit(mem).unwrap(), 0x1122);
  260. }
  261. }
  262. #[test]
  263. fn test_jit_be16_high() {
  264. let prog = assemble(
  265. "
  266. ldxdw r0, [r1]
  267. be16 r0
  268. exit
  269. ",
  270. )
  271. .unwrap();
  272. let mem = &mut [0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88];
  273. let mut vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  274. vm.jit_compile().unwrap();
  275. unsafe {
  276. assert_eq!(vm.execute_program_jit(mem).unwrap(), 0x1122);
  277. }
  278. }
  279. #[test]
  280. fn test_jit_be32() {
  281. let prog = assemble(
  282. "
  283. ldxw r0, [r1]
  284. be32 r0
  285. exit
  286. ",
  287. )
  288. .unwrap();
  289. let mem = &mut [0x11, 0x22, 0x33, 0x44];
  290. let mut vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  291. vm.jit_compile().unwrap();
  292. unsafe {
  293. assert_eq!(vm.execute_program_jit(mem).unwrap(), 0x11223344);
  294. }
  295. }
  296. #[test]
  297. fn test_jit_be32_high() {
  298. let prog = assemble(
  299. "
  300. ldxdw r0, [r1]
  301. be32 r0
  302. exit
  303. ",
  304. )
  305. .unwrap();
  306. let mem = &mut [0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88];
  307. let mut vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  308. vm.jit_compile().unwrap();
  309. unsafe {
  310. assert_eq!(vm.execute_program_jit(mem).unwrap(), 0x11223344);
  311. }
  312. }
  313. #[test]
  314. fn test_jit_be64() {
  315. let prog = assemble(
  316. "
  317. ldxdw r0, [r1]
  318. be64 r0
  319. exit
  320. ",
  321. )
  322. .unwrap();
  323. let mem = &mut [0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88];
  324. let mut vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  325. vm.jit_compile().unwrap();
  326. unsafe {
  327. assert_eq!(vm.execute_program_jit(mem).unwrap(), 0x1122334455667788);
  328. }
  329. }
  330. #[test]
  331. fn test_jit_call() {
  332. let prog = assemble(
  333. "
  334. mov r1, 1
  335. mov r2, 2
  336. mov r3, 3
  337. mov r4, 4
  338. mov r5, 5
  339. call 0
  340. exit
  341. ",
  342. )
  343. .unwrap();
  344. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  345. vm.register_helper(0, helpers::gather_bytes).unwrap();
  346. vm.jit_compile().unwrap();
  347. unsafe {
  348. assert_eq!(vm.execute_program_jit().unwrap(), 0x0102030405);
  349. }
  350. }
  351. #[test]
  352. fn test_jit_call_memfrob() {
  353. let prog = assemble(
  354. "
  355. mov r6, r1
  356. add r1, 2
  357. mov r2, 4
  358. call 1
  359. ldxdw r0, [r6]
  360. be64 r0
  361. exit
  362. ",
  363. )
  364. .unwrap();
  365. let mem = &mut [0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08];
  366. let mut vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  367. vm.register_helper(1, helpers::memfrob).unwrap();
  368. vm.jit_compile().unwrap();
  369. unsafe {
  370. assert_eq!(vm.execute_program_jit(mem).unwrap(), 0x102292e2f2c0708);
  371. }
  372. }
  373. // TODO: helpers::trash_registers needs asm!().
  374. // Try this again once asm!() is available in stable.
  375. //#[test]
  376. //fn test_jit_call_save() {
  377. // #[rustfmt::skip]
  378. // let prog = &[
  379. // 0xb7, 0x06, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
  380. // 0xb7, 0x07, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
  381. // 0xb7, 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
  382. // 0xb7, 0x09, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,
  383. // 0x85, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
  384. // 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  385. // 0x4f, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  386. // 0x4f, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  387. // 0x4f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  388. // 0x4f, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  389. // 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  390. // ];
  391. // let mut vm = rbpf::EbpfVmNoData::new(Some(prog)).unwrap();
  392. // vm.register_helper(2, helpers::trash_registers);
  393. // vm.jit_compile().unwrap();
  394. // unsafe { assert_eq!(vm.execute_program_jit().unwrap(), 0x4321); }
  395. //}
  396. #[test]
  397. fn test_jit_div32_high_divisor() {
  398. let prog = assemble(
  399. "
  400. mov r0, 12
  401. lddw r1, 0x100000004
  402. div32 r0, r1
  403. exit
  404. ",
  405. )
  406. .unwrap();
  407. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  408. vm.jit_compile().unwrap();
  409. unsafe {
  410. assert_eq!(vm.execute_program_jit().unwrap(), 0x3);
  411. }
  412. }
  413. #[test]
  414. fn test_jit_div32_imm() {
  415. let prog = assemble(
  416. "
  417. lddw r0, 0x10000000c
  418. div32 r0, 4
  419. exit
  420. ",
  421. )
  422. .unwrap();
  423. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  424. vm.jit_compile().unwrap();
  425. unsafe {
  426. assert_eq!(vm.execute_program_jit().unwrap(), 0x3);
  427. }
  428. }
  429. #[test]
  430. fn test_jit_div32_reg() {
  431. let prog = assemble(
  432. "
  433. lddw r0, 0x10000000c
  434. mov r1, 4
  435. div32 r0, r1
  436. exit
  437. ",
  438. )
  439. .unwrap();
  440. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  441. vm.jit_compile().unwrap();
  442. unsafe {
  443. assert_eq!(vm.execute_program_jit().unwrap(), 0x3);
  444. }
  445. }
  446. #[test]
  447. fn test_jit_div64_imm() {
  448. let prog = assemble(
  449. "
  450. mov r0, 0xc
  451. lsh r0, 32
  452. div r0, 4
  453. exit
  454. ",
  455. )
  456. .unwrap();
  457. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  458. vm.jit_compile().unwrap();
  459. unsafe {
  460. assert_eq!(vm.execute_program_jit().unwrap(), 0x300000000);
  461. }
  462. }
  463. #[test]
  464. fn test_jit_div64_reg() {
  465. let prog = assemble(
  466. "
  467. mov r0, 0xc
  468. lsh r0, 32
  469. mov r1, 4
  470. div r0, r1
  471. exit
  472. ",
  473. )
  474. .unwrap();
  475. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  476. vm.jit_compile().unwrap();
  477. unsafe {
  478. assert_eq!(vm.execute_program_jit().unwrap(), 0x300000000);
  479. }
  480. }
  481. // For some register numbers, we don't emit the same instructions for handling divisions by zero,
  482. // which means we don't use the same offset to skip these instructions when the divisor is not
  483. // zero. We've had a regression because of this before, make sure we test it.
  484. #[test]
  485. fn test_jit_div32_highreg() {
  486. let prog = assemble(
  487. "
  488. mov r0, 2
  489. mov r7, 4
  490. div32 r7, r0
  491. exit
  492. ",
  493. )
  494. .unwrap();
  495. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  496. vm.jit_compile().unwrap();
  497. unsafe {
  498. assert_eq!(vm.execute_program_jit().unwrap(), 0x2);
  499. }
  500. }
  501. #[test]
  502. fn test_jit_div64_highreg() {
  503. let prog = assemble(
  504. "
  505. mov r0, 2
  506. mov r7, 4
  507. div r7, r0
  508. exit
  509. ",
  510. )
  511. .unwrap();
  512. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  513. vm.jit_compile().unwrap();
  514. unsafe {
  515. assert_eq!(vm.execute_program_jit().unwrap(), 0x2);
  516. }
  517. }
  518. #[test]
  519. fn test_jit_early_exit() {
  520. let prog = assemble(
  521. "
  522. mov r0, 3
  523. exit
  524. mov r0, 4
  525. exit
  526. ",
  527. )
  528. .unwrap();
  529. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  530. vm.jit_compile().unwrap();
  531. unsafe {
  532. assert_eq!(vm.execute_program_jit().unwrap(), 0x3);
  533. }
  534. }
  535. // uBPF limits the number of user functions at 64. We don't.
  536. //#[test]
  537. //fn test_jit_err_call_bad_imm() {
  538. //}
  539. #[test]
  540. #[should_panic(expected = "[JIT] Error: unknown helper function (id: 0x3f)")]
  541. fn test_jit_err_call_unreg() {
  542. let prog = assemble(
  543. "
  544. mov r1, 1
  545. mov r2, 2
  546. mov r3, 3
  547. mov r4, 4
  548. mov r5, 5
  549. call 63
  550. exit
  551. ",
  552. )
  553. .unwrap();
  554. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  555. vm.jit_compile().unwrap();
  556. unsafe {
  557. vm.execute_program_jit().unwrap();
  558. }
  559. }
  560. #[test]
  561. fn test_jit_div64_by_zero_imm() {
  562. let prog = assemble(
  563. "
  564. mov32 r0, 1
  565. div r0, 0
  566. exit
  567. ",
  568. )
  569. .unwrap();
  570. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  571. vm.jit_compile().unwrap();
  572. unsafe {
  573. assert_eq!(vm.execute_program_jit().unwrap(), 0x0);
  574. }
  575. }
  576. #[test]
  577. fn test_jit_div_by_zero_imm() {
  578. let prog = assemble(
  579. "
  580. mov32 r0, 1
  581. div32 r0, 0
  582. exit
  583. ",
  584. )
  585. .unwrap();
  586. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  587. vm.jit_compile().unwrap();
  588. unsafe {
  589. assert_eq!(vm.execute_program_jit().unwrap(), 0x0);
  590. }
  591. }
  592. #[test]
  593. fn test_jit_mod64_by_zero_imm() {
  594. let prog = assemble(
  595. "
  596. mov32 r0, 1
  597. mod r0, 0
  598. exit
  599. ",
  600. )
  601. .unwrap();
  602. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  603. vm.jit_compile().unwrap();
  604. unsafe {
  605. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  606. }
  607. }
  608. #[test]
  609. fn test_jit_mod_by_zero_imm() {
  610. let prog = assemble(
  611. "
  612. mov32 r0, 1
  613. mod32 r0, 0
  614. exit
  615. ",
  616. )
  617. .unwrap();
  618. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  619. vm.jit_compile().unwrap();
  620. unsafe {
  621. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  622. }
  623. }
  624. #[test]
  625. fn test_jit_div64_by_zero_reg() {
  626. let prog = assemble(
  627. "
  628. mov32 r0, 1
  629. mov32 r1, 0
  630. div r0, r1
  631. exit
  632. ",
  633. )
  634. .unwrap();
  635. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  636. vm.jit_compile().unwrap();
  637. unsafe {
  638. assert_eq!(vm.execute_program_jit().unwrap(), 0x0);
  639. }
  640. }
  641. #[test]
  642. fn test_jit_div_by_zero_reg() {
  643. let prog = assemble(
  644. "
  645. mov32 r0, 1
  646. mov32 r1, 0
  647. div32 r0, r1
  648. exit
  649. ",
  650. )
  651. .unwrap();
  652. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  653. vm.jit_compile().unwrap();
  654. unsafe {
  655. assert_eq!(vm.execute_program_jit().unwrap(), 0x0);
  656. }
  657. }
  658. #[test]
  659. fn test_jit_mod64_by_zero_reg() {
  660. let prog = assemble(
  661. "
  662. mov32 r0, 1
  663. mov32 r1, 0
  664. mod r0, r1
  665. exit
  666. ",
  667. )
  668. .unwrap();
  669. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  670. vm.jit_compile().unwrap();
  671. unsafe {
  672. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  673. }
  674. }
  675. #[test]
  676. fn test_jit_mod_by_zero_reg() {
  677. let prog = assemble(
  678. "
  679. mov32 r0, 1
  680. mov32 r1, 0
  681. mod32 r0, r1
  682. exit
  683. ",
  684. )
  685. .unwrap();
  686. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  687. vm.jit_compile().unwrap();
  688. unsafe {
  689. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  690. }
  691. }
  692. // TODO SKIP: JIT disabled for this testcase (stack oob check not implemented)
  693. // #[test]
  694. // #[should_panic(expected = "Error: out of bounds memory store (insn #1)")]
  695. // fn test_jit_err_stack_out_of_bound() {
  696. // #[rustfmt::skip]
  697. // let prog = &[
  698. // 0x72, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  699. // 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  700. // ];
  701. // let mut vm = rbpf::EbpfVmNoData::new(Some(prog)).unwrap();
  702. // vm.jit_compile().unwrap();
  703. // unsafe { vm.execute_program_jit().unwrap(); }
  704. // }
  705. #[test]
  706. fn test_jit_exit() {
  707. let prog = assemble(
  708. "
  709. mov r0, 0
  710. exit
  711. ",
  712. )
  713. .unwrap();
  714. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  715. vm.jit_compile().unwrap();
  716. unsafe {
  717. assert_eq!(vm.execute_program_jit().unwrap(), 0x0);
  718. }
  719. }
  720. #[test]
  721. fn test_jit_ja() {
  722. let prog = assemble(
  723. "
  724. mov r0, 1
  725. ja +1
  726. mov r0, 2
  727. exit
  728. ",
  729. )
  730. .unwrap();
  731. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  732. vm.jit_compile().unwrap();
  733. unsafe {
  734. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  735. }
  736. }
  737. #[test]
  738. fn test_jit_jeq_imm() {
  739. let prog = assemble(
  740. "
  741. mov32 r0, 0
  742. mov32 r1, 0xa
  743. jeq r1, 0xb, +4
  744. mov32 r0, 1
  745. mov32 r1, 0xb
  746. jeq r1, 0xb, +1
  747. mov32 r0, 2
  748. exit
  749. ",
  750. )
  751. .unwrap();
  752. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  753. vm.jit_compile().unwrap();
  754. unsafe {
  755. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  756. }
  757. }
  758. #[test]
  759. fn test_jit_jeq_reg() {
  760. let prog = assemble(
  761. "
  762. mov32 r0, 0
  763. mov32 r1, 0xa
  764. mov32 r2, 0xb
  765. jeq r1, r2, +4
  766. mov32 r0, 1
  767. mov32 r1, 0xb
  768. jeq r1, r2, +1
  769. mov32 r0, 2
  770. exit
  771. ",
  772. )
  773. .unwrap();
  774. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  775. vm.jit_compile().unwrap();
  776. unsafe {
  777. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  778. }
  779. }
  780. #[test]
  781. fn test_jit_jge_imm() {
  782. let prog = assemble(
  783. "
  784. mov32 r0, 0
  785. mov32 r1, 0xa
  786. jge r1, 0xb, +4
  787. mov32 r0, 1
  788. mov32 r1, 0xc
  789. jge r1, 0xb, +1
  790. mov32 r0, 2
  791. exit
  792. ",
  793. )
  794. .unwrap();
  795. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  796. vm.jit_compile().unwrap();
  797. unsafe {
  798. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  799. }
  800. }
  801. #[test]
  802. fn test_jit_jle_imm() {
  803. let prog = assemble(
  804. "
  805. mov32 r0, 0
  806. mov32 r1, 5
  807. jle r1, 4, +1
  808. jle r1, 6, +1
  809. exit
  810. jle r1, 5, +1
  811. exit
  812. mov32 r0, 1
  813. exit
  814. ",
  815. )
  816. .unwrap();
  817. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  818. vm.jit_compile().unwrap();
  819. unsafe {
  820. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  821. }
  822. }
  823. #[test]
  824. fn test_jit_jle_reg() {
  825. let prog = assemble(
  826. "
  827. mov r0, 0
  828. mov r1, 5
  829. mov r2, 4
  830. mov r3, 6
  831. jle r1, r2, +2
  832. jle r1, r1, +1
  833. exit
  834. jle r1, r3, +1
  835. exit
  836. mov r0, 1
  837. exit
  838. ",
  839. )
  840. .unwrap();
  841. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  842. vm.jit_compile().unwrap();
  843. unsafe {
  844. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  845. }
  846. }
  847. #[test]
  848. fn test_jit_jgt_imm() {
  849. let prog = assemble(
  850. "
  851. mov32 r0, 0
  852. mov32 r1, 5
  853. jgt r1, 6, +2
  854. jgt r1, 5, +1
  855. jgt r1, 4, +1
  856. exit
  857. mov32 r0, 1
  858. exit
  859. ",
  860. )
  861. .unwrap();
  862. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  863. vm.jit_compile().unwrap();
  864. unsafe {
  865. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  866. }
  867. }
  868. #[test]
  869. fn test_jit_jgt_reg() {
  870. let prog = assemble(
  871. "
  872. mov r0, 0
  873. mov r1, 5
  874. mov r2, 6
  875. mov r3, 4
  876. jgt r1, r2, +2
  877. jgt r1, r1, +1
  878. jgt r1, r3, +1
  879. exit
  880. mov r0, 1
  881. exit
  882. ",
  883. )
  884. .unwrap();
  885. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  886. vm.jit_compile().unwrap();
  887. unsafe {
  888. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  889. }
  890. }
  891. #[test]
  892. fn test_jit_jlt_imm() {
  893. let prog = assemble(
  894. "
  895. mov32 r0, 0
  896. mov32 r1, 5
  897. jlt r1, 4, +2
  898. jlt r1, 5, +1
  899. jlt r1, 6, +1
  900. exit
  901. mov32 r0, 1
  902. exit
  903. ",
  904. )
  905. .unwrap();
  906. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  907. vm.jit_compile().unwrap();
  908. unsafe {
  909. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  910. }
  911. }
  912. #[test]
  913. fn test_jit_jlt_reg() {
  914. let prog = assemble(
  915. "
  916. mov r0, 0
  917. mov r1, 5
  918. mov r2, 4
  919. mov r3, 6
  920. jlt r1, r2, +2
  921. jlt r1, r1, +1
  922. jlt r1, r3, +1
  923. exit
  924. mov r0, 1
  925. exit
  926. ",
  927. )
  928. .unwrap();
  929. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  930. vm.jit_compile().unwrap();
  931. unsafe {
  932. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  933. }
  934. }
  935. #[test]
  936. fn test_jit_jit_bounce() {
  937. let prog = assemble(
  938. "
  939. mov r0, 1
  940. mov r6, r0
  941. mov r7, r6
  942. mov r8, r7
  943. mov r9, r8
  944. mov r0, r9
  945. exit
  946. ",
  947. )
  948. .unwrap();
  949. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  950. vm.jit_compile().unwrap();
  951. unsafe {
  952. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  953. }
  954. }
  955. #[test]
  956. fn test_jit_jne_reg() {
  957. let prog = assemble(
  958. "
  959. mov32 r0, 0
  960. mov32 r1, 0xb
  961. mov32 r2, 0xb
  962. jne r1, r2, +4
  963. mov32 r0, 1
  964. mov32 r1, 0xa
  965. jne r1, r2, +1
  966. mov32 r0, 2
  967. exit
  968. ",
  969. )
  970. .unwrap();
  971. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  972. vm.jit_compile().unwrap();
  973. unsafe {
  974. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  975. }
  976. }
  977. #[test]
  978. fn test_jit_jset_imm() {
  979. let prog = assemble(
  980. "
  981. mov32 r0, 0
  982. mov32 r1, 0x7
  983. jset r1, 0x8, +4
  984. mov32 r0, 1
  985. mov32 r1, 0x9
  986. jset r1, 0x8, +1
  987. mov32 r0, 2
  988. exit
  989. ",
  990. )
  991. .unwrap();
  992. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  993. vm.jit_compile().unwrap();
  994. unsafe {
  995. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  996. }
  997. }
  998. #[test]
  999. fn test_jit_jset_reg() {
  1000. let prog = assemble(
  1001. "
  1002. mov32 r0, 0
  1003. mov32 r1, 0x7
  1004. mov32 r2, 0x8
  1005. jset r1, r2, +4
  1006. mov32 r0, 1
  1007. mov32 r1, 0x9
  1008. jset r1, r2, +1
  1009. mov32 r0, 2
  1010. exit
  1011. ",
  1012. )
  1013. .unwrap();
  1014. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  1015. vm.jit_compile().unwrap();
  1016. unsafe {
  1017. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  1018. }
  1019. }
  1020. #[test]
  1021. fn test_jit_jsge_imm() {
  1022. let prog = assemble(
  1023. "
  1024. mov32 r0, 0
  1025. mov r1, -2
  1026. jsge r1, -1, +5
  1027. jsge r1, 0, +4
  1028. mov32 r0, 1
  1029. mov r1, -1
  1030. jsge r1, -1, +1
  1031. mov32 r0, 2
  1032. exit
  1033. ",
  1034. )
  1035. .unwrap();
  1036. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  1037. vm.jit_compile().unwrap();
  1038. unsafe {
  1039. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  1040. }
  1041. }
  1042. #[test]
  1043. fn test_jit_jsge_reg() {
  1044. let prog = assemble(
  1045. "
  1046. mov32 r0, 0
  1047. mov r1, -2
  1048. mov r2, -1
  1049. mov32 r3, 0
  1050. jsge r1, r2, +5
  1051. jsge r1, r3, +4
  1052. mov32 r0, 1
  1053. mov r1, r2
  1054. jsge r1, r2, +1
  1055. mov32 r0, 2
  1056. exit
  1057. ",
  1058. )
  1059. .unwrap();
  1060. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  1061. vm.jit_compile().unwrap();
  1062. unsafe {
  1063. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  1064. }
  1065. }
  1066. #[test]
  1067. fn test_jit_jsle_imm() {
  1068. let prog = assemble(
  1069. "
  1070. mov32 r0, 0
  1071. mov r1, -2
  1072. jsle r1, -3, +1
  1073. jsle r1, -1, +1
  1074. exit
  1075. mov32 r0, 1
  1076. jsle r1, -2, +1
  1077. mov32 r0, 2
  1078. exit
  1079. ",
  1080. )
  1081. .unwrap();
  1082. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  1083. vm.jit_compile().unwrap();
  1084. unsafe {
  1085. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  1086. }
  1087. }
  1088. #[test]
  1089. fn test_jit_jsle_reg() {
  1090. let prog = assemble(
  1091. "
  1092. mov32 r0, 0
  1093. mov r1, -1
  1094. mov r2, -2
  1095. mov32 r3, 0
  1096. jsle r1, r2, +1
  1097. jsle r1, r3, +1
  1098. exit
  1099. mov32 r0, 1
  1100. mov r1, r2
  1101. jsle r1, r2, +1
  1102. mov32 r0, 2
  1103. exit
  1104. ",
  1105. )
  1106. .unwrap();
  1107. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  1108. vm.jit_compile().unwrap();
  1109. unsafe {
  1110. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  1111. }
  1112. }
  1113. #[test]
  1114. fn test_jit_jsgt_imm() {
  1115. let prog = assemble(
  1116. "
  1117. mov32 r0, 0
  1118. mov r1, -2
  1119. jsgt r1, -1, +4
  1120. mov32 r0, 1
  1121. mov32 r1, 0
  1122. jsgt r1, -1, +1
  1123. mov32 r0, 2
  1124. exit
  1125. ",
  1126. )
  1127. .unwrap();
  1128. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  1129. vm.jit_compile().unwrap();
  1130. unsafe {
  1131. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  1132. }
  1133. }
  1134. #[test]
  1135. fn test_jit_jsgt_reg() {
  1136. let prog = assemble(
  1137. "
  1138. mov32 r0, 0
  1139. mov r1, -2
  1140. mov r2, -1
  1141. jsgt r1, r2, +4
  1142. mov32 r0, 1
  1143. mov32 r1, 0
  1144. jsgt r1, r2, +1
  1145. mov32 r0, 2
  1146. exit
  1147. ",
  1148. )
  1149. .unwrap();
  1150. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  1151. vm.jit_compile().unwrap();
  1152. unsafe {
  1153. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  1154. }
  1155. }
  1156. #[test]
  1157. fn test_jit_jslt_imm() {
  1158. let prog = assemble(
  1159. "
  1160. mov32 r0, 0
  1161. mov r1, -2
  1162. jslt r1, -3, +2
  1163. jslt r1, -2, +1
  1164. jslt r1, -1, +1
  1165. exit
  1166. mov32 r0, 1
  1167. exit
  1168. ",
  1169. )
  1170. .unwrap();
  1171. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  1172. vm.jit_compile().unwrap();
  1173. unsafe {
  1174. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  1175. }
  1176. }
  1177. #[test]
  1178. fn test_jit_jslt_reg() {
  1179. let prog = assemble(
  1180. "
  1181. mov32 r0, 0
  1182. mov r1, -2
  1183. mov r2, -3
  1184. mov r3, -1
  1185. jslt r1, r1, +2
  1186. jslt r1, r2, +1
  1187. jslt r1, r3, +1
  1188. exit
  1189. mov32 r0, 1
  1190. exit
  1191. ",
  1192. )
  1193. .unwrap();
  1194. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  1195. vm.jit_compile().unwrap();
  1196. unsafe {
  1197. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  1198. }
  1199. }
  1200. #[test]
  1201. fn test_jit_jeq32_imm() {
  1202. let prog = assemble(
  1203. "
  1204. mov r9, 1
  1205. lsh r9, 32
  1206. mov32 r0, 0x0
  1207. mov32 r1, 0xa
  1208. jeq32 r1, 0xb, +5
  1209. mov32 r0, 1
  1210. mov r1, 0xb
  1211. or r1, r9
  1212. jeq32 r1, 0xb, +1
  1213. mov32 r0, 2
  1214. exit
  1215. ",
  1216. )
  1217. .unwrap();
  1218. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  1219. vm.jit_compile().unwrap();
  1220. unsafe {
  1221. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  1222. }
  1223. }
  1224. #[test]
  1225. fn test_jit_jeq32_reg() {
  1226. let prog = assemble(
  1227. "
  1228. mov r9, 1
  1229. lsh r9, 32
  1230. mov32 r0, 0
  1231. mov32 r1, 0xa
  1232. mov32 r2, 0xb
  1233. jeq32 r1, r2, +5
  1234. mov32 r0, 1
  1235. mov32 r1, 0xb
  1236. or r1, r9
  1237. jeq32 r1, r2, +1
  1238. mov32 r0, 2
  1239. exit
  1240. ",
  1241. )
  1242. .unwrap();
  1243. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  1244. vm.jit_compile().unwrap();
  1245. unsafe {
  1246. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  1247. }
  1248. }
  1249. #[test]
  1250. fn test_jit_jge32_imm() {
  1251. let prog = assemble(
  1252. "
  1253. mov r9, 1
  1254. lsh r9, 32
  1255. mov32 r0, 0
  1256. mov32 r1, 0xa
  1257. jge32 r1, 0xb, +5
  1258. mov32 r0, 1
  1259. or r1, r9
  1260. mov32 r1, 0xc
  1261. jge32 r1, 0xb, +1
  1262. mov32 r0, 2
  1263. exit
  1264. ",
  1265. )
  1266. .unwrap();
  1267. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  1268. vm.jit_compile().unwrap();
  1269. unsafe {
  1270. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  1271. }
  1272. }
  1273. #[test]
  1274. fn test_jit_jge32_reg() {
  1275. let prog = assemble(
  1276. "
  1277. mov r9, 1
  1278. lsh r9, 32
  1279. mov32 r0, 0
  1280. mov32 r1, 0xa
  1281. mov32 r2, 0xb
  1282. jge32 r1, r2, +5
  1283. mov32 r0, 1
  1284. or r1, r9
  1285. mov32 r1, 0xc
  1286. jge32 r1, r2, +1
  1287. mov32 r0, 2
  1288. exit
  1289. ",
  1290. )
  1291. .unwrap();
  1292. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  1293. vm.jit_compile().unwrap();
  1294. unsafe {
  1295. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  1296. }
  1297. }
  1298. #[test]
  1299. fn test_jit_jgt32_imm() {
  1300. let prog = assemble(
  1301. "
  1302. mov r9, 1
  1303. lsh r9, 32
  1304. mov32 r0, 0
  1305. mov32 r1, 5
  1306. or r1, r9
  1307. jgt32 r1, 6, +4
  1308. jgt32 r1, 5, +3
  1309. jgt32 r1, 4, +1
  1310. exit
  1311. mov32 r0, 1
  1312. exit
  1313. ",
  1314. )
  1315. .unwrap();
  1316. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  1317. vm.jit_compile().unwrap();
  1318. unsafe {
  1319. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  1320. }
  1321. }
  1322. #[test]
  1323. fn test_jit_jgt32_reg() {
  1324. let prog = assemble(
  1325. "
  1326. mov r9, 1
  1327. lsh r9, 32
  1328. mov r0, 0
  1329. mov r1, 5
  1330. mov32 r1, 5
  1331. or r1, r9
  1332. mov r2, 6
  1333. mov r3, 4
  1334. jgt32 r1, r2, +4
  1335. jgt32 r1, r1, +3
  1336. jgt32 r1, r3, +1
  1337. exit
  1338. mov r0, 1
  1339. exit
  1340. ",
  1341. )
  1342. .unwrap();
  1343. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  1344. vm.jit_compile().unwrap();
  1345. unsafe {
  1346. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  1347. }
  1348. }
  1349. #[test]
  1350. fn test_jit_jle32_imm() {
  1351. let prog = assemble(
  1352. "
  1353. mov r9, 1
  1354. lsh r9, 32
  1355. mov32 r0, 0
  1356. mov32 r1, 5
  1357. or r1, r9
  1358. jle32 r1, 4, +5
  1359. jle32 r1, 6, +1
  1360. exit
  1361. jle32 r1, 5, +1
  1362. exit
  1363. mov32 r0, 1
  1364. exit
  1365. ",
  1366. )
  1367. .unwrap();
  1368. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  1369. vm.jit_compile().unwrap();
  1370. unsafe {
  1371. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  1372. }
  1373. }
  1374. #[test]
  1375. fn test_jit_jle32_reg() {
  1376. let prog = assemble(
  1377. "
  1378. mov r9, 1
  1379. lsh r9, 32
  1380. mov r0, 0
  1381. mov r1, 5
  1382. mov r2, 4
  1383. mov r3, 6
  1384. or r1, r9
  1385. jle32 r1, r2, +5
  1386. jle32 r1, r1, +1
  1387. exit
  1388. jle32 r1, r3, +1
  1389. exit
  1390. mov r0, 1
  1391. exit
  1392. ",
  1393. )
  1394. .unwrap();
  1395. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  1396. vm.jit_compile().unwrap();
  1397. unsafe {
  1398. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  1399. }
  1400. }
  1401. #[test]
  1402. fn test_jit_jlt32_imm() {
  1403. let prog = assemble(
  1404. "
  1405. mov r9, 1
  1406. lsh r9, 32
  1407. mov32 r0, 0
  1408. mov32 r1, 5
  1409. or r1, r9
  1410. jlt32 r1, 4, +4
  1411. jlt32 r1, 5, +3
  1412. jlt32 r1, 6, +1
  1413. exit
  1414. mov32 r0, 1
  1415. exit
  1416. ",
  1417. )
  1418. .unwrap();
  1419. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  1420. vm.jit_compile().unwrap();
  1421. unsafe {
  1422. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  1423. }
  1424. }
  1425. #[test]
  1426. fn test_jit_jlt32_reg() {
  1427. let prog = assemble(
  1428. "
  1429. mov r9, 1
  1430. lsh r9, 32
  1431. mov r0, 0
  1432. mov r1, 5
  1433. mov r2, 4
  1434. mov r3, 6
  1435. or r1, r9
  1436. jlt32 r1, r2, +4
  1437. jlt32 r1, r1, +3
  1438. jlt32 r1, r3, +1
  1439. exit
  1440. mov r0, 1
  1441. exit
  1442. ",
  1443. )
  1444. .unwrap();
  1445. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  1446. vm.jit_compile().unwrap();
  1447. unsafe {
  1448. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  1449. }
  1450. }
  1451. #[test]
  1452. fn test_jit_jne32_imm() {
  1453. let prog = assemble(
  1454. "
  1455. mov r9, 1
  1456. lsh r9, 32
  1457. mov32 r0, 0
  1458. mov32 r1, 0xb
  1459. or r1, r9
  1460. jne32 r1, 0xb, +4
  1461. mov32 r0, 1
  1462. mov32 r1, 0xa
  1463. or r1, r9
  1464. jne32 r1, 0xb, +1
  1465. mov32 r0, 2
  1466. exit
  1467. ",
  1468. )
  1469. .unwrap();
  1470. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  1471. vm.jit_compile().unwrap();
  1472. unsafe {
  1473. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  1474. }
  1475. }
  1476. #[test]
  1477. fn test_jit_jne32_reg() {
  1478. let prog = assemble(
  1479. "
  1480. mov r9, 1
  1481. lsh r9, 32
  1482. mov32 r0, 0
  1483. mov32 r1, 0xb
  1484. or r1, r9
  1485. mov32 r2, 0xb
  1486. jne32 r1, r2, +4
  1487. mov32 r0, 1
  1488. mov32 r1, 0xa
  1489. or r1, r9
  1490. jne32 r1, r2, +1
  1491. mov32 r0, 2
  1492. exit
  1493. ",
  1494. )
  1495. .unwrap();
  1496. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  1497. vm.jit_compile().unwrap();
  1498. unsafe {
  1499. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  1500. }
  1501. }
  1502. #[test]
  1503. fn test_jit_jset32_imm() {
  1504. let prog = assemble(
  1505. "
  1506. mov r9, 1
  1507. lsh r9, 32
  1508. mov32 r0, 0
  1509. mov32 r1, 0x7
  1510. or r1, r9
  1511. jset32 r1, 0x8, +4
  1512. mov32 r0, 1
  1513. mov32 r1, 0x9
  1514. jset32 r1, 0x8, +1
  1515. mov32 r0, 2
  1516. exit
  1517. ",
  1518. )
  1519. .unwrap();
  1520. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  1521. vm.jit_compile().unwrap();
  1522. unsafe {
  1523. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  1524. }
  1525. }
  1526. #[test]
  1527. fn test_jit_jset32_reg() {
  1528. let prog = assemble(
  1529. "
  1530. mov r9, 1
  1531. lsh r9, 32
  1532. mov32 r0, 0
  1533. mov32 r1, 0x7
  1534. or r1, r9
  1535. mov32 r2, 0x8
  1536. jset32 r1, r2, +4
  1537. mov32 r0, 1
  1538. mov32 r1, 0x9
  1539. jset32 r1, r2, +1
  1540. mov32 r0, 2
  1541. exit
  1542. ",
  1543. )
  1544. .unwrap();
  1545. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  1546. vm.jit_compile().unwrap();
  1547. unsafe {
  1548. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  1549. }
  1550. }
  1551. #[test]
  1552. fn test_jit_jsge32_imm() {
  1553. let prog = assemble(
  1554. "
  1555. mov r9, 1
  1556. lsh r9, 32
  1557. mov32 r0, 0
  1558. mov32 r1, -2
  1559. or r1, r9
  1560. jsge32 r1, -1, +5
  1561. jsge32 r1, 0, +4
  1562. mov32 r0, 1
  1563. mov r1, -1
  1564. jsge32 r1, -1, +1
  1565. mov32 r0, 2
  1566. exit
  1567. ",
  1568. )
  1569. .unwrap();
  1570. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  1571. vm.jit_compile().unwrap();
  1572. unsafe {
  1573. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  1574. }
  1575. }
  1576. #[test]
  1577. fn test_jit_jsge32_reg() {
  1578. let prog = assemble(
  1579. "
  1580. mov r9, 1
  1581. lsh r9, 32
  1582. mov32 r0, 0
  1583. mov32 r1, -2
  1584. or r1, r9
  1585. mov r2, -1
  1586. mov32 r3, 0
  1587. jsge32 r1, r2, +5
  1588. jsge32 r1, r3, +4
  1589. mov32 r0, 1
  1590. mov r1, r2
  1591. jsge32 r1, r2, +1
  1592. mov32 r0, 2
  1593. exit
  1594. ",
  1595. )
  1596. .unwrap();
  1597. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  1598. vm.jit_compile().unwrap();
  1599. unsafe {
  1600. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  1601. }
  1602. }
  1603. #[test]
  1604. fn test_jit_jsgt32_imm() {
  1605. let prog = assemble(
  1606. "
  1607. mov r9, 1
  1608. lsh r9, 32
  1609. mov32 r0, 0
  1610. mov32 r1, -2
  1611. or r1, r9
  1612. jsgt32 r1, -1, +4
  1613. mov32 r0, 1
  1614. mov32 r1, 0
  1615. jsgt32 r1, -1, +1
  1616. mov32 r0, 2
  1617. exit
  1618. ",
  1619. )
  1620. .unwrap();
  1621. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  1622. vm.jit_compile().unwrap();
  1623. unsafe {
  1624. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  1625. }
  1626. }
  1627. #[test]
  1628. fn test_jit_jsgt32_reg() {
  1629. let prog = assemble(
  1630. "
  1631. mov r9, 1
  1632. lsh r9, 32
  1633. mov32 r0, 0
  1634. mov32 r1, -2
  1635. or r1, r9
  1636. mov r2, -1
  1637. jsgt32 r1, r2, +4
  1638. mov32 r0, 1
  1639. mov32 r1, 0
  1640. jsgt32 r1, r2, +1
  1641. mov32 r0, 2
  1642. exit
  1643. ",
  1644. )
  1645. .unwrap();
  1646. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  1647. vm.jit_compile().unwrap();
  1648. unsafe {
  1649. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  1650. }
  1651. }
  1652. #[test]
  1653. fn test_jit_jsle32_imm() {
  1654. let prog = assemble(
  1655. "
  1656. mov r9, 1
  1657. lsh r9, 32
  1658. mov32 r0, 0
  1659. mov32 r1, -2
  1660. or r1, r9
  1661. jsle32 r1, -3, +5
  1662. jsle32 r1, -1, +1
  1663. exit
  1664. mov32 r0, 1
  1665. jsle32 r1, -2, +1
  1666. mov32 r0, 2
  1667. exit
  1668. ",
  1669. )
  1670. .unwrap();
  1671. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  1672. vm.jit_compile().unwrap();
  1673. unsafe {
  1674. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  1675. }
  1676. }
  1677. #[test]
  1678. fn test_jit_jsle32_reg() {
  1679. let prog = assemble(
  1680. "
  1681. mov r9, 1
  1682. lsh r9, 32
  1683. mov32 r0, 0
  1684. mov32 r1, -2
  1685. or r1, r9
  1686. mov r2, -3
  1687. mov32 r3, 0
  1688. jsle32 r1, r2, +6
  1689. jsle32 r1, r3, +1
  1690. exit
  1691. mov32 r0, 1
  1692. mov r1, r2
  1693. jsle32 r1, r2, +1
  1694. mov32 r0, 2
  1695. exit
  1696. ",
  1697. )
  1698. .unwrap();
  1699. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  1700. vm.jit_compile().unwrap();
  1701. unsafe {
  1702. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  1703. }
  1704. }
  1705. #[test]
  1706. fn test_jit_jslt32_imm() {
  1707. let prog = assemble(
  1708. "
  1709. mov r9, 1
  1710. lsh r9, 32
  1711. mov32 r0, 0
  1712. mov32 r1, -2
  1713. or r1, r9
  1714. jslt32 r1, -3, +4
  1715. jslt32 r1, -2, +3
  1716. jslt32 r1, -1, +1
  1717. exit
  1718. mov32 r0, 1
  1719. exit
  1720. ",
  1721. )
  1722. .unwrap();
  1723. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  1724. vm.jit_compile().unwrap();
  1725. unsafe {
  1726. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  1727. }
  1728. }
  1729. #[test]
  1730. fn test_jit_jslt32_reg() {
  1731. let prog = assemble(
  1732. "
  1733. mov r9, 1
  1734. lsh r9, 32
  1735. mov32 r0, 0
  1736. mov32 r1, -2
  1737. or r1, r9
  1738. mov r2, -3
  1739. mov r3, -1
  1740. jslt32 r1, r1, +4
  1741. jslt32 r1, r2, +3
  1742. jslt32 r1, r3, +1
  1743. exit
  1744. mov32 r0, 1
  1745. exit
  1746. ",
  1747. )
  1748. .unwrap();
  1749. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  1750. vm.jit_compile().unwrap();
  1751. unsafe {
  1752. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  1753. }
  1754. }
  1755. #[test]
  1756. fn test_jit_lddw() {
  1757. let prog = assemble(
  1758. "
  1759. lddw r0, 0x1122334455667788
  1760. exit
  1761. ",
  1762. )
  1763. .unwrap();
  1764. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  1765. vm.jit_compile().unwrap();
  1766. unsafe {
  1767. assert_eq!(vm.execute_program_jit().unwrap(), 0x1122334455667788);
  1768. }
  1769. }
  1770. #[test]
  1771. fn test_jit_lddw2() {
  1772. let prog = assemble(
  1773. "
  1774. lddw r0, 0x0000000080000000
  1775. exit
  1776. ",
  1777. )
  1778. .unwrap();
  1779. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  1780. vm.jit_compile().unwrap();
  1781. unsafe {
  1782. assert_eq!(vm.execute_program_jit().unwrap(), 0x80000000);
  1783. }
  1784. }
  1785. #[test]
  1786. fn test_jit_ldxb_all() {
  1787. let prog = assemble(
  1788. "
  1789. mov r0, r1
  1790. ldxb r9, [r0+0]
  1791. lsh r9, 0
  1792. ldxb r8, [r0+1]
  1793. lsh r8, 4
  1794. ldxb r7, [r0+2]
  1795. lsh r7, 8
  1796. ldxb r6, [r0+3]
  1797. lsh r6, 12
  1798. ldxb r5, [r0+4]
  1799. lsh r5, 16
  1800. ldxb r4, [r0+5]
  1801. lsh r4, 20
  1802. ldxb r3, [r0+6]
  1803. lsh r3, 24
  1804. ldxb r2, [r0+7]
  1805. lsh r2, 28
  1806. ldxb r1, [r0+8]
  1807. lsh r1, 32
  1808. ldxb r0, [r0+9]
  1809. lsh r0, 36
  1810. or r0, r1
  1811. or r0, r2
  1812. or r0, r3
  1813. or r0, r4
  1814. or r0, r5
  1815. or r0, r6
  1816. or r0, r7
  1817. or r0, r8
  1818. or r0, r9
  1819. exit
  1820. ",
  1821. )
  1822. .unwrap();
  1823. #[rustfmt::skip]
  1824. let mem = &mut [
  1825. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
  1826. 0x08, 0x09
  1827. ];
  1828. let mut vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  1829. vm.jit_compile().unwrap();
  1830. unsafe {
  1831. assert_eq!(vm.execute_program_jit(mem).unwrap(), 0x9876543210);
  1832. }
  1833. }
  1834. #[test]
  1835. fn test_jit_ldxb() {
  1836. let prog = assemble(
  1837. "
  1838. ldxb r0, [r1+2]
  1839. exit
  1840. ",
  1841. )
  1842. .unwrap();
  1843. let mem = &mut [0xaa, 0xbb, 0x11, 0xcc, 0xdd];
  1844. let mut vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  1845. vm.jit_compile().unwrap();
  1846. unsafe {
  1847. assert_eq!(vm.execute_program_jit(mem).unwrap(), 0x11);
  1848. }
  1849. }
  1850. #[test]
  1851. fn test_jit_ldxdw() {
  1852. let prog = assemble(
  1853. "
  1854. ldxdw r0, [r1+2]
  1855. exit
  1856. ",
  1857. )
  1858. .unwrap();
  1859. #[rustfmt::skip]
  1860. let mem = &mut [
  1861. 0xaa, 0xbb, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66,
  1862. 0x77, 0x88, 0xcc, 0xdd
  1863. ];
  1864. let mut vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  1865. vm.jit_compile().unwrap();
  1866. unsafe {
  1867. assert_eq!(vm.execute_program_jit(mem).unwrap(), 0x8877665544332211);
  1868. }
  1869. }
  1870. #[test]
  1871. fn test_jit_ldxh_all() {
  1872. let prog = assemble(
  1873. "
  1874. mov r0, r1
  1875. ldxh r9, [r0+0]
  1876. be16 r9
  1877. lsh r9, 0
  1878. ldxh r8, [r0+2]
  1879. be16 r8
  1880. lsh r8, 4
  1881. ldxh r7, [r0+4]
  1882. be16 r7
  1883. lsh r7, 8
  1884. ldxh r6, [r0+6]
  1885. be16 r6
  1886. lsh r6, 12
  1887. ldxh r5, [r0+8]
  1888. be16 r5
  1889. lsh r5, 16
  1890. ldxh r4, [r0+10]
  1891. be16 r4
  1892. lsh r4, 20
  1893. ldxh r3, [r0+12]
  1894. be16 r3
  1895. lsh r3, 24
  1896. ldxh r2, [r0+14]
  1897. be16 r2
  1898. lsh r2, 28
  1899. ldxh r1, [r0+16]
  1900. be16 r1
  1901. lsh r1, 32
  1902. ldxh r0, [r0+18]
  1903. be16 r0
  1904. lsh r0, 36
  1905. or r0, r1
  1906. or r0, r2
  1907. or r0, r3
  1908. or r0, r4
  1909. or r0, r5
  1910. or r0, r6
  1911. or r0, r7
  1912. or r0, r8
  1913. or r0, r9
  1914. exit
  1915. ",
  1916. )
  1917. .unwrap();
  1918. #[rustfmt::skip]
  1919. let mem = &mut [
  1920. 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03,
  1921. 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07,
  1922. 0x00, 0x08, 0x00, 0x09
  1923. ];
  1924. let mut vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  1925. vm.jit_compile().unwrap();
  1926. unsafe {
  1927. assert_eq!(vm.execute_program_jit(mem).unwrap(), 0x9876543210);
  1928. }
  1929. }
  1930. #[test]
  1931. fn test_jit_ldxh_all2() {
  1932. let prog = assemble(
  1933. "
  1934. mov r0, r1
  1935. ldxh r9, [r0+0]
  1936. be16 r9
  1937. ldxh r8, [r0+2]
  1938. be16 r8
  1939. ldxh r7, [r0+4]
  1940. be16 r7
  1941. ldxh r6, [r0+6]
  1942. be16 r6
  1943. ldxh r5, [r0+8]
  1944. be16 r5
  1945. ldxh r4, [r0+10]
  1946. be16 r4
  1947. ldxh r3, [r0+12]
  1948. be16 r3
  1949. ldxh r2, [r0+14]
  1950. be16 r2
  1951. ldxh r1, [r0+16]
  1952. be16 r1
  1953. ldxh r0, [r0+18]
  1954. be16 r0
  1955. or r0, r1
  1956. or r0, r2
  1957. or r0, r3
  1958. or r0, r4
  1959. or r0, r5
  1960. or r0, r6
  1961. or r0, r7
  1962. or r0, r8
  1963. or r0, r9
  1964. exit
  1965. ",
  1966. )
  1967. .unwrap();
  1968. #[rustfmt::skip]
  1969. let mem = &mut [
  1970. 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08,
  1971. 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80,
  1972. 0x01, 0x00, 0x02, 0x00
  1973. ];
  1974. let mut vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  1975. vm.jit_compile().unwrap();
  1976. unsafe {
  1977. assert_eq!(vm.execute_program_jit(mem).unwrap(), 0x3ff);
  1978. }
  1979. }
  1980. #[test]
  1981. fn test_jit_ldxh() {
  1982. let prog = assemble(
  1983. "
  1984. ldxh r0, [r1+2]
  1985. exit
  1986. ",
  1987. )
  1988. .unwrap();
  1989. let mem = &mut [0xaa, 0xbb, 0x11, 0x22, 0xcc, 0xdd];
  1990. let mut vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  1991. vm.jit_compile().unwrap();
  1992. unsafe {
  1993. assert_eq!(vm.execute_program_jit(mem).unwrap(), 0x2211);
  1994. }
  1995. }
  1996. #[test]
  1997. fn test_jit_ldxh_same_reg() {
  1998. let prog = assemble(
  1999. "
  2000. mov r0, r1
  2001. sth [r0], 0x1234
  2002. ldxh r0, [r0]
  2003. exit
  2004. ",
  2005. )
  2006. .unwrap();
  2007. let mem = &mut [0xff, 0xff];
  2008. let mut vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  2009. vm.jit_compile().unwrap();
  2010. unsafe {
  2011. assert_eq!(vm.execute_program_jit(mem).unwrap(), 0x1234);
  2012. }
  2013. }
  2014. #[test]
  2015. fn test_jit_ldxw_all() {
  2016. let prog = assemble(
  2017. "
  2018. mov r0, r1
  2019. ldxw r9, [r0+0]
  2020. be32 r9
  2021. ldxw r8, [r0+4]
  2022. be32 r8
  2023. ldxw r7, [r0+8]
  2024. be32 r7
  2025. ldxw r6, [r0+12]
  2026. be32 r6
  2027. ldxw r5, [r0+16]
  2028. be32 r5
  2029. ldxw r4, [r0+20]
  2030. be32 r4
  2031. ldxw r3, [r0+24]
  2032. be32 r3
  2033. ldxw r2, [r0+28]
  2034. be32 r2
  2035. ldxw r1, [r0+32]
  2036. be32 r1
  2037. ldxw r0, [r0+36]
  2038. be32 r0
  2039. or r0, r1
  2040. or r0, r2
  2041. or r0, r3
  2042. or r0, r4
  2043. or r0, r5
  2044. or r0, r6
  2045. or r0, r7
  2046. or r0, r8
  2047. or r0, r9
  2048. exit
  2049. ",
  2050. )
  2051. .unwrap();
  2052. #[rustfmt::skip]
  2053. let mem = &mut [
  2054. 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
  2055. 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08,
  2056. 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00,
  2057. 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00,
  2058. 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00
  2059. ];
  2060. let mut vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  2061. vm.jit_compile().unwrap();
  2062. unsafe {
  2063. assert_eq!(vm.execute_program_jit(mem).unwrap(), 0x030f0f);
  2064. }
  2065. }
  2066. #[test]
  2067. fn test_jit_ldxw() {
  2068. let prog = assemble(
  2069. "
  2070. ldxw r0, [r1+2]
  2071. exit
  2072. ",
  2073. )
  2074. .unwrap();
  2075. let mem = &mut [0xaa, 0xbb, 0x11, 0x22, 0x33, 0x44, 0xcc, 0xdd];
  2076. let mut vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  2077. vm.jit_compile().unwrap();
  2078. unsafe {
  2079. assert_eq!(vm.execute_program_jit(mem).unwrap(), 0x44332211);
  2080. }
  2081. }
  2082. #[test]
  2083. fn test_jit_le16() {
  2084. let prog = assemble(
  2085. "
  2086. ldxh r0, [r1]
  2087. le16 r0
  2088. exit
  2089. ",
  2090. )
  2091. .unwrap();
  2092. let mem = &mut [0x22, 0x11];
  2093. let mut vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  2094. vm.jit_compile().unwrap();
  2095. unsafe {
  2096. assert_eq!(vm.execute_program_jit(mem).unwrap(), 0x1122);
  2097. }
  2098. }
  2099. #[test]
  2100. fn test_jit_le32() {
  2101. let prog = assemble(
  2102. "
  2103. ldxw r0, [r1]
  2104. le32 r0
  2105. exit
  2106. ",
  2107. )
  2108. .unwrap();
  2109. let mem = &mut [0x44, 0x33, 0x22, 0x11];
  2110. let mut vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  2111. vm.jit_compile().unwrap();
  2112. unsafe {
  2113. assert_eq!(vm.execute_program_jit(mem).unwrap(), 0x11223344);
  2114. }
  2115. }
  2116. #[test]
  2117. fn test_jit_le64() {
  2118. let prog = assemble(
  2119. "
  2120. ldxdw r0, [r1]
  2121. le64 r0
  2122. exit
  2123. ",
  2124. )
  2125. .unwrap();
  2126. let mem = &mut [0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11];
  2127. let mut vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  2128. vm.jit_compile().unwrap();
  2129. unsafe {
  2130. assert_eq!(vm.execute_program_jit(mem).unwrap(), 0x1122334455667788);
  2131. }
  2132. }
  2133. #[test]
  2134. fn test_jit_lsh_reg() {
  2135. let prog = assemble(
  2136. "
  2137. mov r0, 0x1
  2138. mov r7, 4
  2139. lsh r0, r7
  2140. exit
  2141. ",
  2142. )
  2143. .unwrap();
  2144. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  2145. vm.jit_compile().unwrap();
  2146. unsafe {
  2147. assert_eq!(vm.execute_program_jit().unwrap(), 0x10);
  2148. }
  2149. }
  2150. #[test]
  2151. fn test_jit_mod() {
  2152. let prog = assemble(
  2153. "
  2154. mov32 r0, 5748
  2155. mod32 r0, 92
  2156. mov32 r1, 13
  2157. mod32 r0, r1
  2158. exit
  2159. ",
  2160. )
  2161. .unwrap();
  2162. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  2163. vm.jit_compile().unwrap();
  2164. unsafe {
  2165. assert_eq!(vm.execute_program_jit().unwrap(), 0x5);
  2166. }
  2167. }
  2168. #[test]
  2169. fn test_jit_mod32() {
  2170. let prog = assemble(
  2171. "
  2172. lddw r0, 0x100000003
  2173. mod32 r0, 3
  2174. exit
  2175. ",
  2176. )
  2177. .unwrap();
  2178. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  2179. vm.jit_compile().unwrap();
  2180. unsafe {
  2181. assert_eq!(vm.execute_program_jit().unwrap(), 0x0);
  2182. }
  2183. }
  2184. #[test]
  2185. fn test_jit_mod64() {
  2186. let prog = assemble(
  2187. "
  2188. mov32 r0, -1316649930
  2189. lsh r0, 32
  2190. or r0, 0x100dc5c8
  2191. mov32 r1, 0xdde263e
  2192. lsh r1, 32
  2193. or r1, 0x3cbef7f3
  2194. mod r0, r1
  2195. mod r0, 0x658f1778
  2196. exit
  2197. ",
  2198. )
  2199. .unwrap();
  2200. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  2201. vm.jit_compile().unwrap();
  2202. unsafe {
  2203. assert_eq!(vm.execute_program_jit().unwrap(), 0x30ba5a04);
  2204. }
  2205. }
  2206. #[test]
  2207. fn test_jit_mov() {
  2208. let prog = assemble(
  2209. "
  2210. mov32 r1, 1
  2211. mov32 r0, r1
  2212. exit
  2213. ",
  2214. )
  2215. .unwrap();
  2216. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  2217. vm.jit_compile().unwrap();
  2218. unsafe {
  2219. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  2220. }
  2221. }
  2222. #[test]
  2223. fn test_jit_mul32_imm() {
  2224. let prog = assemble(
  2225. "
  2226. mov r0, 3
  2227. mul32 r0, 4
  2228. exit
  2229. ",
  2230. )
  2231. .unwrap();
  2232. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  2233. vm.jit_compile().unwrap();
  2234. unsafe {
  2235. assert_eq!(vm.execute_program_jit().unwrap(), 0xc);
  2236. }
  2237. }
  2238. #[test]
  2239. fn test_jit_mul32_reg() {
  2240. let prog = assemble(
  2241. "
  2242. mov r0, 3
  2243. mov r1, 4
  2244. mul32 r0, r1
  2245. exit
  2246. ",
  2247. )
  2248. .unwrap();
  2249. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  2250. vm.jit_compile().unwrap();
  2251. unsafe {
  2252. assert_eq!(vm.execute_program_jit().unwrap(), 0xc);
  2253. }
  2254. }
  2255. #[test]
  2256. fn test_jit_mul32_reg_overflow() {
  2257. let prog = assemble(
  2258. "
  2259. mov r0, 0x40000001
  2260. mov r1, 4
  2261. mul32 r0, r1
  2262. exit
  2263. ",
  2264. )
  2265. .unwrap();
  2266. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  2267. vm.jit_compile().unwrap();
  2268. unsafe {
  2269. assert_eq!(vm.execute_program_jit().unwrap(), 0x4);
  2270. }
  2271. }
  2272. #[test]
  2273. fn test_jit_mul64_imm() {
  2274. let prog = assemble(
  2275. "
  2276. mov r0, 0x40000001
  2277. mul r0, 4
  2278. exit
  2279. ",
  2280. )
  2281. .unwrap();
  2282. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  2283. vm.jit_compile().unwrap();
  2284. unsafe {
  2285. assert_eq!(vm.execute_program_jit().unwrap(), 0x100000004);
  2286. }
  2287. }
  2288. #[test]
  2289. fn test_jit_mul64_reg() {
  2290. let prog = assemble(
  2291. "
  2292. mov r0, 0x40000001
  2293. mov r1, 4
  2294. mul r0, r1
  2295. exit
  2296. ",
  2297. )
  2298. .unwrap();
  2299. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  2300. vm.jit_compile().unwrap();
  2301. unsafe {
  2302. assert_eq!(vm.execute_program_jit().unwrap(), 0x100000004);
  2303. }
  2304. }
  2305. #[test]
  2306. fn test_jit_mul_loop() {
  2307. let prog = assemble(
  2308. "
  2309. mov r0, 0x7
  2310. add r1, 0xa
  2311. lsh r1, 0x20
  2312. rsh r1, 0x20
  2313. jeq r1, 0x0, +4
  2314. mov r0, 0x7
  2315. mul r0, 0x7
  2316. add r1, -1
  2317. jne r1, 0x0, -3
  2318. exit
  2319. ",
  2320. )
  2321. .unwrap();
  2322. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  2323. vm.jit_compile().unwrap();
  2324. unsafe {
  2325. assert_eq!(vm.execute_program_jit().unwrap(), 0x75db9c97);
  2326. }
  2327. }
  2328. #[test]
  2329. fn test_jit_neg64() {
  2330. let prog = assemble(
  2331. "
  2332. mov32 r0, 2
  2333. neg r0
  2334. exit
  2335. ",
  2336. )
  2337. .unwrap();
  2338. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  2339. vm.jit_compile().unwrap();
  2340. unsafe {
  2341. assert_eq!(vm.execute_program_jit().unwrap(), 0xfffffffffffffffe);
  2342. }
  2343. }
  2344. #[test]
  2345. fn test_jit_neg() {
  2346. let prog = assemble(
  2347. "
  2348. mov32 r0, 2
  2349. neg32 r0
  2350. exit
  2351. ",
  2352. )
  2353. .unwrap();
  2354. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  2355. vm.jit_compile().unwrap();
  2356. unsafe {
  2357. assert_eq!(vm.execute_program_jit().unwrap(), 0xfffffffe);
  2358. }
  2359. }
  2360. #[test]
  2361. fn test_jit_prime() {
  2362. let prog = assemble(
  2363. "
  2364. mov r1, 67
  2365. mov r0, 0x1
  2366. mov r2, 0x2
  2367. jgt r1, 0x2, +4
  2368. ja +10
  2369. add r2, 0x1
  2370. mov r0, 0x1
  2371. jge r2, r1, +7
  2372. mov r3, r1
  2373. div r3, r2
  2374. mul r3, r2
  2375. mov r4, r1
  2376. sub r4, r3
  2377. mov r0, 0x0
  2378. jne r4, 0x0, -10
  2379. exit
  2380. ",
  2381. )
  2382. .unwrap();
  2383. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  2384. vm.jit_compile().unwrap();
  2385. unsafe {
  2386. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  2387. }
  2388. }
  2389. #[test]
  2390. fn test_jit_rhs32() {
  2391. let prog = assemble(
  2392. "
  2393. xor r0, r0
  2394. sub r0, 1
  2395. rsh32 r0, 8
  2396. exit
  2397. ",
  2398. )
  2399. .unwrap();
  2400. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  2401. vm.jit_compile().unwrap();
  2402. unsafe {
  2403. assert_eq!(vm.execute_program_jit().unwrap(), 0x00ffffff);
  2404. }
  2405. }
  2406. #[test]
  2407. fn test_jit_rsh_reg() {
  2408. let prog = assemble(
  2409. "
  2410. mov r0, 0x10
  2411. mov r7, 4
  2412. rsh r0, r7
  2413. exit
  2414. ",
  2415. )
  2416. .unwrap();
  2417. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  2418. vm.jit_compile().unwrap();
  2419. unsafe {
  2420. assert_eq!(vm.execute_program_jit().unwrap(), 0x1);
  2421. }
  2422. }
  2423. #[test]
  2424. fn test_jit_stack() {
  2425. let prog = assemble(
  2426. "
  2427. mov r1, 51
  2428. stdw [r10-16], 0xab
  2429. stdw [r10-8], 0xcd
  2430. and r1, 1
  2431. lsh r1, 3
  2432. mov r2, r10
  2433. add r2, r1
  2434. ldxdw r0, [r2-16]
  2435. exit
  2436. ",
  2437. )
  2438. .unwrap();
  2439. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  2440. vm.jit_compile().unwrap();
  2441. unsafe {
  2442. assert_eq!(vm.execute_program_jit().unwrap(), 0xcd);
  2443. }
  2444. }
  2445. #[test]
  2446. fn test_jit_stack2() {
  2447. let prog = assemble(
  2448. "
  2449. stb [r10-4], 0x01
  2450. stb [r10-3], 0x02
  2451. stb [r10-2], 0x03
  2452. stb [r10-1], 0x04
  2453. mov r1, r10
  2454. mov r2, 0x4
  2455. sub r1, r2
  2456. call 1
  2457. mov r1, 0
  2458. ldxb r2, [r10-4]
  2459. ldxb r3, [r10-3]
  2460. ldxb r4, [r10-2]
  2461. ldxb r5, [r10-1]
  2462. call 0
  2463. xor r0, 0x2a2a2a2a
  2464. exit
  2465. ",
  2466. )
  2467. .unwrap();
  2468. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  2469. vm.register_helper(0, helpers::gather_bytes).unwrap();
  2470. vm.register_helper(1, helpers::memfrob).unwrap();
  2471. vm.jit_compile().unwrap();
  2472. unsafe {
  2473. assert_eq!(vm.execute_program_jit().unwrap(), 0x01020304);
  2474. }
  2475. }
  2476. #[test]
  2477. fn test_jit_stb() {
  2478. let prog = assemble(
  2479. "
  2480. stb [r1+2], 0x11
  2481. ldxb r0, [r1+2]
  2482. exit
  2483. ",
  2484. )
  2485. .unwrap();
  2486. let mem = &mut [0xaa, 0xbb, 0xff, 0xcc, 0xdd];
  2487. let mut vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  2488. vm.jit_compile().unwrap();
  2489. unsafe {
  2490. assert_eq!(vm.execute_program_jit(mem).unwrap(), 0x11);
  2491. }
  2492. }
  2493. #[test]
  2494. fn test_jit_stdw() {
  2495. let prog = assemble(
  2496. "
  2497. stdw [r1+2], 0x44332211
  2498. ldxdw r0, [r1+2]
  2499. exit
  2500. ",
  2501. )
  2502. .unwrap();
  2503. #[rustfmt::skip]
  2504. let mem = &mut [
  2505. 0xaa, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  2506. 0xff, 0xff, 0xcc, 0xdd
  2507. ];
  2508. let mut vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  2509. vm.jit_compile().unwrap();
  2510. unsafe {
  2511. assert_eq!(vm.execute_program_jit(mem).unwrap(), 0x44332211);
  2512. }
  2513. }
  2514. #[test]
  2515. fn test_jit_sth() {
  2516. let prog = assemble(
  2517. "
  2518. sth [r1+2], 0x2211
  2519. ldxh r0, [r1+2]
  2520. exit
  2521. ",
  2522. )
  2523. .unwrap();
  2524. let mem = &mut [0xaa, 0xbb, 0xff, 0xff, 0xcc, 0xdd];
  2525. let mut vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  2526. vm.jit_compile().unwrap();
  2527. unsafe {
  2528. assert_eq!(vm.execute_program_jit(mem).unwrap(), 0x2211);
  2529. }
  2530. }
  2531. #[test]
  2532. fn test_jit_string_stack() {
  2533. let prog = assemble(
  2534. "
  2535. mov r1, 0x78636261
  2536. stxw [r10-8], r1
  2537. mov r6, 0x0
  2538. stxb [r10-4], r6
  2539. stxb [r10-12], r6
  2540. mov r1, 0x79636261
  2541. stxw [r10-16], r1
  2542. mov r1, r10
  2543. add r1, -8
  2544. mov r2, r1
  2545. call 0x4
  2546. mov r1, r0
  2547. mov r0, 0x1
  2548. lsh r1, 0x20
  2549. rsh r1, 0x20
  2550. jne r1, 0x0, +11
  2551. mov r1, r10
  2552. add r1, -8
  2553. mov r2, r10
  2554. add r2, -16
  2555. call 0x4
  2556. mov r1, r0
  2557. lsh r1, 0x20
  2558. rsh r1, 0x20
  2559. mov r0, 0x1
  2560. jeq r1, r6, +1
  2561. mov r0, 0x0
  2562. exit
  2563. ",
  2564. )
  2565. .unwrap();
  2566. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  2567. vm.register_helper(4, helpers::strcmp).unwrap();
  2568. vm.jit_compile().unwrap();
  2569. unsafe {
  2570. assert_eq!(vm.execute_program_jit().unwrap(), 0x0);
  2571. }
  2572. }
  2573. #[test]
  2574. fn test_jit_stw() {
  2575. let prog = assemble(
  2576. "
  2577. stw [r1+2], 0x44332211
  2578. ldxw r0, [r1+2]
  2579. exit
  2580. ",
  2581. )
  2582. .unwrap();
  2583. let mem = &mut [0xaa, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xcc, 0xdd];
  2584. let mut vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  2585. vm.jit_compile().unwrap();
  2586. unsafe {
  2587. assert_eq!(vm.execute_program_jit(mem).unwrap(), 0x44332211);
  2588. }
  2589. }
  2590. #[test]
  2591. fn test_jit_stxb() {
  2592. let prog = assemble(
  2593. "
  2594. mov32 r2, 0x11
  2595. stxb [r1+2], r2
  2596. ldxb r0, [r1+2]
  2597. exit
  2598. ",
  2599. )
  2600. .unwrap();
  2601. let mem = &mut [0xaa, 0xbb, 0xff, 0xcc, 0xdd];
  2602. let mut vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  2603. vm.jit_compile().unwrap();
  2604. unsafe {
  2605. assert_eq!(vm.execute_program_jit(mem).unwrap(), 0x11);
  2606. }
  2607. }
  2608. #[test]
  2609. fn test_jit_stxb_all() {
  2610. let prog = assemble(
  2611. "
  2612. mov r0, 0xf0
  2613. mov r2, 0xf2
  2614. mov r3, 0xf3
  2615. mov r4, 0xf4
  2616. mov r5, 0xf5
  2617. mov r6, 0xf6
  2618. mov r7, 0xf7
  2619. mov r8, 0xf8
  2620. stxb [r1], r0
  2621. stxb [r1+1], r2
  2622. stxb [r1+2], r3
  2623. stxb [r1+3], r4
  2624. stxb [r1+4], r5
  2625. stxb [r1+5], r6
  2626. stxb [r1+6], r7
  2627. stxb [r1+7], r8
  2628. ldxdw r0, [r1]
  2629. be64 r0
  2630. exit
  2631. ",
  2632. )
  2633. .unwrap();
  2634. let mem = &mut [0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff];
  2635. let mut vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  2636. vm.jit_compile().unwrap();
  2637. unsafe {
  2638. assert_eq!(vm.execute_program_jit(mem).unwrap(), 0xf0f2f3f4f5f6f7f8);
  2639. }
  2640. }
  2641. #[test]
  2642. fn test_jit_stxb_all2() {
  2643. let prog = assemble(
  2644. "
  2645. mov r0, r1
  2646. mov r1, 0xf1
  2647. mov r9, 0xf9
  2648. stxb [r0], r1
  2649. stxb [r0+1], r9
  2650. ldxh r0, [r0]
  2651. be16 r0
  2652. exit
  2653. ",
  2654. )
  2655. .unwrap();
  2656. let mem = &mut [0xff, 0xff];
  2657. let mut vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  2658. vm.jit_compile().unwrap();
  2659. unsafe {
  2660. assert_eq!(vm.execute_program_jit(mem).unwrap(), 0xf1f9);
  2661. }
  2662. }
  2663. #[test]
  2664. fn test_jit_stxb_chain() {
  2665. let prog = assemble(
  2666. "
  2667. mov r0, r1
  2668. ldxb r9, [r0+0]
  2669. stxb [r0+1], r9
  2670. ldxb r8, [r0+1]
  2671. stxb [r0+2], r8
  2672. ldxb r7, [r0+2]
  2673. stxb [r0+3], r7
  2674. ldxb r6, [r0+3]
  2675. stxb [r0+4], r6
  2676. ldxb r5, [r0+4]
  2677. stxb [r0+5], r5
  2678. ldxb r4, [r0+5]
  2679. stxb [r0+6], r4
  2680. ldxb r3, [r0+6]
  2681. stxb [r0+7], r3
  2682. ldxb r2, [r0+7]
  2683. stxb [r0+8], r2
  2684. ldxb r1, [r0+8]
  2685. stxb [r0+9], r1
  2686. ldxb r0, [r0+9]
  2687. exit
  2688. ",
  2689. )
  2690. .unwrap();
  2691. #[rustfmt::skip]
  2692. let mem = &mut [
  2693. 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  2694. 0x00, 0x00
  2695. ];
  2696. let mut vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  2697. vm.jit_compile().unwrap();
  2698. unsafe {
  2699. assert_eq!(vm.execute_program_jit(mem).unwrap(), 0x2a);
  2700. }
  2701. }
  2702. #[test]
  2703. fn test_jit_stxdw() {
  2704. let prog = assemble(
  2705. "
  2706. mov r2, -2005440939
  2707. lsh r2, 32
  2708. or r2, 0x44332211
  2709. stxdw [r1+2], r2
  2710. ldxdw r0, [r1+2]
  2711. exit
  2712. ",
  2713. )
  2714. .unwrap();
  2715. #[rustfmt::skip]
  2716. let mem = &mut [
  2717. 0xaa, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  2718. 0xff, 0xff, 0xcc, 0xdd
  2719. ];
  2720. let mut vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  2721. vm.jit_compile().unwrap();
  2722. unsafe {
  2723. assert_eq!(vm.execute_program_jit(mem).unwrap(), 0x8877665544332211);
  2724. }
  2725. }
  2726. #[test]
  2727. fn test_jit_stxh() {
  2728. let prog = assemble(
  2729. "
  2730. mov32 r2, 0x2211
  2731. stxh [r1+2], r2
  2732. ldxh r0, [r1+2]
  2733. exit
  2734. ",
  2735. )
  2736. .unwrap();
  2737. let mem = &mut [0xaa, 0xbb, 0xff, 0xff, 0xcc, 0xdd];
  2738. let mut vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  2739. vm.jit_compile().unwrap();
  2740. unsafe {
  2741. assert_eq!(vm.execute_program_jit(mem).unwrap(), 0x2211);
  2742. }
  2743. }
  2744. #[test]
  2745. fn test_jit_stxw() {
  2746. let prog = assemble(
  2747. "
  2748. mov32 r2, 0x44332211
  2749. stxw [r1+2], r2
  2750. ldxw r0, [r1+2]
  2751. exit
  2752. ",
  2753. )
  2754. .unwrap();
  2755. let mem = &mut [0xaa, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xcc, 0xdd];
  2756. let mut vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  2757. vm.jit_compile().unwrap();
  2758. unsafe {
  2759. assert_eq!(vm.execute_program_jit(mem).unwrap(), 0x44332211);
  2760. }
  2761. }
  2762. #[test]
  2763. fn test_jit_subnet() {
  2764. let prog = assemble(
  2765. "
  2766. mov r2, 0xe
  2767. ldxh r3, [r1+12]
  2768. jne r3, 0x81, +2
  2769. mov r2, 0x12
  2770. ldxh r3, [r1+16]
  2771. and r3, 0xffff
  2772. jne r3, 0x8, +5
  2773. add r1, r2
  2774. mov r0, 0x1
  2775. ldxw r1, [r1+16]
  2776. and r1, 0xffffff
  2777. jeq r1, 0x1a8c0, +1
  2778. mov r0, 0x0
  2779. exit
  2780. ",
  2781. )
  2782. .unwrap();
  2783. #[rustfmt::skip]
  2784. let mem = &mut [
  2785. 0x00, 0x00, 0xc0, 0x9f, 0xa0, 0x97, 0x00, 0xa0,
  2786. 0xcc, 0x3b, 0xbf, 0xfa, 0x08, 0x00, 0x45, 0x10,
  2787. 0x00, 0x3c, 0x46, 0x3c, 0x40, 0x00, 0x40, 0x06,
  2788. 0x73, 0x1c, 0xc0, 0xa8, 0x01, 0x02, 0xc0, 0xa8,
  2789. 0x01, 0x01, 0x06, 0x0e, 0x00, 0x17, 0x99, 0xc5,
  2790. 0xa0, 0xec, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x02,
  2791. 0x7d, 0x78, 0xe0, 0xa3, 0x00, 0x00, 0x02, 0x04,
  2792. 0x05, 0xb4, 0x04, 0x02, 0x08, 0x0a, 0x00, 0x9c,
  2793. 0x27, 0x24, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03,
  2794. 0x03, 0x00
  2795. ];
  2796. let mut vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  2797. vm.jit_compile().unwrap();
  2798. unsafe {
  2799. assert_eq!(vm.execute_program_jit(mem).unwrap(), 0x1);
  2800. }
  2801. }
  2802. #[rustfmt::skip]
  2803. const PROG_TCP_PORT_80: [u8;152] = [
  2804. 0x71, 0x12, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
  2805. 0x71, 0x13, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00,
  2806. 0x67, 0x03, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
  2807. 0x4f, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  2808. 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  2809. 0x55, 0x03, 0x0c, 0x00, 0x08, 0x00, 0x00, 0x00,
  2810. 0x71, 0x12, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00,
  2811. 0x55, 0x02, 0x0a, 0x00, 0x06, 0x00, 0x00, 0x00,
  2812. 0x71, 0x12, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00,
  2813. 0x07, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
  2814. 0x57, 0x02, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
  2815. 0x67, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
  2816. 0x0f, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  2817. 0x69, 0x12, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
  2818. 0x15, 0x02, 0x02, 0x00, 0x00, 0x50, 0x00, 0x00,
  2819. 0x69, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  2820. 0x55, 0x01, 0x01, 0x00, 0x00, 0x50, 0x00, 0x00,
  2821. 0xb7, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
  2822. 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  2823. ];
  2824. #[test]
  2825. fn test_jit_tcp_port80_match() {
  2826. #[rustfmt::skip]
  2827. let mem = &mut [
  2828. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x00, 0x06,
  2829. 0x07, 0x08, 0x09, 0x0a, 0x08, 0x00, 0x45, 0x00,
  2830. 0x00, 0x56, 0x00, 0x01, 0x00, 0x00, 0x40, 0x06,
  2831. 0xf9, 0x4d, 0xc0, 0xa8, 0x00, 0x01, 0xc0, 0xa8,
  2832. 0x00, 0x02, 0x27, 0x10, 0x00, 0x50, 0x00, 0x00,
  2833. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x02,
  2834. 0x20, 0x00, 0xc5, 0x18, 0x00, 0x00, 0x44, 0x44,
  2835. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  2836. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  2837. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  2838. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  2839. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  2840. 0x44, 0x44, 0x44, 0x44
  2841. ];
  2842. let prog = &PROG_TCP_PORT_80;
  2843. let mut vm = rbpf::EbpfVmRaw::new(Some(prog)).unwrap();
  2844. vm.jit_compile().unwrap();
  2845. unsafe {
  2846. assert_eq!(vm.execute_program_jit(mem).unwrap(), 0x1);
  2847. }
  2848. }
  2849. #[test]
  2850. fn test_jit_tcp_port80_nomatch() {
  2851. #[rustfmt::skip]
  2852. let mem = &mut [
  2853. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x00, 0x06,
  2854. 0x07, 0x08, 0x09, 0x0a, 0x08, 0x00, 0x45, 0x00,
  2855. 0x00, 0x56, 0x00, 0x01, 0x00, 0x00, 0x40, 0x06,
  2856. 0xf9, 0x4d, 0xc0, 0xa8, 0x00, 0x01, 0xc0, 0xa8,
  2857. 0x00, 0x02, 0x00, 0x16, 0x27, 0x10, 0x00, 0x00,
  2858. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x02,
  2859. 0x20, 0x00, 0xc5, 0x18, 0x00, 0x00, 0x44, 0x44,
  2860. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  2861. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  2862. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  2863. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  2864. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  2865. 0x44, 0x44, 0x44, 0x44
  2866. ];
  2867. let prog = &PROG_TCP_PORT_80;
  2868. let mut vm = rbpf::EbpfVmRaw::new(Some(prog)).unwrap();
  2869. vm.jit_compile().unwrap();
  2870. unsafe {
  2871. assert_eq!(vm.execute_program_jit(mem).unwrap(), 0x0);
  2872. }
  2873. }
  2874. #[test]
  2875. fn test_jit_tcp_port80_nomatch_ethertype() {
  2876. #[rustfmt::skip]
  2877. let mem = &mut [
  2878. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x00, 0x06,
  2879. 0x07, 0x08, 0x09, 0x0a, 0x08, 0x01, 0x45, 0x00,
  2880. 0x00, 0x56, 0x00, 0x01, 0x00, 0x00, 0x40, 0x06,
  2881. 0xf9, 0x4d, 0xc0, 0xa8, 0x00, 0x01, 0xc0, 0xa8,
  2882. 0x00, 0x02, 0x27, 0x10, 0x00, 0x50, 0x00, 0x00,
  2883. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x02,
  2884. 0x20, 0x00, 0xc5, 0x18, 0x00, 0x00, 0x44, 0x44,
  2885. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  2886. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  2887. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  2888. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  2889. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  2890. 0x44, 0x44, 0x44, 0x44
  2891. ];
  2892. let prog = &PROG_TCP_PORT_80;
  2893. let mut vm = rbpf::EbpfVmRaw::new(Some(prog)).unwrap();
  2894. vm.jit_compile().unwrap();
  2895. unsafe {
  2896. assert_eq!(vm.execute_program_jit(mem).unwrap(), 0x0);
  2897. }
  2898. }
  2899. #[test]
  2900. fn test_jit_tcp_port80_nomatch_proto() {
  2901. #[rustfmt::skip]
  2902. let mem = &mut [
  2903. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x00, 0x06,
  2904. 0x07, 0x08, 0x09, 0x0a, 0x08, 0x00, 0x45, 0x00,
  2905. 0x00, 0x56, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
  2906. 0xf9, 0x4d, 0xc0, 0xa8, 0x00, 0x01, 0xc0, 0xa8,
  2907. 0x00, 0x02, 0x27, 0x10, 0x00, 0x50, 0x00, 0x00,
  2908. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x02,
  2909. 0x20, 0x00, 0xc5, 0x18, 0x00, 0x00, 0x44, 0x44,
  2910. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  2911. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  2912. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  2913. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  2914. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  2915. 0x44, 0x44, 0x44, 0x44
  2916. ];
  2917. let prog = &PROG_TCP_PORT_80;
  2918. let mut vm = rbpf::EbpfVmRaw::new(Some(prog)).unwrap();
  2919. vm.jit_compile().unwrap();
  2920. unsafe {
  2921. assert_eq!(vm.execute_program_jit(mem).unwrap(), 0x0);
  2922. }
  2923. }
  2924. #[test]
  2925. fn test_jit_tcp_sack_match() {
  2926. let mut mem = TCP_SACK_MATCH.to_vec();
  2927. let prog = assemble(TCP_SACK_ASM).unwrap();
  2928. let mut vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  2929. vm.jit_compile().unwrap();
  2930. unsafe {
  2931. assert_eq!(vm.execute_program_jit(mem.as_mut_slice()).unwrap(), 0x1);
  2932. }
  2933. }
  2934. #[test]
  2935. fn test_jit_tcp_sack_nomatch() {
  2936. let mut mem = TCP_SACK_NOMATCH.to_vec();
  2937. let prog = assemble(TCP_SACK_ASM).unwrap();
  2938. let mut vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  2939. vm.jit_compile().unwrap();
  2940. unsafe {
  2941. assert_eq!(vm.execute_program_jit(mem.as_mut_slice()).unwrap(), 0x0);
  2942. }
  2943. }