1 /* SPDX-License-Identifier: GPL-2.0 */
3 * String handling functions.
5 * Copyright IBM Corp. 2012
8 #include <linux/linkage.h>
9 #include <asm/export.h>
10 #include <asm/nospec-insn.h>
15 * void *memmove(void *dest, const void *src, size_t n)
17 SYM_FUNC_START(__memmove)
30 jz .Lmemmove_forward_remainder
31 .Lmemmove_forward_loop:
35 brctg %r0,.Lmemmove_forward_loop
36 .Lmemmove_forward_remainder:
37 larl %r5,.Lmemmove_mvc
44 brctg %r4,.Lmemmove_reverse
50 SYM_FUNC_END(__memmove)
51 EXPORT_SYMBOL(__memmove)
53 SYM_FUNC_ALIAS(memmove, __memmove)
54 EXPORT_SYMBOL(memmove)
57 * memset implementation
59 * This code corresponds to the C construct below. We do distinguish
60 * between clearing (c == 0) and setting a memory array (c != 0) simply
61 * because nearly all memset invocations in the kernel clear memory and
62 * the xc instruction is preferred in such cases.
64 * void *memset(void *s, int c, size_t n)
67 * return __builtin_memset(s, 0, n);
68 * return __builtin_memset(s, c, n);
71 SYM_FUNC_START(__memset)
80 jz .Lmemset_clear_remainder
84 brctg %r3,.Lmemset_clear_loop
85 .Lmemset_clear_remainder:
97 jz .Lmemset_fill_remainder
100 mvc 1(255,%r1),0(%r1)
102 brctg %r5,.Lmemset_fill_loop
103 .Lmemset_fill_remainder:
105 larl %r5,.Lmemset_mvc
115 SYM_FUNC_END(__memset)
116 EXPORT_SYMBOL(__memset)
118 SYM_FUNC_ALIAS(memset, __memset)
119 EXPORT_SYMBOL(memset)
122 * memcpy implementation
124 * void *memcpy(void *dest, const void *src, size_t n)
126 SYM_FUNC_START(__memcpy)
135 larl %r5,.Lmemcpy_mvc
140 mvc 0(256,%r1),0(%r3)
143 brctg %r5,.Lmemcpy_loop
147 SYM_FUNC_END(__memcpy)
148 EXPORT_SYMBOL(__memcpy)
150 SYM_FUNC_ALIAS(memcpy, __memcpy)
151 EXPORT_SYMBOL(memcpy)
156 * void *__memset16(uint16_t *s, uint16_t v, size_t count)
157 * void *__memset32(uint32_t *s, uint32_t v, size_t count)
158 * void *__memset64(uint64_t *s, uint64_t v, size_t count)
160 .macro __MEMSET bits,bytes,insn
161 SYM_FUNC_START(__memset\bits)
163 jz .L__memset_exit\bits
165 je .L__memset_store\bits
170 jz .L__memset_remainder\bits
171 .L__memset_loop\bits:
173 mvc \bytes(256-\bytes,%r1),0(%r1)
175 brctg %r5,.L__memset_loop\bits
176 .L__memset_remainder\bits:
178 larl %r5,.L__memset_mvc\bits
181 .L__memset_store\bits:
183 .L__memset_exit\bits:
186 mvc \bytes(1,%r1),0(%r1)
187 SYM_FUNC_END(__memset\bits)
191 EXPORT_SYMBOL(__memset16)
194 EXPORT_SYMBOL(__memset32)
197 EXPORT_SYMBOL(__memset64)