@@ -357,8 +357,9 @@ __nocf_check __weak void usdt_test(void)
357
357
USDT (optimized_uprobe , usdt );
358
358
}
359
359
360
- static int find_uprobes_trampoline (void * * start , void * * end )
360
+ static int find_uprobes_trampoline (void * tramp_addr )
361
361
{
362
+ void * start , * end ;
362
363
char line [128 ];
363
364
int ret = -1 ;
364
365
FILE * maps ;
@@ -373,12 +374,12 @@ static int find_uprobes_trampoline(void **start, void **end)
373
374
int m = -1 ;
374
375
375
376
/* We care only about private r-x mappings. */
376
- if (sscanf (line , "%p-%p r-xp %*x %*x:%*x %*u %n" , start , end , & m ) != 2 )
377
+ if (sscanf (line , "%p-%p r-xp %*x %*x:%*x %*u %n" , & start , & end , & m ) != 2 )
377
378
continue ;
378
379
if (m < 0 )
379
380
continue ;
380
- if (!strncmp (& line [m ], TRAMP , sizeof (TRAMP )- 1 )) {
381
- ret = 0 ;
381
+ if (!strncmp (& line [m ], TRAMP , sizeof (TRAMP )- 1 ) && ( start == tramp_addr ) ) {
382
+ ret = end - start == 4096 ? 0 : -1 ;
382
383
break ;
383
384
}
384
385
}
@@ -404,25 +405,20 @@ typedef void (__attribute__((nocf_check)) *trigger_t)(void);
404
405
405
406
static bool shstk_is_enabled ;
406
407
407
- static void check_attach (struct uprobe_syscall_executed * skel , trigger_t trigger ,
408
- void * addr , int executed )
408
+ static void * check_attach (struct uprobe_syscall_executed * skel , trigger_t trigger ,
409
+ void * addr , int executed )
409
410
{
410
- void * tramp_start , * tramp_end ;
411
411
struct __arch_relative_insn {
412
412
__u8 op ;
413
413
__s32 raddr ;
414
414
} __packed * call ;
415
- __s32 delta ;
415
+ void * tramp = NULL ;
416
416
__u8 * bp ;
417
417
418
418
/* Uprobe gets optimized after first trigger, so let's press twice. */
419
419
trigger ();
420
420
trigger ();
421
421
422
- if (!shstk_is_enabled &&
423
- !ASSERT_OK (find_uprobes_trampoline (& tramp_start , & tramp_end ), "uprobes_trampoline" ))
424
- return ;
425
-
426
422
/* Make sure bpf program got executed.. */
427
423
ASSERT_EQ (skel -> bss -> executed , executed , "executed" );
428
424
@@ -433,30 +429,29 @@ static void check_attach(struct uprobe_syscall_executed *skel, trigger_t trigger
433
429
} else {
434
430
/* .. and check the trampoline is as expected. */
435
431
call = (struct __arch_relative_insn * ) addr ;
436
- delta = (unsigned long ) tramp_start - ((unsigned long ) addr + 5 );
437
-
432
+ tramp = (void * ) (call + 1 ) + call -> raddr ;
438
433
ASSERT_EQ (call -> op , 0xe8 , "call" );
439
- ASSERT_EQ (call -> raddr , delta , "delta" );
440
- ASSERT_EQ (tramp_end - tramp_start , 4096 , "size" );
434
+ ASSERT_OK (find_uprobes_trampoline (tramp ), "uprobes_trampoline" );
441
435
}
436
+
437
+ return tramp ;
442
438
}
443
439
444
- static void check_detach (struct uprobe_syscall_executed * skel , trigger_t trigger , void * addr )
440
+ static void check_detach (void * addr , void * tramp )
445
441
{
446
- void * tramp_start , * tramp_end ;
447
-
448
442
/* [uprobes_trampoline] stays after detach */
449
- ASSERT_OK (!shstk_is_enabled &&
450
- find_uprobes_trampoline (& tramp_start , & tramp_end ), "uprobes_trampoline" );
443
+ ASSERT_OK (!shstk_is_enabled && find_uprobes_trampoline (tramp ), "uprobes_trampoline" );
451
444
ASSERT_OK (memcmp (addr , nop5 , 5 ), "nop5" );
452
445
}
453
446
454
447
static void check (struct uprobe_syscall_executed * skel , struct bpf_link * link ,
455
448
trigger_t trigger , void * addr , int executed )
456
449
{
457
- check_attach (skel , trigger , addr , executed );
450
+ void * tramp ;
451
+
452
+ tramp = check_attach (skel , trigger , addr , executed );
458
453
bpf_link__destroy (link );
459
- check_detach (skel , trigger , addr );
454
+ check_detach (addr , tramp );
460
455
}
461
456
462
457
static void test_uprobe_legacy (void )
0 commit comments