ubpf_vm.rs 53 KB

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