1// SPDX-License-Identifier: GPL-2.0
2#include <malloc.h>
3#include <stdlib.h>
4#include <string.h>
5#include <assert.h>
6#include "utils.h"
7
8void *TEST_MEMMOVE(const void *s1, const void *s2, size_t n);
9
10#define BUF_LEN 65536
11#define MAX_OFFSET 512
12
13size_t max(size_t a, size_t b)
14{
15 if (a >= b)
16 return a;
17 return b;
18}
19
20static 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

source code of linux/tools/testing/selftests/powerpc/copyloops/memmove_validate.c