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