ubpf_jit_x86_64.rs 60 KB

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