|
@@ -0,0 +1,410 @@
|
|
|
|
+#include <stdio.h>
|
|
|
|
+#include <byteswap.h>
|
|
|
|
+#include "utils.h"
|
|
|
|
+#include "subunit.h"
|
|
|
|
+
|
|
|
|
+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
|
|
|
+#define cpu_to_be32(x) bswap_32(x)
|
|
|
|
+#define be32_to_cpu(x) bswap_32(x)
|
|
|
|
+#define be16_to_cpup(x) bswap_16(*x)
|
|
|
|
+#define cpu_to_be64(x) bswap_64(x)
|
|
|
|
+#else
|
|
|
|
+#define cpu_to_be32(x) (x)
|
|
|
|
+#define be32_to_cpu(x) (x)
|
|
|
|
+#define be16_to_cpup(x) (*x)
|
|
|
|
+#define cpu_to_be64(x) (x)
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+#include "vphn.c"
|
|
|
|
+
|
|
|
|
+static struct test {
|
|
|
|
+ char *descr;
|
|
|
|
+ long input[VPHN_REGISTER_COUNT];
|
|
|
|
+ u32 expected[VPHN_ASSOC_BUFSIZE];
|
|
|
|
+} all_tests[] = {
|
|
|
|
+ {
|
|
|
|
+ "vphn: no data",
|
|
|
|
+ {
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ 0x00000000
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "vphn: 1 x 16-bit value",
|
|
|
|
+ {
|
|
|
|
+ 0x8001ffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ 0x00000001,
|
|
|
|
+ 0x00000001
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "vphn: 2 x 16-bit values",
|
|
|
|
+ {
|
|
|
|
+ 0x80018002ffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ 0x00000002,
|
|
|
|
+ 0x00000001,
|
|
|
|
+ 0x00000002
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "vphn: 3 x 16-bit values",
|
|
|
|
+ {
|
|
|
|
+ 0x800180028003ffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ 0x00000003,
|
|
|
|
+ 0x00000001,
|
|
|
|
+ 0x00000002,
|
|
|
|
+ 0x00000003
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "vphn: 4 x 16-bit values",
|
|
|
|
+ {
|
|
|
|
+ 0x8001800280038004,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ 0x00000004,
|
|
|
|
+ 0x00000001,
|
|
|
|
+ 0x00000002,
|
|
|
|
+ 0x00000003,
|
|
|
|
+ 0x00000004
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ /* Parsing the next 16-bit value out of the next 64-bit input
|
|
|
|
+ * value.
|
|
|
|
+ */
|
|
|
|
+ "vphn: 5 x 16-bit values",
|
|
|
|
+ {
|
|
|
|
+ 0x8001800280038004,
|
|
|
|
+ 0x8005ffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ 0x00000005,
|
|
|
|
+ 0x00000001,
|
|
|
|
+ 0x00000002,
|
|
|
|
+ 0x00000003,
|
|
|
|
+ 0x00000004,
|
|
|
|
+ 0x00000005
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ /* Parse at most 6 x 64-bit input values */
|
|
|
|
+ "vphn: 24 x 16-bit values",
|
|
|
|
+ {
|
|
|
|
+ 0x8001800280038004,
|
|
|
|
+ 0x8005800680078008,
|
|
|
|
+ 0x8009800a800b800c,
|
|
|
|
+ 0x800d800e800f8010,
|
|
|
|
+ 0x8011801280138014,
|
|
|
|
+ 0x8015801680178018
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ 0x00000018,
|
|
|
|
+ 0x00000001,
|
|
|
|
+ 0x00000002,
|
|
|
|
+ 0x00000003,
|
|
|
|
+ 0x00000004,
|
|
|
|
+ 0x00000005,
|
|
|
|
+ 0x00000006,
|
|
|
|
+ 0x00000007,
|
|
|
|
+ 0x00000008,
|
|
|
|
+ 0x00000009,
|
|
|
|
+ 0x0000000a,
|
|
|
|
+ 0x0000000b,
|
|
|
|
+ 0x0000000c,
|
|
|
|
+ 0x0000000d,
|
|
|
|
+ 0x0000000e,
|
|
|
|
+ 0x0000000f,
|
|
|
|
+ 0x00000010,
|
|
|
|
+ 0x00000011,
|
|
|
|
+ 0x00000012,
|
|
|
|
+ 0x00000013,
|
|
|
|
+ 0x00000014,
|
|
|
|
+ 0x00000015,
|
|
|
|
+ 0x00000016,
|
|
|
|
+ 0x00000017,
|
|
|
|
+ 0x00000018
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "vphn: 1 x 32-bit value",
|
|
|
|
+ {
|
|
|
|
+ 0x00000001ffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ 0x00000001,
|
|
|
|
+ 0x00000001
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "vphn: 2 x 32-bit values",
|
|
|
|
+ {
|
|
|
|
+ 0x0000000100000002,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ 0x00000002,
|
|
|
|
+ 0x00000001,
|
|
|
|
+ 0x00000002
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ /* Parsing the next 32-bit value out of the next 64-bit input
|
|
|
|
+ * value.
|
|
|
|
+ */
|
|
|
|
+ "vphn: 3 x 32-bit values",
|
|
|
|
+ {
|
|
|
|
+ 0x0000000100000002,
|
|
|
|
+ 0x00000003ffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ 0x00000003,
|
|
|
|
+ 0x00000001,
|
|
|
|
+ 0x00000002,
|
|
|
|
+ 0x00000003
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ /* Parse at most 6 x 64-bit input values */
|
|
|
|
+ "vphn: 12 x 32-bit values",
|
|
|
|
+ {
|
|
|
|
+ 0x0000000100000002,
|
|
|
|
+ 0x0000000300000004,
|
|
|
|
+ 0x0000000500000006,
|
|
|
|
+ 0x0000000700000008,
|
|
|
|
+ 0x000000090000000a,
|
|
|
|
+ 0x0000000b0000000c
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ 0x0000000c,
|
|
|
|
+ 0x00000001,
|
|
|
|
+ 0x00000002,
|
|
|
|
+ 0x00000003,
|
|
|
|
+ 0x00000004,
|
|
|
|
+ 0x00000005,
|
|
|
|
+ 0x00000006,
|
|
|
|
+ 0x00000007,
|
|
|
|
+ 0x00000008,
|
|
|
|
+ 0x00000009,
|
|
|
|
+ 0x0000000a,
|
|
|
|
+ 0x0000000b,
|
|
|
|
+ 0x0000000c
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "vphn: 16-bit value followed by 32-bit value",
|
|
|
|
+ {
|
|
|
|
+ 0x800100000002ffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ 0x00000002,
|
|
|
|
+ 0x00000001,
|
|
|
|
+ 0x00000002
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "vphn: 32-bit value followed by 16-bit value",
|
|
|
|
+ {
|
|
|
|
+ 0x000000018002ffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ 0x00000002,
|
|
|
|
+ 0x00000001,
|
|
|
|
+ 0x00000002
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ /* Parse a 32-bit value split accross two consecutives 64-bit
|
|
|
|
+ * input values.
|
|
|
|
+ */
|
|
|
|
+ "vphn: 16-bit value followed by 2 x 32-bit values",
|
|
|
|
+ {
|
|
|
|
+ 0x8001000000020000,
|
|
|
|
+ 0x0003ffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ 0x00000003,
|
|
|
|
+ 0x00000001,
|
|
|
|
+ 0x00000002,
|
|
|
|
+ 0x00000003,
|
|
|
|
+ 0x00000004,
|
|
|
|
+ 0x00000005
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ /* The lower bits in 0x0001ffff don't get mixed up with the
|
|
|
|
+ * 0xffff terminator.
|
|
|
|
+ */
|
|
|
|
+ "vphn: 32-bit value has all ones in 16 lower bits",
|
|
|
|
+ {
|
|
|
|
+ 0x0001ffff80028003,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff,
|
|
|
|
+ 0xffffffffffffffff
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ 0x00000003,
|
|
|
|
+ 0x0001ffff,
|
|
|
|
+ 0x00000002,
|
|
|
|
+ 0x00000003
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ /* The following input doesn't follow the specification.
|
|
|
|
+ */
|
|
|
|
+ "vphn: last 32-bit value is truncated",
|
|
|
|
+ {
|
|
|
|
+ 0x0000000100000002,
|
|
|
|
+ 0x0000000300000004,
|
|
|
|
+ 0x0000000500000006,
|
|
|
|
+ 0x0000000700000008,
|
|
|
|
+ 0x000000090000000a,
|
|
|
|
+ 0x0000000b800c2bad
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ 0x0000000c,
|
|
|
|
+ 0x00000001,
|
|
|
|
+ 0x00000002,
|
|
|
|
+ 0x00000003,
|
|
|
|
+ 0x00000004,
|
|
|
|
+ 0x00000005,
|
|
|
|
+ 0x00000006,
|
|
|
|
+ 0x00000007,
|
|
|
|
+ 0x00000008,
|
|
|
|
+ 0x00000009,
|
|
|
|
+ 0x0000000a,
|
|
|
|
+ 0x0000000b,
|
|
|
|
+ 0x0000000c
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "vphn: garbage after terminator",
|
|
|
|
+ {
|
|
|
|
+ 0xffff2bad2bad2bad,
|
|
|
|
+ 0x2bad2bad2bad2bad,
|
|
|
|
+ 0x2bad2bad2bad2bad,
|
|
|
|
+ 0x2bad2bad2bad2bad,
|
|
|
|
+ 0x2bad2bad2bad2bad,
|
|
|
|
+ 0x2bad2bad2bad2bad
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ 0x00000000
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ NULL
|
|
|
|
+ }
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static int test_one(struct test *test)
|
|
|
|
+{
|
|
|
|
+ __be32 output[VPHN_ASSOC_BUFSIZE] = { 0 };
|
|
|
|
+ int i, len;
|
|
|
|
+
|
|
|
|
+ vphn_unpack_associativity(test->input, output);
|
|
|
|
+
|
|
|
|
+ len = be32_to_cpu(output[0]);
|
|
|
|
+ if (len != test->expected[0]) {
|
|
|
|
+ printf("expected %d elements, got %d\n", test->expected[0],
|
|
|
|
+ len);
|
|
|
|
+ return 1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for (i = 1; i < len; i++) {
|
|
|
|
+ u32 val = be32_to_cpu(output[i]);
|
|
|
|
+ if (val != test->expected[i]) {
|
|
|
|
+ printf("element #%d is 0x%x, should be 0x%x\n", i, val,
|
|
|
|
+ test->expected[i]);
|
|
|
|
+ return 1;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int test_vphn(void)
|
|
|
|
+{
|
|
|
|
+ static struct test *test;
|
|
|
|
+
|
|
|
|
+ for (test = all_tests; test->descr; test++) {
|
|
|
|
+ int ret;
|
|
|
|
+
|
|
|
|
+ ret = test_one(test);
|
|
|
|
+ test_finish(test->descr, ret);
|
|
|
|
+ if (ret)
|
|
|
|
+ return ret;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+int main(int argc, char **argv)
|
|
|
|
+{
|
|
|
|
+ return test_harness(test_vphn, "test-vphn");
|
|
|
|
+}
|