Commit | Line | Data |
---|---|---|
b2441318 | 1 | // SPDX-License-Identifier: GPL-2.0 |
a074865e WN |
2 | #include <signal.h> |
3 | #include <stdlib.h> | |
4 | ||
5 | #include "tests.h" | |
6 | #include "debug.h" | |
a074865e WN |
7 | #include "perf-hooks.h" |
8 | ||
9 | static void sigsegv_handler(int sig __maybe_unused) | |
10 | { | |
11 | pr_debug("SIGSEGV is observed as expected, try to recover.\n"); | |
12 | perf_hooks__recover(); | |
13 | signal(SIGSEGV, SIG_DFL); | |
14 | raise(SIGSEGV); | |
15 | exit(-1); | |
16 | } | |
17 | ||
a074865e | 18 | |
8ad85e9e | 19 | static void the_hook(void *_hook_flags) |
a074865e | 20 | { |
8ad85e9e | 21 | int *hook_flags = _hook_flags; |
a074865e WN |
22 | int *p = NULL; |
23 | ||
8ad85e9e | 24 | *hook_flags = 1234; |
a074865e WN |
25 | |
26 | /* Generate a segfault, test perf_hooks__recover */ | |
27 | *p = 0; | |
28 | } | |
29 | ||
81f17c90 | 30 | int test__perf_hooks(struct test *test __maybe_unused, int subtest __maybe_unused) |
a074865e | 31 | { |
8ad85e9e WN |
32 | int hook_flags = 0; |
33 | ||
a074865e | 34 | signal(SIGSEGV, sigsegv_handler); |
8ad85e9e | 35 | perf_hooks__set_hook("test", the_hook, &hook_flags); |
a074865e WN |
36 | perf_hooks__invoke_test(); |
37 | ||
38 | /* hook is triggered? */ | |
8ad85e9e WN |
39 | if (hook_flags != 1234) { |
40 | pr_debug("Setting failed: %d (%p)\n", hook_flags, &hook_flags); | |
a074865e | 41 | return TEST_FAIL; |
8ad85e9e | 42 | } |
a074865e WN |
43 | |
44 | /* the buggy hook is removed? */ | |
45 | if (perf_hooks__get_hook("test")) | |
46 | return TEST_FAIL; | |
47 | return TEST_OK; | |
48 | } |