mirror of
https://github.com/netdata/libbpf.git
synced 2026-11-09 12:20:13 +08:00
libbpf: Change has_nop_combo to work on top of nop10
We now expect nop combo with 10 bytes nop instead of 5 bytes nop,
fixing has_nop_combo to reflect that.
Fixes: 41a5c7df4466 ("libbpf: Add support to detect nop,nop5 instructions combo for usdt probe")
Fixes: 554ba38456da ("uprobes/x86: Move optimized uprobe from nop5 to nop10")
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Reviewed-by: Jakub Sitnicki <jakub@cloudflare.com>
Acked-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://patch.msgid.link/20260703114917.238144-7-jolsa@kernel.org
This commit is contained in:
1 parent
d8b7bfc9f6
commit
30d076b7e2
1 file changed
+8
-8
+8
-8
@@ -305,7 +305,7 @@ struct usdt_manager *usdt_manager_new(struct bpf_object *obj)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Detect kernel support for uprobe() syscall, it's presence means we can
|
* Detect kernel support for uprobe() syscall, it's presence means we can
|
||||||
* take advantage of faster nop5 uprobe handling.
|
* take advantage of faster nop10 uprobe handling.
|
||||||
* Added in: 56101b69c919 ("uprobes/x86: Add uprobe syscall to speed up uprobe")
|
* Added in: 56101b69c919 ("uprobes/x86: Add uprobe syscall to speed up uprobe")
|
||||||
*/
|
*/
|
||||||
man->has_uprobe_syscall = kernel_supports(obj, FEAT_UPROBE_SYSCALL);
|
man->has_uprobe_syscall = kernel_supports(obj, FEAT_UPROBE_SYSCALL);
|
||||||
@@ -605,14 +605,14 @@ static int parse_usdt_spec(struct usdt_spec *spec, const struct usdt_note *note,
|
|||||||
#if defined(__x86_64__)
|
#if defined(__x86_64__)
|
||||||
static bool has_nop_combo(int fd, long off)
|
static bool has_nop_combo(int fd, long off)
|
||||||
{
|
{
|
||||||
unsigned char nop_combo[6] = {
|
unsigned char nop_combo[11] = {
|
||||||
0x90, 0x0f, 0x1f, 0x44, 0x00, 0x00 /* nop,nop5 */
|
0x90, 0x66, 0x2e, 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
};
|
};
|
||||||
unsigned char buf[6];
|
unsigned char buf[11];
|
||||||
|
|
||||||
if (pread(fd, buf, 6, off) != 6)
|
if (pread(fd, buf, 11, off) != 11)
|
||||||
return false;
|
return false;
|
||||||
return memcmp(buf, nop_combo, 6) == 0;
|
return memcmp(buf, nop_combo, 11) == 0;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static bool has_nop_combo(int fd, long off)
|
static bool has_nop_combo(int fd, long off)
|
||||||
@@ -825,8 +825,8 @@ static int collect_usdt_targets(struct usdt_manager *man, struct elf_fd *elf_fd,
|
|||||||
memset(target, 0, sizeof(*target));
|
memset(target, 0, sizeof(*target));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We have uprobe syscall and usdt with nop,nop5 instructions combo,
|
* We have uprobe syscall and usdt with nop,nop10 instructions combo,
|
||||||
* so we can place the uprobe directly on nop5 (+1) and get this probe
|
* so we can place the uprobe directly on nop10 (+1) and get this probe
|
||||||
* optimized.
|
* optimized.
|
||||||
*/
|
*/
|
||||||
if (man->has_uprobe_syscall && has_nop_combo(elf_fd->fd, usdt_rel_ip)) {
|
if (man->has_uprobe_syscall && has_nop_combo(elf_fd->fd, usdt_rel_ip)) {
|
||||||
|
|||||||
Reference in new issue
Block a user