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