* [PATCH 1/1] selftests/powerpc: Add memmove_64 test
@ 2021-08-18 15:50 Ritesh Harjani
2021-09-10 3:57 ` Ritesh Harjani
2021-09-11 11:26 ` Michael Ellerman
0 siblings, 2 replies; 4+ messages in thread
From: Ritesh Harjani @ 2021-08-18 15:50 UTC (permalink / raw)
To: linuxppc-dev; +Cc: Aneesh Kumar K . V, Ritesh Harjani, Vaibhav Jain
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>
---
tools/testing/selftests/powerpc/Makefile | 1 +
.../selftests/powerpc/memmoveloop/.gitignore | 2 +
.../selftests/powerpc/memmoveloop/Makefile | 19 +++++++
.../powerpc/memmoveloop/asm/asm-compat.h | 0
.../powerpc/memmoveloop/asm/export.h | 4 ++
.../powerpc/memmoveloop/asm/feature-fixups.h | 0
.../selftests/powerpc/memmoveloop/asm/kasan.h | 0
.../powerpc/memmoveloop/asm/ppc_asm.h | 39 +++++++++++++
.../powerpc/memmoveloop/asm/processor.h | 0
.../selftests/powerpc/memmoveloop/mem_64.S | 1 +
.../selftests/powerpc/memmoveloop/memcpy_64.S | 1 +
.../selftests/powerpc/memmoveloop/stubs.S | 8 +++
.../selftests/powerpc/memmoveloop/validate.c | 56 +++++++++++++++++++
13 files changed, 131 insertions(+)
create mode 100644 tools/testing/selftests/powerpc/memmoveloop/.gitignore
create mode 100644 tools/testing/selftests/powerpc/memmoveloop/Makefile
create mode 100644 tools/testing/selftests/powerpc/memmoveloop/asm/asm-compat.h
create mode 100644 tools/testing/selftests/powerpc/memmoveloop/asm/export.h
create mode 100644 tools/testing/selftests/powerpc/memmoveloop/asm/feature-fixups.h
create mode 100644 tools/testing/selftests/powerpc/memmoveloop/asm/kasan.h
create mode 100644 tools/testing/selftests/powerpc/memmoveloop/asm/ppc_asm.h
create mode 100644 tools/testing/selftests/powerpc/memmoveloop/asm/processor.h
create mode 120000 tools/testing/selftests/powerpc/memmoveloop/mem_64.S
create mode 120000 tools/testing/selftests/powerpc/memmoveloop/memcpy_64.S
create mode 100644 tools/testing/selftests/powerpc/memmoveloop/stubs.S
create mode 100644 tools/testing/selftests/powerpc/memmoveloop/validate.c
diff --git a/tools/testing/selftests/powerpc/Makefile b/tools/testing/selftests/powerpc/Makefile
index 0830e63818c1..d110b3e5cbcd 100644
--- a/tools/testing/selftests/powerpc/Makefile
+++ b/tools/testing/selftests/powerpc/Makefile
@@ -16,6 +16,7 @@ export CFLAGS
SUB_DIRS = alignment \
benchmarks \
cache_shape \
+ memmoveloop \
copyloops \
dscr \
mm \
diff --git a/tools/testing/selftests/powerpc/memmoveloop/.gitignore b/tools/testing/selftests/powerpc/memmoveloop/.gitignore
new file mode 100644
index 000000000000..56c1426013d5
--- /dev/null
+++ b/tools/testing/selftests/powerpc/memmoveloop/.gitignore
@@ -0,0 +1,2 @@
+# SPDX-License-Identifier: GPL-2.0-only
+memmove_64
diff --git a/tools/testing/selftests/powerpc/memmoveloop/Makefile b/tools/testing/selftests/powerpc/memmoveloop/Makefile
new file mode 100644
index 000000000000..d58d8c100099
--- /dev/null
+++ b/tools/testing/selftests/powerpc/memmoveloop/Makefile
@@ -0,0 +1,19 @@
+# SPDX-License-Identifier: GPL-2.0
+CFLAGS += -m64
+CFLAGS += -I$(CURDIR)
+CFLAGS += -D SELFTEST
+CFLAGS += -maltivec
+
+ASFLAGS = $(CFLAGS) -Wa,-mpower4
+
+TEST_GEN_PROGS := memmove_64
+EXTRA_SOURCES := validate.c ../harness.c stubs.S
+CPPFLAGS += -D TEST_MEMMOVE=test_memmove
+
+top_srcdir = ../../../../..
+include ../../lib.mk
+
+$(OUTPUT)/memmove_64: mem_64.S memcpy_64.S $(EXTRA_SOURCES)
+ $(CC) $(CPPFLAGS) $(CFLAGS) \
+ -D TEST_MEMMOVE=test_memmove \
+ -o $@ $^
diff --git a/tools/testing/selftests/powerpc/memmoveloop/asm/asm-compat.h b/tools/testing/selftests/powerpc/memmoveloop/asm/asm-compat.h
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/tools/testing/selftests/powerpc/memmoveloop/asm/export.h b/tools/testing/selftests/powerpc/memmoveloop/asm/export.h
new file mode 100644
index 000000000000..e6b80d5fbd14
--- /dev/null
+++ b/tools/testing/selftests/powerpc/memmoveloop/asm/export.h
@@ -0,0 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#define EXPORT_SYMBOL(x)
+#define EXPORT_SYMBOL_GPL(x)
+#define EXPORT_SYMBOL_KASAN(x)
diff --git a/tools/testing/selftests/powerpc/memmoveloop/asm/feature-fixups.h b/tools/testing/selftests/powerpc/memmoveloop/asm/feature-fixups.h
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/tools/testing/selftests/powerpc/memmoveloop/asm/kasan.h b/tools/testing/selftests/powerpc/memmoveloop/asm/kasan.h
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/tools/testing/selftests/powerpc/memmoveloop/asm/ppc_asm.h b/tools/testing/selftests/powerpc/memmoveloop/asm/ppc_asm.h
new file mode 100644
index 000000000000..117005c56e19
--- /dev/null
+++ b/tools/testing/selftests/powerpc/memmoveloop/asm/ppc_asm.h
@@ -0,0 +1,39 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef __SELFTESTS_POWERPC_PPC_ASM_H
+#define __SELFTESTS_POWERPC_PPC_ASM_H
+#include <ppc-asm.h>
+
+#define CONFIG_ALTIVEC
+
+#define r1 1
+
+#define R14 r14
+#define R15 r15
+#define R16 r16
+#define R17 r17
+#define R18 r18
+#define R19 r19
+#define R20 r20
+#define R21 r21
+#define R22 r22
+#define R29 r29
+#define R30 r30
+#define R31 r31
+
+#define STACKFRAMESIZE 256
+#define STK_REG(i) (112 + ((i)-14)*8)
+
+#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
+
+#define BEGIN_FTR_SECTION
+#define FTR_SECTION_ELSE
+#define ALT_FTR_SECTION_END_IFCLR(x)
+#define ALT_FTR_SECTION_END(x, y)
+#define END_FTR_SECTION_IFCLR(x)
+
+#endif /* __SELFTESTS_POWERPC_PPC_ASM_H */
diff --git a/tools/testing/selftests/powerpc/memmoveloop/asm/processor.h b/tools/testing/selftests/powerpc/memmoveloop/asm/processor.h
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/tools/testing/selftests/powerpc/memmoveloop/mem_64.S b/tools/testing/selftests/powerpc/memmoveloop/mem_64.S
new file mode 120000
index 000000000000..db254c9a5f5c
--- /dev/null
+++ b/tools/testing/selftests/powerpc/memmoveloop/mem_64.S
@@ -0,0 +1 @@
+../../../../../arch/powerpc/lib/mem_64.S
\ No newline at end of file
diff --git a/tools/testing/selftests/powerpc/memmoveloop/memcpy_64.S b/tools/testing/selftests/powerpc/memmoveloop/memcpy_64.S
new file mode 120000
index 000000000000..cce33fb6f9d8
--- /dev/null
+++ b/tools/testing/selftests/powerpc/memmoveloop/memcpy_64.S
@@ -0,0 +1 @@
+../../../../../arch/powerpc/lib/memcpy_64.S
\ No newline at end of file
diff --git a/tools/testing/selftests/powerpc/memmoveloop/stubs.S b/tools/testing/selftests/powerpc/memmoveloop/stubs.S
new file mode 100644
index 000000000000..d9baa832fa49
--- /dev/null
+++ b/tools/testing/selftests/powerpc/memmoveloop/stubs.S
@@ -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
diff --git a/tools/testing/selftests/powerpc/memmoveloop/validate.c b/tools/testing/selftests/powerpc/memmoveloop/validate.c
new file mode 100644
index 000000000000..52f7d32bb3fe
--- /dev/null
+++ b/tools/testing/selftests/powerpc/memmoveloop/validate.c
@@ -0,0 +1,56 @@
+// 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");
+}
--
2.31.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 1/1] selftests/powerpc: Add memmove_64 test
2021-08-18 15:50 [PATCH 1/1] selftests/powerpc: Add memmove_64 test Ritesh Harjani
@ 2021-09-10 3:57 ` Ritesh Harjani
2021-09-11 11:26 ` Michael Ellerman
1 sibling, 0 replies; 4+ messages in thread
From: Ritesh Harjani @ 2021-09-10 3:57 UTC (permalink / raw)
To: linuxppc-dev; +Cc: Aneesh Kumar K . V, Vaibhav Jain
Gentle ping!
-ritesh
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 1/1] selftests/powerpc: Add memmove_64 test
2021-08-18 15:50 [PATCH 1/1] selftests/powerpc: Add memmove_64 test Ritesh Harjani
2021-09-10 3:57 ` Ritesh Harjani
@ 2021-09-11 11:26 ` Michael Ellerman
2021-09-13 2:57 ` Ritesh Harjani
1 sibling, 1 reply; 4+ messages in thread
From: Michael Ellerman @ 2021-09-11 11:26 UTC (permalink / raw)
To: Ritesh Harjani, linuxppc-dev
Cc: Aneesh Kumar K . V, Ritesh Harjani, Vaibhav Jain
Ritesh Harjani <riteshh@linux.ibm.com> writes:
> 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>
> ---
> tools/testing/selftests/powerpc/Makefile | 1 +
> .../selftests/powerpc/memmoveloop/.gitignore | 2 +
> .../selftests/powerpc/memmoveloop/Makefile | 19 +++++++
> .../powerpc/memmoveloop/asm/asm-compat.h | 0
> .../powerpc/memmoveloop/asm/export.h | 4 ++
> .../powerpc/memmoveloop/asm/feature-fixups.h | 0
> .../selftests/powerpc/memmoveloop/asm/kasan.h | 0
> .../powerpc/memmoveloop/asm/ppc_asm.h | 39 +++++++++++++
> .../powerpc/memmoveloop/asm/processor.h | 0
> .../selftests/powerpc/memmoveloop/mem_64.S | 1 +
> .../selftests/powerpc/memmoveloop/memcpy_64.S | 1 +
> .../selftests/powerpc/memmoveloop/stubs.S | 8 +++
> .../selftests/powerpc/memmoveloop/validate.c | 56 +++++++++++++++++++
> 13 files changed, 131 insertions(+)
> create mode 100644 tools/testing/selftests/powerpc/memmoveloop/.gitignore
> create mode 100644 tools/testing/selftests/powerpc/memmoveloop/Makefile
> create mode 100644 tools/testing/selftests/powerpc/memmoveloop/asm/asm-compat.h
> create mode 100644 tools/testing/selftests/powerpc/memmoveloop/asm/export.h
> create mode 100644 tools/testing/selftests/powerpc/memmoveloop/asm/feature-fixups.h
> create mode 100644 tools/testing/selftests/powerpc/memmoveloop/asm/kasan.h
> create mode 100644 tools/testing/selftests/powerpc/memmoveloop/asm/ppc_asm.h
> create mode 100644 tools/testing/selftests/powerpc/memmoveloop/asm/processor.h
> create mode 120000 tools/testing/selftests/powerpc/memmoveloop/mem_64.S
> create mode 120000 tools/testing/selftests/powerpc/memmoveloop/memcpy_64.S
> create mode 100644 tools/testing/selftests/powerpc/memmoveloop/stubs.S
> create mode 100644 tools/testing/selftests/powerpc/memmoveloop/validate.c
You've copied a lot of tools/testing/selftests/powerpc/copyloops
I'd be happier if you integrated the memmove test into that existing
code. I realise memmove is not technically a copy loop, but it's close
enough.
Did you try that and hit some roadblock?
cheers
> diff --git a/tools/testing/selftests/powerpc/Makefile b/tools/testing/selftests/powerpc/Makefile
> index 0830e63818c1..d110b3e5cbcd 100644
> --- a/tools/testing/selftests/powerpc/Makefile
> +++ b/tools/testing/selftests/powerpc/Makefile
> @@ -16,6 +16,7 @@ export CFLAGS
> SUB_DIRS = alignment \
> benchmarks \
> cache_shape \
> + memmoveloop \
> copyloops \
> dscr \
> mm \
> diff --git a/tools/testing/selftests/powerpc/memmoveloop/.gitignore b/tools/testing/selftests/powerpc/memmoveloop/.gitignore
> new file mode 100644
> index 000000000000..56c1426013d5
> --- /dev/null
> +++ b/tools/testing/selftests/powerpc/memmoveloop/.gitignore
> @@ -0,0 +1,2 @@
> +# SPDX-License-Identifier: GPL-2.0-only
> +memmove_64
> diff --git a/tools/testing/selftests/powerpc/memmoveloop/Makefile b/tools/testing/selftests/powerpc/memmoveloop/Makefile
> new file mode 100644
> index 000000000000..d58d8c100099
> --- /dev/null
> +++ b/tools/testing/selftests/powerpc/memmoveloop/Makefile
> @@ -0,0 +1,19 @@
> +# SPDX-License-Identifier: GPL-2.0
> +CFLAGS += -m64
> +CFLAGS += -I$(CURDIR)
> +CFLAGS += -D SELFTEST
> +CFLAGS += -maltivec
> +
> +ASFLAGS = $(CFLAGS) -Wa,-mpower4
> +
> +TEST_GEN_PROGS := memmove_64
> +EXTRA_SOURCES := validate.c ../harness.c stubs.S
> +CPPFLAGS += -D TEST_MEMMOVE=test_memmove
> +
> +top_srcdir = ../../../../..
> +include ../../lib.mk
> +
> +$(OUTPUT)/memmove_64: mem_64.S memcpy_64.S $(EXTRA_SOURCES)
> + $(CC) $(CPPFLAGS) $(CFLAGS) \
> + -D TEST_MEMMOVE=test_memmove \
> + -o $@ $^
> diff --git a/tools/testing/selftests/powerpc/memmoveloop/asm/asm-compat.h b/tools/testing/selftests/powerpc/memmoveloop/asm/asm-compat.h
> new file mode 100644
> index 000000000000..e69de29bb2d1
> diff --git a/tools/testing/selftests/powerpc/memmoveloop/asm/export.h b/tools/testing/selftests/powerpc/memmoveloop/asm/export.h
> new file mode 100644
> index 000000000000..e6b80d5fbd14
> --- /dev/null
> +++ b/tools/testing/selftests/powerpc/memmoveloop/asm/export.h
> @@ -0,0 +1,4 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +#define EXPORT_SYMBOL(x)
> +#define EXPORT_SYMBOL_GPL(x)
> +#define EXPORT_SYMBOL_KASAN(x)
> diff --git a/tools/testing/selftests/powerpc/memmoveloop/asm/feature-fixups.h b/tools/testing/selftests/powerpc/memmoveloop/asm/feature-fixups.h
> new file mode 100644
> index 000000000000..e69de29bb2d1
> diff --git a/tools/testing/selftests/powerpc/memmoveloop/asm/kasan.h b/tools/testing/selftests/powerpc/memmoveloop/asm/kasan.h
> new file mode 100644
> index 000000000000..e69de29bb2d1
> diff --git a/tools/testing/selftests/powerpc/memmoveloop/asm/ppc_asm.h b/tools/testing/selftests/powerpc/memmoveloop/asm/ppc_asm.h
> new file mode 100644
> index 000000000000..117005c56e19
> --- /dev/null
> +++ b/tools/testing/selftests/powerpc/memmoveloop/asm/ppc_asm.h
> @@ -0,0 +1,39 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +#ifndef __SELFTESTS_POWERPC_PPC_ASM_H
> +#define __SELFTESTS_POWERPC_PPC_ASM_H
> +#include <ppc-asm.h>
> +
> +#define CONFIG_ALTIVEC
> +
> +#define r1 1
> +
> +#define R14 r14
> +#define R15 r15
> +#define R16 r16
> +#define R17 r17
> +#define R18 r18
> +#define R19 r19
> +#define R20 r20
> +#define R21 r21
> +#define R22 r22
> +#define R29 r29
> +#define R30 r30
> +#define R31 r31
> +
> +#define STACKFRAMESIZE 256
> +#define STK_REG(i) (112 + ((i)-14)*8)
> +
> +#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
> +
> +#define BEGIN_FTR_SECTION
> +#define FTR_SECTION_ELSE
> +#define ALT_FTR_SECTION_END_IFCLR(x)
> +#define ALT_FTR_SECTION_END(x, y)
> +#define END_FTR_SECTION_IFCLR(x)
> +
> +#endif /* __SELFTESTS_POWERPC_PPC_ASM_H */
> diff --git a/tools/testing/selftests/powerpc/memmoveloop/asm/processor.h b/tools/testing/selftests/powerpc/memmoveloop/asm/processor.h
> new file mode 100644
> index 000000000000..e69de29bb2d1
> diff --git a/tools/testing/selftests/powerpc/memmoveloop/mem_64.S b/tools/testing/selftests/powerpc/memmoveloop/mem_64.S
> new file mode 120000
> index 000000000000..db254c9a5f5c
> --- /dev/null
> +++ b/tools/testing/selftests/powerpc/memmoveloop/mem_64.S
> @@ -0,0 +1 @@
> +../../../../../arch/powerpc/lib/mem_64.S
> \ No newline at end of file
> diff --git a/tools/testing/selftests/powerpc/memmoveloop/memcpy_64.S b/tools/testing/selftests/powerpc/memmoveloop/memcpy_64.S
> new file mode 120000
> index 000000000000..cce33fb6f9d8
> --- /dev/null
> +++ b/tools/testing/selftests/powerpc/memmoveloop/memcpy_64.S
> @@ -0,0 +1 @@
> +../../../../../arch/powerpc/lib/memcpy_64.S
> \ No newline at end of file
> diff --git a/tools/testing/selftests/powerpc/memmoveloop/stubs.S b/tools/testing/selftests/powerpc/memmoveloop/stubs.S
> new file mode 100644
> index 000000000000..d9baa832fa49
> --- /dev/null
> +++ b/tools/testing/selftests/powerpc/memmoveloop/stubs.S
> @@ -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
> diff --git a/tools/testing/selftests/powerpc/memmoveloop/validate.c b/tools/testing/selftests/powerpc/memmoveloop/validate.c
> new file mode 100644
> index 000000000000..52f7d32bb3fe
> --- /dev/null
> +++ b/tools/testing/selftests/powerpc/memmoveloop/validate.c
> @@ -0,0 +1,56 @@
> +// 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");
> +}
> --
> 2.31.1
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 1/1] selftests/powerpc: Add memmove_64 test
2021-09-11 11:26 ` Michael Ellerman
@ 2021-09-13 2:57 ` Ritesh Harjani
0 siblings, 0 replies; 4+ messages in thread
From: Ritesh Harjani @ 2021-09-13 2:57 UTC (permalink / raw)
To: Michael Ellerman; +Cc: Aneesh Kumar K . V, linuxppc-dev, Vaibhav Jain
On 21/09/11 09:26PM, Michael Ellerman wrote:
> Ritesh Harjani <riteshh@linux.ibm.com> writes:
> > 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>
> > ---
> > tools/testing/selftests/powerpc/Makefile | 1 +
> > .../selftests/powerpc/memmoveloop/.gitignore | 2 +
> > .../selftests/powerpc/memmoveloop/Makefile | 19 +++++++
> > .../powerpc/memmoveloop/asm/asm-compat.h | 0
> > .../powerpc/memmoveloop/asm/export.h | 4 ++
> > .../powerpc/memmoveloop/asm/feature-fixups.h | 0
> > .../selftests/powerpc/memmoveloop/asm/kasan.h | 0
> > .../powerpc/memmoveloop/asm/ppc_asm.h | 39 +++++++++++++
> > .../powerpc/memmoveloop/asm/processor.h | 0
> > .../selftests/powerpc/memmoveloop/mem_64.S | 1 +
> > .../selftests/powerpc/memmoveloop/memcpy_64.S | 1 +
> > .../selftests/powerpc/memmoveloop/stubs.S | 8 +++
> > .../selftests/powerpc/memmoveloop/validate.c | 56 +++++++++++++++++++
> > 13 files changed, 131 insertions(+)
> > create mode 100644 tools/testing/selftests/powerpc/memmoveloop/.gitignore
> > create mode 100644 tools/testing/selftests/powerpc/memmoveloop/Makefile
> > create mode 100644 tools/testing/selftests/powerpc/memmoveloop/asm/asm-compat.h
> > create mode 100644 tools/testing/selftests/powerpc/memmoveloop/asm/export.h
> > create mode 100644 tools/testing/selftests/powerpc/memmoveloop/asm/feature-fixups.h
> > create mode 100644 tools/testing/selftests/powerpc/memmoveloop/asm/kasan.h
> > create mode 100644 tools/testing/selftests/powerpc/memmoveloop/asm/ppc_asm.h
> > create mode 100644 tools/testing/selftests/powerpc/memmoveloop/asm/processor.h
> > create mode 120000 tools/testing/selftests/powerpc/memmoveloop/mem_64.S
> > create mode 120000 tools/testing/selftests/powerpc/memmoveloop/memcpy_64.S
> > create mode 100644 tools/testing/selftests/powerpc/memmoveloop/stubs.S
> > create mode 100644 tools/testing/selftests/powerpc/memmoveloop/validate.c
>
> You've copied a lot of tools/testing/selftests/powerpc/copyloops
>
> I'd be happier if you integrated the memmove test into that existing
> code. I realise memmove is not technically a copy loop, but it's close
> enough.
Sure.
>
> Did you try that and hit some roadblock?
Nope, let me try that and send it in v2.
-ritesh
>
> cheers
>
>
> > diff --git a/tools/testing/selftests/powerpc/Makefile b/tools/testing/selftests/powerpc/Makefile
> > index 0830e63818c1..d110b3e5cbcd 100644
> > --- a/tools/testing/selftests/powerpc/Makefile
> > +++ b/tools/testing/selftests/powerpc/Makefile
> > @@ -16,6 +16,7 @@ export CFLAGS
> > SUB_DIRS = alignment \
> > benchmarks \
> > cache_shape \
> > + memmoveloop \
> > copyloops \
> > dscr \
> > mm \
> > diff --git a/tools/testing/selftests/powerpc/memmoveloop/.gitignore b/tools/testing/selftests/powerpc/memmoveloop/.gitignore
> > new file mode 100644
> > index 000000000000..56c1426013d5
> > --- /dev/null
> > +++ b/tools/testing/selftests/powerpc/memmoveloop/.gitignore
> > @@ -0,0 +1,2 @@
> > +# SPDX-License-Identifier: GPL-2.0-only
> > +memmove_64
> > diff --git a/tools/testing/selftests/powerpc/memmoveloop/Makefile b/tools/testing/selftests/powerpc/memmoveloop/Makefile
> > new file mode 100644
> > index 000000000000..d58d8c100099
> > --- /dev/null
> > +++ b/tools/testing/selftests/powerpc/memmoveloop/Makefile
> > @@ -0,0 +1,19 @@
> > +# SPDX-License-Identifier: GPL-2.0
> > +CFLAGS += -m64
> > +CFLAGS += -I$(CURDIR)
> > +CFLAGS += -D SELFTEST
> > +CFLAGS += -maltivec
> > +
> > +ASFLAGS = $(CFLAGS) -Wa,-mpower4
> > +
> > +TEST_GEN_PROGS := memmove_64
> > +EXTRA_SOURCES := validate.c ../harness.c stubs.S
> > +CPPFLAGS += -D TEST_MEMMOVE=test_memmove
> > +
> > +top_srcdir = ../../../../..
> > +include ../../lib.mk
> > +
> > +$(OUTPUT)/memmove_64: mem_64.S memcpy_64.S $(EXTRA_SOURCES)
> > + $(CC) $(CPPFLAGS) $(CFLAGS) \
> > + -D TEST_MEMMOVE=test_memmove \
> > + -o $@ $^
> > diff --git a/tools/testing/selftests/powerpc/memmoveloop/asm/asm-compat.h b/tools/testing/selftests/powerpc/memmoveloop/asm/asm-compat.h
> > new file mode 100644
> > index 000000000000..e69de29bb2d1
> > diff --git a/tools/testing/selftests/powerpc/memmoveloop/asm/export.h b/tools/testing/selftests/powerpc/memmoveloop/asm/export.h
> > new file mode 100644
> > index 000000000000..e6b80d5fbd14
> > --- /dev/null
> > +++ b/tools/testing/selftests/powerpc/memmoveloop/asm/export.h
> > @@ -0,0 +1,4 @@
> > +/* SPDX-License-Identifier: GPL-2.0 */
> > +#define EXPORT_SYMBOL(x)
> > +#define EXPORT_SYMBOL_GPL(x)
> > +#define EXPORT_SYMBOL_KASAN(x)
> > diff --git a/tools/testing/selftests/powerpc/memmoveloop/asm/feature-fixups.h b/tools/testing/selftests/powerpc/memmoveloop/asm/feature-fixups.h
> > new file mode 100644
> > index 000000000000..e69de29bb2d1
> > diff --git a/tools/testing/selftests/powerpc/memmoveloop/asm/kasan.h b/tools/testing/selftests/powerpc/memmoveloop/asm/kasan.h
> > new file mode 100644
> > index 000000000000..e69de29bb2d1
> > diff --git a/tools/testing/selftests/powerpc/memmoveloop/asm/ppc_asm.h b/tools/testing/selftests/powerpc/memmoveloop/asm/ppc_asm.h
> > new file mode 100644
> > index 000000000000..117005c56e19
> > --- /dev/null
> > +++ b/tools/testing/selftests/powerpc/memmoveloop/asm/ppc_asm.h
> > @@ -0,0 +1,39 @@
> > +/* SPDX-License-Identifier: GPL-2.0 */
> > +#ifndef __SELFTESTS_POWERPC_PPC_ASM_H
> > +#define __SELFTESTS_POWERPC_PPC_ASM_H
> > +#include <ppc-asm.h>
> > +
> > +#define CONFIG_ALTIVEC
> > +
> > +#define r1 1
> > +
> > +#define R14 r14
> > +#define R15 r15
> > +#define R16 r16
> > +#define R17 r17
> > +#define R18 r18
> > +#define R19 r19
> > +#define R20 r20
> > +#define R21 r21
> > +#define R22 r22
> > +#define R29 r29
> > +#define R30 r30
> > +#define R31 r31
> > +
> > +#define STACKFRAMESIZE 256
> > +#define STK_REG(i) (112 + ((i)-14)*8)
> > +
> > +#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
> > +
> > +#define BEGIN_FTR_SECTION
> > +#define FTR_SECTION_ELSE
> > +#define ALT_FTR_SECTION_END_IFCLR(x)
> > +#define ALT_FTR_SECTION_END(x, y)
> > +#define END_FTR_SECTION_IFCLR(x)
> > +
> > +#endif /* __SELFTESTS_POWERPC_PPC_ASM_H */
> > diff --git a/tools/testing/selftests/powerpc/memmoveloop/asm/processor.h b/tools/testing/selftests/powerpc/memmoveloop/asm/processor.h
> > new file mode 100644
> > index 000000000000..e69de29bb2d1
> > diff --git a/tools/testing/selftests/powerpc/memmoveloop/mem_64.S b/tools/testing/selftests/powerpc/memmoveloop/mem_64.S
> > new file mode 120000
> > index 000000000000..db254c9a5f5c
> > --- /dev/null
> > +++ b/tools/testing/selftests/powerpc/memmoveloop/mem_64.S
> > @@ -0,0 +1 @@
> > +../../../../../arch/powerpc/lib/mem_64.S
> > \ No newline at end of file
> > diff --git a/tools/testing/selftests/powerpc/memmoveloop/memcpy_64.S b/tools/testing/selftests/powerpc/memmoveloop/memcpy_64.S
> > new file mode 120000
> > index 000000000000..cce33fb6f9d8
> > --- /dev/null
> > +++ b/tools/testing/selftests/powerpc/memmoveloop/memcpy_64.S
> > @@ -0,0 +1 @@
> > +../../../../../arch/powerpc/lib/memcpy_64.S
> > \ No newline at end of file
> > diff --git a/tools/testing/selftests/powerpc/memmoveloop/stubs.S b/tools/testing/selftests/powerpc/memmoveloop/stubs.S
> > new file mode 100644
> > index 000000000000..d9baa832fa49
> > --- /dev/null
> > +++ b/tools/testing/selftests/powerpc/memmoveloop/stubs.S
> > @@ -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
> > diff --git a/tools/testing/selftests/powerpc/memmoveloop/validate.c b/tools/testing/selftests/powerpc/memmoveloop/validate.c
> > new file mode 100644
> > index 000000000000..52f7d32bb3fe
> > --- /dev/null
> > +++ b/tools/testing/selftests/powerpc/memmoveloop/validate.c
> > @@ -0,0 +1,56 @@
> > +// 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");
> > +}
> > --
> > 2.31.1
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2021-09-13 2:58 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-08-18 15:50 [PATCH 1/1] selftests/powerpc: Add memmove_64 test Ritesh Harjani
2021-09-10 3:57 ` Ritesh Harjani
2021-09-11 11:26 ` Michael Ellerman
2021-09-13 2:57 ` Ritesh Harjani
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.