|
Packit |
961e70 |
/*
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
This file is provided under a dual BSD/GPLv2 license. When using or
|
|
Packit |
961e70 |
redistributing this file, you may do so under either license.
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
GPL LICENSE SUMMARY
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
Copyright(c) 2015 Intel Corporation.
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
This program is free software; you can redistribute it and/or modify
|
|
Packit |
961e70 |
it under the terms of version 2 of the GNU General Public License as
|
|
Packit |
961e70 |
published by the Free Software Foundation.
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
This program is distributed in the hope that it will be useful, but
|
|
Packit |
961e70 |
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
961e70 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
961e70 |
General Public License for more details.
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
Contact Information:
|
|
Packit |
961e70 |
Intel Corporation, www.intel.com
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
BSD LICENSE
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
Copyright(c) 2015 Intel Corporation.
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
Redistribution and use in source and binary forms, with or without
|
|
Packit |
961e70 |
modification, are permitted provided that the following conditions
|
|
Packit |
961e70 |
are met:
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
* Redistributions of source code must retain the above copyright
|
|
Packit |
961e70 |
notice, this list of conditions and the following disclaimer.
|
|
Packit |
961e70 |
* Redistributions in binary form must reproduce the above copyright
|
|
Packit |
961e70 |
notice, this list of conditions and the following disclaimer in
|
|
Packit |
961e70 |
the documentation and/or other materials provided with the
|
|
Packit |
961e70 |
distribution.
|
|
Packit |
961e70 |
* Neither the name of Intel Corporation nor the names of its
|
|
Packit |
961e70 |
contributors may be used to endorse or promote products derived
|
|
Packit |
961e70 |
from this software without specific prior written permission.
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
Packit |
961e70 |
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
Packit |
961e70 |
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
Packit |
961e70 |
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
Packit |
961e70 |
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
Packit |
961e70 |
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
Packit |
961e70 |
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
Packit |
961e70 |
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
Packit |
961e70 |
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
Packit |
961e70 |
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
Packit |
961e70 |
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
*/
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
/* Copyright (c) 2003-2014 Intel Corporation. All rights reserved. */
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
#include "psm_user.h"
|
|
Packit |
961e70 |
#include "psm_mq_internal.h"
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
typedef void (*memcpy_fn_t) (void *dst, const void *src, size_t n);
|
|
Packit |
961e70 |
static int psmi_test_memcpy(memcpy_fn_t, const char *name);
|
|
Packit |
961e70 |
static int psmi_test_epid_table(int numelems);
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
int psmi_diags(void);
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
#define diags_assert(x) do { \
|
|
Packit |
961e70 |
if (!(x)) { \
|
|
Packit |
961e70 |
_HFI_ERROR("Diags assertion failure: %s\n", \
|
|
Packit |
961e70 |
#x); \
|
|
Packit |
961e70 |
goto fail; \
|
|
Packit |
961e70 |
} \
|
|
Packit |
961e70 |
} while (0)
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
#define DIAGS_RETURN_PASS(str) \
|
|
Packit |
961e70 |
do { _HFI_INFO("%s: PASSED %s\n", __func__, str); return 0; } \
|
|
Packit |
961e70 |
while (0)
|
|
Packit |
961e70 |
#define DIAGS_RETURN_FAIL(str) \
|
|
Packit |
961e70 |
do { _HFI_INFO("%s: FAILED %s\n", __func__, str); return 1; } \
|
|
Packit |
961e70 |
while (0)
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
int psmi_diags(void)
|
|
Packit |
961e70 |
{
|
|
Packit |
961e70 |
int ret = 0;
|
|
Packit |
961e70 |
ret |= psmi_test_epid_table(2048);
|
|
Packit |
961e70 |
ret |= psmi_test_memcpy((memcpy_fn_t) psmi_memcpyo, "psmi_memcpyo");
|
|
Packit |
961e70 |
/* ret |= psmi_test_memcpy((memcpy_fn_t) psmi_mq_mtucpy, "psmi_mq_mtucpy"); */
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
if (ret)
|
|
Packit |
961e70 |
DIAGS_RETURN_FAIL("");
|
|
Packit |
961e70 |
else
|
|
Packit |
961e70 |
DIAGS_RETURN_PASS("");
|
|
Packit |
961e70 |
}
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
/*
|
|
Packit |
961e70 |
* Hash table test
|
|
Packit |
961e70 |
*/
|
|
Packit |
961e70 |
#define NALLOC 1024
|
|
Packit |
961e70 |
static int psmi_test_epid_table(int numelems)
|
|
Packit |
961e70 |
{
|
|
Packit |
961e70 |
ptl_ctl_t ctl;
|
|
Packit |
961e70 |
psm2_epaddr_t *ep_array, epaddr, ep_alloc;
|
|
Packit |
961e70 |
psm2_epid_t *epid_array, epid_tmp;
|
|
Packit |
961e70 |
psm2_ep_t ep = (psm2_ep_t) (uintptr_t) 0xabcdef00;
|
|
Packit |
961e70 |
struct psmi_epid_table *tab;
|
|
Packit |
961e70 |
int i, j;
|
|
Packit |
961e70 |
struct drand48_data drand48_data;
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
ep_alloc =
|
|
Packit |
961e70 |
(psm2_epaddr_t) psmi_calloc(PSMI_EP_NONE, UNDEFINED, numelems,
|
|
Packit |
961e70 |
sizeof(struct psm2_epaddr));
|
|
Packit |
961e70 |
ep_array =
|
|
Packit |
961e70 |
(psm2_epaddr_t *) psmi_calloc(PSMI_EP_NONE, UNDEFINED, numelems,
|
|
Packit |
961e70 |
sizeof(struct psm2_epaddr *));
|
|
Packit |
961e70 |
epid_array =
|
|
Packit |
961e70 |
(psm2_epid_t *) psmi_calloc(PSMI_EP_NONE, UNDEFINED, numelems,
|
|
Packit |
961e70 |
sizeof(psm2_epid_t));
|
|
Packit |
961e70 |
diags_assert(ep_alloc != NULL);
|
|
Packit |
961e70 |
diags_assert(ep_array != NULL);
|
|
Packit |
961e70 |
diags_assert(epid_array != NULL);
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
srand48_r(12345678, &drand48_data);
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
psmi_epid_init();
|
|
Packit |
961e70 |
tab = &psmi_epid_table;
|
|
Packit |
961e70 |
ctl.ep = ep;
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
for (i = 0; i < numelems; i++) {
|
|
Packit |
961e70 |
epid_array[i] = i;
|
|
Packit |
961e70 |
ep_alloc[i].ptlctl = &ctl;
|
|
Packit |
961e70 |
ep_alloc[i].epid = epid_array[i];
|
|
Packit |
961e70 |
ep_array[i] = &ep_alloc[i];
|
|
Packit |
961e70 |
}
|
|
Packit |
961e70 |
for (i = 0; i < numelems; i++) {
|
|
Packit |
961e70 |
psmi_epid_add(ep, epid_array[i], ep_array[i]);
|
|
Packit |
961e70 |
}
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
/* Randomize epid_array */
|
|
Packit |
961e70 |
for (i = 0; i < numelems; i++) {
|
|
Packit |
961e70 |
long int rand_result;
|
|
Packit |
961e70 |
lrand48_r(&drand48_data, &rand_result);
|
|
Packit |
961e70 |
j = (int)(rand_result % numelems);
|
|
Packit |
961e70 |
epid_tmp = epid_array[i];
|
|
Packit |
961e70 |
epid_array[i] = epid_array[j];
|
|
Packit |
961e70 |
epid_array[j] = epid_tmp;
|
|
Packit |
961e70 |
}
|
|
Packit |
961e70 |
/* Lookup. */
|
|
Packit |
961e70 |
for (i = 0; i < numelems; i++) {
|
|
Packit |
961e70 |
epaddr = psmi_epid_lookup(ep, epid_array[i]);
|
|
Packit |
961e70 |
diags_assert(epaddr != NULL);
|
|
Packit |
961e70 |
diags_assert(epaddr->epid == epid_array[i]);
|
|
Packit |
961e70 |
diags_assert(epaddr->ptlctl->ep == ep);
|
|
Packit |
961e70 |
}
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
/* Randomize epid_array again */
|
|
Packit |
961e70 |
for (i = 0; i < numelems; i++) {
|
|
Packit |
961e70 |
long int rand_result;
|
|
Packit |
961e70 |
lrand48_r(&drand48_data, &rand_result);
|
|
Packit |
961e70 |
j = (int)(rand_result % numelems);
|
|
Packit |
961e70 |
epid_tmp = epid_array[i];
|
|
Packit |
961e70 |
epid_array[i] = epid_array[j];
|
|
Packit |
961e70 |
epid_array[j] = epid_tmp;
|
|
Packit |
961e70 |
}
|
|
Packit |
961e70 |
/* Delete half */
|
|
Packit |
961e70 |
for (i = 0; i < numelems / 2; i++) {
|
|
Packit |
961e70 |
epaddr = psmi_epid_remove(ep, epid_array[i]);
|
|
Packit |
961e70 |
diags_assert(epaddr != NULL);
|
|
Packit |
961e70 |
diags_assert(epaddr->epid == epid_array[i]);
|
|
Packit |
961e70 |
diags_assert(epaddr->ptlctl->ep == ep);
|
|
Packit |
961e70 |
}
|
|
Packit |
961e70 |
/* Lookup other half -- expect non-NULL, then delete */
|
|
Packit |
961e70 |
for (i = numelems / 2; i < numelems; i++) {
|
|
Packit |
961e70 |
epaddr = psmi_epid_lookup(ep, epid_array[i]);
|
|
Packit |
961e70 |
diags_assert(epaddr != NULL);
|
|
Packit |
961e70 |
diags_assert(epaddr->epid == epid_array[i]);
|
|
Packit |
961e70 |
diags_assert(epaddr->ptlctl->ep == ep);
|
|
Packit |
961e70 |
epaddr = psmi_epid_remove(ep, epid_array[i]);
|
|
Packit |
961e70 |
epaddr = psmi_epid_lookup(ep, epid_array[i]);
|
|
Packit |
961e70 |
diags_assert(epaddr == NULL);
|
|
Packit |
961e70 |
}
|
|
Packit |
961e70 |
/* Lookup whole thing, expect done */
|
|
Packit |
961e70 |
for (i = 0; i < numelems; i++) {
|
|
Packit |
961e70 |
epaddr = psmi_epid_lookup(ep, epid_array[i]);
|
|
Packit |
961e70 |
diags_assert(epaddr == NULL);
|
|
Packit |
961e70 |
}
|
|
Packit |
961e70 |
for (i = 0; i < tab->tabsize; i++) {
|
|
Packit |
961e70 |
diags_assert(tab->table[i].entry == NULL ||
|
|
Packit |
961e70 |
tab->table[i].entry == EPADDR_DELETED);
|
|
Packit |
961e70 |
}
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
/* Make sure we're not leaking memory somewhere... */
|
|
Packit |
961e70 |
diags_assert(tab->tabsize > tab->tabsize_used &&
|
|
Packit |
961e70 |
tab->tabsize * PSMI_EPID_TABLOAD_FACTOR >
|
|
Packit |
961e70 |
tab->tabsize_used);
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
/* Only free on success */
|
|
Packit |
961e70 |
psmi_epid_fini();
|
|
Packit |
961e70 |
psmi_free(epid_array);
|
|
Packit |
961e70 |
psmi_free(ep_array);
|
|
Packit |
961e70 |
psmi_free(ep_alloc);
|
|
Packit |
961e70 |
DIAGS_RETURN_PASS("");
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
fail:
|
|
Packit |
961e70 |
/* Klocwork scan report memory leak. */
|
|
Packit |
961e70 |
psmi_epid_fini();
|
|
Packit |
961e70 |
if (epid_array)
|
|
Packit |
961e70 |
psmi_free(epid_array);
|
|
Packit |
961e70 |
if (ep_array)
|
|
Packit |
961e70 |
psmi_free(ep_array);
|
|
Packit |
961e70 |
if (ep_alloc)
|
|
Packit |
961e70 |
psmi_free(ep_alloc);
|
|
Packit |
961e70 |
DIAGS_RETURN_FAIL("");
|
|
Packit |
961e70 |
}
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
/*
|
|
Packit |
961e70 |
* Memcpy correctness test
|
|
Packit |
961e70 |
*/
|
|
Packit |
961e70 |
static int memcpy_check_size(memcpy_fn_t fn, int *p, int *f, size_t n);
|
|
Packit |
961e70 |
static void *memcpy_check_one(memcpy_fn_t fn, void *dst, void *src, size_t n);
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
static int psmi_test_memcpy(memcpy_fn_t fn, const char *memcpy_name)
|
|
Packit |
961e70 |
{
|
|
Packit |
961e70 |
const int CORNERS = 0;
|
|
Packit |
961e70 |
const long long lo = 1;
|
|
Packit |
961e70 |
const long long hi = 16 * 1024 * 1024;
|
|
Packit |
961e70 |
const long long below = 32;
|
|
Packit |
961e70 |
const long long above = 32;
|
|
Packit |
961e70 |
long long n, m;
|
|
Packit |
961e70 |
char buf[128];
|
|
Packit |
961e70 |
int ret = 0;
|
|
Packit |
961e70 |
int memcpy_passed;
|
|
Packit |
961e70 |
int memcpy_failed;
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
memcpy_passed = 0;
|
|
Packit |
961e70 |
memcpy_failed = 0;
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
ret = memcpy_check_size(fn, &memcpy_passed, &memcpy_failed, 0);
|
|
Packit |
961e70 |
if (ret < 0)
|
|
Packit |
961e70 |
DIAGS_RETURN_FAIL("no heap space");
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
for (n = lo; n <= hi; n <<= 1) {
|
|
Packit |
961e70 |
_HFI_INFO("%s %d align=0..16\n", memcpy_name, (int)n);
|
|
Packit |
961e70 |
for (m = n - below; m <= n + above; m++) {
|
|
Packit |
961e70 |
if (m == n) {
|
|
Packit |
961e70 |
ret =
|
|
Packit |
961e70 |
memcpy_check_size(fn, &memcpy_passed,
|
|
Packit |
961e70 |
&memcpy_failed, n);
|
|
Packit |
961e70 |
if (ret < 0)
|
|
Packit |
961e70 |
DIAGS_RETURN_FAIL("no heap space");
|
|
Packit |
961e70 |
} else if (CORNERS && m >= lo && m <= hi && m > (n >> 1)
|
|
Packit |
961e70 |
&& m < max(n, ((n << 1) - below))) {
|
|
Packit |
961e70 |
ret =
|
|
Packit |
961e70 |
memcpy_check_size(fn, &memcpy_passed,
|
|
Packit |
961e70 |
&memcpy_failed,
|
|
Packit |
961e70 |
(size_t) m);
|
|
Packit |
961e70 |
if (ret < 0)
|
|
Packit |
961e70 |
DIAGS_RETURN_FAIL("no heap space");
|
|
Packit |
961e70 |
}
|
|
Packit |
961e70 |
}
|
|
Packit |
961e70 |
}
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
int total = memcpy_passed + memcpy_failed;
|
|
Packit |
961e70 |
if (total > 0) {
|
|
Packit |
961e70 |
_HFI_INFO("%d memcpy tests with %d passed (%.2f%%) "
|
|
Packit |
961e70 |
"and %d failed (%.2f%%)\n",
|
|
Packit |
961e70 |
total, memcpy_passed, (100.0 * memcpy_passed) / total,
|
|
Packit |
961e70 |
memcpy_failed, (100.0 * memcpy_failed) / total);
|
|
Packit |
961e70 |
}
|
|
Packit |
961e70 |
if (memcpy_failed) {
|
|
Packit |
961e70 |
snprintf(buf, sizeof(buf), "%s %.2f%% of tests memcpy_failed",
|
|
Packit |
961e70 |
memcpy_name, (100.0 * memcpy_failed) / total);
|
|
Packit |
961e70 |
DIAGS_RETURN_FAIL(buf);
|
|
Packit |
961e70 |
} else {
|
|
Packit |
961e70 |
DIAGS_RETURN_PASS(memcpy_name);
|
|
Packit |
961e70 |
}
|
|
Packit |
961e70 |
}
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
void *memcpy_check_one(memcpy_fn_t fn, void *dst, void *src, size_t n)
|
|
Packit |
961e70 |
{
|
|
Packit |
961e70 |
int ok = 1;
|
|
Packit |
961e70 |
unsigned int seed = (unsigned int)
|
|
Packit |
961e70 |
((uintptr_t) dst ^ (uintptr_t) src ^ (uintptr_t) n);
|
|
Packit |
961e70 |
size_t i;
|
|
Packit |
961e70 |
struct drand48_data drand48_data;
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
if (!n)
|
|
Packit |
961e70 |
return dst;
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
memset(src, 0x55, n);
|
|
Packit |
961e70 |
memset(dst, 0xaa, n);
|
|
Packit |
961e70 |
srand48_r(seed, &drand48_data);
|
|
Packit |
961e70 |
for (i = 0; i < n; i++) {
|
|
Packit |
961e70 |
long int rand_result;
|
|
Packit |
961e70 |
lrand48_r(&drand48_data, &rand_result);
|
|
Packit |
961e70 |
((uint8_t *) src)[i] = (((int)(rand_result & INT_MAX)) >> 16) & 0xff;
|
|
Packit |
961e70 |
}
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
fn(dst, src, n);
|
|
Packit |
961e70 |
memset(src, 0, n);
|
|
Packit |
961e70 |
srand48_r(seed, &drand48_data);
|
|
Packit |
961e70 |
for (i = 0; i < n; i++) {
|
|
Packit |
961e70 |
long int rand_result;
|
|
Packit |
961e70 |
lrand48_r(&drand48_data, &rand_result);
|
|
Packit |
961e70 |
int value = (int)(uint8_t) (((int)(rand_result % INT_MAX)) >> 16);
|
|
Packit |
961e70 |
int v = (int)((uint8_t *) dst)[i];
|
|
Packit |
961e70 |
if (v != value) {
|
|
Packit |
961e70 |
_HFI_ERROR
|
|
Packit |
961e70 |
("Error on index %llu : got %d instead of %d\n",
|
|
Packit |
961e70 |
(unsigned long long)i, v, value);
|
|
Packit |
961e70 |
ok = 0;
|
|
Packit |
961e70 |
}
|
|
Packit |
961e70 |
}
|
|
Packit |
961e70 |
return ok ? dst : NULL;
|
|
Packit |
961e70 |
}
|
|
Packit |
961e70 |
|
|
Packit |
961e70 |
int memcpy_check_size(memcpy_fn_t fn, int *p, int *f, size_t n)
|
|
Packit |
961e70 |
{
|
|
Packit |
961e70 |
#define num_aligns 16
|
|
Packit |
961e70 |
#define USE_MALLOC 0
|
|
Packit |
961e70 |
#define DEBUG 0
|
|
Packit |
961e70 |
uint8_t *src;
|
|
Packit |
961e70 |
uint8_t *dst;
|
|
Packit |
961e70 |
size_t size = n * 2 + num_aligns;
|
|
Packit |
961e70 |
if (USE_MALLOC) {
|
|
Packit |
961e70 |
src = psmi_malloc(PSMI_EP_NONE, UNDEFINED, size);
|
|
Packit |
961e70 |
dst = psmi_malloc(PSMI_EP_NONE, UNDEFINED, size);
|
|
Packit Service |
7ed5cc |
if (src == NULL || dst == NULL) {
|
|
Packit Service |
7ed5cc |
if (src) psmi_free(src);
|
|
Packit Service |
7ed5cc |
if (dst) psmi_free(dst);
|
|
Packit Service |
7ed5cc |
return -1;
|
|
Packit Service |
7ed5cc |
}
|
|
Packit |
961e70 |
} else {
|
|
Packit Service |
7ed5cc |
void *src_p = NULL, *dst_p = NULL;
|
|
Packit |
961e70 |
if (posix_memalign(&src_p, 64, size) != 0 ||
|
|
Packit Service |
7ed5cc |
posix_memalign(&dst_p, 64, size) != 0) {
|
|
Packit Service |
7ed5cc |
if (src_p) free(src_p);
|
|
Packit Service |
7ed5cc |
if (dst_p) free(dst_p);
|
|
Packit |
961e70 |
return -1;
|
|
Packit |
961e70 |
}
|
|
Packit Service |
7ed5cc |
src = (uint8_t *) src_p;
|
|
Packit Service |
7ed5cc |
dst = (uint8_t *) dst_p;
|
|
Packit |
961e70 |
}
|
|
Packit Service |
7ed5cc |
|
|
Packit |
961e70 |
int src_align, dst_align;
|
|
Packit |
961e70 |
for (src_align = 0; src_align < num_aligns; src_align++) {
|
|
Packit |
961e70 |
for (dst_align = 0; dst_align < num_aligns; dst_align++) {
|
|
Packit |
961e70 |
uint8_t *d = ((uint8_t *) dst) + dst_align;
|
|
Packit |
961e70 |
uint8_t *s = ((uint8_t *) src) + src_align;
|
|
Packit |
961e70 |
int ok = (memcpy_check_one(fn, d, s, n) != NULL);
|
|
Packit |
961e70 |
if (DEBUG || !ok) {
|
|
Packit |
961e70 |
_HFI_INFO("memcpy(%p, %p, %llu) : %s\n", d, s,
|
|
Packit |
961e70 |
(unsigned long long)n,
|
|
Packit |
961e70 |
ok ? "passed" : "failed");
|
|
Packit |
961e70 |
}
|
|
Packit |
961e70 |
if (ok) {
|
|
Packit |
961e70 |
(*p)++;
|
|
Packit |
961e70 |
} else {
|
|
Packit |
961e70 |
(*f)++;
|
|
Packit |
961e70 |
}
|
|
Packit |
961e70 |
}
|
|
Packit |
961e70 |
}
|
|
Packit Service |
7ed5cc |
if (USE_MALLOC) {
|
|
Packit Service |
7ed5cc |
psmi_free(src);
|
|
Packit Service |
7ed5cc |
psmi_free(dst);
|
|
Packit Service |
7ed5cc |
} else {
|
|
Packit Service |
7ed5cc |
free(src);
|
|
Packit Service |
7ed5cc |
free(dst);
|
|
Packit Service |
7ed5cc |
}
|
|
Packit |
961e70 |
return 0;
|
|
Packit |
961e70 |
}
|