// SPDX-License-Identifier: GPL-2.0 #include <malloc.h> #include <stdlib.h> #include <string.h> #include <assert.h> #include "utils.h" void *TEST_MEMMOVE(const void *s1, const void *s2, size_t n); #define BUF_LEN 65536 #define MAX_OFFSET 512 size_t max(size_t a, size_t b) { if (a >= b) return a; return b; } static int testcase_run(void) { size_t i, src_off, dst_off, len; char *usermap = memalign(BUF_LEN, BUF_LEN); char *kernelmap = memalign(BUF_LEN, BUF_LEN); assert(usermap != NULL); assert(kernelmap != NULL); memset(usermap, 0, BUF_LEN); memset(kernelmap, 0, BUF_LEN); for (i = 0; i < BUF_LEN; i++) { usermap[i] = i & 0xff; kernelmap[i] = i & 0xff; } for (src_off = 0; src_off < MAX_OFFSET; src_off++) { for (dst_off = 0; dst_off < MAX_OFFSET; dst_off++) { for (len = 1; len < MAX_OFFSET - max(src_off, dst_off); len++) { memmove(usermap + dst_off, usermap + src_off, len); TEST_MEMMOVE(kernelmap + dst_off, kernelmap + src_off, len); if (memcmp(usermap, kernelmap, MAX_OFFSET) != 0) { printf("memmove failed at %ld %ld %ld\n", src_off, dst_off, len); abort(); } } } } return 0; } int main(void) { return test_harness(testcase_run, "memmove"); }