1*b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
2521adf53SAnton Blanchard #include <malloc.h>
3521adf53SAnton Blanchard #include <stdlib.h>
4521adf53SAnton Blanchard #include <string.h>
515ec3997SSimon Guo #include "utils.h"
6521adf53SAnton Blanchard 
7521adf53SAnton Blanchard #define SIZE 256
8521adf53SAnton Blanchard #define ITERATIONS 10000
9521adf53SAnton Blanchard 
10521adf53SAnton Blanchard int test_memcmp(const void *s1, const void *s2, size_t n);
11521adf53SAnton Blanchard 
12521adf53SAnton Blanchard /* test all offsets and lengths */
13521adf53SAnton Blanchard static void test_one(char *s1, char *s2)
14521adf53SAnton Blanchard {
15521adf53SAnton Blanchard 	unsigned long offset, size;
16521adf53SAnton Blanchard 
17521adf53SAnton Blanchard 	for (offset = 0; offset < SIZE; offset++) {
18521adf53SAnton Blanchard 		for (size = 0; size < (SIZE-offset); size++) {
19521adf53SAnton Blanchard 			int x, y;
20521adf53SAnton Blanchard 			unsigned long i;
21521adf53SAnton Blanchard 
22521adf53SAnton Blanchard 			y = memcmp(s1+offset, s2+offset, size);
23521adf53SAnton Blanchard 			x = test_memcmp(s1+offset, s2+offset, size);
24521adf53SAnton Blanchard 
25521adf53SAnton Blanchard 			if (((x ^ y) < 0) &&	/* Trick to compare sign */
26521adf53SAnton Blanchard 				((x | y) != 0)) { /* check for zero */
27521adf53SAnton Blanchard 				printf("memcmp returned %d, should have returned %d (offset %ld size %ld)\n", x, y, offset, size);
28521adf53SAnton Blanchard 
29521adf53SAnton Blanchard 				for (i = offset; i < offset+size; i++)
30521adf53SAnton Blanchard 					printf("%02x ", s1[i]);
31521adf53SAnton Blanchard 				printf("\n");
32521adf53SAnton Blanchard 
33521adf53SAnton Blanchard 				for (i = offset; i < offset+size; i++)
34521adf53SAnton Blanchard 					printf("%02x ", s2[i]);
35521adf53SAnton Blanchard 				printf("\n");
36521adf53SAnton Blanchard 				abort();
37521adf53SAnton Blanchard 			}
38521adf53SAnton Blanchard 		}
39521adf53SAnton Blanchard 	}
40521adf53SAnton Blanchard }
41521adf53SAnton Blanchard 
42521adf53SAnton Blanchard static int testcase(void)
43521adf53SAnton Blanchard {
44521adf53SAnton Blanchard 	char *s1;
45521adf53SAnton Blanchard 	char *s2;
46521adf53SAnton Blanchard 	unsigned long i;
47521adf53SAnton Blanchard 
48521adf53SAnton Blanchard 	s1 = memalign(128, SIZE);
49521adf53SAnton Blanchard 	if (!s1) {
50521adf53SAnton Blanchard 		perror("memalign");
51521adf53SAnton Blanchard 		exit(1);
52521adf53SAnton Blanchard 	}
53521adf53SAnton Blanchard 
54521adf53SAnton Blanchard 	s2 = memalign(128, SIZE);
55521adf53SAnton Blanchard 	if (!s2) {
56521adf53SAnton Blanchard 		perror("memalign");
57521adf53SAnton Blanchard 		exit(1);
58521adf53SAnton Blanchard 	}
59521adf53SAnton Blanchard 
60521adf53SAnton Blanchard 	srandom(1);
61521adf53SAnton Blanchard 
62521adf53SAnton Blanchard 	for (i = 0; i < ITERATIONS; i++) {
63521adf53SAnton Blanchard 		unsigned long j;
64521adf53SAnton Blanchard 		unsigned long change;
65521adf53SAnton Blanchard 
66521adf53SAnton Blanchard 		for (j = 0; j < SIZE; j++)
67521adf53SAnton Blanchard 			s1[j] = random();
68521adf53SAnton Blanchard 
69521adf53SAnton Blanchard 		memcpy(s2, s1, SIZE);
70521adf53SAnton Blanchard 
71521adf53SAnton Blanchard 		/* change one byte */
72521adf53SAnton Blanchard 		change = random() % SIZE;
73521adf53SAnton Blanchard 		s2[change] = random() & 0xff;
74521adf53SAnton Blanchard 
75521adf53SAnton Blanchard 		test_one(s1, s2);
76521adf53SAnton Blanchard 	}
77521adf53SAnton Blanchard 
78521adf53SAnton Blanchard 	srandom(1);
79521adf53SAnton Blanchard 
80521adf53SAnton Blanchard 	for (i = 0; i < ITERATIONS; i++) {
81521adf53SAnton Blanchard 		unsigned long j;
82521adf53SAnton Blanchard 		unsigned long change;
83521adf53SAnton Blanchard 
84521adf53SAnton Blanchard 		for (j = 0; j < SIZE; j++)
85521adf53SAnton Blanchard 			s1[j] = random();
86521adf53SAnton Blanchard 
87521adf53SAnton Blanchard 		memcpy(s2, s1, SIZE);
88521adf53SAnton Blanchard 
89521adf53SAnton Blanchard 		/* change multiple bytes, 1/8 of total */
90521adf53SAnton Blanchard 		for (j = 0; j < SIZE / 8; j++) {
91521adf53SAnton Blanchard 			change = random() % SIZE;
92521adf53SAnton Blanchard 			s2[change] = random() & 0xff;
93521adf53SAnton Blanchard 		}
94521adf53SAnton Blanchard 
95521adf53SAnton Blanchard 		test_one(s1, s2);
96521adf53SAnton Blanchard 	}
97521adf53SAnton Blanchard 
98521adf53SAnton Blanchard 	return 0;
99521adf53SAnton Blanchard }
100521adf53SAnton Blanchard 
101521adf53SAnton Blanchard int main(void)
102521adf53SAnton Blanchard {
103521adf53SAnton Blanchard 	return test_harness(testcase, "memcmp");
104521adf53SAnton Blanchard }
105