Commit 3c27b408 authored by Michael Jeanson's avatar Michael Jeanson Committed by Ingo Molnar
Browse files

selftests/rseq: Add rseq syscall errors test



This test adds coverage of expected errors during rseq registration and
unregistration, it disables glibc integration and will thus always
exercise the rseq syscall explictly.

Signed-off-by: default avatarMichael Jeanson <mjeanson@efficios.com>
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
Reviewed-by: default avatarMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Shuah Khan <skhan@linuxfoundation.org>
Link: https://lore.kernel.org/r/20250121213402.1754762-1-mjeanson@efficios.com
parent 1a5d3492
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -9,3 +9,4 @@ param_test_compare_twice
param_test_mm_cid
param_test_mm_cid_benchmark
param_test_mm_cid_compare_twice
syscall_errors_test
+7 −2
Original line number Diff line number Diff line
@@ -16,11 +16,12 @@ OVERRIDE_TARGETS = 1

TEST_GEN_PROGS = basic_test basic_percpu_ops_test basic_percpu_ops_mm_cid_test param_test \
		param_test_benchmark param_test_compare_twice param_test_mm_cid \
		param_test_mm_cid_benchmark param_test_mm_cid_compare_twice
		param_test_mm_cid_benchmark param_test_mm_cid_compare_twice \
		syscall_errors_test

TEST_GEN_PROGS_EXTENDED = librseq.so

TEST_PROGS = run_param_test.sh
TEST_PROGS = run_param_test.sh run_syscall_errors_test.sh

TEST_FILES := settings

@@ -54,3 +55,7 @@ $(OUTPUT)/param_test_mm_cid_benchmark: param_test.c $(TEST_GEN_PROGS_EXTENDED) \
$(OUTPUT)/param_test_mm_cid_compare_twice: param_test.c $(TEST_GEN_PROGS_EXTENDED) \
					rseq.h rseq-*.h
	$(CC) $(CFLAGS) -DBUILDOPT_RSEQ_PERCPU_MM_CID -DRSEQ_COMPARE_TWICE $< $(LDLIBS) -lrseq -o $@

$(OUTPUT)/syscall_errors_test: syscall_errors_test.c $(TEST_GEN_PROGS_EXTENDED) \
					rseq.h rseq-*.h
	$(CC) $(CFLAGS) $< $(LDLIBS) -lrseq -o $@
+3 −3
Original line number Diff line number Diff line
@@ -87,7 +87,7 @@ static int sys_getcpu(unsigned *cpu, unsigned *node)
	return syscall(__NR_getcpu, cpu, node, NULL);
}

int rseq_available(void)
bool rseq_available(void)
{
	int rc;

@@ -96,9 +96,9 @@ int rseq_available(void)
		abort();
	switch (errno) {
	case ENOSYS:
		return 0;
		return false;
	case EINVAL:
		return 1;
		return true;
	default:
		abort();
	}
+5 −0
Original line number Diff line number Diff line
@@ -159,6 +159,11 @@ int32_t rseq_fallback_current_cpu(void);
 */
int32_t rseq_fallback_current_node(void);

/*
 * Returns true if rseq is supported.
 */
bool rseq_available(void);

/*
 * Values returned can be either the current CPU number, -1 (rseq is
 * uninitialized), or -2 (rseq initialization has failed).
+5 −0
Original line number Diff line number Diff line
#!/bin/bash
# SPDX-License-Identifier: MIT
# SPDX-FileCopyrightText: 2024 Michael Jeanson <mjeanson@efficios.com>

GLIBC_TUNABLES="${GLIBC_TUNABLES:-}:glibc.pthread.rseq=0" ./syscall_errors_test
Loading