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