| /* SPDX-License-Identifier: GPL-2.0 */ |
| #ifndef _COPY_MC_TEST_H_ |
| #define _COPY_MC_TEST_H_ |
| |
| #ifndef __ASSEMBLY__ |
| #ifdef CONFIG_COPY_MC_TEST |
| extern unsigned long copy_mc_test_src; |
| extern unsigned long copy_mc_test_dst; |
| |
| static inline void copy_mc_inject_src(void *addr) |
| { |
| if (addr) |
| copy_mc_test_src = (unsigned long) addr; |
| else |
| copy_mc_test_src = ~0UL; |
| } |
| |
| static inline void copy_mc_inject_dst(void *addr) |
| { |
| if (addr) |
| copy_mc_test_dst = (unsigned long) addr; |
| else |
| copy_mc_test_dst = ~0UL; |
| } |
| #else /* CONFIG_COPY_MC_TEST */ |
| static inline void copy_mc_inject_src(void *addr) |
| { |
| } |
| |
| static inline void copy_mc_inject_dst(void *addr) |
| { |
| } |
| #endif /* CONFIG_COPY_MC_TEST */ |
| |
| #else /* __ASSEMBLY__ */ |
| #include <asm/export.h> |
| |
| #ifdef CONFIG_COPY_MC_TEST |
| .macro COPY_MC_TEST_CTL |
| .pushsection .data |
| .align 8 |
| .globl copy_mc_test_src |
| copy_mc_test_src: |
| .quad 0 |
| EXPORT_SYMBOL_GPL(copy_mc_test_src) |
| .globl copy_mc_test_dst |
| copy_mc_test_dst: |
| .quad 0 |
| EXPORT_SYMBOL_GPL(copy_mc_test_dst) |
| .popsection |
| .endm |
| |
| .macro COPY_MC_TEST_SRC reg count target |
| leaq \count(\reg), %r9 |
| cmp copy_mc_test_src, %r9 |
| ja \target |
| .endm |
| |
| .macro COPY_MC_TEST_DST reg count target |
| leaq \count(\reg), %r9 |
| cmp copy_mc_test_dst, %r9 |
| ja \target |
| .endm |
| #else |
| .macro COPY_MC_TEST_CTL |
| .endm |
| |
| .macro COPY_MC_TEST_SRC reg count target |
| .endm |
| |
| .macro COPY_MC_TEST_DST reg count target |
| .endm |
| #endif /* CONFIG_COPY_MC_TEST */ |
| #endif /* __ASSEMBLY__ */ |
| #endif /* _COPY_MC_TEST_H_ */ |