ubpf_vm.rs 59 KB

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