162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci#include <malloc.h> 362306a36Sopenharmony_ci#include <stdlib.h> 462306a36Sopenharmony_ci#include <string.h> 562306a36Sopenharmony_ci#include <assert.h> 662306a36Sopenharmony_ci#include "utils.h" 762306a36Sopenharmony_ci 862306a36Sopenharmony_civoid *TEST_MEMMOVE(const void *s1, const void *s2, size_t n); 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#define BUF_LEN 65536 1162306a36Sopenharmony_ci#define MAX_OFFSET 512 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_cisize_t max(size_t a, size_t b) 1462306a36Sopenharmony_ci{ 1562306a36Sopenharmony_ci if (a >= b) 1662306a36Sopenharmony_ci return a; 1762306a36Sopenharmony_ci return b; 1862306a36Sopenharmony_ci} 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_cistatic int testcase_run(void) 2162306a36Sopenharmony_ci{ 2262306a36Sopenharmony_ci size_t i, src_off, dst_off, len; 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci char *usermap = memalign(BUF_LEN, BUF_LEN); 2562306a36Sopenharmony_ci char *kernelmap = memalign(BUF_LEN, BUF_LEN); 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci assert(usermap != NULL); 2862306a36Sopenharmony_ci assert(kernelmap != NULL); 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci memset(usermap, 0, BUF_LEN); 3162306a36Sopenharmony_ci memset(kernelmap, 0, BUF_LEN); 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci for (i = 0; i < BUF_LEN; i++) { 3462306a36Sopenharmony_ci usermap[i] = i & 0xff; 3562306a36Sopenharmony_ci kernelmap[i] = i & 0xff; 3662306a36Sopenharmony_ci } 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci for (src_off = 0; src_off < MAX_OFFSET; src_off++) { 3962306a36Sopenharmony_ci for (dst_off = 0; dst_off < MAX_OFFSET; dst_off++) { 4062306a36Sopenharmony_ci for (len = 1; len < MAX_OFFSET - max(src_off, dst_off); len++) { 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci memmove(usermap + dst_off, usermap + src_off, len); 4362306a36Sopenharmony_ci TEST_MEMMOVE(kernelmap + dst_off, kernelmap + src_off, len); 4462306a36Sopenharmony_ci if (memcmp(usermap, kernelmap, MAX_OFFSET) != 0) { 4562306a36Sopenharmony_ci printf("memmove failed at %ld %ld %ld\n", 4662306a36Sopenharmony_ci src_off, dst_off, len); 4762306a36Sopenharmony_ci abort(); 4862306a36Sopenharmony_ci } 4962306a36Sopenharmony_ci } 5062306a36Sopenharmony_ci } 5162306a36Sopenharmony_ci } 5262306a36Sopenharmony_ci return 0; 5362306a36Sopenharmony_ci} 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ciint main(void) 5662306a36Sopenharmony_ci{ 5762306a36Sopenharmony_ci return test_harness(testcase_run, "memmove"); 5862306a36Sopenharmony_ci} 59