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