ubpf_vm.rs 63 KB

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