ubpf_jit_x86_64.rs 46 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856
  1. // Converted from the tests for uBPF <https://github.com/iovisor/ubpf>
  2. // Copyright 2015 Big Switch Networks, Inc
  3. // Copyright 2016 6WIND S.A. <quentin.monnet@6wind.com>
  4. //
  5. // Licensed under the Apache License, Version 2.0 <http://www.apache.org/licenses/LICENSE-2.0> or
  6. // the MIT license <http://opensource.org/licenses/MIT>, at your option. This file may not be
  7. // copied, modified, or distributed except according to those terms.
  8. // The tests contained in this file are extracted from the unit tests of uBPF software. Each test
  9. // in this file has a name in the form `test_jit_<name>`, and corresponds to the (human-readable)
  10. // code in `ubpf/tree/master/tests/<name>`, available at
  11. // <https://github.com/iovisor/ubpf/tree/master/tests> (hyphen had to be replaced with underscores
  12. // as Rust will not accept them in function names). It is strongly advised to refer to the uBPF
  13. // version to understand what these program do.
  14. //
  15. // Each program was assembled from the uBPF version with the assembler provided by uBPF itself, and
  16. // available at <https://github.com/iovisor/ubpf/tree/master/ubpf>.
  17. // The very few modifications that have been realized should be indicated.
  18. // These are unit tests for the eBPF JIT compiler.
  19. #![cfg_attr(feature = "cargo-clippy", allow(unreadable_literal))]
  20. #![cfg(not(windows))]
  21. extern crate rbpf;
  22. mod common;
  23. use rbpf::helpers;
  24. use rbpf::assembler::assemble;
  25. use common::{TCP_SACK_ASM, TCP_SACK_MATCH, TCP_SACK_NOMATCH};
  26. #[test]
  27. fn test_jit_add() {
  28. let prog = assemble("
  29. mov32 r0, 0
  30. mov32 r1, 2
  31. add32 r0, 1
  32. add32 r0, r1
  33. exit").unwrap();
  34. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  35. vm.jit_compile();
  36. unsafe { assert_eq!(vm.prog_exec_jit(), 0x3); }
  37. }
  38. #[test]
  39. fn test_jit_alu64_arith() {
  40. let prog = assemble("
  41. mov r0, 0
  42. mov r1, 1
  43. mov r2, 2
  44. mov r3, 3
  45. mov r4, 4
  46. mov r5, 5
  47. mov r6, 6
  48. mov r7, 7
  49. mov r8, 8
  50. mov r9, 9
  51. add r0, 23
  52. add r0, r7
  53. sub r0, 13
  54. sub r0, r1
  55. mul r0, 7
  56. mul r0, r3
  57. div r0, 2
  58. div r0, r4
  59. exit").unwrap();
  60. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  61. vm.jit_compile();
  62. unsafe { assert_eq!(vm.prog_exec_jit(), 0x2a); }
  63. }
  64. #[test]
  65. fn test_jit_alu64_bit() {
  66. let prog = assemble("
  67. mov r0, 0
  68. mov r1, 1
  69. mov r2, 2
  70. mov r3, 3
  71. mov r4, 4
  72. mov r5, 5
  73. mov r6, 6
  74. mov r7, 7
  75. mov r8, 8
  76. or r0, r5
  77. or r0, 0xa0
  78. and r0, 0xa3
  79. mov r9, 0x91
  80. and r0, r9
  81. lsh r0, 32
  82. lsh r0, 22
  83. lsh r0, r8
  84. rsh r0, 32
  85. rsh r0, 19
  86. rsh r0, r7
  87. xor r0, 0x03
  88. xor r0, r2
  89. exit").unwrap();
  90. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  91. vm.jit_compile();
  92. unsafe { assert_eq!(vm.prog_exec_jit(), 0x11); }
  93. }
  94. #[test]
  95. fn test_jit_alu_arith() {
  96. let prog = assemble("
  97. mov32 r0, 0
  98. mov32 r1, 1
  99. mov32 r2, 2
  100. mov32 r3, 3
  101. mov32 r4, 4
  102. mov32 r5, 5
  103. mov32 r6, 6
  104. mov32 r7, 7
  105. mov32 r8, 8
  106. mov32 r9, 9
  107. add32 r0, 23
  108. add32 r0, r7
  109. sub32 r0, 13
  110. sub32 r0, r1
  111. mul32 r0, 7
  112. mul32 r0, r3
  113. div32 r0, 2
  114. div32 r0, r4
  115. exit").unwrap();
  116. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  117. vm.jit_compile();
  118. unsafe { assert_eq!(vm.prog_exec_jit(), 0x2a); }
  119. }
  120. #[test]
  121. fn test_jit_alu_bit() {
  122. let prog = assemble("
  123. mov32 r0, 0
  124. mov32 r1, 1
  125. mov32 r2, 2
  126. mov32 r3, 3
  127. mov32 r4, 4
  128. mov32 r5, 5
  129. mov32 r6, 6
  130. mov32 r7, 7
  131. mov32 r8, 8
  132. or32 r0, r5
  133. or32 r0, 0xa0
  134. and32 r0, 0xa3
  135. mov32 r9, 0x91
  136. and32 r0, r9
  137. lsh32 r0, 22
  138. lsh32 r0, r8
  139. rsh32 r0, 19
  140. rsh32 r0, r7
  141. xor32 r0, 0x03
  142. xor32 r0, r2
  143. exit").unwrap();
  144. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  145. vm.jit_compile();
  146. unsafe { assert_eq!(vm.prog_exec_jit(), 0x11); }
  147. }
  148. #[test]
  149. fn test_jit_arsh32_high_shift() {
  150. let prog = assemble("
  151. mov r0, 8
  152. lddw r1, 0x100000001
  153. arsh32 r0, r1
  154. exit").unwrap();
  155. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  156. vm.jit_compile();
  157. unsafe { assert_eq!(vm.prog_exec_jit(), 0x4); }
  158. }
  159. #[test]
  160. fn test_jit_arsh() {
  161. let prog = assemble("
  162. mov32 r0, 0xf8
  163. lsh32 r0, 28
  164. arsh32 r0, 16
  165. exit").unwrap();
  166. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  167. vm.jit_compile();
  168. unsafe { assert_eq!(vm.prog_exec_jit(), 0xffff8000); }
  169. }
  170. #[test]
  171. fn test_jit_arsh64() {
  172. let prog = assemble("
  173. mov32 r0, 1
  174. lsh r0, 63
  175. arsh r0, 55
  176. mov32 r1, 5
  177. arsh r0, r1
  178. exit").unwrap();
  179. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  180. vm.jit_compile();
  181. unsafe { assert_eq!(vm.prog_exec_jit(), 0xfffffffffffffff8); }
  182. }
  183. #[test]
  184. fn test_jit_arsh_reg() {
  185. let prog = assemble("
  186. mov32 r0, 0xf8
  187. mov32 r1, 16
  188. lsh32 r0, 28
  189. arsh32 r0, r1
  190. exit").unwrap();
  191. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  192. vm.jit_compile();
  193. unsafe { assert_eq!(vm.prog_exec_jit(), 0xffff8000); }
  194. }
  195. #[test]
  196. fn test_jit_be16() {
  197. let prog = assemble("
  198. ldxh r0, [r1]
  199. be16 r0
  200. exit").unwrap();
  201. let mem = &mut [
  202. 0x11, 0x22
  203. ];
  204. let mut vm = rbpf::EbpfVmRaw::new(&prog).unwrap();
  205. vm.jit_compile();
  206. unsafe { assert_eq!(vm.prog_exec_jit(mem), 0x1122); }
  207. }
  208. #[test]
  209. fn test_jit_be16_high() {
  210. let prog = assemble("
  211. ldxdw r0, [r1]
  212. be16 r0
  213. exit").unwrap();
  214. let mem = &mut [
  215. 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88
  216. ];
  217. let mut vm = rbpf::EbpfVmRaw::new(&prog).unwrap();
  218. vm.jit_compile();
  219. unsafe { assert_eq!(vm.prog_exec_jit(mem), 0x1122); }
  220. }
  221. #[test]
  222. fn test_jit_be32() {
  223. let prog = assemble("
  224. ldxw r0, [r1]
  225. be32 r0
  226. exit").unwrap();
  227. let mem = &mut [
  228. 0x11, 0x22, 0x33, 0x44
  229. ];
  230. let mut vm = rbpf::EbpfVmRaw::new(&prog).unwrap();
  231. vm.jit_compile();
  232. unsafe { assert_eq!(vm.prog_exec_jit(mem), 0x11223344); }
  233. }
  234. #[test]
  235. fn test_jit_be32_high() {
  236. let prog = assemble("
  237. ldxdw r0, [r1]
  238. be32 r0
  239. exit").unwrap();
  240. let mem = &mut [
  241. 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88
  242. ];
  243. let mut vm = rbpf::EbpfVmRaw::new(&prog).unwrap();
  244. vm.jit_compile();
  245. unsafe { assert_eq!(vm.prog_exec_jit(mem), 0x11223344); }
  246. }
  247. #[test]
  248. fn test_jit_be64() {
  249. let prog = assemble("
  250. ldxdw r0, [r1]
  251. be64 r0
  252. exit").unwrap();
  253. let mem = &mut [
  254. 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88
  255. ];
  256. let mut vm = rbpf::EbpfVmRaw::new(&prog).unwrap();
  257. vm.jit_compile();
  258. unsafe { assert_eq!(vm.prog_exec_jit(mem), 0x1122334455667788); }
  259. }
  260. #[test]
  261. fn test_jit_call() {
  262. let prog = assemble("
  263. mov r1, 1
  264. mov r2, 2
  265. mov r3, 3
  266. mov r4, 4
  267. mov r5, 5
  268. call 0
  269. exit").unwrap();
  270. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  271. vm.register_helper(0, helpers::gather_bytes);
  272. vm.jit_compile();
  273. unsafe { assert_eq!(vm.prog_exec_jit(), 0x0102030405); }
  274. }
  275. #[test]
  276. fn test_jit_call_memfrob() {
  277. let prog = assemble("
  278. mov r6, r1
  279. add r1, 2
  280. mov r2, 4
  281. call 1
  282. ldxdw r0, [r6]
  283. be64 r0
  284. exit").unwrap();
  285. let mem = &mut [
  286. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08
  287. ];
  288. let mut vm = rbpf::EbpfVmRaw::new(&prog).unwrap();
  289. vm.register_helper(1, helpers::memfrob);
  290. vm.jit_compile();
  291. unsafe { assert_eq!(vm.prog_exec_jit(mem), 0x102292e2f2c0708); }
  292. }
  293. // TODO: helpers::trash_registers needs asm!().
  294. // Try this again once asm!() is available in stable.
  295. //#[test]
  296. //fn test_jit_call_save() {
  297. //let prog = &[
  298. //0xb7, 0x06, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
  299. //0xb7, 0x07, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
  300. //0xb7, 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
  301. //0xb7, 0x09, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,
  302. //0x85, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
  303. //0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  304. //0x4f, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  305. //0x4f, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  306. //0x4f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  307. //0x4f, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  308. //0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  309. //];
  310. //let mut vm = rbpf::EbpfVmNoData::new(prog).unwrap();
  311. //vm.register_helper(2, helpers::trash_registers);
  312. //vm.jit_compile();
  313. //unsafe { assert_eq!(vm.prog_exec_jit(), 0x4321); }
  314. //}
  315. #[test]
  316. fn test_jit_div32_high_divisor() {
  317. let prog = assemble("
  318. mov r0, 12
  319. lddw r1, 0x100000004
  320. div32 r0, r1
  321. exit").unwrap();
  322. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  323. vm.jit_compile();
  324. unsafe { assert_eq!(vm.prog_exec_jit(), 0x3); }
  325. }
  326. #[test]
  327. fn test_jit_div32_imm() {
  328. let prog = assemble("
  329. lddw r0, 0x10000000c
  330. div32 r0, 4
  331. exit").unwrap();
  332. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  333. vm.jit_compile();
  334. unsafe { assert_eq!(vm.prog_exec_jit(), 0x3); }
  335. }
  336. #[test]
  337. fn test_jit_div32_reg() {
  338. let prog = assemble("
  339. lddw r0, 0x10000000c
  340. mov r1, 4
  341. div32 r0, r1
  342. exit").unwrap();
  343. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  344. vm.jit_compile();
  345. unsafe { assert_eq!(vm.prog_exec_jit(), 0x3); }
  346. }
  347. #[test]
  348. fn test_jit_div64_imm() {
  349. let prog = assemble("
  350. mov r0, 0xc
  351. lsh r0, 32
  352. div r0, 4
  353. exit").unwrap();
  354. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  355. vm.jit_compile();
  356. unsafe { assert_eq!(vm.prog_exec_jit(), 0x300000000); }
  357. }
  358. #[test]
  359. fn test_jit_div64_reg() {
  360. let prog = assemble("
  361. mov r0, 0xc
  362. lsh r0, 32
  363. mov r1, 4
  364. div r0, r1
  365. exit").unwrap();
  366. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  367. vm.jit_compile();
  368. unsafe { assert_eq!(vm.prog_exec_jit(), 0x300000000); }
  369. }
  370. #[test]
  371. fn test_jit_early_exit() {
  372. let prog = assemble("
  373. mov r0, 3
  374. exit
  375. mov r0, 4
  376. exit").unwrap();
  377. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  378. vm.jit_compile();
  379. unsafe { assert_eq!(vm.prog_exec_jit(), 0x3); }
  380. }
  381. // uBPF limits the number of user functions at 64. We don't.
  382. //#[test]
  383. //fn test_jit_err_call_bad_imm() {
  384. //}
  385. #[test]
  386. #[should_panic(expected = "[JIT] Error: unknown helper function (id: 0x3f)")]
  387. fn test_jit_err_call_unreg() {
  388. let prog = assemble("
  389. mov r1, 1
  390. mov r2, 2
  391. mov r3, 3
  392. mov r4, 4
  393. mov r5, 5
  394. call 63
  395. exit").unwrap();
  396. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  397. vm.jit_compile();
  398. unsafe { vm.prog_exec_jit(); }
  399. }
  400. // TODO: Should panic!() instead, but I could not make it panic in JIT-compiled code, so the
  401. // program returns -1 instead. We can make it write on stderr, though.
  402. #[test]
  403. //#[should_panic(expected = "[JIT] Error: division by 0")]
  404. fn test_jit_err_div64_by_zero_reg() {
  405. let prog = assemble("
  406. mov32 r0, 1
  407. mov32 r1, 0
  408. div r0, r1
  409. exit").unwrap();
  410. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  411. vm.jit_compile();
  412. unsafe { assert_eq!(vm.prog_exec_jit(), 0xffffffffffffffff); }
  413. }
  414. // TODO: Same remark as above
  415. #[test]
  416. //#[should_panic(expected = "[JIT] Error: division by 0")]
  417. fn test_jit_err_div_by_zero_reg() {
  418. let prog = assemble("
  419. mov32 r0, 1
  420. mov32 r1, 0
  421. div32 r0, r1
  422. exit").unwrap();
  423. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  424. vm.jit_compile();
  425. unsafe { assert_eq!(vm.prog_exec_jit(), 0xffffffffffffffff); }
  426. }
  427. // TODO: Same remark as above
  428. #[test]
  429. //#[should_panic(expected = "[JIT] Error: division by 0")]
  430. fn test_jit_err_mod64_by_zero_reg() {
  431. let prog = assemble("
  432. mov32 r0, 1
  433. mov32 r1, 0
  434. mod r0, r1
  435. exit").unwrap();
  436. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  437. vm.jit_compile();
  438. unsafe { assert_eq!(vm.prog_exec_jit(), 0xffffffffffffffff); }
  439. }
  440. // TODO: Same remark as above
  441. #[test]
  442. //#[should_panic(expected = "[JIT] Error: division by 0")]
  443. fn test_jit_err_mod_by_zero_reg() {
  444. let prog = assemble("
  445. mov32 r0, 1
  446. mov32 r1, 0
  447. mod32 r0, r1
  448. exit").unwrap();
  449. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  450. vm.jit_compile();
  451. unsafe { assert_eq!(vm.prog_exec_jit(), 0xffffffffffffffff); }
  452. }
  453. // TODO SKIP: JIT disabled for this testcase (stack oob check not implemented)
  454. // #[test]
  455. // #[should_panic(expected = "Error: out of bounds memory store (insn #1)")]
  456. // fn test_jit_err_stack_out_of_bound() {
  457. // let prog = &[
  458. // 0x72, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  459. // 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  460. // ];
  461. // let mut vm = rbpf::EbpfVmNoData::new(prog).unwrap();
  462. // vm.jit_compile();
  463. // unsafe { vm.prog_exec_jit(); }
  464. // }
  465. #[test]
  466. fn test_jit_exit() {
  467. let prog = assemble("
  468. mov r0, 0
  469. exit").unwrap();
  470. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  471. vm.jit_compile();
  472. unsafe { assert_eq!(vm.prog_exec_jit(), 0x0); }
  473. }
  474. #[test]
  475. fn test_jit_ja() {
  476. let prog = assemble("
  477. mov r0, 1
  478. ja +1
  479. mov r0, 2
  480. exit").unwrap();
  481. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  482. vm.jit_compile();
  483. unsafe { assert_eq!(vm.prog_exec_jit(), 0x1); }
  484. }
  485. #[test]
  486. fn test_jit_jeq_imm() {
  487. let prog = assemble("
  488. mov32 r0, 0
  489. mov32 r1, 0xa
  490. jeq r1, 0xb, +4
  491. mov32 r0, 1
  492. mov32 r1, 0xb
  493. jeq r1, 0xb, +1
  494. mov32 r0, 2
  495. exit").unwrap();
  496. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  497. vm.jit_compile();
  498. unsafe { assert_eq!(vm.prog_exec_jit(), 0x1); }
  499. }
  500. #[test]
  501. fn test_jit_jeq_reg() {
  502. let prog = assemble("
  503. mov32 r0, 0
  504. mov32 r1, 0xa
  505. mov32 r2, 0xb
  506. jeq r1, r2, +4
  507. mov32 r0, 1
  508. mov32 r1, 0xb
  509. jeq r1, r2, +1
  510. mov32 r0, 2
  511. exit").unwrap();
  512. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  513. vm.jit_compile();
  514. unsafe { assert_eq!(vm.prog_exec_jit(), 0x1); }
  515. }
  516. #[test]
  517. fn test_jit_jge_imm() {
  518. let prog = assemble("
  519. mov32 r0, 0
  520. mov32 r1, 0xa
  521. jge r1, 0xb, +4
  522. mov32 r0, 1
  523. mov32 r1, 0xc
  524. jge r1, 0xb, +1
  525. mov32 r0, 2
  526. exit").unwrap();
  527. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  528. vm.jit_compile();
  529. unsafe { assert_eq!(vm.prog_exec_jit(), 0x1); }
  530. }
  531. #[test]
  532. fn test_jit_jle_imm() {
  533. let prog = assemble("
  534. mov32 r0, 0
  535. mov32 r1, 5
  536. jle r1, 4, +1
  537. jle r1, 6, +1
  538. exit
  539. jle r1, 5, +1
  540. exit
  541. mov32 r0, 1
  542. exit").unwrap();
  543. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  544. vm.jit_compile();
  545. unsafe { assert_eq!(vm.prog_exec_jit(), 0x1); }
  546. }
  547. #[test]
  548. fn test_jit_jle_reg() {
  549. let prog = assemble("
  550. mov r0, 0
  551. mov r1, 5
  552. mov r2, 4
  553. mov r3, 6
  554. jle r1, r2, +2
  555. jle r1, r1, +1
  556. exit
  557. jle r1, r3, +1
  558. exit
  559. mov r0, 1
  560. exit").unwrap();
  561. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  562. vm.jit_compile();
  563. unsafe { assert_eq!(vm.prog_exec_jit(), 0x1); }
  564. }
  565. #[test]
  566. fn test_jit_jgt_imm() {
  567. let prog = assemble("
  568. mov32 r0, 0
  569. mov32 r1, 5
  570. jgt r1, 6, +2
  571. jgt r1, 5, +1
  572. jgt r1, 4, +1
  573. exit
  574. mov32 r0, 1
  575. exit").unwrap();
  576. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  577. vm.jit_compile();
  578. unsafe { assert_eq!(vm.prog_exec_jit(), 0x1); }
  579. }
  580. #[test]
  581. fn test_jit_jgt_reg() {
  582. let prog = assemble("
  583. mov r0, 0
  584. mov r1, 5
  585. mov r2, 6
  586. mov r3, 4
  587. jgt r1, r2, +2
  588. jgt r1, r1, +1
  589. jgt r1, r3, +1
  590. exit
  591. mov r0, 1
  592. exit").unwrap();
  593. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  594. vm.jit_compile();
  595. unsafe { assert_eq!(vm.prog_exec_jit(), 0x1); }
  596. }
  597. #[test]
  598. fn test_jit_jlt_imm() {
  599. let prog = assemble("
  600. mov32 r0, 0
  601. mov32 r1, 5
  602. jlt r1, 4, +2
  603. jlt r1, 5, +1
  604. jlt r1, 6, +1
  605. exit
  606. mov32 r0, 1
  607. exit").unwrap();
  608. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  609. vm.jit_compile();
  610. unsafe { assert_eq!(vm.prog_exec_jit(), 0x1); }
  611. }
  612. #[test]
  613. fn test_jit_jlt_reg() {
  614. let prog = assemble("
  615. mov r0, 0
  616. mov r1, 5
  617. mov r2, 4
  618. mov r3, 6
  619. jlt r1, r2, +2
  620. jlt r1, r1, +1
  621. jlt r1, r3, +1
  622. exit
  623. mov r0, 1
  624. exit").unwrap();
  625. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  626. vm.jit_compile();
  627. unsafe { assert_eq!(vm.prog_exec_jit(), 0x1); }
  628. }
  629. #[test]
  630. fn test_jit_jit_bounce() {
  631. let prog = assemble("
  632. mov r0, 1
  633. mov r6, r0
  634. mov r7, r6
  635. mov r8, r7
  636. mov r9, r8
  637. mov r0, r9
  638. exit").unwrap();
  639. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  640. vm.jit_compile();
  641. unsafe { assert_eq!(vm.prog_exec_jit(), 0x1); }
  642. }
  643. #[test]
  644. fn test_jit_jne_reg() {
  645. let prog = assemble("
  646. mov32 r0, 0
  647. mov32 r1, 0xb
  648. mov32 r2, 0xb
  649. jne r1, r2, +4
  650. mov32 r0, 1
  651. mov32 r1, 0xa
  652. jne r1, r2, +1
  653. mov32 r0, 2
  654. exit").unwrap();
  655. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  656. vm.jit_compile();
  657. unsafe { assert_eq!(vm.prog_exec_jit(), 0x1); }
  658. }
  659. #[test]
  660. fn test_jit_jset_imm() {
  661. let prog = assemble("
  662. mov32 r0, 0
  663. mov32 r1, 0x7
  664. jset r1, 0x8, +4
  665. mov32 r0, 1
  666. mov32 r1, 0x9
  667. jset r1, 0x8, +1
  668. mov32 r0, 2
  669. exit").unwrap();
  670. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  671. vm.jit_compile();
  672. unsafe { assert_eq!(vm.prog_exec_jit(), 0x1); }
  673. }
  674. #[test]
  675. fn test_jit_jset_reg() {
  676. let prog = assemble("
  677. mov32 r0, 0
  678. mov32 r1, 0x7
  679. mov32 r2, 0x8
  680. jset r1, r2, +4
  681. mov32 r0, 1
  682. mov32 r1, 0x9
  683. jset r1, r2, +1
  684. mov32 r0, 2
  685. exit").unwrap();
  686. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  687. vm.jit_compile();
  688. unsafe { assert_eq!(vm.prog_exec_jit(), 0x1); }
  689. }
  690. #[test]
  691. fn test_jit_jsge_imm() {
  692. let prog = assemble("
  693. mov32 r0, 0
  694. mov r1, -2
  695. jsge r1, -1, +5
  696. jsge r1, 0, +4
  697. mov32 r0, 1
  698. mov r1, -1
  699. jsge r1, -1, +1
  700. mov32 r0, 2
  701. exit").unwrap();
  702. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  703. vm.jit_compile();
  704. unsafe { assert_eq!(vm.prog_exec_jit(), 0x1); }
  705. }
  706. #[test]
  707. fn test_jit_jsge_reg() {
  708. let prog = assemble("
  709. mov32 r0, 0
  710. mov r1, -2
  711. mov r2, -1
  712. mov32 r3, 0
  713. jsge r1, r2, +5
  714. jsge r1, r3, +4
  715. mov32 r0, 1
  716. mov r1, r2
  717. jsge r1, r2, +1
  718. mov32 r0, 2
  719. exit").unwrap();
  720. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  721. vm.jit_compile();
  722. unsafe { assert_eq!(vm.prog_exec_jit(), 0x1); }
  723. }
  724. #[test]
  725. fn test_jit_jsle_imm() {
  726. let prog = assemble("
  727. mov32 r0, 0
  728. mov r1, -2
  729. jsle r1, -3, +1
  730. jsle r1, -1, +1
  731. exit
  732. mov32 r0, 1
  733. jsle r1, -2, +1
  734. mov32 r0, 2
  735. exit").unwrap();
  736. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  737. vm.jit_compile();
  738. unsafe { assert_eq!(vm.prog_exec_jit(), 0x1); }
  739. }
  740. #[test]
  741. fn test_jit_jsle_reg() {
  742. let prog = assemble("
  743. mov32 r0, 0
  744. mov r1, -1
  745. mov r2, -2
  746. mov32 r3, 0
  747. jsle r1, r2, +1
  748. jsle r1, r3, +1
  749. exit
  750. mov32 r0, 1
  751. mov r1, r2
  752. jsle r1, r2, +1
  753. mov32 r0, 2
  754. exit").unwrap();
  755. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  756. vm.jit_compile();
  757. unsafe { assert_eq!(vm.prog_exec_jit(), 0x1); }
  758. }
  759. #[test]
  760. fn test_jit_jsgt_imm() {
  761. let prog = assemble("
  762. mov32 r0, 0
  763. mov r1, -2
  764. jsgt r1, -1, +4
  765. mov32 r0, 1
  766. mov32 r1, 0
  767. jsgt r1, -1, +1
  768. mov32 r0, 2
  769. exit").unwrap();
  770. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  771. vm.jit_compile();
  772. unsafe { assert_eq!(vm.prog_exec_jit(), 0x1); }
  773. }
  774. #[test]
  775. fn test_jit_jsgt_reg() {
  776. let prog = assemble("
  777. mov32 r0, 0
  778. mov r1, -2
  779. mov r2, -1
  780. jsgt r1, r2, +4
  781. mov32 r0, 1
  782. mov32 r1, 0
  783. jsgt r1, r2, +1
  784. mov32 r0, 2
  785. exit").unwrap();
  786. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  787. vm.jit_compile();
  788. unsafe { assert_eq!(vm.prog_exec_jit(), 0x1); }
  789. }
  790. #[test]
  791. fn test_jit_jslt_imm() {
  792. let prog = assemble("
  793. mov32 r0, 0
  794. mov r1, -2
  795. jslt r1, -3, +2
  796. jslt r1, -2, +1
  797. jslt r1, -1, +1
  798. exit
  799. mov32 r0, 1
  800. exit").unwrap();
  801. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  802. vm.jit_compile();
  803. unsafe { assert_eq!(vm.prog_exec_jit(), 0x1); }
  804. }
  805. #[test]
  806. fn test_jit_jslt_reg() {
  807. let prog = assemble("
  808. mov32 r0, 0
  809. mov r1, -2
  810. mov r2, -3
  811. mov r3, -1
  812. jslt r1, r1, +2
  813. jslt r1, r2, +1
  814. jslt r1, r3, +1
  815. exit
  816. mov32 r0, 1
  817. exit").unwrap();
  818. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  819. vm.jit_compile();
  820. unsafe { assert_eq!(vm.prog_exec_jit(), 0x1); }
  821. }
  822. #[test]
  823. fn test_jit_lddw() {
  824. let prog = assemble("
  825. lddw r0, 0x1122334455667788
  826. exit").unwrap();
  827. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  828. vm.jit_compile();
  829. unsafe { assert_eq!(vm.prog_exec_jit(), 0x1122334455667788); }
  830. }
  831. #[test]
  832. fn test_jit_lddw2() {
  833. let prog = assemble("
  834. lddw r0, 0x0000000080000000
  835. exit").unwrap();
  836. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  837. vm.jit_compile();
  838. unsafe { assert_eq!(vm.prog_exec_jit(), 0x80000000); }
  839. }
  840. #[test]
  841. fn test_jit_ldxb_all() {
  842. let prog = assemble("
  843. mov r0, r1
  844. ldxb r9, [r0+0]
  845. lsh r9, 0
  846. ldxb r8, [r0+1]
  847. lsh r8, 4
  848. ldxb r7, [r0+2]
  849. lsh r7, 8
  850. ldxb r6, [r0+3]
  851. lsh r6, 12
  852. ldxb r5, [r0+4]
  853. lsh r5, 16
  854. ldxb r4, [r0+5]
  855. lsh r4, 20
  856. ldxb r3, [r0+6]
  857. lsh r3, 24
  858. ldxb r2, [r0+7]
  859. lsh r2, 28
  860. ldxb r1, [r0+8]
  861. lsh r1, 32
  862. ldxb r0, [r0+9]
  863. lsh r0, 36
  864. or r0, r1
  865. or r0, r2
  866. or r0, r3
  867. or r0, r4
  868. or r0, r5
  869. or r0, r6
  870. or r0, r7
  871. or r0, r8
  872. or r0, r9
  873. exit").unwrap();
  874. let mem = &mut [
  875. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
  876. 0x08, 0x09
  877. ];
  878. let mut vm = rbpf::EbpfVmRaw::new(&prog).unwrap();
  879. vm.jit_compile();
  880. unsafe { assert_eq!(vm.prog_exec_jit(mem), 0x9876543210); }
  881. }
  882. #[test]
  883. fn test_jit_ldxb() {
  884. let prog = assemble("
  885. ldxb r0, [r1+2]
  886. exit").unwrap();
  887. let mem = &mut [
  888. 0xaa, 0xbb, 0x11, 0xcc, 0xdd
  889. ];
  890. let mut vm = rbpf::EbpfVmRaw::new(&prog).unwrap();
  891. vm.jit_compile();
  892. unsafe { assert_eq!(vm.prog_exec_jit(mem), 0x11); }
  893. }
  894. #[test]
  895. fn test_jit_ldxdw() {
  896. let prog = assemble("
  897. ldxdw r0, [r1+2]
  898. exit").unwrap();
  899. let mem = &mut [
  900. 0xaa, 0xbb, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66,
  901. 0x77, 0x88, 0xcc, 0xdd
  902. ];
  903. let mut vm = rbpf::EbpfVmRaw::new(&prog).unwrap();
  904. vm.jit_compile();
  905. unsafe { assert_eq!(vm.prog_exec_jit(mem), 0x8877665544332211); }
  906. }
  907. #[test]
  908. fn test_jit_ldxh_all() {
  909. let prog = assemble("
  910. mov r0, r1
  911. ldxh r9, [r0+0]
  912. be16 r9
  913. lsh r9, 0
  914. ldxh r8, [r0+2]
  915. be16 r8
  916. lsh r8, 4
  917. ldxh r7, [r0+4]
  918. be16 r7
  919. lsh r7, 8
  920. ldxh r6, [r0+6]
  921. be16 r6
  922. lsh r6, 12
  923. ldxh r5, [r0+8]
  924. be16 r5
  925. lsh r5, 16
  926. ldxh r4, [r0+10]
  927. be16 r4
  928. lsh r4, 20
  929. ldxh r3, [r0+12]
  930. be16 r3
  931. lsh r3, 24
  932. ldxh r2, [r0+14]
  933. be16 r2
  934. lsh r2, 28
  935. ldxh r1, [r0+16]
  936. be16 r1
  937. lsh r1, 32
  938. ldxh r0, [r0+18]
  939. be16 r0
  940. lsh r0, 36
  941. or r0, r1
  942. or r0, r2
  943. or r0, r3
  944. or r0, r4
  945. or r0, r5
  946. or r0, r6
  947. or r0, r7
  948. or r0, r8
  949. or r0, r9
  950. exit").unwrap();
  951. let mem = &mut [
  952. 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03,
  953. 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07,
  954. 0x00, 0x08, 0x00, 0x09
  955. ];
  956. let mut vm = rbpf::EbpfVmRaw::new(&prog).unwrap();
  957. vm.jit_compile();
  958. unsafe { assert_eq!(vm.prog_exec_jit(mem), 0x9876543210); }
  959. }
  960. #[test]
  961. fn test_jit_ldxh_all2() {
  962. let prog = assemble("
  963. mov r0, r1
  964. ldxh r9, [r0+0]
  965. be16 r9
  966. ldxh r8, [r0+2]
  967. be16 r8
  968. ldxh r7, [r0+4]
  969. be16 r7
  970. ldxh r6, [r0+6]
  971. be16 r6
  972. ldxh r5, [r0+8]
  973. be16 r5
  974. ldxh r4, [r0+10]
  975. be16 r4
  976. ldxh r3, [r0+12]
  977. be16 r3
  978. ldxh r2, [r0+14]
  979. be16 r2
  980. ldxh r1, [r0+16]
  981. be16 r1
  982. ldxh r0, [r0+18]
  983. be16 r0
  984. or r0, r1
  985. or r0, r2
  986. or r0, r3
  987. or r0, r4
  988. or r0, r5
  989. or r0, r6
  990. or r0, r7
  991. or r0, r8
  992. or r0, r9
  993. exit").unwrap();
  994. let mem = &mut [
  995. 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08,
  996. 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80,
  997. 0x01, 0x00, 0x02, 0x00
  998. ];
  999. let mut vm = rbpf::EbpfVmRaw::new(&prog).unwrap();
  1000. vm.jit_compile();
  1001. unsafe { assert_eq!(vm.prog_exec_jit(mem), 0x3ff); }
  1002. }
  1003. #[test]
  1004. fn test_jit_ldxh() {
  1005. let prog = assemble("
  1006. ldxh r0, [r1+2]
  1007. exit").unwrap();
  1008. let mem = &mut [
  1009. 0xaa, 0xbb, 0x11, 0x22, 0xcc, 0xdd
  1010. ];
  1011. let mut vm = rbpf::EbpfVmRaw::new(&prog).unwrap();
  1012. vm.jit_compile();
  1013. unsafe { assert_eq!(vm.prog_exec_jit(mem), 0x2211); }
  1014. }
  1015. #[test]
  1016. fn test_jit_ldxh_same_reg() {
  1017. let prog = assemble("
  1018. mov r0, r1
  1019. sth [r0], 0x1234
  1020. ldxh r0, [r0]
  1021. exit").unwrap();
  1022. let mem = &mut [
  1023. 0xff, 0xff
  1024. ];
  1025. let mut vm = rbpf::EbpfVmRaw::new(&prog).unwrap();
  1026. vm.jit_compile();
  1027. unsafe { assert_eq!(vm.prog_exec_jit(mem), 0x1234); }
  1028. }
  1029. #[test]
  1030. fn test_jit_ldxw_all() {
  1031. let prog = assemble("
  1032. mov r0, r1
  1033. ldxw r9, [r0+0]
  1034. be32 r9
  1035. ldxw r8, [r0+4]
  1036. be32 r8
  1037. ldxw r7, [r0+8]
  1038. be32 r7
  1039. ldxw r6, [r0+12]
  1040. be32 r6
  1041. ldxw r5, [r0+16]
  1042. be32 r5
  1043. ldxw r4, [r0+20]
  1044. be32 r4
  1045. ldxw r3, [r0+24]
  1046. be32 r3
  1047. ldxw r2, [r0+28]
  1048. be32 r2
  1049. ldxw r1, [r0+32]
  1050. be32 r1
  1051. ldxw r0, [r0+36]
  1052. be32 r0
  1053. or r0, r1
  1054. or r0, r2
  1055. or r0, r3
  1056. or r0, r4
  1057. or r0, r5
  1058. or r0, r6
  1059. or r0, r7
  1060. or r0, r8
  1061. or r0, r9
  1062. exit").unwrap();
  1063. let mem = &mut [
  1064. 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
  1065. 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08,
  1066. 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00,
  1067. 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00,
  1068. 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00
  1069. ];
  1070. let mut vm = rbpf::EbpfVmRaw::new(&prog).unwrap();
  1071. vm.jit_compile();
  1072. unsafe { assert_eq!(vm.prog_exec_jit(mem), 0x030f0f); }
  1073. }
  1074. #[test]
  1075. fn test_jit_ldxw() {
  1076. let prog = assemble("
  1077. ldxw r0, [r1+2]
  1078. exit").unwrap();
  1079. let mem = &mut [
  1080. 0xaa, 0xbb, 0x11, 0x22, 0x33, 0x44, 0xcc, 0xdd
  1081. ];
  1082. let mut vm = rbpf::EbpfVmRaw::new(&prog).unwrap();
  1083. vm.jit_compile();
  1084. unsafe { assert_eq!(vm.prog_exec_jit(mem), 0x44332211); }
  1085. }
  1086. #[test]
  1087. fn test_jit_le16() {
  1088. let prog = assemble("
  1089. ldxh r0, [r1]
  1090. le16 r0
  1091. exit").unwrap();
  1092. let mem = &mut [
  1093. 0x22, 0x11
  1094. ];
  1095. let mut vm = rbpf::EbpfVmRaw::new(&prog).unwrap();
  1096. vm.jit_compile();
  1097. unsafe { assert_eq!(vm.prog_exec_jit(mem), 0x1122); }
  1098. }
  1099. #[test]
  1100. fn test_jit_le32() {
  1101. let prog = assemble("
  1102. ldxw r0, [r1]
  1103. le32 r0
  1104. exit").unwrap();
  1105. let mem = &mut [
  1106. 0x44, 0x33, 0x22, 0x11
  1107. ];
  1108. let mut vm = rbpf::EbpfVmRaw::new(&prog).unwrap();
  1109. vm.jit_compile();
  1110. unsafe { assert_eq!(vm.prog_exec_jit(mem), 0x11223344); }
  1111. }
  1112. #[test]
  1113. fn test_jit_le64() {
  1114. let prog = assemble("
  1115. ldxdw r0, [r1]
  1116. le64 r0
  1117. exit").unwrap();
  1118. let mem = &mut [
  1119. 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11
  1120. ];
  1121. let mut vm = rbpf::EbpfVmRaw::new(&prog).unwrap();
  1122. vm.jit_compile();
  1123. unsafe { assert_eq!(vm.prog_exec_jit(mem), 0x1122334455667788); }
  1124. }
  1125. #[test]
  1126. fn test_jit_lsh_reg() {
  1127. let prog = assemble("
  1128. mov r0, 0x1
  1129. mov r7, 4
  1130. lsh r0, r7
  1131. exit").unwrap();
  1132. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  1133. vm.jit_compile();
  1134. unsafe { assert_eq!(vm.prog_exec_jit(), 0x10); }
  1135. }
  1136. #[test]
  1137. fn test_jit_mod() {
  1138. let prog = assemble("
  1139. mov32 r0, 5748
  1140. mod32 r0, 92
  1141. mov32 r1, 13
  1142. mod32 r0, r1
  1143. exit").unwrap();
  1144. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  1145. vm.jit_compile();
  1146. unsafe { assert_eq!(vm.prog_exec_jit(), 0x5); }
  1147. }
  1148. #[test]
  1149. fn test_jit_mod32() {
  1150. let prog = assemble("
  1151. lddw r0, 0x100000003
  1152. mod32 r0, 3
  1153. exit").unwrap();
  1154. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  1155. vm.jit_compile();
  1156. unsafe { assert_eq!(vm.prog_exec_jit(), 0x0); }
  1157. }
  1158. #[test]
  1159. fn test_jit_mod64() {
  1160. let prog = assemble("
  1161. mov32 r0, -1316649930
  1162. lsh r0, 32
  1163. or r0, 0x100dc5c8
  1164. mov32 r1, 0xdde263e
  1165. lsh r1, 32
  1166. or r1, 0x3cbef7f3
  1167. mod r0, r1
  1168. mod r0, 0x658f1778
  1169. exit").unwrap();
  1170. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  1171. vm.jit_compile();
  1172. unsafe { assert_eq!(vm.prog_exec_jit(), 0x30ba5a04); }
  1173. }
  1174. #[test]
  1175. fn test_jit_mov() {
  1176. let prog = assemble("
  1177. mov32 r1, 1
  1178. mov32 r0, r1
  1179. exit").unwrap();
  1180. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  1181. vm.jit_compile();
  1182. unsafe { assert_eq!(vm.prog_exec_jit(), 0x1); }
  1183. }
  1184. #[test]
  1185. fn test_jit_mul32_imm() {
  1186. let prog = assemble("
  1187. mov r0, 3
  1188. mul32 r0, 4
  1189. exit").unwrap();
  1190. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  1191. vm.jit_compile();
  1192. unsafe { assert_eq!(vm.prog_exec_jit(), 0xc); }
  1193. }
  1194. #[test]
  1195. fn test_jit_mul32_reg() {
  1196. let prog = assemble("
  1197. mov r0, 3
  1198. mov r1, 4
  1199. mul32 r0, r1
  1200. exit").unwrap();
  1201. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  1202. vm.jit_compile();
  1203. unsafe { assert_eq!(vm.prog_exec_jit(), 0xc); }
  1204. }
  1205. #[test]
  1206. fn test_jit_mul32_reg_overflow() {
  1207. let prog = assemble("
  1208. mov r0, 0x40000001
  1209. mov r1, 4
  1210. mul32 r0, r1
  1211. exit").unwrap();
  1212. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  1213. vm.jit_compile();
  1214. unsafe { assert_eq!(vm.prog_exec_jit(), 0x4); }
  1215. }
  1216. #[test]
  1217. fn test_jit_mul64_imm() {
  1218. let prog = assemble("
  1219. mov r0, 0x40000001
  1220. mul r0, 4
  1221. exit").unwrap();
  1222. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  1223. vm.jit_compile();
  1224. unsafe { assert_eq!(vm.prog_exec_jit(), 0x100000004); }
  1225. }
  1226. #[test]
  1227. fn test_jit_mul64_reg() {
  1228. let prog = assemble("
  1229. mov r0, 0x40000001
  1230. mov r1, 4
  1231. mul r0, r1
  1232. exit").unwrap();
  1233. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  1234. vm.jit_compile();
  1235. unsafe { assert_eq!(vm.prog_exec_jit(), 0x100000004); }
  1236. }
  1237. #[test]
  1238. fn test_jit_mul_loop() {
  1239. let prog = assemble("
  1240. mov r0, 0x7
  1241. add r1, 0xa
  1242. lsh r1, 0x20
  1243. rsh r1, 0x20
  1244. jeq r1, 0x0, +4
  1245. mov r0, 0x7
  1246. mul r0, 0x7
  1247. add r1, -1
  1248. jne r1, 0x0, -3
  1249. exit").unwrap();
  1250. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  1251. vm.jit_compile();
  1252. unsafe { assert_eq!(vm.prog_exec_jit(), 0x75db9c97); }
  1253. }
  1254. #[test]
  1255. fn test_jit_neg64() {
  1256. let prog = assemble("
  1257. mov32 r0, 2
  1258. neg r0
  1259. exit").unwrap();
  1260. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  1261. vm.jit_compile();
  1262. unsafe { assert_eq!(vm.prog_exec_jit(), 0xfffffffffffffffe); }
  1263. }
  1264. #[test]
  1265. fn test_jit_neg() {
  1266. let prog = assemble("
  1267. mov32 r0, 2
  1268. neg32 r0
  1269. exit").unwrap();
  1270. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  1271. vm.jit_compile();
  1272. unsafe { assert_eq!(vm.prog_exec_jit(), 0xfffffffe); }
  1273. }
  1274. #[test]
  1275. fn test_jit_prime() {
  1276. let prog = assemble("
  1277. mov r1, 67
  1278. mov r0, 0x1
  1279. mov r2, 0x2
  1280. jgt r1, 0x2, +4
  1281. ja +10
  1282. add r2, 0x1
  1283. mov r0, 0x1
  1284. jge r2, r1, +7
  1285. mov r3, r1
  1286. div r3, r2
  1287. mul r3, r2
  1288. mov r4, r1
  1289. sub r4, r3
  1290. mov r0, 0x0
  1291. jne r4, 0x0, -10
  1292. exit").unwrap();
  1293. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  1294. vm.jit_compile();
  1295. unsafe { assert_eq!(vm.prog_exec_jit(), 0x1); }
  1296. }
  1297. #[test]
  1298. fn test_jit_rhs32() {
  1299. let prog = assemble("
  1300. xor r0, r0
  1301. sub r0, 1
  1302. rsh32 r0, 8
  1303. exit").unwrap();
  1304. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  1305. vm.jit_compile();
  1306. unsafe { assert_eq!(vm.prog_exec_jit(), 0x00ffffff); }
  1307. }
  1308. #[test]
  1309. fn test_jit_rsh_reg() {
  1310. let prog = assemble("
  1311. mov r0, 0x10
  1312. mov r7, 4
  1313. rsh r0, r7
  1314. exit").unwrap();
  1315. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  1316. vm.jit_compile();
  1317. unsafe { assert_eq!(vm.prog_exec_jit(), 0x1); }
  1318. }
  1319. #[test]
  1320. fn test_jit_stack() {
  1321. let prog = assemble("
  1322. mov r1, 51
  1323. stdw [r10-16], 0xab
  1324. stdw [r10-8], 0xcd
  1325. and r1, 1
  1326. lsh r1, 3
  1327. mov r2, r10
  1328. add r2, r1
  1329. ldxdw r0, [r2-16]
  1330. exit").unwrap();
  1331. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  1332. vm.jit_compile();
  1333. unsafe { assert_eq!(vm.prog_exec_jit(), 0xcd); }
  1334. }
  1335. #[test]
  1336. fn test_jit_stack2() {
  1337. let prog = assemble("
  1338. stb [r10-4], 0x01
  1339. stb [r10-3], 0x02
  1340. stb [r10-2], 0x03
  1341. stb [r10-1], 0x04
  1342. mov r1, r10
  1343. mov r2, 0x4
  1344. sub r1, r2
  1345. call 1
  1346. mov r1, 0
  1347. ldxb r2, [r10-4]
  1348. ldxb r3, [r10-3]
  1349. ldxb r4, [r10-2]
  1350. ldxb r5, [r10-1]
  1351. call 0
  1352. xor r0, 0x2a2a2a2a
  1353. exit").unwrap();
  1354. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  1355. vm.register_helper(0, helpers::gather_bytes);
  1356. vm.register_helper(1, helpers::memfrob);
  1357. vm.jit_compile();
  1358. unsafe { assert_eq!(vm.prog_exec_jit(), 0x01020304); }
  1359. }
  1360. #[test]
  1361. fn test_jit_stb() {
  1362. let prog = assemble("
  1363. stb [r1+2], 0x11
  1364. ldxb r0, [r1+2]
  1365. exit").unwrap();
  1366. let mem = &mut [
  1367. 0xaa, 0xbb, 0xff, 0xcc, 0xdd
  1368. ];
  1369. let mut vm = rbpf::EbpfVmRaw::new(&prog).unwrap();
  1370. vm.jit_compile();
  1371. unsafe { assert_eq!(vm.prog_exec_jit(mem), 0x11); }
  1372. }
  1373. #[test]
  1374. fn test_jit_stdw() {
  1375. let prog = assemble("
  1376. stdw [r1+2], 0x44332211
  1377. ldxdw r0, [r1+2]
  1378. exit").unwrap();
  1379. let mem = &mut [
  1380. 0xaa, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1381. 0xff, 0xff, 0xcc, 0xdd
  1382. ];
  1383. let mut vm = rbpf::EbpfVmRaw::new(&prog).unwrap();
  1384. vm.jit_compile();
  1385. unsafe { assert_eq!(vm.prog_exec_jit(mem), 0x44332211); }
  1386. }
  1387. #[test]
  1388. fn test_jit_sth() {
  1389. let prog = assemble("
  1390. sth [r1+2], 0x2211
  1391. ldxh r0, [r1+2]
  1392. exit").unwrap();
  1393. let mem = &mut [
  1394. 0xaa, 0xbb, 0xff, 0xff, 0xcc, 0xdd
  1395. ];
  1396. let mut vm = rbpf::EbpfVmRaw::new(&prog).unwrap();
  1397. vm.jit_compile();
  1398. unsafe { assert_eq!(vm.prog_exec_jit(mem), 0x2211); }
  1399. }
  1400. #[test]
  1401. fn test_jit_string_stack() {
  1402. let prog = assemble("
  1403. mov r1, 0x78636261
  1404. stxw [r10-8], r1
  1405. mov r6, 0x0
  1406. stxb [r10-4], r6
  1407. stxb [r10-12], r6
  1408. mov r1, 0x79636261
  1409. stxw [r10-16], r1
  1410. mov r1, r10
  1411. add r1, -8
  1412. mov r2, r1
  1413. call 0x4
  1414. mov r1, r0
  1415. mov r0, 0x1
  1416. lsh r1, 0x20
  1417. rsh r1, 0x20
  1418. jne r1, 0x0, +11
  1419. mov r1, r10
  1420. add r1, -8
  1421. mov r2, r10
  1422. add r2, -16
  1423. call 0x4
  1424. mov r1, r0
  1425. lsh r1, 0x20
  1426. rsh r1, 0x20
  1427. mov r0, 0x1
  1428. jeq r1, r6, +1
  1429. mov r0, 0x0
  1430. exit").unwrap();
  1431. let mut vm = rbpf::EbpfVmNoData::new(&prog).unwrap();
  1432. vm.register_helper(4, helpers::strcmp);
  1433. vm.jit_compile();
  1434. unsafe { assert_eq!(vm.prog_exec_jit(), 0x0); }
  1435. }
  1436. #[test]
  1437. fn test_jit_stw() {
  1438. let prog = assemble("
  1439. stw [r1+2], 0x44332211
  1440. ldxw r0, [r1+2]
  1441. exit").unwrap();
  1442. let mem = &mut [
  1443. 0xaa, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xcc, 0xdd
  1444. ];
  1445. let mut vm = rbpf::EbpfVmRaw::new(&prog).unwrap();
  1446. vm.jit_compile();
  1447. unsafe { assert_eq!(vm.prog_exec_jit(mem), 0x44332211); }
  1448. }
  1449. #[test]
  1450. fn test_jit_stxb() {
  1451. let prog = assemble("
  1452. mov32 r2, 0x11
  1453. stxb [r1+2], r2
  1454. ldxb r0, [r1+2]
  1455. exit").unwrap();
  1456. let mem = &mut [
  1457. 0xaa, 0xbb, 0xff, 0xcc, 0xdd
  1458. ];
  1459. let mut vm = rbpf::EbpfVmRaw::new(&prog).unwrap();
  1460. vm.jit_compile();
  1461. unsafe { assert_eq!(vm.prog_exec_jit(mem), 0x11); }
  1462. }
  1463. #[test]
  1464. fn test_jit_stxb_all() {
  1465. let prog = assemble("
  1466. mov r0, 0xf0
  1467. mov r2, 0xf2
  1468. mov r3, 0xf3
  1469. mov r4, 0xf4
  1470. mov r5, 0xf5
  1471. mov r6, 0xf6
  1472. mov r7, 0xf7
  1473. mov r8, 0xf8
  1474. stxb [r1], r0
  1475. stxb [r1+1], r2
  1476. stxb [r1+2], r3
  1477. stxb [r1+3], r4
  1478. stxb [r1+4], r5
  1479. stxb [r1+5], r6
  1480. stxb [r1+6], r7
  1481. stxb [r1+7], r8
  1482. ldxdw r0, [r1]
  1483. be64 r0
  1484. exit").unwrap();
  1485. let mem = &mut [
  1486. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
  1487. ];
  1488. let mut vm = rbpf::EbpfVmRaw::new(&prog).unwrap();
  1489. vm.jit_compile();
  1490. unsafe { assert_eq!(vm.prog_exec_jit(mem), 0xf0f2f3f4f5f6f7f8); }
  1491. }
  1492. #[test]
  1493. fn test_jit_stxb_all2() {
  1494. let prog = assemble("
  1495. mov r0, r1
  1496. mov r1, 0xf1
  1497. mov r9, 0xf9
  1498. stxb [r0], r1
  1499. stxb [r0+1], r9
  1500. ldxh r0, [r0]
  1501. be16 r0
  1502. exit").unwrap();
  1503. let mem = &mut [
  1504. 0xff, 0xff
  1505. ];
  1506. let mut vm = rbpf::EbpfVmRaw::new(&prog).unwrap();
  1507. vm.jit_compile();
  1508. unsafe { assert_eq!(vm.prog_exec_jit(mem), 0xf1f9); }
  1509. }
  1510. #[test]
  1511. fn test_jit_stxb_chain() {
  1512. let prog = assemble("
  1513. mov r0, r1
  1514. ldxb r9, [r0+0]
  1515. stxb [r0+1], r9
  1516. ldxb r8, [r0+1]
  1517. stxb [r0+2], r8
  1518. ldxb r7, [r0+2]
  1519. stxb [r0+3], r7
  1520. ldxb r6, [r0+3]
  1521. stxb [r0+4], r6
  1522. ldxb r5, [r0+4]
  1523. stxb [r0+5], r5
  1524. ldxb r4, [r0+5]
  1525. stxb [r0+6], r4
  1526. ldxb r3, [r0+6]
  1527. stxb [r0+7], r3
  1528. ldxb r2, [r0+7]
  1529. stxb [r0+8], r2
  1530. ldxb r1, [r0+8]
  1531. stxb [r0+9], r1
  1532. ldxb r0, [r0+9]
  1533. exit").unwrap();
  1534. let mem = &mut [
  1535. 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1536. 0x00, 0x00
  1537. ];
  1538. let mut vm = rbpf::EbpfVmRaw::new(&prog).unwrap();
  1539. vm.jit_compile();
  1540. unsafe { assert_eq!(vm.prog_exec_jit(mem), 0x2a); }
  1541. }
  1542. #[test]
  1543. fn test_jit_stxdw() {
  1544. let prog = assemble("
  1545. mov r2, -2005440939
  1546. lsh r2, 32
  1547. or r2, 0x44332211
  1548. stxdw [r1+2], r2
  1549. ldxdw r0, [r1+2]
  1550. exit").unwrap();
  1551. let mem = &mut [
  1552. 0xaa, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1553. 0xff, 0xff, 0xcc, 0xdd
  1554. ];
  1555. let mut vm = rbpf::EbpfVmRaw::new(&prog).unwrap();
  1556. vm.jit_compile();
  1557. unsafe { assert_eq!(vm.prog_exec_jit(mem), 0x8877665544332211); }
  1558. }
  1559. #[test]
  1560. fn test_jit_stxh() {
  1561. let prog = assemble("
  1562. mov32 r2, 0x2211
  1563. stxh [r1+2], r2
  1564. ldxh r0, [r1+2]
  1565. exit").unwrap();
  1566. let mem = &mut [
  1567. 0xaa, 0xbb, 0xff, 0xff, 0xcc, 0xdd
  1568. ];
  1569. let mut vm = rbpf::EbpfVmRaw::new(&prog).unwrap();
  1570. vm.jit_compile();
  1571. unsafe { assert_eq!(vm.prog_exec_jit(mem), 0x2211); }
  1572. }
  1573. #[test]
  1574. fn test_jit_stxw() {
  1575. let prog = assemble("
  1576. mov32 r2, 0x44332211
  1577. stxw [r1+2], r2
  1578. ldxw r0, [r1+2]
  1579. exit").unwrap();
  1580. let mem = &mut [
  1581. 0xaa, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xcc, 0xdd
  1582. ];
  1583. let mut vm = rbpf::EbpfVmRaw::new(&prog).unwrap();
  1584. vm.jit_compile();
  1585. unsafe { assert_eq!(vm.prog_exec_jit(mem), 0x44332211); }
  1586. }
  1587. #[test]
  1588. fn test_jit_subnet() {
  1589. let prog = assemble("
  1590. mov r2, 0xe
  1591. ldxh r3, [r1+12]
  1592. jne r3, 0x81, +2
  1593. mov r2, 0x12
  1594. ldxh r3, [r1+16]
  1595. and r3, 0xffff
  1596. jne r3, 0x8, +5
  1597. add r1, r2
  1598. mov r0, 0x1
  1599. ldxw r1, [r1+16]
  1600. and r1, 0xffffff
  1601. jeq r1, 0x1a8c0, +1
  1602. mov r0, 0x0
  1603. exit").unwrap();
  1604. let mem = &mut [
  1605. 0x00, 0x00, 0xc0, 0x9f, 0xa0, 0x97, 0x00, 0xa0,
  1606. 0xcc, 0x3b, 0xbf, 0xfa, 0x08, 0x00, 0x45, 0x10,
  1607. 0x00, 0x3c, 0x46, 0x3c, 0x40, 0x00, 0x40, 0x06,
  1608. 0x73, 0x1c, 0xc0, 0xa8, 0x01, 0x02, 0xc0, 0xa8,
  1609. 0x01, 0x01, 0x06, 0x0e, 0x00, 0x17, 0x99, 0xc5,
  1610. 0xa0, 0xec, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x02,
  1611. 0x7d, 0x78, 0xe0, 0xa3, 0x00, 0x00, 0x02, 0x04,
  1612. 0x05, 0xb4, 0x04, 0x02, 0x08, 0x0a, 0x00, 0x9c,
  1613. 0x27, 0x24, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03,
  1614. 0x03, 0x00
  1615. ];
  1616. let mut vm = rbpf::EbpfVmRaw::new(&prog).unwrap();
  1617. vm.jit_compile();
  1618. unsafe { assert_eq!(vm.prog_exec_jit(mem), 0x1); }
  1619. }
  1620. const PROG_TCP_PORT_80: [u8;152] = [
  1621. 0x71, 0x12, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
  1622. 0x71, 0x13, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00,
  1623. 0x67, 0x03, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
  1624. 0x4f, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1625. 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1626. 0x55, 0x03, 0x0c, 0x00, 0x08, 0x00, 0x00, 0x00,
  1627. 0x71, 0x12, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00,
  1628. 0x55, 0x02, 0x0a, 0x00, 0x06, 0x00, 0x00, 0x00,
  1629. 0x71, 0x12, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00,
  1630. 0x07, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
  1631. 0x57, 0x02, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
  1632. 0x67, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
  1633. 0x0f, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1634. 0x69, 0x12, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
  1635. 0x15, 0x02, 0x02, 0x00, 0x00, 0x50, 0x00, 0x00,
  1636. 0x69, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1637. 0x55, 0x01, 0x01, 0x00, 0x00, 0x50, 0x00, 0x00,
  1638. 0xb7, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
  1639. 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  1640. ];
  1641. #[test]
  1642. fn test_jit_tcp_port80_match() {
  1643. let mem = &mut [
  1644. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x00, 0x06,
  1645. 0x07, 0x08, 0x09, 0x0a, 0x08, 0x00, 0x45, 0x00,
  1646. 0x00, 0x56, 0x00, 0x01, 0x00, 0x00, 0x40, 0x06,
  1647. 0xf9, 0x4d, 0xc0, 0xa8, 0x00, 0x01, 0xc0, 0xa8,
  1648. 0x00, 0x02, 0x27, 0x10, 0x00, 0x50, 0x00, 0x00,
  1649. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x02,
  1650. 0x20, 0x00, 0xc5, 0x18, 0x00, 0x00, 0x44, 0x44,
  1651. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  1652. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  1653. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  1654. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  1655. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  1656. 0x44, 0x44, 0x44, 0x44
  1657. ];
  1658. let prog = &PROG_TCP_PORT_80;
  1659. let mut vm = rbpf::EbpfVmRaw::new(prog).unwrap();
  1660. vm.jit_compile();
  1661. unsafe { assert_eq!(vm.prog_exec_jit(mem), 0x1); }
  1662. }
  1663. #[test]
  1664. fn test_jit_tcp_port80_nomatch() {
  1665. let mem = &mut [
  1666. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x00, 0x06,
  1667. 0x07, 0x08, 0x09, 0x0a, 0x08, 0x00, 0x45, 0x00,
  1668. 0x00, 0x56, 0x00, 0x01, 0x00, 0x00, 0x40, 0x06,
  1669. 0xf9, 0x4d, 0xc0, 0xa8, 0x00, 0x01, 0xc0, 0xa8,
  1670. 0x00, 0x02, 0x00, 0x16, 0x27, 0x10, 0x00, 0x00,
  1671. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x02,
  1672. 0x20, 0x00, 0xc5, 0x18, 0x00, 0x00, 0x44, 0x44,
  1673. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  1674. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  1675. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  1676. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  1677. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  1678. 0x44, 0x44, 0x44, 0x44
  1679. ];
  1680. let prog = &PROG_TCP_PORT_80;
  1681. let mut vm = rbpf::EbpfVmRaw::new(prog).unwrap();
  1682. vm.jit_compile();
  1683. unsafe { assert_eq!(vm.prog_exec_jit(mem), 0x0); }
  1684. }
  1685. #[test]
  1686. fn test_jit_tcp_port80_nomatch_ethertype() {
  1687. let mem = &mut [
  1688. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x00, 0x06,
  1689. 0x07, 0x08, 0x09, 0x0a, 0x08, 0x01, 0x45, 0x00,
  1690. 0x00, 0x56, 0x00, 0x01, 0x00, 0x00, 0x40, 0x06,
  1691. 0xf9, 0x4d, 0xc0, 0xa8, 0x00, 0x01, 0xc0, 0xa8,
  1692. 0x00, 0x02, 0x27, 0x10, 0x00, 0x50, 0x00, 0x00,
  1693. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x02,
  1694. 0x20, 0x00, 0xc5, 0x18, 0x00, 0x00, 0x44, 0x44,
  1695. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  1696. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  1697. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  1698. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  1699. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  1700. 0x44, 0x44, 0x44, 0x44
  1701. ];
  1702. let prog = &PROG_TCP_PORT_80;
  1703. let mut vm = rbpf::EbpfVmRaw::new(prog).unwrap();
  1704. vm.jit_compile();
  1705. unsafe { assert_eq!(vm.prog_exec_jit(mem), 0x0); }
  1706. }
  1707. #[test]
  1708. fn test_jit_tcp_port80_nomatch_proto() {
  1709. let mem = &mut [
  1710. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x00, 0x06,
  1711. 0x07, 0x08, 0x09, 0x0a, 0x08, 0x00, 0x45, 0x00,
  1712. 0x00, 0x56, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
  1713. 0xf9, 0x4d, 0xc0, 0xa8, 0x00, 0x01, 0xc0, 0xa8,
  1714. 0x00, 0x02, 0x27, 0x10, 0x00, 0x50, 0x00, 0x00,
  1715. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x02,
  1716. 0x20, 0x00, 0xc5, 0x18, 0x00, 0x00, 0x44, 0x44,
  1717. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  1718. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  1719. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  1720. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  1721. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  1722. 0x44, 0x44, 0x44, 0x44
  1723. ];
  1724. let prog = &PROG_TCP_PORT_80;
  1725. let mut vm = rbpf::EbpfVmRaw::new(prog).unwrap();
  1726. vm.jit_compile();
  1727. unsafe { assert_eq!(vm.prog_exec_jit(mem), 0x0); }
  1728. }
  1729. #[test]
  1730. fn test_jit_tcp_sack_match() {
  1731. let mut mem = TCP_SACK_MATCH.to_vec();
  1732. let prog = assemble(TCP_SACK_ASM).unwrap();
  1733. let mut vm = rbpf::EbpfVmRaw::new(&prog).unwrap();
  1734. vm.jit_compile();
  1735. unsafe { assert_eq!(vm.prog_exec_jit(mem.as_mut_slice()), 0x1); }
  1736. }
  1737. #[test]
  1738. fn test_jit_tcp_sack_nomatch() {
  1739. let mut mem = TCP_SACK_NOMATCH.to_vec();
  1740. let prog = assemble(TCP_SACK_ASM).unwrap();
  1741. let mut vm = rbpf::EbpfVmRaw::new(&prog).unwrap();
  1742. vm.jit_compile();
  1743. unsafe { assert_eq!(vm.prog_exec_jit(mem.as_mut_slice()), 0x0); }
  1744. }