ubpf_vm.rs 60 KB

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