Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / tools / testing / selftests / powerpc / vphn / test-vphn.c
diff --git a/kernel/tools/testing/selftests/powerpc/vphn/test-vphn.c b/kernel/tools/testing/selftests/powerpc/vphn/test-vphn.c
new file mode 100644 (file)
index 0000000..5742f68
--- /dev/null
@@ -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");
+}