// SPDX-License-Identifier: GPL-2.0 #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #include #include #include #include #include "rseq.h" #include "../kselftest_harness.h" FIXTURE(legacy) { }; static int cpu_id_in_sigfn = -1; static void sigfn(int sig) { struct rseq_abi *rs = rseq_get_abi(); cpu_id_in_sigfn = rs->cpu_id_start; } FIXTURE_SETUP(legacy) { int res = __rseq_register_current_thread(true, true); switch (res) { case -ENOSYS: SKIP(return, "RSEQ not enabled\n"); case -EBUSY: SKIP(return, "GLIBC owns RSEQ. Disable GLIBC RSEQ registration\n"); default: ASSERT_EQ(res, 0); } ASSERT_NE(signal(SIGUSR1, sigfn), SIG_ERR); } FIXTURE_TEARDOWN(legacy) { } TEST_F(legacy, legacy_test) { struct rseq_abi *rs = rseq_get_abi(); ASSERT_NE(rs, NULL); /* Overwrite rs::cpu_id_start */ rs->cpu_id_start = -1; sleep(1); ASSERT_NE(rs->cpu_id_start, -1); rs->cpu_id_start = -1; ASSERT_EQ(raise(SIGUSR1), 0); ASSERT_NE(rs->cpu_id_start, -1); ASSERT_NE(cpu_id_in_sigfn, -1); } TEST_HARNESS_MAIN