test-vphn.c 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410
  1. #include <stdio.h>
  2. #include <byteswap.h>
  3. #include "utils.h"
  4. #include "subunit.h"
  5. #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
  6. #define cpu_to_be32(x) bswap_32(x)
  7. #define be32_to_cpu(x) bswap_32(x)
  8. #define be16_to_cpup(x) bswap_16(*x)
  9. #define cpu_to_be64(x) bswap_64(x)
  10. #else
  11. #define cpu_to_be32(x) (x)
  12. #define be32_to_cpu(x) (x)
  13. #define be16_to_cpup(x) (*x)
  14. #define cpu_to_be64(x) (x)
  15. #endif
  16. #include "vphn.c"
  17. static struct test {
  18. char *descr;
  19. long input[VPHN_REGISTER_COUNT];
  20. u32 expected[VPHN_ASSOC_BUFSIZE];
  21. } all_tests[] = {
  22. {
  23. "vphn: no data",
  24. {
  25. 0xffffffffffffffff,
  26. 0xffffffffffffffff,
  27. 0xffffffffffffffff,
  28. 0xffffffffffffffff,
  29. 0xffffffffffffffff,
  30. 0xffffffffffffffff,
  31. },
  32. {
  33. 0x00000000
  34. }
  35. },
  36. {
  37. "vphn: 1 x 16-bit value",
  38. {
  39. 0x8001ffffffffffff,
  40. 0xffffffffffffffff,
  41. 0xffffffffffffffff,
  42. 0xffffffffffffffff,
  43. 0xffffffffffffffff,
  44. 0xffffffffffffffff,
  45. },
  46. {
  47. 0x00000001,
  48. 0x00000001
  49. }
  50. },
  51. {
  52. "vphn: 2 x 16-bit values",
  53. {
  54. 0x80018002ffffffff,
  55. 0xffffffffffffffff,
  56. 0xffffffffffffffff,
  57. 0xffffffffffffffff,
  58. 0xffffffffffffffff,
  59. 0xffffffffffffffff,
  60. },
  61. {
  62. 0x00000002,
  63. 0x00000001,
  64. 0x00000002
  65. }
  66. },
  67. {
  68. "vphn: 3 x 16-bit values",
  69. {
  70. 0x800180028003ffff,
  71. 0xffffffffffffffff,
  72. 0xffffffffffffffff,
  73. 0xffffffffffffffff,
  74. 0xffffffffffffffff,
  75. 0xffffffffffffffff,
  76. },
  77. {
  78. 0x00000003,
  79. 0x00000001,
  80. 0x00000002,
  81. 0x00000003
  82. }
  83. },
  84. {
  85. "vphn: 4 x 16-bit values",
  86. {
  87. 0x8001800280038004,
  88. 0xffffffffffffffff,
  89. 0xffffffffffffffff,
  90. 0xffffffffffffffff,
  91. 0xffffffffffffffff,
  92. 0xffffffffffffffff,
  93. },
  94. {
  95. 0x00000004,
  96. 0x00000001,
  97. 0x00000002,
  98. 0x00000003,
  99. 0x00000004
  100. }
  101. },
  102. {
  103. /* Parsing the next 16-bit value out of the next 64-bit input
  104. * value.
  105. */
  106. "vphn: 5 x 16-bit values",
  107. {
  108. 0x8001800280038004,
  109. 0x8005ffffffffffff,
  110. 0xffffffffffffffff,
  111. 0xffffffffffffffff,
  112. 0xffffffffffffffff,
  113. 0xffffffffffffffff,
  114. },
  115. {
  116. 0x00000005,
  117. 0x00000001,
  118. 0x00000002,
  119. 0x00000003,
  120. 0x00000004,
  121. 0x00000005
  122. }
  123. },
  124. {
  125. /* Parse at most 6 x 64-bit input values */
  126. "vphn: 24 x 16-bit values",
  127. {
  128. 0x8001800280038004,
  129. 0x8005800680078008,
  130. 0x8009800a800b800c,
  131. 0x800d800e800f8010,
  132. 0x8011801280138014,
  133. 0x8015801680178018
  134. },
  135. {
  136. 0x00000018,
  137. 0x00000001,
  138. 0x00000002,
  139. 0x00000003,
  140. 0x00000004,
  141. 0x00000005,
  142. 0x00000006,
  143. 0x00000007,
  144. 0x00000008,
  145. 0x00000009,
  146. 0x0000000a,
  147. 0x0000000b,
  148. 0x0000000c,
  149. 0x0000000d,
  150. 0x0000000e,
  151. 0x0000000f,
  152. 0x00000010,
  153. 0x00000011,
  154. 0x00000012,
  155. 0x00000013,
  156. 0x00000014,
  157. 0x00000015,
  158. 0x00000016,
  159. 0x00000017,
  160. 0x00000018
  161. }
  162. },
  163. {
  164. "vphn: 1 x 32-bit value",
  165. {
  166. 0x00000001ffffffff,
  167. 0xffffffffffffffff,
  168. 0xffffffffffffffff,
  169. 0xffffffffffffffff,
  170. 0xffffffffffffffff,
  171. 0xffffffffffffffff
  172. },
  173. {
  174. 0x00000001,
  175. 0x00000001
  176. }
  177. },
  178. {
  179. "vphn: 2 x 32-bit values",
  180. {
  181. 0x0000000100000002,
  182. 0xffffffffffffffff,
  183. 0xffffffffffffffff,
  184. 0xffffffffffffffff,
  185. 0xffffffffffffffff,
  186. 0xffffffffffffffff
  187. },
  188. {
  189. 0x00000002,
  190. 0x00000001,
  191. 0x00000002
  192. }
  193. },
  194. {
  195. /* Parsing the next 32-bit value out of the next 64-bit input
  196. * value.
  197. */
  198. "vphn: 3 x 32-bit values",
  199. {
  200. 0x0000000100000002,
  201. 0x00000003ffffffff,
  202. 0xffffffffffffffff,
  203. 0xffffffffffffffff,
  204. 0xffffffffffffffff,
  205. 0xffffffffffffffff
  206. },
  207. {
  208. 0x00000003,
  209. 0x00000001,
  210. 0x00000002,
  211. 0x00000003
  212. }
  213. },
  214. {
  215. /* Parse at most 6 x 64-bit input values */
  216. "vphn: 12 x 32-bit values",
  217. {
  218. 0x0000000100000002,
  219. 0x0000000300000004,
  220. 0x0000000500000006,
  221. 0x0000000700000008,
  222. 0x000000090000000a,
  223. 0x0000000b0000000c
  224. },
  225. {
  226. 0x0000000c,
  227. 0x00000001,
  228. 0x00000002,
  229. 0x00000003,
  230. 0x00000004,
  231. 0x00000005,
  232. 0x00000006,
  233. 0x00000007,
  234. 0x00000008,
  235. 0x00000009,
  236. 0x0000000a,
  237. 0x0000000b,
  238. 0x0000000c
  239. }
  240. },
  241. {
  242. "vphn: 16-bit value followed by 32-bit value",
  243. {
  244. 0x800100000002ffff,
  245. 0xffffffffffffffff,
  246. 0xffffffffffffffff,
  247. 0xffffffffffffffff,
  248. 0xffffffffffffffff,
  249. 0xffffffffffffffff
  250. },
  251. {
  252. 0x00000002,
  253. 0x00000001,
  254. 0x00000002
  255. }
  256. },
  257. {
  258. "vphn: 32-bit value followed by 16-bit value",
  259. {
  260. 0x000000018002ffff,
  261. 0xffffffffffffffff,
  262. 0xffffffffffffffff,
  263. 0xffffffffffffffff,
  264. 0xffffffffffffffff,
  265. 0xffffffffffffffff
  266. },
  267. {
  268. 0x00000002,
  269. 0x00000001,
  270. 0x00000002
  271. }
  272. },
  273. {
  274. /* Parse a 32-bit value split accross two consecutives 64-bit
  275. * input values.
  276. */
  277. "vphn: 16-bit value followed by 2 x 32-bit values",
  278. {
  279. 0x8001000000020000,
  280. 0x0003ffffffffffff,
  281. 0xffffffffffffffff,
  282. 0xffffffffffffffff,
  283. 0xffffffffffffffff,
  284. 0xffffffffffffffff
  285. },
  286. {
  287. 0x00000003,
  288. 0x00000001,
  289. 0x00000002,
  290. 0x00000003,
  291. 0x00000004,
  292. 0x00000005
  293. }
  294. },
  295. {
  296. /* The lower bits in 0x0001ffff don't get mixed up with the
  297. * 0xffff terminator.
  298. */
  299. "vphn: 32-bit value has all ones in 16 lower bits",
  300. {
  301. 0x0001ffff80028003,
  302. 0xffffffffffffffff,
  303. 0xffffffffffffffff,
  304. 0xffffffffffffffff,
  305. 0xffffffffffffffff,
  306. 0xffffffffffffffff
  307. },
  308. {
  309. 0x00000003,
  310. 0x0001ffff,
  311. 0x00000002,
  312. 0x00000003
  313. }
  314. },
  315. {
  316. /* The following input doesn't follow the specification.
  317. */
  318. "vphn: last 32-bit value is truncated",
  319. {
  320. 0x0000000100000002,
  321. 0x0000000300000004,
  322. 0x0000000500000006,
  323. 0x0000000700000008,
  324. 0x000000090000000a,
  325. 0x0000000b800c2bad
  326. },
  327. {
  328. 0x0000000c,
  329. 0x00000001,
  330. 0x00000002,
  331. 0x00000003,
  332. 0x00000004,
  333. 0x00000005,
  334. 0x00000006,
  335. 0x00000007,
  336. 0x00000008,
  337. 0x00000009,
  338. 0x0000000a,
  339. 0x0000000b,
  340. 0x0000000c
  341. }
  342. },
  343. {
  344. "vphn: garbage after terminator",
  345. {
  346. 0xffff2bad2bad2bad,
  347. 0x2bad2bad2bad2bad,
  348. 0x2bad2bad2bad2bad,
  349. 0x2bad2bad2bad2bad,
  350. 0x2bad2bad2bad2bad,
  351. 0x2bad2bad2bad2bad
  352. },
  353. {
  354. 0x00000000
  355. }
  356. },
  357. {
  358. NULL
  359. }
  360. };
  361. static int test_one(struct test *test)
  362. {
  363. __be32 output[VPHN_ASSOC_BUFSIZE] = { 0 };
  364. int i, len;
  365. vphn_unpack_associativity(test->input, output);
  366. len = be32_to_cpu(output[0]);
  367. if (len != test->expected[0]) {
  368. printf("expected %d elements, got %d\n", test->expected[0],
  369. len);
  370. return 1;
  371. }
  372. for (i = 1; i < len; i++) {
  373. u32 val = be32_to_cpu(output[i]);
  374. if (val != test->expected[i]) {
  375. printf("element #%d is 0x%x, should be 0x%x\n", i, val,
  376. test->expected[i]);
  377. return 1;
  378. }
  379. }
  380. return 0;
  381. }
  382. static int test_vphn(void)
  383. {
  384. static struct test *test;
  385. for (test = all_tests; test->descr; test++) {
  386. int ret;
  387. ret = test_one(test);
  388. test_finish(test->descr, ret);
  389. if (ret)
  390. return ret;
  391. }
  392. return 0;
  393. }
  394. int main(int argc, char **argv)
  395. {
  396. return test_harness(test_vphn, "test-vphn");
  397. }