Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests/powerpc/copyloops: Add memmove_64 test

While debugging an issue, we wanted to check whether the arch specific
kernel memmove implementation is correct.
This selftest could help test that.

Suggested-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
Suggested-by: Vaibhav Jain <vaibhav@linux.ibm.com>
Signed-off-by: Ritesh Harjani <riteshh@linux.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/57242c1fe7aba6b7f0fcd0490303bfd5f222ee00.1631512686.git.riteshh@linux.ibm.com

authored by

Ritesh Harjani and committed by
Michael Ellerman
2504e5b9 92e6dc25

+76 -1
+1
tools/testing/selftests/powerpc/copyloops/.gitignore
··· 13 13 copyuser_64_exc_t1 14 14 copyuser_64_exc_t2 15 15 copy_mc_64 16 + memmove_64
+8 -1
tools/testing/selftests/powerpc/copyloops/Makefile
··· 13 13 copyuser_p7_t0 copyuser_p7_t1 \ 14 14 memcpy_64_t0 memcpy_64_t1 memcpy_64_t2 \ 15 15 memcpy_p7_t0 memcpy_p7_t1 copy_mc_64 \ 16 - copyuser_64_exc_t0 copyuser_64_exc_t1 copyuser_64_exc_t2 16 + copyuser_64_exc_t0 copyuser_64_exc_t1 copyuser_64_exc_t2 \ 17 + memmove_64 17 18 18 19 EXTRA_SOURCES := validate.c ../harness.c stubs.S 19 20 ··· 56 55 $(CC) $(CPPFLAGS) $(CFLAGS) \ 57 56 -D COPY_LOOP=test___copy_tofrom_user_base \ 58 57 -D SELFTEST_CASE=$(subst copyuser_64_exc_t,,$(notdir $@)) \ 58 + -o $@ $^ 59 + 60 + $(OUTPUT)/memmove_64: mem_64.S memcpy_64.S memmove_validate.c ../harness.c \ 61 + memcpy_stubs.S 62 + $(CC) $(CPPFLAGS) $(CFLAGS) \ 63 + -D TEST_MEMMOVE=test_memmove \ 59 64 -o $@ $^
+1
tools/testing/selftests/powerpc/copyloops/asm/ppc_asm.h
··· 26 26 #define _GLOBAL(A) FUNC_START(test_ ## A) 27 27 #define _GLOBAL_TOC(A) _GLOBAL(A) 28 28 #define _GLOBAL_TOC_KASAN(A) _GLOBAL(A) 29 + #define _GLOBAL_KASAN(A) _GLOBAL(A) 29 30 30 31 #define PPC_MTOCRF(A, B) mtocrf A, B 31 32
+8
tools/testing/selftests/powerpc/copyloops/memcpy_stubs.S
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + #include <asm/ppc_asm.h> 3 + 4 + FUNC_START(memcpy) 5 + b test_memcpy 6 + 7 + FUNC_START(backwards_memcpy) 8 + b test_backwards_memcpy
+58
tools/testing/selftests/powerpc/copyloops/memmove_validate.c
··· 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 + }