4
0

ubpf_vm.rs 60 KB

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