mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-09 22:50:41 +00:00
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
This commit is contained in:
parent
92e6dc257b
commit
2504e5b982
@ -13,3 +13,4 @@ copyuser_64_exc_t0
|
||||
copyuser_64_exc_t1
|
||||
copyuser_64_exc_t2
|
||||
copy_mc_64
|
||||
memmove_64
|
||||
|
@ -13,7 +13,8 @@ TEST_GEN_PROGS := copyuser_64_t0 copyuser_64_t1 copyuser_64_t2 \
|
||||
copyuser_p7_t0 copyuser_p7_t1 \
|
||||
memcpy_64_t0 memcpy_64_t1 memcpy_64_t2 \
|
||||
memcpy_p7_t0 memcpy_p7_t1 copy_mc_64 \
|
||||
copyuser_64_exc_t0 copyuser_64_exc_t1 copyuser_64_exc_t2
|
||||
copyuser_64_exc_t0 copyuser_64_exc_t1 copyuser_64_exc_t2 \
|
||||
memmove_64
|
||||
|
||||
EXTRA_SOURCES := validate.c ../harness.c stubs.S
|
||||
|
||||
@ -56,3 +57,9 @@ $(OUTPUT)/copyuser_64_exc_t%: copyuser_64.S exc_validate.c ../harness.c \
|
||||
-D COPY_LOOP=test___copy_tofrom_user_base \
|
||||
-D SELFTEST_CASE=$(subst copyuser_64_exc_t,,$(notdir $@)) \
|
||||
-o $@ $^
|
||||
|
||||
$(OUTPUT)/memmove_64: mem_64.S memcpy_64.S memmove_validate.c ../harness.c \
|
||||
memcpy_stubs.S
|
||||
$(CC) $(CPPFLAGS) $(CFLAGS) \
|
||||
-D TEST_MEMMOVE=test_memmove \
|
||||
-o $@ $^
|
||||
|
@ -26,6 +26,7 @@
|
||||
#define _GLOBAL(A) FUNC_START(test_ ## A)
|
||||
#define _GLOBAL_TOC(A) _GLOBAL(A)
|
||||
#define _GLOBAL_TOC_KASAN(A) _GLOBAL(A)
|
||||
#define _GLOBAL_KASAN(A) _GLOBAL(A)
|
||||
|
||||
#define PPC_MTOCRF(A, B) mtocrf A, B
|
||||
|
||||
|
1
tools/testing/selftests/powerpc/copyloops/mem_64.S
Symbolic link
1
tools/testing/selftests/powerpc/copyloops/mem_64.S
Symbolic link
@ -0,0 +1 @@
|
||||
../../../../../arch/powerpc/lib/mem_64.S
|
8
tools/testing/selftests/powerpc/copyloops/memcpy_stubs.S
Normal file
8
tools/testing/selftests/powerpc/copyloops/memcpy_stubs.S
Normal file
@ -0,0 +1,8 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#include <asm/ppc_asm.h>
|
||||
|
||||
FUNC_START(memcpy)
|
||||
b test_memcpy
|
||||
|
||||
FUNC_START(backwards_memcpy)
|
||||
b test_backwards_memcpy
|
58
tools/testing/selftests/powerpc/copyloops/memmove_validate.c
Normal file
58
tools/testing/selftests/powerpc/copyloops/memmove_validate.c
Normal file
@ -0,0 +1,58 @@
|
||||
// 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");
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user