Linux Perf
perf-hooks.c
Go to the documentation of this file.
1 // SPDX-License-Identifier: GPL-2.0
2 #include <signal.h>
3 #include <stdlib.h>
4 
5 #include "tests.h"
6 #include "debug.h"
7 #include "util.h"
8 #include "perf-hooks.h"
9 
10 static void sigsegv_handler(int sig __maybe_unused)
11 {
12  pr_debug("SIGSEGV is observed as expected, try to recover.\n");
14  signal(SIGSEGV, SIG_DFL);
15  raise(SIGSEGV);
16  exit(-1);
17 }
18 
19 
20 static void the_hook(void *_hook_flags)
21 {
22  int *hook_flags = _hook_flags;
23  int *p = NULL;
24 
25  *hook_flags = 1234;
26 
27  /* Generate a segfault, test perf_hooks__recover */
28  *p = 0;
29 }
30 
31 int test__perf_hooks(struct test *test __maybe_unused, int subtest __maybe_unused)
32 {
33  int hook_flags = 0;
34 
35  signal(SIGSEGV, sigsegv_handler);
36  perf_hooks__set_hook("test", the_hook, &hook_flags);
37  perf_hooks__invoke_test();
38 
39  /* hook is triggered? */
40  if (hook_flags != 1234) {
41  pr_debug("Setting failed: %d (%p)\n", hook_flags, &hook_flags);
42  return TEST_FAIL;
43  }
44 
45  /* the buggy hook is removed? */
46  if (perf_hooks__get_hook("test"))
47  return TEST_FAIL;
48  return TEST_OK;
49 }
int perf_hooks__set_hook(const char *hook_name, perf_hook_func_t hook_func, void *hook_ctx)
Definition: perf-hooks.c:60
static void sigsegv_handler(int sig __maybe_unused)
Definition: perf-hooks.c:10
#define pr_debug(fmt,...)
Definition: json.h:27
perf_hook_func_t perf_hooks__get_hook(const char *hook_name)
Definition: perf-hooks.c:79
Definition: tests.h:30
int test__perf_hooks(struct test *test __maybe_unused, int subtest __maybe_unused)
Definition: perf-hooks.c:31
void perf_hooks__recover(void)
Definition: perf-hooks.c:37
Definition: tests.h:25
static void the_hook(void *_hook_flags)
Definition: perf-hooks.c:20