b7462b133e28d4555d20e680e67462dc8af81a50
[librseq.git] / tests / no_syscall_test.c
1 // SPDX-License-Identifier: MIT
2 // SPDX-FileCopyrightText: 2024 Michael Jeanson <mjeanson@efficios.com>
3
4 #ifndef _GNU_SOURCE
5 #define _GNU_SOURCE
6 #endif
7 #include <stdint.h>
8
9 #include <rseq/rseq.h>
10
11 #include "tap.h"
12
13 #define NR_TESTS 4
14
15 /*
16 * Ensure the main executable has at least one TLS variable which will be
17 * allocated before the rseq area, making sure the rseq_offset is not 0. This
18 * allows testing that the rseq_offset variable is properly initialized by
19 * checking it is not 0.
20 *
21 * Most toolchains will add at least one main exec TLS variable but it's
22 * currently not the case on RISC-V.
23 */
24 __thread int dummy_tls = -1;
25
26 /*
27 * Check the state of the public symbols when the rseq syscall is unavailable.
28 *
29 * This test must be used with an LD_PRELOAD library to deny access to the
30 * syscall, or on a kernel that doesn't implement the syscall.
31 */
32
33 int main(void)
34 {
35 struct rseq_abi *rseq_abi;
36
37 plan_tests(NR_TESTS);
38
39 if (rseq_available(RSEQ_AVAILABLE_QUERY_KERNEL)) {
40 fail("The rseq syscall should be unavailable");
41 goto end;
42 }
43
44 /* The rseq syscall is disabled, no registration is possible. */
45
46 ok(rseq_flags == 0, "rseq_flags prior to registration is 0 (%d)", rseq_flags);
47 ok(rseq_size == 0, "rseq_size prior to registration is 0 (%d)", rseq_size);
48 ok(rseq_offset != 0, "rseq_offset prior to registration is not 0 (%td)", rseq_offset);
49
50 rseq_abi = rseq_get_abi();
51 ok((int32_t) rseq_abi->cpu_id == RSEQ_ABI_CPU_ID_UNINITIALIZED,
52 "rseq->cpu_id is set to RSEQ_ABI_CPU_ID_UNINITIALIZED (%d)",
53 (int32_t) rseq_abi->cpu_id);
54
55 end:
56 exit(exit_status());
57 }
This page took 0.032758 seconds and 5 git commands to generate.