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 | |
8 | void *TEST_MEMMOVE(const void *s1, const void *s2, size_t n); |
9 | |
10 | #define BUF_LEN 65536 |
11 | #define MAX_OFFSET 512 |
12 | |
13 | size_t max(size_t a, size_t b) |
14 | { |
15 | if (a >= b) |
16 | return a; |
17 | return b; |
18 | } |
19 | |
20 | static 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 | |
55 | int main(void) |
56 | { |
57 | return test_harness(testcase_run, "memmove" ); |
58 | } |
59 | |