1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _COPY_MC_TEST_H_
3#define _COPY_MC_TEST_H_
4
5#ifndef __ASSEMBLY__
6#ifdef CONFIG_COPY_MC_TEST
7extern unsigned long copy_mc_test_src;
8extern unsigned long copy_mc_test_dst;
9
10static inline void copy_mc_inject_src(void *addr)
11{
12	if (addr)
13		copy_mc_test_src = (unsigned long) addr;
14	else
15		copy_mc_test_src = ~0UL;
16}
17
18static inline void copy_mc_inject_dst(void *addr)
19{
20	if (addr)
21		copy_mc_test_dst = (unsigned long) addr;
22	else
23		copy_mc_test_dst = ~0UL;
24}
25#else /* CONFIG_COPY_MC_TEST */
26static inline void copy_mc_inject_src(void *addr)
27{
28}
29
30static inline void copy_mc_inject_dst(void *addr)
31{
32}
33#endif /* CONFIG_COPY_MC_TEST */
34
35#else /* __ASSEMBLY__ */
36#include <asm/export.h>
37
38#ifdef CONFIG_COPY_MC_TEST
39.macro COPY_MC_TEST_CTL
40	.pushsection .data
41	.align 8
42	.globl copy_mc_test_src
43	copy_mc_test_src:
44		.quad 0
45	EXPORT_SYMBOL_GPL(copy_mc_test_src)
46	.globl copy_mc_test_dst
47	copy_mc_test_dst:
48		.quad 0
49	EXPORT_SYMBOL_GPL(copy_mc_test_dst)
50	.popsection
51.endm
52
53.macro COPY_MC_TEST_SRC reg count target
54	leaq \count(\reg), %r9
55	cmp copy_mc_test_src, %r9
56	ja \target
57.endm
58
59.macro COPY_MC_TEST_DST reg count target
60	leaq \count(\reg), %r9
61	cmp copy_mc_test_dst, %r9
62	ja \target
63.endm
64#else
65.macro COPY_MC_TEST_CTL
66.endm
67
68.macro COPY_MC_TEST_SRC reg count target
69.endm
70
71.macro COPY_MC_TEST_DST reg count target
72.endm
73#endif /* CONFIG_COPY_MC_TEST */
74#endif /* __ASSEMBLY__ */
75#endif /* _COPY_MC_TEST_H_ */
76