xref: /isa-l/mem/mem_zero_detect_test.c (revision aaa78d6a7c0a3e3a48e4997bd5b8f78e71070835)
16e201339SJohn Kariuki /**********************************************************************
26e201339SJohn Kariuki   Copyright(c) 2011-2018 Intel Corporation All rights reserved.
36e201339SJohn Kariuki 
46e201339SJohn Kariuki   Redistribution and use in source and binary forms, with or without
56e201339SJohn Kariuki   modification, are permitted provided that the following conditions
66e201339SJohn Kariuki   are met:
76e201339SJohn Kariuki     * Redistributions of source code must retain the above copyright
86e201339SJohn Kariuki       notice, this list of conditions and the following disclaimer.
96e201339SJohn Kariuki     * Redistributions in binary form must reproduce the above copyright
106e201339SJohn Kariuki       notice, this list of conditions and the following disclaimer in
116e201339SJohn Kariuki       the documentation and/or other materials provided with the
126e201339SJohn Kariuki       distribution.
136e201339SJohn Kariuki     * Neither the name of Intel Corporation nor the names of its
146e201339SJohn Kariuki       contributors may be used to endorse or promote products derived
156e201339SJohn Kariuki       from this software without specific prior written permission.
166e201339SJohn Kariuki 
176e201339SJohn Kariuki   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
186e201339SJohn Kariuki   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
196e201339SJohn Kariuki   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
206e201339SJohn Kariuki   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
216e201339SJohn Kariuki   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
226e201339SJohn Kariuki   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
236e201339SJohn Kariuki   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
246e201339SJohn Kariuki   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
256e201339SJohn Kariuki   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
266e201339SJohn Kariuki   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
276e201339SJohn Kariuki   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
286e201339SJohn Kariuki **********************************************************************/
296e201339SJohn Kariuki 
306e201339SJohn Kariuki #include <stdio.h>
316e201339SJohn Kariuki #include <string.h>
326e201339SJohn Kariuki #include <stdlib.h>
336e201339SJohn Kariuki #include <limits.h>
346e201339SJohn Kariuki #include "mem_routines.h"
35112dd72cSGreg Tucker #include "test.h"
366e201339SJohn Kariuki 
376e201339SJohn Kariuki #define TEST_MEM     10 * 1024 * 1024
386e201339SJohn Kariuki #define TEST_LEN     8 * 1024
396e201339SJohn Kariuki #define RAND_ALIGN   32
406e201339SJohn Kariuki #define BORDER_BYTES (5 * RAND_ALIGN + 7)
416e201339SJohn Kariuki 
426e201339SJohn Kariuki #ifndef RANDOMS
436e201339SJohn Kariuki #define RANDOMS 2000
446e201339SJohn Kariuki #endif
456e201339SJohn Kariuki #ifndef TEST_SEED
466e201339SJohn Kariuki #define TEST_SEED 0x1234
476e201339SJohn Kariuki #endif
486e201339SJohn Kariuki 
49*aaa78d6aSMarcel Cornu int
main(int argc,char * argv[])50*aaa78d6aSMarcel Cornu main(int argc, char *argv[])
516e201339SJohn Kariuki {
52733901eeSRoy Oursler         int i, j, sign;
53733901eeSRoy Oursler         long long r, l;
54c83771eeSPablo de Lara         void *buf = NULL;
556e201339SJohn Kariuki         unsigned char *a;
566e201339SJohn Kariuki         int failures = 0, ret_neg = 1;
576e201339SJohn Kariuki 
586e201339SJohn Kariuki         printf("mem_zero_detect_test %d bytes, %d randoms, seed=0x%x ", TEST_MEM, RANDOMS,
596e201339SJohn Kariuki                TEST_SEED);
606e201339SJohn Kariuki         if (posix_memalign(&buf, 64, TEST_MEM)) {
616e201339SJohn Kariuki                 printf("alloc error: Fail");
626e201339SJohn Kariuki                 return -1;
636e201339SJohn Kariuki         }
646e201339SJohn Kariuki 
656e201339SJohn Kariuki         srand(TEST_SEED);
666e201339SJohn Kariuki 
676e201339SJohn Kariuki         // Test full zero buffer
686e201339SJohn Kariuki         memset(buf, 0, TEST_MEM);
696e201339SJohn Kariuki         failures = isal_zero_detect(buf, TEST_MEM);
706e201339SJohn Kariuki 
716e201339SJohn Kariuki         if (failures) {
726e201339SJohn Kariuki                 printf("Fail large buf test\n");
73c83771eeSPablo de Lara                 goto exit;
746e201339SJohn Kariuki         }
752ca781dfSPablo de Lara #ifdef TEST_VERBOSE
766e201339SJohn Kariuki         putchar('.');
772ca781dfSPablo de Lara #endif
786e201339SJohn Kariuki 
796d17992bSGreg Tucker         // Test to help memory checkers
806d17992bSGreg Tucker         for (i = 1; i < 2345; i++) {
816d17992bSGreg Tucker                 uint8_t *newbuf = (uint8_t *) malloc(i);
82ac2ee91cSTomasz Kantecki 
83ac2ee91cSTomasz Kantecki                 if (newbuf == NULL) {
84ac2ee91cSTomasz Kantecki                         printf("Fail alloc test - not enough memory\n");
85ac2ee91cSTomasz Kantecki                         failures = -1;
86c83771eeSPablo de Lara                         goto exit;
876d17992bSGreg Tucker                 }
88ac2ee91cSTomasz Kantecki                 memset(newbuf, 0, i);
89ac2ee91cSTomasz Kantecki                 failures = isal_zero_detect(newbuf, i);
906d17992bSGreg Tucker                 free(newbuf);
91ac2ee91cSTomasz Kantecki                 if (failures) {
92ac2ee91cSTomasz Kantecki                         printf("Fail alloc test\n");
93ac2ee91cSTomasz Kantecki                         goto exit;
94ac2ee91cSTomasz Kantecki                 }
956d17992bSGreg Tucker         }
966d17992bSGreg Tucker 
976e201339SJohn Kariuki         // Test small buffers
986e201339SJohn Kariuki         for (i = 0; i < TEST_LEN; i++) {
996e201339SJohn Kariuki                 failures |= isal_zero_detect(buf, i);
1006e201339SJohn Kariuki                 if (failures) {
1016e201339SJohn Kariuki                         printf("Fail len=%d\n", i);
102c83771eeSPablo de Lara                         goto exit;
1036e201339SJohn Kariuki                 }
1046e201339SJohn Kariuki         }
1052ca781dfSPablo de Lara #ifdef TEST_VERBOSE
1066e201339SJohn Kariuki         putchar('.');
1072ca781dfSPablo de Lara #endif
1086e201339SJohn Kariuki 
1096e201339SJohn Kariuki         // Test small buffers near end of alloc region
1106e201339SJohn Kariuki         a = buf;
1116e201339SJohn Kariuki         for (i = 0; i < TEST_LEN; i++)
1126e201339SJohn Kariuki                 failures |= isal_zero_detect(&a[TEST_LEN - i], i);
1136e201339SJohn Kariuki 
1146e201339SJohn Kariuki         if (failures) {
1156e201339SJohn Kariuki                 printf("Fail:\n");
116c83771eeSPablo de Lara                 goto exit;
1176e201339SJohn Kariuki         }
1182ca781dfSPablo de Lara #ifdef TEST_VERBOSE
1196e201339SJohn Kariuki         putchar('.');
1202ca781dfSPablo de Lara #endif
1216e201339SJohn Kariuki 
1226e201339SJohn Kariuki         // Test for detect non zero
1236e201339SJohn Kariuki         a[TEST_MEM / 2] = 1;
1246e201339SJohn Kariuki         ret_neg = isal_zero_detect(a, TEST_MEM);
1256e201339SJohn Kariuki         if (ret_neg == 0) {
1266e201339SJohn Kariuki                 printf("Fail on not detect\n");
127c83771eeSPablo de Lara                 failures = -1;
128c83771eeSPablo de Lara                 goto exit;
1296e201339SJohn Kariuki         }
1306e201339SJohn Kariuki         a[TEST_MEM / 2] = 0;
1312ca781dfSPablo de Lara #ifdef TEST_VERBOSE
1326e201339SJohn Kariuki         putchar('.');
1332ca781dfSPablo de Lara #endif
1346e201339SJohn Kariuki 
1356e201339SJohn Kariuki         // Test various non-zero offsets
1366e201339SJohn Kariuki         for (i = 0; i < BORDER_BYTES; i++) {
1376e201339SJohn Kariuki                 for (j = 0; j < CHAR_BIT; j++) {
1386e201339SJohn Kariuki                         a[i] = 1 << j;
1396e201339SJohn Kariuki                         ret_neg = isal_zero_detect(a, TEST_MEM);
1406e201339SJohn Kariuki                         if (ret_neg == 0) {
1416e201339SJohn Kariuki                                 printf("Fail on not detect offsets %d, %d\n", i, j);
142c83771eeSPablo de Lara                                 failures = -1;
143c83771eeSPablo de Lara                                 goto exit;
1446e201339SJohn Kariuki                         }
1456e201339SJohn Kariuki                         a[i] = 0;
1466e201339SJohn Kariuki                 }
1476e201339SJohn Kariuki         }
1482ca781dfSPablo de Lara #ifdef TEST_VERBOSE
1496e201339SJohn Kariuki         putchar('.');
1502ca781dfSPablo de Lara #endif
1516e201339SJohn Kariuki         fflush(0);
1526e201339SJohn Kariuki 
1536e201339SJohn Kariuki         // Test random non-zero offsets
1546e201339SJohn Kariuki         for (i = 0; i < RANDOMS; i++) {
1556e201339SJohn Kariuki                 r = rand();
1566e201339SJohn Kariuki                 r = (r % TEST_LEN) ^ (r & (RAND_ALIGN - 1));
1576e201339SJohn Kariuki                 if (r >= TEST_LEN)
1586e201339SJohn Kariuki                         continue;
1596e201339SJohn Kariuki 
1606e201339SJohn Kariuki                 a[r] = 1 << (r & (CHAR_BIT - 1));
1616e201339SJohn Kariuki                 ret_neg = isal_zero_detect(a, TEST_MEM);
1626e201339SJohn Kariuki                 if (ret_neg == 0) {
1636e201339SJohn Kariuki                         printf("Fail on not detect rand %d, e=%lld\n", i, r);
164c83771eeSPablo de Lara                         failures = -1;
165c83771eeSPablo de Lara                         goto exit;
1666e201339SJohn Kariuki                 }
1676e201339SJohn Kariuki                 a[r] = 0;
1686e201339SJohn Kariuki         }
1692ca781dfSPablo de Lara #ifdef TEST_VERBOSE
1706e201339SJohn Kariuki         putchar('.');
1712ca781dfSPablo de Lara #endif
1726e201339SJohn Kariuki         fflush(0);
1736e201339SJohn Kariuki 
1746e201339SJohn Kariuki         // Test putting non-zero byte at end of buffer
1756e201339SJohn Kariuki         for (i = 1; i < BORDER_BYTES; i++) {
1766e201339SJohn Kariuki                 for (j = 0; j < CHAR_BIT; j++) {
1776e201339SJohn Kariuki                         a[TEST_MEM - i] = 1 << j;
1786e201339SJohn Kariuki                         ret_neg = isal_zero_detect(a, TEST_MEM);
1796e201339SJohn Kariuki                         if (ret_neg == 0) {
1806e201339SJohn Kariuki                                 printf("Fail on not detect rand offset=%d, idx=%d\n", i, j);
181c83771eeSPablo de Lara                                 failures = -1;
182c83771eeSPablo de Lara                                 goto exit;
1836e201339SJohn Kariuki                         }
1846e201339SJohn Kariuki                         a[TEST_MEM - i] = 0;
1856e201339SJohn Kariuki                 }
1866e201339SJohn Kariuki         }
1872ca781dfSPablo de Lara #ifdef TEST_VERBOSE
1886e201339SJohn Kariuki         putchar('.');
1892ca781dfSPablo de Lara #endif
1906e201339SJohn Kariuki 
1916e201339SJohn Kariuki         // Test various size buffers and non-zero offsets
1926e201339SJohn Kariuki         for (l = 1; l < TEST_LEN; l++) {
1936e201339SJohn Kariuki                 for (i = 0; i < l + BORDER_BYTES; i++) {
1946e201339SJohn Kariuki                         failures = isal_zero_detect(a, l);
1956e201339SJohn Kariuki 
1966e201339SJohn Kariuki                         if (failures) {
197733901eeSRoy Oursler                                 printf("Fail on detect non-zero with l=%lld\n", l);
198c83771eeSPablo de Lara                                 goto exit;
1996e201339SJohn Kariuki                         }
2006e201339SJohn Kariuki 
2016e201339SJohn Kariuki                         a[i] = 1;
2026e201339SJohn Kariuki                         ret_neg = isal_zero_detect(a, l);
2036e201339SJohn Kariuki 
2046e201339SJohn Kariuki                         if ((i < l) && (ret_neg == 0)) {
205733901eeSRoy Oursler                                 printf("Fail on non-zero buffer l=%lld err=%d\n", l, i);
206c83771eeSPablo de Lara                                 failures = -1;
207c83771eeSPablo de Lara                                 goto exit;
2086e201339SJohn Kariuki                         }
2096e201339SJohn Kariuki                         if ((i >= l) && (ret_neg != 0)) {
210733901eeSRoy Oursler                                 printf("Fail on bad pass detect l=%lld err=%d\n", l, i);
211c83771eeSPablo de Lara                                 failures = -1;
212c83771eeSPablo de Lara                                 goto exit;
2136e201339SJohn Kariuki                         }
2146e201339SJohn Kariuki                         a[i] = 0;
2156e201339SJohn Kariuki                 }
2166e201339SJohn Kariuki         }
2172ca781dfSPablo de Lara #ifdef TEST_VERBOSE
2186e201339SJohn Kariuki         putchar('.');
2192ca781dfSPablo de Lara #endif
2206e201339SJohn Kariuki 
2216e201339SJohn Kariuki         // Test random test size and non-zero error offsets
2226e201339SJohn Kariuki         for (i = 0; i < RANDOMS; i++) {
2236e201339SJohn Kariuki                 r = rand();
2246e201339SJohn Kariuki                 r = (r % TEST_LEN) ^ (r & (RAND_ALIGN - 1));
2256e201339SJohn Kariuki                 l = r + 1 + (rand() & (CHAR_BIT - 1));
2266e201339SJohn Kariuki                 a[r] = 1 << (r & (CHAR_BIT - 1));
2276e201339SJohn Kariuki                 ret_neg = isal_zero_detect(a, l);
2286e201339SJohn Kariuki                 if (ret_neg == 0) {
229733901eeSRoy Oursler                         printf("Fail on not detect rand %d, l=%lld, e=%lld\n", i, l, r);
230c83771eeSPablo de Lara                         failures = -1;
231c83771eeSPablo de Lara                         goto exit;
2326e201339SJohn Kariuki                 }
2336e201339SJohn Kariuki                 a[r] = 0;
2346e201339SJohn Kariuki         }
2352ca781dfSPablo de Lara #ifdef TEST_VERBOSE
2366e201339SJohn Kariuki         putchar('.');
2372ca781dfSPablo de Lara #endif
2386e201339SJohn Kariuki         fflush(0);
2396e201339SJohn Kariuki 
2406e201339SJohn Kariuki         // Test combinations of zero and non-zero buffers
2416e201339SJohn Kariuki         for (i = 0; i < RANDOMS; i++) {
2426e201339SJohn Kariuki                 r = rand();
2436e201339SJohn Kariuki                 r = (r % TEST_LEN) ^ (r & (RAND_ALIGN - 1));
2446e201339SJohn Kariuki                 sign = rand() & 1 ? 1 : -1;
2456e201339SJohn Kariuki                 l = r + sign * (rand() & (2 * RAND_ALIGN - 1));
2466e201339SJohn Kariuki 
2476e201339SJohn Kariuki                 if ((l >= TEST_LEN) || (l < 0) || (r >= TEST_LEN))
2486e201339SJohn Kariuki                         continue;
2496e201339SJohn Kariuki 
2506e201339SJohn Kariuki                 a[r] = 1 << (r & (CHAR_BIT - 1));
2516e201339SJohn Kariuki                 ret_neg = isal_zero_detect(a, l);
2526e201339SJohn Kariuki 
2536e201339SJohn Kariuki                 if ((r < l) && (ret_neg == 0)) {
254733901eeSRoy Oursler                         printf("Fail on non-zero rand buffer %d, l=%lld, e=%lld\n", i, l, r);
255c83771eeSPablo de Lara                         failures = -1;
256c83771eeSPablo de Lara                         goto exit;
2576e201339SJohn Kariuki                 }
2586e201339SJohn Kariuki                 if ((r >= l) && (ret_neg != 0)) {
259*aaa78d6aSMarcel Cornu                         printf("Fail on bad pass zero detect rand %d, l=%lld, e=%lld\n", i, l, r);
260c83771eeSPablo de Lara                         failures = -1;
261c83771eeSPablo de Lara                         goto exit;
2626e201339SJohn Kariuki                 }
2636e201339SJohn Kariuki 
2646e201339SJohn Kariuki                 a[r] = 0;
2656e201339SJohn Kariuki         }
2662ca781dfSPablo de Lara #ifdef TEST_VERBOSE
2676e201339SJohn Kariuki         putchar('.');
2682ca781dfSPablo de Lara #endif
2696e201339SJohn Kariuki         fflush(0);
2706e201339SJohn Kariuki 
271c83771eeSPablo de Lara exit:
2726d17992bSGreg Tucker         aligned_free(buf);
2736e201339SJohn Kariuki         printf(failures == 0 ? " Pass\n" : " Fail\n");
2746e201339SJohn Kariuki         return failures;
2756e201339SJohn Kariuki }
276