mirror of
https://git.proxmox.com/git/mirror_ubuntu-kernels.git
synced 2025-12-22 22:51:55 +00:00
Uprobes is the user-space counterpart to kprobes, this patch adds
uprobes support for LoongArch.
Here is a simple example with CONFIG_UPROBE_EVENTS=y:
# cat test.c
#include <stdio.h>
int add(int a, int b)
{
return a + b;
}
int main()
{
return add(2, 7);
}
# gcc test.c -o /tmp/test
# nm /tmp/test | grep add
0000000120004194 T add
# cd /sys/kernel/debug/tracing
# echo > uprobe_events
# echo "p:myuprobe /tmp/test:0x4194 %r4 %r5" > uprobe_events
# echo "r:myuretprobe /tmp/test:0x4194 %r4" >> uprobe_events
# echo 1 > events/uprobes/enable
# echo 1 > tracing_on
# /tmp/test
# cat trace
...
# TASK-PID CPU# ||||| TIMESTAMP FUNCTION
# | | | ||||| | |
test-1060 [001] DNZff 1015.770620: myuprobe: (0x120004194) arg1=0x2 arg2=0x7
test-1060 [001] DNZff 1015.770930: myuretprobe: (0x1200041f0 <- 0x120004194) arg1=0x9
Tested-by: Jeff Xie <xiehuan09@gmail.com>
Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
37 lines
970 B
C
37 lines
970 B
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
#ifndef __ASM_LOONGARCH_UPROBES_H
|
|
#define __ASM_LOONGARCH_UPROBES_H
|
|
|
|
#include <asm/inst.h>
|
|
|
|
typedef u32 uprobe_opcode_t;
|
|
|
|
#define MAX_UINSN_BYTES 8
|
|
#define UPROBE_XOL_SLOT_BYTES MAX_UINSN_BYTES
|
|
|
|
#define UPROBE_SWBP_INSN larch_insn_gen_break(BRK_UPROBE_BP)
|
|
#define UPROBE_SWBP_INSN_SIZE LOONGARCH_INSN_SIZE
|
|
|
|
#define UPROBE_XOLBP_INSN larch_insn_gen_break(BRK_UPROBE_XOLBP)
|
|
|
|
struct arch_uprobe {
|
|
unsigned long resume_era;
|
|
u32 insn[2];
|
|
u32 ixol[2];
|
|
bool simulate;
|
|
};
|
|
|
|
struct arch_uprobe_task {
|
|
unsigned long saved_trap_nr;
|
|
};
|
|
|
|
#ifdef CONFIG_UPROBES
|
|
bool uprobe_breakpoint_handler(struct pt_regs *regs);
|
|
bool uprobe_singlestep_handler(struct pt_regs *regs);
|
|
#else /* !CONFIG_UPROBES */
|
|
static inline bool uprobe_breakpoint_handler(struct pt_regs *regs) { return false; }
|
|
static inline bool uprobe_singlestep_handler(struct pt_regs *regs) { return false; }
|
|
#endif /* CONFIG_UPROBES */
|
|
|
|
#endif /* __ASM_LOONGARCH_UPROBES_H */
|