4
0

ubpf_jit_x86_64.rs 61 KB

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