mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
x86/asm: Introduce inline memcpy and memset
Provide inline memcpy and memset functions that can be used instead of the GCC builtins when necessary. The immediate use case is for the text poking functions to avoid the standard memcpy()/memset() calls because objtool complains about such dynamic calls within an AC=1 region. See tools/objtool/Documentation/objtool.txt, warning #9, regarding function calls with UACCESS enabled. Some user copy functions such as copy_user_generic() and __clear_user() have similar rep_{movs,stos} usages. But, those are highly specialized and hard to combine or reuse for other things. Define these new helpers for all other usages that need a completely unoptimized, strictly inline version of memcpy() or memset(). Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Sohil Mehta <sohil.mehta@intel.com> Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com> Reviewed-by: Dave Hansen <dave.hansen@linux.intel.com> Link: https://patch.msgid.link/20251118182911.2983253-4-sohil.mehta%40intel.com
This commit is contained in:
committed by
Dave Hansen
parent
e39c5387ad
commit
d9a96cc18b
@@ -1,6 +1,32 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _ASM_X86_STRING_H
|
||||
#define _ASM_X86_STRING_H
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
# include <asm/string_32.h>
|
||||
#else
|
||||
# include <asm/string_64.h>
|
||||
#endif
|
||||
|
||||
static __always_inline void *__inline_memcpy(void *to, const void *from, size_t len)
|
||||
{
|
||||
void *ret = to;
|
||||
|
||||
asm volatile("rep movsb"
|
||||
: "+D" (to), "+S" (from), "+c" (len)
|
||||
: : "memory");
|
||||
return ret;
|
||||
}
|
||||
|
||||
static __always_inline void *__inline_memset(void *s, int v, size_t n)
|
||||
{
|
||||
void *ret = s;
|
||||
|
||||
asm volatile("rep stosb"
|
||||
: "+D" (s), "+c" (n)
|
||||
: "a" ((uint8_t)v)
|
||||
: "memory");
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif /* _ASM_X86_STRING_H */
|
||||
|
||||
Reference in New Issue
Block a user