LoongArch: Mark some assembler symbols as non-kprobe-able

Some assembler symbols are not kprobe safe, such as handle_syscall (used
as syscall exception handler), *memset*/*memcpy*/*memmove* (may cause
recursive exceptions), they can not be instrumented, just blacklist them
for kprobing.

Here is a related problem and discussion:
Link: https://lore.kernel.org/lkml/20230114143859.7ccc45c1c5d9ce302113ab0a@kernel.org/

Tested-by: Jeff Xie <xiehuan09@gmail.com>
Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
This commit is contained in:
Tiezhu Yang 2023-02-25 15:52:57 +08:00 committed by Huacai Chen
parent 09e679c28a
commit fcf77d0162
5 changed files with 21 additions and 0 deletions

View File

@ -188,4 +188,14 @@
#define PTRLOG 3 #define PTRLOG 3
#endif #endif
/* Annotate a function as being unsuitable for kprobes. */
#ifdef CONFIG_KPROBES
#define _ASM_NOKPROBE(name) \
.pushsection "_kprobe_blacklist", "aw"; \
.quad name; \
.popsection
#else
#define _ASM_NOKPROBE(name)
#endif
#endif /* __ASM_ASM_H */ #endif /* __ASM_ASM_H */

View File

@ -67,6 +67,7 @@ SYM_FUNC_START(handle_syscall)
RESTORE_ALL_AND_RET RESTORE_ALL_AND_RET
SYM_FUNC_END(handle_syscall) SYM_FUNC_END(handle_syscall)
_ASM_NOKPROBE(handle_syscall)
SYM_CODE_START(ret_from_fork) SYM_CODE_START(ret_from_fork)
bl schedule_tail # a0 = struct task_struct *prev bl schedule_tail # a0 = struct task_struct *prev

View File

@ -17,6 +17,7 @@ SYM_FUNC_START(memcpy)
ALTERNATIVE "b __memcpy_generic", \ ALTERNATIVE "b __memcpy_generic", \
"b __memcpy_fast", CPU_FEATURE_UAL "b __memcpy_fast", CPU_FEATURE_UAL
SYM_FUNC_END(memcpy) SYM_FUNC_END(memcpy)
_ASM_NOKPROBE(memcpy)
EXPORT_SYMBOL(memcpy) EXPORT_SYMBOL(memcpy)
@ -41,6 +42,7 @@ SYM_FUNC_START(__memcpy_generic)
2: move a0, a3 2: move a0, a3
jr ra jr ra
SYM_FUNC_END(__memcpy_generic) SYM_FUNC_END(__memcpy_generic)
_ASM_NOKPROBE(__memcpy_generic)
/* /*
* void *__memcpy_fast(void *dst, const void *src, size_t n) * void *__memcpy_fast(void *dst, const void *src, size_t n)
@ -93,3 +95,4 @@ SYM_FUNC_START(__memcpy_fast)
3: move a0, a3 3: move a0, a3
jr ra jr ra
SYM_FUNC_END(__memcpy_fast) SYM_FUNC_END(__memcpy_fast)
_ASM_NOKPROBE(__memcpy_fast)

View File

@ -29,6 +29,7 @@ SYM_FUNC_START(memmove)
b rmemcpy b rmemcpy
4: b __rmemcpy_generic 4: b __rmemcpy_generic
SYM_FUNC_END(memmove) SYM_FUNC_END(memmove)
_ASM_NOKPROBE(memmove)
EXPORT_SYMBOL(memmove) EXPORT_SYMBOL(memmove)
@ -39,6 +40,7 @@ SYM_FUNC_START(rmemcpy)
ALTERNATIVE "b __rmemcpy_generic", \ ALTERNATIVE "b __rmemcpy_generic", \
"b __rmemcpy_fast", CPU_FEATURE_UAL "b __rmemcpy_fast", CPU_FEATURE_UAL
SYM_FUNC_END(rmemcpy) SYM_FUNC_END(rmemcpy)
_ASM_NOKPROBE(rmemcpy)
/* /*
* void *__rmemcpy_generic(void *dst, const void *src, size_t n) * void *__rmemcpy_generic(void *dst, const void *src, size_t n)
@ -64,6 +66,7 @@ SYM_FUNC_START(__rmemcpy_generic)
2: move a0, a3 2: move a0, a3
jr ra jr ra
SYM_FUNC_END(__rmemcpy_generic) SYM_FUNC_END(__rmemcpy_generic)
_ASM_NOKPROBE(__rmemcpy_generic)
/* /*
* void *__rmemcpy_fast(void *dst, const void *src, size_t n) * void *__rmemcpy_fast(void *dst, const void *src, size_t n)
@ -119,3 +122,4 @@ SYM_FUNC_START(__rmemcpy_fast)
3: move a0, a3 3: move a0, a3
jr ra jr ra
SYM_FUNC_END(__rmemcpy_fast) SYM_FUNC_END(__rmemcpy_fast)
_ASM_NOKPROBE(__rmemcpy_fast)

View File

@ -23,6 +23,7 @@ SYM_FUNC_START(memset)
ALTERNATIVE "b __memset_generic", \ ALTERNATIVE "b __memset_generic", \
"b __memset_fast", CPU_FEATURE_UAL "b __memset_fast", CPU_FEATURE_UAL
SYM_FUNC_END(memset) SYM_FUNC_END(memset)
_ASM_NOKPROBE(memset)
EXPORT_SYMBOL(memset) EXPORT_SYMBOL(memset)
@ -45,6 +46,7 @@ SYM_FUNC_START(__memset_generic)
2: move a0, a3 2: move a0, a3
jr ra jr ra
SYM_FUNC_END(__memset_generic) SYM_FUNC_END(__memset_generic)
_ASM_NOKPROBE(__memset_generic)
/* /*
* void *__memset_fast(void *s, int c, size_t n) * void *__memset_fast(void *s, int c, size_t n)
@ -89,3 +91,4 @@ SYM_FUNC_START(__memset_fast)
3: move a0, a3 3: move a0, a3
jr ra jr ra
SYM_FUNC_END(__memset_fast) SYM_FUNC_END(__memset_fast)
_ASM_NOKPROBE(__memset_fast)