1135549Sdes// SPDX-License-Identifier: GPL-2.0
2135549Sdes#include <malloc.h>
3135549Sdes#include <stdlib.h>
4135739Sru#include <string.h>
5135739Sru#include <assert.h>
6135549Sdes#include "utils.h"
7135549Sdes
8135549Sdesvoid *TEST_MEMMOVE(const void *s1, const void *s2, size_t n);
9135549Sdes
10135549Sdes#define BUF_LEN 65536
11135549Sdes#define MAX_OFFSET 512
12135549Sdes
13135549Sdessize_t max(size_t a, size_t b)
14135549Sdes{
15135549Sdes	if (a >= b)
16135549Sdes		return a;
17148389Sdes	return b;
18148389Sdes}
19135549Sdes
20135549Sdesstatic int testcase_run(void)
21{
22	size_t i, src_off, dst_off, len;
23
24	char *usermap = memalign(BUF_LEN, BUF_LEN);
25	char *kernelmap = memalign(BUF_LEN, BUF_LEN);
26
27	assert(usermap != NULL);
28	assert(kernelmap != NULL);
29
30	memset(usermap, 0, BUF_LEN);
31	memset(kernelmap, 0, BUF_LEN);
32
33	for (i = 0; i < BUF_LEN; i++) {
34		usermap[i] = i & 0xff;
35		kernelmap[i] = i & 0xff;
36	}
37
38	for (src_off = 0; src_off < MAX_OFFSET; src_off++) {
39		for (dst_off = 0; dst_off < MAX_OFFSET; dst_off++) {
40			for (len = 1; len < MAX_OFFSET - max(src_off, dst_off); len++) {
41
42				memmove(usermap + dst_off, usermap + src_off, len);
43				TEST_MEMMOVE(kernelmap + dst_off, kernelmap + src_off, len);
44				if (memcmp(usermap, kernelmap, MAX_OFFSET) != 0) {
45					printf("memmove failed at %ld %ld %ld\n",
46							src_off, dst_off, len);
47					abort();
48				}
49			}
50		}
51	}
52	return 0;
53}
54
55int main(void)
56{
57	return test_harness(testcase_run, "memmove");
58}
59