412 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			412 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
// SPDX-License-Identifier: GPL-2.0
 | 
						|
#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");
 | 
						|
}
 |