| 1 | |
| 2 |
|
| 3 |
|
| 4 | #include <test_progs.h>
|
| 5 |
|
| 6 | |
| 7 | * triggers task_newtask tracepoint; that new task will have a
|
| 8 | * NULL pointer task_works, and the associated task->task_works->func
|
| 9 | * should not be NULL if task_works itself is non-NULL.
|
| 10 | *
|
| 11 | * So to verify exception handling we want to see a NULL task_works
|
| 12 | * and task_works->func; if we see this we can conclude that the
|
| 13 | * exception handler ran when we attempted to dereference task->task_works
|
| 14 | * and zeroed the destination register.
|
| 15 |
|
| 16 | #include "exhandler_kern.skel.h"
|
| 17 |
|
| 18 | void test_exhandler(void)
|
| 19 | {
|
| 20 | int err = 0, duration = 0, status;
|
| 21 | struct exhandler_kern *skel;
|
| 22 | pid_t cpid;
|
| 23 |
|
| 24 | skel = exhandler_kern__open_and_load();
|
| 25 | if (CHECK(!skel, "skel_load", "skeleton failed: %d\n", err))
|
| 26 | goto cleanup;
|
| 27 |
|
| 28 | skel->bss->test_pid = getpid();
|
| 29 |
|
| 30 | err = exhandler_kern__attach(skel);
|
| 31 | if (!ASSERT_OK(err, "attach"))
|
| 32 | goto cleanup;
|
| 33 | cpid = fork();
|
| 34 | if (!ASSERT_GT(cpid, -1, "fork failed"))
|
| 35 | goto cleanup;
|
| 36 | if (cpid == 0)
|
| 37 | _exit(0);
|
| 38 | waitpid(cpid, &status, 0);
|
| 39 |
|
| 40 | ASSERT_NEQ(skel->bss->exception_triggered, 0, "verify exceptions occurred");
|
| 41 | cleanup:
|
| 42 | exhandler_kern__destroy(skel);
|
| 43 | }
|