ubpf_jit_x86_64.rs 61 KB

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