From patchwork Tue Mar 4 07:10:31 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Patchwork-Id: 14000026 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EA1E11F4E2F; Tue, 4 Mar 2025 07:11:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072272; cv=none; b=kPIrWdGwbb9rFJ5FartkXaC4ylmQ5kFJzr2RSZJPMmBtyWmnZxgtOmpWbEIbwWK3+wIOFHAgqcaBjtINfa0Yd6chksf1+XXX/XlbkoQyUbpUB/JdhC3EyyfSZNSkjkmzTKwcXGv/S19w2RGml1Z87vK1uvpba4ZdZrAmMveYako= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072272; c=relaxed/simple; bh=5E53xutj7i2avw8mFb+DigExVkA7zqotHlVeTrlc3hc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Qe0C4ZuckLB9ltOSbJLUholsSgJFc5W1uW/BLSK1kAc8ExFnZJ2NWCYwQ3FAUvZh2QXxJ29j39oz+g9KQldC85mz7suTkk82Lpt1Rvrudihbm97ZFtTMqe00qSCBOjwMKdvzkrDq3jvpQqV5xpsN1gWKqZ7lx4aIrJAOy+IYwrI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=2uC4DEku; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=Nrw6wdu5; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="2uC4DEku"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="Nrw6wdu5" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1741072268; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=dbv4A12A6jXVb6GKM0Y5XVn83MHnBukUqH/KkZzQ2zU=; b=2uC4DEku9RlPlztQ24hBDq12OqD5zGm3wV4wCw9EvOiy/qdm8tkl0yXopdvcsjEJrV2oKs xlRTORduLJwhcWwUbeJBfBt+Klm07d4v5SJ2GO5LwEzQO3ZPdfy4uKUQu3xIyzLSAqT8zT PzCo1PBeS47rSPPHxsitZWSMIi+D/bE5hmSNUA9hHy8ClYQzxOd5l5yOjzBfTHhf7nfIUa bcrky83BtWuJotZa+t8QD2bdIhMeQMQPy2lxGgEb/xb7aWlRXXVzay2xvUeIErT9visySQ qbQk0eTvD0Y8OR2bN3OK5hKB6EfW3jtoo7bAP0t89fn8pLyq0sxzpWyVVGf62A== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1741072268; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=dbv4A12A6jXVb6GKM0Y5XVn83MHnBukUqH/KkZzQ2zU=; b=Nrw6wdu5YAaZybmcEPqg3o46wzU+3CM+mBifEVZfQ3CaSupgxyV+cRbFRaERn7OZDMm4ev QoCqkTjMrhO4hmDA== Date: Tue, 04 Mar 2025 08:10:31 +0100 Subject: [PATCH 01/32] selftests: harness: Add harness selftest Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250304-nolibc-kselftest-harness-v1-1-adca7cd231e2@linutronix.de> References: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> In-Reply-To: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1741072266; l=8071; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=5E53xutj7i2avw8mFb+DigExVkA7zqotHlVeTrlc3hc=; b=9a0Kvr7LG843JuYaUFMcjafyj9tvK/NS1DmEx82SsEBpYBGNNqgErq36fvAx9q/OMIv1HPv+H c+Fd44vvZI3BT31ejEAp/sf34tS1D59BZX4wgjHZ/VstifMzP1wH9Kv X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= Add a selftest for the harness itself so any changes can be validated. Signed-off-by: Thomas Weißschuh --- tools/testing/selftests/Makefile | 1 + tools/testing/selftests/kselftest/.gitignore | 1 + tools/testing/selftests/kselftest/Makefile | 6 + .../testing/selftests/kselftest/harness-selftest.c | 129 +++++++++++++++++++++ .../selftests/kselftest/harness-selftest.expected | 62 ++++++++++ .../selftests/kselftest/harness-selftest.sh | 14 +++ 6 files changed, 213 insertions(+) diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile index 8daac70c2f9d2c41be51f421b9c1e27eeee8bede..bea454100f4fef1c2c225ea82004bd52c6e6a397 100644 --- a/tools/testing/selftests/Makefile +++ b/tools/testing/selftests/Makefile @@ -47,6 +47,7 @@ TARGETS += ipc TARGETS += ir TARGETS += kcmp TARGETS += kexec +TARGETS += kselftest TARGETS += kvm TARGETS += landlock TARGETS += lib diff --git a/tools/testing/selftests/kselftest/.gitignore b/tools/testing/selftests/kselftest/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..9aab194e8ea25a2c5ccc116f9f728b8afd0c51c4 --- /dev/null +++ b/tools/testing/selftests/kselftest/.gitignore @@ -0,0 +1 @@ +/harness-selftest diff --git a/tools/testing/selftests/kselftest/Makefile b/tools/testing/selftests/kselftest/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..2f2933553dbc47014d9dfe0b4bd8ad3bc36e38c2 --- /dev/null +++ b/tools/testing/selftests/kselftest/Makefile @@ -0,0 +1,6 @@ +# SPDX-License-Identifier: GPL-2.0 + +TEST_GEN_PROGS_EXTENDED := harness-selftest +TEST_PROGS := harness-selftest.sh + +include ../lib.mk diff --git a/tools/testing/selftests/kselftest/harness-selftest.c b/tools/testing/selftests/kselftest/harness-selftest.c new file mode 100644 index 0000000000000000000000000000000000000000..8d39e7a0b99c41a5d33edfe2dbf875cac04c098d --- /dev/null +++ b/tools/testing/selftests/kselftest/harness-selftest.c @@ -0,0 +1,129 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include + +#ifndef NOLIBC +#include +#include +#endif + +/* Avoid any inconsistencies */ +#define TH_LOG_STREAM stdout + +#include "../kselftest_harness.h" + +TEST(standalone_pass) { + TH_LOG("before"); + ASSERT_EQ(0, 0); + EXPECT_EQ(0, 0); + TH_LOG("after"); +} + +TEST(standalone_fail) { + TH_LOG("before"); + EXPECT_EQ(0, 0); + EXPECT_EQ(0, 1); + ASSERT_EQ(0, 1); + TH_LOG("after"); +} + +TEST_SIGNAL(signal_pass, SIGUSR1) { + TH_LOG("before"); + ASSERT_EQ(0, 0); + TH_LOG("after"); + kill(getpid(), SIGUSR1); +} + +TEST_SIGNAL(signal_fail, SIGUSR1) { + TH_LOG("before"); + ASSERT_EQ(0, 1); + TH_LOG("after"); + kill(getpid(), SIGUSR1); +} + +FIXTURE(fixture) { + pid_t testpid; +}; + +FIXTURE_SETUP(fixture) { + TH_LOG("setup"); + self->testpid = getpid(); +} + +FIXTURE_TEARDOWN(fixture) { + TH_LOG("teardown same-process=%d", self->testpid == getpid()); +} + +TEST_F(fixture, pass) { + TH_LOG("before"); + ASSERT_EQ(0, 0); + TH_LOG("after"); +} + +TEST_F(fixture, fail) { + TH_LOG("before"); + ASSERT_EQ(0, 1); + TH_LOG("after"); +} + +TEST_F_TIMEOUT(fixture, timeout, 1) { + TH_LOG("before"); + sleep(2); + TH_LOG("after"); +} + +FIXTURE(fixture_parent) { + pid_t testpid; +}; + +FIXTURE_SETUP(fixture_parent) { + TH_LOG("setup"); + self->testpid = getpid(); +} + +FIXTURE_TEARDOWN_PARENT(fixture_parent) { + TH_LOG("teardown same-process=%d", self->testpid == getpid()); +} + +TEST_F(fixture_parent, pass) { + TH_LOG("before"); + ASSERT_EQ(0, 0); + TH_LOG("after"); +} + +FIXTURE(fixture_setup_failure) { + pid_t testpid; +}; + +FIXTURE_SETUP(fixture_setup_failure) { + TH_LOG("setup"); + self->testpid = getpid(); + ASSERT_EQ(0, 1); +} + +FIXTURE_TEARDOWN(fixture_setup_failure) { + TH_LOG("teardown same-process=%d", self->testpid == getpid()); +} + +TEST_F(fixture_setup_failure, pass) { + TH_LOG("before"); + ASSERT_EQ(0, 0); + TH_LOG("after"); +} + +int main(int argc, char **argv) +{ + /* + * The harness uses abort() to signal assertion failures, which triggers coredumps. + * This may be useful to debug real failures but not for this selftest, disable them. + */ + struct rlimit rlimit = { + .rlim_cur = 0, + .rlim_max = 0, + }; + + prctl(PR_SET_DUMPABLE, 0, 0, 0, 0); + setrlimit(RLIMIT_CORE, &rlimit); + + return test_harness_run(argc, argv); +} diff --git a/tools/testing/selftests/kselftest/harness-selftest.expected b/tools/testing/selftests/kselftest/harness-selftest.expected new file mode 100644 index 0000000000000000000000000000000000000000..1aa6461db90d4e7cc0679f19b69aadf4032875ec --- /dev/null +++ b/tools/testing/selftests/kselftest/harness-selftest.expected @@ -0,0 +1,62 @@ +TAP version 13 +1..9 +# Starting 9 tests from 4 test cases. +# RUN global.standalone_pass ... +# harness-selftest.c:16:standalone_pass:before +# harness-selftest.c:19:standalone_pass:after +# OK global.standalone_pass +ok 1 global.standalone_pass +# RUN global.standalone_fail ... +# harness-selftest.c:23:standalone_fail:before +# harness-selftest.c:25:standalone_fail:Expected 0 (0) == 1 (1) +# harness-selftest.c:26:standalone_fail:Expected 0 (0) == 1 (1) +# standalone_fail: Test terminated by assertion +# FAIL global.standalone_fail +not ok 2 global.standalone_fail +# RUN global.signal_pass ... +# harness-selftest.c:31:signal_pass:before +# harness-selftest.c:33:signal_pass:after +# OK global.signal_pass +ok 3 global.signal_pass +# RUN global.signal_fail ... +# harness-selftest.c:38:signal_fail:before +# harness-selftest.c:39:signal_fail:Expected 0 (0) == 1 (1) +# signal_fail: Test terminated by assertion +# FAIL global.signal_fail +not ok 4 global.signal_fail +# RUN fixture.pass ... +# harness-selftest.c:49:pass:setup +# harness-selftest.c:58:pass:before +# harness-selftest.c:60:pass:after +# harness-selftest.c:54:pass:teardown same-process=1 +# OK fixture.pass +ok 5 fixture.pass +# RUN fixture.fail ... +# harness-selftest.c:49:fail:setup +# harness-selftest.c:64:fail:before +# harness-selftest.c:65:fail:Expected 0 (0) == 1 (1) +# harness-selftest.c:54:fail:teardown same-process=1 +# fail: Test terminated by assertion +# FAIL fixture.fail +not ok 6 fixture.fail +# RUN fixture.timeout ... +# harness-selftest.c:49:timeout:setup +# harness-selftest.c:70:timeout:before +# timeout: Test terminated by timeout +# FAIL fixture.timeout +not ok 7 fixture.timeout +# RUN fixture_parent.pass ... +# harness-selftest.c:80:pass:setup +# harness-selftest.c:89:pass:before +# harness-selftest.c:91:pass:after +# harness-selftest.c:85:pass:teardown same-process=0 +# OK fixture_parent.pass +ok 8 fixture_parent.pass +# RUN fixture_setup_failure.pass ... +# harness-selftest.c:99:pass:setup +# harness-selftest.c:101:pass:Expected 0 (0) == 1 (1) +# pass: Test terminated by assertion +# FAIL fixture_setup_failure.pass +not ok 9 fixture_setup_failure.pass +# FAILED: 4 / 9 tests passed. +# Totals: pass:4 fail:5 xfail:0 xpass:0 skip:0 error:0 diff --git a/tools/testing/selftests/kselftest/harness-selftest.sh b/tools/testing/selftests/kselftest/harness-selftest.sh new file mode 100755 index 0000000000000000000000000000000000000000..bf691adf0b41aaedb2fbc5f06add9fd1d5689044 --- /dev/null +++ b/tools/testing/selftests/kselftest/harness-selftest.sh @@ -0,0 +1,14 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# +# Selftest for kselftest_harness.h +# + +DIR="$(dirname $(readlink -f "$0"))" + +TMPFILE="$(mktemp)" +trap 'rm "$TMPFILE"' EXIT + +$DIR/harness-selftest > "$TMPFILE" + +diff -u "$DIR"/harness-selftest.expected "$TMPFILE" From patchwork Tue Mar 4 07:10:32 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Patchwork-Id: 14000025 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C83D61F5826; Tue, 4 Mar 2025 07:11:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072272; cv=none; b=dgl4EI6BeSj5FOpuCH/9d1wbQF6+cTTNhEgCC9qUMI0FNp4qqKIJScwzPdEXm1kpC9OnTyl+1cDcF8AZeuKaECGt2SxvBfh7Put+jc5746P3nAXXkxivdWqFqW696i1ZxSsBNSrGUX6C0EdGvqkNEKaq+0WoBd7Ib3rDgFgfSVw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072272; c=relaxed/simple; bh=ngP0ZeYGfsdVmu5UMgRUq6/AZ63uVhxqi5hl+GZp6NM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=RUTSHpDtz9Je+mJmsO2hfWzVovt/ClVVb6lZX3/x92XNM5ZITg4lWZeMM+nttdt12bVhth2yOces37Nv0WGsa/M8vwlLZoA33ODGTBH6RBNpCdI1bGc+KSbc9/XIU+AJ7S3gxg9sLVQyC3gklIDB4E3qjYYLNLe3QWIRopKrCLQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=L4AvGgFf; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=99Fg0ogH; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="L4AvGgFf"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="99Fg0ogH" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1741072268; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=lWgK4Z18uSYuxBlCTX/qs310Gb2s7CNUM9/0ECxlbv4=; b=L4AvGgFfnD/SJIg2wLvppaAlJOCOEf3aQWvj8CwjatP9UvHRtx/VnuU5CMvOQbajnFVBs5 JPi2gqbJz2+jJwrSbe3+qgsDGQfaPcmgdCF4pnoyWvvybEXpvE9x0P3xX3voUEIdsZuyXM g0g85bqNAEgOHb8U+KONF7qbwdVio/kdjizYkWu379BihR4BW8tWjeQ5jSujPOro4jaheq H18DDYaiC1MbMcKYZT2J4+GzVyRPPfTUx7t8ZLZ20Xc2mkjwUDDequGlM1isRN6iJQhdWP M04Ktkv41z+DJNBfkTGshbtPJGvvfC6aQkkX6/aRFfvI/NrApLhdnqQkxHXbug== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1741072268; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=lWgK4Z18uSYuxBlCTX/qs310Gb2s7CNUM9/0ECxlbv4=; b=99Fg0ogH1TO/kxv7Jt8W3h5tEq/bq3ry9jdIgBiCLS8Sah502g1Vlz6/1MRqwG+20QlEMu 26oA8N1GFdaRZLCA== Date: Tue, 04 Mar 2025 08:10:32 +0100 Subject: [PATCH 02/32] selftests: harness: Use C89 comment style Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250304-nolibc-kselftest-harness-v1-2-adca7cd231e2@linutronix.de> References: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> In-Reply-To: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1741072266; l=842; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=ngP0ZeYGfsdVmu5UMgRUq6/AZ63uVhxqi5hl+GZp6NM=; b=C7f4CdN2AMm2geAe+FWhpbu6Y4K9i6ezDelKM1cJITPneK5jGfhwOoKDD0gV1siGXUOy9Hb1J KApQ/Lku3HkBbHMc0Z2v1F3vq7hKYz7Rb392dhAEcskaNeQSjiO5FFn X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= All comments in this file use C89 comment style. Except for this one. Change it to get one step closer to C89 compatibility. Signed-off-by: Thomas Weißschuh --- tools/testing/selftests/kselftest_harness.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/testing/selftests/kselftest_harness.h b/tools/testing/selftests/kselftest_harness.h index 666c9fde76da9d25fe6e248a7f2143c113473fe1..bac4327775ea65dbe977e9b22ee548bedcbd33ff 100644 --- a/tools/testing/selftests/kselftest_harness.h +++ b/tools/testing/selftests/kselftest_harness.h @@ -983,7 +983,7 @@ static void __timeout_handler(int sig, siginfo_t *info, void *ucontext) } t->timed_out = true; - // signal process group + /* signal process group */ kill(-(t->pid), SIGKILL); } From patchwork Tue Mar 4 07:10:33 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Patchwork-Id: 14000024 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C83791F5616; Tue, 4 Mar 2025 07:11:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072272; cv=none; b=sA14LKhn4ql4g2NE6jsnjX86SbtPWEa1I9Z6Pl/DVy+K4VKNk35BlDeUGLPFJuYSu4+LeFCzOcvEdQDTmDfTMAzYdjhniEo1IMtA7yOhZbD4q/PpU3wpJtiT+1nnFOa8x9iK3aDsdCU8WeYZf77BO6grKVk47sxEeUqKMX3Kkb4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072272; c=relaxed/simple; bh=brts6sI7fO8sdafrxrf0XUif0cGTeVBZWUynqL1HmPc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Y+nM/mkcEGtmFl2owRMHihaQmhsADTU/1hsk0AauDNPWjihbsCE5+HIiVNxe8I9BgeYHZgrmvruLH+6esCK22Q6Jv+Eb1x1q2kvc8AEMCKDe7WsDbgw6K8fIAurrA/kyLQ1Sq/ElLHBnPB56OkXsE8oKw07ML5/iLwXjW1IcJ0I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=o4Vzrr6P; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=3PK3A6f6; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="o4Vzrr6P"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="3PK3A6f6" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1741072269; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=McU1MORmucgC05fci48yCdSfOoJf0NFFfmjXRQ7FgCo=; b=o4Vzrr6PaWA+o6ctw70oXatVQdQSxWch/ctS1qoI3vbQyUiXhAreFAMcN4fxhLGXMShta7 yY975jenuqcFzzFURQgvLfARv/KSXsYjt6h4EawzIwTOCx/Bz99S6bGEC84cfjUDV+YkKk zzzFpbUbtVR7ebN/XWfykOIztxttXtr/c4qloH0+uhDqRI3zZgvCKMu7cmlX7HxyJPl7lG 7MaU189vRckiYP4w0y34cG2PTT7mu7RF8XF/giuFrDlW6GGY0fA4qcR8ZkW1tx0qwS4qCV Cb5OAMZVPU4RBC2eNno3FUsEtQifdCCy+jgC9TelJQ8v4PMbbiEMrRmrTUD9zg== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1741072269; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=McU1MORmucgC05fci48yCdSfOoJf0NFFfmjXRQ7FgCo=; b=3PK3A6f6IaqoKZYQ14i9NN728OWToywYT77E1n+l3zCeiZBZxmS8fLr/KcQALqnfAo3rmT Vf4+78nAn4xQvVDg== Date: Tue, 04 Mar 2025 08:10:33 +0100 Subject: [PATCH 03/32] selftests: harness: Ignore unused variant argument warning Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250304-nolibc-kselftest-harness-v1-3-adca7cd231e2@linutronix.de> References: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> In-Reply-To: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1741072266; l=997; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=brts6sI7fO8sdafrxrf0XUif0cGTeVBZWUynqL1HmPc=; b=zQ86J82UY53NxSyoCN1KKP2DlcwGfgi2346pgIKb2wrPLKNThW5Llp0MwRcl4peBL8OiHT+Wq P6BWtv6rTreDLWi/ssgX4hm0C3gQ5GglIV1t6d3/o1cnVkmmZl0ZmxW X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= For tests without fixtures the variant argument is unused. This is intentional, prevent to compiler from complaining. Signed-off-by: Thomas Weißschuh --- tools/testing/selftests/kselftest_harness.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/testing/selftests/kselftest_harness.h b/tools/testing/selftests/kselftest_harness.h index bac4327775ea65dbe977e9b22ee548bedcbd33ff..2b350ed60b2bf1cbede8e3a9b4ac5fe716900144 100644 --- a/tools/testing/selftests/kselftest_harness.h +++ b/tools/testing/selftests/kselftest_harness.h @@ -174,7 +174,7 @@ static void test_name(struct __test_metadata *_metadata); \ static inline void wrapper_##test_name( \ struct __test_metadata *_metadata, \ - struct __fixture_variant_metadata *variant) \ + struct __fixture_variant_metadata __attribute__((unused)) *variant) \ { \ _metadata->setup_completed = true; \ if (setjmp(_metadata->env) == 0) \ From patchwork Tue Mar 4 07:10:34 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Patchwork-Id: 14000027 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8A09C1F582E; Tue, 4 Mar 2025 07:11:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072273; cv=none; b=fxFdQX3xit2MaJAD3+MTeSUxB3DTJy8Ivyc5G1AZ8c2KjweNE8SIYAB43Rjx+uscxpARtlB+EALrXBt2HYz273NRRIPJAFwEE33uNjn9h3uuK6W5hjHjI7ABEQGiB0gADNStxrVZk3pEXv74s9iKFeeMZX4y5cA7xXSKt/8Ng/k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072273; c=relaxed/simple; bh=lQCsvZCManznXxoRZlWYV8bAc51DQHK993lH7lMNVP4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ZNtBlm0LOF8zthOTOGad0SZCiQ+tzbQSD3MyHBBMf5ISJbdn7Tc2jACBGdzd0XCesjz8HExZ+t0m+VWIL1VXLSO4EbuVACc01xcw12Ysk8czfDMFyzFGs8HWov8OtGphyiGyuE8+LH9Ff+/ObCb+GjaNLUeqGhPnttmI5zbtUvE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=Wg+W04RF; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=t7P3hdN4; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="Wg+W04RF"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="t7P3hdN4" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1741072269; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Yj4b/kgrOFJpYcVPs/RiGzf4gMX/wtv+L2rD6A41LIA=; b=Wg+W04RFCCO8oBuTxtysBUkKB4Vlcumz37pCR4nyYTZooWNSHv+++9IgHC1HfYEZVIKcuz 2+6kOzdt1e8DphdkGQkNk385utpFjckEM89KEKAkOlsySnqgD+Y9TX7IHj/6c1NI8M2Yoc 6g41qbwM4ontveJPDqJyz1OOsLHqxDDhjRgUDY4SbbGFOUO30GgW/EqQDk5HvmrIJvkOtU 2rStaGbprHPAC8SRdpsMflhqYErTHxm0IUMtZgoCbEog7upNfFfe+mPbKWC/9zcus0uWOX mspw19iVm/K+d0r29ttoKWvrPd+OcHnR1ngWlcia07JgWSx49XgmSCqmvTSDIw== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1741072269; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Yj4b/kgrOFJpYcVPs/RiGzf4gMX/wtv+L2rD6A41LIA=; b=t7P3hdN4iqqmyqomeu9rIzLC4pniY7vHmZIGuxO8WAJXl74OHrxUaOCN1tGgd/fHcqAA9q 5bYTPlS1YlMvxmCQ== Date: Tue, 04 Mar 2025 08:10:34 +0100 Subject: [PATCH 04/32] selftests: harness: Mark functions without prototypes static Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250304-nolibc-kselftest-harness-v1-4-adca7cd231e2@linutronix.de> References: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> In-Reply-To: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1741072266; l=2245; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=lQCsvZCManznXxoRZlWYV8bAc51DQHK993lH7lMNVP4=; b=AdGVo2qpD/O1qq/5xAVF5qKmBYZkYTfKSHBAOy6RXNR/f833VVfx0np5LA9eSmdL7VvqSkoEj IEQtncUXrj7CgyL4F5RjuVFdmEH7wLTgcitkOogG2GJsxiTfxx/mBk1 X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= With -Wmissing-prototypes the compiler will warn about non-static functions which don't have a prototype defined. As they are not used from a different compilation unit they don't need to be defined globally. Avoid the issue by marking the functions static. Signed-off-by: Thomas Weißschuh --- tools/testing/selftests/kselftest_harness.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tools/testing/selftests/kselftest_harness.h b/tools/testing/selftests/kselftest_harness.h index 2b350ed60b2bf1cbede8e3a9b4ac5fe716900144..5822bc0b86a3c623fd34830fb8b541b27672a00b 100644 --- a/tools/testing/selftests/kselftest_harness.h +++ b/tools/testing/selftests/kselftest_harness.h @@ -258,7 +258,7 @@ * A bare "return;" statement may be used to return early. */ #define FIXTURE_SETUP(fixture_name) \ - void fixture_name##_setup( \ + static void fixture_name##_setup( \ struct __test_metadata __attribute__((unused)) *_metadata, \ FIXTURE_DATA(fixture_name) __attribute__((unused)) *self, \ const FIXTURE_VARIANT(fixture_name) \ @@ -307,7 +307,7 @@ __FIXTURE_TEARDOWN(fixture_name) #define __FIXTURE_TEARDOWN(fixture_name) \ - void fixture_name##_teardown( \ + static void fixture_name##_teardown( \ struct __test_metadata __attribute__((unused)) *_metadata, \ FIXTURE_DATA(fixture_name) __attribute__((unused)) *self, \ const FIXTURE_VARIANT(fixture_name) \ @@ -987,7 +987,7 @@ static void __timeout_handler(int sig, siginfo_t *info, void *ucontext) kill(-(t->pid), SIGKILL); } -void __wait_for_test(struct __test_metadata *t) +static void __wait_for_test(struct __test_metadata *t) { struct sigaction action = { .sa_sigaction = __timeout_handler, @@ -1205,9 +1205,9 @@ static bool test_enabled(int argc, char **argv, return !has_positive; } -void __run_test(struct __fixture_metadata *f, - struct __fixture_variant_metadata *variant, - struct __test_metadata *t) +static void __run_test(struct __fixture_metadata *f, + struct __fixture_variant_metadata *variant, + struct __test_metadata *t) { struct __test_xfail *xfail; char test_name[1024]; From patchwork Tue Mar 4 07:10:35 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Patchwork-Id: 14000030 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7D8321F8720; Tue, 4 Mar 2025 07:11:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072275; cv=none; b=pPmKa7BUTeEmaCBtsfbEwo+rEJ6j7Y/GKYTaaFlbrMhi4ccfv2ltjjguTUAirwiKOpLTcg84QIqn5UDIDMXSPum2eUNBUtXKWuZ3Ym7RPp67QBs4p8kHs1ZnxNH3MG84vbUR8b1AKzQf8osL5e+f8SB5F0sALMeHfPhbETMnMoI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072275; c=relaxed/simple; bh=MhCoMPPqVc/gIaoHbpaw8Q1QptCO1I6gObh8DSH4ELU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lPBBkqSJkZ/6czI1v0/3aVuQTU45uHXvvICSoeHQRZ/JHL9keG2KtMzW9l/jt+g/4oyQBLwwcg6VpT3THnrKMqWSruwILQxJ021c9K60ZJy+WOqyWYMsrLbIKcUzBcjxR8gZsHXEvRnp78/QQOyec0S04ZqBRJV2Y2mllg17gco= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=Io/3RH0V; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=xOJ8Kdrp; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="Io/3RH0V"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="xOJ8Kdrp" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1741072270; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=t+94SOPd3J11uukpAuT8vGJKV5yurZHs3dOoh8W8Cbc=; b=Io/3RH0VSMxqtmYOmx1oGLE33k3DXEyNprNbPjzsMjDDi97ShpecOHxxdbDjYPI6RrI06P uWCaFzDSLRToXbagO8KQdzfPCue19Hh6cbvQWn2tbhvl8E3UrKkSxOl5+7lh9R45VVbeX1 OPeWDGSyE3bIw8pocVAD19F7liJ/T02msdC+348OjMLHRpMHDcUI1y6TBngAUKzx/mamRn d7FBILtxDcW6feIjYSdRQHzyF7U+By4eRwckxrP5AscOhvK495HCMUzDG2FHTL2kBsCh1B dPeUDjPvhAxnd2i4wCuY+otTaoyDWQhkdRS4ME07/gcWjCfKKE0y7lByMz80Ww== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1741072270; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=t+94SOPd3J11uukpAuT8vGJKV5yurZHs3dOoh8W8Cbc=; b=xOJ8KdrpwzNrnfxQvaIA5hy9BscksMfmzJbjYEGgxwp5oebk3Iwz5aAPJB7YnkJOdEDkT2 KKVrdEY2HwEurxCw== Date: Tue, 04 Mar 2025 08:10:35 +0100 Subject: [PATCH 05/32] selftests: harness: Remove inline qualifier for wrappers Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250304-nolibc-kselftest-harness-v1-5-adca7cd231e2@linutronix.de> References: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> In-Reply-To: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1741072266; l=1420; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=MhCoMPPqVc/gIaoHbpaw8Q1QptCO1I6gObh8DSH4ELU=; b=wS5Lin8Xcj0SkpcCfGXocZdyGTKWi07S2kgMlHl3jCZv2Z+J3rDrfFt9KdrTQwH2YryxuLYZk lnR8D2AY7OZB8Z4JCz3DYufMaenymiHLS9K2ziHhjFbrtmJX3rHZuuK X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= The pointers to the wrappers are stored in function pointers, preventing them from actually being inlined. Remove the innline qualifier, aligning these wrappers with the other functions defined through macros. Signed-off-by: Thomas Weißschuh --- tools/testing/selftests/kselftest_harness.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/kselftest_harness.h b/tools/testing/selftests/kselftest_harness.h index 5822bc0b86a3c623fd34830fb8b541b27672a00b..222a4f51a8d704c41597e09a241ad887ef787139 100644 --- a/tools/testing/selftests/kselftest_harness.h +++ b/tools/testing/selftests/kselftest_harness.h @@ -172,7 +172,7 @@ #define __TEST_IMPL(test_name, _signal) \ static void test_name(struct __test_metadata *_metadata); \ - static inline void wrapper_##test_name( \ + static void wrapper_##test_name( \ struct __test_metadata *_metadata, \ struct __fixture_variant_metadata __attribute__((unused)) *variant) \ { \ @@ -401,7 +401,7 @@ struct __test_metadata *_metadata, \ FIXTURE_DATA(fixture_name) *self, \ const FIXTURE_VARIANT(fixture_name) *variant); \ - static inline void wrapper_##fixture_name##_##test_name( \ + static void wrapper_##fixture_name##_##test_name( \ struct __test_metadata *_metadata, \ struct __fixture_variant_metadata *variant) \ { \ From patchwork Tue Mar 4 07:10:36 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Patchwork-Id: 14000028 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7D7AB1F868F; Tue, 4 Mar 2025 07:11:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072275; cv=none; b=RH/GJXL0Bhgfq/o3garjjbvJ2K3e529tGJrZd+OCn4hjBHOQYAofvH1Z88iKDWA4cNDE9erUf0yRwo/vVpQ2MzU5Yoq+C/Ln7KN5Zb7RTbic6NKc73XbZNZG4+QsUCtpD+FRGSZHFE8PHqTqTdtyAWuaXWahVKrtwxktn1nX9CU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072275; c=relaxed/simple; bh=IACp9TxeVkwNqbYPVDzgsOU/Szw5RWhqCAzuE/yKFGQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=P9io0+Qz3RJWj/Q7KVYdTT3JZxodIS2o4flAvRLw/oFVBAC0nXLFjg5w8Lp7nycq9KOFeKuG5AoZbsXt2Rxj5EP4UJuphH32IPb5RmU1ogQyscwYJ+295Y6OX99u/DFxQj/3INJiHX9p17aHMloQSCFbe1Co/sJFIg6At51Xad4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=PG03UypC; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=yelIy5aU; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="PG03UypC"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="yelIy5aU" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1741072271; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=jhA1n9boo1l4ht8vtjGqbzX8VsaxQaGO+nCB1t8DBJE=; b=PG03UypCdgNgMOIaO/icx5Ydy7m4nXDAgq4WLd78Fzii9NP3J3oO/3qKYygGCdz3lutAnY E8eKODnMXUhEH/8kVcbrixXd3FQwAz+ZuwrjWKtuhdgY0mKkX1zcpUz95Q8MnbqTkYzLHi ByfTemms01XzuDiGm3mtFalpv0RBuSCH+Mw/eJUfB/hgYImIQWmsdn1neZMfCs5tVZTwAT VV+GT6KA7Jsm7nJjoFuaCTNCS6CrJuPRlu7MoP4HO75EQkd99jGfmiA2DMllRvmJszvuxF l7tPvWSdeyveK3TIaVna4fNCY44fHMfeeqN9d3bhURlJM7Ug3VCoougil6weBA== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1741072271; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=jhA1n9boo1l4ht8vtjGqbzX8VsaxQaGO+nCB1t8DBJE=; b=yelIy5aUjEbrtex6I3V1polmWxU+krBfKWHujUfpiOz3yMWfQ62YVjphjLODCg0tlLIy7V 0XvUVSlrnQErpKAA== Date: Tue, 04 Mar 2025 08:10:36 +0100 Subject: [PATCH 06/32] selftests: harness: Guard includes on nolibc Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250304-nolibc-kselftest-harness-v1-6-adca7cd231e2@linutronix.de> References: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> In-Reply-To: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1741072266; l=1190; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=IACp9TxeVkwNqbYPVDzgsOU/Szw5RWhqCAzuE/yKFGQ=; b=nu/DeSbYTqvdwxssPGxt59mfA8eu/cOzgcmAI9WFImF7GWGYi6/N+PAiHagppT/nii5Ok2iVJ LGLJnti7EFnB8vKOo7V4hpNSUcrtaU6ympDwU9EB3rGF7uB/rrMllk/ X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= Nolibc doesn't provide all normal header files. Don't try to include these non-existent header files, as the symbols are available unconditionally anyways. Signed-off-by: Thomas Weißschuh --- tools/testing/selftests/kselftest_harness.h | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/tools/testing/selftests/kselftest_harness.h b/tools/testing/selftests/kselftest_harness.h index 222a4f51a8d704c41597e09a241ad887ef787139..6659c10f4d8fc7c750bc5e8a36ebcbcacda5de60 100644 --- a/tools/testing/selftests/kselftest_harness.h +++ b/tools/testing/selftests/kselftest_harness.h @@ -53,19 +53,23 @@ #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif -#include -#include -#include + #include #include #include #include #include +#include + +#ifndef NOLIBC +#include +#include +#include #include #include #include -#include #include +#endif #include "kselftest.h" From patchwork Tue Mar 4 07:10:37 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Patchwork-Id: 14000029 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DF1DA1F584F; Tue, 4 Mar 2025 07:11:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072275; cv=none; b=r5XJssS6RzjtJS5pKI5YuA1zVp3OTeYSfEhsi+AKpTQeSrdeuX+8mCQldNL1z598r+Lr70PXlRk0x072Q4mCWdtO/GYUSPQBhEze4OosQG30ErrUPFWEQ8xJgWA24eFMEYR58mM5KxmAbhrJ/LV+eH0x0wjCvvUxm6M9n0rRT/g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072275; c=relaxed/simple; bh=8vvtUkkfHU7xlGs3lJ+IYJc5qNLYbAx060rjbFlvpuU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Ac3RDkW5lwDOm4pD/U1Fl4tTRYi0pYW5GDrmx8HgIuel+dgCZcJQpN4PglEw1CM1NfU5MQNmV0RiZybpyj2PK+B5Af3uTkrKfID4Agg+gAM+vPqsloBzxwxoEh1kSZ59MBgdB2ICKQMpzZOi7Pzlr6d08YQfrvZEIsFhFkyRYWs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=DXP+8HYS; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=q+eetx4L; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="DXP+8HYS"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="q+eetx4L" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1741072272; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=god5WALMpEkXYpkoV5aKX9NrjAlOqlLEXSMF+UWBpRw=; b=DXP+8HYSw9ANj+wG4s31OnOGHxrg5UTHMavkMwQSvPdFBzqMOEl9mswdQVfTp6H4bndTIC GN7V4tNCdJRehxbgr9kIUiHiKOCZvoEZ2sUWFkK5Eu8nZq+twkJAQ2dVZzTOI0bKhXjQKh B8FAsdw8pdKNjoLZFxxRMiQAAiLJy6LZanxhmI8Luw26nE0++B3AeB4lzXc/DhCPcZtjYH +FKei4KF5Kx/B5sEXnTmqL/Uo3Wbx/VQ9XiejuxRq7udr8mW6wkhq8WfHKP1EFm5MdhmcX XFpoY6kiD9WpuzV1YA4dVmUf8aN6ibrK0prIQpRv1wTjlBQ49LTjRGU7fPZwNw== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1741072272; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=god5WALMpEkXYpkoV5aKX9NrjAlOqlLEXSMF+UWBpRw=; b=q+eetx4LyQAMto+5SowB626tpFF4LmW3DZZMDRx4dkhPxHUokP2V4Abr9E5Gt1EBNKRGlk qBhu/7ODeIy57vCA== Date: Tue, 04 Mar 2025 08:10:37 +0100 Subject: [PATCH 07/32] selftests: harness: Remove dependency on libatomic Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250304-nolibc-kselftest-harness-v1-7-adca7cd231e2@linutronix.de> References: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> In-Reply-To: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1741072266; l=1409; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=8vvtUkkfHU7xlGs3lJ+IYJc5qNLYbAx060rjbFlvpuU=; b=1xqyfb93DD9zV6ixSsFKx8ObiOnTGVdqzRrqpICbcltbHN9MY18YjxcX9RDdOiss+vj8KJA5r zEUdkTqaLhJAcCHCznKxXPantI+0KrwuS4S9H1z5rlIPGSs6XMmqCcm X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= __sync_bool_compare_and_swap() is deprecated and requires libatomic on GCC. Compiler toolchains don't necessarily have libatomic available, so avoid this requirement by using atomics that don't need libatomic. Signed-off-by: Thomas Weißschuh --- tools/testing/selftests/kselftest_harness.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/kselftest_harness.h b/tools/testing/selftests/kselftest_harness.h index 6659c10f4d8fc7c750bc5e8a36ebcbcacda5de60..bf5ffc594a4a864d2e8bb6f47c29fa56d58919d9 100644 --- a/tools/testing/selftests/kselftest_harness.h +++ b/tools/testing/selftests/kselftest_harness.h @@ -443,12 +443,12 @@ } \ if (child == 0) { \ if (_metadata->setup_completed && !fixture_name##_teardown_parent && \ - __sync_bool_compare_and_swap(teardown, false, true)) \ + !__atomic_test_and_set(teardown, __ATOMIC_RELAXED)) \ fixture_name##_teardown(_metadata, self, variant->data); \ _exit(0); \ } \ if (_metadata->setup_completed && fixture_name##_teardown_parent && \ - __sync_bool_compare_and_swap(teardown, false, true)) \ + !__atomic_test_and_set(teardown, __ATOMIC_RELAXED)) \ fixture_name##_teardown(_metadata, self, variant->data); \ munmap(teardown, sizeof(*teardown)); \ if (self && fixture_name##_teardown_parent) \ From patchwork Tue Mar 4 07:10:38 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Patchwork-Id: 14000032 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5E74C1F5853; Tue, 4 Mar 2025 07:11:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072276; cv=none; b=seXWIlQskwTR7xvdjC4giLf/ihT6bHTrJBEGYQhdh2coIQUnVrrq4Mu7nFWo67xRGC6y9Jtlxyrb8pta2X3PgEv+Y8n2Thj4XoaRbOiVgl4f4wUSNEoE8HJSTCIGhvSm7vzwW/IQyAmqAkrsa/+ysX9fhZb0ulKfTc9soZyLm1w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072276; c=relaxed/simple; bh=LoHEuTmyCWfppdxzkuks0aIW+fGsuAaTBTLeqSXo1HM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Iimq7f6NCUSHMAXjL1P1ApXJS6u6SVaFeOG9KLtwhgdsJLe932Yo/PR/q54PqQ5kqMlFoXvrtgS0Apx6Ko2/NdFvHpzB05HZ0RVpF5c1IMCs5os41MGYucH4sUYVSSxl/e9kysCp5KFOVZYIJNNEr/hKKZy7Ps4pWdDHV4dsWiE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=JEdOQDka; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=QYPO9Crf; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="JEdOQDka"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="QYPO9Crf" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1741072272; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=d7JoiIctFus6hhdRs7mtzErie5kNL1JBaIkwvaX5ucM=; b=JEdOQDka31P3RBSjD94xWJMLqIhOyUbuzcmjL2qLo3d1beF4cbW8ggc4iChzn8tW6i1v6q Kmxia1DhoDEGw7pEIIY0XCgXMhiv9ExGbafVmNDgMZ45ZmL2lebLlzM3Htjebg5+GmciYK fXqJsY1+E4oCx9OS4czDHN8LhElhUDa4dz74FFVz0pIpTWIqvUq3n0U+Y34zP9n6KFUhjZ sshxfv07Qtub5a7k8CivmVZSF/cbBaMTRyxC2bbU5DETKQmAjU8bsma8GWwfggg0gZjig0 w2tSRrAaFS56mgto78sucfHej4hd8L/p/j30bNGlOrd5Kt02R8Gk6gsibosZbw== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1741072272; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=d7JoiIctFus6hhdRs7mtzErie5kNL1JBaIkwvaX5ucM=; b=QYPO9CrfXNReqXBf6IPla0tRqU7EKzJxj2rYcqkdRxx7q+wGcWecHJydm1AMkDgrXA013Q zz0dXpaVWDnaXqCQ== Date: Tue, 04 Mar 2025 08:10:38 +0100 Subject: [PATCH 08/32] selftests: harness: Implement test timeouts through pidfd Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250304-nolibc-kselftest-harness-v1-8-adca7cd231e2@linutronix.de> References: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> In-Reply-To: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1741072266; l=4078; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=LoHEuTmyCWfppdxzkuks0aIW+fGsuAaTBTLeqSXo1HM=; b=aqVq/wFtfuw2Kgvlc9EYJp8nHDm96QSb2Ma/6rIu5p8LZdiT/9JfGAjHKaZmVKGoGY+exEvq8 V1L3AxUmVkVC+ASD1Vim1X6ARVyaAIrCrdivFU27JEF2VaNPA0G2SKd X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= Make the harness compatible with nolibc which does not implement signals by replacing the signal logic with pidfds. The code also becomes simpler. Signed-off-by: Thomas Weißschuh --- tools/testing/selftests/kselftest_harness.h | 72 ++++++++++------------------- 1 file changed, 25 insertions(+), 47 deletions(-) diff --git a/tools/testing/selftests/kselftest_harness.h b/tools/testing/selftests/kselftest_harness.h index bf5ffc594a4a864d2e8bb6f47c29fa56d58919d9..d265b45c86d03c6f854047138ee8dc19dcc7a4d9 100644 --- a/tools/testing/selftests/kselftest_harness.h +++ b/tools/testing/selftests/kselftest_harness.h @@ -65,6 +65,8 @@ #include #include #include +#include +#include #include #include #include @@ -918,7 +920,6 @@ struct __test_metadata { int exit_code; int trigger; /* extra handler after the evaluation */ int timeout; /* seconds to wait for test timeout */ - bool timed_out; /* did this test timeout instead of exiting? */ bool aborted; /* stopped test due to failed ASSERT */ bool setup_completed; /* did setup finish? */ jmp_buf env; /* for exiting out of test early */ @@ -968,75 +969,52 @@ static inline void __test_check_assert(struct __test_metadata *t) abort(); } -struct __test_metadata *__active_test; -static void __timeout_handler(int sig, siginfo_t *info, void *ucontext) -{ - struct __test_metadata *t = __active_test; - - /* Sanity check handler execution environment. */ - if (!t) { - fprintf(TH_LOG_STREAM, - "# no active test in SIGALRM handler!?\n"); - abort(); - } - if (sig != SIGALRM || sig != info->si_signo) { - fprintf(TH_LOG_STREAM, - "# %s: SIGALRM handler caught signal %d!?\n", - t->name, sig != SIGALRM ? sig : info->si_signo); - abort(); - } - - t->timed_out = true; - /* signal process group */ - kill(-(t->pid), SIGKILL); -} - static void __wait_for_test(struct __test_metadata *t) { - struct sigaction action = { - .sa_sigaction = __timeout_handler, - .sa_flags = SA_SIGINFO, - }; - struct sigaction saved_action; /* * Sets status so that WIFEXITED(status) returns true and * WEXITSTATUS(status) returns KSFT_FAIL. This safe default value * should never be evaluated because of the waitpid(2) check and - * SIGALRM handling. + * timeout handling. */ int status = KSFT_FAIL << 8; - int child; + struct pollfd poll_child; + int ret, child, childfd; + bool timed_out = false; - if (sigaction(SIGALRM, &action, &saved_action)) { + childfd = syscall(__NR_pidfd_open, t->pid, 0); + if (childfd == -1) { t->exit_code = KSFT_FAIL; fprintf(TH_LOG_STREAM, - "# %s: unable to install SIGALRM handler\n", + "# %s: unable to open pidfd\n", t->name); return; } - __active_test = t; - t->timed_out = false; - alarm(t->timeout); - child = waitpid(t->pid, &status, 0); - if (child == -1 && errno != EINTR) { + + poll_child.fd = childfd; + poll_child.events = POLLIN; + ret = poll(&poll_child, 1, t->timeout * 1000); + if (ret == -1) { t->exit_code = KSFT_FAIL; fprintf(TH_LOG_STREAM, - "# %s: Failed to wait for PID %d (errno: %d)\n", - t->name, t->pid, errno); + "# %s: unable to wait on child pidfd\n", + t->name); return; + } else if (ret == 0) { + timed_out = true; + /* signal process group */ + kill(-(t->pid), SIGKILL); } - - alarm(0); - if (sigaction(SIGALRM, &saved_action, NULL)) { + child = waitpid(t->pid, &status, WNOHANG); + if (child == -1 && errno != EINTR) { t->exit_code = KSFT_FAIL; fprintf(TH_LOG_STREAM, - "# %s: unable to uninstall SIGALRM handler\n", - t->name); + "# %s: Failed to wait for PID %d (errno: %d)\n", + t->name, t->pid, errno); return; } - __active_test = NULL; - if (t->timed_out) { + if (timed_out) { t->exit_code = KSFT_FAIL; fprintf(TH_LOG_STREAM, "# %s: Test terminated by timeout\n", t->name); From patchwork Tue Mar 4 07:10:39 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Patchwork-Id: 14000031 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 93EE61F8BAF; Tue, 4 Mar 2025 07:11:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072276; cv=none; b=DyGalY3InjTcwQLp4xgeDABUTpc11GsdYIevvqmO+AdkYDHEpgpQFOPXsfLKfpkv+2oDxWYt/67MdlMEMz6RzBzKbB2WdIDw/d4Dg7VHA6Y7lVIDSh19GRYWBWupYcAjuoOST5kTNFVcs6F7AfDVuJf8xyCVjhUqUIpWO4JI+yo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072276; c=relaxed/simple; bh=5WjtgJ/PWjfO6GYXDJ5zRMdY1aRHo29DG+4wDLXv7tw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=bblDTGp+FjjfGOCj02U+NcOsP1gdXvcr5+WT8VBxV4k21jeSgx5xN2VZTNdnqXy9Si+tvrapqUgFSHydngYsGkzYj8L67vev5wD4sxn1kvRqvSjLjQqsidigOcmkl7lnmngE7cZXH86VqngyfbJuydtQ2fg0v5p8PfBF7to7UFo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=RzHzkkXH; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=X1bb5lXl; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="RzHzkkXH"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="X1bb5lXl" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1741072273; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=msz34P0kGVgxpW4v18ORw4au6ARuVBJ7iqcwqv9B1Lc=; b=RzHzkkXHa0sxKoFaa9zAnEWh1i/SuUiQdVEe9pGMG7sKJyVSIYlLQ7G2nPZYiUoR9KlsrF cvlWWAC6WDBB+5cR+TAsHmlPROKeV1TmCTd4h7cNGCeAhX68/Vc71aer/y8aHw/ozlH+sI +qthschvR3DnlCntqyys8CMcY+ktsh1WIQjx5fiI5sjO16Ey2vegHW72rzTD81N402A1/5 KzPBMrlw+AVWix5u4GsvxcYdC8wmevf/zQ9FTLm7Iq81b50hAUok3SWMnXkOvRlmtGq40c jQ++OjZo30qrGDd/IHIR8K6yQPWvSE3n4HWi8Tiu7aCE/ojjvRFzOCgWP1eEoA== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1741072273; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=msz34P0kGVgxpW4v18ORw4au6ARuVBJ7iqcwqv9B1Lc=; b=X1bb5lXl0AOcG8zRI+A7KWX4pw4bkDV06I95tBcg0Ftjktgb0eBodELmOqw7Uu91/SRAow C4f7/I8Ncb45y0AQ== Date: Tue, 04 Mar 2025 08:10:39 +0100 Subject: [PATCH 09/32] selftests: harness: Don't set setup_completed for fixtureless tests Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250304-nolibc-kselftest-harness-v1-9-adca7cd231e2@linutronix.de> References: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> In-Reply-To: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1741072266; l=862; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=5WjtgJ/PWjfO6GYXDJ5zRMdY1aRHo29DG+4wDLXv7tw=; b=xuP49fpOhNp6L5QJxlXpSFEkTowrxmqBmWrBASDwvsElRWiXjvIEuWfO9LcxOAiLghlU2Cpt6 A/r5UQP6rUmA3y5IywTwpEwy88fNcuHN+PqTKCoDM4Acav/dcRxtBd9 X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= This field is unused and has no meaning for tests without fixtures. Don't set it for them. Signed-off-by: Thomas Weißschuh --- tools/testing/selftests/kselftest_harness.h | 1 - 1 file changed, 1 deletion(-) diff --git a/tools/testing/selftests/kselftest_harness.h b/tools/testing/selftests/kselftest_harness.h index d265b45c86d03c6f854047138ee8dc19dcc7a4d9..df55b99d8abab2398d2eba5080c4d0c795688bc7 100644 --- a/tools/testing/selftests/kselftest_harness.h +++ b/tools/testing/selftests/kselftest_harness.h @@ -182,7 +182,6 @@ struct __test_metadata *_metadata, \ struct __fixture_variant_metadata __attribute__((unused)) *variant) \ { \ - _metadata->setup_completed = true; \ if (setjmp(_metadata->env) == 0) \ test_name(_metadata); \ __test_check_assert(_metadata); \ From patchwork Tue Mar 4 07:10:40 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Patchwork-Id: 14000033 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 953C31F91C8; Tue, 4 Mar 2025 07:11:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072277; cv=none; b=daraYKZx4kn3WrZiTB4uv7tV1OO3sL5R0UMZkWu4IA/QYmSk7LhJeJjNyYBlTFwE2AFx295lfi0pv/vz9l/bcUMTFAsEwVtrqfvmU40+71RKSOjelEsY5xmyUwXEsbo7sT5h2Kai0iR83Ilz5eNDPI3k+oGIUyicYEKojGzeGgA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072277; c=relaxed/simple; bh=n11dzlHJKAUvcxhcZ3+QmW7/Z+t7UcsNSCN+9tRhJ+U=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=l1E4eF8LtgEWl8YcWcIkLz29BQnRsSElAOkzXCRxAv2F6mG+a8pQjSgw2SAHD/+MGUDS1rI2g18yo+pjhDN5sy3R7pyY9XO7+hpsqn/2SHDjkf1193C6AzvC3p0Uf0SwHAv7Fredk/AN4EHQmBAVTrEVD1l6RWuOsnvarTvS9cY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=LjvghqnW; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=EnGwB1Mk; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="LjvghqnW"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="EnGwB1Mk" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1741072273; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=QGUzQQZccJ78cNMkb79/3IJvgD3Wyye1IF1KinfhvjA=; b=LjvghqnWKER74QEsfI+7+XrTBs5+Idbff1RJ06+YGd8XrhcoTeZRk2/XOYmMBTpiaPcJvW TlRAc4NfPW5kQgGllbUb96Pk8YOyVood6pJUuIHELtw+6vrs/oDnOLFBMzx3W060yLNx24 c1y66gqfmEWAEcisF9mWChj58E3N6tiwqLbBNevuv0KybESi0pAh07X102vpcjLgg3Tw4k UuLug52Ia2hekTPxeKKZ7b2Q1Y1AUz/YnS0Ibdv4HgnhKykjvixzJVm2GRYOwaueVclB6Z LBiLDpU2X5/Vd09GbibXOwoZb0USASD0XciNGfGLiY3l3ahFqL+sviOqN74CvA== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1741072273; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=QGUzQQZccJ78cNMkb79/3IJvgD3Wyye1IF1KinfhvjA=; b=EnGwB1Mk2f0ifTBIhddUWkfJ0EtDFZwwdXVH+pYOHd4m1VRVuSyo9t3A3KugvIKDEXmdeW mvQjZ8sT83W8/tDg== Date: Tue, 04 Mar 2025 08:10:40 +0100 Subject: [PATCH 10/32] selftests: harness: Always provide "self" and "variant" Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250304-nolibc-kselftest-harness-v1-10-adca7cd231e2@linutronix.de> References: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> In-Reply-To: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1741072266; l=1726; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=n11dzlHJKAUvcxhcZ3+QmW7/Z+t7UcsNSCN+9tRhJ+U=; b=gKYaxtFfX8nACnUEZqJ4cGUouQ8kniQXhS/hvIU4JW1t5iCEPnc88DTefdTufNmmjugH3weDk DGmv2zQ/nWJDQYFMdtIuFvABhNaowzOXl3qMtbNv59aBTwPi9OY0VNl X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= Some upcoming changes to the assertion macros need those two symbols also to be available for tests without fixtures. Provide them with a NULL value. Signed-off-by: Thomas Weißschuh --- tools/testing/selftests/kselftest_harness.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/testing/selftests/kselftest_harness.h b/tools/testing/selftests/kselftest_harness.h index df55b99d8abab2398d2eba5080c4d0c795688bc7..0ea3778a3a85fda6bc363d2b2e1038679920d22b 100644 --- a/tools/testing/selftests/kselftest_harness.h +++ b/tools/testing/selftests/kselftest_harness.h @@ -177,13 +177,13 @@ #define TEST_SIGNAL(test_name, signal) __TEST_IMPL(test_name, signal) #define __TEST_IMPL(test_name, _signal) \ - static void test_name(struct __test_metadata *_metadata); \ + static void test_name(struct __test_metadata *_metadata, void *self, const void *variant); \ static void wrapper_##test_name( \ struct __test_metadata *_metadata, \ struct __fixture_variant_metadata __attribute__((unused)) *variant) \ { \ if (setjmp(_metadata->env) == 0) \ - test_name(_metadata); \ + test_name(_metadata, NULL, NULL); \ __test_check_assert(_metadata); \ } \ static struct __test_metadata _##test_name##_object = \ @@ -197,7 +197,9 @@ __register_test(&_##test_name##_object); \ } \ static void test_name( \ - struct __test_metadata __attribute__((unused)) *_metadata) + struct __test_metadata __attribute__((unused)) *_metadata, \ + void __attribute__((unused)) *self, \ + const void __attribute__((unused)) *variant) /** * FIXTURE_DATA() - Wraps the struct name so we have one less From patchwork Tue Mar 4 07:10:41 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Patchwork-Id: 14000034 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E29D41F9A9C; Tue, 4 Mar 2025 07:11:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072277; cv=none; b=hQu6O2QJTSOqeb4LMgqZcE+Z2j3FRhTO4A2bH7wTq2QBC2gJZsLRsUAIFrxUpelDDHJkMEi8E0MBDj7QNF+01EYT2/jHxVwnGoq6+1LQlchtNaNIJUQP6RjuM3akC7vr/TewNlxpGhWw42rCoPSZnByQlKFXE+PnJO7+a9z4DaE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072277; c=relaxed/simple; bh=GkPLD3AoeXEEDQ877/auMW7WFaiUlLaToVcqvfG/InA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=eqFfbgEC620kEyFQLWwb5DqMCoH6rVFUfLKIJJRKEUUY8lqo3w5TBM2TzlSdAghuX0RwnFWse5FuQYieKU4JyEWp6rv0hYmGYo5GZFo1WdPFGg9D9kWlcB9tqH4trgff8B3KkRaRS37f3WLsv3Kw06uYCvkLOM1afFr32ACMlZA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=sqs0eO7x; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=Lr8+zCAA; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="sqs0eO7x"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="Lr8+zCAA" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1741072274; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=9O+35zP+pAsAAP39kZSZHnq5eI8eEjgxMA8F0r7XiJo=; b=sqs0eO7xmxM7mDnPVLvtwrD7yvzj5CZh2Z3KfRmwc/A1uXXmZJDqYgezrsm2oaV1jaTTQG VrBIZCrLj11VhXwZh33WrDWl1fulmgykm5F/3PslHkeFOdKEuSxO+55pWGFTM9m30zoeWD Vq9b8UGm+mNTFjpghiITtrpHSGamLeeRgVQOD5S2Psnm5zRoc9KyNOBDayhTtVtU5PRY2r aRls5do+WRy/CT80WUPTxe9ZuAyfpXJe5CqX5mewl9qreevCDAIQ7fYXM6InVZyCEQXVqf G6cE3lU7xZWufWE7rdtdXyygR5UAHK1JwV/SvFZoq97kVLiW20XaPRwTzfLkjg== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1741072274; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=9O+35zP+pAsAAP39kZSZHnq5eI8eEjgxMA8F0r7XiJo=; b=Lr8+zCAAbr/QTW/W0oRj2Ye8ZyGRVFTcgDHx0YgYbwmwRnnM48kGZO4F2ukzWxTOUmrFH1 WLQXU08PQEIEeBBQ== Date: Tue, 04 Mar 2025 08:10:41 +0100 Subject: [PATCH 11/32] selftests: harness: Move teardown conditional into test metadata Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250304-nolibc-kselftest-harness-v1-11-adca7cd231e2@linutronix.de> References: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> In-Reply-To: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1741072266; l=3443; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=GkPLD3AoeXEEDQ877/auMW7WFaiUlLaToVcqvfG/InA=; b=ym68N7xv0dRCnQswxqJ012iHfoRxQemiZqps+hsiSsli7RY4xZ0s8g3PkzBgoo3AyQ2Jdjmel rhpTEzQbOHvD+IxQNIfP6ZxHXeJI+J0Q8Iw4/LOOZuEVZNqIfdbSx/D X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= To get rid of setjmp()/longjmp(), the teardown logic needs to be usable from __bail(). To access the atomic teardown conditional from there, move it into the test metadata. This also allows the removal of "setup_completed". Signed-off-by: Thomas Weißschuh --- tools/testing/selftests/kselftest_harness.h | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/tools/testing/selftests/kselftest_harness.h b/tools/testing/selftests/kselftest_harness.h index 0ea3778a3a85fda6bc363d2b2e1038679920d22b..2f067c0f47729d10f205774e58dfd85866bd4c96 100644 --- a/tools/testing/selftests/kselftest_harness.h +++ b/tools/testing/selftests/kselftest_harness.h @@ -417,9 +417,9 @@ pid_t child = 1; \ int status = 0; \ /* Makes sure there is only one teardown, even when child forks again. */ \ - bool *teardown = mmap(NULL, sizeof(*teardown), \ + _metadata->no_teardown = mmap(NULL, sizeof(*_metadata->no_teardown), \ PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); \ - *teardown = false; \ + *_metadata->no_teardown = true; \ if (sizeof(*self) > 0) { \ if (fixture_name##_teardown_parent) { \ self = mmap(NULL, sizeof(*self), PROT_READ | PROT_WRITE, \ @@ -437,7 +437,7 @@ /* Let setup failure terminate early. */ \ if (_metadata->exit_code) \ _exit(0); \ - _metadata->setup_completed = true; \ + *_metadata->no_teardown = false; \ fixture_name##_##test_name(_metadata, self, variant->data); \ } else if (child < 0 || child != waitpid(child, &status, 0)) { \ ksft_print_msg("ERROR SPAWNING TEST GRANDCHILD\n"); \ @@ -445,15 +445,16 @@ } \ } \ if (child == 0) { \ - if (_metadata->setup_completed && !fixture_name##_teardown_parent && \ - !__atomic_test_and_set(teardown, __ATOMIC_RELAXED)) \ + if (!fixture_name##_teardown_parent && \ + !__atomic_test_and_set(_metadata->no_teardown, __ATOMIC_RELAXED)) \ fixture_name##_teardown(_metadata, self, variant->data); \ _exit(0); \ } \ - if (_metadata->setup_completed && fixture_name##_teardown_parent && \ - !__atomic_test_and_set(teardown, __ATOMIC_RELAXED)) \ + if (fixture_name##_teardown_parent && \ + !__atomic_test_and_set(_metadata->no_teardown, __ATOMIC_RELAXED)) \ fixture_name##_teardown(_metadata, self, variant->data); \ - munmap(teardown, sizeof(*teardown)); \ + munmap(_metadata->no_teardown, sizeof(*_metadata->no_teardown)); \ + _metadata->no_teardown = NULL; \ if (self && fixture_name##_teardown_parent) \ munmap(self, sizeof(*self)); \ if (WIFEXITED(status)) { \ @@ -922,7 +923,7 @@ struct __test_metadata { int trigger; /* extra handler after the evaluation */ int timeout; /* seconds to wait for test timeout */ bool aborted; /* stopped test due to failed ASSERT */ - bool setup_completed; /* did setup finish? */ + bool *no_teardown; /* fixture needs teardown */ jmp_buf env; /* for exiting out of test early */ struct __test_results *results; struct __test_metadata *prev, *next; @@ -1201,7 +1202,7 @@ static void __run_test(struct __fixture_metadata *f, t->exit_code = KSFT_PASS; t->trigger = 0; t->aborted = false; - t->setup_completed = false; + t->no_teardown = NULL; memset(t->env, 0, sizeof(t->env)); memset(t->results->reason, 0, sizeof(t->results->reason)); From patchwork Tue Mar 4 07:10:42 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Patchwork-Id: 14000035 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2B5E41F9ED2; Tue, 4 Mar 2025 07:11:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072278; cv=none; b=pjJELmDkP46NOGJltm6JgtsKYWOqvbKjzD9jkc1J++cRiMnOtb+M2gUidCFFRQBoHsOX9O6sSEWlIzTnzqkwi5c+XIpmuJjqkUqOQUj8eBTt09g+nKWysvd9WgZ4tSCHc8h6KEZxJRk/hjkATOmCv86TqBZohQkECc6eqv6+Zxo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072278; c=relaxed/simple; bh=kSJ+Swu+8W5z5Seyz15kYMb3i2VBeQ4nM5oEkTiuqqw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=BqB9s1a0su4Oqm2w3Lq/cn+hzJvDWQO/unatKMg5vCEWn0W+Oko4uJchpWCZnIQfoJ1zHsh+dkAUqXttrls2iI8d+f4RqxFa1k6jxdBTP7+6Fwx6aC4AEbChfNt+XAeqnk3V7yiipt5R/YzPaEYMYYfUZFTeCTY9OwKrg/oJyBg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=3Foy7ocf; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=cHZ3ceud; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="3Foy7ocf"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="cHZ3ceud" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1741072274; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=h5fJDHm1fiAcLVFAbsFNMIv1dhxq8wr/vlTGBhOEMio=; b=3Foy7ocfgaKPgPHbGoCI9EHbJoV/2cSCmCmMJlnpW3wBiKXckxUlAWzlVJAnBqT/+sdh0m 23cBP3n6le/3kTeiOnaOab66gX0DNCsjCKxybWHkOn+99aYZ/ZB2EzDoGRpKelzC7zALpA z2nxAP1jA9vG7NBLIsHKA+dbJO1rNgIk+GyK4/w+hK9/yziFYayFrhvxXahORE2jX6KraG ilapXoy4IQBEKWXghbLX9j6a7n+8bfkZq5p852t10+cNMsEuJ2TMk+94IQr8MReRZMFCK9 JGjIj7OsE+NVmkfpL/3F5ykOU6zHgYgW+nh6wkULZk2ixD3atDnIURB4DiYcFw== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1741072274; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=h5fJDHm1fiAcLVFAbsFNMIv1dhxq8wr/vlTGBhOEMio=; b=cHZ3ceudfxugqqPQI2imYFeWTqngdGIrDa2X6KshqlUNd2Xgz3WiOa/vryDGspPOyNjMhD 4EACNXTXOGp3i+Ag== Date: Tue, 04 Mar 2025 08:10:42 +0100 Subject: [PATCH 12/32] selftests: harness: Add teardown callback to test metadata Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250304-nolibc-kselftest-harness-v1-12-adca7cd231e2@linutronix.de> References: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> In-Reply-To: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1741072266; l=2758; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=kSJ+Swu+8W5z5Seyz15kYMb3i2VBeQ4nM5oEkTiuqqw=; b=8p3S6eNuXT4bQAFdkByTT4iEkOGZoRhEVO2OHQAZ23jsngVe85QW9ZvVL5HUv9iqHOEwf0j7U w/tiphNTr19CS3wicuPknVqcxj8lZcPttASaNT8jcjaKu666Dyl04OG X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= To get rid of setjmp()/longjmp(), the teardown logic needs to be usable from __bail(). Introduce a new callback for it. Signed-off-by: Thomas Weißschuh --- tools/testing/selftests/kselftest_harness.h | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/tools/testing/selftests/kselftest_harness.h b/tools/testing/selftests/kselftest_harness.h index 2f067c0f47729d10f205774e58dfd85866bd4c96..efc855b93315892a822c9eefc8d7a3784793c754 100644 --- a/tools/testing/selftests/kselftest_harness.h +++ b/tools/testing/selftests/kselftest_harness.h @@ -445,14 +445,10 @@ } \ } \ if (child == 0) { \ - if (!fixture_name##_teardown_parent && \ - !__atomic_test_and_set(_metadata->no_teardown, __ATOMIC_RELAXED)) \ - fixture_name##_teardown(_metadata, self, variant->data); \ + _metadata->teardown_fn(false, _metadata, self, variant->data); \ _exit(0); \ } \ - if (fixture_name##_teardown_parent && \ - !__atomic_test_and_set(_metadata->no_teardown, __ATOMIC_RELAXED)) \ - fixture_name##_teardown(_metadata, self, variant->data); \ + _metadata->teardown_fn(true, _metadata, self, variant->data); \ munmap(_metadata->no_teardown, sizeof(*_metadata->no_teardown)); \ _metadata->no_teardown = NULL; \ if (self && fixture_name##_teardown_parent) \ @@ -466,6 +462,14 @@ } \ __test_check_assert(_metadata); \ } \ + static void wrapper_##fixture_name##_##test_name##_teardown( \ + bool in_parent, struct __test_metadata *_metadata, \ + void *self, const void *variant) \ + { \ + if (fixture_name##_teardown_parent == in_parent && \ + !__atomic_test_and_set(_metadata->no_teardown, __ATOMIC_RELAXED)) \ + fixture_name##_teardown(_metadata, self, variant); \ + } \ static struct __test_metadata *_##fixture_name##_##test_name##_object; \ static void __attribute__((constructor)) \ _register_##fixture_name##_##test_name(void) \ @@ -475,6 +479,7 @@ object->name = #test_name; \ object->fn = &wrapper_##fixture_name##_##test_name; \ object->fixture = &_##fixture_name##_fixture_object; \ + object->teardown_fn = &wrapper_##fixture_name##_##test_name##_teardown; \ object->termsig = signal; \ object->timeout = tmout; \ _##fixture_name##_##test_name##_object = object; \ @@ -918,6 +923,8 @@ struct __test_metadata { struct __fixture_variant_metadata *); pid_t pid; /* pid of test when being run */ struct __fixture_metadata *fixture; + void (*teardown_fn)(bool in_parent, struct __test_metadata *_metadata, + void *self, const void *variant); int termsig; int exit_code; int trigger; /* extra handler after the evaluation */ From patchwork Tue Mar 4 07:10:43 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Patchwork-Id: 14000037 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E97991FAC38; Tue, 4 Mar 2025 07:11:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072279; cv=none; b=a80zZ8HRkCjRJdKaljtV5DhqbeqVYd6lpJqZxtyCIQOprp2d49263CkABqPckpFvPWlkt+gY0UBQaVVdgm5zWcCnrRFazO87hR3gLNY2HKA7hCMOWJjZmFoTrUnTm9OqmxzyYhGzTNWOsh2bTHYSknkrCxcYPDNG5wEm/TGC07s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072279; c=relaxed/simple; bh=M1vd8Z9iYa877FOzbc1SvHGKXTYeUeiOx5fq6u0VCh8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Fhhx690+m2bpBOLbWR4J3SRYIIGZjSteuK+vHHIf4WPOQCqOeHZJD/LuS/uDZb5lVyW5AEEergt1X/mvPYqPruyuh1VVZ+Qk+wN7bNvOu+hxzhS+9iyVgfAP8fVxgaFClNyEb1jVSk8tnki1SW+Ir/VdmoPKDl4wQ+IR4OjHsI4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=4eW7ksq3; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=gloEuXll; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="4eW7ksq3"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="gloEuXll" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1741072275; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=LfPXv/LXz8n1+ZUFV+l2WWTtIn2W+XR413g/QfPa9lU=; b=4eW7ksq3R3vHxKCYSNGZybQTTiYpakb716N0ANgGs3/tk3Nu4iszX5jq9TzSgJ8ip4mHh7 kyQ+fNZOpy651MIvHhVvy446fYro7GKicFrISaU0NvoyF9yXcCYBW7AeP0QAQQmjkiQY4s wYPut4pHhUxpu1cIZoonysaXY8XJCgViaRn/9hBFgl+tiQxDpf1Gw6U1ObeJnaGQuiiIKI auBnGFXviHXshdBeyJrK4LZTjmRmNoe5qV+a0fI/L0LnP6dSbZxQ1yi9ZEHvcfVgmphLA8 QPwG8vhvV9WTQNRhAsBPvZpuklD36PeZdzu4I8MeocqftW/qtdNtsJnmmEjkhQ== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1741072275; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=LfPXv/LXz8n1+ZUFV+l2WWTtIn2W+XR413g/QfPa9lU=; b=gloEuXllwIHeUJkDMCbyJ8kIa2CNGUt2ZeMutcr/uR6bO2YJVmiQiuPc63NXkVzLyRuSng 1yv3CMvXuDQshgCw== Date: Tue, 04 Mar 2025 08:10:43 +0100 Subject: [PATCH 13/32] selftests: harness: Stop using setjmp()/longjmp() Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250304-nolibc-kselftest-harness-v1-13-adca7cd231e2@linutronix.de> References: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> In-Reply-To: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1741072266; l=5108; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=M1vd8Z9iYa877FOzbc1SvHGKXTYeUeiOx5fq6u0VCh8=; b=edHn/YmGaQAh2EiAaKEG9Cgjg2T8YzYmUEjXA04lvcy3faT4QxEF1+tQmyP2AXdHIFoA8v1kB kv26q43Rx1DC4tPITW9IqXAy3K1R6mr05qYli8SMHIPWdjXInOVOwr8 X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= Usage of longjmp() was added to ensure that teardown is always run in commit 63e6b2a42342 ("selftests/harness: Run TEARDOWN for ASSERT failures") However instead of calling longjmp() to the teardown handler it is easier to just call the teardown handler directly from __bail(). Any potential duplicate teardown invocations are harmless as the actual handler will only ever be executed once since commit fff37bd32c76 ("selftests/harness: Fix fixture teardown"). Additionally this removes a incompatibility with nolibc, which does not support setjmp()/longjmp(). Signed-off-by: Thomas Weißschuh --- tools/testing/selftests/kselftest_harness.h | 49 ++++++++++------------------- 1 file changed, 17 insertions(+), 32 deletions(-) diff --git a/tools/testing/selftests/kselftest_harness.h b/tools/testing/selftests/kselftest_harness.h index efc855b93315892a822c9eefc8d7a3784793c754..b7842dd5302375b75416830c22fac0775e0d12d1 100644 --- a/tools/testing/selftests/kselftest_harness.h +++ b/tools/testing/selftests/kselftest_harness.h @@ -70,7 +70,6 @@ #include #include #include -#include #endif #include "kselftest.h" @@ -182,9 +181,7 @@ struct __test_metadata *_metadata, \ struct __fixture_variant_metadata __attribute__((unused)) *variant) \ { \ - if (setjmp(_metadata->env) == 0) \ - test_name(_metadata, NULL, NULL); \ - __test_check_assert(_metadata); \ + test_name(_metadata, NULL, NULL); \ } \ static struct __test_metadata _##test_name##_object = \ { .name = #test_name, \ @@ -429,24 +426,20 @@ self = &self_private; \ } \ } \ - if (setjmp(_metadata->env) == 0) { \ - /* _metadata and potentially self are shared with all forks. */ \ - child = fork(); \ - if (child == 0) { \ - fixture_name##_setup(_metadata, self, variant->data); \ - /* Let setup failure terminate early. */ \ - if (_metadata->exit_code) \ - _exit(0); \ - *_metadata->no_teardown = false; \ - fixture_name##_##test_name(_metadata, self, variant->data); \ - } else if (child < 0 || child != waitpid(child, &status, 0)) { \ - ksft_print_msg("ERROR SPAWNING TEST GRANDCHILD\n"); \ - _metadata->exit_code = KSFT_FAIL; \ - } \ - } \ + /* _metadata and potentially self are shared with all forks. */ \ + child = fork(); \ if (child == 0) { \ + fixture_name##_setup(_metadata, self, variant->data); \ + /* Let setup failure terminate early. */ \ + if (_metadata->exit_code) \ + _exit(0); \ + *_metadata->no_teardown = false; \ + fixture_name##_##test_name(_metadata, self, variant->data); \ _metadata->teardown_fn(false, _metadata, self, variant->data); \ _exit(0); \ + } else if (child < 0 || child != waitpid(child, &status, 0)) { \ + ksft_print_msg("ERROR SPAWNING TEST GRANDCHILD\n"); \ + _metadata->exit_code = KSFT_FAIL; \ } \ _metadata->teardown_fn(true, _metadata, self, variant->data); \ munmap(_metadata->no_teardown, sizeof(*_metadata->no_teardown)); \ @@ -460,7 +453,6 @@ /* Forward signal to __wait_for_test(). */ \ kill(getpid(), WTERMSIG(status)); \ } \ - __test_check_assert(_metadata); \ } \ static void wrapper_##fixture_name##_##test_name##_teardown( \ bool in_parent, struct __test_metadata *_metadata, \ @@ -761,7 +753,7 @@ */ #define OPTIONAL_HANDLER(_assert) \ for (; _metadata->trigger; _metadata->trigger = \ - __bail(_assert, _metadata)) + __bail(_assert, _metadata, self, variant)) #define is_signed_type(var) (!!(((__typeof__(var))(-1)) < (__typeof__(var))1)) @@ -931,7 +923,6 @@ struct __test_metadata { int timeout; /* seconds to wait for test timeout */ bool aborted; /* stopped test due to failed ASSERT */ bool *no_teardown; /* fixture needs teardown */ - jmp_buf env; /* for exiting out of test early */ struct __test_results *results; struct __test_metadata *prev, *next; }; @@ -961,23 +952,18 @@ static inline void __register_xfail(struct __test_xfail *xf) __LIST_APPEND(xf->variant->xfails, xf); } -static inline int __bail(int for_realz, struct __test_metadata *t) +static inline int __bail(int for_realz, struct __test_metadata *t, void *self, const void *variant) { /* if this is ASSERT, return immediately. */ if (for_realz) { - t->aborted = true; - longjmp(t->env, 1); + if (t->teardown_fn) + t->teardown_fn(false, t, self, variant); + abort(); } /* otherwise, end the for loop and continue. */ return 0; } -static inline void __test_check_assert(struct __test_metadata *t) -{ - if (t->aborted) - abort(); -} - static void __wait_for_test(struct __test_metadata *t) { /* @@ -1210,7 +1196,6 @@ static void __run_test(struct __fixture_metadata *f, t->trigger = 0; t->aborted = false; t->no_teardown = NULL; - memset(t->env, 0, sizeof(t->env)); memset(t->results->reason, 0, sizeof(t->results->reason)); snprintf(test_name, sizeof(test_name), "%s%s%s.%s", From patchwork Tue Mar 4 07:10:44 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Patchwork-Id: 14000036 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1B9F81F666B; Tue, 4 Mar 2025 07:11:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072278; cv=none; b=r+Ag8D8Y4lPiNAM/4Ml9gSJspUnOg8q5r8NaFP1W7LwfgTurBqNC5Q9XUGexTVQiJvVrxGCXsg0xdTnHbfSSUJ44nrKRIegt25qTBTJkgvJIrTiROmOUsZgysqRN4qna1tTazj56T7iW6cOm8te8GHJ6sOsqQt1auKKvN8hHVIw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072278; c=relaxed/simple; bh=+dzAuZVK+VzJKxIjHbNQIUNM9fWsQFyNHmkWJWjVcG8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=smaSEZ3VMpY09cLDkttMfnDsKBlG6yrbc/rqRNE8VpFeEnrDS1BijblX3I6G1unCrLiHNts0xxoMjBfFnPGThOCtti4JkxslHLLdCblX7GXmCfYTsOdJycrTgFVYOgtF3f+tQRVBwPRLQp4II1mjm1fSZngEqJS4oP7bvCa5mAQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=flSvlKvF; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=vlDGanWH; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="flSvlKvF"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="vlDGanWH" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1741072275; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=qqHKi52hOjmf3plu80jTBfK3V8V/okONTq6fBQbc2Sc=; b=flSvlKvFCDm7hnFHiMu4uDvdSAjjhGxD+yotmL5HLUfLhrWVMWyu4Bda6+65JgAR7bFwDF snhCuOXHV5E1v79tYVtlCwEBk61m1D4Vqgk8Xj4kuwk9G3Keu+ahiUrOrRyFD7o8BFw0Sm ZUe/AtxJOHGzNtYFXL9DfdNDmfM+1/3N9lm0mPgqW9yewXSUNHv1/AaoNUyEJdB4dA7qMH +cTtoY0r140U58HQu/GJUJ85EL4bZTe8286GXs5LLSsJCl9HGHFy0FeybPkAfwRb1a/K1m ejqolMXl92v9gu/vOhmkxLS8whc3hP2oWnsX+XeKfZHP7y+Gn7UNVnBDFYPWJA== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1741072275; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=qqHKi52hOjmf3plu80jTBfK3V8V/okONTq6fBQbc2Sc=; b=vlDGanWHXrji+AIKQSqXn4N7u4Bm55pBr5QL3b1HQEi5bKD3whFxGwiyhiK6kCt0ZUbmkw S+02Vh3vwESd4GCg== Date: Tue, 04 Mar 2025 08:10:44 +0100 Subject: [PATCH 14/32] tools/nolibc: handle intmax_t/uintmax_t in printf Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250304-nolibc-kselftest-harness-v1-14-adca7cd231e2@linutronix.de> References: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> In-Reply-To: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1741072266; l=1935; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=+dzAuZVK+VzJKxIjHbNQIUNM9fWsQFyNHmkWJWjVcG8=; b=qSFsexj3sENxtU0/wrLTSksMAJZdHBZ0MExid4XCLn0FBLvM0vO+c3yjVGb0b9kuXnSxDdYPj Eoto50NPAbFDLezOwqKQFErYFANPMLq70lGqRYgbq5C6XudG8BEDY0A X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= In nolibc intmax_t and uintmax_t are always the same as (unsigned) long long/uint64_t as 128bit numbers are not supported. Even libcs that do support 128bit numbers often fix intmax_t to 64bit as it is used in ABIs and any change would break those. Signed-off-by: Thomas Weißschuh --- tools/include/nolibc/stdio.h | 2 ++ tools/testing/selftests/nolibc/nolibc-test.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h index a403351dbf6098ac8292b9589ed8a054b4c5669f..b32b8b794015276ab6242c2be18f860c095f90a3 100644 --- a/tools/include/nolibc/stdio.h +++ b/tools/include/nolibc/stdio.h @@ -286,6 +286,8 @@ int vfprintf(FILE *stream, const char *fmt, va_list args) if (c == 'l') { /* long format prefix, maintain the escape */ lpref++; + } else if (c == 'j') { + lpref = 2; } escape = 1; goto do_escape; diff --git a/tools/testing/selftests/nolibc/nolibc-test.c b/tools/testing/selftests/nolibc/nolibc-test.c index 79c3e6a845f31443c768de4c1f106e5ae014358b..3c0431e9917acf57e94dc3f7a8347762e6a5335a 100644 --- a/tools/testing/selftests/nolibc/nolibc-test.c +++ b/tools/testing/selftests/nolibc/nolibc-test.c @@ -1413,6 +1413,8 @@ static int run_vfprintf(int min, int max) CASE_TEST(char); EXPECT_VFPRINTF(1, "c", "%c", 'c'); break; CASE_TEST(hex); EXPECT_VFPRINTF(1, "f", "%x", 0xf); break; CASE_TEST(pointer); EXPECT_VFPRINTF(3, "0x1", "%p", (void *) 0x1); break; + CASE_TEST(uintmax_t); EXPECT_VFPRINTF(20, "18446744073709551615", "%ju", 0xffffffffffffffffULL); break; + CASE_TEST(intmax_t); EXPECT_VFPRINTF(20, "-9223372036854775807", "%jd", 0x8000000000000001LL); break; CASE_TEST(scanf); EXPECT_ZR(1, test_scanf()); break; case __LINE__: return ret; /* must be last */ From patchwork Tue Mar 4 07:10:45 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Patchwork-Id: 14000038 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A454D1FBC83; Tue, 4 Mar 2025 07:11:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072279; cv=none; b=GKP/a7zPs4Nurrr9zkao+eAvUEjW/eCp8bzbEfhPse66ohOOWzc9iu2Ryp1PlT4ZWd9nBZNGsswTF5g+WDkwyvtz2DTE4nT9lmlXDxWOIVVTs2VTN3N31ixYyZ0TepIkLjd01gYOElprLXhtMmBPKUUXqBB1lB/m9BmQ/VLmZ7o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072279; c=relaxed/simple; bh=YuawXTXPtFgUFMRpzW8n3wgQKSBAfb6YSFrI/BnPNHc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=o69cL/PXj09nfi0XxCBIx+0RCc7mkNirn4V1wMFbi+emHf0k77EH9ac1FcLICVHEqQN5fFwj35N6MCw82NPCSEBDQqpJklXRUWMlOVfcbbpkOyTgmKiR7SvO/cD9HTSDGCf/TWK5emUkSzhTcAYod0oZkkqYV+GaUaHIln84CuU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=BSw6nG/t; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=WKJoKaOU; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="BSw6nG/t"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="WKJoKaOU" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1741072276; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=2Lr5GtGgyp8TCjq2I9oOgDOri0+yBJFKfoAA8wjXqsc=; b=BSw6nG/t2hEAVB0T1979yyjOk6/zJFgPP0gVCgHO5Vkxbv37y+yQyBMDKmAIfuKymWiwEp DoG7TQYP0IxWS140EMbJ+zqSLqd9KfscdnUJozcCxtPeYD6yw0AHvZElAt3M4jE8Q7zFTW w9D1dGH9caXsOmvE9+mUgJZIAuELwj7DzFtgkhaIctF4/sZ53JFC2DBaI62EIyjqczCVEc h4PbkzwRBhgaU6AD8bUpGNWmg8FfPw9oy19FLejnXhXZ1mhcYzzXuwa0tLjqG0nlOwrzsj iJUKuuv0AxQmFphbJWGddZrNZlZ6jl9KJltQJ4ibMc6aIpLNVYPHhYncJWT26w== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1741072276; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=2Lr5GtGgyp8TCjq2I9oOgDOri0+yBJFKfoAA8wjXqsc=; b=WKJoKaOU3yYyk6PqYNVYBG2o2QZMyA/bMraKwyZ/wiTWrpXt1LMxpjh0VkDbJxHkNMRe/d 0WzOtlUWI3W10VBQ== Date: Tue, 04 Mar 2025 08:10:45 +0100 Subject: [PATCH 15/32] tools/nolibc: use intmax definitions from compiler Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250304-nolibc-kselftest-harness-v1-15-adca7cd231e2@linutronix.de> References: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> In-Reply-To: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1741072266; l=1163; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=YuawXTXPtFgUFMRpzW8n3wgQKSBAfb6YSFrI/BnPNHc=; b=H8bIr+Zr3iZreClJlFPNWV2UmBBOQitoUAOZwPJKhougt7LUsx7bCfhX1F92hx/hydBkEgdo+ hCgw+oUsCLdDNTESvJviVWUQIvRmoCUaN6wqOrUzu50YYWpCLcjz6Df X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= The printf format checking in the compiler uses the intmax types from the compiler, not libc. This can lead to compiler errors. Instead use the types already provided by the compiler. Example issue with clang 19 for arm64: nolibc-test.c:30:2: error: format specifies type 'uintmax_t' (aka 'unsigned long') but the argument has type 'uintmax_t' (aka 'unsigned long long') [-Werror,-Wformat] Signed-off-by: Thomas Weißschuh --- tools/include/nolibc/stdint.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/include/nolibc/stdint.h b/tools/include/nolibc/stdint.h index cd79ddd6170e05b19945e66151bcbcf840028d32..b052ad6303c38f09685b645268dad1fa8848370d 100644 --- a/tools/include/nolibc/stdint.h +++ b/tools/include/nolibc/stdint.h @@ -39,8 +39,8 @@ typedef size_t uint_fast32_t; typedef int64_t int_fast64_t; typedef uint64_t uint_fast64_t; -typedef int64_t intmax_t; -typedef uint64_t uintmax_t; +typedef __INTMAX_TYPE__ intmax_t; +typedef __UINTMAX_TYPE__ uintmax_t; /* limits of integral types */ From patchwork Tue Mar 4 07:10:46 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Patchwork-Id: 14000039 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 385221FA165; Tue, 4 Mar 2025 07:11:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072280; cv=none; b=YoiPh53wNLLkHVczszdhCT7z8wdBaWJ4HW2Ni7XArdv2R5wHldnN70ggq+AqV1kog/E2jVni3nm626ImQtz9fwqPY7HjdkAbSfIuaOAMmGLBKWpc3o4Js2doL7jjHBmh8gjYkArwAj0VDP1Ad7KMXt9HhfkNS3fTI9whhtVm2Zc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072280; c=relaxed/simple; bh=LVdk5mxObbMfu6i2vClWjXlgJzMhcCXBaIxt/EeFGhE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=PN8P1lwdAeMXFF5N2JWDB9zWrGoZhqmLXxYVw+dIek966pC0EvGtKd1b2HOCAZweSUE5OUqdIe8hyGbd7tJ4+p5HT7P+s5aWoqmUdJgeaFGurY2TMDg7zB00RrNhTQA/p0qVDLuT4UF0nsn41apODR/QkxtoANFAUvhZ6PeXkHE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=nynnH1XA; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=wr8uFBG0; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="nynnH1XA"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="wr8uFBG0" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1741072276; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=6isZ852xlL9hSmHb8o3TzBvQ/BwM4VpQuLYoBOElsAw=; b=nynnH1XA0yPK8wN9kJK7YT6ct/7YcwJlrFV09/K4wZ6ZCggkn6lI4GW9gCp9+afjeTepG8 ZvG0HzKyB17vJxl0rm0Sy++0mxMAcx4tQ3jbUHisqJWXtb/RyiAj0D48PfICFd4DyqUU8t CiADp3QfmuG7JfCqeO7UVHJC4KdJFfOYF9M3WVRflN7YnkYEnd7nEf7rdbr8Y0lXNKLl/O 2NuuPWeLf5fVegdPBldOANoqJddCtxhxZ1F+BakFi8xDFBsTxg/Xz3gv7gtH9pwA2e1/gA JAaV4mc5WJcb+fTFizzZ4moPR+2BOn5aLXENZRYekaG8ac2uLJSifImCP44MiA== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1741072276; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=6isZ852xlL9hSmHb8o3TzBvQ/BwM4VpQuLYoBOElsAw=; b=wr8uFBG0RDBozuLwdT1CTMTeMhrbsMl9x0dnNwgDfSAOIrZblipaY/fQJ+d0xrDFFQRcin Ha70caANi1NWD3Cg== Date: Tue, 04 Mar 2025 08:10:46 +0100 Subject: [PATCH 16/32] tools/nolibc: use pselect6_time64 if available Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250304-nolibc-kselftest-harness-v1-16-adca7cd231e2@linutronix.de> References: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> In-Reply-To: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1741072266; l=1128; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=LVdk5mxObbMfu6i2vClWjXlgJzMhcCXBaIxt/EeFGhE=; b=iDl3jMwM5Bt5cFyY2aBnoGWqUBpuNKq00hHPgN3L5Se3XAxWL949V2GVaLYaAJ3EX6h/sphK1 v0aCUbjM7a3DdxKxoWd9kWuQpSOHK9khgj8apMlevfDDVp5nHdgOISz X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= riscv32 does not have any of the older select systemcalls. Use pselect6_time64 instead. poll() is also used to implement sleep(). Signed-off-by: Thomas Weißschuh --- tools/include/nolibc/sys.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tools/include/nolibc/sys.h b/tools/include/nolibc/sys.h index 8f44c33b121300e80b41c971019484007d050b17..128a11441ba1f95a4331b63ff1cdfb9507d4fb33 100644 --- a/tools/include/nolibc/sys.h +++ b/tools/include/nolibc/sys.h @@ -1005,6 +1005,14 @@ int sys_select(int nfds, fd_set *rfds, fd_set *wfds, fd_set *efds, struct timeva t.tv_nsec = timeout->tv_usec * 1000; } return my_syscall6(__NR_pselect6, nfds, rfds, wfds, efds, timeout ? &t : NULL, NULL); +#elif defined(__NR_pselect6_time64) + struct __kernel_timespec t; + + if (timeout) { + t.tv_sec = timeout->tv_sec; + t.tv_nsec = timeout->tv_usec * 1000; + } + return my_syscall6(__NR_pselect6_time64, nfds, rfds, wfds, efds, timeout ? &t : NULL, NULL); #else return __nolibc_enosys(__func__, nfds, rfds, wfds, efds, timeout); #endif From patchwork Tue Mar 4 07:10:47 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Patchwork-Id: 14000040 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2EA011FBEB6; Tue, 4 Mar 2025 07:11:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072281; cv=none; b=PGbdI9g/Fgxc3RY3mc/rDZ+yKkQgp747PYK/YP8HSeMJIOQv13i7U27++HR7KLUPL0grVG1VRfCRlF5k7iLyvuyNirpKp+LgVfZiddNS2ofo629a/Jg+Z8mOEfwnut7Cz+kEprij32uvMjDlA0+2CroScMoBP5+qsj2V1+GwCW4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072281; c=relaxed/simple; bh=DvYCS+XpF/Y1UcDD/KTufBOFdovc2i4ISIZYldLZTCg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=h+jIxyp76c6Xay6fpo7AyuNOK3Mw0nLMtRR5h6ouFlhpepbqKt/ikh7yjVeSjxAAETDusTZfvvb4Z/HrdYIk5IegHHwsgMXqnriV5I2lz75alEXNTxwfz/GcNmJnGkoQvh3+IUHoyHk1WXyyRexkzrx9RqMLKDyVn6xmI4x7vbI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=ZRVOMELx; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=GhWr6W8J; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="ZRVOMELx"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="GhWr6W8J" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1741072277; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=esZ1MyoLFihoItJ0rYNhv5H/yjCSPS4o6Hrs74S1dRc=; b=ZRVOMELxnfjSFJMv9zvKQWnoMx0nNwnCtj4LOh5pgne+8qp2sPzFi28gYCf20gxxb7MC2P IYCk0sDmPJtJ9MmxYJgBILaYcy0lT6OeJFEt9zn1cwUTCgnkmOehNjbprvWUPkI65ONDo1 PULSdJ9ZvONnpDhnkNXUARS44kS8YldUqYMGvlrOWhNBBsSNC9LUlqnEqhu+2YzdQR96+n ZkTWHMznNU0DaTtqWW9LgJtJ3drXrJtSBOclIEyFdmcMBYd7dEmBdZ1XBHFP3hZxU3pGDx h8neNFCPD0Z3QZQKF0DoYjPy6SDwmA/cDRs3+FPevoSUS3y75/thmAy0D9hHwA== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1741072277; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=esZ1MyoLFihoItJ0rYNhv5H/yjCSPS4o6Hrs74S1dRc=; b=GhWr6W8JClAdvlU+EinOTh6dMFFv9Zq/tcNaPAUd4Q89r+rPPyymF9uYHq1nIgsX+xbnlU 66rG/o+5m/AVtYCg== Date: Tue, 04 Mar 2025 08:10:47 +0100 Subject: [PATCH 17/32] tools/nolibc: use ppoll_time64 if available Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250304-nolibc-kselftest-harness-v1-17-adca7cd231e2@linutronix.de> References: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> In-Reply-To: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1741072266; l=1050; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=DvYCS+XpF/Y1UcDD/KTufBOFdovc2i4ISIZYldLZTCg=; b=IGrmgnij8B7ekublFPUTECiIpi/SQXF7hmzuVi1HPJPcS6fyIsmuM/QZDIvk+Ax/KVhmmp6qu mPFakTMi2lzCztnBGP0gAyjkmYk0KOB+U6BTOzMteYjUTxs1ZqpH5YY X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= riscv32 does not have any of the older poll systemcalls. Use ppoll_time64 instead. Signed-off-by: Thomas Weißschuh --- tools/include/nolibc/sys.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tools/include/nolibc/sys.h b/tools/include/nolibc/sys.h index 128a11441ba1f95a4331b63ff1cdfb9507d4fb33..e28b26f9c3fe8aeb11dedce5106e52228b753e37 100644 --- a/tools/include/nolibc/sys.h +++ b/tools/include/nolibc/sys.h @@ -875,6 +875,14 @@ int sys_poll(struct pollfd *fds, int nfds, int timeout) t.tv_nsec = (timeout % 1000) * 1000000; } return my_syscall5(__NR_ppoll, fds, nfds, (timeout >= 0) ? &t : NULL, NULL, 0); +#elif defined(__NR_ppoll_time64) + struct __kernel_timespec t; + + if (timeout >= 0) { + t.tv_sec = timeout / 1000; + t.tv_nsec = (timeout % 1000) * 1000000; + } + return my_syscall5(__NR_ppoll_time64, fds, nfds, (timeout >= 0) ? &t : NULL, NULL, 0); #elif defined(__NR_poll) return my_syscall3(__NR_poll, fds, nfds, timeout); #else From patchwork Tue Mar 4 07:10:48 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Patchwork-Id: 14000041 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2ABD01FBEB3; Tue, 4 Mar 2025 07:11:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072281; cv=none; b=o4i55imxnHIQk+WmdVNC0OAkbJfkuqyZEcmAwMAB67O1ft87ZZ6k3nfhbXwqa9BDAMcLzGm6AfvSPQiO+Zo45HJE9fzLfs6wjfKw3yV094qsKVkVgzStqN8c4iQFJpYeso6NXXg9zXRRKT4iPduJhTa7VWLo8KJLk8A9FXY4gkI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072281; c=relaxed/simple; bh=dS++BGRUZ8SyBKb8wrBLyLZJ16G6+M6eh/EHuTJW21M=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=FILU2BDHELybl1os9jgN95VLzWUsb+rmrD/qziBN/dlJcir12P4mFLZ/ZTtDN+WGWpaqK3D9dcnX8Ph5gUt7vGQIWe1xoJB31wo/ZEM88wCZ+TDXK/HhlEhRMx4w8VwCY9+nKR64PIF+5IYEg1bN9WtUidwqRKXqHEsfi0kVoGU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=GHujb//n; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=ZV9fPS+c; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="GHujb//n"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="ZV9fPS+c" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1741072277; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Mhj9O/bQAXH7Ixrn4zEe0m9E2qHXDCFbSeY2nHcL8ss=; b=GHujb//nwN0ap7Dn8LqsWs/k5aG3Pna/SLGixCpvB1cC2kr35SwS9BbonempJcBAudfB+2 VUHI3gc3IDYIxtpgKwxvBG0ztCspy4WjgKxRSA5dTaBPZG/K7U7Unq2E2PC5nmoLRMBxbM WxCp8NaqRtWh8KabK4heu+2RbHFMlTT9b/JZ8NV8fAIl2W3rIjy8Cz66uTMKwnFnoQ1oSE ilGVxMuTH3I0WBnKs5aOzioINBJeGKioOCd6TCTVIe5rbo5xYweX/QgqZp8oIKTieZPSG1 rS33PGE2AqRYF3CA/SZXsJZE5paAzTmYHJeeRPlIDr0aejMAZo0ihbGlDkz1sQ== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1741072277; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Mhj9O/bQAXH7Ixrn4zEe0m9E2qHXDCFbSeY2nHcL8ss=; b=ZV9fPS+caiLrSUiTQmKmqN3euaLYtnBGyaP+lsuZjcpOGWB/5r0VXveMQ0gCsomLnaqnoB 6e6kxjHvLb/zbhCg== Date: Tue, 04 Mar 2025 08:10:48 +0100 Subject: [PATCH 18/32] tools/nolibc: add tolower() and toupper() Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250304-nolibc-kselftest-harness-v1-18-adca7cd231e2@linutronix.de> References: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> In-Reply-To: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1741072266; l=2172; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=dS++BGRUZ8SyBKb8wrBLyLZJ16G6+M6eh/EHuTJW21M=; b=A0T7CIeiH6BRy9KRrOkb20Zy9rX0C7YMyWvpDQ/nB5nDmMnUdbsKuO7aQUSV2PHgogr/UHYL6 1DaQ1G8VHyKB+UHAo8APcHMrkB+f7teAOj3jr2wNeUy+Ol3vuqM69Lu X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= The kselftest harness uses these functions. Signed-off-by: Thomas Weißschuh --- tools/include/nolibc/string.h | 17 +++++++++++++++++ tools/testing/selftests/nolibc/nolibc-test.c | 5 +++++ 2 files changed, 22 insertions(+) diff --git a/tools/include/nolibc/string.h b/tools/include/nolibc/string.h index ba84ab700e3001a7d105e1c9e40c01bf45db9d8c..f0d335f0e467ec870066811289dfd11e46e60a92 100644 --- a/tools/include/nolibc/string.h +++ b/tools/include/nolibc/string.h @@ -289,6 +289,23 @@ char *strrchr(const char *s, int c) return (char *)ret; } +static __attribute__((unused)) +int tolower(int c) +{ + if (c >= 'A' && c <= 'Z') + return c - 'A' + 'a'; + return c; +} + +static __attribute__((unused)) +int toupper(int c) +{ + if (c >= 'a' && c <= 'z') + return c - 'a' + 'A'; + return c; +} + + /* make sure to include all global symbols */ #include "nolibc.h" diff --git a/tools/testing/selftests/nolibc/nolibc-test.c b/tools/testing/selftests/nolibc/nolibc-test.c index 3c0431e9917acf57e94dc3f7a8347762e6a5335a..7eb7f3fb067553cccefefdaa2ccfc81af281336b 100644 --- a/tools/testing/selftests/nolibc/nolibc-test.c +++ b/tools/testing/selftests/nolibc/nolibc-test.c @@ -40,6 +40,7 @@ #include #include #include +#include #endif #endif @@ -1264,6 +1265,10 @@ int run_stdlib(int min, int max) CASE_TEST(strerror_EINVAL); EXPECT_STREQ(is_nolibc, strerror(EINVAL), "errno=22"); break; CASE_TEST(strerror_int_max); EXPECT_STREQ(is_nolibc, strerror(INT_MAX), "errno=2147483647"); break; CASE_TEST(strerror_int_min); EXPECT_STREQ(is_nolibc, strerror(INT_MIN), "errno=-2147483648"); break; + CASE_TEST(tolower); EXPECT_EQ(1, tolower('A'), 'a'); break; + CASE_TEST(tolower_noop); EXPECT_EQ(1, tolower('a'), 'a'); break; + CASE_TEST(toupper); EXPECT_EQ(1, toupper('a'), 'A'); break; + CASE_TEST(toupper_noop); EXPECT_EQ(1, toupper('A'), 'A'); break; case __LINE__: return ret; /* must be last */ From patchwork Tue Mar 4 07:10:49 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Patchwork-Id: 14000042 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 16CA01F8720; Tue, 4 Mar 2025 07:11:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072281; cv=none; b=VL8CWJjg3stPZ6sHtXU7knCNKw2xDZY2zkXFHC+Wh3JOqbSQzRQZYHaqM1aEb15fGXH8Sm0jdRZb8RPLus4j7gREnLHa/ZzavsTcypmAX7rfI3d4ORG9H0aaQRLZ57kmc0bm004QPBME2WBOJuDSuzCpL+fDh0vtBizLSyLYX/k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072281; c=relaxed/simple; bh=8+RqOFJGL5cz7AAujjiHnuVFywVFVqxIPT/M7fdAUws=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=QttZ7ce85jD+bt/400AdgP3qk3OAg4ZsRnVOiuxQZZn5pOkKxXHwcwqolLjAQWKx87zpOiHKPyIKQpBGNHtyzuNnEOmbXkHX/flZ0M+EZQ6bBbREPxV465EYgy/YWtU2y1rHgzIkFcCSKgPYfS24Y9tXizQ7ghCcX+hLBNI24DA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=teF/QjWn; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=gvxCq6jV; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="teF/QjWn"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="gvxCq6jV" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1741072278; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=IyP/IwmSyZFvgqCx5+4kPj6SHLUCA+u1ApL68En+wVE=; b=teF/QjWnpmKION2sMKPtOBx1vDMZn7yLvYMQgk40e0irg4my2OYQ0LOwOadlQhBUTrg5Yq Gur2Gi6cxHEMeRBcp0Zhzswo//7oWCE8sEhrt5j1v695KIN870xk98QdvrHSog3/PGS6+t 9E4BtCPzI0uhkGH5PBkn0R9oLIVofI1rj/fiFAXnYPoUH3GGApYcxn0CAlPAfJuGpLglMB UbHn9WNR9ddITQFaPedn9YQYsGXxyhQdrB4kqtnClFun76UjAAMaCe0J+MDHBLddHnqlEw NSA5919Qj2DMptiy1H0kK+jV6sFt4vJ9sOufAKFKhFwWMmLT/Qg7kgYCDBWVFQ== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1741072278; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=IyP/IwmSyZFvgqCx5+4kPj6SHLUCA+u1ApL68En+wVE=; b=gvxCq6jVOG09+zQe9DeJl3N35AE8z2Zod7PckmRqkDIP3pmXOVD8g0Kl0+n34+eVXyke/p Mv8nLowSvh7KPVAQ== Date: Tue, 04 Mar 2025 08:10:49 +0100 Subject: [PATCH 19/32] tools/nolibc: add _exit() Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250304-nolibc-kselftest-harness-v1-19-adca7cd231e2@linutronix.de> References: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> In-Reply-To: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1741072266; l=876; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=8+RqOFJGL5cz7AAujjiHnuVFywVFVqxIPT/M7fdAUws=; b=Y6dXJi22suTWXyRYf7I53yqhch7Y+vtATlLO6WZ2EsFoIkVxLPYAsyks1WDol3D0HuYHB6REc M5lEVA39COhBgjKuB+ZWLontiehoJW9GXTHHghFqY+ibngjlhdd9+Ac X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= _exit() is the faster variant of exit(), skipping all cleanup actions. As nolibc does not perform any cleanup anyways, the implementation is trivial. Signed-off-by: Thomas Weißschuh --- tools/include/nolibc/sys.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tools/include/nolibc/sys.h b/tools/include/nolibc/sys.h index e28b26f9c3fe8aeb11dedce5106e52228b753e37..d98515120785223aaf74d1848a0ad68e308d6893 100644 --- a/tools/include/nolibc/sys.h +++ b/tools/include/nolibc/sys.h @@ -302,11 +302,17 @@ void sys_exit(int status) } static __attribute__((noreturn,unused)) -void exit(int status) +void _exit(int status) { sys_exit(status); } +static __attribute__((noreturn,unused)) +void exit(int status) +{ + _exit(status); +} + /* * pid_t fork(void); From patchwork Tue Mar 4 07:10:50 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Patchwork-Id: 14000043 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6153C1FC7E6; Tue, 4 Mar 2025 07:11:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072282; cv=none; b=sw5f9wlyk/ibnUBhgRsTCuPx8AG+EPw09Uvt44OUYHnIdFZn2tygF1VIHonNQNWP9P3NJctN+VIIszKAdXhEVy7flqnYPZliO4ywfvcGwSBSS3sPweKVwX5ZWNu8lTVsHJjnhoB2ZOIRhb6f907ZZmVHzij8G9rPkdHdBg9HojM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072282; c=relaxed/simple; bh=KMEkGJFuUv2orA59LI8OnvYt5A2QmizIsPu2s2FpUW0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=J5FpFP6xjeLCIQoyIhvuwpwmf572qHIkUtG3X6vBpe1PAD+cSW0lv12I+SED8uJNyGHHVVJZCmdWyXUYkKwVnFa/Yyk6bZ+RqqPOcsrHyvwdIPqudfD8SkjkB8oFHiieJTdzD7BoluNWfumcxxAqq1bkHHVtz8SlEN6VBS3/Ibo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=mB1PwVjc; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=Tct/9tTr; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="mB1PwVjc"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="Tct/9tTr" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1741072278; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=cX2Trr3UgHxoCMPiHBlkygN9ZyBF4Oszhks+5ytjR90=; b=mB1PwVjc4rj6ww+/JYqMC+pJfJ+TglHmVBjKLVmLkQAjIKu5dYrCsS8qOEz5aROL9Vidot WjxmCo/g1xXzpeF/3Yr+j1SRKj/pM+73Tp6l3wMxThJuyTBK4XNkQnl4dJWjBHL5Kt5chs 4mbbMMkeid/yuLL1Lffggj8WKxToG1gN/L0HAuEuI4iP13EBmok+FBiOYnJ7vCOTVtvq6f fxzowNHSrxkDqMREFDTNvwrPNpOWtnPCfDmUmYq6r6YkilzVHNtNoKkgEtPFrJmcC3lWdd V2tmh96A+QjKmwuj08YyYGqk72waOSx3IuJ9gy8hygWjJs7laoJEvjUEucjaCQ== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1741072278; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=cX2Trr3UgHxoCMPiHBlkygN9ZyBF4Oszhks+5ytjR90=; b=Tct/9tTrqMqll3Qw5kyCl6Z1sWGBG5Kh5Ekw11mqe5ZIomW+N3XLxWAbY/V5P5L4FNcUiO Kh/FE+teFaD8icDQ== Date: Tue, 04 Mar 2025 08:10:50 +0100 Subject: [PATCH 20/32] tools/nolibc: add setpgrp() Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250304-nolibc-kselftest-harness-v1-20-adca7cd231e2@linutronix.de> References: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> In-Reply-To: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1741072266; l=736; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=KMEkGJFuUv2orA59LI8OnvYt5A2QmizIsPu2s2FpUW0=; b=DcqVjLqXv+yhhbC7tJKunU4CNfcNSRh2OXY9vAANT7aBedi/N+mmn6T/u+LPTB00MQCcm1bG5 6nMx80bKxjVAe8QTrQMKpusGbjprDIHWQhI1h19xmgjamNG0F2tCN14 X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= setpgrp() is defined to be identical to setpgid(0, 0). Signed-off-by: Thomas Weißschuh --- tools/include/nolibc/sys.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tools/include/nolibc/sys.h b/tools/include/nolibc/sys.h index d98515120785223aaf74d1848a0ad68e308d6893..43b1bfa7a582ea926a062ff17fcf3e1b79be187d 100644 --- a/tools/include/nolibc/sys.h +++ b/tools/include/nolibc/sys.h @@ -1055,6 +1055,16 @@ int setpgid(pid_t pid, pid_t pgid) return __sysret(sys_setpgid(pid, pgid)); } +/* + * pid_t setpgrp(void) + */ + +static __attribute__((unused)) +pid_t setpgrp(void) +{ + return setpgid(0, 0); +} + /* * pid_t setsid(void); From patchwork Tue Mar 4 07:10:51 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Patchwork-Id: 14000044 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 32DAA1FCD03; Tue, 4 Mar 2025 07:11:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072283; cv=none; b=vCOsfaa0IN3bo7V4dZnR7MWDXK4Au3F+jQ3Rj6hc+nCG2SB5saCbglGj8Yj9G66H1HIG/e92QQN5vTsj0bXeWtAl0Ucktt78Pu1HBmh1eL/NfhaA45JONGRyWSGKFd1kvDOfhtAKQ0Gc9Hfu3ZMh6X/AIjrqjvaBl3R524WV2/o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072283; c=relaxed/simple; bh=9j4nBghxOLCnwD0YNy8UxsaC9WSegGRZTLagG8pb+Gg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cloQySc3gWGOwcz5f6mRmfX/SqbUcSyKUovCydM95hJTCK+qddqsZUgoa69ui1b0Tz6OurOP0dLTQWBHSnNcJx1j8Bck0IOE1zZzH2gyZVkQd0EgaVf/gLiWIt+pzAFi1TAwVzH1B6RV/K0w28a1y7Yb0pqU0ycYHNFP0qViW78= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=Awgo2k5E; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=kp4Z/+KY; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="Awgo2k5E"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="kp4Z/+KY" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1741072279; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=V44ch+lkWYAy1zwm35rG7H8jl4JyVX7DdzhpML16BWQ=; b=Awgo2k5ErX1VbC/Ao8sSvgHbl47tdQS25BW9vDpDWa19nhpvMYrTCfjpcs/TOEEy2n4m+i RmsnLo3TMrB9XpPMUkoGrWbQa2O5AZsSIL9t54Z48BCsrKx1ui/Oyrgd/O/aAWFcfae2ra 78OaVgawuKE83Yu8HwnN6QHc5prFCnnhmlaO/x0MHegTQ+pVLz0GiQiGFJmo7LjozZ4wgy LV7PI3OSAnJkRFt0cThg66L2duAi2f6gkB+NxwBc1RtDlgeizD6BHwVY8t0aQskGBUoDMe r9xoEoh5BwL8RHioAn5YcktJHU+72UV4c6fYq99zDSfQ2rOJw1JQSTRR2wb6CQ== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1741072279; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=V44ch+lkWYAy1zwm35rG7H8jl4JyVX7DdzhpML16BWQ=; b=kp4Z/+KY0IZhfgW6Z9C9rrGwj71YQfQM/36vxtjJEHhyrrq1Qc3/ZNv1UEe69ggj1AdgPc P9MnIvZKrQ1rvPCw== Date: Tue, 04 Mar 2025 08:10:51 +0100 Subject: [PATCH 21/32] tools/nolibc: implement waitpid() in terms of waitid() Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250304-nolibc-kselftest-harness-v1-21-adca7cd231e2@linutronix.de> References: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> In-Reply-To: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1741072266; l=2627; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=9j4nBghxOLCnwD0YNy8UxsaC9WSegGRZTLagG8pb+Gg=; b=VPWIP81JbzHWjHvAhALs2QoIyXghLQ2ofYj+p6WdTjPuUsvccMJHt0i7yCN/4dsEtVyrbal0B PVoQmLjwBMOCP85pk9xt2zcXm63+f1KZqlw4CiUQAdAc3ccN6ILCQTS X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= The old wait4() syscall used by waitpid() before is not available everywhere. Switch to the waitid() syscall which is the new replacement. Signed-off-by: Thomas Weißschuh --- tools/include/nolibc/sys.h | 68 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 56 insertions(+), 12 deletions(-) diff --git a/tools/include/nolibc/sys.h b/tools/include/nolibc/sys.h index 43b1bfa7a582ea926a062ff17fcf3e1b79be187d..8c929ddb62eae81d4e0d36dec72bc1718d9a1082 100644 --- a/tools/include/nolibc/sys.h +++ b/tools/include/nolibc/sys.h @@ -1249,6 +1249,7 @@ int unlink(const char *path) * pid_t wait(int *status); * pid_t wait4(pid_t pid, int *status, int options, struct rusage *rusage); * pid_t waitpid(pid_t pid, int *status, int options); + * int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options); */ static __attribute__((unused)) @@ -1273,18 +1274,6 @@ pid_t wait4(pid_t pid, int *status, int options, struct rusage *rusage) return __sysret(sys_wait4(pid, status, options, rusage)); } - -static __attribute__((unused)) -pid_t waitpid(pid_t pid, int *status, int options) -{ - return __sysret(sys_wait4(pid, status, options, NULL)); -} - - -/* - * int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options); - */ - static __attribute__((unused)) int sys_waitid(int which, pid_t pid, siginfo_t *infop, int options, struct rusage *rusage) { @@ -1298,6 +1287,61 @@ int waitid(int which, pid_t pid, siginfo_t *infop, int options) } +static __attribute__((unused)) +pid_t waitpid(pid_t pid, int *status, int options) +{ + int idtype, ret; + siginfo_t info; + pid_t id; + + if (pid < -1) { + idtype = P_PGID; + id = -pid; + } else if (pid == -1) { + idtype = P_ALL; + id = 0; + } else if (pid == 0) { + idtype = P_PGID; + id = 0; + } else { + idtype = P_PID; + id = pid; + } + + options |= WEXITED; + + ret = waitid(idtype, id, &info, options); + if (ret) + return ret; + + switch (info.si_code) { + case 0: + *status = 0; + break; + case CLD_EXITED: + *status = (info.si_status & 0xff) << 8; + break; + case CLD_KILLED: + *status = info.si_status & 0x7f; + break; + case CLD_DUMPED: + *status = (info.si_status & 0x7f) | 0x80; + break; + case CLD_STOPPED: + case CLD_TRAPPED: + *status = (info.si_status << 8) + 0x7f; + break; + case CLD_CONTINUED: + *status = 0xffff; + break; + default: + return -1; + } + + return info.si_pid; +} + + /* * ssize_t write(int fd, const void *buf, size_t count); */ From patchwork Tue Mar 4 07:10:52 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Patchwork-Id: 14000045 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 46B351FCD0F; Tue, 4 Mar 2025 07:11:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072283; cv=none; b=BdDO3bUE0XIkaKHCFuIku0RqjhR/CkvhWMYdK0IeD5ns4g6N2hrQBy6IR+hT0EwhVHcI3e9GWiFFxYvugVFpqRMkPUs4o/ikGY1HABOMwsjJAnuE4Oo1o7iJYG2KiaEHIwDJlD0v1DXIlBmmQ3jMYYwqxB6c4kQ7H5/Gr4loEN8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072283; c=relaxed/simple; bh=/FGAVdR/lBFiJpF01Z1OIzO0G6YTio2depaq5mGhDOI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=DrqxZDm576aQC0ol2crgwWcsP9EijKHCRjF/uQw0tvkYshp1YEF0bdL0pnNeFa6UH476JrE1qHAQudVVDB78umOXew63oNTxcQM6XnkvSv1agV0a8vPt9p1KjXJ3uiA7CmmCNPWJ8P771d+r0sbOuyglFf7PcXt2UlsrjMbSEFk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=vol7zITN; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=eBcr30tn; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="vol7zITN"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="eBcr30tn" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1741072279; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=9RywpLmAaEKXr7DP5hCgWvvj/+hzmJ5kykcM95l+s4g=; b=vol7zITN37V8f6IdnPjad6aldBSLIBCoBI82ktG0Rc3OPFkRLey9CsR+iQO5cN5WLq4bwh IdoPx4YYQFx7fpeVceeiYDWbIYbnLOucaRUbrXDZtT1CXGXI9kYIriOyxGb1yzHekws8V6 ajJFZp8Mpy0JI4FxXvVX4jGyz/XRPG+ZL+qi8AbVEkEU+hp60AS9TlIsZNAGpOKa0eyNV/ kGO+XrnIDMTmYBw5MbHQqEzvfNq/GWCfpYOJ/Y7e+uDhGYcMf/yKnFlehW9IOPnuqyYotl eaLsZcdprajhaJcob7YY7G0318RrBspznlZScKfbpI+0XrNMD3MbpOU6XGx9yQ== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1741072279; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=9RywpLmAaEKXr7DP5hCgWvvj/+hzmJ5kykcM95l+s4g=; b=eBcr30tneWoUPD8IpXpZYC1+eehjN/VEfJvpCZsQRQFyO0FEuqqItPxpQeNlqAMmG0GFKV Iv+HsJ3QjBaOmEAg== Date: Tue, 04 Mar 2025 08:10:52 +0100 Subject: [PATCH 22/32] Revert "selftests/nolibc: use waitid() over waitpid()" Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250304-nolibc-kselftest-harness-v1-22-adca7cd231e2@linutronix.de> References: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> In-Reply-To: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1741072266; l=1615; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=/FGAVdR/lBFiJpF01Z1OIzO0G6YTio2depaq5mGhDOI=; b=tLCWq54LSTVWzYI8n0Krhq7HmA9ff3fBQkk6K+kHA+7RCN6B72q6ZCQw3uL1yf+s/bnNQvOX2 6XkqVhY/0JTBQ8KCqF5JnXkohN813+XWnOo9d2cv4ndAzbXitNqJ/Oz X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= nolibc's waitpid() now uses the waitid() syscall internally. This removes the original reasoning for the reverted commit as waitpid() is now available on all platforms and has an easier interface. Switch back to waitpid(). This reverts commit a0bc8947ac731ff95a56e0c1737e69e8c56d5b78. Signed-off-by: Thomas Weißschuh --- tools/testing/selftests/nolibc/nolibc-test.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/tools/testing/selftests/nolibc/nolibc-test.c b/tools/testing/selftests/nolibc/nolibc-test.c index 7eb7f3fb067553cccefefdaa2ccfc81af281336b..6fa659429cfc38c9d42f36f80ab6c529890d9ad7 100644 --- a/tools/testing/selftests/nolibc/nolibc-test.c +++ b/tools/testing/selftests/nolibc/nolibc-test.c @@ -1445,8 +1445,7 @@ static int run_protection(int min __attribute__((unused)), int max __attribute__((unused))) { pid_t pid; - int llen = 0, ret; - siginfo_t siginfo = {}; + int llen = 0, status; struct rlimit rlimit = { 0, 0 }; llen += printf("0 -fstackprotector "); @@ -1484,11 +1483,10 @@ static int run_protection(int min __attribute__((unused)), return 1; default: - ret = waitid(P_PID, pid, &siginfo, WEXITED); + pid = waitpid(pid, &status, 0); - if (ret != 0 || siginfo.si_signo != SIGCHLD || - siginfo.si_code != CLD_KILLED || siginfo.si_status != SIGABRT) { - llen += printf("waitid()"); + if (pid == -1 || !WIFSIGNALED(status) || WTERMSIG(status) != SIGABRT) { + llen += printf("waitpid()"); result(llen, FAIL); return 1; } From patchwork Tue Mar 4 07:10:53 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Patchwork-Id: 14000046 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BF1EB1FCF63; Tue, 4 Mar 2025 07:11:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072284; cv=none; b=dzithRWTWBoxTwVQ3cCTjgUjrnXCoeVwx6acCkoJ2D4FFUzG2P42q3CrrnQIGzs93dnoMGv63aMNsEWbbmIz8KQqefIIutJXyyUjs4QnjKFn1vYtwpnbYx7+6z7bDqGJGDxShpRsf0R2kTRVwrBb0Hz2BX154pmXWNk8InuTpf8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072284; c=relaxed/simple; bh=45SY/2K5N8Gfwr9j3PMqdGQfwtsZ0Rt1wns1znRxmck=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=NBiZr/fxMV/p26bYlAa0KjClXAipqmQZ19WTpZ5Hh3uvOVF0ne7z80Wbr4RXq2cq8v6FchGqIV9SAY1taIbZ8kpOoRBvEDnsJ6dOGTOhMPNKqU6QUj6OTkb/zMavBVq3JGa0mOw5VSEGOtfMVgsbPZ1X5T4EU8QahDY+iZc3HGk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=WG0QfnVJ; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=r0kiB+Pi; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="WG0QfnVJ"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="r0kiB+Pi" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1741072280; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=jEZfqRWMaENs1Hn1R1Aw9ErUtNc8GnsReE3QTJpFuzg=; b=WG0QfnVJTOwNUrBeC8DPzSVhmiOhVKgD3jHId4zHHfg5OF86yz+Hg1cgQOc1b2cVBRp/Gf 4h9JTxg0WD4BV0t61WhwMTVXLhQ4ccJ68o3Mv45X4hvQ+s884ignBl+/KGWbwIEUcEqrbs RnOB/Is6KCW2aJ0D6U9aseSitb0+u0LCfMvAICARVejUnkxP3xes0J8VTd4mbHlzc60qsX E/4tvO4BYPzx/QYuSBk9ZzRI6DvzGKZwzVHiyUTlAjnUENuJ0l94vGaM+Zf57l6ix3vW5L gPjBtZ13PgYcN45qVAi6zBhYfCMDMAS885cK6JQF+1q0ZYw+0fqgMOkGtIQCEg== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1741072280; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=jEZfqRWMaENs1Hn1R1Aw9ErUtNc8GnsReE3QTJpFuzg=; b=r0kiB+PiXZkSyrOTZIc2X2eYwBRRDsFSfjSWUsSkccP7nB171ALYMzseWgxfcxJuZowhMw J71Iw+6h+BQg4GCA== Date: Tue, 04 Mar 2025 08:10:53 +0100 Subject: [PATCH 23/32] tools/nolibc: add dprintf() and vdprintf() Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250304-nolibc-kselftest-harness-v1-23-adca7cd231e2@linutronix.de> References: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> In-Reply-To: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1741072266; l=1353; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=45SY/2K5N8Gfwr9j3PMqdGQfwtsZ0Rt1wns1znRxmck=; b=DfzuFkav/AIjNzpP16lMSeJByBD9Ni0Qn16vW9Bucf5KJSMrsRTefOVdoeuRb7u5/ksftYqRv doNg63jHH2QAySVYSvzUpEPY6AN+4emGOHxMXDwf9IaAf+zoCTpEFFt X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= dprintf() and vdprintf() are printf() variants printing directly into a filedescriptor. As FILE in nolibc is based directly on filedescriptors, the implementation is trivial. Signed-off-by: Thomas Weißschuh --- tools/include/nolibc/stdio.h | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h index b32b8b794015276ab6242c2be18f860c095f90a3..262d0da4da9062e0c83b55661b2509f36548cf88 100644 --- a/tools/include/nolibc/stdio.h +++ b/tools/include/nolibc/stdio.h @@ -351,6 +351,30 @@ int printf(const char *fmt, ...) return ret; } +static __attribute__((unused, format(printf, 2, 0))) +int vdprintf(int fd, const char *fmt, va_list args) +{ + FILE *stream; + + stream = fdopen(fd, NULL); + if (!stream) + return -1; + /* Technically 'stream' is leaked, but as it's only a wrapper around 'fd' that is fine */ + return vfprintf(stream, fmt, args); +} + +static __attribute__((unused, format(printf, 2, 3))) +int dprintf(int fd, const char *fmt, ...) +{ + va_list args; + int ret; + + va_start(args, fmt); + ret = vdprintf(fd, fmt, args); + va_end(args); + return ret; +} + static __attribute__((unused)) int vsscanf(const char *str, const char *format, va_list args) { From patchwork Tue Mar 4 07:10:54 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Patchwork-Id: 14000048 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E5E0E1F75A6; Tue, 4 Mar 2025 07:11:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072285; cv=none; b=CbJxJGJfPxPdiQ/N6rHB2AI2TeAN4aVMKSWRqNMOlMoIqMAP4A+9CM49eNXSVvukXJCIRJf4UUHdrI6lRahmis/aHl7z3EkRSTtDqsdtjXZIQrT+FHQkoZHdz4NdjWJXFvfQDClNbIobdozxnYvumeWs2IK0wd60sqzSyAv2Hog= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072285; c=relaxed/simple; bh=UNGJO7yXadKLjRIIE8kbtzb+KQjgQekHUq7TFuDp7Ts=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=NmqKbdsOO4hALuMz0ApAZZA+qz6H32k2pA/nPNzDBZ8l4LEu5h/vdKhY+SziH22ZHd7mUdsS+UwNjc5s9fQYPpr6XBo1EQAgvIADXtjDts46J9n1qO6ec9OYz8HG79gQDVP5gg3R3EVgOZ4VZMZJPtZ5N6xgPt/uaQJM2BGf060= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=O6Zm1zY6; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=z4LrsfWU; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="O6Zm1zY6"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="z4LrsfWU" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1741072281; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=tHu1593CA9HkSs2rxw7I2z7kblLRcFAvsElqTkbmuQ0=; b=O6Zm1zY6srVgI9uiwBUsVWW2O5OspkS5YNu2rn1eCj7VEXOyrF7XKMuLaRktlAqqN1kibP VC8pWeqNMjn3ePtPupytkOhl+B00rz7k3hP8qUY4k6GE0d4xjOX8mdER98wniXLAX9c/va ALfTjjKtd5hKUJjrFJhBrBh5niS+U/tQb0Jy22yrB+x78hIpiJnUb/lxBe/VyKybAXUrpP 0AsqKHYou+2HrbyrFz6Du/ma9LvCnUKCdftdew5zxVnSQqHlpKUEkVfhiEIu/1FJWZIdrf X+kuN6PebF5H3Dz1mFpubBv6NCDJWoCpsPHsSZrlM2CHu9HXE0NMrJoKfUNauQ== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1741072281; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=tHu1593CA9HkSs2rxw7I2z7kblLRcFAvsElqTkbmuQ0=; b=z4LrsfWUdxw2cX3cEVSpPpyqy1BxzI8kxzyf9grr0LJISPamcdTy2RWBdkVWiAE1c+RhJT XOoDKTsmNa/TkyBw== Date: Tue, 04 Mar 2025 08:10:54 +0100 Subject: [PATCH 24/32] tools/nolibc: add getopt() Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250304-nolibc-kselftest-harness-v1-24-adca7cd231e2@linutronix.de> References: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> In-Reply-To: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1741072266; l=3954; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=UNGJO7yXadKLjRIIE8kbtzb+KQjgQekHUq7TFuDp7Ts=; b=FzvluaKa0nqgq0yQ+iTBN1Dsef4WpOfaYik+/RV931BSG/nXeIsK7gVn84B6EoiMOIQeBBTZ+ mIMkzSSP3HCAb8DL3wgPNNasu+vSV8+0N3aRU6zHTJSwX/WVtYkep5S X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= Introduce a getopt() implementation based on the one from musl. The only deviations are adaption to the kernel coding style and nolibc infrastructure and removal of multi-byte support. Signed-off-by: Thomas Weißschuh --- tools/include/nolibc/Makefile | 1 + tools/include/nolibc/getopt.h | 105 ++++++++++++++++++++++++++++++++++++++++++ tools/include/nolibc/nolibc.h | 1 + 3 files changed, 107 insertions(+) diff --git a/tools/include/nolibc/Makefile b/tools/include/nolibc/Makefile index dceec0e1a135119108d6f4dcb3d2ec57c002ffd3..821a716094549ff9ee2fbe006fb7b3066e5e418d 100644 --- a/tools/include/nolibc/Makefile +++ b/tools/include/nolibc/Makefile @@ -31,6 +31,7 @@ all_files := \ ctype.h \ dirent.h \ errno.h \ + getopt.h \ nolibc.h \ signal.h \ stackprotector.h \ diff --git a/tools/include/nolibc/getopt.h b/tools/include/nolibc/getopt.h new file mode 100644 index 0000000000000000000000000000000000000000..35aee582681b79e21bce8ddbf634ae9dfdef8f1d --- /dev/null +++ b/tools/include/nolibc/getopt.h @@ -0,0 +1,105 @@ +/* SPDX-License-Identifier: LGPL-2.1 OR MIT */ +/* + * getopt function definitions for NOLIBC, adapted from musl libc + * Copyright (C) 2005-2020 Rich Felker, et al. + * Copyright (C) 2025 Thomas Weißschuh + */ + +#ifndef _NOLIBC_GETOPT_H +#define _NOLIBC_GETOPT_H + +struct FILE; +static struct FILE *const stderr; +static int fprintf(struct FILE *stream, const char *fmt, ...); + +__attribute__((weak,unused,section(".data.nolibc_getopt"))) +char *optarg; +__attribute__((weak,unused,section(".data.nolibc_getopt"))) +int optind = 1; +__attribute__((weak,unused,section(".data.nolibc_getopt"))) +int opterr = 1; +__attribute__((weak,unused,section(".data.nolibc_getopt"))) +int optopt; +__attribute__((weak,unused,section(".data.nolibc_getopt"))) +int __optpos; + +static __inline__ +int getopt(int argc, char * const argv[], const char *optstring) +{ + int i; + char c, d; + char *optchar; + + if (!optind) { + __optpos = 0; + optind = 1; + } + + if (optind >= argc || !argv[optind]) + return -1; + + if (argv[optind][0] != '-') { + if (optstring[0] == '-') { + optarg = argv[optind++]; + return 1; + } + return -1; + } + + if (!argv[optind][1]) + return -1; + + if (argv[optind][1] == '-' && !argv[optind][2]) + return optind++, -1; + + if (!__optpos) + __optpos++; + c = argv[optind][__optpos]; + optchar = argv[optind] + __optpos; + __optpos++; + + if (!argv[optind][__optpos]) { + optind++; + __optpos = 0; + } + + if (optstring[0] == '-' || optstring[0] == '+') + optstring++; + + i = 0; + d = 0; + do { + d = optstring[i++]; + } while (d && d != c); + + if (d != c || c == ':') { + optopt = c; + if (optstring[0] != ':' && opterr) + fprintf(stderr, "%s: unrecognized option: %c\n", argv[0], *optchar); + return '?'; + } + if (optstring[i] == ':') { + optarg = 0; + if (optstring[i + 1] != ':' || __optpos) { + optarg = argv[optind++]; + if (__optpos) + optarg += __optpos; + __optpos = 0; + } + if (optind > argc) { + optopt = c; + if (optstring[0] == ':') + return ':'; + if (opterr) + fprintf(stderr, "%s: option requires argument: %c\n", + argv[0], *optchar); + return '?'; + } + } + return c; +} + +/* make sure to include all global symbols */ +#include "nolibc.h" + +#endif /* _NOLIBC_GETOPT_H */ diff --git a/tools/include/nolibc/nolibc.h b/tools/include/nolibc/nolibc.h index 05d92afedb7258f0e3c311bf6f12be68b25d6e9a..d4043051072928f43d4d73c0e509430087c66e94 100644 --- a/tools/include/nolibc/nolibc.h +++ b/tools/include/nolibc/nolibc.h @@ -106,6 +106,7 @@ #include "time.h" #include "stackprotector.h" #include "dirent.h" +#include "getopt.h" /* Used by programs to avoid std includes */ #define NOLIBC From patchwork Tue Mar 4 07:10:55 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Patchwork-Id: 14000047 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6B0BE1FDA78; Tue, 4 Mar 2025 07:11:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072285; cv=none; b=C8rC7xDfssmVM0zWlnzGemO/iuUamY1IZTrBZZWo9XLBMoT/qeSw+A0Jh6u3GJtRwcblAP3IgXcSU1JiyB3mvvFFXaIZXjrjPs48gmW3eTyJsLfYAOgmo0bSSmzVdJ6SFlZY8RzTk1M3+J6ZOSSy7Zl2DZac1+xE9jdWXrypyjo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072285; c=relaxed/simple; bh=VAitc4TpEayA62P7PzIris09IKbI6DnHkqqiFFANP2o=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=FrRnqFZ8PceqrjOcL8B/NOnMMSFitA8FGvs17pfOCrosktZTcBpDJHoBZvcvl81zpBy48MtgHzfy9fmfgQchHbpdLhJhXl2Y8G4qzBEEapVS+X7tiqTbuQKGcsh5du3FEVzpEQnHtNSPCWr+uJMJ9B6B3jVOxuTeIY8hRqz4Q1M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=JOZiM7on; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=E4Ln4FLT; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="JOZiM7on"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="E4Ln4FLT" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1741072281; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=lP373sJm7fLQ44Jh21r4D7xLZ1+CcxGOeWWhA71PxgQ=; b=JOZiM7onQBRPaC143jCUAdy5pXbodMe7NGoalCg2nXC7p2tUI1KY2Cu+txCh76zJi96f2b 66iIRY5918U5D9gXgIUASXxGZ6MnM6rlndc6+N7HeZ6R0PCL/irWPnrAyZsSQ/mT3aaobD 9V4rxRAIjniCmvdViXxESCUkUWhUU6KqOSSEgGOHK4RmbbEwDz7nh4w8bnBrY9ey/EF6hw tAinbAZREuF11lfOCxd+QmKU6ficPRqkXEGIH0mVPBAHtc44jmXKgYDKJAmXfUEHk/9IZv WNAJgX9Afbf7k7J5y70bMg4OIYDOfBvjwczLXIgWsTLtCSABauFeNgfVlV6UzQ== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1741072281; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=lP373sJm7fLQ44Jh21r4D7xLZ1+CcxGOeWWhA71PxgQ=; b=E4Ln4FLToAv5kFatqppDjnktR3RjR4MtwZ/V9ioYLZ68gkA9sJ3WG3O32cB5rnFcOhKUZ1 KrrVGtKXHIRDgHCg== Date: Tue, 04 Mar 2025 08:10:55 +0100 Subject: [PATCH 25/32] tools/nolibc: allow different write callbacks in printf Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250304-nolibc-kselftest-harness-v1-25-adca7cd231e2@linutronix.de> References: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> In-Reply-To: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1741072266; l=1990; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=VAitc4TpEayA62P7PzIris09IKbI6DnHkqqiFFANP2o=; b=36r1jcdLB7HWYJLkaB9ww4n3omXOBiOYNGXvuAsoRisC7XkNElex38a27q9s091lgCW45SVwb z3rNMFH/3QFCQPD/UN3a6g5QkRyffof/Cg31oBtodkzxG3Wxrezse3X X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= Decouple the formatting logic from the writing logic to later enable writing straight to a buffer in sprintf(). Signed-off-by: Thomas Weißschuh --- tools/include/nolibc/stdio.h | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h index 262d0da4da9062e0c83b55661b2509f36548cf88..434fbaddae7a216159fecf618da85889d631dff7 100644 --- a/tools/include/nolibc/stdio.h +++ b/tools/include/nolibc/stdio.h @@ -208,13 +208,15 @@ char *fgets(char *s, int size, FILE *stream) } -/* minimal vfprintf(). It supports the following formats: +/* minimal printf(). It supports the following formats: * - %[l*]{d,u,c,x,p} * - %s * - unknown modifiers are ignored. */ -static __attribute__((unused, format(printf, 2, 0))) -int vfprintf(FILE *stream, const char *fmt, va_list args) +typedef int (*_printf_cb)(intptr_t state, const char *buf, size_t size); + +static __attribute__((unused, format(printf, 3, 0))) +int _printf(_printf_cb cb, intptr_t state, const char *fmt, va_list args) { char escape, lpref, c; unsigned long long v; @@ -304,7 +306,7 @@ int vfprintf(FILE *stream, const char *fmt, va_list args) outstr = fmt; len = ofs - 1; flush_str: - if (_fwrite(outstr, len, stream) != 0) + if (cb(state, outstr, len) != 0) break; written += len; @@ -321,6 +323,17 @@ int vfprintf(FILE *stream, const char *fmt, va_list args) return written; } +static int _fprintf_cb(intptr_t state, const char *buf, size_t size) +{ + return _fwrite(buf, size, (FILE *)state); +} + +static __attribute__((unused, format(printf, 2, 0))) +int vfprintf(FILE *stream, const char *fmt, va_list args) +{ + return _printf(_fprintf_cb, (intptr_t)stream, fmt, args); +} + static __attribute__((unused, format(printf, 1, 0))) int vprintf(const char *fmt, va_list args) { From patchwork Tue Mar 4 07:10:56 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Patchwork-Id: 14000049 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BCCC11FCD18; Tue, 4 Mar 2025 07:11:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072285; cv=none; b=ks/vVUOxu9vQCgGxXVVHOdA4ORGPdpcXExLpsYJWbjurERj+7DG5Y8jWP70pFQyuTxgflhGej2Se4ROyvN/7QYeRDjUJnpFcdKOZKrv1wUZulfaQXjPd92bEZKHv/+P3pv+PRY8Qty/8rViYzzzKl222LHfiZCrgaNubhGLO9cI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072285; c=relaxed/simple; bh=gptYJeI7zIa0m6z25MFDa2zENatJrEBZvF+Qu777d3Q=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=mh2YJ4ge4Qz39t0AfNVqrnLnxkQztIAVyISE7XqcjUYlEun7TEUqjFzkDrWWcyToCKBMleTOz6AIE19Zl0u/12OO2EA/YX2CZ/4GyzUdG9qeWKku214EfiN2V3lFEfprDU/NVMjWcmOzIGICIAxCNnvhjp3bQdHQloFzWWl8VB4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=VkN/Ntmu; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=OWj9fEX+; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="VkN/Ntmu"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="OWj9fEX+" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1741072282; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=NLxRp/JkTIfoLlcPQDYEqa9/SCMFJG4UakDwlT6QSyY=; b=VkN/NtmugUrtHpSW0xxVfNQcwkWD3L89WDe1fXIdapPzA+WlhNau6GxJ/mTnbYzd5U8uWi ooK84bZ10pXC7PTPz2Vd3dBE325ewM/GWaTmRNC/yjTIE2xfnXX41bxLsakH3S6RsPcOzK D+wD+P3BhwBBRgBiK+K6/6puwNELdtGvzgQ+EIBBa/Zkgb7RVOalzAdIu+bYjZUhgdPq96 nNQVDG2Z3S5mS9x+zMeEqwwyiLu0tnkceLyuZNGa4PrkS3k/jo5mBRqp+TNwivAHxfsPhS MNHJrew6R7GikoLnIFCbLwBtKBh7QZ9LZ73bsZg+k+Yv3ytTXDGQpYfyULT5pA== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1741072282; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=NLxRp/JkTIfoLlcPQDYEqa9/SCMFJG4UakDwlT6QSyY=; b=OWj9fEX+yyEYPJDMI0ShPXvCRd5YAtum2o5o11R0WyXU/3vU/xl0FPoo5pZCz7oGMp4yEg oo1AzboF6zvpa6CA== Date: Tue, 04 Mar 2025 08:10:56 +0100 Subject: [PATCH 26/32] tools/nolibc: allow limiting of printf destination size Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250304-nolibc-kselftest-harness-v1-26-adca7cd231e2@linutronix.de> References: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> In-Reply-To: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1741072266; l=1977; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=gptYJeI7zIa0m6z25MFDa2zENatJrEBZvF+Qu777d3Q=; b=kg8Do5Q+0Aezad9wGTryJ8SqwrVWpOnZIp+KKn+32QIIofCtR3gc17wbpjW5bSai/DAgY1l/2 MRa09pcQU6IC/rBF9CQCZ5hxRzE9YpV3Fef+Y6qLTIieo4ytmIqo8fD X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= snprintf() allows limiting the output buffer, while still returning the number of all bytes that would have been written. Implement the limitation logic in preparation for snprintf(). Signed-off-by: Thomas Weißschuh --- tools/include/nolibc/stdio.h | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h index 434fbaddae7a216159fecf618da85889d631dff7..b484a19466394d55d7d21248031837238b58f3ff 100644 --- a/tools/include/nolibc/stdio.h +++ b/tools/include/nolibc/stdio.h @@ -215,13 +215,13 @@ char *fgets(char *s, int size, FILE *stream) */ typedef int (*_printf_cb)(intptr_t state, const char *buf, size_t size); -static __attribute__((unused, format(printf, 3, 0))) -int _printf(_printf_cb cb, intptr_t state, const char *fmt, va_list args) +static __attribute__((unused, format(printf, 4, 0))) +int _printf(_printf_cb cb, intptr_t state, size_t n, const char *fmt, va_list args) { char escape, lpref, c; unsigned long long v; unsigned int written; - size_t len, ofs; + size_t len, ofs, w; char tmpbuf[21]; const char *outstr; @@ -306,8 +306,12 @@ int _printf(_printf_cb cb, intptr_t state, const char *fmt, va_list args) outstr = fmt; len = ofs - 1; flush_str: - if (cb(state, outstr, len) != 0) - break; + if (n) { + w = len < n ? len : n; + n -= w; + if (cb(state, outstr, w) != 0) + break; + } written += len; do_escape: @@ -331,7 +335,7 @@ static int _fprintf_cb(intptr_t state, const char *buf, size_t size) static __attribute__((unused, format(printf, 2, 0))) int vfprintf(FILE *stream, const char *fmt, va_list args) { - return _printf(_fprintf_cb, (intptr_t)stream, fmt, args); + return _printf(_fprintf_cb, (intptr_t)stream, SIZE_MAX, fmt, args); } static __attribute__((unused, format(printf, 1, 0))) From patchwork Tue Mar 4 07:10:57 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Patchwork-Id: 14000050 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 394111FDE23; Tue, 4 Mar 2025 07:11:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072286; cv=none; b=A50zrE3lDnyfuv4LzVfezaYvdbw4k2DJMAl00+T+cMcA6XncbXPD4CrkjD9IjWBOOP7yVEgASJbOExmXXVOj92HspOeZDyWzdUsiiZZD9cNoyrL4Ry0urYJmz1aKzTeRtYL5ii0ZwUWtsjvYInRUJhcbN6rlNS9N+6WOg+20FgA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072286; c=relaxed/simple; bh=wIUwKicz+gysRQyqA5MCMZEHceZHhrrMizxP+FzW0V4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=S85hWuoUE1W2Vpy7QP9rc7PRjSOO6DYFBIGtUkdN/293Z2t8yuYosTDYCVTasPIiOFUf4bcO5moq7BLF98QqmGF7OiTcN1XbDRx7HQuxcsan1BC6Ve38MRt+KjwrXPjJbEXbqsmxDK4DPqrbz1hr0QFbIzLr4ijKtMEzCoL1jDI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=3PM4fsjf; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=oKCLJsxC; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="3PM4fsjf"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="oKCLJsxC" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1741072282; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=XCXMt69eUoyqO3viGj4al7IsmTDxenZ0uYvjtF1qcX0=; b=3PM4fsjfwHu6TujdWAlZR3nVmsOc41gu8v1+XYxAbQKXv3kNEjCO3oU0sH/d9i71KIckCd K49L5mYs2uZkxyowtVKxc4/v3lDup5PmX+HGRrmw1KWBEzQUcQO2bMy42pcDmuZ5glzsNl HCH9FUoJyGbwajHJW8/jssAfwNP+PshgIJ7SEkmfFvcB3YHralWTFLW3ygN7y0GqE3lG9x ZE9ijhdGitfur58I0Sdp/PzqXgZgmwWVYbFIfxEyaSSkeks2t6j5cshNW3LoLkYIouJ/rz AiK0CanIzWcEN8nwHAdStM4oY6dTcy8D9qJlZWPsun/MrnyaWPmmgfcLBTwwzw== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1741072282; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=XCXMt69eUoyqO3viGj4al7IsmTDxenZ0uYvjtF1qcX0=; b=oKCLJsxCsZmSX0PIhN4EnqDzUznM+4R6pd6umzPKhcVW9a7yB3uKVtfPTzUgNq0q5ELIJL euaHPAqf6Rx0s9DQ== Date: Tue, 04 Mar 2025 08:10:57 +0100 Subject: [PATCH 27/32] tools/nolibc: add snprintf() and friends Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250304-nolibc-kselftest-harness-v1-27-adca7cd231e2@linutronix.de> References: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> In-Reply-To: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1741072266; l=1851; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=wIUwKicz+gysRQyqA5MCMZEHceZHhrrMizxP+FzW0V4=; b=jbXLEEpYwr5OH1QRaGHfpX17imHdpqz3QIq2EsIY7ZVPaXpVCrsubw4taenCxWuNxT002IyzC RIYr3nk2PtmAsof3NpTW9gn6R7Yv8uwli7FzEqzH00zW9jIp3HJPIBT X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= Add more of the printf() functions. Signed-off-by: Thomas Weißschuh --- tools/include/nolibc/stdio.h | 55 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h index b484a19466394d55d7d21248031837238b58f3ff..e9f9cb2e8d9877221b442f9f3757d7ace1a5538c 100644 --- a/tools/include/nolibc/stdio.h +++ b/tools/include/nolibc/stdio.h @@ -389,6 +389,61 @@ int dprintf(int fd, const char *fmt, ...) va_start(args, fmt); ret = vdprintf(fd, fmt, args); va_end(args); + + return ret; +} + +static int _sprintf_cb(intptr_t _state, const char *buf, size_t size) +{ + char **state = (char **)_state; + + memcpy(*state, buf, size); + *state += size; + return 0; +} + +static __attribute__((unused, format(printf, 3, 0))) +int vsnprintf(char *buf, size_t size, const char *fmt, va_list args) +{ + char *state = buf; + int ret; + + ret = _printf(_sprintf_cb, (intptr_t)&state, size, fmt, args); + if (ret < 0) + return ret; + buf[(size_t)ret < size ? (size_t)ret : size - 1] = '\0'; + return ret; +} + +static __attribute__((unused, format(printf, 3, 4))) +int snprintf(char *buf, size_t size, const char *fmt, ...) +{ + va_list args; + int ret; + + va_start(args, fmt); + ret = vsnprintf(buf, size, fmt, args); + va_end(args); + + return ret; +} + +static __attribute__((unused, format(printf, 2, 0))) +int vsprintf(char *buf, const char *fmt, va_list args) +{ + return vsnprintf(buf, SIZE_MAX, fmt, args); +} + +static __attribute__((unused, format(printf, 2, 3))) +int sprintf(char *buf, const char *fmt, ...) +{ + va_list args; + int ret; + + va_start(args, fmt); + ret = vsprintf(buf, fmt, args); + va_end(args); + return ret; } From patchwork Tue Mar 4 07:10:58 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Patchwork-Id: 14000051 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8D69B1FDE35; Tue, 4 Mar 2025 07:11:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072286; cv=none; b=Njxwgn9AsiBUHkAiSJzsJW1oR12X8t8FoLcZd9sxha4Jgx86WErxDBb+yXATZEuSfF537SZp/SSMjEcvJJHMzSomKVlqqz8r4TkyUaA1OLly7Hp4ENYf4J89LFTNV1JWw3ejhIkj09JJ7CsrpDzwNW/3Aavo+zLdiaUUYspKyCY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072286; c=relaxed/simple; bh=kIfkjPOgDVYeocxM7s+nHpNJMKMVlvbxbWh7QtSGrBE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=o9rLksSQn0M+QGOI97Z1C6tbNWcjBaWYNPmqyO23kpe4Cpox+NV6QrQPqBastxduTX71EN6F66OFeaG+viVHzt4RN4p4gptNXLHudd3Pl0vngVeQ0wITdWQ+LtNDELT1c+KOlHMsdNMCj9pUJzZZPt2LjgJfWBnU+45c5kr/qm4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=DK/Mdxuw; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=5XQBtEfd; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="DK/Mdxuw"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="5XQBtEfd" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1741072283; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=yvU+4hUcgr7XKuM6SRyjgFbmMqNDLhbciRivlXgQHe0=; b=DK/Mdxuw8sfwhTAPhlBfxB2DyRgBNB9y2jMBsALIUB9elG1o3AM4d+32URNdHrbL7Y22zr 1m4YxTnql4IKthRgxiF4JaZLeqfwSdUQmij8dwdNR8sarOmTxcdtLL53+DnefwT+WpkWT5 Ioi/nb9UMLRlLut+IX/cXtlsRd3mDCpd/XgUqdaO1DZpULVAb4gQMHg2HkIok0haBR5cWY tamtBzGPhysIUdatzx5W4L5Xkl3jo9yAs6G9oyXcmiexEzo4HUUn78aA0rsABF4pjY9LW0 qP0Nf/ti7+UyUTJr50jyjKHtyh0CvVAeUmjQzAe1f72JsCxUgzSGsvjnLlzMWQ== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1741072283; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=yvU+4hUcgr7XKuM6SRyjgFbmMqNDLhbciRivlXgQHe0=; b=5XQBtEfd82JC7KfmqIpgCQqvUBTC0lxd2swZGcFGR5LhQ7ltVR1IQTKqCwtC9lOVRQf+8t AEjChuNC1MDc0dBA== Date: Tue, 04 Mar 2025 08:10:58 +0100 Subject: [PATCH 28/32] selftests/nolibc: use snprintf() for printf tests Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250304-nolibc-kselftest-harness-v1-28-adca7cd231e2@linutronix.de> References: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> In-Reply-To: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1741072266; l=1733; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=kIfkjPOgDVYeocxM7s+nHpNJMKMVlvbxbWh7QtSGrBE=; b=QmYkSqbdKkmQIzzNr8atDg4RwgZEJUhhF6a1kFnWagiXGqy2ILkajmCYA4XZzCHDupbSZv53S uUIMEQ0W59XA4YnHzFWw8ZCnJXQMwezwGFCYPHy04LttQJaQZ1H05a4 X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= With a proper snprintf() implementation in place, the ugly pipe usage is not necessary anymore. Signed-off-by: Thomas Weißschuh --- tools/testing/selftests/nolibc/nolibc-test.c | 30 +++------------------------- 1 file changed, 3 insertions(+), 27 deletions(-) diff --git a/tools/testing/selftests/nolibc/nolibc-test.c b/tools/testing/selftests/nolibc/nolibc-test.c index 6fa659429cfc38c9d42f36f80ab6c529890d9ad7..1b60eb848c02ef4e90782a83e90987b7efb71031 100644 --- a/tools/testing/selftests/nolibc/nolibc-test.c +++ b/tools/testing/selftests/nolibc/nolibc-test.c @@ -1283,27 +1283,14 @@ int run_stdlib(int min, int max) static int expect_vfprintf(int llen, int c, const char *expected, const char *fmt, ...) { - int ret, pipefd[2]; - ssize_t w, r; char buf[100]; - FILE *memfile; va_list args; + ssize_t w; + int ret; - ret = pipe(pipefd); - if (ret == -1) { - llen += printf(" pipe() != %s", strerror(errno)); - result(llen, FAIL); - return 1; - } - - memfile = fdopen(pipefd[1], "w"); - if (!memfile) { - result(llen, FAIL); - return 1; - } va_start(args, fmt); - w = vfprintf(memfile, fmt, args); + w = vsnprintf(buf, sizeof(buf), fmt, args); va_end(args); if (w != c) { @@ -1312,17 +1299,6 @@ static int expect_vfprintf(int llen, int c, const char *expected, const char *fm return 1; } - fclose(memfile); - - r = read(pipefd[0], buf, sizeof(buf) - 1); - - if (r != w) { - llen += printf(" written(%d) != read(%d)", (int)w, (int)r); - result(llen, FAIL); - return 1; - } - - buf[r] = '\0'; llen += printf(" \"%s\" = \"%s\"", expected, buf); ret = strncmp(expected, buf, c); From patchwork Tue Mar 4 07:10:59 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Patchwork-Id: 14000052 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 721DC1FCFFB; Tue, 4 Mar 2025 07:11:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072287; cv=none; b=jJ0WvxZi7O8L87Ojmts0sMgdBTiJJEkEdFKEIjSSqPIoqWYSXntmHFqT64K3BEN5OUFXi1GRNG/FWfMuW6Q4DOfWTjL0IwwJ6gRa/wV9bw97XIUazwNnr9r4lcLyFXNb0kuXuF/4o4Lf9VUl7Yz9U5Z0pPSuthf/jpMxIkmJkTo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072287; c=relaxed/simple; bh=F+4L6Lcnwfanmt5Kqdkvi87g3JgnQgxpyb3eeUpp8po=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=t/115ltsDEMp71I+81DdPef3CNbykcVKL80D8yoebqyL41jK/T5V94cEOTkRiyi+OpzWKox3Sg24+6HXlF/6/932WTu7hNoL+pbNcI+2ogZMHm4x0EbIYaQhIKJ78w7Qo6/bSqJCVVEe/6bOK7FlxagdUjoGBq/x2aI9kSK9JtA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=DTNZ3d99; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=KCu+hbFU; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="DTNZ3d99"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="KCu+hbFU" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1741072283; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Jolyi30wjQpEq7ly7BNkZpNqTbniwn3HizEwB2dNsZY=; b=DTNZ3d99XogvvQj/vxCMTpOouYsqEowtm1ID5ToKdoP2PeVSHAwoeHk4ARGQbQvEwiX4Xd UoKp1o+3G7y03iwapnKdh1IoZxXhaSCha2ShkEqGTxYBsNny/oFF5AO/lkQliyAinzxf8z pZ2FuvKILOu9V9FZpn2UbOVACDxRWhesLp1Bf5fneboXpjc9okNKQD8+UMhz8XnCV/IXJn PTNxG6/aZiItbeWlbbL+PecK0J2iuU9mcFiT9Y/AGrwajfySnr8GJkjDUY79cRoykZOT65 yE5AspxDdvPP0+COoTZ8cuU1D/OOXLTdbqFClXqPescql5jqKx269Cd0Y4Ax6Q== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1741072283; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Jolyi30wjQpEq7ly7BNkZpNqTbniwn3HizEwB2dNsZY=; b=KCu+hbFUB08/qsKpGY+N/XZq0J46mb1JGeHy58y7Qxgcoz0f7tSq5Z/Wyy61/hrAMk1H83 qfYgVESM7eQg7mAw== Date: Tue, 04 Mar 2025 08:10:59 +0100 Subject: [PATCH 29/32] selftests/nolibc: rename vfprintf test suite Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250304-nolibc-kselftest-harness-v1-29-adca7cd231e2@linutronix.de> References: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> In-Reply-To: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1741072266; l=1259; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=F+4L6Lcnwfanmt5Kqdkvi87g3JgnQgxpyb3eeUpp8po=; b=4lYomLqaCL6x45tqww+3yPOX/dkk26DnxQgwZZxEEO8+1DVdVHNHsv3ZxuHo/OypFjKknmroo Q5SpbGadjgvC5JS7iHfm9sJqbTDv2+apmSNh025p4kGEBCQWrDnhIH+ X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= With the addition of snprintf() and its usage in nolibc-test, the name of the "vfprintf" test suite is not accurate anymore. Rename the suite to be more generic. Signed-off-by: Thomas Weißschuh --- tools/testing/selftests/nolibc/nolibc-test.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/nolibc/nolibc-test.c b/tools/testing/selftests/nolibc/nolibc-test.c index 1b60eb848c02ef4e90782a83e90987b7efb71031..a45fded42c14110c97c4c899d04dba8e676dfd49 100644 --- a/tools/testing/selftests/nolibc/nolibc-test.c +++ b/tools/testing/selftests/nolibc/nolibc-test.c @@ -1373,7 +1373,7 @@ static int test_scanf(void) return 0; } -static int run_vfprintf(int min, int max) +static int run_printf(int min, int max) { int test; int ret = 0; @@ -1534,7 +1534,7 @@ static const struct test test_names[] = { { .name = "startup", .func = run_startup }, { .name = "syscall", .func = run_syscall }, { .name = "stdlib", .func = run_stdlib }, - { .name = "vfprintf", .func = run_vfprintf }, + { .name = "printf", .func = run_printf }, { .name = "protection", .func = run_protection }, { 0 } }; From patchwork Tue Mar 4 07:11:00 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Patchwork-Id: 14000053 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BB6A61FE47D; Tue, 4 Mar 2025 07:11:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072287; cv=none; b=THHx3kap+h01UNBQbbUo1UTVQke9O2Xt4jX6AmVPsjJWxhlLjCRSRUzQa3uJecfLnD8rXxRqUpqw9CWNknXnzAN0L4SNNkIYj4zhiMvn2QDLI86a+aHXmoXi9ngdaSI/imike54LBV1Y2e4fNd81RltToe4rPePKcAJeq1nwO64= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072287; c=relaxed/simple; bh=lqlncDo1UCxd5Qb+0OWEvVEY/WGNcq650GyEc6hW+zw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=b1jnr41aowgB+Ab5Q3CxGNOuHUhKTMjT7G0Us+ra/+wLzZieVcwsKejcRuhboOC1DrPCQhFLUxUeXF0NzhFQ1LA1hmjSfuflZmo8yT9bnxfsWYnJ4tc70k6d2pjyobwoPbSRKq7haUAx08s/jtwcoHN3QZDv64+Aurdf6MGiPfA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=wOTfJARl; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=/8d+Fybs; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="wOTfJARl"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="/8d+Fybs" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1741072284; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=9keINKbLYtSgKZkTaGHpd26ZQfIBYzWs7KdJylwBu3Q=; b=wOTfJARlFblqJUNgUSrXISsh52ee2xDvchXLRQ9eCE/0b8bn7ED2BRDIkETxVoAtyOopMV HqbXUnX904jygmrfs17X3KiwTK54wM+LDIifjzYjhuMef7DkLPsKn/dRQ4+MM5lpnB5DZ+ vqmXURM+Bda9bak5iFbeYNe4ZSAdyY8Tm5QwwigYC4lODd87YqmV8uVhwBXaW29Pi73LMA EG+d5NuXSW6w2uhDOA/YAzdRiFqSku6s7/UyrpDd6X+2eq/xznHSu03SF3LYpTKefUyxUd 8sZr/VH5rR4i8ikKNKCeKh3hI5yNxTvlOlueHBFPEAzCWQtFV9/XdKQisOUGEA== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1741072284; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=9keINKbLYtSgKZkTaGHpd26ZQfIBYzWs7KdJylwBu3Q=; b=/8d+FybsM9Ik5LZlA19OTBlgK/N+NT7JuUAoyZWK9+TwwSzrRd9lRr7hSYN8NAoiOqbgiw VGctFv+eONjHFEBQ== Date: Tue, 04 Mar 2025 08:11:00 +0100 Subject: [PATCH 30/32] selftests/nolibc: add test for snprintf() truncation Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250304-nolibc-kselftest-harness-v1-30-adca7cd231e2@linutronix.de> References: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> In-Reply-To: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1741072266; l=1516; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=lqlncDo1UCxd5Qb+0OWEvVEY/WGNcq650GyEc6hW+zw=; b=fXlq3eRMc/xgbn6BxLxO00FbysIYO7xKjAZGH1130AoFqlBXr4W6Sh6YQO2L8MnEEkL1l2AGA M1n2JOonOnGB58KKCvgb+9SK39WcybEJQL6njmcMg2tZNWs6pVEcyBw X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= Now that we have a proper snprintf() implementation, make sure truncation is handled properly. Signed-off-by: Thomas Weißschuh --- tools/testing/selftests/nolibc/nolibc-test.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/nolibc/nolibc-test.c b/tools/testing/selftests/nolibc/nolibc-test.c index a45fded42c14110c97c4c899d04dba8e676dfd49..0a891c40e2afbb398ae39b43dbe977efdab042e2 100644 --- a/tools/testing/selftests/nolibc/nolibc-test.c +++ b/tools/testing/selftests/nolibc/nolibc-test.c @@ -1290,7 +1290,8 @@ static int expect_vfprintf(int llen, int c, const char *expected, const char *fm va_start(args, fmt); - w = vsnprintf(buf, sizeof(buf), fmt, args); + /* Only allow writing 21 bytes, to test truncation */ + w = vsnprintf(buf, 21, fmt, args); va_end(args); if (w != c) { @@ -1396,6 +1397,7 @@ static int run_printf(int min, int max) CASE_TEST(pointer); EXPECT_VFPRINTF(3, "0x1", "%p", (void *) 0x1); break; CASE_TEST(uintmax_t); EXPECT_VFPRINTF(20, "18446744073709551615", "%ju", 0xffffffffffffffffULL); break; CASE_TEST(intmax_t); EXPECT_VFPRINTF(20, "-9223372036854775807", "%jd", 0x8000000000000001LL); break; + CASE_TEST(truncation); EXPECT_VFPRINTF(25, "01234567890123456789", "%s", "0123456789012345678901234"); break; CASE_TEST(scanf); EXPECT_ZR(1, test_scanf()); break; case __LINE__: return ret; /* must be last */ From patchwork Tue Mar 4 07:11:01 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Patchwork-Id: 14000054 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3AAAD1FECA3; Tue, 4 Mar 2025 07:11:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072288; cv=none; b=u8FjvuhuieUkSdtWJ1AXkaXbzW/PN5rAz8kqgvtH19pmW4p0PoU41UjgjToOaxDVrXpJNKXS4wcWBarPwdb/InjelQpxAwQ2EiBMFhRTNkLfyQf/Tz2e0de4345JR6OZiEfCXBfoKSr+JnEn/QUqjgkWeTnbVZq2Xw52aXZufLc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072288; c=relaxed/simple; bh=LNPAd5j41z7/7wbeh3w+BrEJrXkwXGb0E7Y8U1tP0CI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=f+XVNGtmKl7TimzD1PI1fefek+Nz66zzOPwaZsgthpxwKSCviIceSxQWRhwYA6AMSqaChoQex0Tu+0Qx+PGdZoybVq/t+LlwnrMqm9jhY54cuvyd87ne8HppJw77Li8SQMhAmvg7DYgGUJ2U9Ni1G9bDBPGMxHDxfK4PdilFYAQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=jSeXaQ/G; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=7U3Qaf+V; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="jSeXaQ/G"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="7U3Qaf+V" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1741072284; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=qhuLcuZRPubZ7LHVGGsmkya6pwUURKc40l/u6to7bWM=; b=jSeXaQ/GttXEiSCK0ymFabIzTKPyl1yEkiilqffkVyTkVdR5jayYMwneZAhFr+KAajzJDQ 8fFB4MHMcXuBu2Agr6pjaFH6qYllV4G/SIzCpogSv2CVbqDgDwnx6uzHzyi57NUP2YOQ6I lYc0DrE8quWZE24DRr75I/w2DVH7+BDDlzJ1R4OZhgK/8gGGyJmrxkepCP7OQphqmTcz3z ksgCvsG3rkGHN5TeG+WHxceE6yB84KVlpcZt5zcuQ3CeeMACU+UsikaRmEvryTyvq2YZrJ UZPmnHe5arvk43fFnIZfn8LrUonDAL/q1w3f/iA/l5mvA8vW1HJo4Ma8BWcWBw== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1741072284; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=qhuLcuZRPubZ7LHVGGsmkya6pwUURKc40l/u6to7bWM=; b=7U3Qaf+VhjwzIy2f4axAKcMZdxVhHJsKr+ULwizD7eG4svAnef29B0hi+oMJH7gR2NCkJj j/hzOPHfd/ieMGAw== Date: Tue, 04 Mar 2025 08:11:01 +0100 Subject: [PATCH 31/32] tools/nolibc: implement width padding in printf() Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250304-nolibc-kselftest-harness-v1-31-adca7cd231e2@linutronix.de> References: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> In-Reply-To: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1741072266; l=2875; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=LNPAd5j41z7/7wbeh3w+BrEJrXkwXGb0E7Y8U1tP0CI=; b=sUdIwUQ8/jSwNj+IrnF7rPKV6tQ4Hf0UIwn+FB7oP7GrkWChIo6R6V8n/Osn2vGc9UwEkMP35 FT51Dy6SVu9C9f1wSurWzf9LTUSKq9a2VyZhQzS9msF//LE0w+qPuW4 X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= printf can pad each argument to a certain width. Implement this for compatibility with the kselftest harness. Currently only padding with spaces is supported. Signed-off-by: Thomas Weißschuh --- tools/include/nolibc/stdio.h | 17 ++++++++++++++++- tools/testing/selftests/nolibc/nolibc-test.c | 3 +++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h index e9f9cb2e8d9877221b442f9f3757d7ace1a5538c..9258cc1c406879b34f65fff442c0f112ede160fa 100644 --- a/tools/include/nolibc/stdio.h +++ b/tools/include/nolibc/stdio.h @@ -220,7 +220,7 @@ int _printf(_printf_cb cb, intptr_t state, size_t n, const char *fmt, va_list ar { char escape, lpref, c; unsigned long long v; - unsigned int written; + unsigned int written, width; size_t len, ofs, w; char tmpbuf[21]; const char *outstr; @@ -228,10 +228,20 @@ int _printf(_printf_cb cb, intptr_t state, size_t n, const char *fmt, va_list ar written = ofs = escape = lpref = 0; while (1) { c = fmt[ofs++]; + width = 0; if (escape) { /* we're in an escape sequence, ofs == 1 */ escape = 0; + + /* width */ + while (c >= '0' && c <= '9') { + width *= 10; + width += c - '0'; + + c = fmt[ofs++]; + } + if (c == 'c' || c == 'd' || c == 'u' || c == 'x' || c == 'p') { char *out = tmpbuf; @@ -309,6 +319,11 @@ int _printf(_printf_cb cb, intptr_t state, size_t n, const char *fmt, va_list ar if (n) { w = len < n ? len : n; n -= w; + while (width-- > w) { + if (cb(state, " ", 1) != 0) + break; + written += 1; + } if (cb(state, outstr, w) != 0) break; } diff --git a/tools/testing/selftests/nolibc/nolibc-test.c b/tools/testing/selftests/nolibc/nolibc-test.c index 0a891c40e2afbb398ae39b43dbe977efdab042e2..b801b611e003a6f3ebd5bdbcd4f70961c1279a4d 100644 --- a/tools/testing/selftests/nolibc/nolibc-test.c +++ b/tools/testing/selftests/nolibc/nolibc-test.c @@ -1398,6 +1398,9 @@ static int run_printf(int min, int max) CASE_TEST(uintmax_t); EXPECT_VFPRINTF(20, "18446744073709551615", "%ju", 0xffffffffffffffffULL); break; CASE_TEST(intmax_t); EXPECT_VFPRINTF(20, "-9223372036854775807", "%jd", 0x8000000000000001LL); break; CASE_TEST(truncation); EXPECT_VFPRINTF(25, "01234567890123456789", "%s", "0123456789012345678901234"); break; + CASE_TEST(string_width); EXPECT_VFPRINTF(10, " 1", "%10s", "1"); break; + CASE_TEST(number_width); EXPECT_VFPRINTF(10, " 1", "%10d", 1); break; + CASE_TEST(width_trunc); EXPECT_VFPRINTF(25, " ", "%25d", 1); break; CASE_TEST(scanf); EXPECT_ZR(1, test_scanf()); break; case __LINE__: return ret; /* must be last */ From patchwork Tue Mar 4 07:11:02 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Patchwork-Id: 14000055 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C7D081FECDC; Tue, 4 Mar 2025 07:11:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072292; cv=none; b=fIwF/JMf4DAKu9dtAi9f/E5LUquQKwjhXysYGwSuF9aHxaun4kMHGaBDB0yMHykhzUXSLfyhLT0Pae8RiQ/3DIcwP6WT64OhmwdfcM0TqIziyTiKnTFnsb9KZc+lhIdwYSMmkL0/mTIq93hj4t55V4NwcHEdVkveRi06maMTEBc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741072292; c=relaxed/simple; bh=ds4x0bRTJvm27hXV7OZVurepjLM17Pfn1+1EbPNYHkQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=PTepFV7pEqfL7gP1szovdS+Rl5aDZFkb0lFHha+pOLOpwjtpDZWnvUQ/aFBCP24GMnig3bi1xWuARcUgnl5pTcFXHjZNnx/AAgc9iZM1PdFdWogGEI2hq0Bot3T4govVe1fmbXacAEhS9flesDtpzozhYu1OtF/dJf/JXOMrxlo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=m05+rRBn; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=Nk7Ma3VI; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="m05+rRBn"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="Nk7Ma3VI" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1741072285; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=37RsePHmpOan7iuyTAP4ljNPUti20SRSWmzdMYK71Ds=; b=m05+rRBnIUJlmQsnKEuaycSpEUdMbsdGUoAHDJRvTD9s8Hii3GFgLtNzKTDhI1AN5Y/KPp m4sT6nTBeVm3yAI7LD1CRjLtejOKBHQxJ4dkeaiU14klC3JkNQNn0qlogzXcHilYqb1Q7v KNC0eFcRSylEbSeH96MVmLxfRNcmRzyqHcVi7qdZBwk6+s7ZPVikhNhZbjMLunt42+HxvN Winas6Znt38JAkwqPqNkUNpPJoG4dOUIVtFd5U0uz7WlxaKh9AxKOOWKzEVuNDGdnuraSA URrK0UOHczEJxH6RsxR/HP4mBxMGdXveLv4GxVADZkMINpkfam/wYUviPj4+DQ== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1741072285; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=37RsePHmpOan7iuyTAP4ljNPUti20SRSWmzdMYK71Ds=; b=Nk7Ma3VIlihngRSHdKw0yYz7bLrFRyizqZPiXeEkFsre9p5MpG50s3VlS/7dBL1VeUNNxx AIgfPQCHFu/3Y0DQ== Date: Tue, 04 Mar 2025 08:11:02 +0100 Subject: [PATCH 32/32] HACK: selftests/nolibc: demonstrate usage of the kselftest harness Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250304-nolibc-kselftest-harness-v1-32-adca7cd231e2@linutronix.de> References: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> In-Reply-To: <20250304-nolibc-kselftest-harness-v1-0-adca7cd231e2@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1741072266; l=62737; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=ds4x0bRTJvm27hXV7OZVurepjLM17Pfn1+1EbPNYHkQ=; b=dF2OyNd+uakpWTkbLPBaOg8rx8B5FZ8Njxps7cgsZu3dR7mVE7vByrj4UYnOTVubjulCLhwhs IOendnV5BX9C+yCwwVUMTQQJAir+8UdLSzjc+vcG/N7+ODp5dngjrio X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= Show how to use the kselftest harness together with nolibc. This just runs the existing harness selftest by crudely replacing the regular nolibc-test.c with the harness-selftest.c to get that wired up easily. In the future nolibc-test can use the harness for itself. Not-Signed-off-by: Thomas Weißschuh --- .../testing/selftests/kselftest/harness-selftest.c | 2 +- tools/testing/selftests/nolibc/Makefile | 17 +- tools/testing/selftests/nolibc/harness-selftest.c | 1 + tools/testing/selftests/nolibc/nolibc-test.c | 1698 +------------------- tools/testing/selftests/nolibc/run-tests.sh | 2 +- 5 files changed, 10 insertions(+), 1710 deletions(-) diff --git a/tools/testing/selftests/kselftest/harness-selftest.c b/tools/testing/selftests/kselftest/harness-selftest.c index 8d39e7a0b99c41a5d33edfe2dbf875cac04c098d..bbb2fda7042ca8bac608625e6f4302466b23f7b3 100644 --- a/tools/testing/selftests/kselftest/harness-selftest.c +++ b/tools/testing/selftests/kselftest/harness-selftest.c @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: GPL-2.0 +/* SPDX-License-Identifier: GPL-2.0 */ #include diff --git a/tools/testing/selftests/nolibc/Makefile b/tools/testing/selftests/nolibc/Makefile index 58bcbbd029bc3ad9ccac968191b703ccf5df0717..d97ffc138da0f63673dcc20b6636b842e3226587 100644 --- a/tools/testing/selftests/nolibc/Makefile +++ b/tools/testing/selftests/nolibc/Makefile @@ -47,7 +47,6 @@ XARCH_riscv = riscv64 XARCH = $(or $(XARCH_$(ARCH)),$(ARCH)) # map from user input variants to their kernel supported architectures -ARCH_armthumb = arm ARCH_ppc = powerpc ARCH_ppc64 = powerpc ARCH_ppc64le = powerpc @@ -64,7 +63,6 @@ IMAGE_x86_64 = arch/x86/boot/bzImage IMAGE_x86 = arch/x86/boot/bzImage IMAGE_arm64 = arch/arm64/boot/Image IMAGE_arm = arch/arm/boot/zImage -IMAGE_armthumb = arch/arm/boot/zImage IMAGE_mips32le = vmlinuz IMAGE_mips32be = vmlinuz IMAGE_ppc = vmlinux @@ -85,7 +83,6 @@ DEFCONFIG_x86_64 = defconfig DEFCONFIG_x86 = defconfig DEFCONFIG_arm64 = defconfig DEFCONFIG_arm = multi_v7_defconfig -DEFCONFIG_armthumb = multi_v7_defconfig DEFCONFIG_mips32le = malta_defconfig DEFCONFIG_mips32be = malta_defconfig generic/eb.config DEFCONFIG_ppc = pmac32_defconfig @@ -110,7 +107,6 @@ QEMU_ARCH_x86_64 = x86_64 QEMU_ARCH_x86 = x86_64 QEMU_ARCH_arm64 = aarch64 QEMU_ARCH_arm = arm -QEMU_ARCH_armthumb = arm QEMU_ARCH_mips32le = mipsel # works with malta_defconfig QEMU_ARCH_mips32be = mips QEMU_ARCH_ppc = ppc @@ -140,7 +136,6 @@ QEMU_ARGS_x86_64 = -M pc -append "console=ttyS0,9600 i8042.noaux panic=-1 $( QEMU_ARGS_x86 = -M pc -append "console=ttyS0,9600 i8042.noaux panic=-1 $(TEST:%=NOLIBC_TEST=%)" QEMU_ARGS_arm64 = -M virt -cpu cortex-a53 -append "panic=-1 $(TEST:%=NOLIBC_TEST=%)" QEMU_ARGS_arm = -M virt -append "panic=-1 $(TEST:%=NOLIBC_TEST=%)" -QEMU_ARGS_armthumb = -M virt -append "panic=-1 $(TEST:%=NOLIBC_TEST=%)" QEMU_ARGS_mips32le = -M malta -append "panic=-1 $(TEST:%=NOLIBC_TEST=%)" QEMU_ARGS_mips32be = -M malta -append "panic=-1 $(TEST:%=NOLIBC_TEST=%)" QEMU_ARGS_ppc = -M g3beige -append "console=ttyS0 panic=-1 $(TEST:%=NOLIBC_TEST=%)" @@ -165,8 +160,7 @@ Q=@ endif CFLAGS_i386 = $(call cc-option,-m32) -CFLAGS_arm = -marm -CFLAGS_armthumb = -mthumb -march=armv6t2 +CFLAGS_arm = -march=armv7 CFLAGS_ppc = -m32 -mbig-endian -mno-vsx $(call cc-option,-mmultiple) CFLAGS_ppc64 = -m64 -mbig-endian -mno-vsx $(call cc-option,-mmultiple) CFLAGS_ppc64le = -m64 -mlittle-endian -mno-vsx $(call cc-option,-mabi=elfv2) @@ -175,8 +169,10 @@ CFLAGS_s390 = -m31 CFLAGS_mips32le = -EL -mabi=32 -fPIC CFLAGS_mips32be = -EB -mabi=32 CFLAGS_STACKPROTECTOR ?= $(call cc-option,-mstack-protector-guard=global $(call cc-option,-fstack-protector-all)) -CFLAGS ?= -Os -fno-ident -fno-asynchronous-unwind-tables -std=c89 -W -Wall -Wextra \ +CFLAGS ?= -Os -fno-ident -fno-asynchronous-unwind-tables -std=c89 -W -Wall -Wextra -ggdb -ffreestanding \ + -ffile-prefix-map=./= \ $(call cc-option,-fno-stack-protector) $(call cc-option,-Wmissing-prototypes) \ + $(call cc-option,-mno-outline-atomics) \ $(CFLAGS_$(XARCH)) $(CFLAGS_STACKPROTECTOR) $(CFLAGS_EXTRA) LDFLAGS := @@ -193,10 +189,7 @@ include $(srctree)/tools/scripts/Makefile.include # GCC uses "s390", clang "systemz" CLANG_CROSS_FLAGS := $(subst --target=s390-linux,--target=systemz-linux,$(CLANG_CROSS_FLAGS)) -REPORT ?= awk '/\[OK\][\r]*$$/{p++} /\[FAIL\][\r]*$$/{if (!f) printf("\n"); f++; print;} /\[SKIPPED\][\r]*$$/{s++} \ - END{ printf("\n%3d test(s): %3d passed, %3d skipped, %3d failed => status: ", p+s+f, p, s, f); \ - if (f || !p) printf("failure\n"); else if (s) printf("warning\n"); else printf("success\n");; \ - printf("\nSee all results in %s\n", ARGV[1]); }' +REPORT = sed -i -e '/^\[/d' -e 's/\x0d//' run.out; cmp ../kselftest/harness-selftest.expected run.out && echo ok; true help: @echo "Supported targets under selftests/nolibc:" diff --git a/tools/testing/selftests/nolibc/harness-selftest.c b/tools/testing/selftests/nolibc/harness-selftest.c new file mode 120000 index 0000000000000000000000000000000000000000..847b121e60482513cd0911422cfdb19bdf681bd6 --- /dev/null +++ b/tools/testing/selftests/nolibc/harness-selftest.c @@ -0,0 +1 @@ +../kselftest/harness-selftest.c \ No newline at end of file diff --git a/tools/testing/selftests/nolibc/nolibc-test.c b/tools/testing/selftests/nolibc/nolibc-test.c index b801b611e003a6f3ebd5bdbcd4f70961c1279a4d..9a074d2b24c99d86bf27f8399f2e7dc719dbcd24 100644 --- a/tools/testing/selftests/nolibc/nolibc-test.c +++ b/tools/testing/selftests/nolibc/nolibc-test.c @@ -1,1699 +1,5 @@ /* SPDX-License-Identifier: GPL-2.0 */ -#define _GNU_SOURCE -#define _LARGEFILE64_SOURCE +#define inline __inline__ -/* libc-specific include files - * The program may be built in 3 ways: - * $(CC) -nostdlib -include /path/to/nolibc.h => NOLIBC already defined - * $(CC) -nostdlib -I/path/to/nolibc/sysroot => _NOLIBC_* guards are present - * $(CC) with default libc => NOLIBC* never defined - */ -#ifndef NOLIBC -#include -#include -#include -#ifndef _NOLIBC_STDIO_H -/* standard libcs need more includes */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#endif -#endif - -#pragma GCC diagnostic ignored "-Wmissing-prototypes" - -#include "nolibc-test-linkage.h" - -/* for the type of int_fast16_t and int_fast32_t, musl differs from glibc and nolibc */ -#define SINT_MAX_OF_TYPE(type) (((type)1 << (sizeof(type) * 8 - 2)) - (type)1 + ((type)1 << (sizeof(type) * 8 - 2))) -#define SINT_MIN_OF_TYPE(type) (-SINT_MAX_OF_TYPE(type) - 1) - -/* will be used to test initialization of environ */ -static char **test_envp; - -/* will be used to test initialization of argv */ -static char **test_argv; - -/* will be used to test initialization of argc */ -static int test_argc; - -/* will be used by some test cases as readable file, please don't write it */ -static const char *argv0; - -/* will be used by constructor tests */ -static int constructor_test_value; - -static const int is_nolibc = -#ifdef NOLIBC - 1 -#else - 0 -#endif -; - -/* definition of a series of tests */ -struct test { - const char *name; /* test name */ - int (*func)(int min, int max); /* handler */ -}; - -#ifndef _NOLIBC_STDLIB_H -char *itoa(int i) -{ - static char buf[12]; - int ret; - - ret = snprintf(buf, sizeof(buf), "%d", i); - return (ret >= 0 && ret < sizeof(buf)) ? buf : "#err"; -} -#endif - -#define CASE_ERR(err) \ - case err: return #err - -/* returns the error name (e.g. "ENOENT") for common errors, "SUCCESS" for 0, - * or the decimal value for less common ones. - */ -static const char *errorname(int err) -{ - switch (err) { - case 0: return "SUCCESS"; - CASE_ERR(EPERM); - CASE_ERR(ENOENT); - CASE_ERR(ESRCH); - CASE_ERR(EINTR); - CASE_ERR(EIO); - CASE_ERR(ENXIO); - CASE_ERR(E2BIG); - CASE_ERR(ENOEXEC); - CASE_ERR(EBADF); - CASE_ERR(ECHILD); - CASE_ERR(EAGAIN); - CASE_ERR(ENOMEM); - CASE_ERR(EACCES); - CASE_ERR(EFAULT); - CASE_ERR(ENOTBLK); - CASE_ERR(EBUSY); - CASE_ERR(EEXIST); - CASE_ERR(EXDEV); - CASE_ERR(ENODEV); - CASE_ERR(ENOTDIR); - CASE_ERR(EISDIR); - CASE_ERR(EINVAL); - CASE_ERR(ENFILE); - CASE_ERR(EMFILE); - CASE_ERR(ENOTTY); - CASE_ERR(ETXTBSY); - CASE_ERR(EFBIG); - CASE_ERR(ENOSPC); - CASE_ERR(ESPIPE); - CASE_ERR(EROFS); - CASE_ERR(EMLINK); - CASE_ERR(EPIPE); - CASE_ERR(EDOM); - CASE_ERR(ERANGE); - CASE_ERR(ENOSYS); - CASE_ERR(EOVERFLOW); - default: - return itoa(err); - } -} - -static void align_result(size_t llen) -{ - const size_t align = 64; - char buf[align]; - size_t n; - - if (llen >= align) - return; - - n = align - llen; - memset(buf, ' ', n); - buf[n] = '\0'; - fputs(buf, stdout); -} - -enum RESULT { - OK, - FAIL, - SKIPPED, -}; - -static void result(int llen, enum RESULT r) -{ - const char *msg; - - if (r == OK) - msg = " [OK]"; - else if (r == SKIPPED) - msg = "[SKIPPED]"; - else - msg = " [FAIL]"; - - align_result(llen); - puts(msg); -} - -/* The tests below are intended to be used by the macroes, which evaluate - * expression , print the status to stdout, and update the "ret" - * variable to count failures. The functions themselves return the number - * of failures, thus either 0 or 1. - */ - -#define EXPECT_ZR(cond, expr) \ - do { if (!(cond)) result(llen, SKIPPED); else ret += expect_zr(expr, llen); } while (0) - -static __attribute__((unused)) -int expect_zr(int expr, int llen) -{ - int ret = !(expr == 0); - - llen += printf(" = %d ", expr); - result(llen, ret ? FAIL : OK); - return ret; -} - - -#define EXPECT_NZ(cond, expr, val) \ - do { if (!(cond)) result(llen, SKIPPED); else ret += expect_nz(expr, llen; } while (0) - -static __attribute__((unused)) -int expect_nz(int expr, int llen) -{ - int ret = !(expr != 0); - - llen += printf(" = %d ", expr); - result(llen, ret ? FAIL : OK); - return ret; -} - - -#define EXPECT_EQ(cond, expr, val) \ - do { if (!(cond)) result(llen, SKIPPED); else ret += expect_eq(expr, llen, val); } while (0) - -static __attribute__((unused)) -int expect_eq(uint64_t expr, int llen, uint64_t val) -{ - int ret = !(expr == val); - - llen += printf(" = %lld ", (long long)expr); - result(llen, ret ? FAIL : OK); - return ret; -} - - -#define EXPECT_NE(cond, expr, val) \ - do { if (!(cond)) result(llen, SKIPPED); else ret += expect_ne(expr, llen, val); } while (0) - -static __attribute__((unused)) -int expect_ne(int expr, int llen, int val) -{ - int ret = !(expr != val); - - llen += printf(" = %d ", expr); - result(llen, ret ? FAIL : OK); - return ret; -} - - -#define EXPECT_GE(cond, expr, val) \ - do { if (!(cond)) result(llen, SKIPPED); else ret += expect_ge(expr, llen, val); } while (0) - -static __attribute__((unused)) -int expect_ge(int expr, int llen, int val) -{ - int ret = !(expr >= val); - - llen += printf(" = %d ", expr); - result(llen, ret ? FAIL : OK); - return ret; -} - - -#define EXPECT_GT(cond, expr, val) \ - do { if (!(cond)) result(llen, SKIPPED); else ret += expect_gt(expr, llen, val); } while (0) - -static __attribute__((unused)) -int expect_gt(int expr, int llen, int val) -{ - int ret = !(expr > val); - - llen += printf(" = %d ", expr); - result(llen, ret ? FAIL : OK); - return ret; -} - - -#define EXPECT_LE(cond, expr, val) \ - do { if (!(cond)) result(llen, SKIPPED); else ret += expect_le(expr, llen, val); } while (0) - -static __attribute__((unused)) -int expect_le(int expr, int llen, int val) -{ - int ret = !(expr <= val); - - llen += printf(" = %d ", expr); - result(llen, ret ? FAIL : OK); - return ret; -} - - -#define EXPECT_LT(cond, expr, val) \ - do { if (!(cond)) result(llen, SKIPPED); else ret += expect_lt(expr, llen, val); } while (0) - -static __attribute__((unused)) -int expect_lt(int expr, int llen, int val) -{ - int ret = !(expr < val); - - llen += printf(" = %d ", expr); - result(llen, ret ? FAIL : OK); - return ret; -} - - -#define EXPECT_SYSZR(cond, expr) \ - do { if (!(cond)) result(llen, SKIPPED); else ret += expect_syszr(expr, llen); } while (0) - -static __attribute__((unused)) -int expect_syszr(int expr, int llen) -{ - int ret = 0; - - if (errno == ENOSYS) { - llen += printf(" = ENOSYS"); - result(llen, SKIPPED); - } else if (expr) { - ret = 1; - llen += printf(" = %d %s ", expr, errorname(errno)); - result(llen, FAIL); - } else { - llen += printf(" = %d ", expr); - result(llen, OK); - } - return ret; -} - - -#define EXPECT_SYSEQ(cond, expr, val) \ - do { if (!(cond)) result(llen, SKIPPED); else ret += expect_syseq(expr, llen, val); } while (0) - -static __attribute__((unused)) -int expect_syseq(int expr, int llen, int val) -{ - int ret = 0; - - if (expr != val) { - ret = 1; - llen += printf(" = %d %s ", expr, errorname(errno)); - result(llen, FAIL); - } else { - llen += printf(" = %d ", expr); - result(llen, OK); - } - return ret; -} - - -#define EXPECT_SYSNE(cond, expr, val) \ - do { if (!(cond)) result(llen, SKIPPED); else ret += expect_sysne(expr, llen, val); } while (0) - -static __attribute__((unused)) -int expect_sysne(int expr, int llen, int val) -{ - int ret = 0; - - if (errno == ENOSYS) { - llen += printf(" = ENOSYS"); - result(llen, SKIPPED); - } else if (expr == val) { - ret = 1; - llen += printf(" = %d %s ", expr, errorname(errno)); - result(llen, FAIL); - } else { - llen += printf(" = %d ", expr); - result(llen, OK); - } - return ret; -} - - -#define EXPECT_SYSER2(cond, expr, expret, experr1, experr2) \ - do { if (!(cond)) result(llen, SKIPPED); else ret += expect_syserr2(expr, expret, experr1, experr2, llen); } while (0) - -#define EXPECT_SYSER(cond, expr, expret, experr) \ - EXPECT_SYSER2(cond, expr, expret, experr, 0) - -static __attribute__((unused)) -int expect_syserr2(int expr, int expret, int experr1, int experr2, int llen) -{ - int ret = 0; - int _errno = errno; - - llen += printf(" = %d %s ", expr, errorname(_errno)); - if (errno == ENOSYS) { - result(llen, SKIPPED); - } else if (expr != expret || (_errno != experr1 && _errno != experr2)) { - ret = 1; - if (experr2 == 0) - llen += printf(" != (%d %s) ", expret, errorname(experr1)); - else - llen += printf(" != (%d %s %s) ", expret, errorname(experr1), errorname(experr2)); - result(llen, FAIL); - } else { - result(llen, OK); - } - return ret; -} - - -#define EXPECT_PTRZR(cond, expr) \ - do { if (!(cond)) result(llen, SKIPPED); else ret += expect_ptrzr(expr, llen); } while (0) - -static __attribute__((unused)) -int expect_ptrzr(const void *expr, int llen) -{ - int ret = 0; - - llen += printf(" = <%p> ", expr); - if (expr) { - ret = 1; - result(llen, FAIL); - } else { - result(llen, OK); - } - return ret; -} - - -#define EXPECT_PTRNZ(cond, expr) \ - do { if (!(cond)) result(llen, SKIPPED); else ret += expect_ptrnz(expr, llen); } while (0) - -static __attribute__((unused)) -int expect_ptrnz(const void *expr, int llen) -{ - int ret = 0; - - llen += printf(" = <%p> ", expr); - if (!expr) { - ret = 1; - result(llen, FAIL); - } else { - result(llen, OK); - } - return ret; -} - -#define EXPECT_PTREQ(cond, expr, cmp) \ - do { if (!(cond)) result(llen, SKIPPED); else ret += expect_ptreq(expr, llen, cmp); } while (0) - -static __attribute__((unused)) -int expect_ptreq(const void *expr, int llen, const void *cmp) -{ - int ret = 0; - - llen += printf(" = <%p> ", expr); - if (expr != cmp) { - ret = 1; - result(llen, FAIL); - } else { - result(llen, OK); - } - return ret; -} - -#define EXPECT_PTRNE(cond, expr, cmp) \ - do { if (!(cond)) result(llen, SKIPPED); else ret += expect_ptrne(expr, llen, cmp); } while (0) - -static __attribute__((unused)) -int expect_ptrne(const void *expr, int llen, const void *cmp) -{ - int ret = 0; - - llen += printf(" = <%p> ", expr); - if (expr == cmp) { - ret = 1; - result(llen, FAIL); - } else { - result(llen, OK); - } - return ret; -} - -#define EXPECT_PTRGE(cond, expr, cmp) \ - do { if (!(cond)) result(llen, SKIPPED); else ret += expect_ptrge(expr, llen, cmp); } while (0) - -static __attribute__((unused)) -int expect_ptrge(const void *expr, int llen, const void *cmp) -{ - int ret = !(expr >= cmp); - - llen += printf(" = <%p> ", expr); - result(llen, ret ? FAIL : OK); - return ret; -} - -#define EXPECT_PTRGT(cond, expr, cmp) \ - do { if (!(cond)) result(llen, SKIPPED); else ret += expect_ptrgt(expr, llen, cmp); } while (0) - -static __attribute__((unused)) -int expect_ptrgt(const void *expr, int llen, const void *cmp) -{ - int ret = !(expr > cmp); - - llen += printf(" = <%p> ", expr); - result(llen, ret ? FAIL : OK); - return ret; -} - - -#define EXPECT_PTRLE(cond, expr, cmp) \ - do { if (!(cond)) result(llen, SKIPPED); else ret += expect_ptrle(expr, llen, cmp); } while (0) - -static __attribute__((unused)) -int expect_ptrle(const void *expr, int llen, const void *cmp) -{ - int ret = !(expr <= cmp); - - llen += printf(" = <%p> ", expr); - result(llen, ret ? FAIL : OK); - return ret; -} - - -#define EXPECT_PTRLT(cond, expr, cmp) \ - do { if (!(cond)) result(llen, SKIPPED); else ret += expect_ptrlt(expr, llen, cmp); } while (0) - -static __attribute__((unused)) -int expect_ptrlt(const void *expr, int llen, const void *cmp) -{ - int ret = !(expr < cmp); - - llen += printf(" = <%p> ", expr); - result(llen, ret ? FAIL : OK); - return ret; -} - -#define EXPECT_PTRER2(cond, expr, expret, experr1, experr2) \ - do { if (!(cond)) result(llen, SKIPPED); else ret += expect_ptrerr2(expr, expret, experr1, experr2, llen); } while (0) - -#define EXPECT_PTRER(cond, expr, expret, experr) \ - EXPECT_PTRER2(cond, expr, expret, experr, 0) - -static __attribute__((unused)) -int expect_ptrerr2(const void *expr, const void *expret, int experr1, int experr2, int llen) -{ - int ret = 0; - int _errno = errno; - - llen += printf(" = <%p> %s ", expr, errorname(_errno)); - if (expr != expret || (_errno != experr1 && _errno != experr2)) { - ret = 1; - if (experr2 == 0) - llen += printf(" != (<%p> %s) ", expret, errorname(experr1)); - else - llen += printf(" != (<%p> %s %s) ", expret, errorname(experr1), errorname(experr2)); - result(llen, FAIL); - } else { - result(llen, OK); - } - return ret; -} - -#define EXPECT_STRZR(cond, expr) \ - do { if (!(cond)) result(llen, SKIPPED); else ret += expect_strzr(expr, llen); } while (0) - -static __attribute__((unused)) -int expect_strzr(const char *expr, int llen) -{ - int ret = 0; - - llen += printf(" = <%s> ", expr ? expr : "(null)"); - if (expr) { - ret = 1; - result(llen, FAIL); - } else { - result(llen, OK); - } - return ret; -} - - -#define EXPECT_STRNZ(cond, expr) \ - do { if (!(cond)) result(llen, SKIPPED); else ret += expect_strnz(expr, llen); } while (0) - -static __attribute__((unused)) -int expect_strnz(const char *expr, int llen) -{ - int ret = 0; - - llen += printf(" = <%s> ", expr ? expr : "(null)"); - if (!expr) { - ret = 1; - result(llen, FAIL); - } else { - result(llen, OK); - } - return ret; -} - - -#define EXPECT_STREQ(cond, expr, cmp) \ - do { if (!(cond)) result(llen, SKIPPED); else ret += expect_streq(expr, llen, cmp); } while (0) - -static __attribute__((unused)) -int expect_streq(const char *expr, int llen, const char *cmp) -{ - int ret = 0; - - llen += printf(" = <%s> ", expr); - if (strcmp(expr, cmp) != 0) { - ret = 1; - result(llen, FAIL); - } else { - result(llen, OK); - } - return ret; -} - - -#define EXPECT_STRNE(cond, expr, cmp) \ - do { if (!(cond)) result(llen, SKIPPED); else ret += expect_strne(expr, llen, cmp); } while (0) - -static __attribute__((unused)) -int expect_strne(const char *expr, int llen, const char *cmp) -{ - int ret = 0; - - llen += printf(" = <%s> ", expr); - if (strcmp(expr, cmp) == 0) { - ret = 1; - result(llen, FAIL); - } else { - result(llen, OK); - } - return ret; -} - -#define EXPECT_STRBUFEQ(cond, expr, buf, val, cmp) \ - do { if (!(cond)) result(llen, SKIPPED); else ret += expect_str_buf_eq(expr, buf, val, llen, cmp); } while (0) - -static __attribute__((unused)) -int expect_str_buf_eq(size_t expr, const char *buf, size_t val, int llen, const char *cmp) -{ - llen += printf(" = %lu <%s> ", (unsigned long)expr, buf); - if (strcmp(buf, cmp) != 0) { - result(llen, FAIL); - return 1; - } - if (expr != val) { - result(llen, FAIL); - return 1; - } - - result(llen, OK); - return 0; -} - -#define EXPECT_STRTOX(cond, func, input, base, expected, chars, expected_errno) \ - do { if (!(cond)) result(llen, SKIPPED); else ret += expect_strtox(llen, func, input, base, expected, chars, expected_errno); } while (0) - -static __attribute__((unused)) -int expect_strtox(int llen, void *func, const char *input, int base, intmax_t expected, int expected_chars, int expected_errno) -{ - char *endptr; - int actual_errno, actual_chars; - intmax_t r; - - errno = 0; - if (func == strtol) { - r = strtol(input, &endptr, base); - } else if (func == strtoul) { - r = strtoul(input, &endptr, base); - } else { - result(llen, FAIL); - return 1; - } - actual_errno = errno; - actual_chars = endptr - input; - - llen += printf(" %lld = %lld", (long long)expected, (long long)r); - if (r != expected) { - result(llen, FAIL); - return 1; - } - if (expected_chars == -1) { - if (*endptr != '\0') { - result(llen, FAIL); - return 1; - } - } else if (expected_chars != actual_chars) { - result(llen, FAIL); - return 1; - } - if (actual_errno != expected_errno) { - result(llen, FAIL); - return 1; - } - - result(llen, OK); - return 0; -} - -/* declare tests based on line numbers. There must be exactly one test per line. */ -#define CASE_TEST(name) \ - case __LINE__: llen += printf("%d %s", test, #name); - -/* constructors validate that they are executed in definition order */ -__attribute__((constructor)) -static void constructor1(void) -{ - constructor_test_value = 1; -} - -__attribute__((constructor)) -static void constructor2(int argc, char **argv, char **envp) -{ - if (argc && argv && envp) - constructor_test_value *= 2; -} - -int run_startup(int min, int max) -{ - int test; - int ret = 0; - /* kernel at least passes HOME and TERM, shell passes more */ - int env_total = 2; - /* checking NULL for argv/argv0, environ and _auxv is not enough, let's compare with sbrk(0) or &end */ - extern char end; - char *brk = sbrk(0) != (void *)-1 ? sbrk(0) : &end; - /* differ from nolibc, both glibc and musl have no global _auxv */ - const unsigned long *test_auxv = (void *)-1; -#ifdef NOLIBC - test_auxv = _auxv; -#endif - - for (test = min; test >= 0 && test <= max; test++) { - int llen = 0; /* line length */ - - /* avoid leaving empty lines below, this will insert holes into - * test numbers. - */ - switch (test + __LINE__ + 1) { - CASE_TEST(argc); EXPECT_GE(1, test_argc, 1); break; - CASE_TEST(argv_addr); EXPECT_PTRGT(1, test_argv, brk); break; - CASE_TEST(argv_environ); EXPECT_PTRLT(1, test_argv, environ); break; - CASE_TEST(argv_total); EXPECT_EQ(1, environ - test_argv - 1, test_argc ?: 1); break; - CASE_TEST(argv0_addr); EXPECT_PTRGT(1, argv0, brk); break; - CASE_TEST(argv0_str); EXPECT_STRNZ(1, argv0 > brk ? argv0 : NULL); break; - CASE_TEST(argv0_len); EXPECT_GE(1, argv0 > brk ? strlen(argv0) : 0, 1); break; - CASE_TEST(environ_addr); EXPECT_PTRGT(1, environ, brk); break; - CASE_TEST(environ_envp); EXPECT_PTREQ(1, environ, test_envp); break; - CASE_TEST(environ_auxv); EXPECT_PTRLT(test_auxv != (void *)-1, environ, test_auxv); break; - CASE_TEST(environ_total); EXPECT_GE(test_auxv != (void *)-1, (void *)test_auxv - (void *)environ - 1, env_total); break; - CASE_TEST(environ_HOME); EXPECT_PTRNZ(1, getenv("HOME")); break; - CASE_TEST(auxv_addr); EXPECT_PTRGT(test_auxv != (void *)-1, test_auxv, brk); break; - CASE_TEST(auxv_AT_UID); EXPECT_EQ(1, getauxval(AT_UID), getuid()); break; - CASE_TEST(constructor); EXPECT_EQ(is_nolibc, constructor_test_value, 2); break; - CASE_TEST(linkage_errno); EXPECT_PTREQ(1, linkage_test_errno_addr(), &errno); break; - CASE_TEST(linkage_constr); EXPECT_EQ(is_nolibc, linkage_test_constructor_test_value, 6); break; - case __LINE__: - return ret; /* must be last */ - /* note: do not set any defaults so as to permit holes above */ - } - } - return ret; -} - - -/* used by some syscall tests below */ -int test_getdents64(const char *dir) -{ - char buffer[4096]; - int fd, ret; - int err; - - ret = fd = open(dir, O_RDONLY | O_DIRECTORY, 0); - if (ret < 0) - return ret; - - ret = getdents64(fd, (void *)buffer, sizeof(buffer)); - err = errno; - close(fd); - - errno = err; - return ret; -} - -static int test_dirent(void) -{ - int comm = 0, cmdline = 0; - struct dirent dirent, *result; - DIR *dir; - int ret; - - dir = opendir("/proc/self"); - if (!dir) - return 1; - - while (1) { - errno = 0; - ret = readdir_r(dir, &dirent, &result); - if (ret != 0) - return 1; - if (!result) - break; - - if (strcmp(dirent.d_name, "comm") == 0) - comm++; - else if (strcmp(dirent.d_name, "cmdline") == 0) - cmdline++; - } - - if (errno) - return 1; - - ret = closedir(dir); - if (ret) - return 1; - - if (comm != 1 || cmdline != 1) - return 1; - - return 0; -} - -int test_getpagesize(void) -{ - int x = getpagesize(); - int c; - - if (x < 0) - return x; - -#if defined(__x86_64__) || defined(__i386__) || defined(__i486__) || defined(__i586__) || defined(__i686__) - /* - * x86 family is always 4K page. - */ - c = (x == 4096); -#elif defined(__aarch64__) - /* - * Linux aarch64 supports three values of page size: 4K, 16K, and 64K - * which are selected at kernel compilation time. - */ - c = (x == 4096 || x == (16 * 1024) || x == (64 * 1024)); -#else - /* - * Assuming other architectures must have at least 4K page. - */ - c = (x >= 4096); -#endif - - return !c; -} - -int test_fork(void) -{ - int status; - pid_t pid; - - /* flush the printf buffer to avoid child flush it */ - fflush(stdout); - fflush(stderr); - - pid = fork(); - - switch (pid) { - case -1: - return 1; - - case 0: - exit(123); - - default: - pid = waitpid(pid, &status, 0); - - return pid == -1 || !WIFEXITED(status) || WEXITSTATUS(status) != 123; - } -} - -int test_stat_timestamps(void) -{ - struct stat st; - - if (sizeof(st.st_atim.tv_sec) != sizeof(st.st_atime)) - return 1; - - if (stat("/proc/self/", &st) && stat(argv0, &st) && stat("/", &st)) - return 1; - - if (st.st_atim.tv_sec != st.st_atime || st.st_atim.tv_nsec > 1000000000) - return 1; - - if (st.st_mtim.tv_sec != st.st_mtime || st.st_mtim.tv_nsec > 1000000000) - return 1; - - if (st.st_ctim.tv_sec != st.st_ctime || st.st_ctim.tv_nsec > 1000000000) - return 1; - - return 0; -} - -int test_uname(void) -{ - struct utsname buf; - char osrelease[sizeof(buf.release)]; - ssize_t r; - int fd; - - memset(&buf.domainname, 'P', sizeof(buf.domainname)); - - if (uname(&buf)) - return 1; - - if (strncmp("Linux", buf.sysname, sizeof(buf.sysname))) - return 1; - - fd = open("/proc/sys/kernel/osrelease", O_RDONLY); - if (fd == -1) - return 1; - - r = read(fd, osrelease, sizeof(osrelease)); - if (r == -1) - return 1; - - close(fd); - - if (osrelease[r - 1] == '\n') - r--; - - /* Validate one of the later fields to ensure field sizes are correct */ - if (strncmp(osrelease, buf.release, r)) - return 1; - - /* Ensure the field domainname is set, it is missing from struct old_utsname */ - if (strnlen(buf.domainname, sizeof(buf.domainname)) == sizeof(buf.domainname)) - return 1; - - return 0; -} - -int test_mmap_munmap(void) -{ - int ret, fd, i, page_size; - void *mem; - size_t file_size, length; - off_t offset, pa_offset; - struct stat stat_buf; - const char * const files[] = { - "/dev/zero", - "/proc/1/exe", "/proc/self/exe", - argv0, - NULL - }; - - page_size = getpagesize(); - if (page_size < 0) - return 1; - - /* find a right file to mmap, existed and accessible */ - for (i = 0; files[i] != NULL; i++) { - ret = fd = open(files[i], O_RDONLY); - if (ret == -1) - continue; - else - break; - } - if (ret == -1) - return 1; - - ret = stat(files[i], &stat_buf); - if (ret == -1) - goto end; - - /* file size of the special /dev/zero is 0, let's assign one manually */ - if (i == 0) - file_size = 3*page_size; - else - file_size = stat_buf.st_size; - - offset = file_size - 1; - if (offset < 0) - offset = 0; - length = file_size - offset; - pa_offset = offset & ~(page_size - 1); - - mem = mmap(NULL, length + offset - pa_offset, PROT_READ, MAP_SHARED, fd, pa_offset); - if (mem == MAP_FAILED) { - ret = 1; - goto end; - } - - ret = munmap(mem, length + offset - pa_offset); - -end: - close(fd); - return !!ret; -} - -int test_pipe(void) -{ - const char *const msg = "hello, nolibc"; - int pipefd[2]; - char buf[32]; - size_t len; - - if (pipe(pipefd) == -1) - return 1; - - write(pipefd[1], msg, strlen(msg)); - close(pipefd[1]); - len = read(pipefd[0], buf, sizeof(buf)); - close(pipefd[0]); - - if (len != strlen(msg)) - return 1; - - return !!memcmp(buf, msg, len); -} - -int test_rlimit(void) -{ - struct rlimit rlim = { - .rlim_cur = 1 << 20, - .rlim_max = 1 << 21, - }; - int ret; - - ret = setrlimit(RLIMIT_CORE, &rlim); - if (ret) - return -1; - - rlim.rlim_cur = 0; - rlim.rlim_max = 0; - - ret = getrlimit(RLIMIT_CORE, &rlim); - if (ret) - return -1; - - if (rlim.rlim_cur != 1 << 20) - return -1; - if (rlim.rlim_max != 1 << 21) - return -1; - - return 0; -} - - -/* Run syscall tests between IDs and . - * Return 0 on success, non-zero on failure. - */ -int run_syscall(int min, int max) -{ - struct timeval tv; - struct timezone tz; - struct stat stat_buf; - int euid0; - int proc; - int test; - int tmp; - int ret = 0; - void *p1, *p2; - int has_gettid = 1; - int has_brk; - - /* indicates whether or not /proc is mounted */ - proc = stat("/proc", &stat_buf) == 0; - - /* this will be used to skip certain tests that can't be run unprivileged */ - euid0 = geteuid() == 0; - - /* from 2.30, glibc provides gettid() */ -#if defined(__GLIBC_MINOR__) && defined(__GLIBC__) - has_gettid = __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 30); -#endif - - /* on musl setting brk()/sbrk() always fails */ - has_brk = brk(0) == 0; - - for (test = min; test >= 0 && test <= max; test++) { - int llen = 0; /* line length */ - - /* avoid leaving empty lines below, this will insert holes into - * test numbers. - */ - switch (test + __LINE__ + 1) { - CASE_TEST(getpid); EXPECT_SYSNE(1, getpid(), -1); break; - CASE_TEST(getppid); EXPECT_SYSNE(1, getppid(), -1); break; - CASE_TEST(gettid); EXPECT_SYSNE(has_gettid, gettid(), -1); break; - CASE_TEST(getpgid_self); EXPECT_SYSNE(1, getpgid(0), -1); break; - CASE_TEST(getpgid_bad); EXPECT_SYSER(1, getpgid(-1), -1, ESRCH); break; - CASE_TEST(kill_0); EXPECT_SYSZR(1, kill(getpid(), 0)); break; - CASE_TEST(kill_CONT); EXPECT_SYSZR(1, kill(getpid(), 0)); break; - CASE_TEST(kill_BADPID); EXPECT_SYSER(1, kill(INT_MAX, 0), -1, ESRCH); break; - CASE_TEST(sbrk_0); EXPECT_PTRNE(has_brk, sbrk(0), (void *)-1); break; - CASE_TEST(sbrk); if ((p1 = p2 = sbrk(4096)) != (void *)-1) p2 = sbrk(-4096); EXPECT_SYSZR(has_brk, (p2 == (void *)-1) || p2 == p1); break; - CASE_TEST(brk); EXPECT_SYSZR(has_brk, brk(sbrk(0))); break; - CASE_TEST(chdir_root); EXPECT_SYSZR(1, chdir("/")); chdir(getenv("PWD")); break; - CASE_TEST(chdir_dot); EXPECT_SYSZR(1, chdir(".")); break; - CASE_TEST(chdir_blah); EXPECT_SYSER(1, chdir("/blah"), -1, ENOENT); break; - CASE_TEST(chmod_argv0); EXPECT_SYSZR(1, chmod(argv0, 0555)); break; - CASE_TEST(chmod_self); EXPECT_SYSER(proc, chmod("/proc/self", 0555), -1, EPERM); break; - CASE_TEST(chown_self); EXPECT_SYSER(proc, chown("/proc/self", 0, 0), -1, EPERM); break; - CASE_TEST(chroot_root); EXPECT_SYSZR(euid0, chroot("/")); break; - CASE_TEST(chroot_blah); EXPECT_SYSER(1, chroot("/proc/self/blah"), -1, ENOENT); break; - CASE_TEST(chroot_exe); EXPECT_SYSER(1, chroot(argv0), -1, ENOTDIR); break; - CASE_TEST(close_m1); EXPECT_SYSER(1, close(-1), -1, EBADF); break; - CASE_TEST(close_dup); EXPECT_SYSZR(1, close(dup(0))); break; - CASE_TEST(dup_0); tmp = dup(0); EXPECT_SYSNE(1, tmp, -1); close(tmp); break; - CASE_TEST(dup_m1); tmp = dup(-1); EXPECT_SYSER(1, tmp, -1, EBADF); if (tmp != -1) close(tmp); break; - CASE_TEST(dup2_0); tmp = dup2(0, 100); EXPECT_SYSNE(1, tmp, -1); close(tmp); break; - CASE_TEST(dup2_m1); tmp = dup2(-1, 100); EXPECT_SYSER(1, tmp, -1, EBADF); if (tmp != -1) close(tmp); break; - CASE_TEST(dup3_0); tmp = dup3(0, 100, 0); EXPECT_SYSNE(1, tmp, -1); close(tmp); break; - CASE_TEST(dup3_m1); tmp = dup3(-1, 100, 0); EXPECT_SYSER(1, tmp, -1, EBADF); if (tmp != -1) close(tmp); break; - CASE_TEST(execve_root); EXPECT_SYSER(1, execve("/", (char*[]){ [0] = "/", [1] = NULL }, NULL), -1, EACCES); break; - CASE_TEST(fork); EXPECT_SYSZR(1, test_fork()); break; - CASE_TEST(getdents64_root); EXPECT_SYSNE(1, test_getdents64("/"), -1); break; - CASE_TEST(getdents64_null); EXPECT_SYSER(1, test_getdents64("/dev/null"), -1, ENOTDIR); break; - CASE_TEST(directories); EXPECT_SYSZR(proc, test_dirent()); break; - CASE_TEST(gettimeofday_tv); EXPECT_SYSZR(1, gettimeofday(&tv, NULL)); break; - CASE_TEST(gettimeofday_tv_tz);EXPECT_SYSZR(1, gettimeofday(&tv, &tz)); break; - CASE_TEST(getpagesize); EXPECT_SYSZR(1, test_getpagesize()); break; - CASE_TEST(ioctl_tiocinq); EXPECT_SYSZR(1, ioctl(0, TIOCINQ, &tmp)); break; - CASE_TEST(link_root1); EXPECT_SYSER(1, link("/", "/"), -1, EEXIST); break; - CASE_TEST(link_blah); EXPECT_SYSER(1, link("/proc/self/blah", "/blah"), -1, ENOENT); break; - CASE_TEST(link_dir); EXPECT_SYSER(euid0, link("/", "/blah"), -1, EPERM); break; - CASE_TEST(link_cross); EXPECT_SYSER(proc, link("/proc/self/cmdline", "/blah"), -1, EXDEV); break; - CASE_TEST(lseek_m1); EXPECT_SYSER(1, lseek(-1, 0, SEEK_SET), -1, EBADF); break; - CASE_TEST(lseek_0); EXPECT_SYSER(1, lseek(0, 0, SEEK_SET), -1, ESPIPE); break; - CASE_TEST(mkdir_root); EXPECT_SYSER(1, mkdir("/", 0755), -1, EEXIST); break; - CASE_TEST(mmap_bad); EXPECT_PTRER(1, mmap(NULL, 0, PROT_READ, MAP_PRIVATE, 0, 0), MAP_FAILED, EINVAL); break; - CASE_TEST(munmap_bad); EXPECT_SYSER(1, munmap(NULL, 0), -1, EINVAL); break; - CASE_TEST(mmap_munmap_good); EXPECT_SYSZR(1, test_mmap_munmap()); break; - CASE_TEST(open_tty); EXPECT_SYSNE(1, tmp = open("/dev/null", 0), -1); if (tmp != -1) close(tmp); break; - CASE_TEST(open_blah); EXPECT_SYSER(1, tmp = open("/proc/self/blah", 0), -1, ENOENT); if (tmp != -1) close(tmp); break; - CASE_TEST(pipe); EXPECT_SYSZR(1, test_pipe()); break; - CASE_TEST(poll_null); EXPECT_SYSZR(1, poll(NULL, 0, 0)); break; - CASE_TEST(poll_stdout); EXPECT_SYSNE(1, ({ struct pollfd fds = { 1, POLLOUT, 0}; poll(&fds, 1, 0); }), -1); break; - CASE_TEST(poll_fault); EXPECT_SYSER(1, poll(NULL, 1, 0), -1, EFAULT); break; - CASE_TEST(prctl); EXPECT_SYSER(1, prctl(PR_SET_NAME, (unsigned long)NULL, 0, 0, 0), -1, EFAULT); break; - CASE_TEST(read_badf); EXPECT_SYSER(1, read(-1, &tmp, 1), -1, EBADF); break; - CASE_TEST(rlimit); EXPECT_SYSZR(1, test_rlimit()); break; - CASE_TEST(rmdir_blah); EXPECT_SYSER(1, rmdir("/blah"), -1, ENOENT); break; - CASE_TEST(sched_yield); EXPECT_SYSZR(1, sched_yield()); break; - CASE_TEST(select_null); EXPECT_SYSZR(1, ({ struct timeval tv = { 0 }; select(0, NULL, NULL, NULL, &tv); })); break; - CASE_TEST(select_stdout); EXPECT_SYSNE(1, ({ fd_set fds; FD_ZERO(&fds); FD_SET(1, &fds); select(2, NULL, &fds, NULL, NULL); }), -1); break; - CASE_TEST(select_fault); EXPECT_SYSER(1, select(1, (void *)1, NULL, NULL, 0), -1, EFAULT); break; - CASE_TEST(stat_blah); EXPECT_SYSER(1, stat("/proc/self/blah", &stat_buf), -1, ENOENT); break; - CASE_TEST(stat_fault); EXPECT_SYSER(1, stat(NULL, &stat_buf), -1, EFAULT); break; - CASE_TEST(stat_timestamps); EXPECT_SYSZR(1, test_stat_timestamps()); break; - CASE_TEST(symlink_root); EXPECT_SYSER(1, symlink("/", "/"), -1, EEXIST); break; - CASE_TEST(uname); EXPECT_SYSZR(proc, test_uname()); break; - CASE_TEST(uname_fault); EXPECT_SYSER(1, uname(NULL), -1, EFAULT); break; - CASE_TEST(unlink_root); EXPECT_SYSER(1, unlink("/"), -1, EISDIR); break; - CASE_TEST(unlink_blah); EXPECT_SYSER(1, unlink("/proc/self/blah"), -1, ENOENT); break; - CASE_TEST(wait_child); EXPECT_SYSER(1, wait(&tmp), -1, ECHILD); break; - CASE_TEST(waitpid_min); EXPECT_SYSER(1, waitpid(INT_MIN, &tmp, WNOHANG), -1, ESRCH); break; - CASE_TEST(waitpid_child); EXPECT_SYSER(1, waitpid(getpid(), &tmp, WNOHANG), -1, ECHILD); break; - CASE_TEST(write_badf); EXPECT_SYSER(1, write(-1, &tmp, 1), -1, EBADF); break; - CASE_TEST(write_zero); EXPECT_SYSZR(1, write(1, &tmp, 0)); break; - CASE_TEST(syscall_noargs); EXPECT_SYSEQ(1, syscall(__NR_getpid), getpid()); break; - CASE_TEST(syscall_args); EXPECT_SYSER(1, syscall(__NR_statx, 0, NULL, 0, 0, NULL), -1, EFAULT); break; - case __LINE__: - return ret; /* must be last */ - /* note: do not set any defaults so as to permit holes above */ - } - } - return ret; -} - -int run_stdlib(int min, int max) -{ - int test; - int ret = 0; - - for (test = min; test >= 0 && test <= max; test++) { - int llen = 0; /* line length */ - - /* For functions that take a long buffer, like strlcat() - * Add some more chars after the \0, to test functions that overwrite the buffer set - * the \0 at the exact right position. - */ - char buf[10] = "test123456"; - buf[4] = '\0'; - - - /* avoid leaving empty lines below, this will insert holes into - * test numbers. - */ - switch (test + __LINE__ + 1) { - CASE_TEST(getenv_TERM); EXPECT_STRNZ(1, getenv("TERM")); break; - CASE_TEST(getenv_blah); EXPECT_STRZR(1, getenv("blah")); break; - CASE_TEST(setcmp_blah_blah); EXPECT_EQ(1, strcmp("blah", "blah"), 0); break; - CASE_TEST(setcmp_blah_blah2); EXPECT_NE(1, strcmp("blah", "blah2"), 0); break; - CASE_TEST(setncmp_blah_blah); EXPECT_EQ(1, strncmp("blah", "blah", 10), 0); break; - CASE_TEST(setncmp_blah_blah4); EXPECT_EQ(1, strncmp("blah", "blah4", 4), 0); break; - CASE_TEST(setncmp_blah_blah5); EXPECT_NE(1, strncmp("blah", "blah5", 5), 0); break; - CASE_TEST(setncmp_blah_blah6); EXPECT_NE(1, strncmp("blah", "blah6", 6), 0); break; - CASE_TEST(strchr_foobar_o); EXPECT_STREQ(1, strchr("foobar", 'o'), "oobar"); break; - CASE_TEST(strchr_foobar_z); EXPECT_STRZR(1, strchr("foobar", 'z')); break; - CASE_TEST(strrchr_foobar_o); EXPECT_STREQ(1, strrchr("foobar", 'o'), "obar"); break; - CASE_TEST(strrchr_foobar_z); EXPECT_STRZR(1, strrchr("foobar", 'z')); break; - CASE_TEST(strlcat_0); EXPECT_STRBUFEQ(is_nolibc, strlcat(buf, "bar", 0), buf, 3, "test"); break; - CASE_TEST(strlcat_1); EXPECT_STRBUFEQ(is_nolibc, strlcat(buf, "bar", 1), buf, 4, "test"); break; - CASE_TEST(strlcat_5); EXPECT_STRBUFEQ(is_nolibc, strlcat(buf, "bar", 5), buf, 7, "test"); break; - CASE_TEST(strlcat_6); EXPECT_STRBUFEQ(is_nolibc, strlcat(buf, "bar", 6), buf, 7, "testb"); break; - CASE_TEST(strlcat_7); EXPECT_STRBUFEQ(is_nolibc, strlcat(buf, "bar", 7), buf, 7, "testba"); break; - CASE_TEST(strlcat_8); EXPECT_STRBUFEQ(is_nolibc, strlcat(buf, "bar", 8), buf, 7, "testbar"); break; - CASE_TEST(strlcpy_0); EXPECT_STRBUFEQ(is_nolibc, strlcpy(buf, "bar", 0), buf, 3, "test"); break; - CASE_TEST(strlcpy_1); EXPECT_STRBUFEQ(is_nolibc, strlcpy(buf, "bar", 1), buf, 3, ""); break; - CASE_TEST(strlcpy_2); EXPECT_STRBUFEQ(is_nolibc, strlcpy(buf, "bar", 2), buf, 3, "b"); break; - CASE_TEST(strlcpy_3); EXPECT_STRBUFEQ(is_nolibc, strlcpy(buf, "bar", 3), buf, 3, "ba"); break; - CASE_TEST(strlcpy_4); EXPECT_STRBUFEQ(is_nolibc, strlcpy(buf, "bar", 4), buf, 3, "bar"); break; - CASE_TEST(memcmp_20_20); EXPECT_EQ(1, memcmp("aaa\x20", "aaa\x20", 4), 0); break; - CASE_TEST(memcmp_20_60); EXPECT_LT(1, memcmp("aaa\x20", "aaa\x60", 4), 0); break; - CASE_TEST(memcmp_60_20); EXPECT_GT(1, memcmp("aaa\x60", "aaa\x20", 4), 0); break; - CASE_TEST(memcmp_20_e0); EXPECT_LT(1, memcmp("aaa\x20", "aaa\xe0", 4), 0); break; - CASE_TEST(memcmp_e0_20); EXPECT_GT(1, memcmp("aaa\xe0", "aaa\x20", 4), 0); break; - CASE_TEST(memcmp_80_e0); EXPECT_LT(1, memcmp("aaa\x80", "aaa\xe0", 4), 0); break; - CASE_TEST(memcmp_e0_80); EXPECT_GT(1, memcmp("aaa\xe0", "aaa\x80", 4), 0); break; - CASE_TEST(limit_int8_max); EXPECT_EQ(1, INT8_MAX, (int8_t) 0x7f); break; - CASE_TEST(limit_int8_min); EXPECT_EQ(1, INT8_MIN, (int8_t) 0x80); break; - CASE_TEST(limit_uint8_max); EXPECT_EQ(1, UINT8_MAX, (uint8_t) 0xff); break; - CASE_TEST(limit_int16_max); EXPECT_EQ(1, INT16_MAX, (int16_t) 0x7fff); break; - CASE_TEST(limit_int16_min); EXPECT_EQ(1, INT16_MIN, (int16_t) 0x8000); break; - CASE_TEST(limit_uint16_max); EXPECT_EQ(1, UINT16_MAX, (uint16_t) 0xffff); break; - CASE_TEST(limit_int32_max); EXPECT_EQ(1, INT32_MAX, (int32_t) 0x7fffffff); break; - CASE_TEST(limit_int32_min); EXPECT_EQ(1, INT32_MIN, (int32_t) 0x80000000); break; - CASE_TEST(limit_uint32_max); EXPECT_EQ(1, UINT32_MAX, (uint32_t) 0xffffffff); break; - CASE_TEST(limit_int64_max); EXPECT_EQ(1, INT64_MAX, (int64_t) 0x7fffffffffffffff); break; - CASE_TEST(limit_int64_min); EXPECT_EQ(1, INT64_MIN, (int64_t) 0x8000000000000000); break; - CASE_TEST(limit_uint64_max); EXPECT_EQ(1, UINT64_MAX, (uint64_t) 0xffffffffffffffff); break; - CASE_TEST(limit_int_least8_max); EXPECT_EQ(1, INT_LEAST8_MAX, (int_least8_t) 0x7f); break; - CASE_TEST(limit_int_least8_min); EXPECT_EQ(1, INT_LEAST8_MIN, (int_least8_t) 0x80); break; - CASE_TEST(limit_uint_least8_max); EXPECT_EQ(1, UINT_LEAST8_MAX, (uint_least8_t) 0xff); break; - CASE_TEST(limit_int_least16_max); EXPECT_EQ(1, INT_LEAST16_MAX, (int_least16_t) 0x7fff); break; - CASE_TEST(limit_int_least16_min); EXPECT_EQ(1, INT_LEAST16_MIN, (int_least16_t) 0x8000); break; - CASE_TEST(limit_uint_least16_max); EXPECT_EQ(1, UINT_LEAST16_MAX, (uint_least16_t) 0xffff); break; - CASE_TEST(limit_int_least32_max); EXPECT_EQ(1, INT_LEAST32_MAX, (int_least32_t) 0x7fffffff); break; - CASE_TEST(limit_int_least32_min); EXPECT_EQ(1, INT_LEAST32_MIN, (int_least32_t) 0x80000000); break; - CASE_TEST(limit_uint_least32_max); EXPECT_EQ(1, UINT_LEAST32_MAX, (uint_least32_t) 0xffffffffU); break; - CASE_TEST(limit_int_least64_min); EXPECT_EQ(1, INT_LEAST64_MIN, (int_least64_t) 0x8000000000000000LL); break; - CASE_TEST(limit_int_least64_max); EXPECT_EQ(1, INT_LEAST64_MAX, (int_least64_t) 0x7fffffffffffffffLL); break; - CASE_TEST(limit_uint_least64_max); EXPECT_EQ(1, UINT_LEAST64_MAX, (uint_least64_t) 0xffffffffffffffffULL); break; - CASE_TEST(limit_int_fast8_max); EXPECT_EQ(1, INT_FAST8_MAX, (int_fast8_t) 0x7f); break; - CASE_TEST(limit_int_fast8_min); EXPECT_EQ(1, INT_FAST8_MIN, (int_fast8_t) 0x80); break; - CASE_TEST(limit_uint_fast8_max); EXPECT_EQ(1, UINT_FAST8_MAX, (uint_fast8_t) 0xff); break; - CASE_TEST(limit_int_fast16_min); EXPECT_EQ(1, INT_FAST16_MIN, (int_fast16_t) SINT_MIN_OF_TYPE(int_fast16_t)); break; - CASE_TEST(limit_int_fast16_max); EXPECT_EQ(1, INT_FAST16_MAX, (int_fast16_t) SINT_MAX_OF_TYPE(int_fast16_t)); break; - CASE_TEST(limit_uint_fast16_max); EXPECT_EQ(1, UINT_FAST16_MAX, (uint_fast16_t) UINTPTR_MAX); break; - CASE_TEST(limit_int_fast32_min); EXPECT_EQ(1, INT_FAST32_MIN, (int_fast32_t) SINT_MIN_OF_TYPE(int_fast32_t)); break; - CASE_TEST(limit_int_fast32_max); EXPECT_EQ(1, INT_FAST32_MAX, (int_fast32_t) SINT_MAX_OF_TYPE(int_fast32_t)); break; - CASE_TEST(limit_uint_fast32_max); EXPECT_EQ(1, UINT_FAST32_MAX, (uint_fast32_t) UINTPTR_MAX); break; - CASE_TEST(limit_int_fast64_min); EXPECT_EQ(1, INT_FAST64_MIN, (int_fast64_t) INT64_MIN); break; - CASE_TEST(limit_int_fast64_max); EXPECT_EQ(1, INT_FAST64_MAX, (int_fast64_t) INT64_MAX); break; - CASE_TEST(limit_uint_fast64_max); EXPECT_EQ(1, UINT_FAST64_MAX, (uint_fast64_t) UINT64_MAX); break; - CASE_TEST(sizeof_long_sane); EXPECT_EQ(1, sizeof(long) == 8 || sizeof(long) == 4, 1); break; - CASE_TEST(limit_intptr_min); EXPECT_EQ(1, INTPTR_MIN, sizeof(long) == 8 ? (intptr_t) 0x8000000000000000LL : (intptr_t) 0x80000000); break; - CASE_TEST(limit_intptr_max); EXPECT_EQ(1, INTPTR_MAX, sizeof(long) == 8 ? (intptr_t) 0x7fffffffffffffffLL : (intptr_t) 0x7fffffff); break; - CASE_TEST(limit_uintptr_max); EXPECT_EQ(1, UINTPTR_MAX, sizeof(long) == 8 ? (uintptr_t) 0xffffffffffffffffULL : (uintptr_t) 0xffffffffU); break; - CASE_TEST(limit_ptrdiff_min); EXPECT_EQ(1, PTRDIFF_MIN, sizeof(long) == 8 ? (ptrdiff_t) 0x8000000000000000LL : (ptrdiff_t) 0x80000000); break; - CASE_TEST(limit_ptrdiff_max); EXPECT_EQ(1, PTRDIFF_MAX, sizeof(long) == 8 ? (ptrdiff_t) 0x7fffffffffffffffLL : (ptrdiff_t) 0x7fffffff); break; - CASE_TEST(limit_size_max); EXPECT_EQ(1, SIZE_MAX, sizeof(long) == 8 ? (size_t) 0xffffffffffffffffULL : (size_t) 0xffffffffU); break; - CASE_TEST(strtol_simple); EXPECT_STRTOX(1, strtol, "35", 10, 35, -1, 0); break; - CASE_TEST(strtol_positive); EXPECT_STRTOX(1, strtol, "+35", 10, 35, -1, 0); break; - CASE_TEST(strtol_negative); EXPECT_STRTOX(1, strtol, "-35", 10, -35, -1, 0); break; - CASE_TEST(strtol_hex_auto); EXPECT_STRTOX(1, strtol, "0xFF", 0, 255, -1, 0); break; - CASE_TEST(strtol_base36); EXPECT_STRTOX(1, strtol, "12yZ", 36, 50507, -1, 0); break; - CASE_TEST(strtol_cutoff); EXPECT_STRTOX(1, strtol, "1234567890", 8, 342391, 7, 0); break; - CASE_TEST(strtol_octal_auto); EXPECT_STRTOX(1, strtol, "011", 0, 9, -1, 0); break; - CASE_TEST(strtol_hex_00); EXPECT_STRTOX(1, strtol, "0x00", 16, 0, -1, 0); break; - CASE_TEST(strtol_hex_FF); EXPECT_STRTOX(1, strtol, "FF", 16, 255, -1, 0); break; - CASE_TEST(strtol_hex_ff); EXPECT_STRTOX(1, strtol, "ff", 16, 255, -1, 0); break; - CASE_TEST(strtol_hex_prefix); EXPECT_STRTOX(1, strtol, "0xFF", 16, 255, -1, 0); break; - CASE_TEST(strtol_trailer); EXPECT_STRTOX(1, strtol, "35foo", 10, 35, 2, 0); break; - CASE_TEST(strtol_overflow); EXPECT_STRTOX(1, strtol, "0x8000000000000000", 16, LONG_MAX, -1, ERANGE); break; - CASE_TEST(strtol_underflow); EXPECT_STRTOX(1, strtol, "-0x8000000000000001", 16, LONG_MIN, -1, ERANGE); break; - CASE_TEST(strtoul_negative); EXPECT_STRTOX(1, strtoul, "-0x1", 16, ULONG_MAX, 4, 0); break; - CASE_TEST(strtoul_overflow); EXPECT_STRTOX(1, strtoul, "0x10000000000000000", 16, ULONG_MAX, -1, ERANGE); break; - CASE_TEST(strerror_success); EXPECT_STREQ(is_nolibc, strerror(0), "errno=0"); break; - CASE_TEST(strerror_EINVAL); EXPECT_STREQ(is_nolibc, strerror(EINVAL), "errno=22"); break; - CASE_TEST(strerror_int_max); EXPECT_STREQ(is_nolibc, strerror(INT_MAX), "errno=2147483647"); break; - CASE_TEST(strerror_int_min); EXPECT_STREQ(is_nolibc, strerror(INT_MIN), "errno=-2147483648"); break; - CASE_TEST(tolower); EXPECT_EQ(1, tolower('A'), 'a'); break; - CASE_TEST(tolower_noop); EXPECT_EQ(1, tolower('a'), 'a'); break; - CASE_TEST(toupper); EXPECT_EQ(1, toupper('a'), 'A'); break; - CASE_TEST(toupper_noop); EXPECT_EQ(1, toupper('A'), 'A'); break; - - case __LINE__: - return ret; /* must be last */ - /* note: do not set any defaults so as to permit holes above */ - } - } - return ret; -} - -#define EXPECT_VFPRINTF(c, expected, fmt, ...) \ - ret += expect_vfprintf(llen, c, expected, fmt, ##__VA_ARGS__) - -static int expect_vfprintf(int llen, int c, const char *expected, const char *fmt, ...) -{ - char buf[100]; - va_list args; - ssize_t w; - int ret; - - - va_start(args, fmt); - /* Only allow writing 21 bytes, to test truncation */ - w = vsnprintf(buf, 21, fmt, args); - va_end(args); - - if (w != c) { - llen += printf(" written(%d) != %d", (int)w, c); - result(llen, FAIL); - return 1; - } - - llen += printf(" \"%s\" = \"%s\"", expected, buf); - ret = strncmp(expected, buf, c); - - result(llen, ret ? FAIL : OK); - return ret; -} - -static int test_scanf(void) -{ - unsigned long long ull; - unsigned long ul; - unsigned int u; - long long ll; - long l; - void *p; - int i; - - /* return __LINE__ to point to the specific failure */ - - /* test EOF */ - if (sscanf("", "foo") != EOF) - return __LINE__; - - /* test simple literal without placeholder */ - if (sscanf("foo", "foo") != 0) - return __LINE__; - - /* test single placeholder */ - if (sscanf("123", "%d", &i) != 1) - return __LINE__; - - if (i != 123) - return __LINE__; - - /* test multiple place holders and separators */ - if (sscanf("a123b456c0x90", "a%db%uc%p", &i, &u, &p) != 3) - return __LINE__; - - if (i != 123) - return __LINE__; - - if (u != 456) - return __LINE__; - - if (p != (void *)0x90) - return __LINE__; - - /* test space handling */ - if (sscanf("a b1", "a b%d", &i) != 1) - return __LINE__; - - if (i != 1) - return __LINE__; - - /* test literal percent */ - if (sscanf("a%1", "a%%%d", &i) != 1) - return __LINE__; - - if (i != 1) - return __LINE__; - - /* test stdint.h types */ - if (sscanf("1|2|3|4|5|6", - "%d|%ld|%lld|%u|%lu|%llu", - &i, &l, &ll, &u, &ul, &ull) != 6) - return __LINE__; - - if (i != 1 || l != 2 || ll != 3 || - u != 4 || ul != 5 || ull != 6) - return __LINE__; - - return 0; -} - -static int run_printf(int min, int max) -{ - int test; - int ret = 0; - - for (test = min; test >= 0 && test <= max; test++) { - int llen = 0; /* line length */ - - /* avoid leaving empty lines below, this will insert holes into - * test numbers. - */ - switch (test + __LINE__ + 1) { - CASE_TEST(empty); EXPECT_VFPRINTF(0, "", ""); break; - CASE_TEST(simple); EXPECT_VFPRINTF(3, "foo", "foo"); break; - CASE_TEST(string); EXPECT_VFPRINTF(3, "foo", "%s", "foo"); break; - CASE_TEST(number); EXPECT_VFPRINTF(4, "1234", "%d", 1234); break; - CASE_TEST(negnumber); EXPECT_VFPRINTF(5, "-1234", "%d", -1234); break; - CASE_TEST(unsigned); EXPECT_VFPRINTF(5, "12345", "%u", 12345); break; - CASE_TEST(char); EXPECT_VFPRINTF(1, "c", "%c", 'c'); break; - CASE_TEST(hex); EXPECT_VFPRINTF(1, "f", "%x", 0xf); break; - CASE_TEST(pointer); EXPECT_VFPRINTF(3, "0x1", "%p", (void *) 0x1); break; - CASE_TEST(uintmax_t); EXPECT_VFPRINTF(20, "18446744073709551615", "%ju", 0xffffffffffffffffULL); break; - CASE_TEST(intmax_t); EXPECT_VFPRINTF(20, "-9223372036854775807", "%jd", 0x8000000000000001LL); break; - CASE_TEST(truncation); EXPECT_VFPRINTF(25, "01234567890123456789", "%s", "0123456789012345678901234"); break; - CASE_TEST(string_width); EXPECT_VFPRINTF(10, " 1", "%10s", "1"); break; - CASE_TEST(number_width); EXPECT_VFPRINTF(10, " 1", "%10d", 1); break; - CASE_TEST(width_trunc); EXPECT_VFPRINTF(25, " ", "%25d", 1); break; - CASE_TEST(scanf); EXPECT_ZR(1, test_scanf()); break; - case __LINE__: - return ret; /* must be last */ - /* note: do not set any defaults so as to permit holes above */ - } - } - return ret; -} - -static int smash_stack(void) -{ - char buf[100]; - volatile char *ptr = buf; - size_t i; - - for (i = 0; i < 200; i++) - ptr[i] = 'P'; - - return 1; -} - -static int run_protection(int min __attribute__((unused)), - int max __attribute__((unused))) -{ - pid_t pid; - int llen = 0, status; - struct rlimit rlimit = { 0, 0 }; - - llen += printf("0 -fstackprotector "); - -#if !defined(_NOLIBC_STACKPROTECTOR) - llen += printf("not supported"); - result(llen, SKIPPED); - return 0; -#endif - -#if defined(_NOLIBC_STACKPROTECTOR) - if (!__stack_chk_guard) { - llen += printf("__stack_chk_guard not initialized"); - result(llen, FAIL); - return 1; - } -#endif - - pid = -1; - pid = fork(); - - switch (pid) { - case -1: - llen += printf("fork()"); - result(llen, FAIL); - return 1; - - case 0: - close(STDOUT_FILENO); - close(STDERR_FILENO); - - prctl(PR_SET_DUMPABLE, 0, 0, 0, 0); - setrlimit(RLIMIT_CORE, &rlimit); - smash_stack(); - return 1; - - default: - pid = waitpid(pid, &status, 0); - - if (pid == -1 || !WIFSIGNALED(status) || WTERMSIG(status) != SIGABRT) { - llen += printf("waitpid()"); - result(llen, FAIL); - return 1; - } - result(llen, OK); - return 0; - } -} - -/* prepare what needs to be prepared for pid 1 (stdio, /dev, /proc, etc) */ -int prepare(void) -{ - struct stat stat_buf; - - /* It's possible that /dev doesn't even exist or was not mounted, so - * we'll try to create it, mount it, or create minimal entries into it. - * We want at least /dev/null and /dev/console. - */ - if (stat("/dev/.", &stat_buf) == 0 || mkdir("/dev", 0755) == 0) { - if (stat("/dev/console", &stat_buf) != 0 || - stat("/dev/null", &stat_buf) != 0 || - stat("/dev/zero", &stat_buf) != 0) { - /* try devtmpfs first, otherwise fall back to manual creation */ - if (mount("/dev", "/dev", "devtmpfs", 0, 0) != 0) { - mknod("/dev/console", 0600 | S_IFCHR, makedev(5, 1)); - mknod("/dev/null", 0666 | S_IFCHR, makedev(1, 3)); - mknod("/dev/zero", 0666 | S_IFCHR, makedev(1, 5)); - } - } - } - - /* If no /dev/console was found before calling init, stdio is closed so - * we need to reopen it from /dev/console. If it failed above, it will - * still fail here and we cannot emit a message anyway. - */ - if (close(dup(1)) == -1) { - int fd = open("/dev/console", O_RDWR); - - if (fd >= 0) { - if (fd != 0) - dup2(fd, 0); - if (fd != 1) - dup2(fd, 1); - if (fd != 2) - dup2(fd, 2); - if (fd > 2) - close(fd); - puts("\nSuccessfully reopened /dev/console."); - } - } - - /* try to mount /proc if not mounted. Silently fail otherwise */ - if (stat("/proc/.", &stat_buf) == 0 || mkdir("/proc", 0755) == 0) { - if (stat("/proc/self", &stat_buf) != 0) { - /* If not mountable, remove /proc completely to avoid misuse */ - if (mount("none", "/proc", "proc", 0, 0) != 0) - rmdir("/proc"); - } - } - - /* some tests rely on a writable /tmp */ - mkdir("/tmp", 0755); - - return 0; -} - -/* This is the definition of known test names, with their functions */ -static const struct test test_names[] = { - /* add new tests here */ - { .name = "startup", .func = run_startup }, - { .name = "syscall", .func = run_syscall }, - { .name = "stdlib", .func = run_stdlib }, - { .name = "printf", .func = run_printf }, - { .name = "protection", .func = run_protection }, - { 0 } -}; - -static int is_setting_valid(char *test) -{ - int idx, len, test_len, valid = 0; - char delimiter; - - if (!test) - return valid; - - test_len = strlen(test); - - for (idx = 0; test_names[idx].name; idx++) { - len = strlen(test_names[idx].name); - if (test_len < len) - continue; - - if (strncmp(test, test_names[idx].name, len) != 0) - continue; - - delimiter = test[len]; - if (delimiter != ':' && delimiter != ',' && delimiter != '\0') - continue; - - valid = 1; - break; - } - - return valid; -} - -int main(int argc, char **argv, char **envp) -{ - int min = 0; - int max = INT_MAX; - int ret = 0; - int err; - int idx; - char *test; - - argv0 = argv[0]; - test_argc = argc; - test_argv = argv; - test_envp = envp; - - /* when called as init, it's possible that no console was opened, for - * example if no /dev file system was provided. We'll check that fd#1 - * was opened, and if not we'll attempt to create and open /dev/console - * and /dev/null that we'll use for later tests. - */ - if (getpid() == 1) - prepare(); - - /* the definition of a series of tests comes from either argv[1] or the - * "NOLIBC_TEST" environment variable. It's made of a comma-delimited - * series of test names and optional ranges: - * syscall:5-15[:.*],stdlib:8-10 - */ - test = argv[1]; - if (!is_setting_valid(test)) - test = getenv("NOLIBC_TEST"); - - if (is_setting_valid(test)) { - char *comma, *colon, *dash, *value; - - do { - comma = strchr(test, ','); - if (comma) - *(comma++) = '\0'; - - colon = strchr(test, ':'); - if (colon) - *(colon++) = '\0'; - - for (idx = 0; test_names[idx].name; idx++) { - if (strcmp(test, test_names[idx].name) == 0) - break; - } - - if (test_names[idx].name) { - /* The test was named, it will be called at least - * once. We may have an optional range at - * here, which defaults to the full range. - */ - do { - min = 0; max = INT_MAX; - value = colon; - if (value && *value) { - colon = strchr(value, ':'); - if (colon) - *(colon++) = '\0'; - - dash = strchr(value, '-'); - if (dash) - *(dash++) = '\0'; - - /* support :val: :min-max: :min-: :-max: */ - if (*value) - min = atoi(value); - if (!dash) - max = min; - else if (*dash) - max = atoi(dash); - - value = colon; - } - - /* now's time to call the test */ - printf("Running test '%s'\n", test_names[idx].name); - err = test_names[idx].func(min, max); - ret += err; - printf("Errors during this test: %d\n\n", err); - } while (colon && *colon); - } else - printf("Ignoring unknown test name '%s'\n", test); - - test = comma; - } while (test && *test); - } else { - /* no test mentioned, run everything */ - for (idx = 0; test_names[idx].name; idx++) { - printf("Running test '%s'\n", test_names[idx].name); - err = test_names[idx].func(min, max); - ret += err; - printf("Errors during this test: %d\n\n", err); - } - } - - printf("Total number of errors: %d\n", ret); - - if (getpid() == 1) { - /* we're running as init, there's no other process on the - * system, thus likely started from a VM for a quick check. - * Exiting will provoke a kernel panic that may be reported - * as an error by Qemu or the hypervisor, while stopping - * cleanly will often be reported as a success. This allows - * to use the output of this program for bisecting kernels. - */ - printf("Leaving init with final status: %d\n", !!ret); - if (ret == 0) - reboot(RB_POWER_OFF); -#if defined(__x86_64__) - /* QEMU started with "-device isa-debug-exit -no-reboot" will - * exit with status code 2N+1 when N is written to 0x501. We - * hard-code the syscall here as it's arch-dependent. - */ - else if (syscall(__NR_ioperm, 0x501, 1, 1) == 0) - __asm__ volatile ("outb %%al, %%dx" :: "d"(0x501), "a"(0)); - /* if it does nothing, fall back to the regular panic */ -#endif - } - - printf("Exiting with status %d\n", !!ret); - return !!ret; -} +#include "harness-selftest.c" diff --git a/tools/testing/selftests/nolibc/run-tests.sh b/tools/testing/selftests/nolibc/run-tests.sh index 0299a0912d4049dd12217f9835b81d231e1d2bfd..9344e3e8e10466dbb04a80028439599bb0cb28a2 100755 --- a/tools/testing/selftests/nolibc/run-tests.sh +++ b/tools/testing/selftests/nolibc/run-tests.sh @@ -189,7 +189,7 @@ test_arch() { swallow_output "${MAKE[@]}" defconfig swallow_output "${MAKE[@]}" CFLAGS_EXTRA="$CFLAGS_EXTRA" "$test_target" V=1 cp run.out run.out."${arch}" - "${MAKE[@]}" report | grep passed + "${MAKE[@]}" report } if [ "$perform_download" -ne 0 ]; then