Commit fcf77d01 authored by Tiezhu Yang's avatar Tiezhu Yang Committed by Huacai Chen
Browse files

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: default avatarJeff Xie <xiehuan09@gmail.com>
Signed-off-by: default avatarTiezhu Yang <yangtiezhu@loongson.cn>
Signed-off-by: default avatarHuacai Chen <chenhuacai@loongson.cn>
parent 09e679c2
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -188,4 +188,14 @@
#define PTRLOG		3
#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 */
+1 −0
Original line number Diff line number Diff line
@@ -67,6 +67,7 @@ SYM_FUNC_START(handle_syscall)

	RESTORE_ALL_AND_RET
SYM_FUNC_END(handle_syscall)
_ASM_NOKPROBE(handle_syscall)

SYM_CODE_START(ret_from_fork)
	bl		schedule_tail		# a0 = struct task_struct *prev
+3 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@ SYM_FUNC_START(memcpy)
	ALTERNATIVE	"b __memcpy_generic", \
			"b __memcpy_fast", CPU_FEATURE_UAL
SYM_FUNC_END(memcpy)
_ASM_NOKPROBE(memcpy)

EXPORT_SYMBOL(memcpy)

@@ -41,6 +42,7 @@ SYM_FUNC_START(__memcpy_generic)
2:	move	a0, a3
	jr	ra
SYM_FUNC_END(__memcpy_generic)
_ASM_NOKPROBE(__memcpy_generic)

/*
 * void *__memcpy_fast(void *dst, const void *src, size_t n)
@@ -93,3 +95,4 @@ SYM_FUNC_START(__memcpy_fast)
3:	move	a0, a3
	jr	ra
SYM_FUNC_END(__memcpy_fast)
_ASM_NOKPROBE(__memcpy_fast)
+4 −0
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ SYM_FUNC_START(memmove)
	b	rmemcpy
4:	b	__rmemcpy_generic
SYM_FUNC_END(memmove)
_ASM_NOKPROBE(memmove)

EXPORT_SYMBOL(memmove)

@@ -39,6 +40,7 @@ SYM_FUNC_START(rmemcpy)
	ALTERNATIVE	"b __rmemcpy_generic", \
			"b __rmemcpy_fast", CPU_FEATURE_UAL
SYM_FUNC_END(rmemcpy)
_ASM_NOKPROBE(rmemcpy)

/*
 * void *__rmemcpy_generic(void *dst, const void *src, size_t n)
@@ -64,6 +66,7 @@ SYM_FUNC_START(__rmemcpy_generic)
2:	move	a0, a3
	jr	ra
SYM_FUNC_END(__rmemcpy_generic)
_ASM_NOKPROBE(__rmemcpy_generic)

/*
 * void *__rmemcpy_fast(void *dst, const void *src, size_t n)
@@ -119,3 +122,4 @@ SYM_FUNC_START(__rmemcpy_fast)
3:	move	a0, a3
	jr	ra
SYM_FUNC_END(__rmemcpy_fast)
_ASM_NOKPROBE(__rmemcpy_fast)
+3 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ SYM_FUNC_START(memset)
	ALTERNATIVE	"b __memset_generic", \
			"b __memset_fast", CPU_FEATURE_UAL
SYM_FUNC_END(memset)
_ASM_NOKPROBE(memset)

EXPORT_SYMBOL(memset)

@@ -45,6 +46,7 @@ SYM_FUNC_START(__memset_generic)
2:	move	a0, a3
	jr	ra
SYM_FUNC_END(__memset_generic)
_ASM_NOKPROBE(__memset_generic)

/*
 * void *__memset_fast(void *s, int c, size_t n)
@@ -89,3 +91,4 @@ SYM_FUNC_START(__memset_fast)
3:	move	a0, a3
	jr	ra
SYM_FUNC_END(__memset_fast)
_ASM_NOKPROBE(__memset_fast)